From df5b126c2b2bdd81c3002bd84561058ea3675576 Mon Sep 17 00:00:00 2001 From: IAmNamNguyen <138494161+JuniorDevNam@users.noreply.github.com> Date: Sun, 1 Dec 2024 16:09:16 +0700 Subject: [PATCH] update release v1.0.0 --- .gitignore | 4 +- run.py | 40 +- run.spec | 38 + .../Lib/site-packages/PyInstaller/__init__.py | 44 + .../Lib/site-packages/PyInstaller/__main__.py | 321 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1230 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 15231 bytes ...recursion_too_deep_message.cpython-311.pyc | Bin 0 -> 1649 bytes .../_shared_with_waf.cpython-311.pyc | Bin 0 -> 2692 bytes .../__pycache__/compat.cpython-311.pyc | Bin 0 -> 26292 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 1417 bytes .../__pycache__/configure.cpython-311.pyc | Bin 0 -> 4641 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 5904 bytes .../__pycache__/log.cpython-311.pyc | Bin 0 -> 2724 bytes .../_recursion_too_deep_message.py | 45 + .../PyInstaller/_shared_with_waf.py | 86 + .../PyInstaller/archive/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 210 bytes .../__pycache__/pyz_crypto.cpython-311.pyc | Bin 0 -> 792 bytes .../__pycache__/readers.cpython-311.pyc | Bin 0 -> 8401 bytes .../__pycache__/writers.cpython-311.pyc | Bin 0 -> 17805 bytes .../PyInstaller/archive/pyz_crypto.py | 16 + .../PyInstaller/archive/readers.py | 227 + .../PyInstaller/archive/writers.py | 423 + .../bootloader/Windows-64bit-intel/run.exe | Bin 0 -> 268800 bytes .../bootloader/Windows-64bit-intel/run_d.exe | Bin 0 -> 285184 bytes .../bootloader/Windows-64bit-intel/runw.exe | Bin 0 -> 264704 bytes .../bootloader/Windows-64bit-intel/runw_d.exe | Bin 0 -> 280576 bytes .../bootloader/images/icon-console.ico | Bin 0 -> 59521 bytes .../bootloader/images/icon-windowed.ico | Bin 0 -> 60690 bytes .../PyInstaller/building/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 191 bytes .../building/__pycache__/api.cpython-311.pyc | Bin 0 -> 60036 bytes .../__pycache__/build_main.cpython-311.pyc | Bin 0 -> 56104 bytes .../__pycache__/datastruct.cpython-311.pyc | Bin 0 -> 21051 bytes .../building/__pycache__/icon.cpython-311.pyc | Bin 0 -> 4671 bytes .../__pycache__/makespec.cpython-311.pyc | Bin 0 -> 36407 bytes .../building/__pycache__/osx.cpython-311.pyc | Bin 0 -> 21542 bytes .../__pycache__/splash.cpython-311.pyc | Bin 0 -> 22412 bytes .../splash_templates.cpython-311.pyc | Bin 0 -> 6739 bytes .../__pycache__/templates.cpython-311.pyc | Bin 0 -> 2868 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 34978 bytes .../site-packages/PyInstaller/building/api.py | 1309 +++ .../PyInstaller/building/build_main.py | 1252 +++ .../PyInstaller/building/datastruct.py | 459 + .../PyInstaller/building/icon.py | 90 + .../PyInstaller/building/makespec.py | 905 ++ .../site-packages/PyInstaller/building/osx.py | 723 ++ .../PyInstaller/building/splash.py | 442 + .../PyInstaller/building/splash_templates.py | 229 + .../PyInstaller/building/templates.py | 126 + .../PyInstaller/building/utils.py | 805 ++ venv/Lib/site-packages/PyInstaller/compat.py | 764 ++ venv/Lib/site-packages/PyInstaller/config.py | 56 + .../site-packages/PyInstaller/configure.py | 107 + .../PyInstaller/depend/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 189 bytes .../__pycache__/analysis.cpython-311.pyc | Bin 0 -> 45837 bytes .../__pycache__/bindepend.cpython-311.pyc | Bin 0 -> 35246 bytes .../__pycache__/bytecode.cpython-311.pyc | Bin 0 -> 12686 bytes .../depend/__pycache__/dylib.cpython-311.pyc | Bin 0 -> 8647 bytes .../__pycache__/imphook.cpython-311.pyc | Bin 0 -> 25103 bytes .../__pycache__/imphookapi.cpython-311.pyc | Bin 0 -> 23741 bytes .../depend/__pycache__/utils.cpython-311.pyc | Bin 0 -> 16285 bytes .../PyInstaller/depend/analysis.py | 1014 +++ .../PyInstaller/depend/bindepend.py | 946 ++ .../PyInstaller/depend/bytecode.py | 337 + .../site-packages/PyInstaller/depend/dylib.py | 361 + .../PyInstaller/depend/imphook.py | 582 ++ .../PyInstaller/depend/imphookapi.py | 486 + .../site-packages/PyInstaller/depend/utils.py | 401 + .../site-packages/PyInstaller/exceptions.py | 82 + .../__pycache__/pyi_splash.cpython-311.pyc | Bin 0 -> 7780 bytes .../fake-modules/_pyi_rth_utils/__init__.py | 36 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1288 bytes .../__pycache__/_win32.cpython-311.pyc | Bin 0 -> 10618 bytes .../__pycache__/qt.cpython-311.pyc | Bin 0 -> 2596 bytes .../__pycache__/tempfile.cpython-311.pyc | Bin 0 -> 2129 bytes .../fake-modules/_pyi_rth_utils/_win32.py | 333 + .../fake-modules/_pyi_rth_utils/qt.py | 118 + .../fake-modules/_pyi_rth_utils/tempfile.py | 56 + .../PyInstaller/fake-modules/pyi_splash.py | 211 + .../PyInstaller/hooks/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 188 bytes .../hook-PIL.Image.cpython-311.pyc | Bin 0 -> 460 bytes .../hook-PIL.ImageFilter.cpython-311.pyc | Bin 0 -> 230 bytes ...hook-PIL.SpiderImagePlugin.cpython-311.pyc | Bin 0 -> 238 bytes .../__pycache__/hook-PIL.cpython-311.pyc | Bin 0 -> 296 bytes .../hook-PyQt5.QAxContainer.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PyQt5.Qsci.cpython-311.pyc | Bin 0 -> 375 bytes .../__pycache__/hook-PyQt5.Qt.cpython-311.pyc | Bin 0 -> 1045 bytes .../hook-PyQt5.Qt3DAnimation.cpython-311.pyc | Bin 0 -> 384 bytes .../hook-PyQt5.Qt3DCore.cpython-311.pyc | Bin 0 -> 379 bytes .../hook-PyQt5.Qt3DExtras.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-PyQt5.Qt3DInput.cpython-311.pyc | Bin 0 -> 380 bytes .../hook-PyQt5.Qt3DLogic.cpython-311.pyc | Bin 0 -> 380 bytes .../hook-PyQt5.Qt3DRender.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-PyQt5.QtBluetooth.cpython-311.pyc | Bin 0 -> 382 bytes .../hook-PyQt5.QtChart.cpython-311.pyc | Bin 0 -> 378 bytes .../hook-PyQt5.QtCore.cpython-311.pyc | Bin 0 -> 377 bytes .../hook-PyQt5.QtDBus.cpython-311.pyc | Bin 0 -> 377 bytes ...-PyQt5.QtDataVisualization.cpython-311.pyc | Bin 0 -> 390 bytes .../hook-PyQt5.QtDesigner.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-PyQt5.QtGui.cpython-311.pyc | Bin 0 -> 376 bytes .../hook-PyQt5.QtHelp.cpython-311.pyc | Bin 0 -> 377 bytes .../hook-PyQt5.QtLocation.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-PyQt5.QtMacExtras.cpython-311.pyc | Bin 0 -> 382 bytes .../hook-PyQt5.QtMultimedia.cpython-311.pyc | Bin 0 -> 383 bytes ...-PyQt5.QtMultimediaWidgets.cpython-311.pyc | Bin 0 -> 390 bytes .../hook-PyQt5.QtNetwork.cpython-311.pyc | Bin 0 -> 500 bytes .../hook-PyQt5.QtNetworkAuth.cpython-311.pyc | Bin 0 -> 384 bytes .../hook-PyQt5.QtNfc.cpython-311.pyc | Bin 0 -> 376 bytes .../hook-PyQt5.QtOpenGL.cpython-311.pyc | Bin 0 -> 379 bytes .../hook-PyQt5.QtPositioning.cpython-311.pyc | Bin 0 -> 384 bytes .../hook-PyQt5.QtPrintSupport.cpython-311.pyc | Bin 0 -> 385 bytes .../hook-PyQt5.QtPurchasing.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PyQt5.QtQml.cpython-311.pyc | Bin 0 -> 556 bytes .../hook-PyQt5.QtQuick.cpython-311.pyc | Bin 0 -> 378 bytes .../hook-PyQt5.QtQuick3D.cpython-311.pyc | Bin 0 -> 380 bytes .../hook-PyQt5.QtQuickWidgets.cpython-311.pyc | Bin 0 -> 385 bytes ...hook-PyQt5.QtRemoteObjects.cpython-311.pyc | Bin 0 -> 386 bytes .../hook-PyQt5.QtScript.cpython-311.pyc | Bin 0 -> 379 bytes .../hook-PyQt5.QtSensors.cpython-311.pyc | Bin 0 -> 380 bytes .../hook-PyQt5.QtSerialPort.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PyQt5.QtSql.cpython-311.pyc | Bin 0 -> 376 bytes .../hook-PyQt5.QtSvg.cpython-311.pyc | Bin 0 -> 376 bytes .../hook-PyQt5.QtTest.cpython-311.pyc | Bin 0 -> 377 bytes .../hook-PyQt5.QtTextToSpeech.cpython-311.pyc | Bin 0 -> 385 bytes .../hook-PyQt5.QtWebChannel.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PyQt5.QtWebEngine.cpython-311.pyc | Bin 0 -> 382 bytes ...hook-PyQt5.QtWebEngineCore.cpython-311.pyc | Bin 0 -> 648 bytes ...k-PyQt5.QtWebEngineWidgets.cpython-311.pyc | Bin 0 -> 389 bytes .../hook-PyQt5.QtWebKit.cpython-311.pyc | Bin 0 -> 379 bytes ...hook-PyQt5.QtWebKitWidgets.cpython-311.pyc | Bin 0 -> 386 bytes .../hook-PyQt5.QtWebSockets.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PyQt5.QtWidgets.cpython-311.pyc | Bin 0 -> 380 bytes .../hook-PyQt5.QtWinExtras.cpython-311.pyc | Bin 0 -> 382 bytes .../hook-PyQt5.QtX11Extras.cpython-311.pyc | Bin 0 -> 382 bytes .../hook-PyQt5.QtXml.cpython-311.pyc | Bin 0 -> 376 bytes .../hook-PyQt5.QtXmlPatterns.cpython-311.pyc | Bin 0 -> 384 bytes .../__pycache__/hook-PyQt5.cpython-311.pyc | Bin 0 -> 568 bytes .../hook-PyQt5.uic.cpython-311.pyc | Bin 0 -> 358 bytes .../hook-PyQt6.QAxContainer.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PyQt6.Qsci.cpython-311.pyc | Bin 0 -> 375 bytes .../hook-PyQt6.Qt3DAnimation.cpython-311.pyc | Bin 0 -> 384 bytes .../hook-PyQt6.Qt3DCore.cpython-311.pyc | Bin 0 -> 379 bytes .../hook-PyQt6.Qt3DExtras.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-PyQt6.Qt3DInput.cpython-311.pyc | Bin 0 -> 380 bytes .../hook-PyQt6.Qt3DLogic.cpython-311.pyc | Bin 0 -> 380 bytes .../hook-PyQt6.Qt3DRender.cpython-311.pyc | Bin 0 -> 423 bytes .../hook-PyQt6.QtBluetooth.cpython-311.pyc | Bin 0 -> 382 bytes .../hook-PyQt6.QtCharts.cpython-311.pyc | Bin 0 -> 379 bytes .../hook-PyQt6.QtCore.cpython-311.pyc | Bin 0 -> 377 bytes .../hook-PyQt6.QtDBus.cpython-311.pyc | Bin 0 -> 377 bytes ...-PyQt6.QtDataVisualization.cpython-311.pyc | Bin 0 -> 390 bytes .../hook-PyQt6.QtDesigner.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-PyQt6.QtGui.cpython-311.pyc | Bin 0 -> 376 bytes .../hook-PyQt6.QtHelp.cpython-311.pyc | Bin 0 -> 377 bytes .../hook-PyQt6.QtMultimedia.cpython-311.pyc | Bin 0 -> 383 bytes ...-PyQt6.QtMultimediaWidgets.cpython-311.pyc | Bin 0 -> 390 bytes .../hook-PyQt6.QtNetwork.cpython-311.pyc | Bin 0 -> 500 bytes .../hook-PyQt6.QtNetworkAuth.cpython-311.pyc | Bin 0 -> 384 bytes .../hook-PyQt6.QtNfc.cpython-311.pyc | Bin 0 -> 376 bytes .../hook-PyQt6.QtOpenGL.cpython-311.pyc | Bin 0 -> 379 bytes ...hook-PyQt6.QtOpenGLWidgets.cpython-311.pyc | Bin 0 -> 386 bytes .../hook-PyQt6.QtPdf.cpython-311.pyc | Bin 0 -> 376 bytes .../hook-PyQt6.QtPdfWidgets.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PyQt6.QtPositioning.cpython-311.pyc | Bin 0 -> 384 bytes .../hook-PyQt6.QtPrintSupport.cpython-311.pyc | Bin 0 -> 385 bytes .../hook-PyQt6.QtQml.cpython-311.pyc | Bin 0 -> 556 bytes .../hook-PyQt6.QtQuick.cpython-311.pyc | Bin 0 -> 378 bytes .../hook-PyQt6.QtQuick3D.cpython-311.pyc | Bin 0 -> 380 bytes .../hook-PyQt6.QtQuickWidgets.cpython-311.pyc | Bin 0 -> 385 bytes ...hook-PyQt6.QtRemoteObjects.cpython-311.pyc | Bin 0 -> 386 bytes .../hook-PyQt6.QtSensors.cpython-311.pyc | Bin 0 -> 380 bytes .../hook-PyQt6.QtSerialPort.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PyQt6.QtSpatialAudio.cpython-311.pyc | Bin 0 -> 385 bytes .../hook-PyQt6.QtSql.cpython-311.pyc | Bin 0 -> 376 bytes .../hook-PyQt6.QtSvg.cpython-311.pyc | Bin 0 -> 376 bytes .../hook-PyQt6.QtSvgWidgets.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PyQt6.QtTest.cpython-311.pyc | Bin 0 -> 377 bytes .../hook-PyQt6.QtTextToSpeech.cpython-311.pyc | Bin 0 -> 385 bytes .../hook-PyQt6.QtWebChannel.cpython-311.pyc | Bin 0 -> 383 bytes ...hook-PyQt6.QtWebEngineCore.cpython-311.pyc | Bin 0 -> 833 bytes ...ook-PyQt6.QtWebEngineQuick.cpython-311.pyc | Bin 0 -> 387 bytes ...k-PyQt6.QtWebEngineWidgets.cpython-311.pyc | Bin 0 -> 389 bytes .../hook-PyQt6.QtWebSockets.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PyQt6.QtWidgets.cpython-311.pyc | Bin 0 -> 380 bytes .../hook-PyQt6.QtXml.cpython-311.pyc | Bin 0 -> 376 bytes .../__pycache__/hook-PyQt6.cpython-311.pyc | Bin 0 -> 557 bytes .../hook-PyQt6.uic.cpython-311.pyc | Bin 0 -> 358 bytes ...hook-PySide2.Qt3DAnimation.cpython-311.pyc | Bin 0 -> 386 bytes .../hook-PySide2.Qt3DCore.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-PySide2.Qt3DExtras.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PySide2.Qt3DInput.cpython-311.pyc | Bin 0 -> 382 bytes .../hook-PySide2.Qt3DLogic.cpython-311.pyc | Bin 0 -> 382 bytes .../hook-PySide2.Qt3DRender.cpython-311.pyc | Bin 0 -> 383 bytes ...hook-PySide2.QtAxContainer.cpython-311.pyc | Bin 0 -> 386 bytes .../hook-PySide2.QtCharts.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-PySide2.QtConcurrent.cpython-311.pyc | Bin 0 -> 385 bytes .../hook-PySide2.QtCore.cpython-311.pyc | Bin 0 -> 379 bytes ...ySide2.QtDataVisualization.cpython-311.pyc | Bin 0 -> 392 bytes .../hook-PySide2.QtGui.cpython-311.pyc | Bin 0 -> 378 bytes .../hook-PySide2.QtHelp.cpython-311.pyc | Bin 0 -> 379 bytes .../hook-PySide2.QtLocation.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PySide2.QtMacExtras.cpython-311.pyc | Bin 0 -> 384 bytes .../hook-PySide2.QtMultimedia.cpython-311.pyc | Bin 0 -> 442 bytes ...ySide2.QtMultimediaWidgets.cpython-311.pyc | Bin 0 -> 392 bytes .../hook-PySide2.QtNetwork.cpython-311.pyc | Bin 0 -> 504 bytes .../hook-PySide2.QtOpenGL.cpython-311.pyc | Bin 0 -> 381 bytes ...-PySide2.QtOpenGLFunctions.cpython-311.pyc | Bin 0 -> 390 bytes ...hook-PySide2.QtPositioning.cpython-311.pyc | Bin 0 -> 386 bytes ...ook-PySide2.QtPrintSupport.cpython-311.pyc | Bin 0 -> 387 bytes .../hook-PySide2.QtQml.cpython-311.pyc | Bin 0 -> 600 bytes .../hook-PySide2.QtQuick.cpython-311.pyc | Bin 0 -> 380 bytes ...k-PySide2.QtQuickControls2.cpython-311.pyc | Bin 0 -> 389 bytes ...ook-PySide2.QtQuickWidgets.cpython-311.pyc | Bin 0 -> 387 bytes ...ok-PySide2.QtRemoteObjects.cpython-311.pyc | Bin 0 -> 388 bytes .../hook-PySide2.QtScript.cpython-311.pyc | Bin 0 -> 381 bytes ...hook-PySide2.QtScriptTools.cpython-311.pyc | Bin 0 -> 386 bytes .../hook-PySide2.QtScxml.cpython-311.pyc | Bin 0 -> 380 bytes .../hook-PySide2.QtSensors.cpython-311.pyc | Bin 0 -> 382 bytes .../hook-PySide2.QtSerialPort.cpython-311.pyc | Bin 0 -> 385 bytes .../hook-PySide2.QtSql.cpython-311.pyc | Bin 0 -> 378 bytes .../hook-PySide2.QtSvg.cpython-311.pyc | Bin 0 -> 378 bytes .../hook-PySide2.QtTest.cpython-311.pyc | Bin 0 -> 379 bytes ...ook-PySide2.QtTextToSpeech.cpython-311.pyc | Bin 0 -> 387 bytes .../hook-PySide2.QtUiTools.cpython-311.pyc | Bin 0 -> 422 bytes .../hook-PySide2.QtWebChannel.cpython-311.pyc | Bin 0 -> 385 bytes .../hook-PySide2.QtWebEngine.cpython-311.pyc | Bin 0 -> 384 bytes ...ok-PySide2.QtWebEngineCore.cpython-311.pyc | Bin 0 -> 652 bytes ...PySide2.QtWebEngineWidgets.cpython-311.pyc | Bin 0 -> 391 bytes .../hook-PySide2.QtWebKit.cpython-311.pyc | Bin 0 -> 381 bytes ...ok-PySide2.QtWebKitWidgets.cpython-311.pyc | Bin 0 -> 388 bytes .../hook-PySide2.QtWebSockets.cpython-311.pyc | Bin 0 -> 385 bytes .../hook-PySide2.QtWidgets.cpython-311.pyc | Bin 0 -> 382 bytes .../hook-PySide2.QtWinExtras.cpython-311.pyc | Bin 0 -> 384 bytes .../hook-PySide2.QtX11Extras.cpython-311.pyc | Bin 0 -> 384 bytes .../hook-PySide2.QtXml.cpython-311.pyc | Bin 0 -> 378 bytes ...hook-PySide2.QtXmlPatterns.cpython-311.pyc | Bin 0 -> 386 bytes .../hook-PySide2.Qwt5.cpython-311.pyc | Bin 0 -> 1061 bytes .../__pycache__/hook-PySide2.cpython-311.pyc | Bin 0 -> 650 bytes ...hook-PySide6.Qt3DAnimation.cpython-311.pyc | Bin 0 -> 386 bytes .../hook-PySide6.Qt3DCore.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-PySide6.Qt3DExtras.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PySide6.Qt3DInput.cpython-311.pyc | Bin 0 -> 382 bytes .../hook-PySide6.Qt3DLogic.cpython-311.pyc | Bin 0 -> 382 bytes .../hook-PySide6.Qt3DRender.cpython-311.pyc | Bin 0 -> 578 bytes ...hook-PySide6.QtAxContainer.cpython-311.pyc | Bin 0 -> 386 bytes .../hook-PySide6.QtBluetooth.cpython-311.pyc | Bin 0 -> 384 bytes .../hook-PySide6.QtCharts.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-PySide6.QtConcurrent.cpython-311.pyc | Bin 0 -> 385 bytes .../hook-PySide6.QtCore.cpython-311.pyc | Bin 0 -> 379 bytes .../hook-PySide6.QtDBus.cpython-311.pyc | Bin 0 -> 379 bytes ...ySide6.QtDataVisualization.cpython-311.pyc | Bin 0 -> 392 bytes .../hook-PySide6.QtDesigner.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PySide6.QtGraphs.cpython-311.pyc | Bin 0 -> 381 bytes ...ok-PySide6.QtGraphsWidgets.cpython-311.pyc | Bin 0 -> 463 bytes .../hook-PySide6.QtGui.cpython-311.pyc | Bin 0 -> 378 bytes .../hook-PySide6.QtHelp.cpython-311.pyc | Bin 0 -> 379 bytes .../hook-PySide6.QtHttpServer.cpython-311.pyc | Bin 0 -> 435 bytes .../hook-PySide6.QtLocation.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-PySide6.QtMultimedia.cpython-311.pyc | Bin 0 -> 442 bytes ...ySide6.QtMultimediaWidgets.cpython-311.pyc | Bin 0 -> 392 bytes .../hook-PySide6.QtNetwork.cpython-311.pyc | Bin 0 -> 504 bytes ...hook-PySide6.QtNetworkAuth.cpython-311.pyc | Bin 0 -> 386 bytes .../hook-PySide6.QtNfc.cpython-311.pyc | Bin 0 -> 378 bytes .../hook-PySide6.QtOpenGL.cpython-311.pyc | Bin 0 -> 381 bytes ...ok-PySide6.QtOpenGLWidgets.cpython-311.pyc | Bin 0 -> 388 bytes .../hook-PySide6.QtPdf.cpython-311.pyc | Bin 0 -> 378 bytes .../hook-PySide6.QtPdfWidgets.cpython-311.pyc | Bin 0 -> 385 bytes ...hook-PySide6.QtPositioning.cpython-311.pyc | Bin 0 -> 386 bytes ...ook-PySide6.QtPrintSupport.cpython-311.pyc | Bin 0 -> 387 bytes .../hook-PySide6.QtQml.cpython-311.pyc | Bin 0 -> 560 bytes .../hook-PySide6.QtQuick.cpython-311.pyc | Bin 0 -> 380 bytes .../hook-PySide6.QtQuick3D.cpython-311.pyc | Bin 0 -> 382 bytes ...k-PySide6.QtQuickControls2.cpython-311.pyc | Bin 0 -> 432 bytes ...ook-PySide6.QtQuickWidgets.cpython-311.pyc | Bin 0 -> 387 bytes ...ok-PySide6.QtRemoteObjects.cpython-311.pyc | Bin 0 -> 388 bytes .../hook-PySide6.QtScxml.cpython-311.pyc | Bin 0 -> 380 bytes .../hook-PySide6.QtSensors.cpython-311.pyc | Bin 0 -> 382 bytes .../hook-PySide6.QtSerialBus.cpython-311.pyc | Bin 0 -> 384 bytes .../hook-PySide6.QtSerialPort.cpython-311.pyc | Bin 0 -> 385 bytes ...ook-PySide6.QtSpatialAudio.cpython-311.pyc | Bin 0 -> 387 bytes .../hook-PySide6.QtSql.cpython-311.pyc | Bin 0 -> 378 bytes ...ook-PySide6.QtStateMachine.cpython-311.pyc | Bin 0 -> 387 bytes .../hook-PySide6.QtSvg.cpython-311.pyc | Bin 0 -> 378 bytes .../hook-PySide6.QtSvgWidgets.cpython-311.pyc | Bin 0 -> 385 bytes .../hook-PySide6.QtTest.cpython-311.pyc | Bin 0 -> 379 bytes ...ook-PySide6.QtTextToSpeech.cpython-311.pyc | Bin 0 -> 387 bytes .../hook-PySide6.QtUiTools.cpython-311.pyc | Bin 0 -> 382 bytes .../hook-PySide6.QtWebChannel.cpython-311.pyc | Bin 0 -> 385 bytes ...ok-PySide6.QtWebEngineCore.cpython-311.pyc | Bin 0 -> 887 bytes ...k-PySide6.QtWebEngineQuick.cpython-311.pyc | Bin 0 -> 389 bytes ...PySide6.QtWebEngineWidgets.cpython-311.pyc | Bin 0 -> 391 bytes .../hook-PySide6.QtWebSockets.cpython-311.pyc | Bin 0 -> 385 bytes .../hook-PySide6.QtWidgets.cpython-311.pyc | Bin 0 -> 382 bytes .../hook-PySide6.QtXml.cpython-311.pyc | Bin 0 -> 378 bytes .../__pycache__/hook-PySide6.cpython-311.pyc | Bin 0 -> 756 bytes .../hook-_pyi_rth_utils.cpython-311.pyc | Bin 0 -> 378 bytes .../__pycache__/hook-_tkinter.cpython-311.pyc | Bin 0 -> 512 bytes .../__pycache__/hook-babel.cpython-311.pyc | Bin 0 -> 426 bytes .../__pycache__/hook-difflib.cpython-311.pyc | Bin 0 -> 224 bytes ...ok-distutils.command.check.cpython-311.pyc | Bin 0 -> 241 bytes .../hook-distutils.cpython-311.pyc | Bin 0 -> 687 bytes .../hook-distutils.util.cpython-311.pyc | Bin 0 -> 241 bytes ...ok-django.contrib.sessions.cpython-311.pyc | Bin 0 -> 376 bytes .../hook-django.core.cache.cpython-311.pyc | Bin 0 -> 364 bytes .../hook-django.core.mail.cpython-311.pyc | Bin 0 -> 766 bytes ...ook-django.core.management.cpython-311.pyc | Bin 0 -> 446 bytes .../__pycache__/hook-django.cpython-311.pyc | Bin 0 -> 3748 bytes .../hook-django.db.backends.cpython-311.pyc | Bin 0 -> 985 bytes ...ngo.db.backends.mysql.base.cpython-311.pyc | Bin 0 -> 271 bytes ...go.db.backends.oracle.base.cpython-311.pyc | Bin 0 -> 273 bytes ...ok-django.template.loaders.cpython-311.pyc | Bin 0 -> 367 bytes .../hook-encodings.cpython-311.pyc | Bin 0 -> 338 bytes .../__pycache__/hook-gevent.cpython-311.pyc | Bin 0 -> 758 bytes .../hooks/__pycache__/hook-gi.cpython-311.pyc | Bin 0 -> 236 bytes .../hook-gi.repository.Adw.cpython-311.pyc | Bin 0 -> 520 bytes ...i.repository.AppIndicator3.cpython-311.pyc | Bin 0 -> 542 bytes .../hook-gi.repository.Atk.cpython-311.pyc | Bin 0 -> 1129 bytes ...itory.AyatanaAppIndicator3.cpython-311.pyc | Bin 0 -> 557 bytes ...ok-gi.repository.Champlain.cpython-311.pyc | Bin 0 -> 535 bytes ...hook-gi.repository.Clutter.cpython-311.pyc | Bin 0 -> 530 bytes .../hook-gi.repository.DBus.cpython-311.pyc | Bin 0 -> 524 bytes ...gi.repository.GIRepository.cpython-311.pyc | Bin 0 -> 540 bytes .../hook-gi.repository.GLib.cpython-311.pyc | Bin 0 -> 1753 bytes ...hook-gi.repository.GModule.cpython-311.pyc | Bin 0 -> 530 bytes ...hook-gi.repository.GObject.cpython-311.pyc | Bin 0 -> 721 bytes .../hook-gi.repository.Gdk.cpython-311.pyc | Bin 0 -> 1276 bytes ...ok-gi.repository.GdkPixbuf.cpython-311.pyc | Bin 0 -> 6096 bytes .../hook-gi.repository.Gio.cpython-311.pyc | Bin 0 -> 2549 bytes ...ook-gi.repository.Graphene.cpython-311.pyc | Bin 0 -> 532 bytes .../hook-gi.repository.Gsk.cpython-311.pyc | Bin 0 -> 522 bytes .../hook-gi.repository.Gst.cpython-311.pyc | Bin 0 -> 4237 bytes ...i.repository.GstAllocators.cpython-311.pyc | Bin 0 -> 542 bytes .../hook-gi.repository.GstApp.cpython-311.pyc | Bin 0 -> 528 bytes ...ook-gi.repository.GstAudio.cpython-311.pyc | Bin 0 -> 532 bytes ...-gi.repository.GstBadAudio.cpython-311.pyc | Bin 0 -> 538 bytes ...hook-gi.repository.GstBase.cpython-311.pyc | Bin 0 -> 530 bytes ...ook-gi.repository.GstCheck.cpython-311.pyc | Bin 0 -> 532 bytes ...ok-gi.repository.GstCodecs.cpython-311.pyc | Bin 0 -> 534 bytes ...i.repository.GstController.cpython-311.pyc | Bin 0 -> 542 bytes .../hook-gi.repository.GstGL.cpython-311.pyc | Bin 0 -> 526 bytes ...ook-gi.repository.GstGLEGL.cpython-311.pyc | Bin 0 -> 532 bytes ...gi.repository.GstGLWayland.cpython-311.pyc | Bin 0 -> 540 bytes ...ook-gi.repository.GstGLX11.cpython-311.pyc | Bin 0 -> 532 bytes ...gi.repository.GstInsertBin.cpython-311.pyc | Bin 0 -> 540 bytes ...ok-gi.repository.GstMpegts.cpython-311.pyc | Bin 0 -> 534 bytes .../hook-gi.repository.GstNet.cpython-311.pyc | Bin 0 -> 528 bytes ...k-gi.repository.GstPbutils.cpython-311.pyc | Bin 0 -> 536 bytes ...hook-gi.repository.GstPlay.cpython-311.pyc | Bin 0 -> 530 bytes ...ok-gi.repository.GstPlayer.cpython-311.pyc | Bin 0 -> 534 bytes .../hook-gi.repository.GstRtp.cpython-311.pyc | Bin 0 -> 528 bytes ...hook-gi.repository.GstRtsp.cpython-311.pyc | Bin 0 -> 530 bytes ...i.repository.GstRtspServer.cpython-311.pyc | Bin 0 -> 542 bytes .../hook-gi.repository.GstSdp.cpython-311.pyc | Bin 0 -> 528 bytes .../hook-gi.repository.GstTag.cpython-311.pyc | Bin 0 -> 528 bytes ...i.repository.GstTranscoder.cpython-311.pyc | Bin 0 -> 542 bytes ...ook-gi.repository.GstVideo.cpython-311.pyc | Bin 0 -> 532 bytes ...ok-gi.repository.GstVulkan.cpython-311.pyc | Bin 0 -> 534 bytes ...epository.GstVulkanWayland.cpython-311.pyc | Bin 0 -> 549 bytes ...gi.repository.GstVulkanXCB.cpython-311.pyc | Bin 0 -> 540 bytes ...ok-gi.repository.GstWebRTC.cpython-311.pyc | Bin 0 -> 534 bytes .../hook-gi.repository.Gtk.cpython-311.pyc | Bin 0 -> 2361 bytes ...gi.repository.GtkChamplain.cpython-311.pyc | Bin 0 -> 541 bytes ...k-gi.repository.GtkClutter.cpython-311.pyc | Bin 0 -> 536 bytes ...ok-gi.repository.GtkSource.cpython-311.pyc | Bin 0 -> 1037 bytes ...pository.GtkosxApplication.cpython-311.pyc | Bin 0 -> 648 bytes ...ook-gi.repository.HarfBuzz.cpython-311.pyc | Bin 0 -> 532 bytes .../hook-gi.repository.Pango.cpython-311.pyc | Bin 0 -> 526 bytes ...k-gi.repository.PangoCairo.cpython-311.pyc | Bin 0 -> 536 bytes .../hook-gi.repository.cairo.cpython-311.pyc | Bin 0 -> 526 bytes ...ok-gi.repository.freetype2.cpython-311.pyc | Bin 0 -> 534 bytes .../hook-gi.repository.xlib.cpython-311.pyc | Bin 0 -> 524 bytes .../__pycache__/hook-heapq.cpython-311.pyc | Bin 0 -> 222 bytes .../__pycache__/hook-idlelib.cpython-311.pyc | Bin 0 -> 326 bytes .../hook-importlib_metadata.cpython-311.pyc | Bin 0 -> 547 bytes .../hook-importlib_resources.cpython-311.pyc | Bin 0 -> 743 bytes .../__pycache__/hook-keyring.cpython-311.pyc | Bin 0 -> 432 bytes .../__pycache__/hook-kivy.cpython-311.pyc | Bin 0 -> 1080 bytes .../__pycache__/hook-lib2to3.cpython-311.pyc | Bin 0 -> 326 bytes ...k-matplotlib.backend_bases.cpython-311.pyc | Bin 0 -> 241 bytes ...lib.backends.backend_qtagg.cpython-311.pyc | Bin 0 -> 248 bytes ...b.backends.backend_qtcairo.cpython-311.pyc | Bin 0 -> 250 bytes .../hook-matplotlib.backends.cpython-311.pyc | Bin 0 -> 8523 bytes ...plotlib.backends.qt_compat.cpython-311.pyc | Bin 0 -> 473 bytes .../hook-matplotlib.cpython-311.pyc | Bin 0 -> 1086 bytes .../hook-matplotlib.numerix.cpython-311.pyc | Bin 0 -> 379 bytes .../hook-matplotlib.pyplot.cpython-311.pyc | Bin 0 -> 265 bytes .../hook-multiprocessing.util.cpython-311.pyc | Bin 0 -> 234 bytes .../__pycache__/hook-numpy.cpython-311.pyc | Bin 0 -> 1880 bytes .../hook-packaging.cpython-311.pyc | Bin 0 -> 231 bytes .../__pycache__/hook-pandas.cpython-311.pyc | Bin 0 -> 481 bytes .../hook-pandas.io.clipboard.cpython-311.pyc | Bin 0 -> 234 bytes ...ok-pandas.io.formats.style.cpython-311.pyc | Bin 0 -> 393 bytes .../hook-pandas.plotting.cpython-311.pyc | Bin 0 -> 479 bytes .../__pycache__/hook-pickle.cpython-311.pyc | Bin 0 -> 238 bytes .../hook-pkg_resources.cpython-311.pyc | Bin 0 -> 1701 bytes .../__pycache__/hook-platform.cpython-311.pyc | Bin 0 -> 320 bytes .../__pycache__/hook-pygments.cpython-311.pyc | Bin 0 -> 669 bytes .../__pycache__/hook-pytz.cpython-311.pyc | Bin 0 -> 322 bytes .../__pycache__/hook-pytzdata.cpython-311.pyc | Bin 0 -> 328 bytes .../hook-qtawesome.cpython-311.pyc | Bin 0 -> 536 bytes .../__pycache__/hook-qtpy.cpython-311.pyc | Bin 0 -> 423 bytes .../hook-scapy.layers.all.cpython-311.pyc | Bin 0 -> 350 bytes .../__pycache__/hook-scipy.cpython-311.pyc | Bin 0 -> 1842 bytes .../hook-scipy.io.matlab.cpython-311.pyc | Bin 0 -> 247 bytes .../hook-scipy.linalg.cpython-311.pyc | Bin 0 -> 278 bytes .../hook-scipy.sparse.csgraph.cpython-311.pyc | Bin 0 -> 261 bytes ...spatial.transform.rotation.cpython-311.pyc | Bin 0 -> 444 bytes ...cipy.special._ellip_harm_2.cpython-311.pyc | Bin 0 -> 524 bytes ...hook-scipy.special._ufuncs.cpython-311.pyc | Bin 0 -> 587 bytes .../hook-scipy.stats._stats.cpython-311.pyc | Bin 0 -> 413 bytes .../__pycache__/hook-scrapy.cpython-311.pyc | Bin 0 -> 413 bytes ..._vendor.importlib_metadata.cpython-311.pyc | Bin 0 -> 735 bytes ...ptools._vendor.jaraco.text.cpython-311.pyc | Bin 0 -> 709 bytes .../hook-setuptools.cpython-311.pyc | Bin 0 -> 928 bytes .../__pycache__/hook-shelve.cpython-311.pyc | Bin 0 -> 249 bytes .../hook-shiboken6.cpython-311.pyc | Bin 0 -> 384 bytes .../__pycache__/hook-sphinx.cpython-311.pyc | Bin 0 -> 923 bytes .../hook-sqlalchemy.cpython-311.pyc | Bin 0 -> 3968 bytes .../__pycache__/hook-sqlite3.cpython-311.pyc | Bin 0 -> 531 bytes .../hook-sysconfig.cpython-311.pyc | Bin 0 -> 531 bytes .../__pycache__/hook-wcwidth.cpython-311.pyc | Bin 0 -> 326 bytes .../hook-win32ctypes.core.cpython-311.pyc | Bin 0 -> 535 bytes .../__pycache__/hook-xml.cpython-311.pyc | Bin 0 -> 255 bytes .../hook-xml.dom.domreg.cpython-311.pyc | Bin 0 -> 238 bytes ...ook-xml.etree.cElementTree.cpython-311.pyc | Bin 0 -> 252 bytes .../hook-zope.interface.cpython-311.pyc | Bin 0 -> 232 bytes .../PyInstaller/hooks/hook-PIL.Image.py | 17 + .../PyInstaller/hooks/hook-PIL.ImageFilter.py | 13 + .../hooks/hook-PIL.SpiderImagePlugin.py | 14 + .../PyInstaller/hooks/hook-PIL.py | 21 + .../hooks/hook-PyQt5.QAxContainer.py | 14 + .../PyInstaller/hooks/hook-PyQt5.Qsci.py | 14 + .../PyInstaller/hooks/hook-PyQt5.Qt.py | 29 + .../hooks/hook-PyQt5.Qt3DAnimation.py | 14 + .../PyInstaller/hooks/hook-PyQt5.Qt3DCore.py | 14 + .../hooks/hook-PyQt5.Qt3DExtras.py | 14 + .../PyInstaller/hooks/hook-PyQt5.Qt3DInput.py | 14 + .../PyInstaller/hooks/hook-PyQt5.Qt3DLogic.py | 14 + .../hooks/hook-PyQt5.Qt3DRender.py | 14 + .../hooks/hook-PyQt5.QtBluetooth.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtChart.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtCore.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtDBus.py | 14 + .../hooks/hook-PyQt5.QtDataVisualization.py | 14 + .../hooks/hook-PyQt5.QtDesigner.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtGui.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtHelp.py | 14 + .../hooks/hook-PyQt5.QtLocation.py | 14 + .../hooks/hook-PyQt5.QtMacExtras.py | 14 + .../hooks/hook-PyQt5.QtMultimedia.py | 14 + .../hooks/hook-PyQt5.QtMultimediaWidgets.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtNetwork.py | 15 + .../hooks/hook-PyQt5.QtNetworkAuth.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtNfc.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtOpenGL.py | 14 + .../hooks/hook-PyQt5.QtPositioning.py | 14 + .../hooks/hook-PyQt5.QtPrintSupport.py | 14 + .../hooks/hook-PyQt5.QtPurchasing.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtQml.py | 17 + .../PyInstaller/hooks/hook-PyQt5.QtQuick.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtQuick3D.py | 14 + .../hooks/hook-PyQt5.QtQuickWidgets.py | 14 + .../hooks/hook-PyQt5.QtRemoteObjects.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtScript.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtSensors.py | 14 + .../hooks/hook-PyQt5.QtSerialPort.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtSql.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtSvg.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtTest.py | 14 + .../hooks/hook-PyQt5.QtTextToSpeech.py | 14 + .../hooks/hook-PyQt5.QtWebChannel.py | 14 + .../hooks/hook-PyQt5.QtWebEngine.py | 14 + .../hooks/hook-PyQt5.QtWebEngineCore.py | 22 + .../hooks/hook-PyQt5.QtWebEngineWidgets.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtWebKit.py | 14 + .../hooks/hook-PyQt5.QtWebKitWidgets.py | 14 + .../hooks/hook-PyQt5.QtWebSockets.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtWidgets.py | 14 + .../hooks/hook-PyQt5.QtWinExtras.py | 14 + .../hooks/hook-PyQt5.QtX11Extras.py | 14 + .../PyInstaller/hooks/hook-PyQt5.QtXml.py | 14 + .../hooks/hook-PyQt5.QtXmlPatterns.py | 14 + .../PyInstaller/hooks/hook-PyQt5.py | 29 + .../PyInstaller/hooks/hook-PyQt5.uic.py | 17 + .../hooks/hook-PyQt6.QAxContainer.py | 14 + .../PyInstaller/hooks/hook-PyQt6.Qsci.py | 14 + .../hooks/hook-PyQt6.Qt3DAnimation.py | 14 + .../PyInstaller/hooks/hook-PyQt6.Qt3DCore.py | 14 + .../hooks/hook-PyQt6.Qt3DExtras.py | 14 + .../PyInstaller/hooks/hook-PyQt6.Qt3DInput.py | 14 + .../PyInstaller/hooks/hook-PyQt6.Qt3DLogic.py | 14 + .../hooks/hook-PyQt6.Qt3DRender.py | 16 + .../hooks/hook-PyQt6.QtBluetooth.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtCharts.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtCore.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtDBus.py | 14 + .../hooks/hook-PyQt6.QtDataVisualization.py | 14 + .../hooks/hook-PyQt6.QtDesigner.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtGui.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtHelp.py | 14 + .../hooks/hook-PyQt6.QtMultimedia.py | 14 + .../hooks/hook-PyQt6.QtMultimediaWidgets.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtNetwork.py | 15 + .../hooks/hook-PyQt6.QtNetworkAuth.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtNfc.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtOpenGL.py | 14 + .../hooks/hook-PyQt6.QtOpenGLWidgets.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtPdf.py | 14 + .../hooks/hook-PyQt6.QtPdfWidgets.py | 14 + .../hooks/hook-PyQt6.QtPositioning.py | 14 + .../hooks/hook-PyQt6.QtPrintSupport.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtQml.py | 17 + .../PyInstaller/hooks/hook-PyQt6.QtQuick.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtQuick3D.py | 14 + .../hooks/hook-PyQt6.QtQuickWidgets.py | 14 + .../hooks/hook-PyQt6.QtRemoteObjects.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtSensors.py | 14 + .../hooks/hook-PyQt6.QtSerialPort.py | 14 + .../hooks/hook-PyQt6.QtSpatialAudio.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtSql.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtSvg.py | 14 + .../hooks/hook-PyQt6.QtSvgWidgets.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtTest.py | 14 + .../hooks/hook-PyQt6.QtTextToSpeech.py | 14 + .../hooks/hook-PyQt6.QtWebChannel.py | 14 + .../hooks/hook-PyQt6.QtWebEngineCore.py | 27 + .../hooks/hook-PyQt6.QtWebEngineQuick.py | 14 + .../hooks/hook-PyQt6.QtWebEngineWidgets.py | 14 + .../hooks/hook-PyQt6.QtWebSockets.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtWidgets.py | 14 + .../PyInstaller/hooks/hook-PyQt6.QtXml.py | 14 + .../PyInstaller/hooks/hook-PyQt6.py | 26 + .../PyInstaller/hooks/hook-PyQt6.uic.py | 17 + .../hooks/hook-PySide2.Qt3DAnimation.py | 14 + .../hooks/hook-PySide2.Qt3DCore.py | 14 + .../hooks/hook-PySide2.Qt3DExtras.py | 14 + .../hooks/hook-PySide2.Qt3DInput.py | 14 + .../hooks/hook-PySide2.Qt3DLogic.py | 14 + .../hooks/hook-PySide2.Qt3DRender.py | 14 + .../hooks/hook-PySide2.QtAxContainer.py | 14 + .../hooks/hook-PySide2.QtCharts.py | 14 + .../hooks/hook-PySide2.QtConcurrent.py | 14 + .../PyInstaller/hooks/hook-PySide2.QtCore.py | 14 + .../hooks/hook-PySide2.QtDataVisualization.py | 14 + .../PyInstaller/hooks/hook-PySide2.QtGui.py | 14 + .../PyInstaller/hooks/hook-PySide2.QtHelp.py | 14 + .../hooks/hook-PySide2.QtLocation.py | 14 + .../hooks/hook-PySide2.QtMacExtras.py | 14 + .../hooks/hook-PySide2.QtMultimedia.py | 19 + .../hooks/hook-PySide2.QtMultimediaWidgets.py | 14 + .../hooks/hook-PySide2.QtNetwork.py | 15 + .../hooks/hook-PySide2.QtOpenGL.py | 14 + .../hooks/hook-PySide2.QtOpenGLFunctions.py | 14 + .../hooks/hook-PySide2.QtPositioning.py | 14 + .../hooks/hook-PySide2.QtPrintSupport.py | 14 + .../PyInstaller/hooks/hook-PySide2.QtQml.py | 19 + .../PyInstaller/hooks/hook-PySide2.QtQuick.py | 14 + .../hooks/hook-PySide2.QtQuickControls2.py | 14 + .../hooks/hook-PySide2.QtQuickWidgets.py | 14 + .../hooks/hook-PySide2.QtRemoteObjects.py | 14 + .../hooks/hook-PySide2.QtScript.py | 14 + .../hooks/hook-PySide2.QtScriptTools.py | 14 + .../PyInstaller/hooks/hook-PySide2.QtScxml.py | 14 + .../hooks/hook-PySide2.QtSensors.py | 14 + .../hooks/hook-PySide2.QtSerialPort.py | 14 + .../PyInstaller/hooks/hook-PySide2.QtSql.py | 14 + .../PyInstaller/hooks/hook-PySide2.QtSvg.py | 14 + .../PyInstaller/hooks/hook-PySide2.QtTest.py | 14 + .../hooks/hook-PySide2.QtTextToSpeech.py | 14 + .../hooks/hook-PySide2.QtUiTools.py | 15 + .../hooks/hook-PySide2.QtWebChannel.py | 14 + .../hooks/hook-PySide2.QtWebEngine.py | 14 + .../hooks/hook-PySide2.QtWebEngineCore.py | 22 + .../hooks/hook-PySide2.QtWebEngineWidgets.py | 14 + .../hooks/hook-PySide2.QtWebKit.py | 14 + .../hooks/hook-PySide2.QtWebKitWidgets.py | 14 + .../hooks/hook-PySide2.QtWebSockets.py | 14 + .../hooks/hook-PySide2.QtWidgets.py | 14 + .../hooks/hook-PySide2.QtWinExtras.py | 14 + .../hooks/hook-PySide2.QtX11Extras.py | 14 + .../PyInstaller/hooks/hook-PySide2.QtXml.py | 14 + .../hooks/hook-PySide2.QtXmlPatterns.py | 14 + .../PyInstaller/hooks/hook-PySide2.Qwt5.py | 31 + .../PyInstaller/hooks/hook-PySide2.py | 25 + .../hooks/hook-PySide6.Qt3DAnimation.py | 14 + .../hooks/hook-PySide6.Qt3DCore.py | 14 + .../hooks/hook-PySide6.Qt3DExtras.py | 14 + .../hooks/hook-PySide6.Qt3DInput.py | 14 + .../hooks/hook-PySide6.Qt3DLogic.py | 14 + .../hooks/hook-PySide6.Qt3DRender.py | 20 + .../hooks/hook-PySide6.QtAxContainer.py | 14 + .../hooks/hook-PySide6.QtBluetooth.py | 14 + .../hooks/hook-PySide6.QtCharts.py | 14 + .../hooks/hook-PySide6.QtConcurrent.py | 14 + .../PyInstaller/hooks/hook-PySide6.QtCore.py | 14 + .../PyInstaller/hooks/hook-PySide6.QtDBus.py | 14 + .../hooks/hook-PySide6.QtDataVisualization.py | 14 + .../hooks/hook-PySide6.QtDesigner.py | 14 + .../hooks/hook-PySide6.QtGraphs.py | 14 + .../hooks/hook-PySide6.QtGraphsWidgets.py | 17 + .../PyInstaller/hooks/hook-PySide6.QtGui.py | 14 + .../PyInstaller/hooks/hook-PySide6.QtHelp.py | 14 + .../hooks/hook-PySide6.QtHttpServer.py | 18 + .../hooks/hook-PySide6.QtLocation.py | 14 + .../hooks/hook-PySide6.QtMultimedia.py | 19 + .../hooks/hook-PySide6.QtMultimediaWidgets.py | 14 + .../hooks/hook-PySide6.QtNetwork.py | 15 + .../hooks/hook-PySide6.QtNetworkAuth.py | 14 + .../PyInstaller/hooks/hook-PySide6.QtNfc.py | 14 + .../hooks/hook-PySide6.QtOpenGL.py | 14 + .../hooks/hook-PySide6.QtOpenGLWidgets.py | 14 + .../PyInstaller/hooks/hook-PySide6.QtPdf.py | 14 + .../hooks/hook-PySide6.QtPdfWidgets.py | 14 + .../hooks/hook-PySide6.QtPositioning.py | 14 + .../hooks/hook-PySide6.QtPrintSupport.py | 14 + .../PyInstaller/hooks/hook-PySide6.QtQml.py | 17 + .../PyInstaller/hooks/hook-PySide6.QtQuick.py | 14 + .../hooks/hook-PySide6.QtQuick3D.py | 14 + .../hooks/hook-PySide6.QtQuickControls2.py | 16 + .../hooks/hook-PySide6.QtQuickWidgets.py | 14 + .../hooks/hook-PySide6.QtRemoteObjects.py | 14 + .../PyInstaller/hooks/hook-PySide6.QtScxml.py | 14 + .../hooks/hook-PySide6.QtSensors.py | 14 + .../hooks/hook-PySide6.QtSerialBus.py | 14 + .../hooks/hook-PySide6.QtSerialPort.py | 14 + .../hooks/hook-PySide6.QtSpatialAudio.py | 14 + .../PyInstaller/hooks/hook-PySide6.QtSql.py | 14 + .../hooks/hook-PySide6.QtStateMachine.py | 14 + .../PyInstaller/hooks/hook-PySide6.QtSvg.py | 14 + .../hooks/hook-PySide6.QtSvgWidgets.py | 14 + .../PyInstaller/hooks/hook-PySide6.QtTest.py | 14 + .../hooks/hook-PySide6.QtTextToSpeech.py | 14 + .../hooks/hook-PySide6.QtUiTools.py | 14 + .../hooks/hook-PySide6.QtWebChannel.py | 14 + .../hooks/hook-PySide6.QtWebEngineCore.py | 29 + .../hooks/hook-PySide6.QtWebEngineQuick.py | 14 + .../hooks/hook-PySide6.QtWebEngineWidgets.py | 14 + .../hooks/hook-PySide6.QtWebSockets.py | 14 + .../hooks/hook-PySide6.QtWidgets.py | 14 + .../PyInstaller/hooks/hook-PySide6.QtXml.py | 14 + .../PyInstaller/hooks/hook-PySide6.py | 28 + .../PyInstaller/hooks/hook-_pyi_rth_utils.py | 17 + .../PyInstaller/hooks/hook-_tkinter.py | 22 + .../PyInstaller/hooks/hook-babel.py | 24 + .../PyInstaller/hooks/hook-difflib.py | 13 + .../hooks/hook-distutils.command.check.py | 13 + .../PyInstaller/hooks/hook-distutils.py | 33 + .../PyInstaller/hooks/hook-distutils.util.py | 13 + .../hooks/hook-django.contrib.sessions.py | 14 + .../hooks/hook-django.core.cache.py | 14 + .../hooks/hook-django.core.mail.py | 25 + .../hooks/hook-django.core.management.py | 19 + .../hook-django.db.backends.mysql.base.py | 13 + .../hook-django.db.backends.oracle.base.py | 12 + .../hooks/hook-django.db.backends.py | 25 + .../PyInstaller/hooks/hook-django.py | 92 + .../hooks/hook-django.template.loaders.py | 14 + .../PyInstaller/hooks/hook-encodings.py | 14 + .../PyInstaller/hooks/hook-gevent.py | 24 + .../PyInstaller/hooks/hook-gi.py | 12 + .../hooks/hook-gi.repository.Adw.py | 16 + .../hooks/hook-gi.repository.AppIndicator3.py | 16 + .../hooks/hook-gi.repository.Atk.py | 29 + ...hook-gi.repository.AyatanaAppIndicator3.py | 16 + .../hooks/hook-gi.repository.Champlain.py | 16 + .../hooks/hook-gi.repository.Clutter.py | 16 + .../hooks/hook-gi.repository.DBus.py | 16 + .../hooks/hook-gi.repository.GIRepository.py | 16 + .../hooks/hook-gi.repository.GLib.py | 42 + .../hooks/hook-gi.repository.GModule.py | 16 + .../hooks/hook-gi.repository.GObject.py | 19 + .../hooks/hook-gi.repository.Gdk.py | 36 + .../hooks/hook-gi.repository.GdkPixbuf.py | 150 + .../hooks/hook-gi.repository.Gio.py | 63 + .../hooks/hook-gi.repository.Graphene.py | 16 + .../hooks/hook-gi.repository.Gsk.py | 16 + .../hooks/hook-gi.repository.Gst.py | 93 + .../hooks/hook-gi.repository.GstAllocators.py | 16 + .../hooks/hook-gi.repository.GstApp.py | 16 + .../hooks/hook-gi.repository.GstAudio.py | 16 + .../hooks/hook-gi.repository.GstBadAudio.py | 16 + .../hooks/hook-gi.repository.GstBase.py | 16 + .../hooks/hook-gi.repository.GstCheck.py | 16 + .../hooks/hook-gi.repository.GstCodecs.py | 16 + .../hooks/hook-gi.repository.GstController.py | 16 + .../hooks/hook-gi.repository.GstGL.py | 16 + .../hooks/hook-gi.repository.GstGLEGL.py | 16 + .../hooks/hook-gi.repository.GstGLWayland.py | 16 + .../hooks/hook-gi.repository.GstGLX11.py | 16 + .../hooks/hook-gi.repository.GstInsertBin.py | 16 + .../hooks/hook-gi.repository.GstMpegts.py | 16 + .../hooks/hook-gi.repository.GstNet.py | 16 + .../hooks/hook-gi.repository.GstPbutils.py | 16 + .../hooks/hook-gi.repository.GstPlay.py | 16 + .../hooks/hook-gi.repository.GstPlayer.py | 16 + .../hooks/hook-gi.repository.GstRtp.py | 16 + .../hooks/hook-gi.repository.GstRtsp.py | 16 + .../hooks/hook-gi.repository.GstRtspServer.py | 16 + .../hooks/hook-gi.repository.GstSdp.py | 16 + .../hooks/hook-gi.repository.GstTag.py | 16 + .../hooks/hook-gi.repository.GstTranscoder.py | 16 + .../hooks/hook-gi.repository.GstVideo.py | 16 + .../hooks/hook-gi.repository.GstVulkan.py | 16 + .../hook-gi.repository.GstVulkanWayland.py | 16 + .../hooks/hook-gi.repository.GstVulkanXCB.py | 16 + .../hooks/hook-gi.repository.GstWebRTC.py | 16 + .../hooks/hook-gi.repository.Gtk.py | 59 + .../hooks/hook-gi.repository.GtkChamplain.py | 16 + .../hooks/hook-gi.repository.GtkClutter.py | 16 + .../hooks/hook-gi.repository.GtkSource.py | 31 + .../hook-gi.repository.GtkosxApplication.py | 18 + .../hooks/hook-gi.repository.HarfBuzz.py | 16 + .../hooks/hook-gi.repository.Pango.py | 16 + .../hooks/hook-gi.repository.PangoCairo.py | 16 + .../hooks/hook-gi.repository.cairo.py | 16 + .../hooks/hook-gi.repository.freetype2.py | 16 + .../hooks/hook-gi.repository.xlib.py | 16 + .../PyInstaller/hooks/hook-heapq.py | 13 + .../PyInstaller/hooks/hook-idlelib.py | 14 + .../hooks/hook-importlib_metadata.py | 24 + .../hooks/hook-importlib_resources.py | 22 + .../PyInstaller/hooks/hook-keyring.py | 19 + .../PyInstaller/hooks/hook-kivy.py | 25 + .../PyInstaller/hooks/hook-lib2to3.py | 16 + .../hooks/hook-matplotlib.backend_bases.py | 12 + .../hook-matplotlib.backends.backend_qtagg.py | 16 + ...ook-matplotlib.backends.backend_qtcairo.py | 16 + .../hooks/hook-matplotlib.backends.py | 226 + .../hook-matplotlib.backends.qt_compat.py | 26 + .../hooks/hook-matplotlib.numerix.py | 21 + .../PyInstaller/hooks/hook-matplotlib.py | 38 + .../hooks/hook-matplotlib.pyplot.py | 12 + .../hooks/hook-multiprocessing.util.py | 16 + .../PyInstaller/hooks/hook-numpy.py | 116 + .../PyInstaller/hooks/hook-packaging.py | 13 + .../hooks/hook-pandas.io.clipboard.py | 19 + .../hooks/hook-pandas.io.formats.style.py | 18 + .../PyInstaller/hooks/hook-pandas.plotting.py | 18 + .../PyInstaller/hooks/hook-pandas.py | 20 + .../PyInstaller/hooks/hook-pickle.py | 13 + .../PyInstaller/hooks/hook-pkg_resources.py | 68 + .../PyInstaller/hooks/hook-platform.py | 16 + .../PyInstaller/hooks/hook-pygments.py | 29 + .../PyInstaller/hooks/hook-pytz.py | 16 + .../PyInstaller/hooks/hook-pytzdata.py | 14 + .../PyInstaller/hooks/hook-qtawesome.py | 19 + .../PyInstaller/hooks/hook-qtpy.py | 25 + .../hooks/hook-scapy.layers.all.py | 19 + .../PyInstaller/hooks/hook-scipy.io.matlab.py | 13 + .../PyInstaller/hooks/hook-scipy.linalg.py | 13 + .../PyInstaller/hooks/hook-scipy.py | 52 + .../hooks/hook-scipy.sparse.csgraph.py | 13 + .../hook-scipy.spatial.transform.rotation.py | 17 + .../hooks/hook-scipy.special._ellip_harm_2.py | 30 + .../hooks/hook-scipy.special._ufuncs.py | 25 + .../hooks/hook-scipy.stats._stats.py | 15 + .../PyInstaller/hooks/hook-scrapy.py | 18 + ...k-setuptools._vendor.importlib_metadata.py | 21 + .../hook-setuptools._vendor.jaraco.text.py | 18 + .../PyInstaller/hooks/hook-setuptools.py | 75 + .../PyInstaller/hooks/hook-shelve.py | 14 + .../PyInstaller/hooks/hook-shiboken6.py | 17 + .../PyInstaller/hooks/hook-sphinx.py | 41 + .../PyInstaller/hooks/hook-sqlalchemy.py | 88 + .../PyInstaller/hooks/hook-sqlite3.py | 19 + .../PyInstaller/hooks/hook-sysconfig.py | 29 + .../PyInstaller/hooks/hook-wcwidth.py | 14 + .../hooks/hook-win32ctypes.core.py | 22 + .../PyInstaller/hooks/hook-xml.dom.domreg.py | 13 + .../hooks/hook-xml.etree.cElementTree.py | 13 + .../PyInstaller/hooks/hook-xml.py | 12 + .../PyInstaller/hooks/hook-zope.interface.py | 12 + .../hooks/pre_find_module_path/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 209 bytes .../hook-PyQt5.uic.port_v2.cpython-311.pyc | Bin 0 -> 390 bytes .../hook-_pyi_rth_utils.cpython-311.pyc | Bin 0 -> 862 bytes .../hook-distutils.cpython-311.pyc | Bin 0 -> 1949 bytes .../hook-pyi_splash.cpython-311.pyc | Bin 0 -> 1376 bytes .../__pycache__/hook-tkinter.cpython-311.pyc | Bin 0 -> 849 bytes .../hook-PyQt5.uic.port_v2.py | 15 + .../hook-_pyi_rth_utils.py | 25 + .../pre_find_module_path/hook-distutils.py | 46 + .../pre_find_module_path/hook-pyi_splash.py | 36 + .../pre_find_module_path/hook-tkinter.py | 21 + .../hooks/pre_safe_import_module/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 211 bytes .../hook-autocommand.cpython-311.pyc | Bin 0 -> 317 bytes .../hook-backports.tarfile.cpython-311.pyc | Bin 0 -> 323 bytes .../hook-distutils.cpython-311.pyc | Bin 0 -> 885 bytes .../__pycache__/hook-gi.cpython-311.pyc | Bin 0 -> 901 bytes .../hook-gi.repository.Adw.cpython-311.pyc | Bin 0 -> 463 bytes ...i.repository.AppIndicator3.cpython-311.pyc | Bin 0 -> 473 bytes .../hook-gi.repository.Atk.cpython-311.pyc | Bin 0 -> 463 bytes ...itory.AyatanaAppIndicator3.cpython-311.pyc | Bin 0 -> 480 bytes ...ok-gi.repository.Champlain.cpython-311.pyc | Bin 0 -> 469 bytes ...hook-gi.repository.Clutter.cpython-311.pyc | Bin 0 -> 467 bytes .../hook-gi.repository.DBus.cpython-311.pyc | Bin 0 -> 464 bytes ...gi.repository.GIRepository.cpython-311.pyc | Bin 0 -> 472 bytes .../hook-gi.repository.GLib.cpython-311.pyc | Bin 0 -> 464 bytes ...hook-gi.repository.GModule.cpython-311.pyc | Bin 0 -> 467 bytes ...hook-gi.repository.GObject.cpython-311.pyc | Bin 0 -> 467 bytes .../hook-gi.repository.Gdk.cpython-311.pyc | Bin 0 -> 463 bytes ...ok-gi.repository.GdkPixbuf.cpython-311.pyc | Bin 0 -> 469 bytes .../hook-gi.repository.Gio.cpython-311.pyc | Bin 0 -> 463 bytes ...ook-gi.repository.Graphene.cpython-311.pyc | Bin 0 -> 468 bytes .../hook-gi.repository.Gsk.cpython-311.pyc | Bin 0 -> 463 bytes .../hook-gi.repository.Gst.cpython-311.pyc | Bin 0 -> 463 bytes ...i.repository.GstAllocators.cpython-311.pyc | Bin 0 -> 473 bytes .../hook-gi.repository.GstApp.cpython-311.pyc | Bin 0 -> 466 bytes ...ook-gi.repository.GstAudio.cpython-311.pyc | Bin 0 -> 468 bytes ...-gi.repository.GstBadAudio.cpython-311.pyc | Bin 0 -> 471 bytes ...hook-gi.repository.GstBase.cpython-311.pyc | Bin 0 -> 467 bytes ...ook-gi.repository.GstCheck.cpython-311.pyc | Bin 0 -> 468 bytes ...ok-gi.repository.GstCodecs.cpython-311.pyc | Bin 0 -> 469 bytes ...i.repository.GstController.cpython-311.pyc | Bin 0 -> 473 bytes .../hook-gi.repository.GstGL.cpython-311.pyc | Bin 0 -> 465 bytes ...ook-gi.repository.GstGLEGL.cpython-311.pyc | Bin 0 -> 468 bytes ...gi.repository.GstGLWayland.cpython-311.pyc | Bin 0 -> 472 bytes ...ook-gi.repository.GstGLX11.cpython-311.pyc | Bin 0 -> 468 bytes ...gi.repository.GstInsertBin.cpython-311.pyc | Bin 0 -> 472 bytes ...ok-gi.repository.GstMpegts.cpython-311.pyc | Bin 0 -> 469 bytes .../hook-gi.repository.GstNet.cpython-311.pyc | Bin 0 -> 466 bytes ...k-gi.repository.GstPbutils.cpython-311.pyc | Bin 0 -> 470 bytes ...hook-gi.repository.GstPlay.cpython-311.pyc | Bin 0 -> 467 bytes ...ok-gi.repository.GstPlayer.cpython-311.pyc | Bin 0 -> 469 bytes .../hook-gi.repository.GstRtp.cpython-311.pyc | Bin 0 -> 466 bytes ...hook-gi.repository.GstRtsp.cpython-311.pyc | Bin 0 -> 467 bytes ...i.repository.GstRtspServer.cpython-311.pyc | Bin 0 -> 473 bytes .../hook-gi.repository.GstSdp.cpython-311.pyc | Bin 0 -> 466 bytes .../hook-gi.repository.GstTag.cpython-311.pyc | Bin 0 -> 466 bytes ...i.repository.GstTranscoder.cpython-311.pyc | Bin 0 -> 473 bytes ...ook-gi.repository.GstVideo.cpython-311.pyc | Bin 0 -> 468 bytes ...ok-gi.repository.GstVulkan.cpython-311.pyc | Bin 0 -> 469 bytes ...epository.GstVulkanWayland.cpython-311.pyc | Bin 0 -> 476 bytes ...gi.repository.GstVulkanXCB.cpython-311.pyc | Bin 0 -> 472 bytes ...ok-gi.repository.GstWebRTC.cpython-311.pyc | Bin 0 -> 469 bytes .../hook-gi.repository.Gtk.cpython-311.pyc | Bin 0 -> 463 bytes ...gi.repository.GtkChamplain.cpython-311.pyc | Bin 0 -> 472 bytes ...k-gi.repository.GtkClutter.cpython-311.pyc | Bin 0 -> 470 bytes ...ok-gi.repository.GtkSource.cpython-311.pyc | Bin 0 -> 469 bytes ...pository.GtkosxApplication.cpython-311.pyc | Bin 0 -> 477 bytes ...ook-gi.repository.HarfBuzz.cpython-311.pyc | Bin 0 -> 468 bytes .../hook-gi.repository.Pango.cpython-311.pyc | Bin 0 -> 465 bytes ...k-gi.repository.PangoCairo.cpython-311.pyc | Bin 0 -> 470 bytes .../hook-gi.repository.cairo.cpython-311.pyc | Bin 0 -> 465 bytes ...ok-gi.repository.freetype2.cpython-311.pyc | Bin 0 -> 469 bytes .../hook-gi.repository.xlib.cpython-311.pyc | Bin 0 -> 464 bytes .../hook-importlib_metadata.cpython-311.pyc | Bin 0 -> 324 bytes .../hook-importlib_resources.cpython-311.pyc | Bin 0 -> 325 bytes .../__pycache__/hook-inflect.cpython-311.pyc | Bin 0 -> 313 bytes .../hook-jaraco.context.cpython-311.pyc | Bin 0 -> 320 bytes .../hook-jaraco.functools.cpython-311.pyc | Bin 0 -> 322 bytes .../hook-jaraco.text.cpython-311.pyc | Bin 0 -> 317 bytes .../hook-more_itertools.cpython-311.pyc | Bin 0 -> 320 bytes .../hook-ordered_set.cpython-311.pyc | Bin 0 -> 317 bytes .../hook-packaging.cpython-311.pyc | Bin 0 -> 315 bytes .../hook-platformdirs.cpython-311.pyc | Bin 0 -> 318 bytes ...etuptools.extern.six.moves.cpython-311.pyc | Bin 0 -> 1939 bytes .../hook-six.moves.cpython-311.pyc | Bin 0 -> 2818 bytes .../__pycache__/hook-tomli.cpython-311.pyc | Bin 0 -> 311 bytes .../hook-typeguard.cpython-311.pyc | Bin 0 -> 315 bytes .../hook-typing_extensions.cpython-311.pyc | Bin 0 -> 323 bytes ...urllib3.packages.six.moves.cpython-311.pyc | Bin 0 -> 1753 bytes .../__pycache__/hook-wheel.cpython-311.pyc | Bin 0 -> 311 bytes .../__pycache__/hook-zipp.cpython-311.pyc | Bin 0 -> 310 bytes .../hook-autocommand.py | 15 + .../hook-backports.tarfile.py | 15 + .../pre_safe_import_module/hook-distutils.py | 23 + .../hooks/pre_safe_import_module/hook-gi.py | 37 + .../hook-gi.repository.Adw.py | 16 + .../hook-gi.repository.AppIndicator3.py | 16 + .../hook-gi.repository.Atk.py | 16 + ...hook-gi.repository.AyatanaAppIndicator3.py | 16 + .../hook-gi.repository.Champlain.py | 16 + .../hook-gi.repository.Clutter.py | 16 + .../hook-gi.repository.DBus.py | 16 + .../hook-gi.repository.GIRepository.py | 16 + .../hook-gi.repository.GLib.py | 16 + .../hook-gi.repository.GModule.py | 16 + .../hook-gi.repository.GObject.py | 16 + .../hook-gi.repository.Gdk.py | 16 + .../hook-gi.repository.GdkPixbuf.py | 16 + .../hook-gi.repository.Gio.py | 16 + .../hook-gi.repository.Graphene.py | 16 + .../hook-gi.repository.Gsk.py | 16 + .../hook-gi.repository.Gst.py | 16 + .../hook-gi.repository.GstAllocators.py | 16 + .../hook-gi.repository.GstApp.py | 16 + .../hook-gi.repository.GstAudio.py | 16 + .../hook-gi.repository.GstBadAudio.py | 16 + .../hook-gi.repository.GstBase.py | 16 + .../hook-gi.repository.GstCheck.py | 16 + .../hook-gi.repository.GstCodecs.py | 16 + .../hook-gi.repository.GstController.py | 16 + .../hook-gi.repository.GstGL.py | 16 + .../hook-gi.repository.GstGLEGL.py | 16 + .../hook-gi.repository.GstGLWayland.py | 16 + .../hook-gi.repository.GstGLX11.py | 16 + .../hook-gi.repository.GstInsertBin.py | 16 + .../hook-gi.repository.GstMpegts.py | 16 + .../hook-gi.repository.GstNet.py | 16 + .../hook-gi.repository.GstPbutils.py | 16 + .../hook-gi.repository.GstPlay.py | 16 + .../hook-gi.repository.GstPlayer.py | 16 + .../hook-gi.repository.GstRtp.py | 16 + .../hook-gi.repository.GstRtsp.py | 16 + .../hook-gi.repository.GstRtspServer.py | 16 + .../hook-gi.repository.GstSdp.py | 16 + .../hook-gi.repository.GstTag.py | 16 + .../hook-gi.repository.GstTranscoder.py | 16 + .../hook-gi.repository.GstVideo.py | 16 + .../hook-gi.repository.GstVulkan.py | 16 + .../hook-gi.repository.GstVulkanWayland.py | 16 + .../hook-gi.repository.GstVulkanXCB.py | 16 + .../hook-gi.repository.GstWebRTC.py | 16 + .../hook-gi.repository.Gtk.py | 16 + .../hook-gi.repository.GtkChamplain.py | 16 + .../hook-gi.repository.GtkClutter.py | 16 + .../hook-gi.repository.GtkSource.py | 16 + .../hook-gi.repository.GtkosxApplication.py | 16 + .../hook-gi.repository.HarfBuzz.py | 16 + .../hook-gi.repository.Pango.py | 16 + .../hook-gi.repository.PangoCairo.py | 16 + .../hook-gi.repository.cairo.py | 16 + .../hook-gi.repository.freetype2.py | 16 + .../hook-gi.repository.xlib.py | 16 + .../hook-importlib_metadata.py | 15 + .../hook-importlib_resources.py | 15 + .../pre_safe_import_module/hook-inflect.py | 15 + .../hook-jaraco.context.py | 15 + .../hook-jaraco.functools.py | 15 + .../hook-jaraco.text.py | 15 + .../hook-more_itertools.py | 15 + .../hook-ordered_set.py | 15 + .../pre_safe_import_module/hook-packaging.py | 15 + .../hook-platformdirs.py | 15 + .../hook-setuptools.extern.six.moves.py | 39 + .../pre_safe_import_module/hook-six.moves.py | 62 + .../pre_safe_import_module/hook-tomli.py | 15 + .../pre_safe_import_module/hook-typeguard.py | 15 + .../hook-typing_extensions.py | 15 + .../hook-urllib3.packages.six.moves.py | 34 + .../pre_safe_import_module/hook-wheel.py | 15 + .../hooks/pre_safe_import_module/hook-zipp.py | 15 + .../PyInstaller/hooks/rthooks.dat | 23 + .../PyInstaller/hooks/rthooks/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 196 bytes .../pyi_rth__tkinter.cpython-311.pyc | Bin 0 -> 1217 bytes .../pyi_rth_django.cpython-311.pyc | Bin 0 -> 1103 bytes .../pyi_rth_gdkpixbuf.cpython-311.pyc | Bin 0 -> 1967 bytes .../__pycache__/pyi_rth_gi.cpython-311.pyc | Bin 0 -> 577 bytes .../__pycache__/pyi_rth_gio.cpython-311.pyc | Bin 0 -> 577 bytes .../__pycache__/pyi_rth_glib.cpython-311.pyc | Bin 0 -> 794 bytes .../pyi_rth_gstreamer.cpython-311.pyc | Bin 0 -> 962 bytes .../__pycache__/pyi_rth_gtk.cpython-311.pyc | Bin 0 -> 808 bytes .../pyi_rth_inspect.cpython-311.pyc | Bin 0 -> 1908 bytes .../__pycache__/pyi_rth_kivy.cpython-311.pyc | Bin 0 -> 791 bytes .../pyi_rth_mplconfig.cpython-311.pyc | Bin 0 -> 891 bytes .../pyi_rth_multiprocessing.cpython-311.pyc | Bin 0 -> 2106 bytes .../pyi_rth_pkgres.cpython-311.pyc | Bin 0 -> 7394 bytes .../pyi_rth_pkgutil.cpython-311.pyc | Bin 0 -> 1749 bytes .../__pycache__/pyi_rth_pyqt5.cpython-311.pyc | Bin 0 -> 2101 bytes .../__pycache__/pyi_rth_pyqt6.cpython-311.pyc | Bin 0 -> 2231 bytes .../pyi_rth_pyside2.cpython-311.pyc | Bin 0 -> 2094 bytes .../pyi_rth_pyside6.cpython-311.pyc | Bin 0 -> 2224 bytes .../pyi_rth_setuptools.cpython-311.pyc | Bin 0 -> 1248 bytes .../hooks/rthooks/pyi_rth__tkinter.py | 37 + .../hooks/rthooks/pyi_rth_django.py | 34 + .../hooks/rthooks/pyi_rth_gdkpixbuf.py | 41 + .../PyInstaller/hooks/rthooks/pyi_rth_gi.py | 21 + .../PyInstaller/hooks/rthooks/pyi_rth_gio.py | 21 + .../PyInstaller/hooks/rthooks/pyi_rth_glib.py | 37 + .../hooks/rthooks/pyi_rth_gstreamer.py | 32 + .../PyInstaller/hooks/rthooks/pyi_rth_gtk.py | 27 + .../hooks/rthooks/pyi_rth_inspect.py | 53 + .../PyInstaller/hooks/rthooks/pyi_rth_kivy.py | 24 + .../hooks/rthooks/pyi_rth_mplconfig.py | 46 + .../hooks/rthooks/pyi_rth_multiprocessing.py | 55 + .../hooks/rthooks/pyi_rth_pkgres.py | 171 + .../hooks/rthooks/pyi_rth_pkgutil.py | 64 + .../hooks/rthooks/pyi_rth_pyqt5.py | 68 + .../hooks/rthooks/pyi_rth_pyqt6.py | 70 + .../hooks/rthooks/pyi_rth_pyside2.py | 63 + .../hooks/rthooks/pyi_rth_pyside6.py | 69 + .../hooks/rthooks/pyi_rth_setuptools.py | 37 + .../PyInstaller/isolated/__init__.py | 31 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1279 bytes .../__pycache__/_child.cpython-311.pyc | Bin 0 -> 4361 bytes .../__pycache__/_parent.cpython-311.pyc | Bin 0 -> 17573 bytes .../PyInstaller/isolated/_child.py | 101 + .../PyInstaller/isolated/_parent.py | 437 + .../site-packages/PyInstaller/lib/README.rst | 49 + .../site-packages/PyInstaller/lib/__init__.py | 1 + .../lib/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 186 bytes .../PyInstaller/lib/modulegraph/__init__.py | 1 + .../PyInstaller/lib/modulegraph/__main__.py | 89 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 217 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 4347 bytes .../__pycache__/find_modules.cpython-311.pyc | Bin 0 -> 2301 bytes .../__pycache__/modulegraph.cpython-311.pyc | Bin 0 -> 116271 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 1216 bytes .../lib/modulegraph/find_modules.py | 61 + .../lib/modulegraph/modulegraph.py | 3061 +++++++ .../PyInstaller/lib/modulegraph/util.py | 21 + .../PyInstaller/loader/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 189 bytes .../pyiboot01_bootstrap.cpython-311.pyc | Bin 0 -> 1904 bytes .../pyimod01_archive.cpython-311.pyc | Bin 0 -> 5354 bytes .../pyimod02_importers.cpython-311.pyc | Bin 0 -> 32093 bytes .../pyimod03_ctypes.cpython-311.pyc | Bin 0 -> 6962 bytes .../pyimod04_pywin32.cpython-311.pyc | Bin 0 -> 2008 bytes .../PyInstaller/loader/pyiboot01_bootstrap.py | 95 + .../PyInstaller/loader/pyimod01_archive.py | 135 + .../PyInstaller/loader/pyimod02_importers.py | 702 ++ .../PyInstaller/loader/pyimod03_ctypes.py | 131 + .../PyInstaller/loader/pyimod04_pywin32.py | 56 + venv/Lib/site-packages/PyInstaller/log.py | 64 + .../PyInstaller/utils/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 188 bytes .../__pycache__/conftest.cpython-311.pyc | Bin 0 -> 26970 bytes .../utils/__pycache__/misc.cpython-311.pyc | Bin 0 -> 9773 bytes .../utils/__pycache__/osx.cpython-311.pyc | Bin 0 -> 28881 bytes .../__pycache__/run_tests.cpython-311.pyc | Bin 0 -> 2888 bytes .../utils/__pycache__/tests.cpython-311.pyc | Bin 0 -> 6302 bytes .../PyInstaller/utils/cliutils/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 197 bytes .../archive_viewer.cpython-311.pyc | Bin 0 -> 13089 bytes .../__pycache__/bindepend.cpython-311.pyc | Bin 0 -> 2578 bytes .../__pycache__/grab_version.cpython-311.pyc | Bin 0 -> 2497 bytes .../__pycache__/makespec.cpython-311.pyc | Bin 0 -> 2538 bytes .../__pycache__/set_version.cpython-311.pyc | Bin 0 -> 2027 bytes .../utils/cliutils/archive_viewer.py | 268 + .../PyInstaller/utils/cliutils/bindepend.py | 58 + .../utils/cliutils/grab_version.py | 59 + .../PyInstaller/utils/cliutils/makespec.py | 61 + .../PyInstaller/utils/cliutils/set_version.py | 51 + .../PyInstaller/utils/conftest.py | 587 ++ .../PyInstaller/utils/hooks/__init__.py | 1339 +++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 55794 bytes .../hooks/__pycache__/conda.cpython-311.pyc | Bin 0 -> 16293 bytes .../hooks/__pycache__/django.cpython-311.pyc | Bin 0 -> 6217 bytes .../hooks/__pycache__/gi.cpython-311.pyc | Bin 0 -> 19647 bytes .../__pycache__/setuptools.cpython-311.pyc | Bin 0 -> 9301 bytes .../hooks/__pycache__/tcl_tk.cpython-311.pyc | Bin 0 -> 13359 bytes .../PyInstaller/utils/hooks/conda.py | 396 + .../PyInstaller/utils/hooks/django.py | 152 + .../PyInstaller/utils/hooks/gi.py | 426 + .../PyInstaller/utils/hooks/qt/__init__.py | 1424 +++ .../qt/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 51221 bytes .../__pycache__/_modules_info.cpython-311.pyc | Bin 0 -> 10398 bytes .../utils/hooks/qt/_modules_info.py | 450 + .../PyInstaller/utils/hooks/setuptools.py | 247 + .../PyInstaller/utils/hooks/tcl_tk.py | 340 + .../site-packages/PyInstaller/utils/misc.py | 229 + .../site-packages/PyInstaller/utils/osx.py | 692 ++ .../PyInstaller/utils/run_tests.py | 70 + .../site-packages/PyInstaller/utils/tests.py | 152 + .../PyInstaller/utils/win32/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 214 bytes .../win32/__pycache__/icon.cpython-311.pyc | Bin 0 -> 13206 bytes .../__pycache__/versioninfo.cpython-311.pyc | Bin 0 -> 32534 bytes .../__pycache__/winmanifest.cpython-311.pyc | Bin 0 -> 10407 bytes .../__pycache__/winresource.cpython-311.pyc | Bin 0 -> 7679 bytes .../__pycache__/winutils.cpython-311.pyc | Bin 0 -> 8710 bytes .../PyInstaller/utils/win32/icon.py | 251 + .../PyInstaller/utils/win32/versioninfo.py | 605 ++ .../PyInstaller/utils/win32/winmanifest.py | 244 + .../PyInstaller/utils/win32/winresource.py | 189 + .../PyInstaller/utils/win32/winutils.py | 257 + .../__pycache__/pefile.cpython-311.pyc | Bin 0 -> 286103 bytes .../__pycache__/peutils.cpython-311.pyc | Bin 0 -> 16483 bytes .../_pyinstaller_hooks_contrib/__init__.py | 26 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 714 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 548 bytes .../__pycache__/compat.cpython-311.pyc | Bin 0 -> 1802 bytes .../_pyinstaller_hooks_contrib/compat.py | 42 + .../pre_find_module_path/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 218 bytes .../pre_safe_import_module/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 220 bytes .../hook-tensorflow.cpython-311.pyc | Bin 0 -> 839 bytes .../__pycache__/hook-win32com.cpython-311.pyc | Bin 0 -> 1847 bytes .../pre_safe_import_module/hook-tensorflow.py | 28 + .../pre_safe_import_module/hook-win32com.py | 46 + .../_pyinstaller_hooks_contrib/rthooks.dat | 16 + .../rthooks/__init__.py | 10 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 205 bytes ...i_rth_cryptography_openssl.cpython-311.pyc | Bin 0 -> 559 bytes .../pyi_rth_enchant.cpython-311.pyc | Bin 0 -> 551 bytes .../pyi_rth_ffpyplayer.cpython-311.pyc | Bin 0 -> 304 bytes .../pyi_rth_findlibs.cpython-311.pyc | Bin 0 -> 1471 bytes .../__pycache__/pyi_rth_nltk.cpython-311.pyc | Bin 0 -> 492 bytes .../__pycache__/pyi_rth_osgeo.cpython-311.pyc | Bin 0 -> 1182 bytes .../pyi_rth_pygraphviz.cpython-311.pyc | Bin 0 -> 1108 bytes .../pyi_rth_pyproj.cpython-311.pyc | Bin 0 -> 770 bytes ...rth_pyqtgraph_multiprocess.cpython-311.pyc | Bin 0 -> 2008 bytes .../pyi_rth_pythoncom.cpython-311.pyc | Bin 0 -> 608 bytes .../pyi_rth_pywintypes.cpython-311.pyc | Bin 0 -> 609 bytes .../pyi_rth_tensorflow.cpython-311.pyc | Bin 0 -> 926 bytes .../pyi_rth_traitlets.cpython-311.pyc | Bin 0 -> 495 bytes .../__pycache__/pyi_rth_usb.cpython-311.pyc | Bin 0 -> 2970 bytes .../rthooks/pyi_rth_cryptography_openssl.py | 20 + .../rthooks/pyi_rth_enchant.py | 22 + .../rthooks/pyi_rth_ffpyplayer.py | 19 + .../rthooks/pyi_rth_findlibs.py | 52 + .../rthooks/pyi_rth_nltk.py | 17 + .../rthooks/pyi_rth_osgeo.py | 32 + .../rthooks/pyi_rth_pygraphviz.py | 32 + .../rthooks/pyi_rth_pyproj.py | 26 + .../rthooks/pyi_rth_pyqtgraph_multiprocess.py | 51 + .../rthooks/pyi_rth_pythoncom.py | 24 + .../rthooks/pyi_rth_pywintypes.py | 24 + .../rthooks/pyi_rth_tensorflow.py | 53 + .../rthooks/pyi_rth_traitlets.py | 25 + .../rthooks/pyi_rth_usb.py | 75 + .../stdhooks/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 206 bytes .../__pycache__/hook-BTrees.cpython-311.pyc | Bin 0 -> 350 bytes .../hook-CTkMessagebox.cpython-311.pyc | Bin 0 -> 356 bytes .../__pycache__/hook-Crypto.cpython-311.pyc | Bin 0 -> 2147 bytes .../hook-Cryptodome.cpython-311.pyc | Bin 0 -> 1306 bytes .../hook-HtmlTestRunner.cpython-311.pyc | Bin 0 -> 359 bytes .../__pycache__/hook-IPython.cpython-311.pyc | Bin 0 -> 750 bytes .../__pycache__/hook-OpenGL.cpython-311.pyc | Bin 0 -> 1960 bytes .../hook-OpenGL_accelerate.cpython-311.pyc | Bin 0 -> 575 bytes .../hook-PyTaskbar.cpython-311.pyc | Bin 0 -> 348 bytes .../__pycache__/hook-Xlib.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/hook-_mssql.cpython-311.pyc | Bin 0 -> 236 bytes .../__pycache__/hook-_mysql.cpython-311.pyc | Bin 0 -> 353 bytes .../hook-accessible_output2.cpython-311.pyc | Bin 0 -> 463 bytes .../__pycache__/hook-adbutils.cpython-311.pyc | Bin 0 -> 563 bytes .../__pycache__/hook-adios.cpython-311.pyc | Bin 0 -> 322 bytes .../hook-afmformats.cpython-311.pyc | Bin 0 -> 350 bytes .../hook-aliyunsdkcore.cpython-311.pyc | Bin 0 -> 356 bytes .../__pycache__/hook-altair.cpython-311.pyc | Bin 0 -> 342 bytes .../hook-amazonproduct.cpython-311.pyc | Bin 0 -> 719 bytes .../__pycache__/hook-anyio.cpython-311.pyc | Bin 0 -> 498 bytes .../__pycache__/hook-appdirs.cpython-311.pyc | Bin 0 -> 548 bytes .../__pycache__/hook-appy.pod.cpython-311.pyc | Bin 0 -> 351 bytes .../hook-apscheduler.cpython-311.pyc | Bin 0 -> 862 bytes .../__pycache__/hook-argon2.cpython-311.pyc | Bin 0 -> 246 bytes .../__pycache__/hook-astor.cpython-311.pyc | Bin 0 -> 340 bytes .../__pycache__/hook-astroid.cpython-311.pyc | Bin 0 -> 758 bytes .../__pycache__/hook-astropy.cpython-311.pyc | Bin 0 -> 1069 bytes .../hook-astropy_iers_data.cpython-311.pyc | Bin 0 -> 365 bytes .../__pycache__/hook-av.cpython-311.pyc | Bin 0 -> 1418 bytes .../__pycache__/hook-avro.cpython-311.pyc | Bin 0 -> 843 bytes .../__pycache__/hook-azurerm.cpython-311.pyc | Bin 0 -> 505 bytes .../hook-backports.cpython-311.pyc | Bin 0 -> 242 bytes .../hook-backports.zoneinfo.cpython-311.pyc | Bin 0 -> 348 bytes .../__pycache__/hook-bacon.cpython-311.pyc | Bin 0 -> 1718 bytes .../__pycache__/hook-bcrypt.cpython-311.pyc | Bin 0 -> 314 bytes .../hook-bitsandbytes.cpython-311.pyc | Bin 0 -> 407 bytes .../__pycache__/hook-bleak.cpython-311.pyc | Bin 0 -> 554 bytes .../__pycache__/hook-blspy.cpython-311.pyc | Bin 0 -> 908 bytes .../__pycache__/hook-bokeh.cpython-311.pyc | Bin 0 -> 747 bytes .../__pycache__/hook-boto.cpython-311.pyc | Bin 0 -> 338 bytes .../__pycache__/hook-boto3.cpython-311.pyc | Bin 0 -> 560 bytes .../__pycache__/hook-botocore.cpython-311.pyc | Bin 0 -> 507 bytes .../__pycache__/hook-branca.cpython-311.pyc | Bin 0 -> 342 bytes .../hook-cairocffi.cpython-311.pyc | Bin 0 -> 1655 bytes .../__pycache__/hook-cairosvg.cpython-311.pyc | Bin 0 -> 1482 bytes .../__pycache__/hook-capstone.cpython-311.pyc | Bin 0 -> 353 bytes .../hook-cassandra.cpython-311.pyc | Bin 0 -> 356 bytes .../__pycache__/hook-celpy.cpython-311.pyc | Bin 0 -> 342 bytes .../__pycache__/hook-certifi.cpython-311.pyc | Bin 0 -> 344 bytes .../__pycache__/hook-cf_units.cpython-311.pyc | Bin 0 -> 381 bytes .../__pycache__/hook-cftime.cpython-311.pyc | Bin 0 -> 297 bytes .../hook-charset_normalizer.cpython-311.pyc | Bin 0 -> 446 bytes .../hook-cloudpickle.cpython-311.pyc | Bin 0 -> 434 bytes .../hook-cloudscraper.cpython-311.pyc | Bin 0 -> 354 bytes .../__pycache__/hook-clr.cpython-311.pyc | Bin 0 -> 2172 bytes .../hook-clr_loader.cpython-311.pyc | Bin 0 -> 485 bytes .../__pycache__/hook-cmocean.cpython-311.pyc | Bin 0 -> 368 bytes .../hook-compliance_checker.cpython-311.pyc | Bin 0 -> 736 bytes .../hook-comtypes.client.cpython-311.pyc | Bin 0 -> 361 bytes .../hook-countrycode.cpython-311.pyc | Bin 0 -> 352 bytes .../hook-countryinfo.cpython-311.pyc | Bin 0 -> 423 bytes .../hook-cryptography.cpython-311.pyc | Bin 0 -> 4358 bytes .../hook-customtkinter.cpython-311.pyc | Bin 0 -> 356 bytes .../__pycache__/hook-cv2.cpython-311.pyc | Bin 0 -> 6367 bytes .../hook-cx_Oracle.cpython-311.pyc | Bin 0 -> 242 bytes .../hook-cytoolz.itertoolz.cpython-311.pyc | Bin 0 -> 283 bytes .../__pycache__/hook-dash.cpython-311.pyc | Bin 0 -> 338 bytes ...-dash_bootstrap_components.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-dash_core_components.cpython-311.pyc | Bin 0 -> 371 bytes .../hook-dash_html_components.cpython-311.pyc | Bin 0 -> 371 bytes .../hook-dash_renderer.cpython-311.pyc | Bin 0 -> 356 bytes .../hook-dash_table.cpython-311.pyc | Bin 0 -> 350 bytes .../hook-dash_uploader.cpython-311.pyc | Bin 0 -> 356 bytes .../__pycache__/hook-dask.cpython-311.pyc | Bin 0 -> 469 bytes .../__pycache__/hook-datasets.cpython-311.pyc | Bin 0 -> 248 bytes ...-dateparser.utils.strptime.cpython-311.pyc | Bin 0 -> 406 bytes .../hook-dbus_fast.cpython-311.pyc | Bin 0 -> 358 bytes .../__pycache__/hook-dclab.cpython-311.pyc | Bin 0 -> 340 bytes .../hook-detectron2.cpython-311.pyc | Bin 0 -> 250 bytes .../__pycache__/hook-discid.cpython-311.pyc | Bin 0 -> 1306 bytes .../__pycache__/hook-distorm3.cpython-311.pyc | Bin 0 -> 376 bytes .../hook-dns.rdata.cpython-311.pyc | Bin 0 -> 358 bytes .../__pycache__/hook-docutils.cpython-311.pyc | Bin 0 -> 677 bytes .../__pycache__/hook-docx.cpython-311.pyc | Bin 0 -> 338 bytes .../__pycache__/hook-docx2pdf.cpython-311.pyc | Bin 0 -> 426 bytes .../__pycache__/hook-dynaconf.cpython-311.pyc | Bin 0 -> 335 bytes .../__pycache__/hook-easyocr.cpython-311.pyc | Bin 0 -> 1413 bytes .../__pycache__/hook-eel.cpython-311.pyc | Bin 0 -> 383 bytes .../__pycache__/hook-enchant.cpython-311.pyc | Bin 0 -> 2567 bytes .../hook-eng_to_ipa.cpython-311.pyc | Bin 0 -> 350 bytes .../__pycache__/hook-ens.cpython-311.pyc | Bin 0 -> 336 bytes ...k-enzyme.parsers.ebml.core.cpython-311.pyc | Bin 0 -> 668 bytes .../__pycache__/hook-eth_abi.cpython-311.pyc | Bin 0 -> 338 bytes .../hook-eth_account.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/hook-eth_hash.cpython-311.pyc | Bin 0 -> 564 bytes .../hook-eth_keyfile.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/hook-eth_keys.cpython-311.pyc | Bin 0 -> 454 bytes .../__pycache__/hook-eth_rlp.cpython-311.pyc | Bin 0 -> 451 bytes .../hook-eth_typing.cpython-311.pyc | Bin 0 -> 346 bytes .../hook-eth_utils.cpython-311.pyc | Bin 0 -> 342 bytes .../hook-eth_utils.network.cpython-311.pyc | Bin 0 -> 356 bytes .../hook-exchangelib.cpython-311.pyc | Bin 0 -> 243 bytes .../__pycache__/hook-fabric.cpython-311.pyc | Bin 0 -> 342 bytes .../hook-fairscale.cpython-311.pyc | Bin 0 -> 249 bytes .../__pycache__/hook-faker.cpython-311.pyc | Bin 0 -> 535 bytes .../__pycache__/hook-falcon.cpython-311.pyc | Bin 0 -> 817 bytes .../__pycache__/hook-fastai.cpython-311.pyc | Bin 0 -> 246 bytes .../hook-fastparquet.cpython-311.pyc | Bin 0 -> 1076 bytes .../hook-ffpyplayer.cpython-311.pyc | Bin 0 -> 558 bytes .../__pycache__/hook-fiona.cpython-311.pyc | Bin 0 -> 597 bytes .../hook-flask_compress.cpython-311.pyc | Bin 0 -> 353 bytes .../hook-flask_restx.cpython-311.pyc | Bin 0 -> 352 bytes .../__pycache__/hook-flex.cpython-311.pyc | Bin 0 -> 332 bytes .../__pycache__/hook-flirpy.cpython-311.pyc | Bin 0 -> 496 bytes .../__pycache__/hook-fmpy.cpython-311.pyc | Bin 0 -> 646 bytes .../__pycache__/hook-folium.cpython-311.pyc | Bin 0 -> 344 bytes .../__pycache__/hook-freetype.cpython-311.pyc | Bin 0 -> 353 bytes .../hook-fvcore.nn.cpython-311.pyc | Bin 0 -> 249 bytes .../__pycache__/hook-gadfly.cpython-311.pyc | Bin 0 -> 239 bytes .../__pycache__/hook-gbulb.cpython-311.pyc | Bin 0 -> 248 bytes .../__pycache__/hook-gcloud.cpython-311.pyc | Bin 0 -> 424 bytes .../hook-geopandas.cpython-311.pyc | Bin 0 -> 377 bytes .../__pycache__/hook-gitlab.cpython-311.pyc | Bin 0 -> 342 bytes .../__pycache__/hook-gmplot.cpython-311.pyc | Bin 0 -> 342 bytes .../__pycache__/hook-gmsh.cpython-311.pyc | Bin 0 -> 889 bytes .../__pycache__/hook-gooey.cpython-311.pyc | Bin 0 -> 434 bytes .../hook-google.api_core.cpython-311.pyc | Bin 0 -> 355 bytes ...hook-google.cloud.bigquery.cpython-311.pyc | Bin 0 -> 419 bytes .../hook-google.cloud.core.cpython-311.pyc | Bin 0 -> 359 bytes .../hook-google.cloud.kms_v1.cpython-311.pyc | Bin 0 -> 360 bytes ...ook-google.cloud.pubsub_v1.cpython-311.pyc | Bin 0 -> 366 bytes .../hook-google.cloud.speech.cpython-311.pyc | Bin 0 -> 363 bytes .../hook-google.cloud.storage.cpython-311.pyc | Bin 0 -> 365 bytes ...ook-google.cloud.translate.cpython-311.pyc | Bin 0 -> 369 bytes ...hook-googleapiclient.model.cpython-311.pyc | Bin 0 -> 567 bytes .../__pycache__/hook-grapheme.cpython-311.pyc | Bin 0 -> 346 bytes .../hook-graphql_query.cpython-311.pyc | Bin 0 -> 450 bytes .../hook-great_expectations.cpython-311.pyc | Bin 0 -> 367 bytes .../__pycache__/hook-gribapi.cpython-311.pyc | Bin 0 -> 2507 bytes .../__pycache__/hook-grpc.cpython-311.pyc | Bin 0 -> 338 bytes .../__pycache__/hook-gst._gst.cpython-311.pyc | Bin 0 -> 1320 bytes .../__pycache__/hook-gtk.cpython-311.pyc | Bin 0 -> 385 bytes .../__pycache__/hook-h3.cpython-311.pyc | Bin 0 -> 435 bytes .../__pycache__/hook-h5py.cpython-311.pyc | Bin 0 -> 353 bytes .../hook-hdf5plugin.cpython-311.pyc | Bin 0 -> 352 bytes .../__pycache__/hook-hexbytes.cpython-311.pyc | Bin 0 -> 454 bytes .../__pycache__/hook-httplib2.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/hook-humanize.cpython-311.pyc | Bin 0 -> 640 bytes .../__pycache__/hook-hydra.cpython-311.pyc | Bin 0 -> 721 bytes .../__pycache__/hook-ijson.cpython-311.pyc | Bin 0 -> 358 bytes .../__pycache__/hook-imageio.cpython-311.pyc | Bin 0 -> 483 bytes .../hook-imageio_ffmpeg.cpython-311.pyc | Bin 0 -> 562 bytes .../__pycache__/hook-iminuit.cpython-311.pyc | Bin 0 -> 550 bytes .../__pycache__/hook-iso639.cpython-311.pyc | Bin 0 -> 344 bytes .../__pycache__/hook-itk.cpython-311.pyc | Bin 0 -> 416 bytes .../hook-jaraco.text.cpython-311.pyc | Bin 0 -> 352 bytes .../__pycache__/hook-jedi.cpython-311.pyc | Bin 0 -> 338 bytes .../__pycache__/hook-jieba.cpython-311.pyc | Bin 0 -> 340 bytes .../__pycache__/hook-jinja2.cpython-311.pyc | Bin 0 -> 242 bytes .../__pycache__/hook-jinxed.cpython-311.pyc | Bin 0 -> 288 bytes .../__pycache__/hook-jira.cpython-311.pyc | Bin 0 -> 491 bytes .../hook-jsonpath_rw_ext.cpython-311.pyc | Bin 0 -> 355 bytes .../hook-jsonrpcserver.cpython-311.pyc | Bin 0 -> 356 bytes .../hook-jsonschema.cpython-311.pyc | Bin 0 -> 429 bytes ...-jsonschema_specifications.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-jupyterlab.cpython-311.pyc | Bin 0 -> 350 bytes .../__pycache__/hook-kaleido.cpython-311.pyc | Bin 0 -> 344 bytes .../hook-khmernltk.cpython-311.pyc | Bin 0 -> 395 bytes .../hook-kinterbasdb.cpython-311.pyc | Bin 0 -> 527 bytes .../hook-langchain.cpython-311.pyc | Bin 0 -> 348 bytes .../hook-langcodes.cpython-311.pyc | Bin 0 -> 348 bytes .../hook-langdetect.cpython-311.pyc | Bin 0 -> 350 bytes .../__pycache__/hook-laonlp.cpython-311.pyc | Bin 0 -> 342 bytes .../__pycache__/hook-lark.cpython-311.pyc | Bin 0 -> 338 bytes .../hook-ldfparser.cpython-311.pyc | Bin 0 -> 348 bytes .../hook-lensfunpy.cpython-311.pyc | Bin 0 -> 650 bytes .../hook-libaudioverse.cpython-311.pyc | Bin 0 -> 449 bytes .../__pycache__/hook-librosa.cpython-311.pyc | Bin 0 -> 480 bytes .../__pycache__/hook-lightgbm.cpython-311.pyc | Bin 0 -> 467 bytes .../hook-lightning.cpython-311.pyc | Bin 0 -> 398 bytes .../__pycache__/hook-limits.cpython-311.pyc | Bin 0 -> 342 bytes .../hook-linear_operator.cpython-311.pyc | Bin 0 -> 255 bytes .../__pycache__/hook-lingua.cpython-311.pyc | Bin 0 -> 342 bytes .../__pycache__/hook-litestar.cpython-311.pyc | Bin 0 -> 363 bytes .../__pycache__/hook-llvmlite.cpython-311.pyc | Bin 0 -> 351 bytes .../__pycache__/hook-logilab.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/hook-lxml.cpython-311.pyc | Bin 0 -> 346 bytes .../hook-lxml.etree.cpython-311.pyc | Bin 0 -> 279 bytes .../hook-lxml.isoschematron.cpython-311.pyc | Bin 0 -> 498 bytes .../hook-lxml.objectify.cpython-311.pyc | Bin 0 -> 250 bytes .../__pycache__/hook-lz4.cpython-311.pyc | Bin 0 -> 330 bytes .../__pycache__/hook-magic.cpython-311.pyc | Bin 0 -> 426 bytes .../hook-mako.codegen.cpython-311.pyc | Bin 0 -> 426 bytes .../__pycache__/hook-mariadb.cpython-311.pyc | Bin 0 -> 512 bytes .../__pycache__/hook-markdown.cpython-311.pyc | Bin 0 -> 606 bytes .../__pycache__/hook-mecab.cpython-311.pyc | Bin 0 -> 404 bytes .../__pycache__/hook-metpy.cpython-311.pyc | Bin 0 -> 424 bytes .../__pycache__/hook-migrate.cpython-311.pyc | Bin 0 -> 473 bytes .../__pycache__/hook-mimesis.cpython-311.pyc | Bin 0 -> 344 bytes ...ook-minecraft_launcher_lib.cpython-311.pyc | Bin 0 -> 375 bytes .../__pycache__/hook-mistune.cpython-311.pyc | Bin 0 -> 474 bytes .../__pycache__/hook-mnemonic.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/hook-monai.cpython-311.pyc | Bin 0 -> 245 bytes .../hook-moviepy.audio.fx.all.cpython-311.pyc | Bin 0 -> 375 bytes .../hook-moviepy.video.fx.all.cpython-311.pyc | Bin 0 -> 375 bytes .../hook-mpl_toolkits.basemap.cpython-311.pyc | Bin 0 -> 1170 bytes .../hook-msoffcrypto.cpython-311.pyc | Bin 0 -> 429 bytes .../__pycache__/hook-nacl.cpython-311.pyc | Bin 0 -> 1054 bytes .../__pycache__/hook-names.cpython-311.pyc | Bin 0 -> 340 bytes .../__pycache__/hook-nanite.cpython-311.pyc | Bin 0 -> 342 bytes .../hook-nbconvert.cpython-311.pyc | Bin 0 -> 429 bytes .../__pycache__/hook-nbdime.cpython-311.pyc | Bin 0 -> 342 bytes .../__pycache__/hook-nbformat.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/hook-nbt.cpython-311.pyc | Bin 0 -> 279 bytes .../__pycache__/hook-ncclient.cpython-311.pyc | Bin 0 -> 616 bytes .../__pycache__/hook-netCDF4.cpython-311.pyc | Bin 0 -> 963 bytes .../__pycache__/hook-nltk.cpython-311.pyc | Bin 0 -> 681 bytes .../__pycache__/hook-nnpy.cpython-311.pyc | Bin 0 -> 310 bytes .../__pycache__/hook-notebook.cpython-311.pyc | Bin 0 -> 1547 bytes .../__pycache__/hook-numba.cpython-311.pyc | Bin 0 -> 515 bytes .../hook-numbers_parser.cpython-311.pyc | Bin 0 -> 361 bytes .../hook-numcodecs.cpython-311.pyc | Bin 0 -> 256 bytes .../hook-nvidia.cublas.cpython-311.pyc | Bin 0 -> 525 bytes .../hook-nvidia.cuda_cupti.cpython-311.pyc | Bin 0 -> 529 bytes .../hook-nvidia.cuda_nvcc.cpython-311.pyc | Bin 0 -> 679 bytes .../hook-nvidia.cuda_nvrtc.cpython-311.pyc | Bin 0 -> 529 bytes .../hook-nvidia.cuda_runtime.cpython-311.pyc | Bin 0 -> 531 bytes .../hook-nvidia.cudnn.cpython-311.pyc | Bin 0 -> 524 bytes .../hook-nvidia.cufft.cpython-311.pyc | Bin 0 -> 524 bytes .../hook-nvidia.curand.cpython-311.pyc | Bin 0 -> 525 bytes .../hook-nvidia.cusolver.cpython-311.pyc | Bin 0 -> 527 bytes .../hook-nvidia.cusparse.cpython-311.pyc | Bin 0 -> 527 bytes .../hook-nvidia.nccl.cpython-311.pyc | Bin 0 -> 523 bytes .../hook-nvidia.nvjitlink.cpython-311.pyc | Bin 0 -> 528 bytes .../hook-nvidia.nvtx.cpython-311.pyc | Bin 0 -> 523 bytes .../hook-office365.cpython-311.pyc | Bin 0 -> 528 bytes .../hook-onnxruntime.cpython-311.pyc | Bin 0 -> 359 bytes .../__pycache__/hook-opencc.cpython-311.pyc | Bin 0 -> 342 bytes .../__pycache__/hook-openpyxl.cpython-311.pyc | Bin 0 -> 346 bytes .../hook-opentelemetry.cpython-311.pyc | Bin 0 -> 1119 bytes .../__pycache__/hook-orjson.cpython-311.pyc | Bin 0 -> 283 bytes .../__pycache__/hook-osgeo.cpython-311.pyc | Bin 0 -> 1985 bytes .../hook-pandas_flavor.cpython-311.pyc | Bin 0 -> 289 bytes .../__pycache__/hook-panel.cpython-311.pyc | Bin 0 -> 445 bytes .../hook-parsedatetime.cpython-311.pyc | Bin 0 -> 675 bytes .../__pycache__/hook-parso.cpython-311.pyc | Bin 0 -> 340 bytes .../__pycache__/hook-passlib.cpython-311.pyc | Bin 0 -> 301 bytes ...-paste.exceptions.reporter.cpython-311.pyc | Bin 0 -> 425 bytes .../__pycache__/hook-patoolib.cpython-311.pyc | Bin 0 -> 487 bytes .../__pycache__/hook-patsy.cpython-311.pyc | Bin 0 -> 246 bytes .../__pycache__/hook-pdfminer.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/hook-pendulum.cpython-311.pyc | Bin 0 -> 477 bytes .../hook-phonenumbers.cpython-311.pyc | Bin 0 -> 362 bytes .../__pycache__/hook-pingouin.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/hook-pint.cpython-311.pyc | Bin 0 -> 417 bytes .../__pycache__/hook-pinyin.cpython-311.pyc | Bin 0 -> 344 bytes .../hook-platformdirs.cpython-311.pyc | Bin 0 -> 655 bytes .../__pycache__/hook-plotly.cpython-311.pyc | Bin 0 -> 555 bytes .../__pycache__/hook-pptx.cpython-311.pyc | Bin 0 -> 349 bytes .../hook-prettytable.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/hook-psutil.cpython-311.pyc | Bin 0 -> 1777 bytes .../__pycache__/hook-psychopy.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/hook-psycopg2.cpython-311.pyc | Bin 0 -> 245 bytes .../hook-publicsuffix2.cpython-311.pyc | Bin 0 -> 356 bytes .../hook-pubsub.core.cpython-311.pyc | Bin 0 -> 429 bytes .../hook-puremagic.cpython-311.pyc | Bin 0 -> 348 bytes .../__pycache__/hook-py.cpython-311.pyc | Bin 0 -> 348 bytes .../__pycache__/hook-pyarrow.cpython-311.pyc | Bin 0 -> 650 bytes .../hook-pycountry.cpython-311.pyc | Bin 0 -> 421 bytes .../hook-pycparser.cpython-311.pyc | Bin 0 -> 276 bytes .../hook-pycrfsuite.cpython-311.pyc | Bin 0 -> 300 bytes .../__pycache__/hook-pydantic.cpython-311.pyc | Bin 0 -> 998 bytes .../__pycache__/hook-pydicom.cpython-311.pyc | Bin 0 -> 1123 bytes .../__pycache__/hook-pydivert.cpython-311.pyc | Bin 0 -> 361 bytes .../hook-pyexcel-io.cpython-311.pyc | Bin 0 -> 246 bytes .../hook-pyexcel-ods.cpython-311.pyc | Bin 0 -> 248 bytes .../hook-pyexcel-ods3.cpython-311.pyc | Bin 0 -> 251 bytes .../hook-pyexcel-odsr.cpython-311.pyc | Bin 0 -> 251 bytes .../hook-pyexcel-xls.cpython-311.pyc | Bin 0 -> 248 bytes .../hook-pyexcel-xlsx.cpython-311.pyc | Bin 0 -> 251 bytes .../hook-pyexcel-xlsxw.cpython-311.pyc | Bin 0 -> 253 bytes .../__pycache__/hook-pyexcel.cpython-311.pyc | Bin 0 -> 907 bytes .../hook-pyexcel_io.cpython-311.pyc | Bin 0 -> 619 bytes .../hook-pyexcel_ods.cpython-311.pyc | Bin 0 -> 313 bytes .../hook-pyexcel_ods3.cpython-311.pyc | Bin 0 -> 297 bytes .../hook-pyexcel_odsr.cpython-311.pyc | Bin 0 -> 275 bytes .../hook-pyexcel_xls.cpython-311.pyc | Bin 0 -> 293 bytes .../hook-pyexcel_xlsx.cpython-311.pyc | Bin 0 -> 299 bytes .../hook-pyexcel_xlsxw.cpython-311.pyc | Bin 0 -> 279 bytes .../hook-pyexcelerate.Writer.cpython-311.pyc | Bin 0 -> 361 bytes .../hook-pygraphviz.cpython-311.pyc | Bin 0 -> 2302 bytes .../hook-pygwalker.cpython-311.pyc | Bin 0 -> 348 bytes .../hook-pylibmagic.cpython-311.pyc | Bin 0 -> 488 bytes .../__pycache__/hook-pylint.cpython-311.pyc | Bin 0 -> 969 bytes .../__pycache__/hook-pylsl.cpython-311.pyc | Bin 0 -> 1233 bytes .../hook-pymediainfo.cpython-311.pyc | Bin 0 -> 1669 bytes .../hook-pymorphy3.cpython-311.pyc | Bin 0 -> 706 bytes .../__pycache__/hook-pymssql.cpython-311.pyc | Bin 0 -> 479 bytes .../__pycache__/hook-pynput.cpython-311.pyc | Bin 0 -> 350 bytes .../__pycache__/hook-pyodbc.cpython-311.pyc | Bin 0 -> 357 bytes .../__pycache__/hook-pyopencl.cpython-311.pyc | Bin 0 -> 426 bytes .../hook-pypemicro.cpython-311.pyc | Bin 0 -> 1921 bytes .../__pycache__/hook-pyphen.cpython-311.pyc | Bin 0 -> 342 bytes .../hook-pyppeteer.cpython-311.pyc | Bin 0 -> 344 bytes .../__pycache__/hook-pyproj.cpython-311.pyc | Bin 0 -> 2229 bytes .../__pycache__/hook-pypsexec.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/hook-pypylon.cpython-311.pyc | Bin 0 -> 1119 bytes .../hook-pyqtgraph.cpython-311.pyc | Bin 0 -> 1226 bytes .../__pycache__/hook-pyshark.cpython-311.pyc | Bin 0 -> 688 bytes .../__pycache__/hook-pysnmp.cpython-311.pyc | Bin 0 -> 472 bytes .../__pycache__/hook-pystray.cpython-311.pyc | Bin 0 -> 354 bytes .../__pycache__/hook-pytest.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-pythainlp.cpython-311.pyc | Bin 0 -> 348 bytes .../hook-pythoncom.cpython-311.pyc | Bin 0 -> 705 bytes .../__pycache__/hook-pyttsx.cpython-311.pyc | Bin 0 -> 469 bytes .../__pycache__/hook-pyttsx3.cpython-311.pyc | Bin 0 -> 587 bytes .../hook-pyviz_comms.cpython-311.pyc | Bin 0 -> 352 bytes .../__pycache__/hook-pyvjoy.cpython-311.pyc | Bin 0 -> 347 bytes .../hook-pywintypes.cpython-311.pyc | Bin 0 -> 707 bytes .../__pycache__/hook-pywt.cpython-311.pyc | Bin 0 -> 252 bytes .../__pycache__/hook-qtmodern.cpython-311.pyc | Bin 0 -> 381 bytes .../__pycache__/hook-radicale.cpython-311.pyc | Bin 0 -> 426 bytes .../__pycache__/hook-raven.cpython-311.pyc | Bin 0 -> 267 bytes .../__pycache__/hook-rawpy.cpython-311.pyc | Bin 0 -> 247 bytes .../__pycache__/hook-rdflib.cpython-311.pyc | Bin 0 -> 359 bytes .../__pycache__/hook-redmine.cpython-311.pyc | Bin 0 -> 251 bytes .../__pycache__/hook-regex.cpython-311.pyc | Bin 0 -> 239 bytes .../hook-reportlab.lib.utils.cpython-311.pyc | Bin 0 -> 269 bytes ...eportlab.pdfbase._fontdata.cpython-311.pyc | Bin 0 -> 585 bytes .../__pycache__/hook-resampy.cpython-311.pyc | Bin 0 -> 351 bytes .../__pycache__/hook-rlp.cpython-311.pyc | Bin 0 -> 438 bytes .../__pycache__/hook-rpy2.cpython-311.pyc | Bin 0 -> 301 bytes .../__pycache__/hook-rtree.cpython-311.pyc | Bin 0 -> 1400 bytes .../__pycache__/hook-rubicon.cpython-311.pyc | Bin 0 -> 250 bytes .../hook-sacremoses.cpython-311.pyc | Bin 0 -> 350 bytes .../__pycache__/hook-saml2.cpython-311.pyc | Bin 0 -> 578 bytes .../__pycache__/hook-schwifty.cpython-311.pyc | Bin 0 -> 426 bytes .../__pycache__/hook-seedir.cpython-311.pyc | Bin 0 -> 342 bytes .../__pycache__/hook-selenium.cpython-311.pyc | Bin 0 -> 346 bytes .../hook-sentry_sdk.cpython-311.pyc | Bin 0 -> 1368 bytes .../hook-setuptools_scm.cpython-311.pyc | Bin 0 -> 350 bytes .../__pycache__/hook-shapely.cpython-311.pyc | Bin 0 -> 4211 bytes .../hook-shotgun_api3.cpython-311.pyc | Bin 0 -> 414 bytes .../hook-simplemma.cpython-311.pyc | Bin 0 -> 348 bytes .../hook-skimage.color.cpython-311.pyc | Bin 0 -> 752 bytes .../__pycache__/hook-skimage.cpython-311.pyc | Bin 0 -> 495 bytes .../hook-skimage.data.cpython-311.pyc | Bin 0 -> 749 bytes .../hook-skimage.draw.cpython-311.pyc | Bin 0 -> 749 bytes .../hook-skimage.exposure.cpython-311.pyc | Bin 0 -> 763 bytes .../hook-skimage.feature.cpython-311.pyc | Bin 0 -> 928 bytes .../hook-skimage.filters.cpython-311.pyc | Bin 0 -> 961 bytes .../hook-skimage.future.cpython-311.pyc | Bin 0 -> 757 bytes .../hook-skimage.graph.cpython-311.pyc | Bin 0 -> 788 bytes .../hook-skimage.io.cpython-311.pyc | Bin 0 -> 450 bytes .../hook-skimage.measure.cpython-311.pyc | Bin 0 -> 760 bytes .../hook-skimage.metrics.cpython-311.pyc | Bin 0 -> 760 bytes .../hook-skimage.morphology.cpython-311.pyc | Bin 0 -> 519 bytes .../hook-skimage.registration.cpython-311.pyc | Bin 0 -> 776 bytes .../hook-skimage.restoration.cpython-311.pyc | Bin 0 -> 773 bytes .../hook-skimage.transform.cpython-311.pyc | Bin 0 -> 908 bytes .../hook-sklearn.cluster.cpython-311.pyc | Bin 0 -> 423 bytes .../__pycache__/hook-sklearn.cpython-311.pyc | Bin 0 -> 344 bytes .../hook-sklearn.linear_model.cpython-311.pyc | Bin 0 -> 443 bytes ...ok-sklearn.metrics.cluster.cpython-311.pyc | Bin 0 -> 513 bytes .../hook-sklearn.metrics.cpython-311.pyc | Bin 0 -> 663 bytes ...k-sklearn.metrics.pairwise.cpython-311.pyc | Bin 0 -> 506 bytes .../hook-sklearn.neighbors.cpython-311.pyc | Bin 0 -> 877 bytes .../hook-sklearn.tree.cpython-311.pyc | Bin 0 -> 258 bytes .../hook-sklearn.utils.cpython-311.pyc | Bin 0 -> 266 bytes .../__pycache__/hook-skyfield.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/hook-slixmpp.cpython-311.pyc | Bin 0 -> 362 bytes .../hook-sound_lib.cpython-311.pyc | Bin 0 -> 426 bytes .../hook-sounddevice.cpython-311.pyc | Bin 0 -> 2377 bytes .../hook-soundfile.cpython-311.pyc | Bin 0 -> 2310 bytes .../__pycache__/hook-spacy.cpython-311.pyc | Bin 0 -> 530 bytes .../hook-speech_recognition.cpython-311.pyc | Bin 0 -> 367 bytes .../__pycache__/hook-spiceypy.cpython-311.pyc | Bin 0 -> 351 bytes .../__pycache__/hook-spnego.cpython-311.pyc | Bin 0 -> 350 bytes ...hook-srsly.msgpack._packer.cpython-311.pyc | Bin 0 -> 420 bytes .../hook-sspilib.raw.cpython-311.pyc | Bin 0 -> 402 bytes ...statsmodels.tsa.statespace.cpython-311.pyc | Bin 0 -> 484 bytes .../__pycache__/hook-stdnum.cpython-311.pyc | Bin 0 -> 342 bytes .../hook-storm.database.cpython-311.pyc | Bin 0 -> 369 bytes .../hook-sudachipy.cpython-311.pyc | Bin 0 -> 799 bytes .../__pycache__/hook-sunpy.cpython-311.pyc | Bin 0 -> 802 bytes .../__pycache__/hook-sv_ttk.cpython-311.pyc | Bin 0 -> 360 bytes ...ook-swagger_spec_validator.cpython-311.pyc | Bin 0 -> 375 bytes .../__pycache__/hook-sympy.cpython-311.pyc | Bin 0 -> 699 bytes .../hook-tableauhyperapi.cpython-311.pyc | Bin 0 -> 366 bytes .../__pycache__/hook-tables.cpython-311.pyc | Bin 0 -> 872 bytes .../__pycache__/hook-tcod.cpython-311.pyc | Bin 0 -> 486 bytes .../hook-tensorflow.cpython-311.pyc | Bin 0 -> 5867 bytes .../hook-text_unidecode.cpython-311.pyc | Bin 0 -> 729 bytes .../hook-textdistance.cpython-311.pyc | Bin 0 -> 386 bytes ...k-thinc.backends.numpy_ops.cpython-311.pyc | Bin 0 -> 450 bytes .../__pycache__/hook-thinc.cpython-311.pyc | Bin 0 -> 553 bytes .../hook-timezonefinder.cpython-311.pyc | Bin 0 -> 359 bytes .../__pycache__/hook-timm.cpython-311.pyc | Bin 0 -> 244 bytes .../__pycache__/hook-tinycss2.cpython-311.pyc | Bin 0 -> 681 bytes .../__pycache__/hook-toga.cpython-311.pyc | Bin 0 -> 723 bytes .../hook-toga_cocoa.cpython-311.pyc | Bin 0 -> 445 bytes .../__pycache__/hook-toga_gtk.cpython-311.pyc | Bin 0 -> 439 bytes .../hook-toga_winforms.cpython-311.pyc | Bin 0 -> 1015 bytes .../__pycache__/hook-torch.cpython-311.pyc | Bin 0 -> 6495 bytes .../hook-torchaudio.cpython-311.pyc | Bin 0 -> 509 bytes .../hook-torchtext.cpython-311.pyc | Bin 0 -> 505 bytes .../hook-torchvision.cpython-311.pyc | Bin 0 -> 298 bytes .../hook-torchvision.io.image.cpython-311.pyc | Bin 0 -> 264 bytes .../__pycache__/hook-trame.cpython-311.pyc | Bin 0 -> 238 bytes .../hook-trame_client.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-trame_code.cpython-311.pyc | Bin 0 -> 387 bytes .../hook-trame_components.cpython-311.pyc | Bin 0 -> 390 bytes .../hook-trame_datagrid.cpython-311.pyc | Bin 0 -> 386 bytes .../hook-trame_deckgl.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-trame_formkit.cpython-311.pyc | Bin 0 -> 393 bytes .../hook-trame_grid.cpython-311.pyc | Bin 0 -> 387 bytes .../hook-trame_iframe.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-trame_keycloak.cpython-311.pyc | Bin 0 -> 386 bytes .../hook-trame_leaflet.cpython-311.pyc | Bin 0 -> 393 bytes .../hook-trame_markdown.cpython-311.pyc | Bin 0 -> 396 bytes .../hook-trame_matplotlib.cpython-311.pyc | Bin 0 -> 400 bytes .../hook-trame_mesh_streamer.cpython-311.pyc | Bin 0 -> 429 bytes .../hook-trame_plotly.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-trame_pvui.cpython-311.pyc | Bin 0 -> 377 bytes .../hook-trame_quasar.cpython-311.pyc | Bin 0 -> 391 bytes .../hook-trame_rca.cpython-311.pyc | Bin 0 -> 375 bytes .../hook-trame_router.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-trame_simput.cpython-311.pyc | Bin 0 -> 381 bytes .../hook-trame_tauri.cpython-311.pyc | Bin 0 -> 379 bytes .../hook-trame_tweakpane.cpython-311.pyc | Bin 0 -> 398 bytes .../hook-trame_vega.cpython-311.pyc | Bin 0 -> 377 bytes .../hook-trame_vtk.cpython-311.pyc | Bin 0 -> 447 bytes .../hook-trame_vtk3d.cpython-311.pyc | Bin 0 -> 379 bytes .../hook-trame_vtklocal.cpython-311.pyc | Bin 0 -> 419 bytes .../hook-trame_vuetify.cpython-311.pyc | Bin 0 -> 383 bytes .../hook-trame_xterm.cpython-311.pyc | Bin 0 -> 379 bytes .../hook-transformers.cpython-311.pyc | Bin 0 -> 1172 bytes .../hook-travertino.cpython-311.pyc | Bin 0 -> 253 bytes .../__pycache__/hook-trimesh.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/hook-triton.cpython-311.pyc | Bin 0 -> 596 bytes .../hook-ttkthemes.cpython-311.pyc | Bin 0 -> 1676 bytes .../hook-ttkwidgets.cpython-311.pyc | Bin 0 -> 1141 bytes .../__pycache__/hook-tzdata.cpython-311.pyc | Bin 0 -> 435 bytes .../__pycache__/hook-tzwhere.cpython-311.pyc | Bin 0 -> 344 bytes .../__pycache__/hook-u1db.cpython-311.pyc | Bin 0 -> 723 bytes .../hook-ultralytics.cpython-311.pyc | Bin 0 -> 400 bytes .../__pycache__/hook-umap.cpython-311.pyc | Bin 0 -> 338 bytes .../hook-unidecode.cpython-311.pyc | Bin 0 -> 358 bytes .../__pycache__/hook-uniseg.cpython-311.pyc | Bin 0 -> 342 bytes .../__pycache__/hook-usb.cpython-311.pyc | Bin 0 -> 2624 bytes .../__pycache__/hook-uvicorn.cpython-311.pyc | Bin 0 -> 352 bytes .../__pycache__/hook-uvloop.cpython-311.pyc | Bin 0 -> 350 bytes .../hook-vaderSentiment.cpython-311.pyc | Bin 0 -> 359 bytes .../hook-vtkpython.cpython-311.pyc | Bin 0 -> 707 bytes .../__pycache__/hook-wavefile.cpython-311.pyc | Bin 0 -> 437 bytes .../hook-weasyprint.cpython-311.pyc | Bin 0 -> 3086 bytes .../__pycache__/hook-web3.cpython-311.pyc | Bin 0 -> 332 bytes .../hook-webassets.cpython-311.pyc | Bin 0 -> 378 bytes .../hook-webrtcvad.cpython-311.pyc | Bin 0 -> 342 bytes .../hook-websockets.cpython-311.pyc | Bin 0 -> 360 bytes .../__pycache__/hook-webview.cpython-311.pyc | Bin 0 -> 545 bytes .../__pycache__/hook-win32com.cpython-311.pyc | Bin 0 -> 284 bytes .../hook-wordcloud.cpython-311.pyc | Bin 0 -> 348 bytes .../__pycache__/hook-workflow.cpython-311.pyc | Bin 0 -> 340 bytes .../hook-wx.lib.activex.cpython-311.pyc | Bin 0 -> 359 bytes .../hook-wx.lib.pubsub.cpython-311.pyc | Bin 0 -> 433 bytes .../__pycache__/hook-wx.xrc.cpython-311.pyc | Bin 0 -> 248 bytes .../__pycache__/hook-xarray.cpython-311.pyc | Bin 0 -> 673 bytes ...-xml.dom.html.HTMLDocument.cpython-311.pyc | Bin 0 -> 1932 bytes .../hook-xml.sax.saxexts.cpython-311.pyc | Bin 0 -> 574 bytes .../__pycache__/hook-xmldiff.cpython-311.pyc | Bin 0 -> 338 bytes .../hook-xmlschema.cpython-311.pyc | Bin 0 -> 350 bytes .../__pycache__/hook-xsge_gui.cpython-311.pyc | Bin 0 -> 346 bytes .../hook-xyzservices.cpython-311.pyc | Bin 0 -> 352 bytes .../hook-yapf_third_party.cpython-311.pyc | Bin 0 -> 363 bytes .../__pycache__/hook-z3c.rml.cpython-311.pyc | Bin 0 -> 466 bytes .../__pycache__/hook-zeep.cpython-311.pyc | Bin 0 -> 332 bytes .../__pycache__/hook-zmq.cpython-311.pyc | Bin 0 -> 1941 bytes .../__pycache__/hook-zoneinfo.cpython-311.pyc | Bin 0 -> 338 bytes .../stdhooks/hook-BTrees.py | 17 + .../stdhooks/hook-CTkMessagebox.py | 17 + .../stdhooks/hook-Crypto.py | 62 + .../stdhooks/hook-Cryptodome.py | 44 + .../stdhooks/hook-HtmlTestRunner.py | 17 + .../stdhooks/hook-IPython.py | 42 + .../stdhooks/hook-OpenGL.py | 65 + .../stdhooks/hook-OpenGL_accelerate.py | 22 + .../stdhooks/hook-PyTaskbar.py | 14 + .../stdhooks/hook-Xlib.py | 15 + .../stdhooks/hook-_mssql.py | 13 + .../stdhooks/hook-_mysql.py | 16 + .../stdhooks/hook-accessible_output2.py | 18 + .../stdhooks/hook-adbutils.py | 23 + .../stdhooks/hook-adios.py | 16 + .../stdhooks/hook-afmformats.py | 17 + .../stdhooks/hook-aliyunsdkcore.py | 14 + .../stdhooks/hook-altair.py | 15 + .../stdhooks/hook-amazonproduct.py | 26 + .../stdhooks/hook-anyio.py | 19 + .../stdhooks/hook-appdirs.py | 21 + .../stdhooks/hook-appy.pod.py | 17 + .../stdhooks/hook-apscheduler.py | 27 + .../stdhooks/hook-argon2.py | 13 + .../stdhooks/hook-astor.py | 15 + .../stdhooks/hook-astroid.py | 48 + .../stdhooks/hook-astropy.py | 42 + .../stdhooks/hook-astropy_iers_data.py | 16 + .../stdhooks/hook-av.py | 44 + .../stdhooks/hook-avro.py | 27 + .../stdhooks/hook-azurerm.py | 22 + .../stdhooks/hook-backports.py | 20 + .../stdhooks/hook-backports.zoneinfo.py | 18 + .../stdhooks/hook-bacon.py | 50 + .../stdhooks/hook-bcrypt.py | 16 + .../stdhooks/hook-bitsandbytes.py | 23 + .../stdhooks/hook-bleak.py | 19 + .../stdhooks/hook-blspy.py | 35 + .../stdhooks/hook-bokeh.py | 27 + .../stdhooks/hook-boto.py | 25 + .../stdhooks/hook-boto3.py | 29 + .../stdhooks/hook-botocore.py | 30 + .../stdhooks/hook-branca.py | 15 + .../stdhooks/hook-cairocffi.py | 45 + .../stdhooks/hook-cairosvg.py | 40 + .../stdhooks/hook-capstone.py | 15 + .../stdhooks/hook-cassandra.py | 22 + .../stdhooks/hook-celpy.py | 24 + .../stdhooks/hook-certifi.py | 21 + .../stdhooks/hook-cf_units.py | 16 + .../stdhooks/hook-cftime.py | 21 + .../stdhooks/hook-charset_normalizer.py | 16 + .../stdhooks/hook-cloudpickle.py | 18 + .../stdhooks/hook-cloudscraper.py | 15 + .../stdhooks/hook-clr.py | 60 + .../stdhooks/hook-clr_loader.py | 22 + .../stdhooks/hook-cmocean.py | 15 + .../stdhooks/hook-compliance_checker.py | 22 + .../stdhooks/hook-comtypes.client.py | 22 + .../stdhooks/hook-countrycode.py | 15 + .../stdhooks/hook-countryinfo.py | 15 + .../stdhooks/hook-cryptography.py | 125 + .../stdhooks/hook-customtkinter.py | 14 + .../stdhooks/hook-cv2.py | 168 + .../stdhooks/hook-cx_Oracle.py | 13 + .../stdhooks/hook-cytoolz.itertoolz.py | 16 + .../stdhooks/hook-dash.py | 15 + .../hook-dash_bootstrap_components.py | 15 + .../stdhooks/hook-dash_core_components.py | 15 + .../stdhooks/hook-dash_html_components.py | 15 + .../stdhooks/hook-dash_renderer.py | 15 + .../stdhooks/hook-dash_table.py | 15 + .../stdhooks/hook-dash_uploader.py | 15 + .../stdhooks/hook-dask.py | 18 + .../stdhooks/hook-datasets.py | 14 + .../hook-dateparser.utils.strptime.py | 17 + .../stdhooks/hook-dbus_fast.py | 16 + .../stdhooks/hook-dclab.py | 17 + .../stdhooks/hook-detectron2.py | 14 + .../stdhooks/hook-discid.py | 40 + .../stdhooks/hook-distorm3.py | 19 + .../stdhooks/hook-dns.rdata.py | 17 + .../stdhooks/hook-docutils.py | 19 + .../stdhooks/hook-docx.py | 15 + .../stdhooks/hook-docx2pdf.py | 18 + .../stdhooks/hook-dynaconf.py | 15 + .../stdhooks/hook-easyocr.py | 18 + .../stdhooks/hook-eel.py | 16 + .../stdhooks/hook-enchant.py | 65 + .../stdhooks/hook-eng_to_ipa.py | 15 + .../stdhooks/hook-ens.py | 15 + .../stdhooks/hook-enzyme.parsers.ebml.core.py | 25 + .../stdhooks/hook-eth_abi.py | 15 + .../stdhooks/hook-eth_account.py | 15 + .../stdhooks/hook-eth_hash.py | 20 + .../stdhooks/hook-eth_keyfile.py | 15 + .../stdhooks/hook-eth_keys.py | 17 + .../stdhooks/hook-eth_rlp.py | 17 + .../stdhooks/hook-eth_typing.py | 16 + .../stdhooks/hook-eth_utils.network.py | 15 + .../stdhooks/hook-eth_utils.py | 15 + .../stdhooks/hook-exchangelib.py | 12 + .../stdhooks/hook-fabric.py | 22 + .../stdhooks/hook-fairscale.py | 14 + .../stdhooks/hook-faker.py | 19 + .../stdhooks/hook-falcon.py | 41 + .../stdhooks/hook-fastai.py | 14 + .../stdhooks/hook-fastparquet.py | 32 + .../stdhooks/hook-ffpyplayer.py | 19 + .../stdhooks/hook-fiona.py | 26 + .../stdhooks/hook-flask_compress.py | 15 + .../stdhooks/hook-flask_restx.py | 14 + .../stdhooks/hook-flex.py | 17 + .../stdhooks/hook-flirpy.py | 19 + .../stdhooks/hook-fmpy.py | 25 + .../stdhooks/hook-folium.py | 16 + .../stdhooks/hook-freetype.py | 16 + .../stdhooks/hook-fvcore.nn.py | 14 + .../stdhooks/hook-gadfly.py | 13 + .../stdhooks/hook-gbulb.py | 14 + .../stdhooks/hook-gcloud.py | 21 + .../stdhooks/hook-geopandas.py | 15 + .../stdhooks/hook-gitlab.py | 22 + .../stdhooks/hook-gmplot.py | 15 + .../stdhooks/hook-gmsh.py | 28 + .../stdhooks/hook-gooey.py | 18 + .../stdhooks/hook-google.api_core.py | 15 + .../stdhooks/hook-google.cloud.bigquery.py | 16 + .../stdhooks/hook-google.cloud.core.py | 15 + .../stdhooks/hook-google.cloud.kms_v1.py | 19 + .../stdhooks/hook-google.cloud.pubsub_v1.py | 15 + .../stdhooks/hook-google.cloud.speech.py | 15 + .../stdhooks/hook-google.cloud.storage.py | 15 + .../stdhooks/hook-google.cloud.translate.py | 15 + .../stdhooks/hook-googleapiclient.model.py | 20 + .../stdhooks/hook-grapheme.py | 15 + .../stdhooks/hook-graphql_query.py | 18 + .../stdhooks/hook-great_expectations.py | 15 + .../stdhooks/hook-gribapi.py | 83 + .../stdhooks/hook-grpc.py | 15 + .../stdhooks/hook-gst._gst.py | 45 + .../stdhooks/hook-gtk.py | 16 + .../stdhooks/hook-h3.py | 17 + .../stdhooks/hook-h5py.py | 16 + .../stdhooks/hook-hdf5plugin.py | 17 + .../stdhooks/hook-hexbytes.py | 17 + .../stdhooks/hook-httplib2.py | 17 + .../stdhooks/hook-humanize.py | 23 + .../stdhooks/hook-hydra.py | 36 + .../stdhooks/hook-ijson.py | 15 + .../stdhooks/hook-imageio.py | 21 + .../stdhooks/hook-imageio_ffmpeg.py | 22 + .../stdhooks/hook-iminuit.py | 25 + .../stdhooks/hook-iso639.py | 16 + .../stdhooks/hook-itk.py | 21 + .../stdhooks/hook-jaraco.text.py | 17 + .../stdhooks/hook-jedi.py | 17 + .../stdhooks/hook-jieba.py | 15 + .../stdhooks/hook-jinja2.py | 13 + .../stdhooks/hook-jinxed.py | 15 + .../stdhooks/hook-jira.py | 19 + .../stdhooks/hook-jsonpath_rw_ext.py | 15 + .../stdhooks/hook-jsonrpcserver.py | 18 + .../stdhooks/hook-jsonschema.py | 20 + .../hook-jsonschema_specifications.py | 14 + .../stdhooks/hook-jupyterlab.py | 15 + .../stdhooks/hook-kaleido.py | 15 + .../stdhooks/hook-khmernltk.py | 16 + .../stdhooks/hook-kinterbasdb.py | 19 + .../stdhooks/hook-langchain.py | 15 + .../stdhooks/hook-langcodes.py | 15 + .../stdhooks/hook-langdetect.py | 15 + .../stdhooks/hook-laonlp.py | 15 + .../stdhooks/hook-lark.py | 15 + .../stdhooks/hook-ldfparser.py | 15 + .../stdhooks/hook-lensfunpy.py | 16 + .../stdhooks/hook-libaudioverse.py | 18 + .../stdhooks/hook-librosa.py | 25 + .../stdhooks/hook-lightgbm.py | 27 + .../stdhooks/hook-lightning.py | 21 + .../stdhooks/hook-limits.py | 15 + .../stdhooks/hook-linear_operator.py | 14 + .../stdhooks/hook-lingua.py | 15 + .../stdhooks/hook-litestar.py | 14 + .../stdhooks/hook-llvmlite.py | 21 + .../stdhooks/hook-logilab.py | 26 + .../stdhooks/hook-lxml.etree.py | 13 + .../stdhooks/hook-lxml.isoschematron.py | 17 + .../stdhooks/hook-lxml.objectify.py | 13 + .../stdhooks/hook-lxml.py | 20 + .../stdhooks/hook-lz4.py | 16 + .../stdhooks/hook-magic.py | 18 + .../stdhooks/hook-mako.codegen.py | 17 + .../stdhooks/hook-mariadb.py | 25 + .../stdhooks/hook-markdown.py | 28 + .../stdhooks/hook-mecab.py | 16 + .../stdhooks/hook-metpy.py | 21 + .../stdhooks/hook-migrate.py | 19 + .../stdhooks/hook-mimesis.py | 17 + .../stdhooks/hook-minecraft_launcher_lib.py | 14 + .../stdhooks/hook-mistune.py | 19 + .../stdhooks/hook-mnemonic.py | 15 + .../stdhooks/hook-monai.py | 14 + .../stdhooks/hook-moviepy.audio.fx.all.py | 17 + .../stdhooks/hook-moviepy.video.fx.all.py | 17 + .../stdhooks/hook-mpl_toolkits.basemap.py | 36 + .../stdhooks/hook-msoffcrypto.py | 18 + .../stdhooks/hook-nacl.py | 30 + .../stdhooks/hook-names.py | 18 + .../stdhooks/hook-nanite.py | 17 + .../stdhooks/hook-nbconvert.py | 18 + .../stdhooks/hook-nbdime.py | 15 + .../stdhooks/hook-nbformat.py | 15 + .../stdhooks/hook-nbt.py | 12 + .../stdhooks/hook-ncclient.py | 23 + .../stdhooks/hook-netCDF4.py | 37 + .../stdhooks/hook-nltk.py | 27 + .../stdhooks/hook-nnpy.py | 16 + .../stdhooks/hook-notebook.py | 27 + .../stdhooks/hook-numba.py | 27 + .../stdhooks/hook-numbers_parser.py | 16 + .../stdhooks/hook-numcodecs.py | 14 + .../stdhooks/hook-nvidia.cublas.py | 19 + .../stdhooks/hook-nvidia.cuda_cupti.py | 19 + .../stdhooks/hook-nvidia.cuda_nvcc.py | 30 + .../stdhooks/hook-nvidia.cuda_nvrtc.py | 19 + .../stdhooks/hook-nvidia.cuda_runtime.py | 19 + .../stdhooks/hook-nvidia.cudnn.py | 19 + .../stdhooks/hook-nvidia.cufft.py | 19 + .../stdhooks/hook-nvidia.curand.py | 19 + .../stdhooks/hook-nvidia.cusolver.py | 19 + .../stdhooks/hook-nvidia.cusparse.py | 19 + .../stdhooks/hook-nvidia.nccl.py | 19 + .../stdhooks/hook-nvidia.nvjitlink.py | 19 + .../stdhooks/hook-nvidia.nvtx.py | 19 + .../stdhooks/hook-office365.py | 19 + .../stdhooks/hook-onnxruntime.py | 16 + .../stdhooks/hook-opencc.py | 15 + .../stdhooks/hook-openpyxl.py | 18 + .../stdhooks/hook-opentelemetry.py | 41 + .../stdhooks/hook-orjson.py | 21 + .../stdhooks/hook-osgeo.py | 81 + .../stdhooks/hook-pandas_flavor.py | 15 + .../stdhooks/hook-panel.py | 18 + .../stdhooks/hook-parsedatetime.py | 29 + .../stdhooks/hook-parso.py | 17 + .../stdhooks/hook-passlib.py | 21 + .../hook-paste.exceptions.reporter.py | 17 + .../stdhooks/hook-patoolib.py | 19 + .../stdhooks/hook-patsy.py | 13 + .../stdhooks/hook-pdfminer.py | 15 + .../stdhooks/hook-pendulum.py | 19 + .../stdhooks/hook-phonenumbers.py | 19 + .../stdhooks/hook-pingouin.py | 15 + .../stdhooks/hook-pint.py | 16 + .../stdhooks/hook-pinyin.py | 20 + .../stdhooks/hook-platformdirs.py | 27 + .../stdhooks/hook-plotly.py | 17 + .../stdhooks/hook-pptx.py | 15 + .../stdhooks/hook-prettytable.py | 15 + .../stdhooks/hook-psutil.py | 50 + .../stdhooks/hook-psychopy.py | 17 + .../stdhooks/hook-psycopg2.py | 13 + .../stdhooks/hook-publicsuffix2.py | 15 + .../stdhooks/hook-pubsub.core.py | 15 + .../stdhooks/hook-puremagic.py | 15 + .../stdhooks/hook-py.py | 15 + .../stdhooks/hook-pyarrow.py | 19 + .../stdhooks/hook-pycountry.py | 18 + .../stdhooks/hook-pycparser.py | 23 + .../stdhooks/hook-pycrfsuite.py | 13 + .../stdhooks/hook-pydantic.py | 48 + .../stdhooks/hook-pydicom.py | 69 + .../stdhooks/hook-pydivert.py | 15 + .../stdhooks/hook-pyexcel-io.py | 16 + .../stdhooks/hook-pyexcel-ods.py | 16 + .../stdhooks/hook-pyexcel-ods3.py | 16 + .../stdhooks/hook-pyexcel-odsr.py | 16 + .../stdhooks/hook-pyexcel-xls.py | 16 + .../stdhooks/hook-pyexcel-xlsx.py | 16 + .../stdhooks/hook-pyexcel-xlsxw.py | 16 + .../stdhooks/hook-pyexcel.py | 29 + .../stdhooks/hook-pyexcel_io.py | 26 + .../stdhooks/hook-pyexcel_ods.py | 16 + .../stdhooks/hook-pyexcel_ods3.py | 16 + .../stdhooks/hook-pyexcel_odsr.py | 16 + .../stdhooks/hook-pyexcel_xls.py | 16 + .../stdhooks/hook-pyexcel_xlsx.py | 16 + .../stdhooks/hook-pyexcel_xlsxw.py | 16 + .../stdhooks/hook-pyexcelerate.Writer.py | 15 + .../stdhooks/hook-pygraphviz.py | 66 + .../stdhooks/hook-pygwalker.py | 15 + .../stdhooks/hook-pylibmagic.py | 18 + .../stdhooks/hook-pylint.py | 75 + .../stdhooks/hook-pylsl.py | 41 + .../stdhooks/hook-pymediainfo.py | 44 + .../stdhooks/hook-pymorphy3.py | 25 + .../stdhooks/hook-pymssql.py | 20 + .../stdhooks/hook-pynput.py | 15 + .../stdhooks/hook-pyodbc.py | 19 + .../stdhooks/hook-pyopencl.py | 18 + .../stdhooks/hook-pypemicro.py | 43 + .../stdhooks/hook-pyphen.py | 15 + .../stdhooks/hook-pyppeteer.py | 16 + .../stdhooks/hook-pyproj.py | 72 + .../stdhooks/hook-pypsexec.py | 18 + .../stdhooks/hook-pypylon.py | 48 + .../stdhooks/hook-pyqtgraph.py | 56 + .../stdhooks/hook-pyshark.py | 25 + .../stdhooks/hook-pysnmp.py | 16 + .../stdhooks/hook-pystray.py | 16 + .../stdhooks/hook-pytest.py | 18 + .../stdhooks/hook-pythainlp.py | 15 + .../stdhooks/hook-pythoncom.py | 31 + .../stdhooks/hook-pyttsx.py | 23 + .../stdhooks/hook-pyttsx3.py | 30 + .../stdhooks/hook-pyviz_comms.py | 15 + .../stdhooks/hook-pyvjoy.py | 14 + .../stdhooks/hook-pywintypes.py | 31 + .../stdhooks/hook-pywt.py | 21 + .../stdhooks/hook-qtmodern.py | 15 + .../stdhooks/hook-radicale.py | 16 + .../stdhooks/hook-raven.py | 13 + .../stdhooks/hook-rawpy.py | 16 + .../stdhooks/hook-rdflib.py | 15 + .../stdhooks/hook-redmine.py | 13 + .../stdhooks/hook-regex.py | 13 + .../stdhooks/hook-reportlab.lib.utils.py | 16 + .../hook-reportlab.pdfbase._fontdata.py | 18 + .../stdhooks/hook-resampy.py | 17 + .../stdhooks/hook-rlp.py | 17 + .../stdhooks/hook-rpy2.py | 18 + .../stdhooks/hook-rtree.py | 40 + .../stdhooks/hook-rubicon.py | 14 + .../stdhooks/hook-sacremoses.py | 15 + .../stdhooks/hook-saml2.py | 25 + .../stdhooks/hook-schwifty.py | 16 + .../stdhooks/hook-seedir.py | 15 + .../stdhooks/hook-selenium.py | 15 + .../stdhooks/hook-sentry_sdk.py | 40 + .../stdhooks/hook-setuptools_scm.py | 17 + .../stdhooks/hook-shapely.py | 105 + .../stdhooks/hook-shotgun_api3.py | 23 + .../stdhooks/hook-simplemma.py | 15 + .../stdhooks/hook-skimage.color.py | 19 + .../stdhooks/hook-skimage.data.py | 19 + .../stdhooks/hook-skimage.draw.py | 19 + .../stdhooks/hook-skimage.exposure.py | 19 + .../stdhooks/hook-skimage.feature.py | 26 + .../stdhooks/hook-skimage.filters.py | 24 + .../stdhooks/hook-skimage.future.py | 19 + .../stdhooks/hook-skimage.graph.py | 22 + .../stdhooks/hook-skimage.io.py | 19 + .../stdhooks/hook-skimage.measure.py | 19 + .../stdhooks/hook-skimage.metrics.py | 19 + .../stdhooks/hook-skimage.morphology.py | 17 + .../stdhooks/hook-skimage.py | 17 + .../stdhooks/hook-skimage.registration.py | 19 + .../stdhooks/hook-skimage.restoration.py | 19 + .../stdhooks/hook-skimage.transform.py | 24 + .../stdhooks/hook-sklearn.cluster.py | 18 + .../stdhooks/hook-sklearn.linear_model.py | 18 + .../stdhooks/hook-sklearn.metrics.cluster.py | 27 + .../stdhooks/hook-sklearn.metrics.pairwise.py | 21 + .../stdhooks/hook-sklearn.metrics.py | 25 + .../stdhooks/hook-sklearn.neighbors.py | 41 + .../stdhooks/hook-sklearn.py | 17 + .../stdhooks/hook-sklearn.tree.py | 13 + .../stdhooks/hook-sklearn.utils.py | 13 + .../stdhooks/hook-skyfield.py | 14 + .../stdhooks/hook-slixmpp.py | 15 + .../stdhooks/hook-sound_lib.py | 18 + .../stdhooks/hook-sounddevice.py | 62 + .../stdhooks/hook-soundfile.py | 62 + .../stdhooks/hook-spacy.py | 19 + .../stdhooks/hook-speech_recognition.py | 18 + .../stdhooks/hook-spiceypy.py | 18 + .../stdhooks/hook-spnego.py | 15 + .../stdhooks/hook-srsly.msgpack._packer.py | 17 + .../stdhooks/hook-sspilib.raw.py | 20 + .../hook-statsmodels.tsa.statespace.py | 16 + .../stdhooks/hook-stdnum.py | 16 + .../stdhooks/hook-storm.database.py | 20 + .../stdhooks/hook-sudachipy.py | 30 + .../stdhooks/hook-sunpy.py | 20 + .../stdhooks/hook-sv_ttk.py | 16 + .../stdhooks/hook-swagger_spec_validator.py | 15 + .../stdhooks/hook-sympy.py | 22 + .../stdhooks/hook-tableauhyperapi.py | 15 + .../stdhooks/hook-tables.py | 30 + .../stdhooks/hook-tcod.py | 20 + .../stdhooks/hook-tensorflow.py | 198 + .../stdhooks/hook-text_unidecode.py | 25 + .../stdhooks/hook-textdistance.py | 17 + .../stdhooks/hook-thinc.backends.numpy_ops.py | 17 + .../stdhooks/hook-thinc.py | 18 + .../stdhooks/hook-timezonefinder.py | 15 + .../stdhooks/hook-timm.py | 14 + .../stdhooks/hook-tinycss2.py | 21 + .../stdhooks/hook-toga.py | 33 + .../stdhooks/hook-toga_cocoa.py | 19 + .../stdhooks/hook-toga_gtk.py | 19 + .../stdhooks/hook-toga_winforms.py | 40 + .../stdhooks/hook-torch.py | 143 + .../stdhooks/hook-torchaudio.py | 21 + .../stdhooks/hook-torchtext.py | 21 + .../stdhooks/hook-torchvision.io.image.py | 14 + .../stdhooks/hook-torchvision.py | 18 + .../stdhooks/hook-trame.py | 13 + .../stdhooks/hook-trame_client.py | 15 + .../stdhooks/hook-trame_code.py | 15 + .../stdhooks/hook-trame_components.py | 15 + .../stdhooks/hook-trame_datagrid.py | 15 + .../stdhooks/hook-trame_deckgl.py | 15 + .../stdhooks/hook-trame_formkit.py | 15 + .../stdhooks/hook-trame_grid.py | 15 + .../stdhooks/hook-trame_iframe.py | 15 + .../stdhooks/hook-trame_keycloak.py | 15 + .../stdhooks/hook-trame_leaflet.py | 15 + .../stdhooks/hook-trame_markdown.py | 15 + .../stdhooks/hook-trame_matplotlib.py | 15 + .../stdhooks/hook-trame_mesh_streamer.py | 16 + .../stdhooks/hook-trame_plotly.py | 15 + .../stdhooks/hook-trame_pvui.py | 15 + .../stdhooks/hook-trame_quasar.py | 15 + .../stdhooks/hook-trame_rca.py | 15 + .../stdhooks/hook-trame_router.py | 15 + .../stdhooks/hook-trame_simput.py | 15 + .../stdhooks/hook-trame_tauri.py | 15 + .../stdhooks/hook-trame_tweakpane.py | 15 + .../stdhooks/hook-trame_vega.py | 15 + .../stdhooks/hook-trame_vtk.py | 18 + .../stdhooks/hook-trame_vtk3d.py | 15 + .../stdhooks/hook-trame_vtklocal.py | 16 + .../stdhooks/hook-trame_vuetify.py | 15 + .../stdhooks/hook-trame_xterm.py | 15 + .../stdhooks/hook-transformers.py | 37 + .../stdhooks/hook-travertino.py | 14 + .../stdhooks/hook-trimesh.py | 17 + .../stdhooks/hook-triton.py | 32 + .../stdhooks/hook-ttkthemes.py | 56 + .../stdhooks/hook-ttkwidgets.py | 38 + .../stdhooks/hook-tzdata.py | 22 + .../stdhooks/hook-tzwhere.py | 15 + .../stdhooks/hook-u1db.py | 31 + .../stdhooks/hook-ultralytics.py | 19 + .../stdhooks/hook-umap.py | 15 + .../stdhooks/hook-unidecode.py | 20 + .../stdhooks/hook-uniseg.py | 17 + .../stdhooks/hook-usb.py | 87 + .../stdhooks/hook-uvicorn.py | 15 + .../stdhooks/hook-uvloop.py | 19 + .../stdhooks/hook-vaderSentiment.py | 15 + .../stdhooks/hook-vtkpython.py | 25 + .../stdhooks/hook-wavefile.py | 18 + .../stdhooks/hook-weasyprint.py | 85 + .../stdhooks/hook-web3.py | 15 + .../stdhooks/hook-webassets.py | 14 + .../stdhooks/hook-webrtcvad.py | 15 + .../stdhooks/hook-websockets.py | 16 + .../stdhooks/hook-webview.py | 20 + .../stdhooks/hook-win32com.py | 20 + .../stdhooks/hook-wordcloud.py | 15 + .../stdhooks/hook-workflow.py | 15 + .../stdhooks/hook-wx.lib.activex.py | 16 + .../stdhooks/hook-wx.lib.pubsub.py | 15 + .../stdhooks/hook-wx.xrc.py | 13 + .../stdhooks/hook-xarray.py | 30 + .../hook-xml.dom.html.HTMLDocument.py | 67 + .../stdhooks/hook-xml.sax.saxexts.py | 25 + .../stdhooks/hook-xmldiff.py | 16 + .../stdhooks/hook-xmlschema.py | 17 + .../stdhooks/hook-xsge_gui.py | 17 + .../stdhooks/hook-xyzservices.py | 15 + .../stdhooks/hook-yapf_third_party.py | 15 + .../stdhooks/hook-z3c.rml.py | 25 + .../stdhooks/hook-zeep.py | 18 + .../stdhooks/hook-zmq.py | 63 + .../stdhooks/hook-zoneinfo.py | 18 + .../utils/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 203 bytes .../__pycache__/nvidia_cuda.cpython-311.pyc | Bin 0 -> 2864 bytes .../utils/nvidia_cuda.py | 77 + .../INSTALLER | 0 .../altgraph-0.17.4.dist-info/LICENSE | 18 + .../altgraph-0.17.4.dist-info/METADATA | 293 + .../altgraph-0.17.4.dist-info/RECORD | 21 + .../altgraph-0.17.4.dist-info/WHEEL | 6 + .../altgraph-0.17.4.dist-info/top_level.txt | 1 + .../altgraph-0.17.4.dist-info/zip-safe | 1 + venv/Lib/site-packages/altgraph/Dot.py | 321 + venv/Lib/site-packages/altgraph/Graph.py | 682 ++ venv/Lib/site-packages/altgraph/GraphAlgo.py | 171 + venv/Lib/site-packages/altgraph/GraphStat.py | 73 + venv/Lib/site-packages/altgraph/GraphUtil.py | 139 + .../Lib/site-packages/altgraph/ObjectGraph.py | 212 + venv/Lib/site-packages/altgraph/__init__.py | 148 + .../altgraph/__pycache__/Dot.cpython-311.pyc | Bin 0 -> 12298 bytes .../__pycache__/Graph.cpython-311.pyc | Bin 0 -> 29343 bytes .../__pycache__/GraphAlgo.cpython-311.pyc | Bin 0 -> 7956 bytes .../__pycache__/GraphStat.cpython-311.pyc | Bin 0 -> 2591 bytes .../__pycache__/GraphUtil.cpython-311.pyc | Bin 0 -> 5365 bytes .../__pycache__/ObjectGraph.cpython-311.pyc | Bin 0 -> 10986 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 5495 bytes venv/Lib/site-packages/ordlookup/__init__.py | 34 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1247 bytes .../__pycache__/oleaut32.cpython-311.pyc | Bin 0 -> 19418 bytes .../__pycache__/ws2_32.cpython-311.pyc | Bin 0 -> 5399 bytes venv/Lib/site-packages/ordlookup/oleaut32.py | 400 + venv/Lib/site-packages/ordlookup/ws2_32.py | 119 + .../INSTALLER} | 0 .../packaging-24.2.dist-info/LICENSE | 3 + .../packaging-24.2.dist-info/LICENSE.APACHE | 177 + .../packaging-24.2.dist-info/LICENSE.BSD | 23 + .../packaging-24.2.dist-info/METADATA | 102 + .../packaging-24.2.dist-info/RECORD | 40 + .../packaging-24.2.dist-info/WHEEL | 4 + venv/Lib/site-packages/packaging/__init__.py | 15 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 540 bytes .../__pycache__/_elffile.cpython-311.pyc | Bin 0 -> 5498 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 0 -> 10931 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 0 -> 5291 bytes .../__pycache__/_parser.cpython-311.pyc | Bin 0 -> 16263 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 0 -> 3664 bytes .../__pycache__/_tokenizer.cpython-311.pyc | Bin 0 -> 8528 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 13083 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 0 -> 31070 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 4705 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 0 -> 41492 bytes .../__pycache__/tags.cpython-311.pyc | Bin 0 -> 25864 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 7566 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 21952 bytes venv/Lib/site-packages/packaging/_elffile.py | 110 + .../Lib/site-packages/packaging/_manylinux.py | 263 + .../Lib/site-packages/packaging/_musllinux.py | 85 + venv/Lib/site-packages/packaging/_parser.py | 354 + .../site-packages/packaging/_structures.py | 61 + .../Lib/site-packages/packaging/_tokenizer.py | 194 + .../packaging/licenses/__init__.py | 145 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 5024 bytes .../__pycache__/_spdx.cpython-311.pyc | Bin 0 -> 50248 bytes .../site-packages/packaging/licenses/_spdx.py | 759 ++ venv/Lib/site-packages/packaging/markers.py | 331 + venv/Lib/site-packages/packaging/metadata.py | 863 ++ .../REQUESTED => packaging/py.typed} | 0 .../site-packages/packaging/requirements.py | 91 + .../Lib/site-packages/packaging/specifiers.py | 1020 +++ venv/Lib/site-packages/packaging/tags.py | 617 ++ venv/Lib/site-packages/packaging/utils.py | 163 + venv/Lib/site-packages/packaging/version.py | 582 ++ .../pefile-2023.2.7.dist-info/INSTALLER | 1 + .../pefile-2023.2.7.dist-info/LICENSE | 21 + .../pefile-2023.2.7.dist-info/METADATA | 34 + .../pefile-2023.2.7.dist-info/RECORD | 16 + .../pefile-2023.2.7.dist-info/WHEEL | 5 + .../pefile-2023.2.7.dist-info/top_level.txt | 3 + venv/Lib/site-packages/pefile.py | 7853 +++++++++++++++++ venv/Lib/site-packages/peutils.py | 585 ++ .../AUTHORS.txt | 3 + .../pip-24.3.1.dist-info/INSTALLER | 1 + .../LICENSE.txt | 0 .../METADATA | 3 +- .../RECORD | 108 +- .../pip-24.3.1.dist-info/REQUESTED | 0 .../WHEEL | 2 +- .../entry_points.txt | 0 .../pip-24.3.1.dist-info/top_level.txt | 1 + venv/Lib/site-packages/pip/__init__.py | 2 +- .../pip/__pycache__/__init__.cpython-311.pyc | Bin 761 -> 763 bytes .../pip/__pycache__/__main__.cpython-311.pyc | Bin 880 -> 880 bytes .../__pip-runner__.cpython-311.pyc | Bin 2499 -> 2499 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 877 -> 877 bytes .../__pycache__/build_env.cpython-311.pyc | Bin 16340 -> 16367 bytes .../__pycache__/cache.cpython-311.pyc | Bin 14381 -> 14381 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 19772 -> 19772 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 40087 -> 41593 bytes .../__pycache__/main.cpython-311.pyc | Bin 746 -> 746 bytes .../__pycache__/pyproject.cpython-311.pyc | Bin 5777 -> 5777 bytes .../self_outdated_check.cpython-311.pyc | Bin 11378 -> 11378 bytes .../__pycache__/wheel_builder.cpython-311.pyc | Bin 15127 -> 15127 bytes .../site-packages/pip/_internal/build_env.py | 4 + .../cli/__pycache__/__init__.cpython-311.pyc | Bin 281 -> 281 bytes .../autocompletion.cpython-311.pyc | Bin 10419 -> 10419 bytes .../__pycache__/base_command.cpython-311.pyc | Bin 11614 -> 11614 bytes .../__pycache__/cmdoptions.cpython-311.pyc | Bin 33791 -> 33791 bytes .../command_context.cpython-311.pyc | Bin 2103 -> 2103 bytes .../__pycache__/index_command.cpython-311.pyc | Bin 7915 -> 7915 bytes .../cli/__pycache__/main.cpython-311.pyc | Bin 2575 -> 2575 bytes .../__pycache__/main_parser.cpython-311.pyc | Bin 5517 -> 5517 bytes .../cli/__pycache__/parser.cpython-311.pyc | Bin 17004 -> 17034 bytes .../__pycache__/progress_bars.cpython-311.pyc | Bin 4581 -> 4597 bytes .../__pycache__/req_command.cpython-311.pyc | Bin 13074 -> 13074 bytes .../cli/__pycache__/spinners.cpython-311.pyc | Bin 8830 -> 8830 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 369 -> 369 bytes .../pip/_internal/cli/index_command.py | 2 +- .../site-packages/pip/_internal/cli/parser.py | 4 +- .../pip/_internal/cli/progress_bars.py | 2 +- .../__pycache__/__init__.cpython-311.pyc | Bin 4449 -> 4449 bytes .../__pycache__/cache.cpython-311.pyc | Bin 10869 -> 10869 bytes .../__pycache__/check.cpython-311.pyc | Bin 3003 -> 3003 bytes .../__pycache__/completion.cpython-311.pyc | Bin 5619 -> 5619 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 14847 -> 14847 bytes .../__pycache__/debug.cpython-311.pyc | Bin 12160 -> 12160 bytes .../__pycache__/download.cpython-311.pyc | Bin 7843 -> 7843 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 4688 -> 4688 bytes .../commands/__pycache__/hash.cpython-311.pyc | Bin 3351 -> 3351 bytes .../commands/__pycache__/help.cpython-311.pyc | Bin 1963 -> 1963 bytes .../__pycache__/index.cpython-311.pyc | Bin 7652 -> 7652 bytes .../__pycache__/inspect.cpython-311.pyc | Bin 4440 -> 4440 bytes .../__pycache__/install.cpython-311.pyc | Bin 31394 -> 31394 bytes .../commands/__pycache__/list.cpython-311.pyc | Bin 17701 -> 17701 bytes .../__pycache__/search.cpython-311.pyc | Bin 8848 -> 8848 bytes .../commands/__pycache__/show.cpython-311.pyc | Bin 12262 -> 12262 bytes .../__pycache__/uninstall.cpython-311.pyc | Bin 5145 -> 5145 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 9300 -> 9300 bytes .../pip/_internal/commands/list.py | 2 +- .../pip/_internal/commands/search.py | 2 +- .../__pycache__/__init__.cpython-311.pyc | Bin 1031 -> 1031 bytes .../__pycache__/base.cpython-311.pyc | Bin 3166 -> 3166 bytes .../__pycache__/installed.cpython-311.pyc | Bin 1840 -> 1840 bytes .../__pycache__/sdist.cpython-311.pyc | Bin 9345 -> 9345 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 2476 -> 2476 bytes .../site-packages/pip/_internal/exceptions.py | 34 +- .../__pycache__/__init__.cpython-311.pyc | Bin 235 -> 235 bytes .../__pycache__/collector.cpython-311.pyc | Bin 24327 -> 24327 bytes .../package_finder.cpython-311.pyc | Bin 44103 -> 44103 bytes .../index/__pycache__/sources.cpython-311.pyc | Bin 13951 -> 13873 bytes .../pip/_internal/index/sources.py | 5 +- .../__pycache__/__init__.cpython-311.pyc | Bin 17862 -> 17862 bytes .../__pycache__/_distutils.cpython-311.pyc | Bin 7547 -> 7467 bytes .../__pycache__/_sysconfig.cpython-311.pyc | Bin 8895 -> 8895 bytes .../__pycache__/base.cpython-311.pyc | Bin 3998 -> 3998 bytes .../pip/_internal/locations/_distutils.py | 6 +- .../__pycache__/__init__.cpython-311.pyc | Bin 6497 -> 6497 bytes .../__pycache__/_json.cpython-311.pyc | Bin 3634 -> 3634 bytes .../metadata/__pycache__/base.cpython-311.pyc | Bin 38157 -> 38157 bytes .../__pycache__/pkg_resources.cpython-311.pyc | Bin 18203 -> 18203 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 386 -> 386 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 4848 -> 4848 bytes .../__pycache__/_dists.cpython-311.pyc | Bin 14080 -> 14080 bytes .../__pycache__/_envs.cpython-311.pyc | Bin 12454 -> 12454 bytes .../pip/_internal/metadata/importlib/_envs.py | 2 +- .../__pycache__/__init__.cpython-311.pyc | Bin 269 -> 269 bytes .../__pycache__/candidate.cpython-311.pyc | Bin 1839 -> 1839 bytes .../__pycache__/direct_url.cpython-311.pyc | Bin 12401 -> 12401 bytes .../format_control.cpython-311.pyc | Bin 4623 -> 4623 bytes .../models/__pycache__/index.cpython-311.pyc | Bin 1894 -> 1894 bytes .../installation_report.cpython-311.pyc | Bin 2600 -> 2600 bytes .../models/__pycache__/link.cpython-311.pyc | Bin 29159 -> 29159 bytes .../models/__pycache__/scheme.cpython-311.pyc | Bin 1142 -> 1142 bytes .../__pycache__/search_scope.cpython-311.pyc | Bin 5759 -> 5759 bytes .../selection_prefs.cpython-311.pyc | Bin 1991 -> 1991 bytes .../__pycache__/target_python.cpython-311.pyc | Bin 5290 -> 5290 bytes .../models/__pycache__/wheel.cpython-311.pyc | Bin 6416 -> 7345 bytes .../pip/_internal/models/wheel.py | 31 +- .../__pycache__/__init__.cpython-311.pyc | Bin 257 -> 257 bytes .../network/__pycache__/auth.cpython-311.pyc | Bin 24111 -> 24111 bytes .../network/__pycache__/cache.cpython-311.pyc | Bin 7925 -> 7925 bytes .../__pycache__/download.cpython-311.pyc | Bin 9482 -> 9482 bytes .../__pycache__/lazy_wheel.cpython-311.pyc | Bin 13018 -> 13018 bytes .../__pycache__/session.cpython-311.pyc | Bin 21553 -> 21553 bytes .../network/__pycache__/utils.cpython-311.pyc | Bin 2407 -> 2407 bytes .../__pycache__/xmlrpc.cpython-311.pyc | Bin 3243 -> 3243 bytes .../pip/_internal/network/lazy_wheel.py | 2 +- .../__pycache__/__init__.cpython-311.pyc | Bin 195 -> 195 bytes .../__pycache__/check.cpython-311.pyc | Bin 8192 -> 8192 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 11640 -> 11640 bytes .../__pycache__/prepare.cpython-311.pyc | Bin 27956 -> 27956 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 201 -> 201 bytes .../__pycache__/build_tracker.cpython-311.pyc | Bin 8788 -> 8788 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 2272 -> 2272 bytes .../metadata_editable.cpython-311.pyc | Bin 2308 -> 2308 bytes .../metadata_legacy.cpython-311.pyc | Bin 3660 -> 3660 bytes .../build/__pycache__/wheel.cpython-311.pyc | Bin 1938 -> 1938 bytes .../wheel_editable.cpython-311.pyc | Bin 2382 -> 2382 bytes .../__pycache__/wheel_legacy.cpython-311.pyc | Bin 4407 -> 4407 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 269 -> 269 bytes .../editable_legacy.cpython-311.pyc | Bin 2184 -> 2184 bytes .../install/__pycache__/wheel.cpython-311.pyc | Bin 40550 -> 40550 bytes .../req/__pycache__/__init__.cpython-311.pyc | Bin 4122 -> 4122 bytes .../__pycache__/constructors.cpython-311.pyc | Bin 23048 -> 23096 bytes .../req/__pycache__/req_file.cpython-311.pyc | Bin 23080 -> 23865 bytes .../__pycache__/req_install.cpython-311.pyc | Bin 40343 -> 40343 bytes .../req/__pycache__/req_set.cpython-311.pyc | Bin 5997 -> 5997 bytes .../__pycache__/req_uninstall.cpython-311.pyc | Bin 36629 -> 36629 bytes .../pip/_internal/req/constructors.py | 2 +- .../pip/_internal/req/req_file.py | 37 +- .../__pycache__/__init__.cpython-311.pyc | Bin 195 -> 195 bytes .../__pycache__/base.cpython-311.pyc | Bin 1366 -> 1366 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 202 -> 202 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 23827 -> 23827 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 206 -> 206 bytes .../__pycache__/base.cpython-311.pyc | Bin 9116 -> 9116 bytes .../__pycache__/candidates.cpython-311.pyc | Bin 30043 -> 30294 bytes .../__pycache__/factory.cpython-311.pyc | Bin 36026 -> 36301 bytes .../found_candidates.cpython-311.pyc | Bin 7394 -> 7394 bytes .../__pycache__/provider.cpython-311.pyc | Bin 11610 -> 11610 bytes .../__pycache__/reporter.cpython-311.pyc | Bin 5565 -> 5565 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 16115 -> 16115 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 13446 -> 13446 bytes .../resolution/resolvelib/candidates.py | 9 +- .../resolution/resolvelib/factory.py | 16 +- .../__pycache__/__init__.cpython-311.pyc | Bin 190 -> 190 bytes .../__pycache__/_jaraco_text.cpython-311.pyc | Bin 4753 -> 4753 bytes .../utils/__pycache__/_log.cpython-311.pyc | Bin 2011 -> 2011 bytes .../utils/__pycache__/appdirs.cpython-311.pyc | Bin 2549 -> 2549 bytes .../utils/__pycache__/compat.cpython-311.pyc | Bin 2993 -> 2993 bytes .../compatibility_tags.cpython-311.pyc | Bin 6749 -> 7821 bytes .../__pycache__/datetime.cpython-311.pyc | Bin 707 -> 707 bytes .../__pycache__/deprecation.cpython-311.pyc | Bin 4681 -> 4681 bytes .../direct_url_helpers.cpython-311.pyc | Bin 3673 -> 3673 bytes .../__pycache__/egg_link.cpython-311.pyc | Bin 3545 -> 3545 bytes .../__pycache__/encoding.cpython-311.pyc | Bin 2313 -> 2313 bytes .../__pycache__/entrypoints.cpython-311.pyc | Bin 4235 -> 4235 bytes .../__pycache__/filesystem.cpython-311.pyc | Bin 8080 -> 8080 bytes .../__pycache__/filetypes.cpython-311.pyc | Bin 1306 -> 1306 bytes .../utils/__pycache__/glibc.cpython-311.pyc | Bin 2700 -> 2700 bytes .../utils/__pycache__/hashes.cpython-311.pyc | Bin 8977 -> 8977 bytes .../utils/__pycache__/logging.cpython-311.pyc | Bin 15361 -> 15361 bytes .../utils/__pycache__/misc.cpython-311.pyc | Bin 37944 -> 37815 bytes .../__pycache__/packaging.cpython-311.pyc | Bin 2797 -> 2797 bytes .../utils/__pycache__/retry.cpython-311.pyc | Bin 2363 -> 2363 bytes .../setuptools_build.cpython-311.pyc | Bin 4862 -> 4862 bytes .../__pycache__/subprocess.cpython-311.pyc | Bin 9781 -> 9781 bytes .../__pycache__/temp_dir.cpython-311.pyc | Bin 13374 -> 13374 bytes .../__pycache__/unpacking.cpython-311.pyc | Bin 15501 -> 15501 bytes .../utils/__pycache__/urls.cpython-311.pyc | Bin 2284 -> 2284 bytes .../__pycache__/virtualenv.cpython-311.pyc | Bin 4930 -> 4930 bytes .../utils/__pycache__/wheel.cpython-311.pyc | Bin 6981 -> 6981 bytes .../pip/_internal/utils/compatibility_tags.py | 27 +- .../site-packages/pip/_internal/utils/misc.py | 9 +- .../vcs/__pycache__/__init__.cpython-311.pyc | Bin 625 -> 625 bytes .../vcs/__pycache__/bazaar.cpython-311.pyc | Bin 5887 -> 5887 bytes .../vcs/__pycache__/git.cpython-311.pyc | Bin 21458 -> 21458 bytes .../vcs/__pycache__/mercurial.cpython-311.pyc | Bin 8718 -> 8718 bytes .../__pycache__/subversion.cpython-311.pyc | Bin 14633 -> 14633 bytes .../versioncontrol.cpython-311.pyc | Bin 31759 -> 31759 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 5417 -> 5417 bytes .../typing_extensions.cpython-311.pyc | Bin 151525 -> 151525 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 969 -> 969 bytes .../__pycache__/_cmd.cpython-311.pyc | Bin 3020 -> 3020 bytes .../__pycache__/adapter.cpython-311.pyc | Bin 6896 -> 6896 bytes .../__pycache__/cache.cpython-311.pyc | Bin 4493 -> 4493 bytes .../__pycache__/controller.cpython-311.pyc | Bin 18298 -> 18298 bytes .../__pycache__/filewrapper.cpython-311.pyc | Bin 4749 -> 4749 bytes .../__pycache__/heuristics.cpython-311.pyc | Bin 7552 -> 7552 bytes .../__pycache__/serialize.cpython-311.pyc | Bin 5930 -> 5930 bytes .../__pycache__/wrapper.cpython-311.pyc | Bin 1861 -> 1861 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 470 -> 470 bytes .../__pycache__/file_cache.cpython-311.pyc | Bin 9077 -> 9077 bytes .../__pycache__/redis_cache.cpython-311.pyc | Bin 3077 -> 3077 bytes .../pip/_vendor/certifi/__init__.py | 2 +- .../__pycache__/__init__.cpython-311.pyc | Bin 332 -> 332 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 733 -> 733 bytes .../certifi/__pycache__/core.cpython-311.pyc | Bin 3779 -> 3779 bytes .../pip/_vendor/certifi/cacert.pem | 131 + .../pip/_vendor/distlib/__init__.py | 2 +- .../__pycache__/__init__.cpython-311.pyc | Bin 1459 -> 1459 bytes .../__pycache__/compat.cpython-311.pyc | Bin 52396 -> 52393 bytes .../__pycache__/database.cpython-311.pyc | Bin 72177 -> 71987 bytes .../distlib/__pycache__/index.cpython-311.pyc | Bin 26658 -> 26658 bytes .../__pycache__/locators.cpython-311.pyc | Bin 65783 -> 65714 bytes .../__pycache__/manifest.cpython-311.pyc | Bin 17008 -> 17008 bytes .../__pycache__/markers.cpython-311.pyc | Bin 8542 -> 8512 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 47423 -> 47294 bytes .../__pycache__/resources.cpython-311.pyc | Bin 18984 -> 18984 bytes .../__pycache__/scripts.cpython-311.pyc | Bin 21556 -> 21490 bytes .../distlib/__pycache__/util.cpython-311.pyc | Bin 98187 -> 98165 bytes .../__pycache__/version.cpython-311.pyc | Bin 34806 -> 34805 bytes .../distlib/__pycache__/wheel.cpython-311.pyc | Bin 59469 -> 60727 bytes .../pip/_vendor/distlib/compat.py | 3 +- .../pip/_vendor/distlib/database.py | 90 +- .../pip/_vendor/distlib/locators.py | 122 +- .../pip/_vendor/distlib/markers.py | 19 +- .../pip/_vendor/distlib/metadata.py | 181 +- .../pip/_vendor/distlib/scripts.py | 91 +- .../site-packages/pip/_vendor/distlib/util.py | 123 +- .../pip/_vendor/distlib/version.py | 3 +- .../pip/_vendor/distlib/wheel.py | 129 +- .../__pycache__/__init__.cpython-311.pyc | Bin 1188 -> 1188 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 322 -> 322 bytes .../distro/__pycache__/distro.cpython-311.pyc | Bin 57812 -> 57812 bytes .../idna/__pycache__/__init__.cpython-311.pyc | Bin 1089 -> 1089 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 5776 -> 5776 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 1006 -> 1006 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 18891 -> 18891 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 101535 -> 101535 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 2974 -> 2974 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 209 -> 209 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 163167 -> 163167 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 1974 -> 1974 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 2369 -> 2369 bytes .../msgpack/__pycache__/ext.cpython-311.pyc | Bin 8621 -> 8621 bytes .../__pycache__/fallback.cpython-311.pyc | Bin 45320 -> 45320 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 551 -> 551 bytes .../__pycache__/_elffile.cpython-311.pyc | Bin 5448 -> 5448 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 10912 -> 10912 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 5303 -> 5303 bytes .../__pycache__/_parser.cpython-311.pyc | Bin 16275 -> 16275 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3676 -> 3676 bytes .../__pycache__/_tokenizer.cpython-311.pyc | Bin 8540 -> 8540 bytes .../__pycache__/markers.cpython-311.pyc | Bin 12764 -> 12764 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 28531 -> 28531 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 4717 -> 4717 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 41252 -> 41252 bytes .../__pycache__/tags.cpython-311.pyc | Bin 24071 -> 26161 bytes .../__pycache__/utils.cpython-311.pyc | Bin 8304 -> 8304 bytes .../__pycache__/version.cpython-311.pyc | Bin 20822 -> 20822 bytes .../pip/_vendor/packaging/tags.py | 69 +- .../__pycache__/__init__.cpython-311.pyc | Bin 176834 -> 176834 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 19183 -> 19183 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 2289 -> 2289 bytes .../__pycache__/android.cpython-311.pyc | Bin 11889 -> 11889 bytes .../__pycache__/api.cpython-311.pyc | Bin 14101 -> 14101 bytes .../__pycache__/macos.cpython-311.pyc | Bin 8510 -> 8510 bytes .../__pycache__/unix.cpython-311.pyc | Bin 16554 -> 16554 bytes .../__pycache__/version.cpython-311.pyc | Bin 652 -> 652 bytes .../__pycache__/windows.cpython-311.pyc | Bin 14695 -> 14695 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 3823 -> 3823 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 772 -> 772 bytes .../__pycache__/cmdline.cpython-311.pyc | Bin 30315 -> 30315 bytes .../__pycache__/console.cpython-311.pyc | Bin 3042 -> 3042 bytes .../__pycache__/filter.cpython-311.pyc | Bin 3489 -> 3489 bytes .../__pycache__/formatter.cpython-311.pyc | Bin 4972 -> 4972 bytes .../__pycache__/lexer.cpython-311.pyc | Bin 42345 -> 42345 bytes .../__pycache__/modeline.cpython-311.pyc | Bin 1716 -> 1716 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 2850 -> 2850 bytes .../__pycache__/regexopt.cpython-311.pyc | Bin 5022 -> 5022 bytes .../__pycache__/scanner.cpython-311.pyc | Bin 4877 -> 4877 bytes .../__pycache__/sphinxext.cpython-311.pyc | Bin 14010 -> 14010 bytes .../__pycache__/style.cpython-311.pyc | Bin 7459 -> 7459 bytes .../__pycache__/token.cpython-311.pyc | Bin 7495 -> 7495 bytes .../__pycache__/unistring.cpython-311.pyc | Bin 33838 -> 33838 bytes .../pygments/__pycache__/util.cpython-311.pyc | Bin 15789 -> 15789 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 40155 -> 40155 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 7771 -> 7771 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 4214 -> 4214 bytes .../__pycache__/bbcode.cpython-311.pyc | Bin 4519 -> 4519 bytes .../__pycache__/groff.cpython-311.pyc | Bin 7933 -> 7933 bytes .../__pycache__/html.cpython-311.pyc | Bin 43157 -> 43157 bytes .../__pycache__/img.cpython-311.pyc | Bin 30283 -> 30283 bytes .../__pycache__/irc.cpython-311.pyc | Bin 6396 -> 6396 bytes .../__pycache__/latex.cpython-311.pyc | Bin 22070 -> 22070 bytes .../__pycache__/other.cpython-311.pyc | Bin 7637 -> 7637 bytes .../__pycache__/pangomarkup.cpython-311.pyc | Bin 3217 -> 3217 bytes .../__pycache__/rtf.cpython-311.pyc | Bin 14752 -> 14752 bytes .../__pycache__/svg.cpython-311.pyc | Bin 9677 -> 9677 bytes .../__pycache__/terminal.cpython-311.pyc | Bin 6034 -> 6034 bytes .../__pycache__/terminal256.cpython-311.pyc | Bin 16400 -> 16400 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 16425 -> 16425 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 68665 -> 68665 bytes .../lexers/__pycache__/python.cpython-311.pyc | Bin 43598 -> 43598 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 3100 -> 3100 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 3662 -> 3662 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 697 -> 697 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 395 -> 395 bytes .../__pycache__/_impl.cpython-311.pyc | Bin 16661 -> 16661 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 1157 -> 1157 bytes .../__pycache__/_in_process.cpython-311.pyc | Bin 16479 -> 16479 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 6203 -> 6203 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 578 -> 578 bytes .../_internal_utils.cpython-311.pyc | Bin 2142 -> 2142 bytes .../__pycache__/adapters.cpython-311.pyc | Bin 30745 -> 30745 bytes .../requests/__pycache__/api.cpython-311.pyc | Bin 7495 -> 7495 bytes .../requests/__pycache__/auth.cpython-311.pyc | Bin 14622 -> 14622 bytes .../__pycache__/certs.cpython-311.pyc | Bin 974 -> 974 bytes .../__pycache__/compat.cpython-311.pyc | Bin 1977 -> 1977 bytes .../__pycache__/cookies.cpython-311.pyc | Bin 27132 -> 27132 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 9076 -> 9076 bytes .../requests/__pycache__/help.cpython-311.pyc | Bin 4396 -> 4396 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 1242 -> 1242 bytes .../__pycache__/models.cpython-311.pyc | Bin 38810 -> 38810 bytes .../__pycache__/packages.cpython-311.pyc | Bin 1338 -> 1338 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 29810 -> 29810 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 6301 -> 6301 bytes .../__pycache__/structures.cpython-311.pyc | Bin 6214 -> 6214 bytes .../__pycache__/utils.cpython-311.pyc | Bin 40593 -> 40593 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 745 -> 745 bytes .../__pycache__/providers.cpython-311.pyc | Bin 7063 -> 7063 bytes .../__pycache__/reporters.cpython-311.pyc | Bin 2827 -> 2827 bytes .../__pycache__/resolvers.cpython-311.pyc | Bin 29227 -> 29227 bytes .../__pycache__/structs.cpython-311.pyc | Bin 11464 -> 11464 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 200 -> 200 bytes .../collections_abc.cpython-311.pyc | Bin 475 -> 475 bytes .../rich/__pycache__/__init__.cpython-311.pyc | Bin 7488 -> 7488 bytes .../rich/__pycache__/__main__.cpython-311.pyc | Bin 11566 -> 11566 bytes .../__pycache__/_cell_widths.cpython-311.pyc | Bin 7878 -> 7878 bytes .../__pycache__/_emoji_codes.cpython-311.pyc | Bin 208514 -> 208514 bytes .../_emoji_replace.cpython-311.pyc | Bin 1926 -> 1926 bytes .../_export_format.cpython-311.pyc | Bin 2345 -> 2345 bytes .../__pycache__/_extension.cpython-311.pyc | Bin 627 -> 627 bytes .../rich/__pycache__/_fileno.cpython-311.pyc | Bin 969 -> 969 bytes .../rich/__pycache__/_inspect.cpython-311.pyc | Bin 14179 -> 14179 bytes .../__pycache__/_log_render.cpython-311.pyc | Bin 4761 -> 4761 bytes .../rich/__pycache__/_loop.cpython-311.pyc | Bin 2107 -> 2107 bytes .../__pycache__/_null_file.cpython-311.pyc | Bin 4166 -> 4166 bytes .../__pycache__/_palettes.cpython-311.pyc | Bin 5243 -> 5243 bytes .../rich/__pycache__/_pick.cpython-311.pyc | Bin 787 -> 787 bytes .../rich/__pycache__/_ratio.cpython-311.pyc | Bin 7924 -> 7924 bytes .../__pycache__/_spinners.cpython-311.pyc | Bin 13676 -> 13676 bytes .../rich/__pycache__/_stack.cpython-311.pyc | Bin 1122 -> 1122 bytes .../rich/__pycache__/_timer.cpython-311.pyc | Bin 975 -> 975 bytes .../_win32_console.cpython-311.pyc | Bin 30163 -> 30163 bytes .../rich/__pycache__/_windows.cpython-311.pyc | Bin 2822 -> 2822 bytes .../_windows_renderer.cpython-311.pyc | Bin 4013 -> 4013 bytes .../rich/__pycache__/_wrap.cpython-311.pyc | Bin 3849 -> 3849 bytes .../rich/__pycache__/abc.cpython-311.pyc | Bin 1919 -> 1919 bytes .../rich/__pycache__/align.cpython-311.pyc | Bin 13461 -> 13461 bytes .../rich/__pycache__/ansi.cpython-311.pyc | Bin 10492 -> 10492 bytes .../rich/__pycache__/bar.cpython-311.pyc | Bin 4541 -> 4541 bytes .../rich/__pycache__/box.cpython-311.pyc | Bin 12983 -> 12983 bytes .../rich/__pycache__/cells.cpython-311.pyc | Bin 6634 -> 6634 bytes .../rich/__pycache__/color.cpython-311.pyc | Bin 27797 -> 27797 bytes .../__pycache__/color_triplet.cpython-311.pyc | Bin 1867 -> 1867 bytes .../rich/__pycache__/columns.cpython-311.pyc | Bin 10638 -> 10638 bytes .../rich/__pycache__/console.cpython-311.pyc | Bin 123634 -> 123634 bytes .../__pycache__/constrain.cpython-311.pyc | Bin 2459 -> 2459 bytes .../__pycache__/containers.cpython-311.pyc | Bin 10805 -> 10805 bytes .../rich/__pycache__/control.cpython-311.pyc | Bin 11891 -> 11891 bytes .../default_styles.cpython-311.pyc | Bin 12594 -> 12594 bytes .../rich/__pycache__/diagnose.cpython-311.pyc | Bin 1814 -> 1814 bytes .../rich/__pycache__/emoji.cpython-311.pyc | Bin 4792 -> 4792 bytes .../rich/__pycache__/errors.cpython-311.pyc | Bin 2323 -> 2323 bytes .../__pycache__/file_proxy.cpython-311.pyc | Bin 4027 -> 4027 bytes .../rich/__pycache__/filesize.cpython-311.pyc | Bin 3295 -> 3295 bytes .../__pycache__/highlighter.cpython-311.pyc | Bin 10982 -> 10982 bytes .../rich/__pycache__/json.cpython-311.pyc | Bin 6538 -> 6538 bytes .../rich/__pycache__/jupyter.cpython-311.pyc | Bin 6398 -> 6398 bytes .../rich/__pycache__/layout.cpython-311.pyc | Bin 23305 -> 23305 bytes .../rich/__pycache__/live.cpython-311.pyc | Bin 21291 -> 21291 bytes .../__pycache__/live_render.cpython-311.pyc | Bin 5139 -> 5139 bytes .../rich/__pycache__/logging.cpython-311.pyc | Bin 14510 -> 14510 bytes .../rich/__pycache__/markup.cpython-311.pyc | Bin 10756 -> 10756 bytes .../rich/__pycache__/measure.cpython-311.pyc | Bin 7265 -> 7265 bytes .../rich/__pycache__/padding.cpython-311.pyc | Bin 7481 -> 7481 bytes .../rich/__pycache__/pager.cpython-311.pyc | Bin 2239 -> 2239 bytes .../rich/__pycache__/palette.cpython-311.pyc | Bin 5972 -> 5972 bytes .../rich/__pycache__/panel.cpython-311.pyc | Bin 12825 -> 12825 bytes .../rich/__pycache__/pretty.cpython-311.pyc | Bin 44485 -> 44485 bytes .../rich/__pycache__/progress.cpython-311.pyc | Bin 82660 -> 82660 bytes .../__pycache__/progress_bar.cpython-311.pyc | Bin 11006 -> 11006 bytes .../rich/__pycache__/prompt.cpython-311.pyc | Bin 16378 -> 16378 bytes .../rich/__pycache__/protocol.cpython-311.pyc | Bin 2090 -> 2090 bytes .../rich/__pycache__/region.cpython-311.pyc | Bin 653 -> 653 bytes .../rich/__pycache__/repr.cpython-311.pyc | Bin 7616 -> 7616 bytes .../rich/__pycache__/rule.cpython-311.pyc | Bin 7159 -> 7159 bytes .../rich/__pycache__/scope.cpython-311.pyc | Bin 4345 -> 4345 bytes .../rich/__pycache__/screen.cpython-311.pyc | Bin 2768 -> 2768 bytes .../rich/__pycache__/segment.cpython-311.pyc | Bin 31598 -> 31598 bytes .../rich/__pycache__/spinner.cpython-311.pyc | Bin 6874 -> 6874 bytes .../rich/__pycache__/status.cpython-311.pyc | Bin 6752 -> 6752 bytes .../rich/__pycache__/style.cpython-311.pyc | Bin 35192 -> 35192 bytes .../rich/__pycache__/styled.cpython-311.pyc | Bin 2433 -> 2433 bytes .../rich/__pycache__/syntax.cpython-311.pyc | Bin 43013 -> 43013 bytes .../rich/__pycache__/table.cpython-311.pyc | Bin 48794 -> 48794 bytes .../terminal_theme.cpython-311.pyc | Bin 3699 -> 3699 bytes .../rich/__pycache__/text.cpython-311.pyc | Bin 67126 -> 67126 bytes .../rich/__pycache__/theme.cpython-311.pyc | Bin 7298 -> 7298 bytes .../rich/__pycache__/themes.cpython-311.pyc | Bin 349 -> 349 bytes .../__pycache__/traceback.cpython-311.pyc | Bin 34561 -> 34561 bytes .../rich/__pycache__/tree.cpython-311.pyc | Bin 12520 -> 12520 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 404 -> 404 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 30843 -> 30843 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 4483 -> 4483 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 396 -> 396 bytes .../pip/_vendor/truststore/__init__.py | 25 +- .../__pycache__/__init__.cpython-311.pyc | Bin 657 -> 1467 bytes .../__pycache__/_api.cpython-311.pyc | Bin 17678 -> 17936 bytes .../__pycache__/_macos.cpython-311.pyc | Bin 17313 -> 19815 bytes .../__pycache__/_openssl.cpython-311.pyc | Bin 2338 -> 2338 bytes .../_ssl_constants.cpython-311.pyc | Bin 1113 -> 1113 bytes .../__pycache__/_windows.cpython-311.pyc | Bin 17507 -> 17536 bytes .../pip/_vendor/truststore/_api.py | 3 + .../pip/_vendor/truststore/_macos.py | 200 +- .../pip/_vendor/truststore/_windows.py | 7 +- .../__pycache__/__init__.cpython-311.pyc | Bin 3702 -> 3702 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 18880 -> 18880 bytes .../__pycache__/_version.cpython-311.pyc | Bin 212 -> 212 bytes .../__pycache__/connection.cpython-311.pyc | Bin 22058 -> 22058 bytes .../connectionpool.cpython-311.pyc | Bin 38470 -> 38555 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 16116 -> 16116 bytes .../__pycache__/fields.cpython-311.pyc | Bin 11409 -> 11409 bytes .../__pycache__/filepost.cpython-311.pyc | Bin 4490 -> 4490 bytes .../__pycache__/poolmanager.cpython-311.pyc | Bin 21812 -> 21812 bytes .../__pycache__/request.cpython-311.pyc | Bin 7661 -> 7661 bytes .../__pycache__/response.cpython-311.pyc | Bin 36536 -> 36536 bytes .../pip/_vendor/urllib3/_version.py | 2 +- .../pip/_vendor/urllib3/connection.py | 4 +- .../pip/_vendor/urllib3/connectionpool.py | 7 +- .../__pycache__/__init__.cpython-311.pyc | Bin 198 -> 198 bytes .../_appengine_environ.cpython-311.pyc | Bin 1937 -> 1937 bytes .../__pycache__/appengine.cpython-311.pyc | Bin 12144 -> 12144 bytes .../__pycache__/ntlmpool.cpython-311.pyc | Bin 6221 -> 6221 bytes .../__pycache__/pyopenssl.cpython-311.pyc | Bin 25730 -> 25730 bytes .../securetransport.cpython-311.pyc | Bin 36833 -> 36833 bytes .../contrib/__pycache__/socks.cpython-311.pyc | Bin 8082 -> 8082 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 215 -> 215 bytes .../__pycache__/bindings.cpython-311.pyc | Bin 16962 -> 16962 bytes .../__pycache__/low_level.cpython-311.pyc | Bin 15599 -> 15599 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 199 -> 199 bytes .../packages/__pycache__/six.cpython-311.pyc | Bin 46441 -> 46441 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 209 -> 209 bytes .../__pycache__/makefile.cpython-311.pyc | Bin 1956 -> 1956 bytes .../weakref_finalize.cpython-311.pyc | Bin 7984 -> 7984 bytes .../util/__pycache__/__init__.cpython-311.pyc | Bin 1401 -> 1401 bytes .../__pycache__/connection.cpython-311.pyc | Bin 5128 -> 5128 bytes .../util/__pycache__/proxy.cpython-311.pyc | Bin 1710 -> 1710 bytes .../util/__pycache__/queue.cpython-311.pyc | Bin 1493 -> 1493 bytes .../util/__pycache__/request.cpython-311.pyc | Bin 4613 -> 4613 bytes .../util/__pycache__/response.cpython-311.pyc | Bin 3482 -> 3482 bytes .../util/__pycache__/retry.cpython-311.pyc | Bin 22762 -> 22791 bytes .../util/__pycache__/ssl_.cpython-311.pyc | Bin 16813 -> 17235 bytes .../ssl_match_hostname.cpython-311.pyc | Bin 5792 -> 5792 bytes .../__pycache__/ssltransport.cpython-311.pyc | Bin 11621 -> 11621 bytes .../util/__pycache__/timeout.cpython-311.pyc | Bin 11335 -> 11335 bytes .../util/__pycache__/url.cpython-311.pyc | Bin 17576 -> 17576 bytes .../util/__pycache__/wait.cpython-311.pyc | Bin 4995 -> 4995 bytes .../pip/_vendor/urllib3/util/retry.py | 4 +- .../pip/_vendor/urllib3/util/ssl_.py | 17 +- venv/Lib/site-packages/pip/_vendor/vendor.txt | 8 +- .../pyinstaller-6.11.1.dist-info/COPYING.txt | 636 ++ .../pyinstaller-6.11.1.dist-info/INSTALLER | 1 + .../pyinstaller-6.11.1.dist-info/METADATA | 209 + .../pyinstaller-6.11.1.dist-info/RECORD | 1084 +++ .../pyinstaller-6.11.1.dist-info/REQUESTED | 0 .../pyinstaller-6.11.1.dist-info/WHEEL | 5 + .../entry_points.txt | 7 + .../top_level.txt | 1 + .../INSTALLER | 1 + .../LICENSE | 521 ++ .../METADATA | 371 + .../RECORD | 1015 +++ .../WHEEL | 5 + .../entry_points.txt | 2 + .../top_level.txt | 1 + .../pywin32_ctypes-0.2.3.dist-info/INSTALLER | 1 + .../LICENSE.txt | 28 + .../pywin32_ctypes-0.2.3.dist-info/METADATA | 134 + .../pywin32_ctypes-0.2.3.dist-info/RECORD | 74 + .../pywin32_ctypes-0.2.3.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../Lib/site-packages/win32ctypes/__init__.py | 8 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 241 bytes .../__pycache__/pywintypes.cpython-311.pyc | Bin 0 -> 417 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 201 bytes .../__pycache__/win32api.cpython-311.pyc | Bin 0 -> 411 bytes .../__pycache__/win32cred.cpython-311.pyc | Bin 0 -> 414 bytes .../win32ctypes/core/__init__.py | 60 + .../core/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2998 bytes .../__pycache__/_winerrors.cpython-311.pyc | Bin 0 -> 213 bytes .../core/__pycache__/compat.cpython-311.pyc | Bin 0 -> 700 bytes .../win32ctypes/core/_winerrors.py | 9 + .../win32ctypes/core/cffi/__init__.py | 11 + .../cffi/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 386 bytes .../_authentication.cpython-311.pyc | Bin 0 -> 7704 bytes .../cffi/__pycache__/_common.cpython-311.pyc | Bin 0 -> 1247 bytes .../cffi/__pycache__/_dll.cpython-311.pyc | Bin 0 -> 1382 bytes .../__pycache__/_nl_support.cpython-311.pyc | Bin 0 -> 572 bytes .../__pycache__/_resource.cpython-311.pyc | Bin 0 -> 7521 bytes .../_system_information.cpython-311.pyc | Bin 0 -> 1465 bytes .../cffi/__pycache__/_time.cpython-311.pyc | Bin 0 -> 585 bytes .../cffi/__pycache__/_util.cpython-311.pyc | Bin 0 -> 4693 bytes .../win32ctypes/core/cffi/_authentication.py | 172 + .../win32ctypes/core/cffi/_common.py | 29 + .../win32ctypes/core/cffi/_dll.py | 30 + .../win32ctypes/core/cffi/_nl_support.py | 18 + .../win32ctypes/core/cffi/_resource.py | 132 + .../core/cffi/_system_information.py | 32 + .../win32ctypes/core/cffi/_time.py | 18 + .../win32ctypes/core/cffi/_util.py | 105 + .../site-packages/win32ctypes/core/compat.py | 10 + .../win32ctypes/core/ctypes/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 390 bytes .../_authentication.cpython-311.pyc | Bin 0 -> 4940 bytes .../__pycache__/_common.cpython-311.pyc | Bin 0 -> 2152 bytes .../ctypes/__pycache__/_dll.cpython-311.pyc | Bin 0 -> 738 bytes .../__pycache__/_nl_support.cpython-311.pyc | Bin 0 -> 441 bytes .../__pycache__/_resource.cpython-311.pyc | Bin 0 -> 5845 bytes .../_system_information.cpython-311.pyc | Bin 0 -> 1516 bytes .../ctypes/__pycache__/_time.cpython-311.pyc | Bin 0 -> 456 bytes .../ctypes/__pycache__/_util.cpython-311.pyc | Bin 0 -> 3072 bytes .../core/ctypes/_authentication.py | 122 + .../win32ctypes/core/ctypes/_common.py | 53 + .../win32ctypes/core/ctypes/_dll.py | 21 + .../win32ctypes/core/ctypes/_nl_support.py | 12 + .../win32ctypes/core/ctypes/_resource.py | 148 + .../core/ctypes/_system_information.py | 36 + .../win32ctypes/core/ctypes/_time.py | 15 + .../win32ctypes/core/ctypes/_util.py | 78 + .../win32ctypes/pywin32/__init__.py | 12 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 398 bytes .../__pycache__/pywintypes.cpython-311.pyc | Bin 0 -> 3345 bytes .../__pycache__/win32api.cpython-311.pyc | Bin 0 -> 11780 bytes .../__pycache__/win32cred.cpython-311.pyc | Bin 0 -> 6801 bytes .../win32ctypes/pywin32/pywintypes.py | 67 + .../win32ctypes/pywin32/win32api.py | 294 + .../win32ctypes/pywin32/win32cred.py | 145 + .../site-packages/win32ctypes/pywintypes.py | 13 + .../win32ctypes/tests/__init__.py | 21 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1131 bytes .../__pycache__/test_backends.cpython-311.pyc | Bin 0 -> 2221 bytes .../__pycache__/test_win32api.cpython-311.pyc | Bin 0 -> 21651 bytes .../test_win32cred.cpython-311.pyc | Bin 0 -> 12081 bytes .../win32ctypes/tests/test_backends.py | 36 + .../win32ctypes/tests/test_win32api.py | 304 + .../win32ctypes/tests/test_win32cred.py | 230 + venv/Lib/site-packages/win32ctypes/version.py | 1 + .../Lib/site-packages/win32ctypes/win32api.py | 13 + .../site-packages/win32ctypes/win32cred.py | 13 + venv/Scripts/pip.exe | Bin 108409 -> 108409 bytes venv/Scripts/pip3.11.exe | Bin 108409 -> 108409 bytes venv/Scripts/pip3.exe | Bin 108409 -> 108409 bytes venv/Scripts/pyi-archive_viewer.exe | Bin 0 -> 108426 bytes venv/Scripts/pyi-bindepend.exe | Bin 0 -> 108421 bytes venv/Scripts/pyi-grab_version.exe | Bin 0 -> 108424 bytes venv/Scripts/pyi-makespec.exe | Bin 0 -> 108420 bytes venv/Scripts/pyi-set_version.exe | Bin 0 -> 108423 bytes venv/Scripts/pyinstaller.exe | Bin 0 -> 108437 bytes windows_module_compile.bat | 1 + 2719 files changed, 72049 insertions(+), 644 deletions(-) create mode 100644 run.spec create mode 100644 venv/Lib/site-packages/PyInstaller/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/__main__.py create mode 100644 venv/Lib/site-packages/PyInstaller/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/__pycache__/_recursion_too_deep_message.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/__pycache__/_shared_with_waf.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/__pycache__/compat.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/__pycache__/config.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/__pycache__/configure.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/__pycache__/log.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/_recursion_too_deep_message.py create mode 100644 venv/Lib/site-packages/PyInstaller/_shared_with_waf.py create mode 100644 venv/Lib/site-packages/PyInstaller/archive/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/archive/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/archive/__pycache__/pyz_crypto.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/archive/__pycache__/readers.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/archive/__pycache__/writers.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/archive/pyz_crypto.py create mode 100644 venv/Lib/site-packages/PyInstaller/archive/readers.py create mode 100644 venv/Lib/site-packages/PyInstaller/archive/writers.py create mode 100644 venv/Lib/site-packages/PyInstaller/bootloader/Windows-64bit-intel/run.exe create mode 100644 venv/Lib/site-packages/PyInstaller/bootloader/Windows-64bit-intel/run_d.exe create mode 100644 venv/Lib/site-packages/PyInstaller/bootloader/Windows-64bit-intel/runw.exe create mode 100644 venv/Lib/site-packages/PyInstaller/bootloader/Windows-64bit-intel/runw_d.exe create mode 100644 venv/Lib/site-packages/PyInstaller/bootloader/images/icon-console.ico create mode 100644 venv/Lib/site-packages/PyInstaller/bootloader/images/icon-windowed.ico create mode 100644 venv/Lib/site-packages/PyInstaller/building/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/building/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/building/__pycache__/api.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/building/__pycache__/build_main.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/building/__pycache__/datastruct.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/building/__pycache__/icon.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/building/__pycache__/makespec.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/building/__pycache__/osx.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/building/__pycache__/splash.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/building/__pycache__/splash_templates.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/building/__pycache__/templates.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/building/__pycache__/utils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/building/api.py create mode 100644 venv/Lib/site-packages/PyInstaller/building/build_main.py create mode 100644 venv/Lib/site-packages/PyInstaller/building/datastruct.py create mode 100644 venv/Lib/site-packages/PyInstaller/building/icon.py create mode 100644 venv/Lib/site-packages/PyInstaller/building/makespec.py create mode 100644 venv/Lib/site-packages/PyInstaller/building/osx.py create mode 100644 venv/Lib/site-packages/PyInstaller/building/splash.py create mode 100644 venv/Lib/site-packages/PyInstaller/building/splash_templates.py create mode 100644 venv/Lib/site-packages/PyInstaller/building/templates.py create mode 100644 venv/Lib/site-packages/PyInstaller/building/utils.py create mode 100644 venv/Lib/site-packages/PyInstaller/compat.py create mode 100644 venv/Lib/site-packages/PyInstaller/config.py create mode 100644 venv/Lib/site-packages/PyInstaller/configure.py create mode 100644 venv/Lib/site-packages/PyInstaller/depend/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/depend/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/depend/__pycache__/analysis.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/depend/__pycache__/bindepend.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/depend/__pycache__/bytecode.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/depend/__pycache__/dylib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/depend/__pycache__/imphook.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/depend/__pycache__/imphookapi.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/depend/__pycache__/utils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/depend/analysis.py create mode 100644 venv/Lib/site-packages/PyInstaller/depend/bindepend.py create mode 100644 venv/Lib/site-packages/PyInstaller/depend/bytecode.py create mode 100644 venv/Lib/site-packages/PyInstaller/depend/dylib.py create mode 100644 venv/Lib/site-packages/PyInstaller/depend/imphook.py create mode 100644 venv/Lib/site-packages/PyInstaller/depend/imphookapi.py create mode 100644 venv/Lib/site-packages/PyInstaller/depend/utils.py create mode 100644 venv/Lib/site-packages/PyInstaller/exceptions.py create mode 100644 venv/Lib/site-packages/PyInstaller/fake-modules/__pycache__/pyi_splash.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/_win32.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/qt.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/tempfile.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/_win32.py create mode 100644 venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/qt.py create mode 100644 venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/tempfile.py create mode 100644 venv/Lib/site-packages/PyInstaller/fake-modules/pyi_splash.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.Image.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.ImageFilter.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.SpiderImagePlugin.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QAxContainer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qsci.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DAnimation.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DCore.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DExtras.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DInput.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DLogic.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DRender.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtBluetooth.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtChart.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtCore.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDBus.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDataVisualization.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDesigner.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtGui.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtHelp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtLocation.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMacExtras.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMultimedia.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMultimediaWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtNetwork.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtNetworkAuth.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtNfc.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtOpenGL.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPositioning.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPrintSupport.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPurchasing.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQml.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuick.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuick3D.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuickWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtRemoteObjects.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtScript.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSensors.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSerialPort.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSql.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSvg.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtTest.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtTextToSpeech.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebChannel.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngine.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngineCore.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngineWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebKit.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebKitWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebSockets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWinExtras.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtX11Extras.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtXml.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtXmlPatterns.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.uic.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QAxContainer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qsci.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DAnimation.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DCore.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DExtras.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DInput.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DLogic.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DRender.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtBluetooth.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtCharts.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtCore.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDBus.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDataVisualization.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDesigner.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtGui.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtHelp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtMultimedia.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtMultimediaWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNetwork.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNetworkAuth.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNfc.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtOpenGL.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtOpenGLWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPdf.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPdfWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPositioning.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPrintSupport.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQml.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuick.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuick3D.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuickWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtRemoteObjects.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSensors.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSerialPort.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSpatialAudio.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSql.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSvg.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSvgWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtTest.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtTextToSpeech.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebChannel.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineCore.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineQuick.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebSockets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtXml.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.uic.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DAnimation.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DCore.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DExtras.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DInput.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DLogic.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DRender.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtAxContainer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtCharts.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtConcurrent.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtCore.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtDataVisualization.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtGui.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtHelp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtLocation.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtMacExtras.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtMultimedia.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtMultimediaWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtNetwork.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtOpenGL.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtOpenGLFunctions.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtPositioning.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtPrintSupport.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQml.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuick.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuickControls2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuickWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtRemoteObjects.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScript.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScriptTools.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScxml.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSensors.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSerialPort.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSql.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSvg.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtTest.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtTextToSpeech.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtUiTools.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebChannel.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngine.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngineCore.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngineWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebKit.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebKitWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebSockets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWinExtras.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtX11Extras.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtXml.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtXmlPatterns.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qwt5.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DAnimation.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DCore.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DExtras.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DInput.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DLogic.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DRender.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtAxContainer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtBluetooth.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtCharts.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtConcurrent.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtCore.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtDBus.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtDataVisualization.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtDesigner.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGraphs.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGraphsWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGui.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtHelp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtHttpServer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtLocation.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtMultimedia.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtMultimediaWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtNetwork.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtNetworkAuth.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtNfc.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtOpenGL.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtOpenGLWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPdf.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPdfWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPositioning.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPrintSupport.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQml.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuick.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuick3D.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuickControls2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuickWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtRemoteObjects.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtScxml.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSensors.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSerialBus.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSerialPort.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSpatialAudio.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSql.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtStateMachine.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSvg.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSvgWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtTest.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtTextToSpeech.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtUiTools.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebChannel.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineCore.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineQuick.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebSockets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtXml.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-_pyi_rth_utils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-_tkinter.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-babel.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-difflib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.command.check.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.util.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.contrib.sessions.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.cache.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.mail.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.management.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.db.backends.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.db.backends.mysql.base.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.db.backends.oracle.base.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.template.loaders.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-encodings.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gevent.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Adw.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.AppIndicator3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Atk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.AyatanaAppIndicator3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Champlain.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Clutter.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.DBus.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GIRepository.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GLib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GModule.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GObject.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gdk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GdkPixbuf.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gio.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Graphene.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gsk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gst.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstAllocators.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstApp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstAudio.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstBadAudio.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstBase.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstCheck.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstCodecs.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstController.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGL.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLEGL.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLWayland.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLX11.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstInsertBin.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstMpegts.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstNet.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPbutils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPlay.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPlayer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtsp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtspServer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstSdp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstTag.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstTranscoder.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVideo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkan.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkanWayland.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkanXCB.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstWebRTC.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gtk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkChamplain.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkClutter.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkSource.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkosxApplication.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.HarfBuzz.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Pango.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.PangoCairo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.cairo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.freetype2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.xlib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-heapq.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-idlelib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-importlib_metadata.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-importlib_resources.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-keyring.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-kivy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-lib2to3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backend_bases.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.backend_qtagg.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.backend_qtcairo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.qt_compat.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.numerix.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.pyplot.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-multiprocessing.util.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-numpy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-packaging.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.io.clipboard.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.io.formats.style.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.plotting.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pickle.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pkg_resources.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-platform.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pygments.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pytz.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pytzdata.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-qtawesome.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-qtpy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scapy.layers.all.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.io.matlab.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.linalg.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.sparse.csgraph.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.spatial.transform.rotation.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.special._ellip_harm_2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.special._ufuncs.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.stats._stats.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scrapy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools._vendor.importlib_metadata.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools._vendor.jaraco.text.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-shelve.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-shiboken6.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-sphinx.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-sqlalchemy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-sqlite3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-sysconfig.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-wcwidth.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-win32ctypes.core.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-xml.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-xml.dom.domreg.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-xml.etree.cElementTree.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-zope.interface.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.Image.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.ImageFilter.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.SpiderImagePlugin.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QAxContainer.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qsci.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DAnimation.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DCore.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DExtras.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DInput.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DLogic.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DRender.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtBluetooth.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtChart.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtCore.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtDBus.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtDataVisualization.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtDesigner.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtGui.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtHelp.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtLocation.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtMacExtras.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtMultimedia.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtMultimediaWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtNetwork.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtNetworkAuth.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtNfc.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtOpenGL.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtPositioning.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtPrintSupport.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtPurchasing.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQml.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuick.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuick3D.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuickWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtRemoteObjects.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtScript.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSensors.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSerialPort.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSql.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSvg.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtTest.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtTextToSpeech.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebChannel.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngine.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngineCore.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngineWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebKit.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebKitWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebSockets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWinExtras.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtX11Extras.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtXml.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtXmlPatterns.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.uic.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QAxContainer.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qsci.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DAnimation.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DCore.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DExtras.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DInput.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DLogic.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DRender.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtBluetooth.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtCharts.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtCore.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtDBus.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtDataVisualization.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtDesigner.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtGui.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtHelp.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtMultimedia.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtMultimediaWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtNetwork.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtNetworkAuth.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtNfc.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtOpenGL.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtOpenGLWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPdf.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPdfWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPositioning.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPrintSupport.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQml.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuick.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuick3D.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuickWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtRemoteObjects.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSensors.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSerialPort.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSpatialAudio.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSql.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSvg.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSvgWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtTest.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtTextToSpeech.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebChannel.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineCore.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineQuick.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebSockets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtXml.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.uic.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DAnimation.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DCore.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DExtras.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DInput.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DLogic.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DRender.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtAxContainer.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtCharts.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtConcurrent.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtCore.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtDataVisualization.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtGui.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtHelp.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtLocation.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtMacExtras.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtMultimedia.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtMultimediaWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtNetwork.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtOpenGL.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtOpenGLFunctions.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtPositioning.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtPrintSupport.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQml.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQuick.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQuickControls2.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQuickWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtRemoteObjects.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtScript.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtScriptTools.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtScxml.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSensors.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSerialPort.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSql.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSvg.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtTest.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtTextToSpeech.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtUiTools.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebChannel.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngine.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngineCore.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngineWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebKit.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebKitWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebSockets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWinExtras.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtX11Extras.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtXml.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtXmlPatterns.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qwt5.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DAnimation.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DCore.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DExtras.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DInput.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DLogic.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DRender.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtAxContainer.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtBluetooth.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtCharts.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtConcurrent.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtCore.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtDBus.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtDataVisualization.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtDesigner.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtGraphs.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtGraphsWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtGui.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtHelp.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtHttpServer.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtLocation.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtMultimedia.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtMultimediaWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtNetwork.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtNetworkAuth.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtNfc.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtOpenGL.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtOpenGLWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPdf.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPdfWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPositioning.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPrintSupport.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQml.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuick.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuick3D.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuickControls2.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuickWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtRemoteObjects.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtScxml.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSensors.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSerialBus.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSerialPort.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSpatialAudio.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSql.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtStateMachine.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSvg.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSvgWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtTest.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtTextToSpeech.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtUiTools.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebChannel.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineCore.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineQuick.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebSockets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWidgets.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtXml.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-_pyi_rth_utils.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-_tkinter.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-babel.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-difflib.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-distutils.command.check.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-distutils.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-distutils.util.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-django.contrib.sessions.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-django.core.cache.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-django.core.mail.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-django.core.management.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-django.db.backends.mysql.base.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-django.db.backends.oracle.base.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-django.db.backends.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-django.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-django.template.loaders.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-encodings.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gevent.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Adw.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.AppIndicator3.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Atk.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.AyatanaAppIndicator3.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Champlain.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Clutter.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.DBus.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GIRepository.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GLib.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GModule.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GObject.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gdk.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GdkPixbuf.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gio.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Graphene.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gsk.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gst.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstAllocators.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstApp.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstAudio.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstBadAudio.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstBase.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstCheck.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstCodecs.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstController.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGL.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLEGL.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLWayland.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLX11.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstInsertBin.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstMpegts.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstNet.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstPbutils.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstPlay.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstPlayer.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtp.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtsp.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtspServer.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstSdp.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstTag.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstTranscoder.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVideo.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkan.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkanWayland.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkanXCB.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstWebRTC.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gtk.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkChamplain.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkClutter.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkSource.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkosxApplication.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.HarfBuzz.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Pango.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.PangoCairo.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.cairo.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.freetype2.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.xlib.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-heapq.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-idlelib.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-importlib_metadata.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-importlib_resources.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-keyring.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-kivy.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-lib2to3.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backend_bases.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.backend_qtagg.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.backend_qtcairo.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.qt_compat.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.numerix.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.pyplot.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-multiprocessing.util.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-numpy.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-packaging.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.io.clipboard.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.io.formats.style.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.plotting.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-pickle.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-pkg_resources.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-platform.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-pygments.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-pytz.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-pytzdata.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-qtawesome.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-qtpy.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-scapy.layers.all.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.io.matlab.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.linalg.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.sparse.csgraph.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.spatial.transform.rotation.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.special._ellip_harm_2.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.special._ufuncs.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.stats._stats.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-scrapy.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-setuptools._vendor.importlib_metadata.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-setuptools._vendor.jaraco.text.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-setuptools.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-shelve.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-shiboken6.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-sphinx.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-sqlalchemy.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-sqlite3.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-sysconfig.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-wcwidth.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-win32ctypes.core.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-xml.dom.domreg.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-xml.etree.cElementTree.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-xml.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/hook-zope.interface.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-PyQt5.uic.port_v2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-_pyi_rth_utils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-distutils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-pyi_splash.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-tkinter.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/hook-PyQt5.uic.port_v2.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/hook-_pyi_rth_utils.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/hook-distutils.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/hook-pyi_splash.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/hook-tkinter.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-autocommand.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-backports.tarfile.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-distutils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Adw.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.AppIndicator3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Atk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.AyatanaAppIndicator3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Champlain.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Clutter.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.DBus.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GIRepository.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GLib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GModule.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GObject.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gdk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GdkPixbuf.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gio.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Graphene.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gsk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gst.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstAllocators.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstApp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstAudio.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstBadAudio.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstBase.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstCheck.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstCodecs.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstController.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGL.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLEGL.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLWayland.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLX11.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstInsertBin.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstMpegts.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstNet.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPbutils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPlay.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPlayer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtsp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtspServer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstSdp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstTag.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstTranscoder.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVideo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkan.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkanWayland.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkanXCB.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstWebRTC.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gtk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkChamplain.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkClutter.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkSource.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkosxApplication.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.HarfBuzz.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Pango.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.PangoCairo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.cairo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.freetype2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.xlib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-importlib_metadata.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-importlib_resources.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-inflect.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.context.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.functools.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.text.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-more_itertools.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-ordered_set.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-packaging.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-platformdirs.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-setuptools.extern.six.moves.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-six.moves.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-tomli.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-typeguard.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-typing_extensions.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-urllib3.packages.six.moves.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-wheel.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-zipp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-autocommand.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-backports.tarfile.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-distutils.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Adw.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AppIndicator3.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Atk.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AyatanaAppIndicator3.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Champlain.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Clutter.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.DBus.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GIRepository.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GLib.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GModule.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GObject.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gdk.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GdkPixbuf.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gio.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Graphene.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gsk.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gst.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAllocators.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstApp.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAudio.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBadAudio.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBase.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCheck.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCodecs.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstController.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGL.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLEGL.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLWayland.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLX11.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstInsertBin.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstMpegts.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstNet.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPbutils.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlay.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlayer.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtp.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtsp.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtspServer.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstSdp.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTag.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTranscoder.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVideo.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkan.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanWayland.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanXCB.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstWebRTC.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gtk.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkChamplain.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkClutter.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkSource.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkosxApplication.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.HarfBuzz.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Pango.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.PangoCairo.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.cairo.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.freetype2.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.xlib.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-importlib_metadata.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-importlib_resources.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-inflect.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.context.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.functools.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.text.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-more_itertools.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-ordered_set.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-packaging.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-platformdirs.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-setuptools.extern.six.moves.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-six.moves.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-tomli.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-typeguard.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-typing_extensions.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-urllib3.packages.six.moves.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-wheel.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-zipp.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks.dat create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth__tkinter.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_django.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gdkpixbuf.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gi.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gio.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_glib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gstreamer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gtk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_inspect.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_kivy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_mplconfig.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_multiprocessing.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pkgres.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pkgutil.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyqt5.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyqt6.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyside2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyside6.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_setuptools.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth__tkinter.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_django.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gdkpixbuf.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gi.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gio.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_glib.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gstreamer.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gtk.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_kivy.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_mplconfig.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgres.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyqt5.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyqt6.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyside2.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyside6.py create mode 100644 venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_setuptools.py create mode 100644 venv/Lib/site-packages/PyInstaller/isolated/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/isolated/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/isolated/__pycache__/_child.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/isolated/__pycache__/_parent.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/isolated/_child.py create mode 100644 venv/Lib/site-packages/PyInstaller/isolated/_parent.py create mode 100644 venv/Lib/site-packages/PyInstaller/lib/README.rst create mode 100644 venv/Lib/site-packages/PyInstaller/lib/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/lib/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/lib/modulegraph/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/lib/modulegraph/__main__.py create mode 100644 venv/Lib/site-packages/PyInstaller/lib/modulegraph/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/lib/modulegraph/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/lib/modulegraph/__pycache__/find_modules.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/lib/modulegraph/__pycache__/modulegraph.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/lib/modulegraph/__pycache__/util.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/lib/modulegraph/find_modules.py create mode 100644 venv/Lib/site-packages/PyInstaller/lib/modulegraph/modulegraph.py create mode 100644 venv/Lib/site-packages/PyInstaller/lib/modulegraph/util.py create mode 100644 venv/Lib/site-packages/PyInstaller/loader/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/loader/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/loader/__pycache__/pyiboot01_bootstrap.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/loader/__pycache__/pyimod01_archive.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/loader/__pycache__/pyimod02_importers.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/loader/__pycache__/pyimod03_ctypes.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/loader/__pycache__/pyimod04_pywin32.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py create mode 100644 venv/Lib/site-packages/PyInstaller/loader/pyimod01_archive.py create mode 100644 venv/Lib/site-packages/PyInstaller/loader/pyimod02_importers.py create mode 100644 venv/Lib/site-packages/PyInstaller/loader/pyimod03_ctypes.py create mode 100644 venv/Lib/site-packages/PyInstaller/loader/pyimod04_pywin32.py create mode 100644 venv/Lib/site-packages/PyInstaller/log.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/__pycache__/conftest.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/__pycache__/misc.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/__pycache__/osx.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/__pycache__/run_tests.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/__pycache__/tests.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/cliutils/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/cliutils/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/cliutils/__pycache__/archive_viewer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/cliutils/__pycache__/bindepend.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/cliutils/__pycache__/grab_version.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/cliutils/__pycache__/makespec.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/cliutils/__pycache__/set_version.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/cliutils/archive_viewer.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/cliutils/bindepend.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/cliutils/grab_version.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/cliutils/makespec.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/cliutils/set_version.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/conftest.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/conda.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/django.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/gi.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/setuptools.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/tcl_tk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/conda.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/django.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/gi.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/qt/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/qt/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/qt/__pycache__/_modules_info.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/qt/_modules_info.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/setuptools.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/hooks/tcl_tk.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/misc.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/osx.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/run_tests.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/tests.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/win32/__init__.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/win32/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/win32/__pycache__/icon.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/win32/__pycache__/versioninfo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/win32/__pycache__/winmanifest.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/win32/__pycache__/winresource.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/win32/__pycache__/winutils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/PyInstaller/utils/win32/icon.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/win32/versioninfo.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/win32/winmanifest.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/win32/winresource.py create mode 100644 venv/Lib/site-packages/PyInstaller/utils/win32/winutils.py create mode 100644 venv/Lib/site-packages/__pycache__/pefile.cpython-311.pyc create mode 100644 venv/Lib/site-packages/__pycache__/peutils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/__init__.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/__pycache__/__init__.cpython-39.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/__pycache__/compat.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/compat.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_find_module_path/__init__.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_find_module_path/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__init__.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/hook-tensorflow.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/hook-win32com.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/hook-tensorflow.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/hook-win32com.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks.dat create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__init__.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_cryptography_openssl.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_enchant.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_ffpyplayer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_findlibs.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_nltk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_osgeo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pygraphviz.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pyproj.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pyqtgraph_multiprocess.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pythoncom.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pywintypes.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_tensorflow.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_traitlets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_usb.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_cryptography_openssl.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_enchant.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_ffpyplayer.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_findlibs.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_nltk.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_osgeo.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pygraphviz.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyproj.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyqtgraph_multiprocess.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pythoncom.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pywintypes.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_tensorflow.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_traitlets.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_usb.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__init__.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-BTrees.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-CTkMessagebox.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Crypto.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Cryptodome.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-HtmlTestRunner.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-IPython.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-OpenGL.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-OpenGL_accelerate.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-PyTaskbar.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Xlib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-_mssql.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-_mysql.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-accessible_output2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adbutils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adios.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-afmformats.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-aliyunsdkcore.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-altair.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-amazonproduct.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-anyio.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-appdirs.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-appy.pod.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-apscheduler.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-argon2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astor.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astroid.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astropy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astropy_iers_data.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-av.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-avro.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-azurerm.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-backports.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-backports.zoneinfo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bacon.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bcrypt.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bitsandbytes.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bleak.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-blspy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bokeh.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-boto.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-boto3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-botocore.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-branca.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cairocffi.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cairosvg.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-capstone.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cassandra.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-celpy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-certifi.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cf_units.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cftime.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-charset_normalizer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cloudpickle.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cloudscraper.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-clr.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-clr_loader.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cmocean.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-compliance_checker.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-comtypes.client.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-countrycode.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-countryinfo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cryptography.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-customtkinter.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cv2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cx_Oracle.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cytoolz.itertoolz.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_bootstrap_components.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_core_components.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_html_components.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_renderer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_table.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_uploader.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dask.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-datasets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dateparser.utils.strptime.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dbus_fast.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dclab.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-detectron2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-discid.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-distorm3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dns.rdata.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docutils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docx.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docx2pdf.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dynaconf.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-easyocr.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eel.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-enchant.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eng_to_ipa.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ens.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-enzyme.parsers.ebml.core.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_abi.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_account.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_hash.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_keyfile.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_keys.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_rlp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_typing.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_utils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_utils.network.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-exchangelib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fabric.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fairscale.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-faker.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-falcon.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fastai.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fastparquet.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ffpyplayer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fiona.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flask_compress.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flask_restx.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flex.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flirpy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fmpy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-folium.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-freetype.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fvcore.nn.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gadfly.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gbulb.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gcloud.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-geopandas.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gitlab.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gmplot.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gmsh.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gooey.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.api_core.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.bigquery.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.core.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.kms_v1.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.pubsub_v1.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.speech.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.storage.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.translate.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-googleapiclient.model.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-grapheme.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-graphql_query.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-great_expectations.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gribapi.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-grpc.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gst._gst.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gtk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-h3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-h5py.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hdf5plugin.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hexbytes.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-httplib2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-humanize.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hydra.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ijson.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imageio.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imageio_ffmpeg.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-iminuit.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-iso639.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-itk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jaraco.text.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jedi.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jieba.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jinja2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jinxed.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jira.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonpath_rw_ext.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonrpcserver.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonschema.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonschema_specifications.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jupyterlab.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-kaleido.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-khmernltk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-kinterbasdb.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langchain.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langcodes.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langdetect.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-laonlp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lark.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ldfparser.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lensfunpy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-libaudioverse.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-librosa.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lightgbm.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lightning.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-limits.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-linear_operator.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lingua.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-litestar.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-llvmlite.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-logilab.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.etree.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.isoschematron.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.objectify.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lz4.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-magic.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mako.codegen.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mariadb.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-markdown.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mecab.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-metpy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-migrate.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mimesis.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-minecraft_launcher_lib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mistune.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mnemonic.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-monai.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-moviepy.audio.fx.all.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-moviepy.video.fx.all.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mpl_toolkits.basemap.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-msoffcrypto.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nacl.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-names.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nanite.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbconvert.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbdime.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbformat.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbt.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ncclient.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-netCDF4.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nltk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nnpy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-notebook.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numba.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numbers_parser.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numcodecs.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cublas.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_cupti.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_nvcc.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_nvrtc.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_runtime.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cudnn.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cufft.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.curand.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cusolver.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cusparse.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nccl.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nvjitlink.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nvtx.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-office365.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-onnxruntime.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-opencc.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-openpyxl.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-opentelemetry.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-orjson.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-osgeo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pandas_flavor.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-panel.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-parsedatetime.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-parso.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-passlib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-paste.exceptions.reporter.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-patoolib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-patsy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pdfminer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pendulum.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-phonenumbers.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pingouin.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pint.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pinyin.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-platformdirs.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-plotly.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pptx.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-prettytable.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psutil.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psychopy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psycopg2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-publicsuffix2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pubsub.core.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-puremagic.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-py.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyarrow.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycountry.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycparser.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycrfsuite.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydantic.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydicom.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydivert.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-io.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-ods.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-ods3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-odsr.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xls.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xlsx.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xlsxw.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_io.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_ods.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_ods3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_odsr.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xls.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xlsx.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xlsxw.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcelerate.Writer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pygraphviz.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pygwalker.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylibmagic.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylint.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylsl.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymediainfo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymorphy3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymssql.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pynput.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyodbc.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyopencl.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypemicro.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyphen.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyppeteer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyproj.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypsexec.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypylon.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyqtgraph.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyshark.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pysnmp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pystray.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pytest.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pythainlp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pythoncom.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyttsx.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyttsx3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyviz_comms.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyvjoy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pywintypes.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pywt.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-qtmodern.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-radicale.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-raven.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rawpy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rdflib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-redmine.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-regex.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-reportlab.lib.utils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-reportlab.pdfbase._fontdata.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-resampy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rlp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rpy2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rtree.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rubicon.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sacremoses.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-saml2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-schwifty.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-seedir.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-selenium.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sentry_sdk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-setuptools_scm.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-shapely.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-shotgun_api3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-simplemma.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.color.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.data.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.draw.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.exposure.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.feature.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.filters.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.future.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.graph.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.io.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.measure.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.metrics.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.morphology.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.registration.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.restoration.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.transform.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.cluster.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.linear_model.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.cluster.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.pairwise.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.neighbors.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.tree.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.utils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skyfield.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-slixmpp.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sound_lib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sounddevice.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-soundfile.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spacy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-speech_recognition.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spiceypy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spnego.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-srsly.msgpack._packer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sspilib.raw.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-statsmodels.tsa.statespace.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-stdnum.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-storm.database.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sudachipy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sunpy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sv_ttk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-swagger_spec_validator.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sympy.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tableauhyperapi.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tables.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tcod.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tensorflow.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-text_unidecode.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-textdistance.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-thinc.backends.numpy_ops.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-thinc.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-timezonefinder.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-timm.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tinycss2.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_cocoa.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_gtk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_winforms.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torch.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchaudio.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchtext.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchvision.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchvision.io.image.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_client.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_code.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_components.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_datagrid.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_deckgl.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_formkit.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_grid.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_iframe.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_keycloak.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_leaflet.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_markdown.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_matplotlib.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_mesh_streamer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_plotly.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_pvui.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_quasar.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_rca.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_router.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_simput.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_tauri.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_tweakpane.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vega.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtk.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtk3d.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtklocal.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vuetify.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_xterm.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-transformers.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-travertino.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trimesh.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-triton.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ttkthemes.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ttkwidgets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tzdata.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tzwhere.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-u1db.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ultralytics.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-umap.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-unidecode.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uniseg.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-usb.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uvicorn.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uvloop.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vaderSentiment.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkpython.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wavefile.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-weasyprint.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-web3.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webassets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webrtcvad.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-websockets.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webview.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-win32com.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wordcloud.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-workflow.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.lib.activex.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.lib.pubsub.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.xrc.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xarray.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xml.dom.html.HTMLDocument.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xml.sax.saxexts.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xmldiff.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xmlschema.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xsge_gui.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xyzservices.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-yapf_third_party.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-z3c.rml.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zeep.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zmq.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zoneinfo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-BTrees.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-CTkMessagebox.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-Crypto.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-Cryptodome.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-HtmlTestRunner.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-IPython.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-OpenGL.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-OpenGL_accelerate.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-PyTaskbar.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-Xlib.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-_mssql.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-_mysql.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-accessible_output2.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-adbutils.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-adios.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-afmformats.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-aliyunsdkcore.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-altair.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-amazonproduct.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-anyio.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-appdirs.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-appy.pod.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-apscheduler.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-argon2.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astor.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astroid.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astropy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-astropy_iers_data.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-av.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-avro.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-azurerm.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-backports.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-backports.zoneinfo.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bacon.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bcrypt.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bitsandbytes.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bleak.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-blspy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-bokeh.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-boto.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-boto3.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-botocore.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-branca.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cairocffi.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cairosvg.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-capstone.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cassandra.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-celpy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-certifi.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cf_units.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cftime.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-charset_normalizer.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cloudpickle.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cloudscraper.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-clr.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-clr_loader.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cmocean.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-compliance_checker.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-comtypes.client.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-countrycode.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-countryinfo.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cryptography.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-customtkinter.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cv2.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cx_Oracle.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-cytoolz.itertoolz.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_bootstrap_components.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_core_components.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_html_components.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_renderer.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_table.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dash_uploader.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dask.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-datasets.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dateparser.utils.strptime.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dbus_fast.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dclab.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-detectron2.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-discid.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-distorm3.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dns.rdata.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-docutils.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-docx.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-docx2pdf.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-dynaconf.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-easyocr.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eel.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-enchant.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eng_to_ipa.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ens.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-enzyme.parsers.ebml.core.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_abi.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_account.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_hash.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_keyfile.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_keys.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_rlp.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_typing.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_utils.network.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-eth_utils.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-exchangelib.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fabric.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fairscale.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-faker.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-falcon.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fastai.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fastparquet.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ffpyplayer.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fiona.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flask_compress.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flask_restx.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flex.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-flirpy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fmpy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-folium.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-freetype.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-fvcore.nn.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gadfly.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gbulb.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gcloud.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-geopandas.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gitlab.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gmplot.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gmsh.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gooey.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.api_core.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.bigquery.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.core.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.kms_v1.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.pubsub_v1.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.speech.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.storage.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.translate.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-googleapiclient.model.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-grapheme.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-graphql_query.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-great_expectations.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gribapi.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-grpc.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gst._gst.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-gtk.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-h3.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-h5py.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-hdf5plugin.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-hexbytes.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-httplib2.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-humanize.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-hydra.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ijson.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-imageio.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-imageio_ffmpeg.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-iminuit.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-iso639.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-itk.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jaraco.text.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jedi.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jieba.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jinja2.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jinxed.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jira.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonpath_rw_ext.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonrpcserver.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonschema.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jsonschema_specifications.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-jupyterlab.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-kaleido.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-khmernltk.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-kinterbasdb.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langchain.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langcodes.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-langdetect.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-laonlp.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lark.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ldfparser.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lensfunpy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-libaudioverse.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-librosa.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lightgbm.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lightning.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-limits.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-linear_operator.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lingua.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-litestar.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-llvmlite.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-logilab.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.etree.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.isoschematron.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.objectify.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lxml.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-lz4.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-magic.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mako.codegen.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mariadb.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-markdown.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mecab.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-metpy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-migrate.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mimesis.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-minecraft_launcher_lib.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mistune.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mnemonic.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-monai.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-moviepy.audio.fx.all.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-moviepy.video.fx.all.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-mpl_toolkits.basemap.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-msoffcrypto.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nacl.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-names.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nanite.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbconvert.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbdime.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbformat.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nbt.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ncclient.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-netCDF4.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nltk.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nnpy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-notebook.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-numba.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-numbers_parser.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-numcodecs.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cublas.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_cupti.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_nvcc.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_nvrtc.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_runtime.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cudnn.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cufft.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.curand.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cusolver.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cusparse.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nccl.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nvjitlink.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nvtx.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-office365.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-onnxruntime.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-opencc.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-openpyxl.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-opentelemetry.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-orjson.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-osgeo.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pandas_flavor.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-panel.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-parsedatetime.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-parso.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-passlib.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-paste.exceptions.reporter.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-patoolib.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-patsy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pdfminer.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pendulum.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-phonenumbers.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pingouin.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pint.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pinyin.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-platformdirs.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-plotly.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pptx.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-prettytable.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psutil.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psychopy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-psycopg2.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-publicsuffix2.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pubsub.core.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-puremagic.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-py.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyarrow.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pycountry.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pycparser.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pycrfsuite.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pydantic.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pydicom.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pydivert.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-io.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-ods.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-ods3.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-odsr.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xls.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xlsx.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xlsxw.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_io.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_ods.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_ods3.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_odsr.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xls.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xlsx.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xlsxw.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyexcelerate.Writer.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pygraphviz.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pygwalker.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pylibmagic.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pylint.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pylsl.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymediainfo.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymorphy3.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pymssql.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pynput.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyodbc.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyopencl.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypemicro.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyphen.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyppeteer.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyproj.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypsexec.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pypylon.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyqtgraph.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyshark.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pysnmp.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pystray.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pytest.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pythainlp.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pythoncom.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyttsx.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyttsx3.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyviz_comms.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pyvjoy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pywintypes.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-pywt.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-qtmodern.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-radicale.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-raven.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rawpy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rdflib.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-redmine.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-regex.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-reportlab.lib.utils.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-reportlab.pdfbase._fontdata.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-resampy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rlp.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rpy2.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rtree.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-rubicon.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sacremoses.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-saml2.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-schwifty.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-seedir.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-selenium.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sentry_sdk.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-setuptools_scm.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-shapely.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-shotgun_api3.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-simplemma.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.color.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.data.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.draw.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.exposure.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.feature.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.filters.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.future.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.graph.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.io.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.measure.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.metrics.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.morphology.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.registration.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.restoration.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skimage.transform.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.cluster.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.linear_model.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.cluster.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.pairwise.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.neighbors.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.tree.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.utils.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-skyfield.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-slixmpp.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sound_lib.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sounddevice.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-soundfile.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-spacy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-speech_recognition.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-spiceypy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-spnego.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-srsly.msgpack._packer.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sspilib.raw.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-statsmodels.tsa.statespace.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-stdnum.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-storm.database.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sudachipy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sunpy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sv_ttk.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-swagger_spec_validator.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-sympy.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tableauhyperapi.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tables.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tcod.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tensorflow.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-text_unidecode.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-textdistance.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-thinc.backends.numpy_ops.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-thinc.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-timezonefinder.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-timm.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tinycss2.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga_cocoa.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga_gtk.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-toga_winforms.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torch.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchaudio.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchtext.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchvision.io.image.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-torchvision.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_client.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_code.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_components.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_datagrid.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_deckgl.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_formkit.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_grid.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_iframe.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_keycloak.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_leaflet.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_markdown.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_matplotlib.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_mesh_streamer.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_plotly.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_pvui.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_quasar.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_rca.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_router.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_simput.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_tauri.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_tweakpane.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vega.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtk.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtk3d.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtklocal.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_vuetify.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trame_xterm.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-transformers.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-travertino.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-trimesh.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-triton.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ttkthemes.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ttkwidgets.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tzdata.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-tzwhere.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-u1db.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-ultralytics.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-umap.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-unidecode.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uniseg.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-usb.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uvicorn.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-uvloop.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vaderSentiment.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-vtkpython.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wavefile.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-weasyprint.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-web3.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-webassets.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-webrtcvad.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-websockets.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-webview.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-win32com.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wordcloud.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-workflow.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wx.lib.activex.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wx.lib.pubsub.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-wx.xrc.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xarray.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xml.dom.html.HTMLDocument.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xml.sax.saxexts.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xmldiff.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xmlschema.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xsge_gui.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-xyzservices.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-yapf_third_party.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-z3c.rml.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zeep.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zmq.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/hook-zoneinfo.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/utils/__init__.py create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/utils/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/utils/__pycache__/nvidia_cuda.cpython-311.pyc create mode 100644 venv/Lib/site-packages/_pyinstaller_hooks_contrib/utils/nvidia_cuda.py rename venv/Lib/site-packages/{pip-24.2.dist-info => altgraph-0.17.4.dist-info}/INSTALLER (100%) create mode 100644 venv/Lib/site-packages/altgraph-0.17.4.dist-info/LICENSE create mode 100644 venv/Lib/site-packages/altgraph-0.17.4.dist-info/METADATA create mode 100644 venv/Lib/site-packages/altgraph-0.17.4.dist-info/RECORD create mode 100644 venv/Lib/site-packages/altgraph-0.17.4.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/altgraph-0.17.4.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/altgraph-0.17.4.dist-info/zip-safe create mode 100644 venv/Lib/site-packages/altgraph/Dot.py create mode 100644 venv/Lib/site-packages/altgraph/Graph.py create mode 100644 venv/Lib/site-packages/altgraph/GraphAlgo.py create mode 100644 venv/Lib/site-packages/altgraph/GraphStat.py create mode 100644 venv/Lib/site-packages/altgraph/GraphUtil.py create mode 100644 venv/Lib/site-packages/altgraph/ObjectGraph.py create mode 100644 venv/Lib/site-packages/altgraph/__init__.py create mode 100644 venv/Lib/site-packages/altgraph/__pycache__/Dot.cpython-311.pyc create mode 100644 venv/Lib/site-packages/altgraph/__pycache__/Graph.cpython-311.pyc create mode 100644 venv/Lib/site-packages/altgraph/__pycache__/GraphAlgo.cpython-311.pyc create mode 100644 venv/Lib/site-packages/altgraph/__pycache__/GraphStat.cpython-311.pyc create mode 100644 venv/Lib/site-packages/altgraph/__pycache__/GraphUtil.cpython-311.pyc create mode 100644 venv/Lib/site-packages/altgraph/__pycache__/ObjectGraph.cpython-311.pyc create mode 100644 venv/Lib/site-packages/altgraph/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/ordlookup/__init__.py create mode 100644 venv/Lib/site-packages/ordlookup/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/ordlookup/__pycache__/oleaut32.cpython-311.pyc create mode 100644 venv/Lib/site-packages/ordlookup/__pycache__/ws2_32.cpython-311.pyc create mode 100644 venv/Lib/site-packages/ordlookup/oleaut32.py create mode 100644 venv/Lib/site-packages/ordlookup/ws2_32.py rename venv/Lib/site-packages/{pip-24.2.dist-info/top_level.txt => packaging-24.2.dist-info/INSTALLER} (100%) create mode 100644 venv/Lib/site-packages/packaging-24.2.dist-info/LICENSE create mode 100644 venv/Lib/site-packages/packaging-24.2.dist-info/LICENSE.APACHE create mode 100644 venv/Lib/site-packages/packaging-24.2.dist-info/LICENSE.BSD create mode 100644 venv/Lib/site-packages/packaging-24.2.dist-info/METADATA create mode 100644 venv/Lib/site-packages/packaging-24.2.dist-info/RECORD create mode 100644 venv/Lib/site-packages/packaging-24.2.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/packaging/__init__.py create mode 100644 venv/Lib/site-packages/packaging/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/__pycache__/_elffile.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/__pycache__/_manylinux.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/__pycache__/_musllinux.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/__pycache__/_parser.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/__pycache__/_structures.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/__pycache__/_tokenizer.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/__pycache__/markers.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/__pycache__/metadata.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/__pycache__/requirements.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/__pycache__/specifiers.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/__pycache__/tags.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/__pycache__/utils.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/__pycache__/version.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/_elffile.py create mode 100644 venv/Lib/site-packages/packaging/_manylinux.py create mode 100644 venv/Lib/site-packages/packaging/_musllinux.py create mode 100644 venv/Lib/site-packages/packaging/_parser.py create mode 100644 venv/Lib/site-packages/packaging/_structures.py create mode 100644 venv/Lib/site-packages/packaging/_tokenizer.py create mode 100644 venv/Lib/site-packages/packaging/licenses/__init__.py create mode 100644 venv/Lib/site-packages/packaging/licenses/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/licenses/__pycache__/_spdx.cpython-311.pyc create mode 100644 venv/Lib/site-packages/packaging/licenses/_spdx.py create mode 100644 venv/Lib/site-packages/packaging/markers.py create mode 100644 venv/Lib/site-packages/packaging/metadata.py rename venv/Lib/site-packages/{pip-24.2.dist-info/REQUESTED => packaging/py.typed} (100%) create mode 100644 venv/Lib/site-packages/packaging/requirements.py create mode 100644 venv/Lib/site-packages/packaging/specifiers.py create mode 100644 venv/Lib/site-packages/packaging/tags.py create mode 100644 venv/Lib/site-packages/packaging/utils.py create mode 100644 venv/Lib/site-packages/packaging/version.py create mode 100644 venv/Lib/site-packages/pefile-2023.2.7.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/pefile-2023.2.7.dist-info/LICENSE create mode 100644 venv/Lib/site-packages/pefile-2023.2.7.dist-info/METADATA create mode 100644 venv/Lib/site-packages/pefile-2023.2.7.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pefile-2023.2.7.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/pefile-2023.2.7.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/pefile.py create mode 100644 venv/Lib/site-packages/peutils.py rename venv/Lib/site-packages/{pip-24.2.dist-info => pip-24.3.1.dist-info}/AUTHORS.txt (99%) create mode 100644 venv/Lib/site-packages/pip-24.3.1.dist-info/INSTALLER rename venv/Lib/site-packages/{pip-24.2.dist-info => pip-24.3.1.dist-info}/LICENSE.txt (100%) rename venv/Lib/site-packages/{pip-24.2.dist-info => pip-24.3.1.dist-info}/METADATA (98%) rename venv/Lib/site-packages/{pip-24.2.dist-info => pip-24.3.1.dist-info}/RECORD (92%) create mode 100644 venv/Lib/site-packages/pip-24.3.1.dist-info/REQUESTED rename venv/Lib/site-packages/{pip-24.2.dist-info => pip-24.3.1.dist-info}/WHEEL (65%) rename venv/Lib/site-packages/{pip-24.2.dist-info => pip-24.3.1.dist-info}/entry_points.txt (100%) create mode 100644 venv/Lib/site-packages/pip-24.3.1.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/COPYING.txt create mode 100644 venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/METADATA create mode 100644 venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/LICENSE create mode 100644 venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/METADATA create mode 100644 venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/LICENSE.txt create mode 100644 venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/METADATA create mode 100644 venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/win32ctypes/__init__.py create mode 100644 venv/Lib/site-packages/win32ctypes/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/__pycache__/pywintypes.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/__pycache__/version.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/__pycache__/win32api.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/__pycache__/win32cred.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/__init__.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/__pycache__/_winerrors.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/__pycache__/compat.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/_winerrors.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/__init__.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_authentication.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_common.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_dll.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_nl_support.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_resource.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_system_information.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_time.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_util.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/_authentication.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/_common.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/_dll.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/_nl_support.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/_resource.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/_system_information.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/_time.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/cffi/_util.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/compat.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/__init__.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_authentication.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_common.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_dll.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_nl_support.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_resource.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_system_information.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_time.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_util.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/_authentication.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/_common.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/_dll.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/_nl_support.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/_resource.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/_system_information.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/_time.py create mode 100644 venv/Lib/site-packages/win32ctypes/core/ctypes/_util.py create mode 100644 venv/Lib/site-packages/win32ctypes/pywin32/__init__.py create mode 100644 venv/Lib/site-packages/win32ctypes/pywin32/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/pywin32/__pycache__/pywintypes.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/pywin32/__pycache__/win32api.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/pywin32/__pycache__/win32cred.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/pywin32/pywintypes.py create mode 100644 venv/Lib/site-packages/win32ctypes/pywin32/win32api.py create mode 100644 venv/Lib/site-packages/win32ctypes/pywin32/win32cred.py create mode 100644 venv/Lib/site-packages/win32ctypes/pywintypes.py create mode 100644 venv/Lib/site-packages/win32ctypes/tests/__init__.py create mode 100644 venv/Lib/site-packages/win32ctypes/tests/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/tests/__pycache__/test_backends.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/tests/__pycache__/test_win32api.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/tests/__pycache__/test_win32cred.cpython-311.pyc create mode 100644 venv/Lib/site-packages/win32ctypes/tests/test_backends.py create mode 100644 venv/Lib/site-packages/win32ctypes/tests/test_win32api.py create mode 100644 venv/Lib/site-packages/win32ctypes/tests/test_win32cred.py create mode 100644 venv/Lib/site-packages/win32ctypes/version.py create mode 100644 venv/Lib/site-packages/win32ctypes/win32api.py create mode 100644 venv/Lib/site-packages/win32ctypes/win32cred.py create mode 100644 venv/Scripts/pyi-archive_viewer.exe create mode 100644 venv/Scripts/pyi-bindepend.exe create mode 100644 venv/Scripts/pyi-grab_version.exe create mode 100644 venv/Scripts/pyi-makespec.exe create mode 100644 venv/Scripts/pyi-set_version.exe create mode 100644 venv/Scripts/pyinstaller.exe create mode 100644 windows_module_compile.bat diff --git a/.gitignore b/.gitignore index 08a5b84..bc9bb7d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -/downloads \ No newline at end of file +/downloads +/build +/dist \ No newline at end of file diff --git a/run.py b/run.py index 7a8b2e4..fd831cb 100644 --- a/run.py +++ b/run.py @@ -10,6 +10,8 @@ debug_html = join(sys.path[0],"debug.html") debug_html_ch = join(sys.path[0],"debug_ch.html") +start_time = time.time() + #https://stackoverflow.com/questions/14587728/what-does-this-error-in-beautiful-soup-means user_agent_list = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36", @@ -61,7 +63,7 @@ def onechapter(web, headers, output_dir): time.sleep(1) print("Xong.") -def allchapters(web, headers, domain): +def allchapters(web, headers, domain, parts_only=False, part_start = int(), part_end = int()): res = requests.get(web,headers=headers) html_content = res.text soup = BeautifulSoup(html_content, 'html.parser') @@ -81,8 +83,13 @@ def allchapters(web, headers, domain): title = re.sub(r'\s+', ' ', h1_tag.text).strip() print(title) output_dir = join(sys.path[0],"downloads",title) - for link in chapters: - onechapter(link, headers, output_dir) + if parts_only: + for x in range(part_start, part_end): + link = chapters[x-1] + onechapter(link, headers, output_dir) + else: + for link in chapters: + onechapter(link, headers, output_dir) web = str(input("Nhập đường link của truyện: ")) print("**!** Tool còn nhiều hạn chế, và mình sẽ luôn cố gắng cập nhật để bắt kịp với trang web.") @@ -107,5 +114,28 @@ def allchapters(web, headers, domain): output_dir = '' onechapter(web, headers, output_dir) else: - print("Có vẻ như đây là đường link của cả một truyện. Tiến hành tải tất cả chương mà truyện hiện có...") - allchapters(web, headers, domain) \ No newline at end of file + print("Có vẻ như đây là đường link của cả một truyện.") + print("Bạn muốn tải tất cả các chương truyện hiện có hay chỉ một phần?") + choose = input("(T) Toàn Bộ - (M) Một Phần: ") + if choose == "T": + print("Bạn đã chọn tải toàn bộ các chương truyện.") + print("Tiến hành tải tất cả chương mà truyện hiện có...") + allchapters(web, headers, domain) + elif choose == "M": + print("Bạn đã chọn tải một phần của truyện.") + print("Xin hãy nhập phần các chương bạn muốn tải:") + print("""Ví dụ: + Đầu: 60 + Cuối: 100 + Vậy chương trình sẽ tiến hành tải các chương từ 60 đến 100. + """) + part_start = int(input("Đầu: ")) + part_end = int(input("Cuối: ")) + print("Tiến hành tải tất cả chương trong phần được chỉ định...") + allchapters(web, headers, domain,parts_only=True,part_start=part_start,part_end=part_end) + +end_time = time.time() +elapsed_time = end_time - start_time +print(f"Thời gian chạy: {elapsed_time} giây") +print("Tất cả đã hoàn thành!") +input("Nhấn Enter để tiếp tục...") \ No newline at end of file diff --git a/run.spec b/run.spec new file mode 100644 index 0000000..e8fe9ce --- /dev/null +++ b/run.spec @@ -0,0 +1,38 @@ +# -*- mode: python ; coding: utf-8 -*- + + +a = Analysis( + ['run.py'], + pathex=[], + binaries=[], + datas=[], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.datas, + [], + name='run', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=True, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) diff --git a/venv/Lib/site-packages/PyInstaller/__init__.py b/venv/Lib/site-packages/PyInstaller/__init__.py new file mode 100644 index 0000000..13ce621 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/__init__.py @@ -0,0 +1,44 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +__all__ = ('HOMEPATH', 'PLATFORM', '__version__', 'DEFAULT_DISTPATH', 'DEFAULT_SPECPATH', 'DEFAULT_WORKPATH') + +import os + +from PyInstaller import compat + +# Note: Keep this variable as plain string so it could be updated automatically when doing a release. +__version__ = '6.11.1' + +# Absolute path of this package's directory. Save this early so all submodules can use the absolute path. This is +# required for example if the current directory changes prior to loading the hooks. +PACKAGEPATH = os.path.abspath(os.path.dirname(__file__)) + +HOMEPATH = os.path.dirname(PACKAGEPATH) + +# Default values of paths where to put files created by PyInstaller. If changing these, do not forget to update the +# help text for corresponding command-line options, defined in build_main. + +# Where to put created .spec file. +DEFAULT_SPECPATH = os.getcwd() +# Where to put the final frozen application. +DEFAULT_DISTPATH = os.path.join(os.getcwd(), 'dist') +# Where to put all the temporary files; .log, .pyz, etc. +DEFAULT_WORKPATH = os.path.join(os.getcwd(), 'build') + +PLATFORM = compat.system + '-' + compat.architecture +# Include machine name in path to bootloader for some machines (e.g., 'arm'). Explicitly avoid doing this on macOS, +# where we keep universal2 bootloaders in Darwin-64bit folder regardless of whether we are on x86_64 or arm64. +if compat.machine and not compat.is_darwin: + PLATFORM += '-' + compat.machine +# Similarly, disambiguate musl Linux from glibc Linux. +if compat.is_musl: + PLATFORM += '-musl' diff --git a/venv/Lib/site-packages/PyInstaller/__main__.py b/venv/Lib/site-packages/PyInstaller/__main__.py new file mode 100644 index 0000000..9814748 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/__main__.py @@ -0,0 +1,321 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Main command-line interface to PyInstaller. +""" +from __future__ import annotations + +import argparse +import os +import platform +import sys +import pathlib +from collections import defaultdict + +from PyInstaller import __version__ +from PyInstaller import log as logging +# Note: do not import anything else until compat.check_requirements function is run! +from PyInstaller import compat + +try: + from argcomplete import autocomplete +except ImportError: + + def autocomplete(parser): + return None + + +logger = logging.getLogger(__name__) + +# Taken from https://stackoverflow.com/a/22157136 to format args more flexibly: any help text which beings with ``R|`` +# will have all newlines preserved; the help text will be line wrapped. See +# https://docs.python.org/3/library/argparse.html#formatter-class. + + +# This is used by the ``--debug`` option. +class _SmartFormatter(argparse.HelpFormatter): + def _split_lines(self, text, width): + if text.startswith('R|'): + # The underlying implementation of ``RawTextHelpFormatter._split_lines`` invokes this; mimic it. + return text[2:].splitlines() + else: + # Invoke the usual formatter. + return super()._split_lines(text, width) + + +def run_makespec(filenames, **opts): + # Split pathex by using the path separator + temppaths = opts['pathex'][:] + pathex = opts['pathex'] = [] + for p in temppaths: + pathex.extend(p.split(os.pathsep)) + + import PyInstaller.building.makespec + + spec_file = PyInstaller.building.makespec.main(filenames, **opts) + logger.info('wrote %s' % spec_file) + return spec_file + + +def run_build(pyi_config, spec_file, **kwargs): + import PyInstaller.building.build_main + PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs) + + +def __add_options(parser): + parser.add_argument( + '-v', + '--version', + action='version', + version=__version__, + help='Show program version info and exit.', + ) + + +class _PyiArgumentParser(argparse.ArgumentParser): + def __init__(self, *args, **kwargs): + self._pyi_action_groups = defaultdict(list) + super().__init__(*args, **kwargs) + + def _add_options(self, __add_options: callable, name: str = ""): + """ + Mutate self with the given callable, storing any new actions added in a named group + """ + n_actions_before = len(getattr(self, "_actions", [])) + __add_options(self) # preserves old behavior + new_actions = getattr(self, "_actions", [])[n_actions_before:] + self._pyi_action_groups[name].extend(new_actions) + + def _option_name(self, action): + """ + Get the option name(s) associated with an action + + For options that define both short and long names, this function will + return the long names joined by "/" + """ + longnames = [name for name in action.option_strings if name.startswith("--")] + if longnames: + name = "/".join(longnames) + else: + name = action.option_strings[0] + return name + + def _forbid_options(self, args: argparse.Namespace, group: str, errmsg: str = ""): + """Forbid options from a named action group""" + options = defaultdict(str) + for action in self._pyi_action_groups[group]: + dest = action.dest + name = self._option_name(action) + if getattr(args, dest) is not self.get_default(dest): + if dest in options: + options[dest] += "/" + options[dest] += name + + # if any options from the forbidden group are not the default values, + # the user must have passed them in, so issue an error report + if options: + sep = "\n " + bad = sep.join(options.values()) + if errmsg: + errmsg = "\n" + errmsg + raise SystemExit(f"option(s) not allowed:{sep}{bad}{errmsg}") + + +def generate_parser() -> _PyiArgumentParser: + """ + Build an argparse parser for PyInstaller's main CLI. + """ + + import PyInstaller.building.build_main + import PyInstaller.building.makespec + import PyInstaller.log + + parser = _PyiArgumentParser(formatter_class=_SmartFormatter) + parser.prog = "pyinstaller" + + parser._add_options(__add_options) + parser._add_options(PyInstaller.building.makespec.__add_options, name="makespec") + parser._add_options(PyInstaller.building.build_main.__add_options, name="build_main") + parser._add_options(PyInstaller.log.__add_options, name="log") + + parser.add_argument( + 'filenames', + metavar='scriptname', + nargs='+', + help="Name of scriptfiles to be processed or exactly one .spec file. If a .spec file is specified, most " + "options are unnecessary and are ignored.", + ) + + return parser + + +def run(pyi_args: list | None = None, pyi_config: dict | None = None): + """ + pyi_args allows running PyInstaller programmatically without a subprocess + pyi_config allows checking configuration once when running multiple tests + """ + compat.check_requirements() + check_unsafe_privileges() + + import PyInstaller.log + + old_sys_argv = sys.argv + try: + parser = generate_parser() + autocomplete(parser) + if pyi_args is None: + pyi_args = sys.argv[1:] + try: + index = pyi_args.index("--") + except ValueError: + index = len(pyi_args) + args = parser.parse_args(pyi_args[:index]) + spec_args = pyi_args[index + 1:] + PyInstaller.log.__process_options(parser, args) + + # Print PyInstaller version, Python version, and platform as the first line to stdout. This helps us identify + # PyInstaller, Python, and platform version when users report issues. + try: + from _pyinstaller_hooks_contrib import __version__ as contrib_hooks_version + except Exception: + contrib_hooks_version = 'unknown' + + logger.info('PyInstaller: %s, contrib hooks: %s', __version__, contrib_hooks_version) + logger.info('Python: %s%s', platform.python_version(), " (conda)" if compat.is_conda else "") + logger.info('Platform: %s', platform.platform()) + logger.info('Python environment: %s', sys.prefix) + + # Skip creating .spec when .spec file is supplied. + if args.filenames[0].endswith('.spec'): + parser._forbid_options( + args, group="makespec", errmsg="makespec options not valid when a .spec file is given" + ) + spec_file = args.filenames[0] + else: + # Ensure that the given script files exist, before trying to generate the .spec file. + # This prevents us from overwriting an existing (and customized) .spec file if user makes a typo in the + # .spec file's suffix when trying to build it, for example, `pyinstaller program.cpes` (see #8276). + # It also prevents creation of a .spec file when `pyinstaller program.py` is accidentally ran from a + # directory that does not contain the script (for example, due to failing to change the directory prior + # to running the command). + for filename in args.filenames: + if not os.path.isfile(filename): + raise SystemExit(f"Script file {filename!r} does not exist.") + spec_file = run_makespec(**vars(args)) + + sys.argv = [spec_file, *spec_args] + run_build(pyi_config, spec_file, **vars(args)) + + except KeyboardInterrupt: + raise SystemExit("Aborted by user request.") + except RecursionError: + from PyInstaller import _recursion_too_deep_message + _recursion_too_deep_message.raise_with_msg() + finally: + sys.argv = old_sys_argv + + +def _console_script_run(): + # Python prepends the main script's parent directory to sys.path. When PyInstaller is ran via the usual + # `pyinstaller` CLI entry point, this directory is $pythonprefix/bin which should not be in sys.path. + if os.path.basename(sys.path[0]) in ("bin", "Scripts"): + sys.path.pop(0) + run() + + +def check_unsafe_privileges(): + """ + Forbid dangerous usage of PyInstaller with escalated privileges + """ + if compat.is_win and not compat.is_win_wine: + # Discourage (with the intention to eventually block) people using *run as admin* with PyInstaller. + # There are 4 cases, block case 3 but be careful not to also block case 2. + # 1. User has no admin access: TokenElevationTypeDefault + # 2. User is an admin/UAC disabled (common on CI/VMs): TokenElevationTypeDefault + # 3. User has used *run as administrator* to elevate: TokenElevationTypeFull + # 4. User can escalate but hasn't: TokenElevationTypeLimited + # https://techcommunity.microsoft.com/t5/windows-blog-archive/how-to-determine-if-a-user-is-a-member-of-the-administrators/ba-p/228476 + import ctypes + + advapi32 = ctypes.CDLL("Advapi32.dll") + kernel32 = ctypes.CDLL("kernel32.dll") + + kernel32.GetCurrentProcess.restype = ctypes.c_void_p + process = kernel32.GetCurrentProcess() + + token = ctypes.c_void_p() + try: + TOKEN_QUERY = 8 + assert advapi32.OpenProcessToken(ctypes.c_void_p(process), TOKEN_QUERY, ctypes.byref(token)) + + elevation_type = ctypes.c_int() + TokenElevationType = 18 + assert advapi32.GetTokenInformation( + token, TokenElevationType, ctypes.byref(elevation_type), ctypes.sizeof(elevation_type), + ctypes.byref(ctypes.c_int()) + ) + finally: + kernel32.CloseHandle(token) + + if elevation_type.value == 2: # TokenElevationTypeFull + logger.log( + logging.DEPRECATION, + "Running PyInstaller as admin is not necessary nor sensible. Run PyInstaller from a non-administrator " + "terminal. PyInstaller 7.0 will block this." + ) + + elif compat.is_darwin or compat.is_linux: + # Discourage (with the intention to eventually block) people using *sudo* with PyInstaller. + # Again there are 4 cases, block only case 4. + # 1. Non-root: os.getuid() != 0 + # 2. Logged in as root (usually a VM): os.getlogin() == "root", os.getuid() == 0 + # 3. No named users (e.g. most Docker containers): os.getlogin() fails + # 4. Regular user using escalation: os.getlogin() != "root", os.getuid() == 0 + try: + user = os.getlogin() + except OSError: + user = "" + if os.getuid() == 0 and user and user != "root": + logger.log( + logging.DEPRECATION, + "Running PyInstaller as root is not necessary nor sensible. Do not use PyInstaller with sudo. " + "PyInstaller 7.0 will block this." + ) + + if compat.is_win: + # Do not let people run PyInstaller from admin cmd's default working directory (C:\Windows\system32) + cwd = pathlib.Path.cwd() + + try: + win_dir = compat.win32api.GetWindowsDirectory() + except Exception: + win_dir = None + win_dir = None if win_dir is None else pathlib.Path(win_dir).resolve() + + inside_win_dir = cwd == win_dir or win_dir in cwd.parents + + # The only exception to the above is if user's home directory is also located under %WINDIR%, which happens + # when PyInstaller is ran under SYSTEM user. + if inside_win_dir: + home_dir = pathlib.Path.home().resolve() + if cwd == home_dir or home_dir in cwd.parents: + inside_win_dir = False + + if inside_win_dir: + raise SystemExit( + f"Error: Do not run pyinstaller from {cwd}. cd to where your code is and run pyinstaller from there. " + "Hint: You can open a terminal where your code is by going to the parent folder in Windows file " + "explorer and typing cmd into the address bar." + ) + + +if __name__ == '__main__': + run() diff --git a/venv/Lib/site-packages/PyInstaller/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0ee53410a828b01cf4b55d600a247ef82f870b5 GIT binary patch literal 1230 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 V;m0?2Uv$sE#QN@ebbYGr{0EXh1myq# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/__pycache__/_shared_with_waf.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/__pycache__/_shared_with_waf.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3ec9af315d793917c731326f6f4bcb54f6bbb3e GIT binary patch literal 2692 zcma)8&2JM&6d&8MCvixeCJiB>Edzp*fMfa@LPU!yR3QpNEg&JKshsidBp$N6V`g^a zxXOV8hqS8H+(7CjC#nkd-v6N&JF-NyQl+R>54~AJy>RM#yLLXBreeKb&y3&4@4Ywg zH~V8>UzWi2>)SUMujL5&11Fs;*&e)LFnCOCGE3})opchjiRd>uo3vAp$ZX0^-XRlR zTqg+0URAbWzG5Z8Oqpw8vr>(HUc2rYpF57wjC(fo%Yv1Z@*Tx(p)XX8rDeru3(^sV zZ1!$h8fKv#H!wc)l+U;^feUua+-E|9y546~q1hT!3rzZk*`gvmTX>cfhRL>LyTGm& zL?IvfR-RL1(yb^B;s8rkg`Jfi1G|C&Xa-GpPkdb0?WPS3h`=7--=b%stE2`U1-;;L7uyuweWDl5OfP|xycGgYJ_`-cfY_V_*EzX6{^`bzxQHZhG+X8av?Mc9= zF*R{$TrIst=JQ2>o`>dTov=+zVz%bRmP99h6HJh1Y!dt!s6(y zrh*tXP&`(PK`Gkg#e4}AEmpYY!-lIORUcCAD)J!|4_am?TWwj;Ebtw1>5C}G-Ei&Gzjz2MSY z#0G>3y(c|eRZW-zgJBx`)d|x#r5CK+nn-F2bQ7jI3WsUG9Jr;4RG3+row%W^4-a)ucoIal3}V+u|isb(@a+^4aYfw#f&Q}2Bf?2R}V&3wKUf9L;_&Ff9ai- zkOp4Vc@vqiyR%P2+D?6##^X_kSvV8nxWuT#q!wY%Lf|+q_pLI39YM31xN8j3B4aPV zxHdBfR51s6tO@VIgGomSt32r|<;*P$Z+Y&fEX^5UqR9%kmhilr+w-1qp%}kD6wzU^ z$`=ZiT6m;bsmWp+n0^cVpkp%y2f{=0_c_u%(4->`I@+Y8Pws8f({+0K=kDhCbYpy` zIX?4?yE%TNK7QlR+(>!X`=tWL+adI!J%=-ZFJx$@nW=e=h( zd(Ui$MsL2^n{Sa+&+)CHW9uJo4~?x~M3s?EdaO>5wX&oqx0cza{m&^_8Lf|EZ3%>ubRl?O(rGr^n%LWyrvAv{D~DSEqPy<&LgZf1^E*R@XnTuBVK$iYWs{U2-;{^9@t literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/__pycache__/compat.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/__pycache__/compat.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d08872af885b62a6a2f5200786594f112f2a7da GIT binary patch literal 26292 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 Hhx>m3Jb?$C literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/__pycache__/config.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/__pycache__/config.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09408c28d6f8d05118bffc149518f916f169832e GIT binary patch literal 1417 zcmb7E!EW3(5S45vF$nn5L(hXAvN6zA??zf6EgH8#>KKRLpe40d3r}t^^PoCOr{j;t2d=er zR9RE2W^g?>5A5=hVvf_i6q{3E&vnwU=&Rflc6eP_`IcpMJ zmRLgqU(hoPwPG?TshT!W&6Or)&^21GBA*+eXDB<1n$0$P#T{C5gZ#V>kUGf_yGcq! zS|WU9@U4~*ZW7pxWYL48-a?V+ga`n2&Njqi$1QTVsz zsjjy!BsJ5%2>jPsHN?C=MB`c-2aw9BY*j(oDU3W^5wE zb?`n2zhr|dx#*Nh4^1^DIVBg6IRl`s0i$(NM4 zQ1J*cKsos)=9!A$WKj|xe(q6kInwDb=d^Yh30JVIyHm?2hdWpI%2L>>EU)&W2!CZC z;_>$J`1oi6A1s0!MrmHZo@*(qb{?$NixtLY@kA{b9@*wSuP%5a{bK7>`)aaT(T^YZ yA5LfBH*Oz!bNu}mxLxn&d4B!*{e15_i?^Ti?9RcP<@KH2{hi-4`!f32P-wNT>U7-&|27)KB-ue>S#> z@91QA_Ic*bdvD&%{N9^<>vA~|lz$$ah@WXj=wJ9prI^da%d0@#LoAv_EWw%*#4J(# znr2P#H7CqVS#0d)YDGQ>&@Fj+*!iz%4 z@gJ;Us+-WQF>xswRe&-l#CXh54c%6F@zh?DCOj<#$V%C)=BqTq#A?llshZY_H6(qg zkOmW4thftpR<&;TH{i8wb8J&I|(#{SlcvOMl0qSvA)pU zR(K)Ke0t$B6TKeg6VZ7-!7HmwC=}AospLx96#Oi0Nhw!@r@GC$MOIi|(5>*{BuTe( zLQI5)c)AS>;AKV-m5Q7M7aEoDN~YVdbCL`jm5~(*D@zGwRS7QbEe|wW`k8m-OWm|? zg$*3%B;CSt^QpLQ5@nr)t-YYz1yRDAd_gA{MKH!8r{{>)jDan+g z+s=-BHudSmgiejD#JD6rE5MzE`6YOPlXb_qz;Y`ik|avqq;7-RMp#}d5!?!=Tg!6X zW&0x~`(?ak7$`rV8|$AFqDym%lv?G4FTMySI4-sjR75c`cbyZi&rR_2b26`R!DKXc zEgI+KxvI0>6RVu~P;yn@9Vyw4t*BlJX%A@g!7DezG2K9U((&cQZzr-XJt}!jBadat zV=vsT8)G?}yMPGGFp>9o?{+=+?0e?f_viQjbn@GQKMp*#eYacPAJ+DVRnL&-8OqoS zR?5beEs@$!C|)a<@}w`{fD3V53By8n*Zq5 zuQY#8#+`A$&O1REVd>kha{d#zC*v-dp&bOgvLcJKH0Q3Zy()Q1BTr??Q#of-=D2(S zJoC4X&=8HjrwKO1D1utL`3w5Y5#IGZz3Ii7n zx*h|iwzuP3Cxl$}$y_uLP3mhP!BmSOfV70%sbJJDmql!Kv25;$o~*fEg7AkL8w^NNdwZ`B3ob)tb!jBsA@KK??yp=vR; z7#aWGK!y>EYGu^UL4Mp|^v)JQB&f3hH5k9Mc2uifiZ>WdRoh&lAx^^?*-mZNO$|ox zth;Wn%U-2wj*CX5T&v@QSX|BLG^}|eZy=xrBAjDN-*sVTd}{hqcw%DYVr2OI)adwF z~PKMAIENdH}wqsI=Ns-8Y>|CPhin zU6;>-Bp4j|`26HZ+I^!Zln`UlM31}>l{npvyNAQWACHv!?a&{K0>tai=35E&^ZkDkX5YeP|EVn%Z=0vK@+#W9l zf#C$a^6!h$DChNUOy+H_o9o%OplS}}J_vo+b`!icEwYg7g?%NoDVe=M{ z)pG2ciw{44bmhU7t#P%ZPwRj%28~5AkLU;V=5L-(s=gu3Hm+nZM%E&-r(1Rn}^lbpw=3MnYa#NE1dVw zsm)zlb62*xD^I&`kAJnaIiu1&8r_qndvZ>1mh`@awLvwBzY*+iz>3{NJOZdQ0vtlM zDJTFNF#r;9D$bfPrQoemE^Bq5v2I#3Nx$1U#h2-tb|c70dlchnTst;uZ z5`L|?xBC|jSlQeWo>-E#)Pf^xxmKJ>w*fvkO_y1 zqDRYsWG@~-ICB!t?bCzx`7Z;fomu7+31*&S;MlVaf0cp5Jf8p(a_IRKpI{j!D#00* zLwZ{^zKx#0I6M*oi8^sC9otbd+$UpPuu5Js5mlgZ33Mt8%r!w=7MRj4k}qEcAh`zR zOEMG0_ApU}!8{T#UwdaXed!G?^C<=21Xx}+Y!*Zz_&G1I;xe?SI7Siwr=pPVs>*^B zT(`3bJH<@6h?mlSa9t4&W2(ufGICQx^D(A>9*ylB*4X^+g$WH zz9r+Uw$ux(waDkdz*p|=hu&$-@eimrP|nq~G5T+Ruj)Uc`A=+&X8KifSI*Z7)M=G$ zd*w!LN4LgQ?{Uq0d}A_)@qw}=iM+Gr_J;*zr;@}sqgvo-iOkcUJD=S8B7&-72aKv5=mRO<0Q7|rt#En0?QRCyJ;L-NYh3?mX%txAX+g*3s|pqhvLf1 zU20}m5)~WJ!9Y`>hh7332n^`t!tk|+G?(O3pg=E_!6E^Ho_Z*9qaYuOoci7@xui&1 z{yTI;ecYWl^XBJ$^WGc&xvwuSLHWnKmlyxKPm=zPFO3qZKkOWqCF!nYNQP`l1vx9r zk|Iq=hH^(TLR5JWlB7rQ@0V;y$ig6t&~Te9B4j-v>!p!4S&xuKK^E)K*(+pmknQV` zMTKlX$oe{DG2=isF60M6eu(aC8*{&qy#}(w9ew+R>~)a6(IGovyqS>(j{Ja29+0a& zx>G1>u3p~)@daBZ%FY4!x+_sBD;rW)F=XhdR9_okqxz^*C}_5EQ8O)Sqz6LPsH)mp zfvRdXuBrvc@GN}Zud2(QX8Dqb(hjQq@plu$^H4MIGOtAK<>jPBsh&@|j$_TQPj!EOLM6~D7ND% z(Jnm@W<5A)FG3Wc+N-LDqpK>5VU?H>FjiuH4R{?M_)h?uv#%*iBwCXYdZb9Ku@dak zeI;*zq;(~Cq+l(_CJRM}xnecf^3RKafN!r+R$6V-NfUtlLdfdBX7cYXSpRU z1-%R<5j5CUA8OV=P~e!szh7W?!)XlZ$7BR+A+XJ>B1&MtcQ#VhW4M2gWyFfjwMCh8yT~2_mK{IIUD>XUs4}iH~QL<{f zc~WvbMph`}Kr!Ov$Y*D750g2^BL#CY?~+x`c5%jxY6i@QQKBt4o-5RGV%h|C!`Xnb z#gIkjte6J0B1O-#lDI6&g$7tN$S7$ccZ%UI{eYVbC#?sTT+rNVSYwME&T5!bE5}ht z7}5u6#a*VV>nEOW-&DN~l8c`O*pO;rrEgaL&+PTbv)9Y>H!AbAoLj8S=gUiWWr>$v zud=kVHM?4wU9I(oV{yUPPExZYpsbzHhp-Oe82s~-0Ih_MMB+866Z`{#y>=11L71Jl zLGt?+YJV=}WJA6a&4xag*5qthxTVAlEx>LXqh=9^aFJ@R$EYB@-cST;nhc+TmoMbI zk{d8tk{&?aBWxwgW{adzC&8JxC4UJ4#QVv z70`wQWyB1TBrP^4E9X*YQe=IeTm*(AdzgmqO#?zAXEn>E%!aBJ$_b}HT-Pn~;h~{L zV5_%~0{#vaOJ?97cRd5;hR$8MaN(g+jc~6>89HjyHeFSH7-Db2vZ}oW$~k!1YD`sy zcLTzp4h9{i;6rc-R-q~x(0bvHQ^Dh9}2~$ouszTzJmQpeKW3^b_OEB zNC~lSi2nlz=2|(RJCIZ9F607@V5NgMz*n5@T82QjLkkO*3BKodOhwZI(e;Fq%eZvQOr;Zrf*4uu29P<7APbx^^AIuK&bI- z?wS6vU+_%J03m}E9-I`%yayvumuaTrVnL_L6`PFF1yi$!W*0o$^#*Ze#HKJ&Oz8Z0 z)X>mn4t!WBBIGpDif(d|xWRlwG`I7z~-yo+PHb|P)Ioy&}huyqEz`_Mhzmge9#b3c29P{S{cO2wO z+Ho%;Q+z*w&a6@J@*rZtU*O?oVu6d%q+T{rQ%8aHzNJl5?23D}|GtDb8Bun}l)c{S zsSv~)WsnT?GE6=F(0x>$n#^P-(-Z3S+|^50((2{O5p^mv!SMc54KF#S&2XyKzUjHK zITWTpo*K_QR79%c2YSrrcBLjKpT47kPZ@(w{5JsYq2`~7Gv6gXc%1m)tME6muVa6E zw=(kS*7<9d^VhZ#bCty0Ry13QX3LGw9^M6`4nr8lvATqx>mvNT2>PR;P96S((#U6@ zFEQ?)v{y9CG%`#dgRJAKSG4MRaVsg%%=o_ZDZtCnP2|Ojq1;lwllPW+bu?F=Xb{m;^4(rMQ{pZyjIWul_{pjo8*lvD z<^NWMmt=9Z5s9uyW>^yHs=bp}goT9%5{wihx82WwjDG0Ia4)`%wNIL&Xc!xH!k=Q>So@?YI?y9Srqv0XiEXTX(i9zz zV9QR}gwdh)NmF!4kukmRj+?{VLIU|>vsFBdx;tTW9p?+W1JR+V9Ik~Vxxd!0$mqYj ren8$+2 zYrJ0zngF$E3T06f%K;2XLM5lN89Btim2!tx)3S`>%07~wbL?G+Du+O5tSD>&S}n${aa zBuaV@`#Sa7?MKjf-0q;E)0UR7Mn@1yjw1RNhrr@~93j1bKsXBR0TO)#zIzP+F@Zex zRiIn;Tka0}RJeieaQ=A*+qxu165qtTZS;2t;hydlv~#%kGo%gSKH%rEu#8fP%CM5N zOC`f9sbw2)n?zl=sd{~P-f~>sGzpzlQnD8+5tpeE>WT9UbBmt%>&()E7r2t0S-I*3 z@=KZ7tQW{GEiEp2fw@dRlk>t?ve%cgvzh$-;=*^#)`gTr15nc-V*nyV1;#|iSX{sJ zMCAv#+3aew6OtM2vOD~g@GY#D`aU8t_ z9WQ$Q#(W{Sc(strewfYq7F6Dzw{~>Xz-rf+3bJjYPE?W;lj`z@y=`K3ji|N-|GN5$ zn@sVZ1kNh!t{3q4^THi|E1m`u3}%;y9pNPd?3d^+I)wU7!kl{waD>>U!EhlCJ7i~b zIyJk)TmiRzBRvAYJ!Zc1iGyni;SMfT!s)bWm(s@u2YfGhGDv(u*{MTf5*^O-NLH9Lnt*caa4DMyykym?HJUy$^`7$(W${EPFDDL)s*N3iyO94B#sv> zgPAbuiLi+4i5tY+N(o*>$GD)=(l(pzNxqTGp15fnR*LhaEuA`qIxIx$t1DNhR{<)k zF5TWG)+e8UZ%Ap<2cL?AO}YPh&p@+huo)d}@my?)YvzCREPwN9{^mb#;d-7l z^5lDgi>-65FbbUe9t8u^e;8|ZvzM?eDt01+#oEVM5{?BJ<2IR!PqZ59>K}Guv#o@> zQ`bG-WjFJL?(%1;?4DqyN07@d=LtblQ#pp}jv4JSz%kcp3qxl&UO99FSzffegx%f4f&5H;0@yn1`gxlJRW zmkQAYR9;|vYYR}x4(!RlB)eHkZR!O;1eF96SsIi9$~l%~Jl+Nro?ta4(hF>w2rzIc zds;lH;BVtF*Qh}BEhg*UQy-^1L4Ty5w_PpZHFE-?hHThz5{D;5eKUemDQI|(*erd&-EzBT? z9qj)2W%Ohsb6)s%hy$Lw-~|f>Y!?d!)_|v@P@rR==LMO^;C=bu$=}cQ{v{%8lAkUB=>$$ z>&H(tV63d%U`4xKU(p*Y`iZa~*A>!GNKGWndFu>gFHnM=E^+YFuls9gs*a`_XbKw5 uP~YCr{?F^7;YMf}43=aLlHDmAkU2ozo6KQX_S+wypNXNr$A)L7g#QBEER90| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/_recursion_too_deep_message.py b/venv/Lib/site-packages/PyInstaller/_recursion_too_deep_message.py new file mode 100644 index 0000000..e62c20d --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/_recursion_too_deep_message.py @@ -0,0 +1,45 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +msg = """ +============================================================= +A RecursionError (maximum recursion depth exceeded) occurred. +For working around please follow these instructions +============================================================= + +1. In your program's .spec file add this line near the top:: + + import sys ; sys.setrecursionlimit(sys.getrecursionlimit() * 5) + +2. Build your program by running PyInstaller with the .spec file as + argument:: + + pyinstaller myprog.spec + +3. If this fails, you most probably hit an endless recursion in + PyInstaller. Please try to track this down as far as possible, + create a minimal example so we can reproduce and open an issue at + https://github.com/pyinstaller/pyinstaller/issues following the + instructions in the issue template. Many thanks. + +Explanation: Python's stack-limit is a safety-belt against endless recursion, +eating up memory. PyInstaller imports modules recursively. If the structure +how modules are imported within your program is awkward, this leads to the +nesting being too deep and hitting Python's stack-limit. + +With the default recursion limit (1000), the recursion error occurs at about +115 nested imported, with limit 2000 at about 240, with limit 5000 at about +660. +""" + + +def raise_with_msg(): + raise SystemExit(msg) diff --git a/venv/Lib/site-packages/PyInstaller/_shared_with_waf.py b/venv/Lib/site-packages/PyInstaller/_shared_with_waf.py new file mode 100644 index 0000000..c3d52ad --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/_shared_with_waf.py @@ -0,0 +1,86 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Code to be shared by PyInstaller and the bootloader/wscript file. + +This code must not assume that either PyInstaller or any of its dependencies installed. I.e., the only imports allowed +in here are standard library ones. Within reason, it is preferable that this file should still run under Python 2.7 as +many compiler docker images still have only Python 2 installed. +""" + +import platform +import re + + +def _pyi_machine(machine, system): + # type: (str, str) -> str + """ + Choose an intentionally simplified architecture identifier to be used in the bootloader's directory name. + + Args: + machine: + The output of ``platform.machine()`` or any known architecture alias or shorthand that may be used by a + C compiler. + system: + The output of ``platform.system()`` on the target machine. + Returns: + Either a string tag or, on platforms that don't need an architecture tag, ``None``. + + Ideally, we would just use ``platform.machine()`` directly, but that makes cross-compiling the bootloader almost + impossible, because you need to know at compile time exactly what ``platform.machine()`` will be at run time, based + only on the machine name alias or shorthand reported by the C compiler at the build time. Rather, use a loose + differentiation, and trust that anyone mixing armv6l with armv6h knows what they are doing. + """ + # See the corresponding tests in tests/unit/test_compat.py for examples. + + if platform.machine() == "sw_64" or platform.machine() == "loongarch64": + # This explicitly inhibits cross compiling the bootloader for or on SunWay and LoongArch machine. + return platform.machine() + + if system == "Windows": + if machine.lower().startswith("arm"): + return "arm" + else: + return "intel" + + if system != "Linux": + # No architecture specifier for anything par Linux. + # - macOS is on two 64 bit architectures, but they are merged into one "universal2" bootloader. + # - BSD supports a wide range of architectures, but according to PyPI's download statistics, every one of our + # BSD users are on x86_64. This may change in the distant future. + return + + if machine.startswith(("arm", "aarch")): + # ARM has a huge number of similar and aliased sub-versions, such as armv5, armv6l armv8h, aarch64. + return "arm" + if machine in ("thumb"): + # Reported by waf/gcc when Thumb instruction set is enabled on 32-bit ARM. The platform.machine() returns "arm" + # regardless of the instruction set. + return "arm" + if machine in ("x86_64", "x64", "x86"): + return "intel" + if re.fullmatch("i[1-6]86", machine): + return "intel" + if machine.startswith(("ppc", "powerpc")): + # PowerPC comes in 64 vs 32 bit and little vs big endian variants. + return "ppc" + if machine in ("mips64", "mips"): + return "mips" + if machine.startswith("riscv"): + return "riscv" + # Machines with no known aliases :) + if machine in ("s390x",): + return machine + + # Unknown architectures are allowed by default, but will all be placed under one directory. In theory, trying to + # have multiple unknown architectures in one copy of PyInstaller will not work, but that should be sufficiently + # unlikely to ever happen. + return "unknown" diff --git a/venv/Lib/site-packages/PyInstaller/archive/__init__.py b/venv/Lib/site-packages/PyInstaller/archive/__init__.py new file mode 100644 index 0000000..a7501ae --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/archive/__init__.py @@ -0,0 +1 @@ +__author__ = 'martin' diff --git a/venv/Lib/site-packages/PyInstaller/archive/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/archive/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec8850ac09abc1b98dab64f6edd60a8dfed7d290 GIT binary patch literal 210 zcmZ3^%ge<81gF(}(#3%EV-N=h7@>^MASKfoQW&BbQW%37G?{L(_JrDtAoNn%b;YLR|oQF2CRS*m_~d}dx|NqoFsLFF$Fo80`A i(wtPgB6gq+Acqz60f`UHjEsyoctsnyK(L4vC2hK~O$#9~}Si2>Ip~YpJcA zB}3>DoNjyzVuFM-4N;vR!|P5+oBcPZ3lV9 ma9Mv+_43r*!GwDTb{EaUr<5-4`_wV~-To}&zy6UeDSiV5$jd+g literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/archive/__pycache__/readers.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/archive/__pycache__/readers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5759e14f703d582c3824b262452c2571908a7560 GIT binary patch literal 8401 zcmc&)U2GdycD}>^pP@*RlBgfcrv5C^mgU5eY_Gj*SCJS=kwvSP97l}o3B?)7v?x-Z z8QBp_#=^n{xJH0z4KJi^Z7dONv+AY`_@OO~q7T^x76{On8DWYL0~ioctQfKbZxo7UZbI*6bd#K-eJT3&+za71_bm9m?|A8~wWvwJ$Y(ioS z(I|#!f;Ody7@^!vF%#U)Df5aYW?8YutOPQlF+^MLBihQ?J~bos8T_eN%ud^44%!}b z(vFymcE;SaD@M}pn1?1~b+jkurR!oo+8e7^Z1})N{ii0d0Dlz=e!77U+$UlI+BAd0 zjoIt2>2>~QCVgTd&M|aoWSC9dOx|HaebbX;;SkHjX@(6YS5{NZ3X|sJd@_?B2wlah znRIGBluU>Cn@lLKwxaGNnY*CB#wSxretp38HGXO|Y?A9^spLY%_7%mb?5oN~ST@5Z zDt%OLL?!d04ia04K`>tk&lU6<%tbT&aJphZX&eokWd}v2<0}kB$u5do$e}_rmnZJ}=nCFr_b7D1~ zSdK3--2C+VM4IE{sT9MWtc>@hIzQaN>N;x!vx;bh1m^{@p?^vi$Hpk@)-+^dK_+OK z$jU@aCZ=R!MJ70z_&_EyGLbS&gZAoQJch>A(-1S$rkI5`$E+sA*lyXOTDchOr!aM& zY14;bxmaS(8Xaeij*GV5M=>`;(zg5PQ?T<{#Tr5}4^v0mUn=#|4rt+{ognLJ7rYd= zT&FD_^#y0oxk7NMnb2Z}4OPuxFIT(NDpNY3G~yi4fvLy@>2|s6vaXJ^+yq>w2f3`h z1E=0hB=jW>nt1ehre6FDly0FMkwX+@)r-bCeLj?&-d4$JbBvM*G%Z@YC7jdT7x5mg z96|XlJwuy}4mO1HrW`8j??YFFL=I|h;gKnqv0dJrGt=f}rDv>{4`^BlpuqUHeoo{} zMFnv7b<|YO%s1_q-6FNL@ks>qqgXW>O-mUU_BQ1*J~MCO0ob(bmQPE;c&6lMz^ENY z&Ac1lpI;kQ^*!e{YR<#ks$MbG>xBlWr;%|+2q>9BUFdbhS?-!XFwdd81cBxd0Uulw zwnbUI0Av%p@b&+|mF*tMtflBsI>Uz+lWBnG%arrmsl{Z9!Ai1+0$^i#Dzmr$FyvBGIwgaoNTJJ|}qDwwA^)ykGy;6dF2MUzGM(fpDjPIHePV>KqbVPfM+*3zP8N`rsqaHZ2`~{poqpcTw_P z{KkwtQKAspyih#1lYMsj^K)ef>N@?*BAuNSJ14*RQ0%x~7?sGw@T7*rWkh(c6G|W6 z6PxCxrg_0PulHedRBAZ7(<(N+A(DdQ`-_Hsd(*_ME+_Z>O3ye6JmG-jQ>_=BmsgYs*=44!l9+E$Ke! z(+|uP)}k%S=uJOnPM`ihX8{4NHHDpQ58T+JAS%cgiH^z^o=K%- zGr)^%UWtFe_F|nrtYc*{utKxfaL!`{SUUrly9yXuKNA_gGBQq$j9-lcmQKVXGO4Oo z(A=qFJJxk2Zmy-5DK431Wb?w>qHKmz4o`pvSRn{3wml{sJtH1E^Q>NMJ})(&FHDqLLdBnmE&YYJ_q;7nMv5Ns(13Jk zVAne!cn3c_{hJF9)(h*UBYit>{QBM|iH$WK`Ma*-ir6_Qbq41o)w^wynKpFw2n}7x%Ow&nY zF9?)&TGBhLG;;X>T z=y08EPNaaTVRpiHV51>y)Sg&l74#tCP|vPwq^FY8XdrH+RRz}4iOk9>%W!b^*9v`F z5zs+uF%@3|Dzv_;_Q0(ixGSv5qR>o&;xPZ$u|`R#fO7)Mvn{oNqqDn@pqd+kN!vhs z{)U3RROc(0Oa1^(H9j$KkN(>E*tuKRA=Gtf)FdGte&gxvv)<3od@&vVJiomr z2707G&zFJz-9Z1&H8C(G1%?Wvd%+`H_a5FW-W7un4^OIYUQLm!1G_{;|uf-`iXl z;NaR4#N*N-#Zi?rof;y+>e27L(M(kh9s0frnytY}(HNNPU|XRd%Hc9hst{maf|H(O zl37>6XKW{~KZJ!sQrd9}GnFbnV#&gZM|NR^QGp=rW(Tm!JP6sUbdY@q7hJ>QT`cCX zh+%y&(* z1#8LeEBx%azg1|P*qH^PentP=lK*Xie0%R|Omti+kekaw*JRUa# zUs01%P8wRHsyYWE58-UMLLJ=B^gh)`H+Tf{ERcSy^Cc8saR5h$UXfQ5HuX z+4n(YyJE>z9Es4hI5iTpwz`^Od1$=O@EuuO1n<6~Y)>eu*2hDfu2K7(4mb&fu>Cj| z3m{|?g7nnHY-Ea>o{O>gMXN51y;t_>m9dHGw!QJ&$pu0Hx+Z#`3 zrJ=De`o*Dl#K1Kva7`eul{}6A-V)yRgauFdxxY*3p3u?YE1Z27aH9KN^(*@4B>$X1 z&MAC88uqhzqhj%1!s1Oswo?=hksgZe#zp;DV4fyB67f_5AF9|eF2lhbHj2eLTuZ|F zi%%w282FimR!&y3JCTZWT%`n4A9fK7ya}@|EHFB%#Hbmku)tu!LBUoDY8ap8$velPOEw~BIlO#*3Pqpk#iQsti$k`UhvclA z#0`jPKn%fjaBQWP5de3v^E$84@oYRtuy5teuV5*)tOEELI6a{b1T?@O(fHa)S3dAT<9(YI|f{ehVmog z!n$IPXE>fyc}>`^EO(WpSm77A6^{K&m>%{f7T85(%QCah0UDmf8K>T9@WaX&W%ugx zk_JyIJ#pd~tx8d@V?&sefZBRiQ#&9GA~#f-p)}*{U1%!6ANL0kfM!1A^KXoQL_&)YN@NQc~ zN4w-`7aZ-SeO%jd0=Si0d%kQvzuS8L*{Ik$EVT{;A!zP;?ESL2f48|`Y#xxB2XHhM z%!Amplzh!w-iO|zMfCMZz8*pOeg|l|aanP_Ffki$V3(oqD#24AtgGs`xq(y$|LO}r zY9`@F)Yo3uW=P#&EYMJP&cZQIC60Iz%U*r2d2=E#NG9E{|TlWGtGweD%smME2-fqrr!1Yr}~@ zCFI#qK6_|JIOtop5rh-o#!F(``3)}pcE8Gn0!we5 y8iE3Q@M5h5Ro>{q-l4R?Z)kHr>YFG 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 len(magic_pattern): + start_pos = max(end_pos - SEARCH_CHUNK_SIZE, 0) + chunk_size = end_pos - start_pos + # Is the remaining chunk large enough to hold the pattern? + if chunk_size < len(magic_pattern): + break + # Read and scan the chunk + fp.seek(start_pos, os.SEEK_SET) + buf = fp.read(chunk_size) + pos = buf.rfind(magic_pattern) + if pos != -1: + magic_offset = start_pos + pos + break + # Adjust search location for next chunk; ensure proper overlap + end_pos = start_pos + len(magic_pattern) - 1 + + return magic_offset + + @classmethod + def _parse_toc(cls, data): + options = [] + toc = {} + cur_pos = 0 + while cur_pos < len(data): + # Read and parse the fixed-size TOC entry header + entry_length, entry_offset, data_length, uncompressed_length, compression_flag, typecode = \ + struct.unpack(cls._TOC_ENTRY_FORMAT, data[cur_pos:(cur_pos + cls._TOC_ENTRY_LENGTH)]) + cur_pos += cls._TOC_ENTRY_LENGTH + # Read variable-length name + name_length = entry_length - cls._TOC_ENTRY_LENGTH + name, *_ = struct.unpack(f'{name_length}s', data[cur_pos:(cur_pos + name_length)]) + cur_pos += name_length + # Name string may contain up to 15 bytes of padding + name = name.rstrip(b'\0').decode('utf-8') + + typecode = typecode.decode('ascii') + + # The TOC should not contain duplicates, except for OPTION entries. Therefore, keep those + # in a separate list. With options, the rest of the entries do not make sense, anyway. + if typecode == 'o': + options.append(name) + else: + toc[name] = (entry_offset, data_length, uncompressed_length, compression_flag, typecode) + + return toc, options + + def extract(self, name): + """ + Extract data for the given entry name. + """ + + entry = self.toc.get(name) + if entry is None: + raise KeyError(f"No entry named {name} found in the archive!") + + entry_offset, data_length, uncompressed_length, compression_flag, typecode = entry + with open(self._filename, "rb") as fp: + fp.seek(self._start_offset + entry_offset, os.SEEK_SET) + data = fp.read(data_length) + + if compression_flag: + import zlib + data = zlib.decompress(data) + + return data + + def open_embedded_archive(self, name): + """ + Open new archive reader for the embedded archive. + """ + + entry = self.toc.get(name) + if entry is None: + raise KeyError(f"No entry named {name} found in the archive!") + + entry_offset, data_length, uncompressed_length, compression_flag, typecode = entry + + if typecode == PKG_ITEM_PYZ: + # Open as embedded archive, without extraction. + return ZlibArchiveReader(self._filename, self._start_offset + entry_offset) + elif typecode == PKG_ITEM_ZIPFILE: + raise NotAnArchiveError("Zipfile archives not supported yet!") + else: + raise NotAnArchiveError(f"Entry {name} is not a supported embedded archive!") + + +def pkg_archive_contents(filename, recursive=True): + """ + List the contents of the PKG / CArchive. If `recursive` flag is set (the default), the contents of the embedded PYZ + archive is included as well. + + Used by the tests. + """ + + contents = [] + + pkg_archive = CArchiveReader(filename) + for name, toc_entry in pkg_archive.toc.items(): + *_, typecode = toc_entry + contents.append(name) + if typecode == PKG_ITEM_PYZ and recursive: + pyz_archive = pkg_archive.open_embedded_archive(name) + for name in pyz_archive.toc.keys(): + contents.append(name) + + return contents diff --git a/venv/Lib/site-packages/PyInstaller/archive/writers.py b/venv/Lib/site-packages/PyInstaller/archive/writers.py new file mode 100644 index 0000000..ee0a29f --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/archive/writers.py @@ -0,0 +1,423 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Utilities to create data structures for embedding Python modules and additional files into the executable. +""" + +import marshal +import os +import shutil +import struct +import sys +import zlib + +from PyInstaller.building.utils import get_code_object, strip_paths_in_code +from PyInstaller.compat import BYTECODE_MAGIC, is_win, strict_collect_mode +from PyInstaller.loader.pyimod01_archive import PYZ_ITEM_MODULE, PYZ_ITEM_NSPKG, PYZ_ITEM_PKG + + +class ZlibArchiveWriter: + """ + Writer for PyInstaller's PYZ (ZlibArchive) archive. The archive is used to store collected byte-compiled Python + modules, as individually-compressed entries. + """ + _PYZ_MAGIC_PATTERN = b'PYZ\0' + _HEADER_LENGTH = 12 + 5 + _COMPRESSION_LEVEL = 6 # zlib compression level + + def __init__(self, filename, entries, code_dict=None): + """ + filename + Target filename of the archive. + entries + An iterable containing entries in the form of tuples: (name, src_path, typecode), where `name` is the name + under which the resource is stored (e.g., python module name, without suffix), `src_path` is name of the + file from which the resource is read, and `typecode` is the Analysis-level TOC typecode (`PYMODULE`). + code_dict + Optional code dictionary containing code objects for analyzed/collected python modules. + """ + code_dict = code_dict or {} + + with open(filename, "wb") as fp: + # Reserve space for the header. + fp.write(b'\0' * self._HEADER_LENGTH) + + # Write entries' data and collect TOC entries + toc = [] + for entry in entries: + toc_entry = self._write_entry(fp, entry, code_dict) + toc.append(toc_entry) + + # Write TOC + toc_offset = fp.tell() + toc_data = marshal.dumps(toc) + fp.write(toc_data) + + # Write header: + # - PYZ magic pattern (4 bytes) + # - python bytecode magic pattern (4 bytes) + # - TOC offset (32-bit int, 4 bytes) + # - 4 unused bytes + fp.seek(0, os.SEEK_SET) + + fp.write(self._PYZ_MAGIC_PATTERN) + fp.write(BYTECODE_MAGIC) + fp.write(struct.pack('!i', toc_offset)) + + @classmethod + def _write_entry(cls, fp, entry, code_dict): + name, src_path, typecode = entry + assert typecode in {'PYMODULE', 'PYMODULE-1', 'PYMODULE-2'} + + typecode = PYZ_ITEM_MODULE + if src_path in ('-', None): + # This is a NamespacePackage, modulegraph marks them by using the filename '-'. (But wants to use None, + # so check for None, too, to be forward-compatible.) + typecode = PYZ_ITEM_NSPKG + else: + src_basename, _ = os.path.splitext(os.path.basename(src_path)) + if src_basename == '__init__': + typecode = PYZ_ITEM_PKG + data = marshal.dumps(code_dict[name]) + + # First compress, then encrypt. + obj = zlib.compress(data, cls._COMPRESSION_LEVEL) + + # Create TOC entry + toc_entry = (name, (typecode, fp.tell(), len(obj))) + + # Write data blob + fp.write(obj) + + return toc_entry + + +class CArchiveWriter: + """ + Writer for PyInstaller's CArchive (PKG) archive. + + This archive contains all files that are bundled within an executable; a PYZ (ZlibArchive), DLLs, Python C + extensions, and other data files that are bundled in onefile mode. + + The archive can be read from either C (bootloader code at application's run-time) or Python (for debug purposes). + """ + _COOKIE_MAGIC_PATTERN = b'MEI\014\013\012\013\016' + + # For cookie and TOC entry structure, see `PyInstaller.archive.readers.CArchiveReader`. + _COOKIE_FORMAT = '!8sIIII64s' + _COOKIE_LENGTH = struct.calcsize(_COOKIE_FORMAT) + + _TOC_ENTRY_FORMAT = '!IIIIBc' + _TOC_ENTRY_LENGTH = struct.calcsize(_TOC_ENTRY_FORMAT) + + _COMPRESSION_LEVEL = 9 # zlib compression level + + def __init__(self, filename, entries, pylib_name): + """ + filename + Target filename of the archive. + entries + An iterable containing entries in the form of tuples: (dest_name, src_name, compress, typecode), where + `dest_name` is the name under which the resource is stored in the archive (and name under which it is + extracted at runtime), `src_name` is name of the file from which the resouce is read, `compress` is a + boolean compression flag, and `typecode` is the Analysis-level TOC typecode. + pylib_name + Name of the python shared library. + """ + self._collected_names = set() # Track collected names for strict package mode. + + with open(filename, "wb") as fp: + # Write entries' data and collect TOC entries + toc = [] + for entry in entries: + toc_entry = self._write_entry(fp, entry) + toc.append(toc_entry) + + # Write TOC + toc_offset = fp.tell() + toc_data = self._serialize_toc(toc) + toc_length = len(toc_data) + + fp.write(toc_data) + + # Write cookie + archive_length = toc_offset + toc_length + self._COOKIE_LENGTH + pyvers = sys.version_info[0] * 100 + sys.version_info[1] + cookie_data = struct.pack( + self._COOKIE_FORMAT, + self._COOKIE_MAGIC_PATTERN, + archive_length, + toc_offset, + toc_length, + pyvers, + pylib_name.encode('ascii'), + ) + + fp.write(cookie_data) + + def _write_entry(self, fp, entry): + dest_name, src_name, compress, typecode = entry + + # Write OPTION entries as-is, without normalizing them. This also exempts them from duplication check, + # allowing them to be specified multiple times. + if typecode == 'o': + return self._write_blob(fp, b"", dest_name, typecode) + + # Ensure forward slashes in paths are on Windows converted to back slashes '\\', as on Windows the bootloader + # works only with back slashes. + dest_name = os.path.normpath(dest_name) + if is_win and os.path.sep == '/': + # When building under MSYS, the above path normalization uses Unix-style separators, so replace them + # manually. + dest_name = dest_name.replace(os.path.sep, '\\') + + # For symbolic link entries, also ensure that the symlink target path (stored in src_name) is using + # Windows-style back slash separators. + if typecode == 'n': + src_name = src_name.replace(os.path.sep, '\\') + + # Strict pack/collect mode: keep track of the destination names, and raise an error if we try to add a duplicate + # (a file with same destination name, subject to OS case normalization rules). + if strict_collect_mode: + normalized_dest = None + if typecode in {'s', 's1', 's2', 'm', 'M'}: + # Exempt python source scripts and modules from the check. + pass + else: + # Everything else; normalize the case + normalized_dest = os.path.normcase(dest_name) + # Check for existing entry, if applicable + if normalized_dest: + if normalized_dest in self._collected_names: + raise ValueError( + f"Attempting to collect a duplicated file into CArchive: {normalized_dest} (type: {typecode})" + ) + self._collected_names.add(normalized_dest) + + if typecode == 'd': + # Dependency; merge src_name (= reference path prefix) and dest_name (= name) into single-string format that + # is parsed by bootloader. + return self._write_blob(fp, b"", f"{src_name}:{dest_name}", typecode) + elif typecode in {'s', 's1', 's2'}: + # If it is a source code file, compile it to a code object and marshal the object, so it can be unmarshalled + # by the bootloader. For that, we need to know target optimization level, which is stored in typecode. + optim_level = {'s': 0, 's1': 1, 's2': 2}[typecode] + code = get_code_object(dest_name, src_name, optimize=optim_level) + code = strip_paths_in_code(code) + return self._write_blob(fp, marshal.dumps(code), dest_name, 's', compress=compress) + elif typecode in ('m', 'M'): + # Read the PYC file. We do not perform compilation here (in contrast to script files in the above branch), + # so typecode does not contain optimization level information. + with open(src_name, "rb") as in_fp: + data = in_fp.read() + assert data[:4] == BYTECODE_MAGIC + # Skip the PYC header, load the code object. + code = marshal.loads(data[16:]) + code = strip_paths_in_code(code) + # These module entries are loaded and executed within the bootloader, which requires only the code + # object, without the PYC header. + return self._write_blob(fp, marshal.dumps(code), dest_name, typecode, compress=compress) + elif typecode == 'n': + # Symbolic link; store target name (as NULL-terminated string) + data = src_name.encode('utf-8') + b'\x00' + return self._write_blob(fp, data, dest_name, typecode, compress=compress) + else: + return self._write_file(fp, src_name, dest_name, typecode, compress=compress) + + def _write_blob(self, out_fp, blob: bytes, dest_name, typecode, compress=False): + """ + Write the binary contents (**blob**) of a small file to the archive and return the corresponding CArchive TOC + entry. + """ + data_offset = out_fp.tell() + data_length = len(blob) + if compress: + blob = zlib.compress(blob, level=self._COMPRESSION_LEVEL) + out_fp.write(blob) + + return (data_offset, len(blob), data_length, int(compress), typecode, dest_name) + + def _write_file(self, out_fp, src_name, dest_name, typecode, compress=False): + """ + Stream copy a large file into the archive and return the corresponding CArchive TOC entry. + """ + data_offset = out_fp.tell() + data_length = os.stat(src_name).st_size + with open(src_name, 'rb') as in_fp: + if compress: + tmp_buffer = bytearray(16 * 1024) + compressor = zlib.compressobj(self._COMPRESSION_LEVEL) + while True: + num_read = in_fp.readinto(tmp_buffer) + if not num_read: + break + out_fp.write(compressor.compress(tmp_buffer[:num_read])) + out_fp.write(compressor.flush()) + else: + shutil.copyfileobj(in_fp, out_fp) + + return (data_offset, out_fp.tell() - data_offset, data_length, int(compress), typecode, dest_name) + + @classmethod + def _serialize_toc(cls, toc): + serialized_toc = [] + for toc_entry in toc: + data_offset, compressed_length, data_length, compress, typecode, name = toc_entry + + # Encode names as UTF-8. This should be safe as standard python modules only contain ASCII-characters (and + # standard shared libraries should have the same), and thus the C-code still can handle this correctly. + name = name.encode('utf-8') + name_length = len(name) + 1 # Add 1 for string-terminating zero byte. + + # Ensure TOC entries are aligned on 16-byte boundary, so they can be read by bootloader (C code) on + # platforms with strict data alignment requirements (for example linux on `armhf`/`armv7`, such as 32-bit + # Debian Buster on Raspberry Pi). + entry_length = cls._TOC_ENTRY_LENGTH + name_length + if entry_length % 16 != 0: + padding_length = 16 - (entry_length % 16) + name_length += padding_length + + # Serialize + serialized_entry = struct.pack( + cls._TOC_ENTRY_FORMAT + f"{name_length}s", # "Ns" format automatically pads the string with zero bytes. + cls._TOC_ENTRY_LENGTH + name_length, + data_offset, + compressed_length, + data_length, + compress, + typecode.encode('ascii'), + name, + ) + serialized_toc.append(serialized_entry) + + return b''.join(serialized_toc) + + +class SplashWriter: + """ + Writer for the splash screen resources archive. + + The resulting archive is added as an entry into the CArchive with the typecode PKG_ITEM_SPLASH. + """ + # This struct describes the splash resources as it will be in an buffer inside the bootloader. All necessary parts + # are bundled, the *_len and *_offset fields describe the data beyond this header definition. + # Whereas script and image fields are binary data, the requirements fields describe an array of strings. Each string + # is null-terminated in order to easily iterate over this list from within C. + # + # typedef struct _splash_data_header + # { + # char tcl_libname[16]; + # char tk_libname[16]; + # char tk_lib[16]; + # + # uint32_t script_len; + # uint32_t script_offset; + # + # uint32_t image_len; + # uint32_t image_offset; + # + # uint32_t requirements_len; + # uint32_t requirements_offset; + # } SPLASH_DATA_HEADER; + # + _HEADER_FORMAT = '!16s 16s 16s II II II' + _HEADER_LENGTH = struct.calcsize(_HEADER_FORMAT) + + # The created archive is compressed by the CArchive, so no need to compress the data here. + + def __init__(self, filename, name_list, tcl_libname, tk_libname, tklib, image, script): + """ + Writer for splash screen resources that are bundled into the CArchive as a single archive/entry. + + :param filename: The filename of the archive to create + :param name_list: List of filenames for the requirements array + :param str tcl_libname: Name of the tcl shared library file + :param str tk_libname: Name of the tk shared library file + :param str tklib: Root of tk library (e.g. tk/) + :param Union[str, bytes] image: Image like object + :param str script: The tcl/tk script to execute to create the screen. + """ + + # Ensure forward slashes in dependency names are on Windows converted to back slashes '\\', as on Windows the + # bootloader works only with back slashes. + def _normalize_filename(filename): + filename = os.path.normpath(filename) + if is_win and os.path.sep == '/': + # When building under MSYS, the above path normalization uses Unix-style separators, so replace them + # manually. + filename = filename.replace(os.path.sep, '\\') + return filename + + name_list = [_normalize_filename(name) for name in name_list] + + with open(filename, "wb") as fp: + # Reserve space for the header. + fp.write(b'\0' * self._HEADER_LENGTH) + + # Serialize the requirements list. This list (more an array) contains the names of all files the bootloader + # needs to extract before the splash screen can be started. The implementation terminates every name with a + # null-byte, that keeps the list short memory wise and makes it iterable from C. + requirements_len = 0 + requirements_offset = fp.tell() + for name in name_list: + name = name.encode('utf-8') + b'\0' + fp.write(name) + requirements_len += len(name) + + # Write splash script + script_offset = fp.tell() + script_len = len(script) + fp.write(script.encode("utf-8")) + + # Write splash image. If image is a bytes buffer, it is written directly into the archive. Otherwise, it + # is assumed to be a path and the file is copied into the archive. + image_offset = fp.tell() + if isinstance(image, bytes): + # Image was converted by PIL/Pillow and is already in buffer + image_len = len(image) + fp.write(image) + else: + # Read image into buffer + with open(image, 'rb') as image_fp: + image_data = image_fp.read() + image_len = len(image_data) + fp.write(image_data) + del image_data + + # The following strings are written to 16-character fields with zero-padding, which means that we need to + # ensure that their length is strictly below 16 characters (if it were exactly 16, the field would have no + # terminating NULL character!). + def _encode_str(value, field_name, limit): + enc_value = value.encode("utf-8") + if len(enc_value) >= limit: + raise ValueError( + f"Length of the encoded field {field_name!r} is greater or equal to the limit of {limit} " + "characters!" + ) + + return enc_value + + # Write header + header_data = struct.pack( + self._HEADER_FORMAT, + _encode_str(tcl_libname, 'tcl_libname', 16), + _encode_str(tk_libname, 'tk_libname', 16), + _encode_str(tklib, 'tklib', 16), + script_len, + script_offset, + image_len, + image_offset, + requirements_len, + requirements_offset, + ) + + fp.seek(0, os.SEEK_SET) + fp.write(header_data) diff --git a/venv/Lib/site-packages/PyInstaller/bootloader/Windows-64bit-intel/run.exe b/venv/Lib/site-packages/PyInstaller/bootloader/Windows-64bit-intel/run.exe new file mode 100644 index 0000000000000000000000000000000000000000..e5a33131233c8a3826bc71ba41af9711764ae71e GIT binary patch literal 268800 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 z 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 SRe8}R?3cZN*gG18OBx| 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 Y=c(`Y(=H!cQ|2rS*-c6RpZNKI0M#9L9RL6T literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/bootloader/Windows-64bit-intel/runw.exe b/venv/Lib/site-packages/PyInstaller/bootloader/Windows-64bit-intel/runw.exe new file mode 100644 index 0000000000000000000000000000000000000000..4a7ac96c54873b8d5f85a63fba4bdee03c35df09 GIT binary patch literal 264704 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

CGWbrx`h9jab9qsza8OUTfD&n$`$#7%D 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/building/__init__.py b/venv/Lib/site-packages/PyInstaller/building/__init__.py new file mode 100644 index 0000000..792d600 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/building/__init__.py @@ -0,0 +1 @@ +# diff --git a/venv/Lib/site-packages/PyInstaller/building/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/building/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa5f875a1daff3326f55e1e859c2f563302cd3e4 GIT binary patch literal 191 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/building/__pycache__/datastruct.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/building/__pycache__/datastruct.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1cc5f1ce0af99c2f12ab7fd5cdb634ae8ee707c4 GIT binary patch literal 21051 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/building/__pycache__/icon.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/building/__pycache__/icon.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a93709507bf8b9feb226ba1821d1888d5387fa8 GIT binary patch literal 4671 zcmb7HZ)_7s7N7O59sdtWFeNm!g9Es}CT@FeK@GtwPzb(*lr|K#QL1#~9oq}*U3Ye! zKbC{is?`O=si^9S+!b`bs-;x@aQSc_`nf$_Pr5HQvQ%p&B%~A4<(m;bDaWUKv+KVR zy+6C-H*em)c{B6oz2A(#3b{%<2vM-fdS50c!H zNAYHT%WeoywfgHO?}du~(vD7@ zCNB+i`K?Zp2`uuWkBR>RDDYx+$&St@Kxuw9nbT;8z6xZuUA2E3M6r44pUOqvcl zmu#IEAYqvQJp3NK0OXf|eAfV%-yT@zj1H|L*By7~&^3-jSGG$KbzgCla47N$QKJsi z5qs9;be*Lq#t$ba#%5G8J7duN5>elMcT^!HnHdGoC^N8)^E0R9xfxwH$Y@SXUVz2u zGiR0(s&2r>5czWgi#ZxE>{nR`DRP0#T5-ZQA~vpQNm0?` zv6kKlOhkVQ$Uop+LFFe8LAmwZ7kuf+A6%ci>~<%80J^BlK@6fS2W5cy4cBtfNVkhF zIl5gWA%h+3jc2O^JCDsGXTw>;siVxPlpT}cPeFl} zp$xbw!`=VYFQcHV9|p47a7-{>4#sbZzc#L(xKzAST${KtRqFfgx$EcFCaS%AZ*jMK zqoA;*PzK4AZ8p0WC0IBXLazfTK$12f$BxlR;ba6aWaMN9+Zcl9AVg)|icT4F1rVl* z6Lzk~@T*J=Dmg_om}~?f3c|nep&j=+&WcMci2(#8Eb3OG>oJ^2H2{T~mm9GJa3$sq z4KN45$4+A_M;8EkEFiGai%2niMj@gOcxU%)+5*sQWItZg@)So3eGxmwAVD?NLYhJ^ z14e8>){1FSR$~QkD_2J!axs%TWBLs$s(MbOL`^Q4!s`=9j}%6xv@C(80u(L~)xZl> z1GX_7ld=GBBzvUL6JeMTi50GcM`gfs8$L&Hj?j#lV;Bdsw~@g{S@1(1;5?VpD4<3R zpKVUi?k@t`q*4TC)Bp`wEBF*Jlpzb41E5aAQPFfY8&rec>u@7OyUwi|!_h(0q3Nbz zUwiF6H~UV2!AZ?H!QkjPJ8Vq1o>L(I7Y#F*A&axRoK{7+BEub8&~ijI1qy*~@>y}w zz-;)vbj3UpOE3TErob@Q-0_AgOW+nbvWR3ww>3gENEv8SCnF3UD7&wk z+^p$=g%FiRmg((S3YRk7FmKBO-OqG;XIqgm3jj&XV7twB+jPiT%I+vSOMTq=ylf@A zIq(SlqvN2=P(a@Uz_7W3{`my*2d^CbD1JG<7OnX9R(*Txh;#meyAyn}j8Cq=1jH_t zV4@mKl--GY1EEh2{xC3ndtkVfs0_ra1F`o`tsGfds%;xw+p`v43x5(=Nz`4)-FNkL zxn~cQdm&J*hGMJUJAuBd(Y3RcK)4zR!$_XPC9xLTaqZm4=WZOcQFh%6b>+!JRiHzM zszZk=q48>HeDy?~2X(8DMeeiSKQhvmJ&N1h+-5&#(Qr_`nmTL>)n8k=ph>b-vlS z`^xFMv(c89DcV%I1`0~Zoi>2`AkuRVA?CD$TH&P{htQtO6 z4!;WfyJP3I>5r#Nu1Y9U4MnaxYX0Cy6PG8hPFDQGRsV3=KU@!hEz6)q?laRrGSZek zinDg?5n4eM8ea9RdNymmVATgRbux!HiRExd;1u`GOLfF*oBnmCvvqeoQFpdK-sc78 zWFU1UFeigCHhK{GLuFyReg;zITW<8|82{~`>^&Ak-^C)Yg!n%X9(jJ^ zAo`2{NZ&-1|9-b08sA5SiP4_#M|s9S%Q5~rC*uzepWMYq-5Zy{>;|*FG0DgTBkVZe zV1J4?b^)PB8F!kIX&_O-Izw&3l#d>SiuKlAaV}JPzK)<;&wn%Zr-H?nUps5p?&l9LV; zI9&FRv*J5k1N3-d_0-x6rR{4YWnZM`-&?keZ(l92uWT3p{<_E6?|{hYci5A#R`hS3 CxV%dM literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/building/__pycache__/makespec.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/building/__pycache__/makespec.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cfdf55b956b2a9efacf387f467956674aa77f35 GIT binary patch literal 36407 zcmc(|33MA*njVS*0ir+x1jQYsmLer?5&>$nWJwflN~9K>qG&C)L`#Ms7Dz%S0lEs5 zL^RmubDU|~qnT!V+%bD%C!9&QL#H)~GMQwY?W8Bmdz~HNpd+Lboza;bpObkx?>+X> z^oiqllDzM~x2jO!B2k$+Z;Hi>s#|yc|Ns8~fB(DvRj;?ihU;Ip^pF16U$)u)6TKK$ zoBr_RYr$sw#3tK@Y_cHR$Auw*{o04@?6+vBi2XW-9QZ97cTN-!6;HT^Tmpr6;9VSY zvuEdc$wcW;>4ay|618`NWo?EfW<(6@txfi@0x98U=||eU1|R z82|hlsvfn;uHO`fYGiR#7^;=s@7spz*87o9ubtCVL~otp+3R z=S4^f|9VPWBlRPKT=u>&v`zLQ{&p6t9I>`MCDslWssf=ZBRf{5D6wx<_*T8SEhUoYcM_N5+Q8diPTC2vKUn`OJaP2N6g15~!*&rW}MreC}> zf8B?kjc~>@h15e+c!V5jlXn0jEwcThtzAlJu;h=ZMg#43t-QDI zRL|x9OQDN{eJ2NdE}hZDGw09s(Nnvi6^+M7+nrk3&8e6?9*NwIBqk=u6Iv;M*I(kX zh#Xb;iw7@M6#iDCPL7AwF?vB(?x-4)!^)j#Oe@ACe%p&QS9D@Bt|U~g|eL zh@!b;@vt&H7QG$OicryElipBh2mXm_o{Yiy#Fl_-T(`_{izd#DZ}gk86;kh_NqyE( z)Pf4J3)mM8d?Q>-+OJ(}cWCywsyQaZi7`!##gz&6Tsl8P^yraN+prLxp4aE zwODxKT0)tcj>O)1Cjb}@j|CF(`1rNkk=X5P{n4A()Mz3Sm<$iU9UhIS*9NE0#?%BV z9Z@Y$@WaxE<+0w&l$KfXkYa6yg%7pDt@#RkjTg9HTUEBye>%x6C zc4jt;O{H9OrEDqTzEFs_8DJc^vnM|-k#L;@6j>`EumLR*Nr{Z3E!~E1oP7WpqjkiU zX=_6Yn(a%9j<9yd;zrec^l(g;V)29&zNyB?rxKAM%kMl|9H?E5NN-0Xllhoau|#}o zcq}6GU}$DeU|dPGI~8KIjDR#}R7Gl<3ywix`)<@yAqr{1zd8VC*7l1Mn^^Mxo$t)NH#2`FmDL{~ z{^X^PURr!HQ`wQN?3fcRUJqWJe<@Shm96ZW6IpP@k0ces%rO4V%Ruy#{qXt@NGf83 z$g+{Rf~X?4SoEoV&IZQsc)tWft5|k|-8tuMcZH#1pw6Y0UyM&F!;#*In&=rOR+c=? zfZGEUO-vBr$D^@`6z6R2&RBGKOiEC5ktU|b6Vb`>h@`R`i@c-mxINujOfiO%M-{JE){(p>re&v}@st8OROypC0 z%JD`JKEcK@shF&@qkUIIyDKFCx$}c+lf%9y;yUok?|3w z8Q&E`m*xm7qpDW?_8s=?4uyunRn<^Pr2>MmC25vnUTMdB(!UyFK_lsId{#T)d_8N+ ziFLo?{J?e3l@;q2b}iW-oJ))SxPS6G|218P*Wpt{LC7R!trtiP$^lxxIZC}VZv7YEFiMKOpF4&eXEZaA;n1dvh6cD-yy zNP#=#!TX>jCA@C?L=bHEe6m2S{Ew*p4SYcj#~$3P2@_V%_l>)2G!l#4om9G$9qY6L zQkp`cVApsYPilA24Bd-F)gYYzjK5i1+8@EaD5P(M(>I5+H)OmmG;&|7%bG^AtnIC9 zcaFZ)ue}P{Gt`Xk&LfBy}u41wHL11P-y4r02MW4CxyohOFz2s!#C6W2LIXqe|i)@`hDSzO!Jj&^A#W~ zqkESip`F=R`;ul`fNqpQdPP$_S0S2SFWeu3T0opfj53CzW* zKf;Hz3yDvsmzpx3K-LpTdjgL{-@JR_;HO72Vsln(ekgV2pv$?@S(hzS2P+R&!Py&P(YLzc@8MG6R3OPsVLkte2jq$f)w>w1u08X*3bfBZ)d5jq8$p*WCG^^^-@k@NJ!79K z+Mp{!xvsfVtJq}9{x-1&o9cZ9;xuJXLZlT6koN@l^D4yl(N($3IARqLrp(a5iv(fn zBo;m6xN3_zOkwCS%A<6pYzc3^_^ZpkN~}2{3{Byik7Yy0wooi6B`K#2ky{`Xog_?0 z?89~e`qI7MGN9b<7)b6SE+@4%tE~n%4Ua34unbNaG1cyNyHbHnzY#i>z4!&UGWBU? zD?F5KaI_Lq9OE%cP&q;#Md%G^B}@fZ??jD(y40h5hXsslxoeD zh_j|c0VpNz>rlWp^BS4X*(#VW4#hGWzKI6LG95zVm+`NbGj8^XI&0rO{^9Y3x=d+P zwzO%*R^;4{_EBCne`W65X>nUl+OuNwI2)Oh5x36y=TATKZMk>nyYGJZ?!t7&*PivY zFI`>s9ZK{2NGN^t?aYz4GrmJv=0hBF$D{hKpSC`%?^v$ySQ`7%oerGH)St}OpPYMj z?p4kji`+Yqx#1Ms8g|gPxmQCRkb!)GTK-9H%kbYS89!g=Z< z^yYk(tW4j^`1WLdD7D~~a-puKrBPxopX~wBsDt#u41S7~8rJU8(`U7q!sS_&PwE`*Tncq*bNbd4;1ghJMp*ZWgK6gsG-Q{))X z9AlC3NroQH8KWLfyF($_p@|nS4-Q`FyLeG)!z+_P_(TebvWFb%$#C)Gz!Q`SYcHr_ zZAHy~&?JJZl*QMxwnzTPtbg}h@!ahX%5wD$c)0U{uds8J7TXtF;8<^l2Xxq9p)$Nm zPCq%+0aK`Vt(=Er6^mi=BqvTEUW9|pjlUIpk#jdS`^`99z)@1e_%|=`5_UZy`;)b! z4Z9?|+SCEnwi!Sfi1$t0jL7H0vFM1|vo0V6YF~^HR<*Gr*2apS+Qzo(G}d<)T52pj zZe+t$(B$5An^`O#h)|IN=+m<@SsR>k9i>sCaMlt4`KmeraHh)?m1N6P>k3-nYULe@ zuD3t&bh_})mF-UB-g7-u_Exs+t+eVpNWt zm?rn))Fc^nIj&z=7uPUd1}1sg0x)Fgh07!S3p+YoV71Mxv6G7?cPkP#l%%Rf~lE2O_C4{eA=wAx9Qdq6R=&!bTxKC8R~XTA1mMb`#( zFwynrD2->KYcx|fmMt4gi(^kgmr6w<=RHbtExMu%UF*3VT@-bFbk*a_TDA-3>yV4U zd>xu&5E|zi9!uKtlM5`a)wY;7q1`eBJT#kM1(k&iMh~t1u7G!H!R*2_H4Ao;#Zftn z#{#3W<5nDlFTT7w3fx8SYCglD98#x7-~m0F+MMP@-#wvP)fgt=l3uEbDNTPFL3Kzz zs;c?;^vC^+&FQMPImbPB?$FV+cy!K@6}K)VvO5l>+07tX00=5JRpZGr95Mw_OXJsU zW5TQ;HL^T73Y9$SgslRGkp#su)0nMFxXlkwN$(d*t3D6>AsTfzLN1>Nx%74#+R3X8>l|B zD8*_HNzzXt=R^Ffhv5`*$YUf0bw_kEdAPpITOg%0jDPbo+QXAxcx}`I(GHy$W3Ua; z2!n0NB^SdLWfxqxEW#~eL)WEp3D8xliQuVW$jr!aiJ6aO=&=q23o^A&3Zq1HW{^~o z?qie*ZC3X&TQQ4al4HuDRHtlW3xy;lz(D`GXvdn8 zh^js1eo74Ini!VGq-;rncjX(UTs$fyVPzP$Tez7+El!E514eSnsR>ZBbTIPJl3fK% z0dUR_*u%1cuOSomDJRl$JtZv>X_-kEn$?jOzFKfy{EW2RNXw*yHEH2%o|C5>up`yZ zl%S5qX7-kcRLN>+-m6QAW*m|sYp!+UxXn1?nh5Y%H;&VcV_}^6*z3kAHse^^j~Qv* zI4(1eIj~_y*r;q)ngWGbD5@ksiXa!i&Dz^$s7@|j^jLE>o~>yY;sSUyTQeKy^9*Pe z!*LAY4<|6)ArWSy^r}{6`c1>S8XXReM=`!@hE%6+awDutW+fgQ!xfr$I6gTYqR~l8 zOM_6RUsV%tM$uV@POo{#qOu%`>GLT5=zrq+Mks0bDkPYdd*l%3)m$_=1OowDRVXaW zp|N=U?Wsg`Jj5fy9!$Pa4YV!n$tVQNwnF!^7G*2*gUUGt6WQ%ZsIZ{b1&Nr2tu64j zRJy$218T0^MWNeEx%N*L$k#{n6cn!9cr$WQeu;vAhnzV$TJ1)KbOId8v`X{_^MP^k z-dj67lUocqU}`(R4sZ20!BL>zm)QJ`3uTKZpz3&Y+jgh7?OnP_%1(W*x_~Wm@8#j9!_sPKw%E&!^EKyWIcz{9#RMHbKF*8S~LSy(j1mElLfsa0x-DXPstjP2P6lC5MTm#nr?VlZluSdA)iJ|lf=?+p6)q_b+p zBbYuFPT+Mny*k)vB9&Jk7gXl)oZOaggX{3E-$xL=_mLA(>3g2E|HMQ8*=7IPpYF=| z&u9JT({+OxagaXcp<=RZL?@BUpfZSu%|iu4At-BJ+1MB^Zq!*iE`4j?jPe<>XfNVS zZ4u9!mu7uL!{gw*7(Z319N7oDBvj5ai5*dGg*59A5JC_m9{h8H$o2Bj+dHM8e{~A@hVRf}F(f{K* z^*;L0-?QxR`3dO!bk=`5U3VrUp7}GYci?ID?!c&ut|%P8q)bINLjT7Ehvq^!m@x}g zj6WcV6f}dh|CNXS*OvXSr7ygm@xPJvzmcxHk`b@`nSrF$&`1hef<^y(I#GO|fU&(0 z7)Dz#QvSnr=%V+b|J7wb3;-GbYgs^}?m|Yq@Mi{u-39uo6%u*%@9A*(3j_ygeK_RP z_-Y+UoPOvZSoRP66rABw)_*BocR3?o-UK9`PZAV%2r!4+u6JfpB7PYY0JmZ)G>kY2 zNCN|rP<8d%C(oEINDubr-s{IC1JeXK!+#(A*MQadxc~YFy!8_lCh1=vjwr@|#%Hw? zjwx4io{oo}1IwNR513K6$Lm{q7)tBpqQksmofz`y!8;mn$UEB3?A&J~;KD1zX84R%|LTP!$FFdx%} z&j9l=UHF`3KBfzwtIWrA;d7Dsm@a%?XFjG|>~NN>*w#ASTt#&#uys=Rl4%~TxM40^W8>El=`mg_Ql2mU=VZ8+>pcIu{ZAzuYuG?d|5{Lh&*zCbki}$+`UOngWtf`2pIlS7jUf0fIR$9U$lsRVy+6BY zO#N^2dkpe_Zk=|u5ftCwG!*~5{7b;mch+e!8`WY?{y_flIV9~b%l8oDSDqt>Urp2- za7OF@?i#7PQOV}z@5vv@zsB0a$Il_3zAyg;2H{WEf$&CoEyzD$aejTBI2&Q*FK!wu zpC-2cFG1k51WmTnuXP}|QOW+&rc3sh^GX<^0jlI53zlwTorNMrY1w9M z7)#L<^P4oP#HS|tav0fq)8o?Ts z$UyS=Neo3NFv(fM_rOSe91CQz@R!!(T30ECV-l9<4o@X$p0U)XuWM_^e7ToEr&@8C zEuQ0x%7)>C%uglVEOVOuLGzy}Q>;{tB%2Gf#AiK2*^);vSrP~kRA^R%R@8g;LbCT1 zFCFU0Qe)6FYHL}iY!>gR1e=h8K^VzgdD)K1CoL$Sq8BojEDi+7Fr2(FKub0W@~Rpg zjTvh;IVfZaD^%D@87dN6YiY@41dIL>5?>A7s!BI8%a@XD$0Q4uO;sSE500q;vn0v? zcnYZG$l)ukRlJQ)V?B?)NQYKbQ#!`#YBMT`LE=jh(XE!Sz>j9c(V}buwJNnmgOQ*V z!QArc#29(=DZ~t179>U!v<|Rcx)VhrnC8wF7|TdIC|$-h<)&a0!9a-wP#HoxfNvCc zJdD}P3B*ib=~05w381Xz!5mEPFvyVuumc5-C=9-8gce^DdSP&8Ry{U=82;B79_W#= z^avB;!{ZVeEA$EhPDb4^B55T{OCXe$=IUdt63vRQw*}6|v6P(>3`&;(O=FU^#H``Q zRDVPRKxwdmAl+nH&q-@vn~b7!e+dh7*;03qCFMgPm)a~PoNgy?q^VnAB60^UmB(Oh z6s?#?rgx05vZeDz&8G9~ef8oe;*(g>eLFHv#Aj5*gainMR&KGCT+~KX)DDYL`GP3G z;N~>iG|GV0`E5trQUAC!30!fQQiZ7&&&*;9ln_LdKs=)o1WMFHUlKbE&Vb4yoSa`0 zn}}lFRuBUb_o=B7hu{st!*R|`PSb3_HF?j1a_+AqoddA|pLya9N*5z2J!){{MxKst z7#x(4$-eRtpiP$;Tx&Av3V`PVp0o@NIowrxh@bt-9xU$VDCY#s^3X@crMB@X7JpBv z)Y=BGUOIDrfbDP)l+GEeg!3pun~mQgswlwKjT_DCjT;@r-U;StxF(3rmBt*bQr|mM zn0Sj-C5+uu^B-+*_i}&VK+m~8Hu|5u!5AmVfCpeJ)o(}DDDezE>*2U;axu;(+f*V+OC_I1M@~*h ztdOkCd5U7Jl??#}@}^ogK%bOP^06U_Gf89qgTzJ=309oXMnSmx_6P)gK1*WLWh3zD z4V|&FB;aR#SCs{#p0})J;Y^FhGXK;{QIXHpu;(gd+DzWGW^8==QwD)IpE*FyCPpN` zZOu228L&c=t?T?tpJ(!?TqcHw$?1SOv!!&f=j5wBr#aoyw2kE8Nlbl_i~uIfSVI+? zrv-li^OW^rC{TeVdxhq8B%_#HAr`*Wqp~?56XCE|_Qcd4_@pqF_r3NCZ|4&8xq$8A59E{~FY}DumS( z)Vc{t|1MGPOcn&CoSUag!_3un*u4P5H!ZrSSv` z2!#n{q{Q+{Qwfvqoc?HXAIK0IJcvOjJ9N#UH&8BI^TIYGB>|FcN2MOH3amDTM)cIM zy0UUq7ktwUtbyBxCa1$0bP-XQLV;eYPH|Dp>{BK&uozJ~q~S2vb3jdqf`vBFL&D&r zstUv*P9#iwq@cZ%FI)IcZB(C!5=}DAXN=bbctr%(@sQe#RRTozv^7y80PTS%(9Wd; z@AE_xh=UZ_W==BG1mQ83NKC3nJ3FzU95dlrLkY%}(ar;%thAlO6Ef}O62xv%<2$4B zK?c42o=``n1Xi3gh~zz~eoL|^6hKrHSd~m@rXDcM5~b!ury~og=sgwQ z8zkKwjGpgzMJW&oQ-eYaA>}kSiWqr@3AL1Z>J(yv^nRX*uE$xUpyNmV3A6ixvO=$9 zd|!sJ!+g-Ocyu_Ta-lFx@(*1;qTLA)fhL+y&i=mF`}(_SsEjSsWQ(i+2xD|M8%9!tpnPa4ab6BWo zaOfpUe>nT8nH6zk6qRSyPyMhzoc)Y6TFVSH3CjtwpFt37y7LU>?@-bIE;)HA2z`VX zia{VA)5`d(zE&60YblF>5xo+eo5sM@Lx8J%yo>d+yPKW?^CrEXM9q3F&gS`zL}WHPT*bZ_fXb6Pr;9Okn`xJ)n=qV^WP}C>Xp_n% zGo28t59RnBl?+Ery^nPFmjM-_?aiVI2#Ij-;e$J!HWfX|4iC{vTrLWd&? z?fjRYEh0}b_G6^XOe|Cosx{GLo||*6NiP)fIWifM*0O1>Nw+d`!(AQ;%~rsj3lB@@ zFG^Q*;T9b>#3Tr0m@JVXTkM_|Nx}vZBk2RAMzAf7;hj1UH5F_NIbjftiU>$Sb1Rp2JcX!qode`f}0?jM8QsW43D22c}((!e=0Ly+2`cHH6TfbRuZQMx^)|;)d1bWH%+o=1BDf(T$#Z@&yk^d z74_(V0E$MHFszGrV!Uyz3dRh!Ff;19`FMCLM*H`1r3b=0ayLr$LTbm1hIQg>529hL zCv5D2D4DgR2##Gb;j%R%$s=9VK!fn0a{(HlbE_* zF4T}LL(4jz;iQx~zbk6$?s9Q`Wa?IBcqL_?1F$<#`k-;^<1!|fGN5Rw z0R|{2tbkfHNZzlF%qS@$q)*8o=^yv}n>jCc?vj2DNPNs~AUe}L`WtUz9jtFF>3*bQv&|tn zjT3EKv=BDJWo$>0^s>fDjql32{_f;1O33)gT7~|pAOU+|LaPAw6_9vL4jJK-yLz#Z zH-eE50Mh)-WLd!603(>JBq6hETMP_Yk${CjQb-^f70}$q6PAWy&lI-LWY`HMoyv(q z^PV>NfDw+$xjt981fn&PAgE&qi~_?Vf$wadxP)O*q;haR(kYLR>sqJr5vih~(+)fdi4tb?L1|;u0$%8mn})xj zWaMVFC)VKiQu=!D-3&`zBv@SJVbTwFQ#}kwpkHRd0(InCz$g~7#R{|M#RQY2GV|UR zN?H(^F-S%{hHWQIqgJ-2Y)p!v zYsWiYQf0D03nq^m?0|M43EZ3xuuinT@d>(AY($e7GFNBNlL*VVX|!H$Pu4ND zZk-KDk}wy8u~8dDV@0nZzsW_iR#(Av#N?G(*biYzx{X#l1!)8JsFl%s$b3)!ZXX}6 zC2z^}W{sco$GldD-Z11QAKt}y6iE}^oPmmfP+?19ds1~?zR=G)HmpwrZH6EY_(2d+ z9IJ{1A|o&AnIZs_#H8votpce4{$zY*yFKDNfDSb;NJR}MYhfKw?*_QRBmh9eXgm_d z-nCn}S19k5e6m(WmGYm7tFT@S8Yh*;kcv~WD9DSO2ceF!v2_S#s8x_8H0Vz#oSaf7 zVVYsKb{f({_nt{^N;HgF@vzB}Ed|^A@B|>9sON=A8dC4TMUvVKFGjl#V{`HdCL+Wq zf)mr!TY}{|2%A2(zF?MPz=D;-m{M^RK+AU(3T6}7^LE!{bpU-^1$%0O98elqM`)w5 zB>IUKZ>^NSgeZ*W=(%w6O!x>ixl1f2w+ZPnrMA5AJVwLgQJD{tLlL|C;-S!?gWyWa z1pNStRNe6Se&`UK*i?yjwnI4pKciQh55`z6@d2m`R1#A>f-CB#D{D(^(|a_g8An%< zI6pAW7lc?|y@HCMOrUAfo!0qCIHXS|zvD!2%o2gMgzs%{0Vze{DPcqHf{tjucMd^H zBt#UX(`{l}+hTa>bPF%>Y%fgUXD?k%{)3ZNlH-({n6@H8R|i>RGEBv0IBGY@3{=I2 zKB*}h!)V0j4I{R-JHx?o|M zGnA6GoSTbiphY)+1+Z|1hQ7-5_mKYX7{nn2tY`CvF*U{Lqre)3R!)jOfm0_rE}Tgn zy`fK~y1{f%23f0w1JIbD=fq{3zS z=P!~trU?(BbA4yAWgsq0e$Z!Z8JYo?uChcm3QGFMN(5tT0ZBt9?EsT_q_<%V0Ro^K z(Hn7R89T^~2BiU#fJ`z&01uwOnD3Gobcl#UnI|hCE?_or{*pm8&^}>ShjDHiT{6pn z8F&ldvJ(0VI3n$VN&PQEJJ*res21Nvm{l7B5>Ny4Vfw^+DM9E)f}_C>0O;E^5k$em zE;?)C#*KDD8cUIZiONT^9uyP^yf4XPChov) zA8aqzDxhaVcJPfULoBZ5vHG!%c$Ig_)Llsq?K{XeS5zYO6oNx1fSkB|I@HtOA3AyF z{MnOzT8-{=;q+x164bpfYDMTVV;|>)!gjS|yPmPVv|xEXK`9BN)}_3(RWOxBZ}7?= zAjtoNf7S1%)m+$1)a`pHHZF^e>867j@rA7T!fa2@;r!0PdjnY7n-eQ?-kO|mYp%R1 z=j~td+MJa?x4E3fe@xB_bINVbVl#Lp3*NwjAACmes$6+>&UV zuq0ZZ^M;=hYCE=hE2~~{vZS1p6r2_2lv%2HG9&h8#a>Gls~-7wZ6%l$k*RxGgzvHC518n=7xNIC0@C(eo=8 z?hR$cI_&rVbEmz`zv5##mQXTqR+v*`CgaB*m^^`8`PQ5lcU+GlQVcjN%&9PAY_|k& z%z4#kpr9@%`YkaUa^8t&WU$o|9DsZ085z`Cg4Yuin)C=8RlqFHHdf!zGt%E_q>tb& zl>U}yq%TnfZyj)w^S-rG%D}%778&dTb;6&$tVIvKQOWCbUcI(dj&42lMs3BH^Hx0a zR%gB2A9;7^)Ko~f9uui3DoAN7C3|pP!Yj9s_<@XgFe@IkkT??(6&jmg!h>N}rNbJU|MC!%;dmXKyXV4Hb zDmTdaRpMZ>0pe0ZC!7`L)S1|9$$8s3@TelE*UzBB0+Ftacswf}w?L#W=LPTqkz>yQ zKG-`L#DQlpZconJs0ZZSccVtI?UAoT=kG;SJ2XtW_}_V%)bL1BfBI4`om zhb2M)=MpzIQxG0}BX(?s=t~*#<*fMf>Ux*g5b<9Tbb>4_T3&uP8vwF{J9Azvde)B`&qMX7vYq%NV1MjS8UF7_sH@0Jge4S?UmWL0#g{gn&{lIHo z#LCZ0P?|SL(_AoZNz!JGk8O`RqQ3Uaxn2Ca$+|1GIj zi(j?kL|WA>es!u{uEte=RWd{7^%2ef=1#y+iA-O75c^d~p zpj6eV%0-_M-uf%o$hCzuk}rLX@K;@czsijuma0+?CmQo9Cw5w%tMbpORU01^rZ-cC z9P1Kf)Y316hpq6(_~%!?bg3HJb#$gCC9+>JL8F5DrR>{)&e!D>Piy_MKaVlFUZ*DD+Lqdy+L4k{O~hG$Y_{5&J*h@zOJc7P9!t)*rW&IH zqty<1+e|>-J`;=;%Z|IkOb7l0Gr`0GOXwYFQO?zMUsa3FRHrPx%{HJ=wiVE~Wm&Ez z&Bjz`AymLiq?yiC+iU|;D$?O!kvNo(bIV-bdW()eVb@GsY)`5aZd#U1%H@=tPeAtV8Zmi6F0vo~s!TT`}Q6Xdp3DYXPVwWs#nl8m(Qz8mi*MdE!A z-kU7nJMeC{S9}ko1h_#tNM*$n;173iYA@V<@_ya-K&lMy2UEpxUr4z;6!K6?gnKyU zhWlb__pb@5+Eg8tD&=QxQOcL9NL8m=Qae+-Qq8H3R4^5gk9=D8BVlHvHoGoA|G=9P z`$CEY6iK!Up^*x-9KK4#TRTd2U2#WH+5jq!fEoc68-t-)IMqtt8tN_ zy#@74*^w$zw{4i#pb-wGSvRfN$qnOPcvjr!D95E|r6pspb$Jyu1zW6ir)?khw!dTN zM+geGt2P0Dsr^_)+&ysW5}z&m0a8y^U=FWjjH?`{bBsEYRm{&Ei)H(wbtG#|Ut_S8 zf6yE>)hD@yeWnQ_$6Lt*>G<+qZ#JvfI}|$IpkU7-YLvvDo*ac^9=BIBgTwZ$YRl@K z9tpkr@q4v0JAUsQ2Nit)lMrZ=2H5@f<43bchpmP`x(6!33^u4E-Eo-yfzXZVfKierRZb%HP_ARuN3n@yc`(6qw>>;Vfl zvfe%+c|>RO&=%s?D`td3+b(G(WC+9CNocw6W^x$;(4=ACVmtfE5W2;i@sww2s z`BqF(#83duAvQ-erDhDP)ACy>Ky#4uXG7*gV60~%j!72G&fl24eJ-kE5*)^5jiFmI zshcz3`6PRNK%Yhv@{{m9M}~_dLl#DgfC>?)un%a(e6l=4h{A0Dq+}Y~n?4;A{e%gU|G-2;KffOg zFI-&QwIrsu?lb*3dAaoE1Iph(48BwJhxBw0jwWLI2HVYFStLJF_LaX!A6)v_gjUX$ z2!--vH4610G=JVB#0Q^3`lu2e*^K$@S`j8;EB}ZR{C5-y-LC z$oV~T{tq~sgBZB-Z|VKtkdr27nVc*f>;S=*PO%e#HLw1{2e~z${%W+Eq>~*`tqFIM z&Z)#m;6=0n5vvj7G|JV!Cw~MUwfJ#NM7W#4=HdDd2nw}*t%Qy7$ry!H*b&Zb>us%= z&1%JTGCINztW{+^Un|Cu@R*OR5D{oDdOT8n>N?p&Ya^5z`s5&Pp%qPpC;9l3 z2cGO02t}i(|3J=rv?@mwlHtp|SD}{gBkZ8bFq-p@ zLZ_mV60eZ8L?OPZQ14wKHL3le^2hYNNX}m)htPrT)M){k@(;=5zcCNCZoq<5Y|*}2 zzHlo0DaH9e$@!WbLM+=TftT@r$1A~(PoYx&1$|`*Cz4!E8UKp>{xvzjM9vS$Ss>>- zjIfcZ+2uSl-MVn6CA%0-A^8Zq#Uy$?P$@!n;{0}&q8{{8i>_e+6TCSBFPTF8{`y;XBUgUEn5ku(PnYIgW=Sm;Du&cb?dHC_xrgZb6%+^C` z(GQHJeLJ%*9B%7$mf(;_6gFGAcTRjHmVLM6!x9`{oAvBSH%{d|RX=xP?@$=g-Pkpg z91+-}LCgz6uC#2vZSJMHmskb&Jvj65VDIw5-k)6jX>;b_VD{i(reQGS8Du9?7Tdga z>4tqjJ9zr1V&>p$*@LfT8eYqIUYi3hkeuE5(xa-n&nkbmZSRBjjK3@E@5)pi&sH5r z#TklzEAim$7w_JGH&ff45xY^Vs>XCx>*9skbGeFb>583;6|=AY0)$jXK&tzG)5on3 zE1H%onidZ)?ZbBW6~Sypa7oEl?0+z_T+x-T=wg%$X!}kHrt0(M8+go=^<~TYW>0@r zR`LA<-%l*Ok*RFXRyJqKaAI)F>}f<1y|XhI>6>$Y<*Ho}vab4tNZPd%_oMQbIVVa{ zj=@sz+}(w3OP=(hQ|U89>1(6u=-W$3a&@h9-Z}5%7uk_ar8t*qKEC8d;#+W*F=;wW-EcBhN3(Ftk7dh`&7K7) z=l8ugGdn|QEc>u5=b6lTs@Ed0x@OLe_JlTJMe>4}H1w%j!%$!(kbLa?5;Q+U3W+Fub%qz5Ot545B?0w=Ij?7KSro zQ&wzBi%mJEQhfOq)QC(&e->|!x)sMBcQFPm=MS$G;ps85ZJF;_II-fy8`5@H&Y#Iv zHLtkn6|)y`Wa-D-SKRc55t6!vx~#u*rIcPhde~hnUV5cz0P~I&A3bACp=$ok#lCcP z`^pybz>pWxU8$sJ37~ZzZdmAF>VvYgQcE6nHutV{bN7m$Ug|0T>Xin1 z-fDA~&A%`=y|Rtow%gn_^WR$8LC=!S?OzD4G}3bu_uom+Ew-8+kNquaf5%eO>@mG!xnmmin=A8!jju5Wu>+e8nzYnyWZmR!T`mCFJ}wHeNA&o8bCHXK7c`rYvl z#}{5)ytH)sH{QyW9n6*;oIU->?VTH)R~O$%y8{__AnOj$41>K7>T;zx3ES=73r_Ie zfe!~h>so5eH0;TEI7MxvjZyW!|A;zN-h=`{eH3IVu|bby#n0!R^=SY+oR-A z7=_GpN*TnTR%+>WGDVClU!+(mA_drP2@s?e*QC+~X;K=d7GvQqQ*cPP;aU#Ue3&*> zVU5VtjqaBc+~o7qxQg9#VfKI@~uoXtJU{wxnAv+VD&ZGU>bJ7;T27v4GBM0#^~&bBwb-u>8JKUbS| z*Dt)7aqr5ycg+%asDD{V`(L8lR`a;ZKYuuFD_<$L3olY7bf=_L0Ck&AldWd^LNZ;o zJ6+kqLe~j6;e4$#fA`~ee@^~?od0;p7VKWJRS5N~o!xeUwz#&qB@O|nrL1)p>OS4^ zbMnXJCnH2zkwC|iuJ5LI9m2-n2mpbT59TQn=y=QZ-E{jgiZaHcn86T*j#ymZ)uTjN z6f;OFR^Z#S(*Kzwuu>kI7abNe^N+9yK;K-F+i6>WC zoh$LtjrnMmwK#PpSL)4e!5IFQ-1eQh9lI!u*Ox29l$kBLvhrL_eXgR49^jIHWo}DN ruGXKcuFY+!q)9;VFZJcNZl?qh7-heE!DRXL literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/building/__pycache__/osx.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/building/__pycache__/osx.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c47b53da5d5c289f13b3194d0a4bff554b9d1e6d GIT binary patch literal 21542 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 aXfu2`VGp=p`F>Vzd@iN_{u?rhF#f+rjt$=c literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/building/__pycache__/splash.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/building/__pycache__/splash.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10eb93efd4d5fc755b6d9a7a44b9ea9d46733885 GIT binary patch literal 22412 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/building/__pycache__/splash_templates.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/building/__pycache__/splash_templates.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83c6336b085622b3eafa0c652167b388afd5fac7 GIT binary patch literal 6739 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 w@XYj%N<7DMCgH*3v!ZXM4s0H>s5W0AJH06951J literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/building/__pycache__/templates.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/building/__pycache__/templates.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54dfc99587486a041cbc6fb34a594dc2717215f9 GIT binary patch literal 2868 zcmeGeO>Y}Tbe*_qyGhfC14pzHw9TT}6M!Gk!$@2|(h>GvB^^tVUo z>oma24-oh*6459Uol!@uj8??zXjODaU2$i0N30!2>D`Nu;v*=^oI9|I)5#PR7(|l3 zEg?&eWe&C<^M6*O=)u=AULbz7T^iuUB!|?- zF;51`SBmFzEA4ii;P+_TW=59Irgo<$l-$kWe1Lj2K;(&3+(@v@-Y+WyDO%N{lkAL1B^??T&H*L% ze%cF0MTKx*-fyf+DA|ti+GacLc8;4V;D#-Mo;U!wo5&b><-i1dZD9D|yjNhS0d2<8mWV8XK#l>L7usiU1w859*} z8k!STmI-ux@CWljgEH4J62OE5Z#*V3+MRUs`ldH%BwS16P~d8r&t(+8MMGhvo&#$= zjS%PnQ6Ca-xCUpg94f{4`e4E3R)UVIrCQBG)`ryb^5c2qKP40I|iRCzrGo9yH z^`HMR9PT|o3Y8xdmr6T1l<*s+p4d%ge?w*UR>-9Bh2dq1_x$?D{cna%gKDq2EZ;}T zriVy$GNzkfsAf(oC9vX#N_Q;5SM6IgFN|l}+h=-ny)Lfb+@XJlri^brth;kN;WWLv z;8UQILFOOuK7rwKVVdFn;I2An9h^H>YCG81s&Q{kvVK_j+SOgggw7bd+Q4mnJHTF;yQ_7?uq6g$GZ+~C)i47dkT|^8BY#9M z{hayg@Y~%n`gH6}H3#+LMK1@)W<95MK0XC?Iv&c&*h&Yz5?dwO!;TN;-zn>Oo`ZQh zsbuaa$fu5`(0)08b?*xtGpiiFH0yYVA873}{9CMcI-SM)E1m8l@_+XpZ*?y>76+Z3 fhuzEd#kjNfUiWfyv9(sCTlY7+m$Cnu`>6acdFPM~ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/building/__pycache__/utils.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/building/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..153e2a66676b9f0cfaad02319e44ca91d4d71b14 GIT binary patch literal 34978 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 OJiCd0t_@h{{eJ+TLYNBx literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/building/api.py b/venv/Lib/site-packages/PyInstaller/building/api.py new file mode 100644 index 0000000..8276925 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/building/api.py @@ -0,0 +1,1309 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +This module contains classes that are available for the .spec files. + +Spec file is generated by PyInstaller. The generated code from .spec file +is a way how PyInstaller does the dependency analysis and creates executable. +""" + +import os +import subprocess +import time +import pathlib +import shutil +from operator import itemgetter + +from PyInstaller import HOMEPATH, PLATFORM +from PyInstaller import log as logging +from PyInstaller.archive.writers import CArchiveWriter, ZlibArchiveWriter +from PyInstaller.building.datastruct import Target, _check_guts_eq, normalize_pyz_toc, normalize_toc +from PyInstaller.building.utils import ( + _check_guts_toc, _make_clean_directory, _rmtree, process_collected_binary, get_code_object, strip_paths_in_code, + compile_pymodule +) +from PyInstaller.building.splash import Splash # argument type validation in EXE +from PyInstaller.compat import is_cygwin, is_darwin, is_linux, is_win, strict_collect_mode, is_nogil +from PyInstaller.depend import bindepend +from PyInstaller.depend.analysis import get_bootstrap_modules +import PyInstaller.utils.misc as miscutils + +logger = logging.getLogger(__name__) + +if is_win: + from PyInstaller.utils.win32 import (icon, versioninfo, winmanifest, winresource, winutils) + +if is_darwin: + import PyInstaller.utils.osx as osxutils + + +class PYZ(Target): + """ + Creates a zlib-based PYZ archive that contains byte-compiled pure Python modules. + """ + def __init__(self, *tocs, **kwargs): + """ + tocs + One or more TOC (Table of Contents) lists, usually an `Analysis.pure`. + + kwargs + Possible keyword arguments: + + name + A filename for the .pyz. Normally not needed, as the generated name will do fine. + """ + if kwargs.get("cipher"): + from PyInstaller.exceptions import RemovedCipherFeatureError + raise RemovedCipherFeatureError( + "Please remove the 'cipher' arguments to PYZ() and Analysis() in your spec file." + ) + + from PyInstaller.config import CONF + + super().__init__() + + name = kwargs.get('name', None) + + self.name = name + if name is None: + self.name = os.path.splitext(self.tocfilename)[0] + '.pyz' + + # PyInstaller bootstrapping modules. + bootstrap_dependencies = get_bootstrap_modules() + + # Compile the python modules that are part of bootstrap dependencies, so that they can be collected into the + # CArchive/PKG and imported by the bootstrap script. + self.dependencies = [] + workpath = os.path.join(CONF['workpath'], 'localpycs') + for name, src_path, typecode in bootstrap_dependencies: + if typecode == 'PYMODULE': + # Compile pymodule and include the compiled .pyc file. + pyc_path = compile_pymodule( + name, + src_path, + workpath, + # Never optimize bootstrap dependencies! + optimize=0, + code_cache=None, + ) + self.dependencies.append((name, pyc_path, typecode)) + else: + # Include as is (extensions). + self.dependencies.append((name, src_path, typecode)) + + # Merge input TOC(s) and their code object dictionaries (if available). Skip the bootstrap modules, which will + # be passed on to CArchive/PKG. + bootstrap_module_names = set(name for name, _, typecode in self.dependencies if typecode == 'PYMODULE') + self.toc = [] + self.code_dict = {} + for toc in tocs: + # Check if code cache association exists for the given TOC list + code_cache = CONF['code_cache'].get(id(toc)) + if code_cache is not None: + self.code_dict.update(code_cache) + + for entry in toc: + name, _, typecode = entry + # PYZ expects only PYMODULE entries (python code objects). + assert typecode in {'PYMODULE', 'PYMODULE-1', 'PYMODULE-2'}, f"Invalid entry passed to PYZ: {entry}!" + # Module required during bootstrap; skip to avoid collecting a duplicate. + if name in bootstrap_module_names: + continue + self.toc.append(entry) + + # Normalize TOC + self.toc = normalize_pyz_toc(self.toc) + + # Alphabetically sort the TOC to enable reproducible builds. + self.toc.sort() + + self.__postinit__() + + _GUTS = ( + # input parameters + ('name', _check_guts_eq), + ('toc', _check_guts_toc), + # no calculated/analysed values + ) + + def assemble(self): + logger.info("Building PYZ (ZlibArchive) %s", self.name) + + # Ensure code objects are available for all modules we are about to collect. + # NOTE: `self.toc` is already sorted by names. + archive_toc = [] + for entry in self.toc: + name, src_path, typecode = entry + if name not in self.code_dict: + # The code object is not available from the ModuleGraph's cache; re-create it. + optim_level = {'PYMODULE': 0, 'PYMODULE-1': 1, 'PYMODULE-2': 2}[typecode] + try: + self.code_dict[name] = get_code_object(name, src_path, optimize=optim_level) + except SyntaxError: + # The module was likely written for different Python version; exclude it + continue + archive_toc.append(entry) + + # Remove leading parts of paths in code objects. + self.code_dict = {name: strip_paths_in_code(code) for name, code in self.code_dict.items()} + + # Create the archive + ZlibArchiveWriter(self.name, archive_toc, code_dict=self.code_dict) + logger.info("Building PYZ (ZlibArchive) %s completed successfully.", self.name) + + +class PKG(Target): + """ + Creates a CArchive. CArchive is the data structure that is embedded into the executable. This data structure allows + to include various read-only data in a single-file deployment. + """ + xformdict = { + # PYMODULE entries are already byte-compiled, so we do not need to encode optimization level in the low-level + # typecodes. PYSOURCE entries are byte-compiled by the underlying writer, so we need to pass the optimization + # level via low-level typecodes. + 'PYMODULE': 'm', + 'PYMODULE-1': 'm', + 'PYMODULE-2': 'm', + 'PYSOURCE': 's', + 'PYSOURCE-1': 's1', + 'PYSOURCE-2': 's2', + 'EXTENSION': 'b', + 'PYZ': 'z', + 'PKG': 'a', + 'DATA': 'x', + 'BINARY': 'b', + 'ZIPFILE': 'Z', + 'EXECUTABLE': 'b', + 'DEPENDENCY': 'd', + 'SPLASH': 'l', + 'SYMLINK': 'n', + } + + def __init__( + self, + toc, + python_lib_name, + name=None, + cdict=None, + exclude_binaries=False, + strip_binaries=False, + upx_binaries=False, + upx_exclude=None, + target_arch=None, + codesign_identity=None, + entitlements_file=None + ): + """ + toc + A TOC (Table of Contents) list. + python_lib_name + Name of the python shared library to store in PKG. Required by bootloader. + name + An optional filename for the PKG. + cdict + Dictionary that specifies compression by typecode. For Example, PYZ is left uncompressed so that it + can be accessed inside the PKG. The default uses sensible values. If zlib is not available, no + compression is used. + exclude_binaries + If True, EXTENSIONs and BINARYs will be left out of the PKG, and forwarded to its container (usually + a COLLECT). + strip_binaries + If True, use 'strip' command to reduce the size of binary files. + upx_binaries + """ + super().__init__() + + self.toc = normalize_toc(toc) # Ensure guts contain normalized TOC + self.python_lib_name = python_lib_name + self.cdict = cdict + self.name = name + if name is None: + self.name = os.path.splitext(self.tocfilename)[0] + '.pkg' + self.exclude_binaries = exclude_binaries + self.strip_binaries = strip_binaries + self.upx_binaries = upx_binaries + self.upx_exclude = upx_exclude or [] + self.target_arch = target_arch + self.codesign_identity = codesign_identity + self.entitlements_file = entitlements_file + + # This dict tells PyInstaller what items embedded in the executable should be compressed. + if self.cdict is None: + self.cdict = { + 'EXTENSION': COMPRESSED, + 'DATA': COMPRESSED, + 'BINARY': COMPRESSED, + 'EXECUTABLE': COMPRESSED, + 'PYSOURCE': COMPRESSED, + 'PYMODULE': COMPRESSED, + 'SPLASH': COMPRESSED, + # Do not compress PYZ as a whole, as it contains individually-compressed modules. + 'PYZ': UNCOMPRESSED, + # Do not compress target names in symbolic links. + 'SYMLINK': UNCOMPRESSED, + } + + self.__postinit__() + + _GUTS = ( # input parameters + ('name', _check_guts_eq), + ('cdict', _check_guts_eq), + ('toc', _check_guts_toc), # list unchanged and no newer files + ('python_lib_name', _check_guts_eq), + ('exclude_binaries', _check_guts_eq), + ('strip_binaries', _check_guts_eq), + ('upx_binaries', _check_guts_eq), + ('upx_exclude', _check_guts_eq), + ('target_arch', _check_guts_eq), + ('codesign_identity', _check_guts_eq), + ('entitlements_file', _check_guts_eq), + # no calculated/analysed values + ) + + def assemble(self): + logger.info("Building PKG (CArchive) %s", os.path.basename(self.name)) + + pkg_file = pathlib.Path(self.name).resolve() # Used to detect attempts at PKG feeding itself + + bootstrap_toc = [] # TOC containing bootstrap scripts and modules, which must not be sorted. + archive_toc = [] # TOC containing all other elements. Sorted to enable reproducible builds. + + for dest_name, src_name, typecode in self.toc: + # Ensure that the source file exists, if necessary. Skip the check for OPTION entries, where 'src_name' is + # None. Also skip DEPENDENCY entries due to special contents of 'dest_name' and/or 'src_name'. Same for the + # SYMLINK entries, where 'src_name' is relative target name for symbolic link. + if typecode not in {'OPTION', 'DEPENDENCY', 'SYMLINK'}: + if not os.path.exists(src_name): + if strict_collect_mode: + raise ValueError(f"Non-existent resource {src_name}, meant to be collected as {dest_name}!") + else: + logger.warning( + "Ignoring non-existent resource %s, meant to be collected as %s", src_name, dest_name + ) + continue + + # Detect attempt at collecting PKG into itself, as it results in and endless feeding loop and exhaustion + # of all available storage space. + if pathlib.Path(src_name).resolve() == pkg_file: + raise ValueError(f"Trying to collect PKG file {src_name} into itself!") + + if typecode in ('BINARY', 'EXTENSION'): + if self.exclude_binaries: + # This is onedir-specific codepath - the EXE and consequently PKG should not be passed the Analysis' + # `datas` and `binaries` TOCs (unless the user messes up the .spec file). However, EXTENSION entries + # might still slip in via `PYZ.dependencies`, which are merged by EXE into its TOC and passed on to + # PKG here. Such entries need to be passed to the parent container (the COLLECT) via + # `PKG.dependencies`. + # + # This codepath formerly performed such pass-through only for EXTENSION entries, but in order to + # keep code simple, we now also do it for BINARY entries. In a sane world, we do not expect to + # encounter them here; but if they do happen to pass through here and we pass them on, the + # container's TOC de-duplication should take care of them (same as with EXTENSION ones, really). + self.dependencies.append((dest_name, src_name, typecode)) + else: + # This is onefile-specific codepath. The binaries (both EXTENSION and BINARY entries) need to be + # processed using `process_collected_binary` helper. + src_name = process_collected_binary( + src_name, + dest_name, + use_strip=self.strip_binaries, + use_upx=self.upx_binaries, + upx_exclude=self.upx_exclude, + target_arch=self.target_arch, + codesign_identity=self.codesign_identity, + entitlements_file=self.entitlements_file, + strict_arch_validation=(typecode == 'EXTENSION'), + ) + archive_toc.append((dest_name, src_name, self.cdict.get(typecode, False), self.xformdict[typecode])) + elif typecode in ('DATA', 'ZIPFILE'): + # Same logic as above for BINARY and EXTENSION; if `exclude_binaries` is set, we are in onedir mode; + # we should exclude DATA (and ZIPFILE) entries and instead pass them on via PKG's `dependencies`. This + # prevents a onedir application from becoming a broken onefile one if user accidentally passes datas + # and binaries TOCs to EXE instead of COLLECT. + if self.exclude_binaries: + self.dependencies.append((dest_name, src_name, typecode)) + else: + if typecode == 'DATA' and os.access(src_name, os.X_OK): + # DATA with executable bit set (e.g., shell script); turn into binary so that executable bit is + # restored on the extracted file. + carchive_typecode = 'b' + else: + carchive_typecode = self.xformdict[typecode] + archive_toc.append((dest_name, src_name, self.cdict.get(typecode, False), carchive_typecode)) + elif typecode == 'OPTION': + archive_toc.append((dest_name, '', False, 'o')) + elif typecode in {'PYSOURCE', 'PYSOURCE-1', 'PYSOURCE-2', 'PYMODULE', 'PYMODULE-1', 'PYMODULE-2'}: + # Collect python script and modules in a TOC that will not be sorted. + bootstrap_toc.append((dest_name, src_name, self.cdict.get(typecode, False), self.xformdict[typecode])) + else: + # PYZ, PKG, DEPENDENCY, SPLASH, SYMLINK + archive_toc.append((dest_name, src_name, self.cdict.get(typecode, False), self.xformdict[typecode])) + + # Sort content alphabetically by type and name to enable reproducible builds. + archive_toc.sort(key=itemgetter(3, 0)) + # Do *not* sort modules and scripts, as their order is important. + # TODO: Think about having all modules first and then all scripts. + CArchiveWriter(self.name, bootstrap_toc + archive_toc, pylib_name=self.python_lib_name) + + logger.info("Building PKG (CArchive) %s completed successfully.", os.path.basename(self.name)) + + +class EXE(Target): + """ + Creates the final executable of the frozen app. This bundles all necessary files together. + """ + def __init__(self, *args, **kwargs): + """ + args + One or more arguments that are either an instance of `Target` or an iterable representing TOC list. + kwargs + Possible keyword arguments: + + bootloader_ignore_signals + Non-Windows only. If True, the bootloader process will ignore all ignorable signals. If False (default), + it will forward all signals to the child process. Useful in situations where for example a supervisor + process signals both the bootloader and the child (e.g., via a process group) to avoid signalling the + child twice. + console + On Windows or Mac OS governs whether to use the console executable or the windowed executable. Always + True on Linux/Unix (always console executable - it does not matter there). + hide_console + Windows only. In console-enabled executable, hide or minimize the console window if the program owns the + console window (i.e., was not launched from existing console window). Depending on the setting, the + console is hidden/mininized either early in the bootloader execution ('hide-early', 'minimize-early') or + late in the bootloader execution ('hide-late', 'minimize-late'). The early option takes place as soon as + the PKG archive is found. In onefile builds, the late option takes place after application has unpacked + itself and before it launches the child process. In onedir builds, the late option takes place before + starting the embedded python interpreter. + disable_windowed_traceback + Disable traceback dump of unhandled exception in windowed (noconsole) mode (Windows and macOS only), + and instead display a message that this feature is disabled. + debug + Setting to True gives you progress messages from the executable (for console=False there will be + annoying MessageBoxes on Windows). + name + The filename for the executable. On Windows suffix '.exe' is appended. + exclude_binaries + Forwarded to the PKG the EXE builds. + icon + Windows and Mac OS only. icon='myicon.ico' to use an icon file or icon='notepad.exe,0' to grab an icon + resource. Defaults to use PyInstaller's console or windowed icon. Use icon=`NONE` to not add any icon. + version + Windows only. version='myversion.txt'. Use grab_version.py to get a version resource from an executable + and then edit the output to create your own. (The syntax of version resources is so arcane that I would + not attempt to write one from scratch). + uac_admin + Windows only. Setting to True creates a Manifest with will request elevation upon application start. + uac_uiaccess + Windows only. Setting to True allows an elevated application to work with Remote Desktop. + argv_emulation + macOS only. Enables argv emulation in macOS .app bundles (i.e., windowed bootloader). If enabled, the + initial open document/URL Apple Events are intercepted by bootloader and converted into sys.argv. + target_arch + macOS only. Used to explicitly specify the target architecture; either single-arch ('x86_64' or 'arm64') + or 'universal2'. Used in checks that the collected binaries contain the requires arch slice(s) and/or + to convert fat binaries into thin ones as necessary. If not specified (default), a single-arch build + corresponding to running architecture is assumed. + codesign_identity + macOS only. Use the provided identity to sign collected binaries and the generated executable. If + signing identity is not provided, ad-hoc signing is performed. + entitlements_file + macOS only. Optional path to entitlements file to use with code signing of collected binaries + (--entitlements option to codesign utility). + contents_directory + Onedir mode only. Specifies the name of the directory where all files par the executable will be placed. + Setting the name to '.' (or '' or None) re-enables old onedir layout without contents directory. + """ + from PyInstaller.config import CONF + + super().__init__() + + # Available options for EXE in .spec files. + self.exclude_binaries = kwargs.get('exclude_binaries', False) + self.bootloader_ignore_signals = kwargs.get('bootloader_ignore_signals', False) + self.console = kwargs.get('console', True) + self.hide_console = kwargs.get('hide_console', None) + self.disable_windowed_traceback = kwargs.get('disable_windowed_traceback', False) + self.debug = kwargs.get('debug', False) + self.name = kwargs.get('name', None) + self.icon = kwargs.get('icon', None) + self.versrsrc = kwargs.get('version', None) + self.manifest = kwargs.get('manifest', None) + self.resources = kwargs.get('resources', []) + self.strip = kwargs.get('strip', False) + self.upx_exclude = kwargs.get("upx_exclude", []) + self.runtime_tmpdir = kwargs.get('runtime_tmpdir', None) + self.contents_directory = kwargs.get("contents_directory", "_internal") + # If ``append_pkg`` is false, the archive will not be appended to the exe, but copied beside it. + self.append_pkg = kwargs.get('append_pkg', True) + + # On Windows allows the exe to request admin privileges. + self.uac_admin = kwargs.get('uac_admin', False) + self.uac_uiaccess = kwargs.get('uac_uiaccess', False) + + # macOS argv emulation + self.argv_emulation = kwargs.get('argv_emulation', False) + + # Target architecture (macOS only) + self.target_arch = kwargs.get('target_arch', None) + if is_darwin: + if self.target_arch is None: + import platform + self.target_arch = platform.machine() + else: + assert self.target_arch in {'x86_64', 'arm64', 'universal2'}, \ + f"Unsupported target arch: {self.target_arch}" + logger.info("EXE target arch: %s", self.target_arch) + else: + self.target_arch = None # explicitly disable + + # Code signing identity (macOS only) + self.codesign_identity = kwargs.get('codesign_identity', None) + if is_darwin: + logger.info("Code signing identity: %s", self.codesign_identity) + else: + self.codesign_identity = None # explicitly disable + # Code signing entitlements + self.entitlements_file = kwargs.get('entitlements_file', None) + + # UPX needs to be both available and enabled for the target. + self.upx = CONF['upx_available'] and kwargs.get('upx', False) + + # Catch and clear options that are unsupported on specific platforms. + if self.versrsrc and not is_win: + logger.warning('Ignoring version information; supported only on Windows!') + self.versrsrc = None + if self.manifest and not is_win: + logger.warning('Ignoring manifest; supported only on Windows!') + self.manifest = None + if self.resources and not is_win: + logger.warning('Ignoring resources; supported only on Windows!') + self.resources = [] + if self.icon and not (is_win or is_darwin): + logger.warning('Ignoring icon; supported only on Windows and macOS!') + self.icon = None + if self.hide_console and not is_win: + logger.warning('Ignoring hide_console; supported only on Windows!') + self.hide_console = None + + if self.contents_directory in ("", "."): + self.contents_directory = None # Re-enable old onedir layout without contents directory. + elif self.contents_directory == ".." or "/" in self.contents_directory or "\\" in self.contents_directory: + raise SystemExit( + f'Invalid value "{self.contents_directory}" passed to `--contents-directory` or `contents_directory`. ' + 'Exactly one directory level is required (or just "." to disable the contents directory).' + ) + + if not kwargs.get('embed_manifest', True): + from PyInstaller.exceptions import RemovedExternalManifestError + raise RemovedExternalManifestError( + "Please remove the 'embed_manifest' argument to EXE() in your spec file." + ) + + # Old .spec format included in 'name' the path where to put created app. New format includes only exename. + # + # Ignore fullpath in the 'name' and prepend DISTPATH or WORKPATH. + # DISTPATH - onefile + # WORKPATH - onedir + if self.exclude_binaries: + # onedir mode - create executable in WORKPATH. + self.name = os.path.join(CONF['workpath'], os.path.basename(self.name)) + else: + # onefile mode - create executable in DISTPATH. + self.name = os.path.join(CONF['distpath'], os.path.basename(self.name)) + + # Old .spec format included on Windows in 'name' .exe suffix. + if is_win or is_cygwin: + # Append .exe suffix if it is not already there. + if not self.name.endswith('.exe'): + self.name += '.exe' + base_name = os.path.splitext(os.path.basename(self.name))[0] + else: + base_name = os.path.basename(self.name) + # Create the CArchive PKG in WORKPATH. When instancing PKG(), set name so that guts check can test whether the + # file already exists. + self.pkgname = os.path.join(CONF['workpath'], base_name + '.pkg') + + self.toc = [] + + for arg in args: + # Valid arguments: PYZ object, Splash object, and TOC-list iterables + if isinstance(arg, (PYZ, Splash)): + # Add object as an entry to the TOC, and merge its dependencies TOC + if isinstance(arg, PYZ): + self.toc.append((os.path.basename(arg.name), arg.name, "PYZ")) + else: + self.toc.append((os.path.basename(arg.name), arg.name, "SPLASH")) + self.toc.extend(arg.dependencies) + elif miscutils.is_iterable(arg): + # TOC-like iterable + self.toc.extend(arg) + else: + raise TypeError(f"Invalid argument type for EXE: {type(arg)!r}") + + if is_nogil: + # Signal to bootloader that python was built with Py_GIL_DISABLED, in order to select correct `PyConfig` + # structure layout at run-time. + self.toc.append(("pyi-python-flag Py_GIL_DISABLED", "", "OPTION")) + + if self.runtime_tmpdir is not None: + self.toc.append(("pyi-runtime-tmpdir " + self.runtime_tmpdir, "", "OPTION")) + + if self.bootloader_ignore_signals: + # no value; presence means "true" + self.toc.append(("pyi-bootloader-ignore-signals", "", "OPTION")) + + if self.disable_windowed_traceback: + # no value; presence means "true" + self.toc.append(("pyi-disable-windowed-traceback", "", "OPTION")) + + if self.argv_emulation: + # no value; presence means "true" + self.toc.append(("pyi-macos-argv-emulation", "", "OPTION")) + + if self.contents_directory: + self.toc.append(("pyi-contents-directory " + self.contents_directory, "", "OPTION")) + + if self.hide_console: + # Validate the value + _HIDE_CONSOLE_VALUES = {'hide-early', 'minimize-early', 'hide-late', 'minimize-late'} + self.hide_console = self.hide_console.lower() + if self.hide_console not in _HIDE_CONSOLE_VALUES: + raise ValueError( + f"Invalid hide_console value: {self.hide_console}! Allowed values: {_HIDE_CONSOLE_VALUES}" + ) + self.toc.append((f"pyi-hide-console {self.hide_console}", "", "OPTION")) + + # If the icon path is relative, make it relative to the .spec file. + if self.icon and self.icon != "NONE": + if isinstance(self.icon, list): + self.icon = [self._makeabs(ic) for ic in self.icon] + else: + self.icon = [self._makeabs(self.icon)] + + if is_win: + if not self.icon: + # --icon not specified; use default from bootloader folder + if self.console: + ico = 'icon-console.ico' + else: + ico = 'icon-windowed.ico' + self.icon = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'bootloader', 'images', ico) + + # Prepare manifest for the executable by creating minimal manifest or modifying the supplied one. + if self.manifest: + # Determine if we were given a filename or an XML string. + if "<" in self.manifest: + self.manifest = self.manifest.encode("utf-8") + else: + self.manifest = self._makeabs(self.manifest) + with open(self.manifest, "rb") as fp: + self.manifest = fp.read() + self.manifest = winmanifest.create_application_manifest(self.manifest, self.uac_admin, self.uac_uiaccess) + + if self.versrsrc: + if isinstance(self.versrsrc, versioninfo.VSVersionInfo): + # We were passed a valid versioninfo.VSVersionInfo structure + pass + elif isinstance(self.versrsrc, (str, bytes, os.PathLike)): + # File path; either absolute, or relative to the spec file + self.versrsrc = self._makeabs(self.versrsrc) + logger.debug("Loading version info from file: %r", self.versrsrc) + self.versrsrc = versioninfo.load_version_info_from_text_file(self.versrsrc) + else: + raise TypeError(f"Unsupported type for version info argument: {type(self.versrsrc)!r}") + + # Identify python shared library. This is needed both for PKG (where we need to store the name so that + # bootloader can look it up), and for macOS-specific processing of the generated executable (adjusting the SDK + # version). + # + # NOTE: we already performed an equivalent search (using the same `get_python_library_path` helper) during the + # analysis stage to ensure that the python shared library is collected. Unfortunately, with the way data passing + # works in onedir builds, we cannot look up the value in the TOC at this stage, and we need to search again. + self.python_lib = bindepend.get_python_library_path() + if self.python_lib is None: + from PyInstaller.exceptions import PythonLibraryNotFoundError + raise PythonLibraryNotFoundError() + + # Normalize TOC + self.toc = normalize_toc(self.toc) + + self.pkg = PKG( + toc=self.toc, + python_lib_name=os.path.basename(self.python_lib), + name=self.pkgname, + cdict=kwargs.get('cdict', None), + exclude_binaries=self.exclude_binaries, + strip_binaries=self.strip, + upx_binaries=self.upx, + upx_exclude=self.upx_exclude, + target_arch=self.target_arch, + codesign_identity=self.codesign_identity, + entitlements_file=self.entitlements_file + ) + self.dependencies = self.pkg.dependencies + + # Get the path of the bootloader and store it in a TOC, so it can be checked for being changed. + exe = self._bootloader_file('run', '.exe' if is_win or is_cygwin else '') + self.exefiles = [(os.path.basename(exe), exe, 'EXECUTABLE')] + + self.__postinit__() + + _GUTS = ( + # input parameters + ('name', _check_guts_eq), + ('console', _check_guts_eq), + ('debug', _check_guts_eq), + ('exclude_binaries', _check_guts_eq), + ('icon', _check_guts_eq), + ('versrsrc', _check_guts_eq), + ('uac_admin', _check_guts_eq), + ('uac_uiaccess', _check_guts_eq), + ('manifest', _check_guts_eq), + ('append_pkg', _check_guts_eq), + ('argv_emulation', _check_guts_eq), + ('target_arch', _check_guts_eq), + ('codesign_identity', _check_guts_eq), + ('entitlements_file', _check_guts_eq), + # for the case the directory is shared between platforms: + ('pkgname', _check_guts_eq), + ('toc', _check_guts_eq), + ('resources', _check_guts_eq), + ('strip', _check_guts_eq), + ('upx', _check_guts_eq), + ('mtm', None), # checked below + # derived values + ('exefiles', _check_guts_toc), + ('python_lib', _check_guts_eq), + ) + + def _check_guts(self, data, last_build): + if not os.path.exists(self.name): + logger.info("Rebuilding %s because %s missing", self.tocbasename, os.path.basename(self.name)) + return True + if not self.append_pkg and not os.path.exists(self.pkgname): + logger.info("Rebuilding because %s missing", os.path.basename(self.pkgname)) + return True + + if Target._check_guts(self, data, last_build): + return True + + mtm = data['mtm'] + if mtm != miscutils.mtime(self.name): + logger.info("Rebuilding %s because mtimes don't match", self.tocbasename) + return True + if mtm < miscutils.mtime(self.pkg.tocfilename): + logger.info("Rebuilding %s because pkg is more recent", self.tocbasename) + return True + + return False + + @staticmethod + def _makeabs(path): + """ + Helper for anchoring relative paths to spec file location. + """ + from PyInstaller.config import CONF + if os.path.isabs(path): + return path + else: + return os.path.join(CONF['specpath'], path) + + def _bootloader_file(self, exe, extension=None): + """ + Pick up the right bootloader file - debug, console, windowed. + """ + # Having console/windowed bootloader makes sense only on Windows and Mac OS. + if is_win or is_darwin: + if not self.console: + exe = exe + 'w' + # There are two types of bootloaders: + # run - release, no verbose messages in console. + # run_d - contains verbose messages in console. + if self.debug: + exe = exe + '_d' + if extension: + exe = exe + extension + bootloader_file = os.path.join(HOMEPATH, 'PyInstaller', 'bootloader', PLATFORM, exe) + logger.info('Bootloader %s' % bootloader_file) + return bootloader_file + + def assemble(self): + # On Windows, we used to append .notanexecutable to the intermediate/temporary file name to (attempt to) + # prevent interference from anti-virus programs with the build process (see #6467). This is now disabled + # as we wrap all processing steps that modify the executable in the `_retry_operation` helper; however, + # we keep around the `build_name` variable instead of directly using `self.name`, just in case we need + # to re-enable it... + build_name = self.name + + logger.info("Building EXE from %s", self.tocbasename) + if os.path.exists(self.name): + if os.path.isdir(self.name): + _rmtree(self.name) # will prompt for confirmation if --noconfirm is not given + else: + os.remove(self.name) + if not os.path.exists(os.path.dirname(self.name)): + os.makedirs(os.path.dirname(self.name)) + bootloader_exe = self.exefiles[0][1] # pathname of bootloader + if not os.path.exists(bootloader_exe): + raise SystemExit(_MISSING_BOOTLOADER_ERRORMSG) + + # Step 1: copy the bootloader file, and perform any operations that need to be done prior to appending the PKG. + logger.info("Copying bootloader EXE to %s", build_name) + self._retry_operation(shutil.copyfile, bootloader_exe, build_name) + self._retry_operation(os.chmod, build_name, 0o755) + + if is_win: + # First, remove all resources from the file. This ensures that no manifest is embedded, even if bootloader + # was compiled with a toolchain that forcibly embeds a default manifest (e.g., mingw toolchain from msys2). + self._retry_operation(winresource.remove_all_resources, build_name) + # Embed icon. + if self.icon != "NONE": + logger.info("Copying icon to EXE") + self._retry_operation(icon.CopyIcons, build_name, self.icon) + # Embed version info. + if self.versrsrc: + logger.info("Copying version information to EXE") + self._retry_operation(versioninfo.write_version_info_to_executable, build_name, self.versrsrc) + # Embed/copy other resources. + logger.info("Copying %d resources to EXE", len(self.resources)) + for resource in self.resources: + self._retry_operation(self._copy_windows_resource, build_name, resource) + # Embed the manifest into the executable. + logger.info("Embedding manifest in EXE") + self._retry_operation(winmanifest.write_manifest_to_executable, build_name, self.manifest) + elif is_darwin: + # Convert bootloader to the target arch + logger.info("Converting EXE to target arch (%s)", self.target_arch) + osxutils.binary_to_target_arch(build_name, self.target_arch, display_name='Bootloader EXE') + + # Step 2: append the PKG, if necessary + if self.append_pkg: + append_file = self.pkg.name # Append PKG + append_type = 'PKG archive' # For debug messages + else: + # In onefile mode, copy the stand-alone PKG next to the executable. In onedir, this will be done by the + # COLLECT() target. + if not self.exclude_binaries: + pkg_dst = os.path.join(os.path.dirname(build_name), os.path.basename(self.pkgname)) + logger.info("Copying stand-alone PKG archive from %s to %s", self.pkg.name, pkg_dst) + shutil.copyfile(self.pkg.name, pkg_dst) + else: + logger.info("Stand-alone PKG archive will be handled by COLLECT") + + # The bootloader requires package side-loading to be explicitly enabled, which is done by embedding custom + # signature to the executable. This extra signature ensures that the sideload-enabled executable is at least + # slightly different from the stock bootloader executables, which should prevent antivirus programs from + # flagging our stock bootloaders due to sideload-enabled applications in the wild. + + # Write to temporary file + pkgsig_file = self.pkg.name + '.sig' + with open(pkgsig_file, "wb") as f: + # 8-byte MAGIC; slightly changed PKG MAGIC pattern + f.write(b'MEI\015\013\012\013\016') + + append_file = pkgsig_file # Append PKG-SIG + append_type = 'PKG sideload signature' # For debug messages + + if is_linux: + # Linux: append data into custom ELF section using objcopy. + logger.info("Appending %s to custom ELF section in EXE", append_type) + cmd = ['objcopy', '--add-section', f'pydata={append_file}', build_name] + p = subprocess.run(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, encoding='utf-8') + if p.returncode: + raise SystemError(f"objcopy Failure: {p.returncode} {p.stdout}") + + elif is_darwin: + # macOS: remove signature, append data, and fix-up headers so that the appended data appears to be part of + # the executable (which is required by strict validation during code-signing). + + # Strip signatures from all arch slices. Strictly speaking, we need to remove signature (if present) from + # the last slice, because we will be appending data to it. When building universal2 bootloaders natively on + # macOS, only arm64 slices have a (dummy) signature. However, when cross-compiling with osxcross, we seem to + # get dummy signatures on both x86_64 and arm64 slices. While the former should not have any impact, it does + # seem to cause issues with further binary signing using real identity. Therefore, we remove all signatures + # and re-sign the binary using dummy signature once the data is appended. + logger.info("Removing signature(s) from EXE") + osxutils.remove_signature_from_binary(build_name) + + # Append the data + logger.info("Appending %s to EXE", append_type) + self._append_data_to_exe(build_name, append_file) + + # Fix Mach-O headers + logger.info("Fixing EXE headers for code signing") + osxutils.fix_exe_for_code_signing(build_name) + else: + # Fall back to just appending data at the end of the file + logger.info("Appending %s to EXE", append_type) + self._retry_operation(self._append_data_to_exe, build_name, append_file) + + # Step 3: post-processing + if is_win: + # Set checksum to appease antiviral software. Also set build timestamp to current time to increase entropy + # (but honor SOURCE_DATE_EPOCH environment variable for reproducible builds). + logger.info("Fixing EXE headers") + build_timestamp = int(os.environ.get('SOURCE_DATE_EPOCH', time.time())) + self._retry_operation(winutils.set_exe_build_timestamp, build_name, build_timestamp) + self._retry_operation(winutils.update_exe_pe_checksum, build_name) + elif is_darwin: + # If the version of macOS SDK used to build bootloader exceeds that of macOS SDK used to built Python + # library (and, by extension, bundled Tcl/Tk libraries), force the version declared by the frozen executable + # to match that of the Python library. + # Having macOS attempt to enable new features (based on SDK version) for frozen application has no benefit + # if the Python library does not support them as well. + # On the other hand, there seem to be UI issues in tkinter due to failed or partial enablement of dark mode + # (i.e., the bootloader executable being built against SDK 10.14 or later, which causes macOS to enable dark + # mode, and Tk libraries being built against an earlier SDK version that does not support the dark mode). + # With python.org Intel macOS installers, this manifests as black Tk windows and UI elements (see issue + # #5827), while in Anaconda python, it may result in white text on bright background. + pylib_version = osxutils.get_macos_sdk_version(self.python_lib) + exe_version = osxutils.get_macos_sdk_version(build_name) + if pylib_version < exe_version: + logger.info( + "Rewriting the executable's macOS SDK version (%d.%d.%d) to match the SDK version of the Python " + "library (%d.%d.%d) in order to avoid inconsistent behavior and potential UI issues in the " + "frozen application.", *exe_version, *pylib_version + ) + osxutils.set_macos_sdk_version(build_name, *pylib_version) + + # Re-sign the binary (either ad-hoc or using real identity, if provided). + logger.info("Re-signing the EXE") + osxutils.sign_binary(build_name, self.codesign_identity, self.entitlements_file) + + # Ensure executable flag is set + self._retry_operation(os.chmod, build_name, 0o755) + # Get mtime for storing into the guts + self.mtm = self._retry_operation(miscutils.mtime, build_name) + if build_name != self.name: + self._retry_operation(os.rename, build_name, self.name) + logger.info("Building EXE from %s completed successfully.", self.tocbasename) + + def _copy_windows_resource(self, build_name, resource_spec): + import pefile + + # Helper for optionally converting integer strings to values; resource types and IDs/names can be specified as + # either numeric values or custom strings... + def _to_int(value): + try: + return int(value) + except Exception: + return value + + logger.debug("Processing resource: %r", resource_spec) + resource = resource_spec.split(",") # filename,[type],[name],[language] + + if len(resource) < 1 or len(resource) > 4: + raise ValueError( + f"Invalid Windows resource specifier {resource_spec!r}! " + f"Must be in format 'filename,[type],[name],[language]'!" + ) + + # Anchor resource file to spec file location, if necessary. + src_filename = self._makeabs(resource[0]) + + # Ensure file exists. + if not os.path.isfile(src_filename): + raise ValueError(f"Resource file {src_filename!r} does not exist!") + + # Check if src_filename points to a PE file or an arbitrary (data) file. + try: + with pefile.PE(src_filename, fast_load=True): + is_pe_file = True + except Exception: + is_pe_file = False + + if is_pe_file: + # If resource file is PE file, copy all resources from it, subject to specified type, name, and language. + logger.debug("Resource file %r is a PE file...", src_filename) + + # Resource type, name, and language serve as filters. If not specified, use "*". + resource_type = _to_int(resource[1]) if len(resource) >= 2 else "*" + resource_name = _to_int(resource[2]) if len(resource) >= 3 else "*" + resource_lang = _to_int(resource[3]) if len(resource) >= 4 else "*" + + try: + winresource.copy_resources_from_pe_file( + build_name, + src_filename, + [resource_type], + [resource_name], + [resource_lang], + ) + except Exception as e: + raise IOError(f"Failed to copy resources from PE file {src_filename!r}") from e + else: + logger.debug("Resource file %r is an arbitrary data file...", src_filename) + + # For arbitrary data file, resource type and name need to be provided. + if len(resource) < 3: + raise ValueError( + f"Invalid Windows resource specifier {resource_spec!r}! " + f"For arbitrary data file, the format is 'filename,type,name,[language]'!" + ) + + resource_type = _to_int(resource[1]) + resource_name = _to_int(resource[2]) + resource_lang = _to_int(resource[3]) if len(resource) >= 4 else 0 # LANG_NEUTRAL + + # Prohibit wildcards for resource type and name. + if resource_type == "*": + raise ValueError( + f"Invalid Windows resource specifier {resource_spec!r}! " + f"For arbitrary data file, resource type cannot be a wildcard (*)!" + ) + if resource_name == "*": + raise ValueError( + f"Invalid Windows resource specifier {resource_spec!r}! " + f"For arbitrary data file, resource ma,e cannot be a wildcard (*)!" + ) + + try: + with open(src_filename, 'rb') as fp: + data = fp.read() + + winresource.add_or_update_resource( + build_name, + data, + resource_type, + [resource_name], + [resource_lang], + ) + except Exception as e: + raise IOError(f"Failed to embed data file {src_filename!r} as Windows resource") from e + + def _append_data_to_exe(self, build_name, append_file): + with open(build_name, 'ab') as outf: + with open(append_file, 'rb') as inf: + shutil.copyfileobj(inf, outf, length=64 * 1024) + + @staticmethod + def _retry_operation(func, *args, max_attempts=20): + """ + Attempt to execute the given function `max_attempts` number of times while catching exceptions that are usually + associated with Windows anti-virus programs temporarily locking the access to the executable. + """ + def _is_allowed_exception(e): + """ + Helper to determine whether the given exception is eligible for retry or not. + """ + if isinstance(e, PermissionError): + # Always retry on all instances of PermissionError + return True + elif is_win: + from PyInstaller.compat import pywintypes + + # Windows-specific errno and winerror codes. + # https://learn.microsoft.com/en-us/cpp/c-runtime-library/errno-constants + _ALLOWED_ERRNO = { + 13, # EACCES (would typically be a PermissionError instead) + 22, # EINVAL (reported to be caused by Crowdstrike; see #7840) + } + # https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499- + _ALLOWED_WINERROR = { + 5, # ERROR_ACCESS_DENIED (reported in #7825) + 32, # ERROR_SHARING_VIOLATION (exclusive lock via `CreateFileW` flags, or via `_locked`). + 110, # ERROR_OPEN_FAILED (reported in #8138) + } + if isinstance(e, OSError): + # For OSError exceptions other than PermissionError, validate errno. + if e.errno in _ALLOWED_ERRNO: + return True + # OSError typically translates `winerror` into `errno` equivalent; but try to match the original + # values as a fall back, just in case. `OSError.winerror` attribute exists only on Windows. + if e.winerror in _ALLOWED_WINERROR: + return True + elif isinstance(e, pywintypes.error): + # pywintypes.error is raised by helper functions that use win32 C API bound via pywin32-ctypes. + if e.winerror in _ALLOWED_WINERROR: + return True + return False + + func_name = func.__name__ + for attempt in range(max_attempts): + try: + return func(*args) + except Exception as e: + # Check if exception is eligible for retry; if not, also check its immediate cause (in case the + # exception was thrown from an eligible exception). + if not _is_allowed_exception(e) and not _is_allowed_exception(e.__context__): + raise + + # Retry after sleep (unless this was our last attempt) + if attempt < max_attempts - 1: + sleep_duration = 1 / (max_attempts - 1 - attempt) + logger.warning( + f"Execution of {func_name!r} failed on attempt #{attempt + 1} / {max_attempts}: {e!r}. " + f"Retrying in {sleep_duration:.2f} second(s)..." + ) + time.sleep(sleep_duration) + else: + logger.warning( + f"Execution of {func_name!r} failed on attempt #{attempt + 1} / {max_attempts}: {e!r}." + ) + raise RuntimeError(f"Execution of {func_name!r} failed - no more attempts left!") from e + + +class COLLECT(Target): + """ + In one-dir mode creates the output folder with all necessary files. + """ + def __init__(self, *args, **kwargs): + """ + args + One or more arguments that are either an instance of `Target` or an iterable representing TOC list. + kwargs + Possible keyword arguments: + + name + The name of the directory to be built. + """ + from PyInstaller.config import CONF + + super().__init__() + + self.strip_binaries = kwargs.get('strip', False) + self.upx_exclude = kwargs.get("upx_exclude", []) + self.console = True + self.target_arch = None + self.codesign_identity = None + self.entitlements_file = None + + # UPX needs to be both available and enabled for the taget. + self.upx_binaries = CONF['upx_available'] and kwargs.get('upx', False) + + # The `name` should be the output directory name, without the parent path (the directory is created in the + # DISTPATH). Old .spec formats included parent path, so strip it away. + self.name = os.path.join(CONF['distpath'], os.path.basename(kwargs.get('name'))) + + for arg in args: + if isinstance(arg, EXE): + self.contents_directory = arg.contents_directory + break + else: + raise ValueError("No EXE() instance was passed to COLLECT()") + + self.toc = [] + for arg in args: + # Valid arguments: EXE object and TOC-like iterables + if isinstance(arg, EXE): + # Add EXE as an entry to the TOC, and merge its dependencies TOC + self.toc.append((os.path.basename(arg.name), arg.name, 'EXECUTABLE')) + self.toc.extend(arg.dependencies) + # Inherit settings + self.console = arg.console + self.target_arch = arg.target_arch + self.codesign_identity = arg.codesign_identity + self.entitlements_file = arg.entitlements_file + # Search for the executable's external manifest, and collect it if available + for dest_name, src_name, typecode in arg.toc: + if dest_name == os.path.basename(arg.name) + ".manifest": + self.toc.append((dest_name, src_name, typecode)) + # If PKG is not appended to the executable, we need to collect it. + if not arg.append_pkg: + self.toc.append((os.path.basename(arg.pkgname), arg.pkgname, 'PKG')) + elif miscutils.is_iterable(arg): + # TOC-like iterable + self.toc.extend(arg) + else: + raise TypeError(f"Invalid argument type for COLLECT: {type(arg)!r}") + + # Normalize TOC + self.toc = normalize_toc(self.toc) + + self.__postinit__() + + _GUTS = ( + # COLLECT always builds, we just want the TOC to be written out. + ('toc', None), + ) + + def _check_guts(self, data, last_build): + # COLLECT always needs to be executed, in order to clean the output directory. + return True + + def assemble(self): + _make_clean_directory(self.name) + logger.info("Building COLLECT %s", self.tocbasename) + for dest_name, src_name, typecode in self.toc: + # Ensure that the source file exists, if necessary. Skip the check for DEPENDENCY entries due to special + # contents of 'dest_name' and/or 'src_name'. Same for the SYMLINK entries, where 'src_name' is relative + # target name for symbolic link. + if typecode not in {'DEPENDENCY', 'SYMLINK'} and not os.path.exists(src_name): + # If file is contained within python egg, it will be added with the egg. + if strict_collect_mode: + raise ValueError(f"Non-existent resource {src_name}, meant to be collected as {dest_name}!") + else: + logger.warning( + "Ignoring non-existent resource %s, meant to be collected as %s", src_name, dest_name + ) + continue + # Disallow collection outside of the dist directory. + if os.pardir in os.path.normpath(dest_name).split(os.sep) or os.path.isabs(dest_name): + raise SystemExit( + 'Security-Alert: attempting to store file outside of the dist directory: %r. Aborting.' % dest_name + ) + # Create parent directory structure, if necessary + if typecode in ("EXECUTABLE", "PKG"): + dest_path = os.path.join(self.name, dest_name) + else: + dest_path = os.path.join(self.name, self.contents_directory or "", dest_name) + dest_dir = os.path.dirname(dest_path) + try: + os.makedirs(dest_dir, exist_ok=True) + except FileExistsError: + raise SystemExit( + f"Pyinstaller needs to create a directory at {dest_dir!r}, " + "but there already exists a file at that path!" + ) + if typecode in ('EXTENSION', 'BINARY'): + src_name = process_collected_binary( + src_name, + dest_name, + use_strip=self.strip_binaries, + use_upx=self.upx_binaries, + upx_exclude=self.upx_exclude, + target_arch=self.target_arch, + codesign_identity=self.codesign_identity, + entitlements_file=self.entitlements_file, + strict_arch_validation=(typecode == 'EXTENSION'), + ) + if typecode == 'SYMLINK': + # On Windows, ensure that symlink target path (stored in src_name) is using Windows-style back slash + # separators. + if is_win and os.path.sep == '/': + src_name = src_name.replace(os.path.sep, '\\') + + os.symlink(src_name, dest_path) # Create link at dest_path, pointing at (relative) src_name + elif typecode != 'DEPENDENCY': + # At this point, `src_name` should be a valid file. + if not os.path.isfile(src_name): + raise ValueError(f"Resource {src_name!r} is not a valid file!") + # If strict collection mode is enabled, the destination should not exist yet. + if strict_collect_mode and os.path.exists(dest_path): + raise ValueError( + f"Attempting to collect a duplicated file into COLLECT: {dest_name} (type: {typecode})" + ) + # Use `shutil.copyfile` to copy file with default permissions. We do not attempt to preserve original + # permissions nor metadata, as they might be too restrictive and cause issues either during subsequent + # re-build attempts or when trying to move the application bundle. For binaries (and data files with + # executable bit set), we manually set the executable bits after copying the file. + shutil.copyfile(src_name, dest_path) + if ( + typecode in ('EXTENSION', 'BINARY', 'EXECUTABLE') + or (typecode == 'DATA' and os.access(src_name, os.X_OK)) + ): + os.chmod(dest_path, 0o755) + logger.info("Building COLLECT %s completed successfully.", self.tocbasename) + + +class MERGE: + """ + Given Analysis objects for multiple executables, replace occurrences of data and binary files with references to the + first executable in which they occur. The actual data and binary files are then collected only once, thereby + reducing the disk space used by multiple executables. Every executable (even onedir ones!) obtained from a + MERGE-processed Analysis gains onefile semantics, because it needs to extract its referenced dependencies from other + executables into temporary directory before they can run. + """ + def __init__(self, *args): + """ + args + Dependencies as a list of (analysis, identifier, path_to_exe) tuples. `analysis` is an instance of + `Analysis`, `identifier` is the basename of the entry-point script (without .py suffix), and `path_to_exe` + is path to the corresponding executable, relative to the `dist` directory (without .exe suffix in the + filename component). For onefile executables, `path_to_exe` is usually just executable's base name + (e.g., `myexecutable`). For onedir executables, `path_to_exe` usually comprises both the application's + directory name and executable name (e.g., `myapp/myexecutable`). + """ + self._dependencies = {} + self._symlinks = set() + + # Process all given (analysis, identifier, path_to_exe) tuples + for analysis, identifier, path_to_exe in args: + # Process analysis.binaries and analysis.datas TOCs. self._process_toc() call returns two TOCs; the first + # contains entries that remain within this analysis, while the second contains entries that reference + # an entry in another executable. + binaries, binaries_refs = self._process_toc(analysis.binaries, path_to_exe) + datas, datas_refs = self._process_toc(analysis.datas, path_to_exe) + # Update `analysis.binaries`, `analysis.datas`, and `analysis.dependencies`. + # The entries that are found in preceding executable(s) are removed from `binaries` and `datas`, and their + # DEPENDENCY entry counterparts are added to `dependencies`. We cannot simply update the entries in + # `binaries` and `datas`, because at least in theory, we need to support both onefile and onedir mode. And + # while in onefile, `a.datas`, `a.binaries`, and `a.dependencies` are passed to `EXE` (and its `PKG`), with + # onedir, `a.datas` and `a.binaries` need to be passed to `COLLECT` (as they were before the MERGE), while + # `a.dependencies` needs to be passed to `EXE`. This split requires DEPENDENCY entries to be in a separate + # TOC. + analysis.binaries = normalize_toc(binaries) + analysis.datas = normalize_toc(datas) + analysis.dependencies += binaries_refs + datas_refs + + def _process_toc(self, toc, path_to_exe): + # NOTE: unfortunately, these need to keep two separate lists. See the comment in the calling code on why this + # is so. + toc_keep = [] + toc_refs = [] + for entry in toc: + dest_name, src_name, typecode = entry + + # Special handling and bookkeeping for symbolic links. We need to account both for dest_name and src_name, + # because src_name might be the same in different contexts. For example, when collecting Qt .framework + # bundles on macOS, there are multiple relative symbolic links `Current -> A` (one in each .framework). + if typecode == 'SYMLINK': + key = dest_name, src_name + if key not in self._symlinks: + # First occurrence; keep the entry in "for-keep" TOC, same as we would for binaries and datas. + logger.debug("Keeping symbolic link %r entry in original TOC.", entry) + self._symlinks.add(key) + toc_keep.append(entry) + else: + # Subsequent occurrence; keep the SYMLINK entry intact, but add it to the references TOC instead of + # "for-keep" TOC, so it ends up in `a.dependencies`. + logger.debug("Moving symbolic link %r entry to references TOC.", entry) + toc_refs.append(entry) + del key # Block-local variable + continue + + # In fact, we need to accout for both dest_name and src_name with regular entries as well; previous + # approach that considered only src_name ended tripped up when same file was collected in different + # locations (i.e., same src_name but different dest_names). + key = dest_name, src_name + if key not in self._dependencies: + logger.debug("Adding dependency %r located in %s", key, path_to_exe) + self._dependencies[key] = path_to_exe + # Add entry to list of kept TOC entries + toc_keep.append(entry) + else: + # Construct relative dependency path; i.e., the relative path from this executable (or rather, its + # parent directory) to the executable that contains the dependency. + dep_path = os.path.relpath(self._dependencies[key], os.path.dirname(path_to_exe)) + # Ignore references that point to the origin package. This can happen if the same resource is listed + # multiple times in TOCs (e.g., once as binary and once as data). + if dep_path.endswith(path_to_exe): + logger.debug( + "Ignoring self-reference of %r for %s, located in %s - duplicated TOC entry?", key, path_to_exe, + dep_path + ) + # The entry is a duplicate, and should be ignored (i.e., do not add it to either of output TOCs). + continue + logger.debug("Referencing %r to be a dependency for %s, located in %s", key, path_to_exe, dep_path) + # Create new DEPENDENCY entry; under destination path (first element), we store the original destination + # path, while source path contains the relative reference path. + toc_refs.append((dest_name, dep_path, "DEPENDENCY")) + + return toc_keep, toc_refs + + +UNCOMPRESSED = False +COMPRESSED = True + +_MISSING_BOOTLOADER_ERRORMSG = """Fatal error: PyInstaller does not include a pre-compiled bootloader for your +platform. For more details and instructions how to build the bootloader see +""" diff --git a/venv/Lib/site-packages/PyInstaller/building/build_main.py b/venv/Lib/site-packages/PyInstaller/building/build_main.py new file mode 100644 index 0000000..b15271e --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/building/build_main.py @@ -0,0 +1,1252 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Build packages using spec files. + +NOTE: All global variables, classes and imported modules create API for .spec files. +""" + +import glob +import os +import pathlib +import pprint +import shutil +import enum +import re +import sys + +from PyInstaller import DEFAULT_DISTPATH, DEFAULT_WORKPATH, HOMEPATH, compat +from PyInstaller import log as logging +from PyInstaller.building.api import COLLECT, EXE, MERGE, PYZ +from PyInstaller.building.datastruct import ( + TOC, Target, Tree, _check_guts_eq, normalize_toc, normalize_pyz_toc, toc_process_symbolic_links +) +from PyInstaller.building.osx import BUNDLE +from PyInstaller.building.splash import Splash +from PyInstaller.building.utils import ( + _check_guts_toc, _check_guts_toc_mtime, _should_include_system_binary, format_binaries_and_datas, compile_pymodule, + add_suffix_to_extension, postprocess_binaries_toc_pywin32, postprocess_binaries_toc_pywin32_anaconda +) +from PyInstaller.compat import is_win, is_conda, is_darwin, is_linux +from PyInstaller.depend import bindepend +from PyInstaller.depend.analysis import initialize_modgraph, HOOK_PRIORITY_USER_HOOKS +from PyInstaller.depend.utils import create_py3_base_library, scan_code_for_ctypes +from PyInstaller import isolated +from PyInstaller.utils.misc import absnormpath, get_path_to_toplevel_modules, mtime +from PyInstaller.utils.hooks import get_package_paths +from PyInstaller.utils.hooks.gi import compile_glib_schema_files + +if is_darwin: + from PyInstaller.utils import osx as osxutils + +logger = logging.getLogger(__name__) + +STRINGTYPE = type('') +TUPLETYPE = type((None,)) + +rthooks = {} + +# Place where the loader modules and initialization scripts live. +_init_code_path = os.path.join(HOMEPATH, 'PyInstaller', 'loader') + +IMPORT_TYPES = [ + 'top-level', 'conditional', 'delayed', 'delayed, conditional', 'optional', 'conditional, optional', + 'delayed, optional', 'delayed, conditional, optional' +] + +WARNFILE_HEADER = """\ + +This file lists modules PyInstaller was not able to find. This does not +necessarily mean this module is required for running your program. Python and +Python 3rd-party packages include a lot of conditional or optional modules. For +example the module 'ntpath' only exists on Windows, whereas the module +'posixpath' only exists on Posix systems. + +Types if import: +* top-level: imported at the top-level - look at these first +* conditional: imported within an if-statement +* delayed: imported within a function +* optional: imported within a try-except-statement + +IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for + tracking down the missing module yourself. Thanks! + +""" + + +@isolated.decorate +def discover_hook_directories(): + """ + Discover hook directories via pyinstaller40 entry points. Perform the discovery in an isolated subprocess + to avoid importing the package(s) in the main process. + + :return: list of discovered hook directories. + """ + + from traceback import format_exception_only + from PyInstaller.log import logger + from PyInstaller.compat import importlib_metadata + from PyInstaller.depend.analysis import HOOK_PRIORITY_CONTRIBUTED_HOOKS, HOOK_PRIORITY_UPSTREAM_HOOKS + + # The “selectable” entry points (via group and name keyword args) were introduced in importlib_metadata 4.6 and + # Python 3.10. The compat module ensures we are using a compatible version. + entry_points = importlib_metadata.entry_points(group='pyinstaller40', name='hook-dirs') + + # Ensure that pyinstaller_hooks_contrib comes last so that hooks from packages providing their own take priority. + # In pyinstaller-hooks-contrib >= 2024.8, the entry-point module is `_pyinstaller_hooks_contrib`; in earlier + # versions, it was `_pyinstaller_hooks_contrib.hooks`. + entry_points = sorted(entry_points, key=lambda x: x.module.startswith("_pyinstaller_hooks_contrib")) + + hook_directories = [] + for entry_point in entry_points: + # Query hook directory location(s) from entry point + try: + hook_directory_entries = entry_point.load()() + except Exception as e: + msg = "".join(format_exception_only(type(e), e)).strip() + logger.warning("discover_hook_directories: Failed to process hook entry point '%s': %s", entry_point, msg) + continue + + # Determine location-based priority: upstream hooks vs. hooks from contributed hooks package. + location_priority = ( + HOOK_PRIORITY_CONTRIBUTED_HOOKS + if entry_point.module.startswith("_pyinstaller_hooks_contrib") else HOOK_PRIORITY_UPSTREAM_HOOKS + ) + + # Append entries + hook_directories.extend([(hook_directory_entry, location_priority) + for hook_directory_entry in hook_directory_entries]) + + logger.debug("discover_hook_directories: Hook directories: %s", hook_directories) + + return hook_directories + + +def find_binary_dependencies(binaries, import_packages, symlink_suppression_patterns): + """ + Find dynamic dependencies (linked shared libraries) for the provided list of binaries. + + On Windows, this function performs additional pre-processing in an isolated environment in an attempt to handle + dynamic library search path modifications made by packages during their import. The packages from the given list + of collected packages are imported one by one, while keeping track of modifications made by `os.add_dll_directory` + calls and additions to the `PATH` environment variable. The recorded additional search paths are then passed to + the binary dependency analysis step. + + binaries + List of binaries to scan for dynamic dependencies. + import_packages + List of packages to import prior to scanning binaries. + symlink_suppression_patterns + Set of paths and/or path patterns for which binary dependency analysis should not create symbolic links + to the top-level application directory (when the discovered shared library's parent directory structure + is preserved). When binary dependency analysis discovers a shared library, it matches its *source path* + against all symlink suppression patterns (using `pathlib.PurePath.match`) to determine whether to create + a symbolic link to top-level application directory or not. + + :return: expanded list of binaries and then dependencies. + """ + + # Extra library search paths (used on Windows to resolve DLL paths). + extra_libdirs = [] + if compat.is_win: + # Always search `sys.base_prefix`, and search it first. This ensures that we resolve the correct version of + # `python3X.dll` and `python3.dll` (a PEP-0384 stable ABI stub that forwards symbols to the fully versioned + # `python3X.dll`), regardless of other python installations that might be present in the PATH. + extra_libdirs.append(compat.base_prefix) + + # When using python built from source, `sys.base_prefix` does not point to the directory that contains python + # executable, `python3X.dll`, and `python3.dll`. To accommodate such case, also add the directory in which + # python executable is located to the extra search paths. On the off-chance that this is a combination of venv + # and python built from source, prefer `sys._base_executable` over `sys.executable`. + extra_libdirs.append(os.path.dirname(getattr(sys, '_base_executable', sys.executable))) + + # If `pywin32` is installed, resolve the path to the `pywin32_system32` directory. Most `pywin32` extensions + # reference the `pywintypes3X.dll` in there. Based on resolved `pywin32_system32` directory, also add other + # `pywin32` directory, in case extensions in different directories reference each other (the ones in the same + # directory should already be resolvable due to binary dependency analysis passing the analyzed binary's + # location to the `get_imports` function). This allows us to avoid searching all paths in `sys.path`, which + # may lead to other corner-case issues (e.g., #5560). + pywin32_system32_dir = None + try: + # Look up the directory by treating it as a namespace package. + _, pywin32_system32_dir = get_package_paths('pywin32_system32') + except Exception: + pass + + if pywin32_system32_dir: + pywin32_base_dir = os.path.dirname(pywin32_system32_dir) + extra_libdirs += [ + pywin32_system32_dir, # .../pywin32_system32 + # based on pywin32.pth + os.path.join(pywin32_base_dir, 'win32'), # .../win32 + os.path.join(pywin32_base_dir, 'win32', 'lib'), # .../win32/lib + os.path.join(pywin32_base_dir, 'Pythonwin'), # .../Pythonwin + ] + + # On Windows, packages' initialization code might register additional DLL search paths, either by modifying the + # `PATH` environment variable, or by calling `os.add_dll_directory`. Therefore, we import all collected packages, + # and track changes made to the environment. + if compat.is_win: + # Helper functions to be executed in isolated environment. + def setup(suppressed_imports): + """ + Prepare environment for change tracking + """ + import os + import sys + + os._added_dll_directories = [] + os._original_path_env = os.environ.get('PATH', '') + + _original_add_dll_directory = os.add_dll_directory + + def _pyi_add_dll_directory(path): + os._added_dll_directories.append(path) + return _original_add_dll_directory(path) + + os.add_dll_directory = _pyi_add_dll_directory + + # Suppress import of specified packages + for name in suppressed_imports: + sys.modules[name] = None + + def import_library(package): + """ + Import collected package to set up environment. + """ + try: + __import__(package) + except Exception: + pass + + def process_search_paths(): + """ + Obtain lists of added search paths. + """ + import os + + # `os.add_dll_directory` might be called with a `pathlib.Path`, which cannot be marhsalled out of the helper + # process. So explicitly convert all entries to strings. + dll_directories = [str(path) for path in os._added_dll_directories] + + orig_path = set(os._original_path_env.split(os.pathsep)) + modified_path = os.environ.get('PATH', '').split(os.pathsep) + path_additions = [path for path in modified_path if path and path not in orig_path] + + return dll_directories, path_additions + + # Pre-process the list of packages to import. + # Check for Qt bindings packages, and put them at the front of the packages list. This ensures that they are + # always imported first, which should prevent packages that support multiple bindings (`qtypy`, `pyqtgraph`, + # `matplotlib`, etc.) from trying to auto-select bindings. + _QT_BINDINGS = ('PySide2', 'PyQt5', 'PySide6', 'PyQt6') + + qt_packages = [] + other_packages = [] + for package in import_packages: + if package.startswith(_QT_BINDINGS): + qt_packages.append(package) + else: + other_packages.append(package) + import_packages = qt_packages + other_packages + + # Just in case, explicitly suppress imports of Qt bindings that we are *not* collecting - if multiple bindings + # are available and some were excluded from our analysis, a package imported here might still try to import an + # excluded bindings package (and succeed at doing so). + suppressed_imports = [package for package in _QT_BINDINGS if package not in qt_packages] + + # If we suppressed PySide2 or PySide6, we must also suppress their corresponding shiboken package + if "PySide2" in suppressed_imports: + suppressed_imports += ["shiboken2"] + if "PySide6" in suppressed_imports: + suppressed_imports += ["shiboken6"] + + # Suppress import of `pyqtgraph.canvas`, which is known to crash python interpreter. See #7452 and #8322, as + # well as https://github.com/pyqtgraph/pyqtgraph/issues/2838. + suppressed_imports += ['pyqtgraph.canvas'] + + # PySimpleGUI 5.x displays a "first-run" dialog when imported for the first time, which blocks the loop below. + # This is a problem for building on CI, where the dialog cannot be closed, and where PySimpleGUI runs "for the + # first time" every time. See #8396. + suppressed_imports += ['PySimpleGUI'] + + # Processing in isolated environment. + with isolated.Python() as child: + child.call(setup, suppressed_imports) + for package in import_packages: + try: + child.call(import_library, package) + except isolated.SubprocessDiedError as e: + # Re-raise as `isolated.SubprocessDiedError` again, to trigger error-handling codepath in + # `isolated.Python.__exit__()`. + raise isolated.SubprocessDiedError( + f"Isolated subprocess crashed while importing package {package!r}! " + f"Package import list: {import_packages!r}" + ) from e + added_dll_directories, added_path_directories = child.call(process_search_paths) + + # Process extra search paths... + logger.info("Extra DLL search directories (AddDllDirectory): %r", added_dll_directories) + extra_libdirs += added_dll_directories + + logger.info("Extra DLL search directories (PATH): %r", added_path_directories) + extra_libdirs += added_path_directories + + # Deduplicate search paths + # NOTE: `list(set(extra_libdirs))` does not preserve the order of search paths (which matters here), so we need to + # de-duplicate using `list(dict.fromkeys(extra_libdirs).keys())` instead. + extra_libdirs = list(dict.fromkeys(extra_libdirs).keys()) + + # Search for dependencies of the given binaries + return bindepend.binary_dependency_analysis( + binaries, + search_paths=extra_libdirs, + symlink_suppression_patterns=symlink_suppression_patterns, + ) + + +class _ModuleCollectionMode(enum.IntFlag): + """ + Module collection mode flags. + """ + PYZ = enum.auto() # Collect byte-compiled .pyc into PYZ archive + PYC = enum.auto() # Collect byte-compiled .pyc as external data file + PY = enum.auto() # Collect source .py file as external data file + + +_MODULE_COLLECTION_MODES = { + "pyz": _ModuleCollectionMode.PYZ, + "pyc": _ModuleCollectionMode.PYC, + "py": _ModuleCollectionMode.PY, + "pyz+py": _ModuleCollectionMode.PYZ | _ModuleCollectionMode.PY, + "py+pyz": _ModuleCollectionMode.PYZ | _ModuleCollectionMode.PY, +} + + +def _get_module_collection_mode(mode_dict, name, noarchive=False): + """ + Determine the module/package collection mode for the given module name, based on the provided collection + mode settings dictionary. + """ + # Default mode: collect into PYZ, unless noarchive is enabled. In that case, collect as pyc. + mode_flags = _ModuleCollectionMode.PYC if noarchive else _ModuleCollectionMode.PYZ + + # If we have no collection mode settings, end here and now. + if not mode_dict: + return mode_flags + + # Search the parent modules/packages in top-down fashion, and take the last given setting. This ensures that + # a setting given for the top-level package is recursively propagated to all its subpackages and submodules, + # but also allows individual sub-modules to override the setting again. + mode = 'pyz' + + name_parts = name.split('.') + for i in range(len(name_parts)): + modlevel = ".".join(name_parts[:i + 1]) + modlevel_mode = mode_dict.get(modlevel, None) + if modlevel_mode is not None: + mode = modlevel_mode + + # Convert mode string to _ModuleCollectionMode flags + try: + mode_flags = _MODULE_COLLECTION_MODES[mode] + except KeyError: + raise ValueError(f"Unknown module collection mode for {name!r}: {mode!r}!") + + # noarchive flag being set means that we need to change _ModuleCollectionMode.PYZ into _ModuleCollectionMode.PYC + if noarchive and _ModuleCollectionMode.PYZ in mode_flags: + mode_flags ^= _ModuleCollectionMode.PYZ + mode_flags |= _ModuleCollectionMode.PYC + + return mode_flags + + +class Analysis(Target): + """ + Class that performs analysis of the user's main Python scripts. + + An Analysis contains multiple TOC (Table of Contents) lists, accessed as attributes of the analysis object. + + scripts + The scripts you gave Analysis as input, with any runtime hook scripts prepended. + pure + The pure Python modules. + binaries + The extension modules and their dependencies. + datas + Data files collected from packages. + zipfiles + Deprecated - always empty. + zipped_data + Deprecated - always empty. + """ + _old_scripts = { + absnormpath(os.path.join(HOMEPATH, "support", "_mountzlib.py")), + absnormpath(os.path.join(HOMEPATH, "support", "useUnicode.py")), + absnormpath(os.path.join(HOMEPATH, "support", "useTK.py")), + absnormpath(os.path.join(HOMEPATH, "support", "unpackTK.py")), + absnormpath(os.path.join(HOMEPATH, "support", "removeTK.py")) + } + + def __init__( + self, + scripts, + pathex=None, + binaries=None, + datas=None, + hiddenimports=None, + hookspath=None, + hooksconfig=None, + excludes=None, + runtime_hooks=None, + cipher=None, + win_no_prefer_redirects=False, + win_private_assemblies=False, + noarchive=False, + module_collection_mode=None, + optimize=-1, + **_kwargs, + ): + """ + scripts + A list of scripts specified as file names. + pathex + An optional list of paths to be searched before sys.path. + binaries + An optional list of additional binaries (dlls, etc.) to include. + datas + An optional list of additional data files to include. + hiddenimport + An optional list of additional (hidden) modules to include. + hookspath + An optional list of additional paths to search for hooks. (hook-modules). + hooksconfig + An optional dict of config settings for hooks. (hook-modules). + excludes + An optional list of module or package names (their Python names, not path names) that will be + ignored (as though they were not found). + runtime_hooks + An optional list of scripts to use as users' runtime hooks. Specified as file names. + cipher + Deprecated. Raises an error if not None. + win_no_prefer_redirects + Deprecated. Raises an error if not False. + win_private_assemblies + Deprecated. Raises an error if not False. + noarchive + If True, do not place source files in a archive, but keep them as individual files. + module_collection_mode + An optional dict of package/module names and collection mode strings. Valid collection mode strings: + 'pyz' (default), 'pyc', 'py', 'pyz+py' (or 'py+pyz') + optimize + Optimization level for collected bytecode. If not specified or set to -1, it is set to the value of + `sys.flags.optimize` of the running build process. + """ + if cipher is not None: + from PyInstaller.exceptions import RemovedCipherFeatureError + raise RemovedCipherFeatureError( + "Please remove the 'cipher' arguments to PYZ() and Analysis() in your spec file." + ) + if win_no_prefer_redirects: + from PyInstaller.exceptions import RemovedWinSideBySideSupportError + raise RemovedWinSideBySideSupportError( + "Please remove the 'win_no_prefer_redirects' argument to Analysis() in your spec file." + ) + if win_private_assemblies: + from PyInstaller.exceptions import RemovedWinSideBySideSupportError + raise RemovedWinSideBySideSupportError( + "Please remove the 'win_private_assemblies' argument to Analysis() in your spec file." + ) + super().__init__() + from PyInstaller.config import CONF + + self.inputs = [] + spec_dir = os.path.dirname(CONF['spec']) + for script in scripts: + # If path is relative, it is relative to the location of .spec file. + if not os.path.isabs(script): + script = os.path.join(spec_dir, script) + if absnormpath(script) in self._old_scripts: + logger.warning('Ignoring obsolete auto-added script %s', script) + continue + # Normalize script path. + script = os.path.normpath(script) + if not os.path.exists(script): + raise SystemExit("script '%s' not found" % script) + self.inputs.append(script) + + # Django hook requires this variable to find the script manage.py. + CONF['main_script'] = self.inputs[0] + + site_packages_pathex = [] + for path in (pathex or []): + if pathlib.Path(path).name == "site-packages": + site_packages_pathex.append(str(path)) + if site_packages_pathex: + logger.log( + logging.DEPRECATION, "Foreign Python environment's site-packages paths added to --paths/pathex:\n%s\n" + "This is ALWAYS the wrong thing to do. If your environment's site-packages is not in PyInstaller's " + "module search path then you are running PyInstaller from a different environment to the one your " + "packages are in. Run print(sys.prefix) without PyInstaller to get the environment you should be using " + "then install and run PyInstaller from that environment instead of this one. This warning will become " + "an error in PyInstaller 7.0.", pprint.pformat(site_packages_pathex) + ) + + self.pathex = self._extend_pathex(pathex, self.inputs) + # Set global config variable 'pathex' to make it available for PyInstaller.utils.hooks and import hooks. Path + # extensions for module search. + CONF['pathex'] = self.pathex + # Extend sys.path so PyInstaller could find all necessary modules. + sys.path.extend(self.pathex) + logger.info('Module search paths (PYTHONPATH):\n' + pprint.pformat(sys.path)) + + self.hiddenimports = hiddenimports or [] + # Include hidden imports passed via CONF['hiddenimports']; these might be populated if user has a wrapper script + # that calls `build_main.main()` with custom `pyi_config` dictionary that contains `hiddenimports`. + self.hiddenimports.extend(CONF.get('hiddenimports', [])) + + for modnm in self.hiddenimports: + if re.search(r"[\\/]", modnm): + raise SystemExit( + f"Error: Invalid hiddenimport '{modnm}'. Hidden imports should be importable module names – not " + "file paths. i.e. use --hiddenimport=foo.bar instead of --hiddenimport=.../site-packages/foo/bar.py" + ) + + self.hookspath = [] + # Prepend directories in `hookspath` (`--additional-hooks-dir`) to take precedence over those from the entry + # points. Expand starting tilde into user's home directory, as a work-around for tilde not being expanded by + # shell when using ˙--additional-hooks-dir=~/path/abc` instead of ˙--additional-hooks-dir ~/path/abc` (or when + # the path argument is quoted). + if hookspath: + self.hookspath.extend([(os.path.expanduser(path), HOOK_PRIORITY_USER_HOOKS) for path in hookspath]) + + # Add hook directories from PyInstaller entry points. + self.hookspath += discover_hook_directories() + + self.hooksconfig = {} + if hooksconfig: + self.hooksconfig.update(hooksconfig) + + # Custom runtime hook files that should be included and started before any existing PyInstaller runtime hooks. + self.custom_runtime_hooks = runtime_hooks or [] + + self._input_binaries = [] + self._input_datas = [] + + self.excludes = excludes or [] + self.scripts = [] + self.pure = [] + self.binaries = [] + self.zipfiles = [] + self.zipped_data = [] + self.datas = [] + self.dependencies = [] + self._python_version = sys.version + self.noarchive = noarchive + self.module_collection_mode = module_collection_mode or {} + self.optimize = sys.flags.optimize if optimize in {-1, None} else optimize + + # Validate the optimization level to avoid errors later on... + if self.optimize not in {0, 1, 2}: + raise ValueError(f"Unsupported bytecode optimization level: {self.optimize!r}") + + # Expand the `binaries` and `datas` lists specified in the .spec file, and ensure that the lists are normalized + # and sorted before guts comparison. + # + # While we use these lists to initialize `Analysis.binaries` and `Analysis.datas`, at this point, we need to + # store them in separate variables, which undergo *full* guts comparison (`_check_guts_toc`) as opposed to + # just mtime-based comparison (`_check_guts_toc_mtime`). Changes to these initial list *must* trigger a rebuild + # (and due to the way things work, a re-analysis), otherwise user might end up with a cached build that fails to + # reflect the changes. + if binaries: + logger.info("Appending 'binaries' from .spec") + self._input_binaries = [(dest_name, src_name, 'BINARY') + for dest_name, src_name in format_binaries_and_datas(binaries, workingdir=spec_dir)] + self._input_binaries = sorted(normalize_toc(self._input_binaries)) + + if datas: + logger.info("Appending 'datas' from .spec") + self._input_datas = [(dest_name, src_name, 'DATA') + for dest_name, src_name in format_binaries_and_datas(datas, workingdir=spec_dir)] + self._input_datas = sorted(normalize_toc(self._input_datas)) + + self.__postinit__() + + _GUTS = ( # input parameters + ('inputs', _check_guts_eq), # parameter `scripts` + ('pathex', _check_guts_eq), + ('hiddenimports', _check_guts_eq), + ('hookspath', _check_guts_eq), + ('hooksconfig', _check_guts_eq), + ('excludes', _check_guts_eq), + ('custom_runtime_hooks', _check_guts_eq), + ('noarchive', _check_guts_eq), + ('module_collection_mode', _check_guts_eq), + ('optimize', _check_guts_eq), + + ('_input_binaries', _check_guts_toc), + ('_input_datas', _check_guts_toc), + + # calculated/analysed values + ('_python_version', _check_guts_eq), + ('scripts', _check_guts_toc_mtime), + ('pure', _check_guts_toc_mtime), + ('binaries', _check_guts_toc_mtime), + ('zipfiles', _check_guts_toc_mtime), + ('zipped_data', None), # TODO check this, too + ('datas', _check_guts_toc_mtime), + # TODO: Need to add "dependencies"? + ) + + def _extend_pathex(self, spec_pathex, scripts): + """ + Normalize additional paths where PyInstaller will look for modules and add paths with scripts to the list of + paths. + + :param spec_pathex: Additional paths defined defined in .spec file. + :param scripts: Scripts to create executable from. + :return: list of updated paths + """ + # Based on main supplied script - add top-level modules directory to PYTHONPATH. + # Sometimes the main app script is not top-level module but submodule like 'mymodule.mainscript.py'. + # In that case PyInstaller will not be able find modules in the directory containing 'mymodule'. + # Add this directory to PYTHONPATH so PyInstaller could find it. + pathex = [] + # Add scripts paths first. + for script in scripts: + logger.debug('script: %s' % script) + script_toplevel_dir = get_path_to_toplevel_modules(script) + if script_toplevel_dir: + pathex.append(script_toplevel_dir) + # Append paths from .spec. + if spec_pathex is not None: + pathex.extend(spec_pathex) + # Normalize paths in pathex and make them absolute. + return [absnormpath(p) for p in pathex] + + def _check_guts(self, data, last_build): + if Target._check_guts(self, data, last_build): + return True + for filename in self.inputs: + if mtime(filename) > last_build: + logger.info("Building because %s changed", filename) + return True + # Now we know that none of the input parameters and none of the input files has changed. So take the values + # that were calculated / analyzed in the last run and store them in `self`. These TOC lists should already + # be normalized. + self.scripts = data['scripts'] + self.pure = data['pure'] + self.binaries = data['binaries'] + self.zipfiles = data['zipfiles'] + self.zipped_data = data['zipped_data'] + self.datas = data['datas'] + + return False + + def assemble(self): + """ + This method is the MAIN method for finding all necessary files to be bundled. + """ + from PyInstaller.config import CONF + + logger.info("Running Analysis %s", self.tocbasename) + logger.info("Target bytecode optimization level: %d", self.optimize) + + for m in self.excludes: + logger.debug("Excluding module '%s'" % m) + self.graph = initialize_modgraph(excludes=self.excludes, user_hook_dirs=self.hookspath) + + # Initialize `binaries` and `datas` with `_input_binaries` and `_input_datas`. Make sure to copy the lists + # to prevent modifications of original lists, which we need to store in original form for guts comparison. + self.datas = [entry for entry in self._input_datas] + self.binaries = [entry for entry in self._input_binaries] + + # TODO: find a better place where to put 'base_library.zip' and when to created it. + # For Python 3 it is necessary to create file 'base_library.zip' containing core Python modules. In Python 3 + # some built-in modules are written in pure Python. base_library.zip is a way how to have those modules as + # "built-in". + libzip_filename = os.path.join(CONF['workpath'], 'base_library.zip') + create_py3_base_library(libzip_filename, graph=self.graph) + # Bundle base_library.zip as data file. + # Data format of TOC item: ('relative_path_in_dist_dir', 'absolute_path_on_disk', 'DATA') + self.datas.append((os.path.basename(libzip_filename), libzip_filename, 'DATA')) + + # Expand sys.path of module graph. The attribute is the set of paths to use for imports: sys.path, plus our + # loader, plus other paths from e.g. --path option). + self.graph.path = self.pathex + self.graph.path + + # Scan for legacy namespace packages. + self.graph.scan_legacy_namespace_packages() + + # Search for python shared library, which we need to collect into frozen application. + logger.info('Looking for Python shared library...') + python_lib = bindepend.get_python_library_path() + if python_lib is None: + from PyInstaller.exceptions import PythonLibraryNotFoundError + raise PythonLibraryNotFoundError() + logger.info('Using Python shared library: %s', python_lib) + if is_darwin and osxutils.is_framework_bundle_lib(python_lib): + # If python library is located in macOS .framework bundle, collect the bundle, and create symbolic link to + # top-level directory. + src_path = pathlib.PurePath(python_lib) + dst_path = pathlib.PurePath(src_path.relative_to(src_path.parent.parent.parent.parent)) + self.binaries.append((str(dst_path), str(src_path), 'BINARY')) + self.binaries.append((os.path.basename(python_lib), str(dst_path), 'SYMLINK')) + else: + self.binaries.append((os.path.basename(python_lib), python_lib, 'BINARY')) + + # -- Module graph. -- + # + # Construct the module graph of import relationships between modules required by this user's application. For + # each entry point (top-level user-defined Python script), all imports originating from this entry point are + # recursively parsed into a subgraph of the module graph. This subgraph is then connected to this graph's root + # node, ensuring imported module nodes will be reachable from the root node -- which is is (arbitrarily) chosen + # to be the first entry point's node. + + # List of graph nodes corresponding to program scripts. + program_scripts = [] + + # Assume that if the script does not exist, Modulegraph will raise error. Save the graph nodes of each in + # sequence. + for script in self.inputs: + logger.info("Analyzing %s", script) + program_scripts.append(self.graph.add_script(script)) + + # Analyze the script's hidden imports (named on the command line) + self.graph.add_hiddenimports(self.hiddenimports) + + # -- Post-graph hooks. -- + self.graph.process_post_graph_hooks(self) + + # Update 'binaries' and 'datas' TOC lists with entries collected from hooks. + self.binaries += self.graph.make_hook_binaries_toc() + self.datas += self.graph.make_hook_datas_toc() + + # We do not support zipped eggs anymore (PyInstaller v6.0), so `zipped_data` and `zipfiles` are always empty. + self.zipped_data = [] + self.zipfiles = [] + + # -- Automatic binary vs. data reclassification. -- + # + # At this point, `binaries` and `datas` contain TOC entries supplied by user via input arguments, and by hooks + # that were ran during the analysis. Neither source can be fully trusted regarding the DATA vs BINARY + # classification (no thanks to our hookutils not being 100% reliable, either!). Therefore, inspect the files and + # automatically reclassify them as necessary. + # + # The proper classification is important especially for collected binaries - to ensure that they undergo binary + # dependency analysis and platform-specific binary processing. On macOS, the .app bundle generation code also + # depends on files to be properly classified. + # + # For entries added to `binaries` and `datas` after this point, we trust their typecodes due to the nature of + # their origin. + combined_toc = normalize_toc(self.datas + self.binaries) + + logger.info('Performing binary vs. data reclassification (%d entries)', len(combined_toc)) + + self.datas = [] + self.binaries = [] + + for dest_name, src_name, typecode in combined_toc: + # Returns 'BINARY' or 'DATA', or None if file cannot be classified. + detected_typecode = bindepend.classify_binary_vs_data(src_name) + if detected_typecode is not None: + if detected_typecode != typecode: + logger.debug( + "Reclassifying collected file %r from %s to %s...", src_name, typecode, detected_typecode + ) + typecode = detected_typecode + + # Put back into corresponding TOC list. + if typecode in {'BINARY', 'EXTENSION'}: + self.binaries.append((dest_name, src_name, typecode)) + else: + self.datas.append((dest_name, src_name, typecode)) + + # -- Look for dlls that are imported by Python 'ctypes' module. -- + # First get code objects of all modules that import 'ctypes'. + logger.info('Looking for ctypes DLLs') + # dict like: {'module1': code_obj, 'module2': code_obj} + ctypes_code_objs = self.graph.get_code_using("ctypes") + + for name, co in ctypes_code_objs.items(): + # Get dlls that might be needed by ctypes. + logger.debug('Scanning %s for ctypes-based references to shared libraries', name) + try: + ctypes_binaries = scan_code_for_ctypes(co) + # As this scan happens after automatic binary-vs-data classification, we need to validate the binaries + # ourselves, just in case. + for dest_name, src_name, typecode in set(ctypes_binaries): + # Allow for `None` in case re-classification is not supported on the given platform. + if bindepend.classify_binary_vs_data(src_name) not in (None, 'BINARY'): + logger.warning("Ignoring %s found via ctypes - not a valid binary!", src_name) + continue + self.binaries.append((dest_name, src_name, typecode)) + except Exception as ex: + raise RuntimeError(f"Failed to scan the module '{name}'. This is a bug. Please report it.") from ex + + self.datas.extend((dest, source, "DATA") + for (dest, source) in format_binaries_and_datas(self.graph.metadata_required())) + + # Analyze run-time hooks. + rhtook_scripts = self.graph.analyze_runtime_hooks(self.custom_runtime_hooks) + + # -- Extract the nodes of the graph as TOCs for further processing. -- + + # Initialize the scripts list: run-time hooks (custom ones, followed by regular ones), followed by program + # script(s). + + # We do not optimize bytecode of run-time hooks. + rthook_toc = self.graph.nodes_to_toc(rhtook_scripts) + + # Override the typecode of program script(s) to include bytecode optimization level. + program_toc = self.graph.nodes_to_toc(program_scripts) + optim_typecode = {0: 'PYSOURCE', 1: 'PYSOURCE-1', 2: 'PYSOURCE-2'}[self.optimize] + program_toc = [(name, src_path, optim_typecode) for name, src_path, typecode in program_toc] + + self.scripts = rthook_toc + program_toc + self.scripts = normalize_toc(self.scripts) # Should not really contain duplicates, but just in case... + + # Extend the binaries list with all the Extensions modulegraph has found. + self.binaries += self.graph.make_binaries_toc() + + # Convert extension module names into full filenames, and append suffix. Ensure that extensions that come from + # the lib-dynload are collected into _MEIPASS/lib-dynload instead of directly into _MEIPASS. + for idx, (dest, source, typecode) in enumerate(self.binaries): + if typecode != 'EXTENSION': + continue + + # Convert to full filename and append suffix + dest, source, typecode = add_suffix_to_extension(dest, source, typecode) + + # Divert into lib-dyload, if necessary (i.e., if file comes from lib-dynload directory) and its destination + # path does not already have a directory prefix. + src_parent = os.path.basename(os.path.dirname(source)) + if src_parent == 'lib-dynload' and not os.path.dirname(os.path.normpath(dest)): + dest = os.path.join('lib-dynload', dest) + + # Update + self.binaries[idx] = (dest, source, typecode) + + # Perform initial normalization of `datas` and `binaries` + self.datas = normalize_toc(self.datas) + self.binaries = normalize_toc(self.binaries) + + # Post-process GLib schemas + self.datas = compile_glib_schema_files(self.datas, os.path.join(CONF['workpath'], "_pyi_gschema_compilation")) + self.datas = normalize_toc(self.datas) + + # Process the pure-python modules list. Depending on the collection mode, these entries end up either in "pure" + # list for collection into the PYZ archive, or in the "datas" list for collection as external data files. + assert len(self.pure) == 0 + pure_pymodules_toc = self.graph.make_pure_toc() + + # Merge package collection mode settings from .spec file. These are applied last, so they override the + # settings previously applied by hooks. + self.graph._module_collection_mode.update(self.module_collection_mode) + logger.debug("Module collection settings: %r", self.graph._module_collection_mode) + + # If target bytecode optimization level matches the run-time bytecode optimization level (i.e., of the running + # build process), we can re-use the modulegraph's code-object cache. + if self.optimize == sys.flags.optimize: + logger.debug( + "Target optimization level %d matches run-time optimization level %d - using modulegraph's code-object " + "cache.", + self.optimize, + sys.flags.optimize, + ) + code_cache = self.graph.get_code_objects() + else: + logger.debug( + "Target optimization level %d differs from run-time optimization level %d - ignoring modulegraph's " + "code-object cache.", + self.optimize, + sys.flags.optimize, + ) + code_cache = None + + pycs_dir = os.path.join(CONF['workpath'], 'localpycs') + optim_level = self.optimize # We could extend this with per-module settings, similar to `collect_mode`. + for name, src_path, typecode in pure_pymodules_toc: + assert typecode == 'PYMODULE' + collect_mode = _get_module_collection_mode(self.graph._module_collection_mode, name, self.noarchive) + + # Collect byte-compiled .pyc into PYZ archive. Embed optimization level into typecode. + if _ModuleCollectionMode.PYZ in collect_mode: + optim_typecode = {0: 'PYMODULE', 1: 'PYMODULE-1', 2: 'PYMODULE-2'}[optim_level] + self.pure.append((name, src_path, optim_typecode)) + + # Pure namespace packages have no source path, and cannot be collected as external data file. + if src_path in (None, '-'): + continue + + # Collect source .py file as external data file + if _ModuleCollectionMode.PY in collect_mode: + dest_path = name.replace('.', os.sep) + # Special case: packages have an implied `__init__` filename that needs to be added. + basename, ext = os.path.splitext(os.path.basename(src_path)) + if basename == '__init__': + dest_path += os.sep + '__init__' + ext + else: + dest_path += ext + self.datas.append((dest_path, src_path, "DATA")) + + # Collect byte-compiled .pyc file as external data file + if _ModuleCollectionMode.PYC in collect_mode: + dest_path = name.replace('.', os.sep) + # Special case: packages have an implied `__init__` filename that needs to be added. + basename, ext = os.path.splitext(os.path.basename(src_path)) + if basename == '__init__': + dest_path += os.sep + '__init__' + # Append the extension for the compiled result. In python 3.5 (PEP-488) .pyo files were replaced by + # .opt-1.pyc and .opt-2.pyc. However, it seems that for bytecode-only module distribution, we always + # need to use the .pyc extension. + dest_path += '.pyc' + + # Compile - use optimization-level-specific sub-directory in local working directory. + obj_path = compile_pymodule( + name, + src_path, + workpath=os.path.join(pycs_dir, str(optim_level)), + optimize=optim_level, + code_cache=code_cache, + ) + + self.datas.append((dest_path, obj_path, "DATA")) + + # Normalize list of pure-python modules (these will end up in PYZ archive, so use specific normalization). + self.pure = normalize_pyz_toc(self.pure) + + # Associate the `pure` TOC list instance with code cache in the global `CONF`; this is used by `PYZ` writer + # to obtain modules' code from cache instead + # + # (NOTE: back when `pure` was an instance of `TOC` class, the code object was passed by adding an attribute + # to the `pure` itself; now that `pure` is plain `list`, we cannot do that anymore. But the association via + # object ID should have the same semantics as the added attribute). + from PyInstaller.config import CONF + global_code_cache_map = CONF['code_cache'] + global_code_cache_map[id(self.pure)] = code_cache + + # Add remaining binary dependencies - analyze Python C-extensions and what DLLs they depend on. + # + # Up until this point, we did very best not to import the packages into the main process. However, a package + # may set up additional library search paths during its import (e.g., by modifying PATH or calling the + # add_dll_directory() function on Windows, or modifying LD_LIBRARY_PATH on Linux). In order to reliably + # discover dynamic libraries, we therefore require an environment with all packages imported. We achieve that + # by gathering list of all collected packages, and spawn an isolated process, in which we first import all + # the packages from the list, and then perform search for dynamic libraries. + logger.info('Looking for dynamic libraries') + + collected_packages = self.graph.get_collected_packages() + self.binaries.extend( + find_binary_dependencies(self.binaries, collected_packages, self.graph._bindepend_symlink_suppression) + ) + + # Apply work-around for (potential) binaries collected from `pywin32` package... + if is_win: + self.binaries = postprocess_binaries_toc_pywin32(self.binaries) + # With anaconda, we need additional work-around... + if is_conda: + self.binaries = postprocess_binaries_toc_pywin32_anaconda(self.binaries) + + # On linux, check for HMAC files accompanying shared library files and, if available, collect them. + # These are present on Fedora and RHEL, and are used in FIPS-enabled configurations to ensure shared + # library's file integrity. + if is_linux: + for dest_name, src_name, typecode in self.binaries: + if typecode not in {'BINARY', 'EXTENSION'}: + continue # Skip symbolic links + + src_lib_path = pathlib.Path(src_name) + + # Check for .name.hmac file next to the shared library. + src_hmac_path = src_lib_path.with_name(f".{src_lib_path.name}.hmac") + if src_hmac_path.is_file(): + dest_hmac_path = pathlib.PurePath(dest_name).with_name(src_hmac_path.name) + self.datas.append((str(dest_hmac_path), str(src_hmac_path), 'DATA')) + + # Alternatively, check the fipscheck directory: fipscheck/name.hmac + src_hmac_path = src_lib_path.parent / "fipscheck" / f"{src_lib_path.name}.hmac" + if src_hmac_path.is_file(): + dest_hmac_path = pathlib.PurePath("fipscheck") / src_hmac_path.name + self.datas.append((str(dest_hmac_path), str(src_hmac_path), 'DATA')) + + # Similarly, look for .chk files that are used by NSS libraries. + src_chk_path = src_lib_path.with_suffix(".chk") + if src_chk_path.is_file(): + dest_chk_path = pathlib.PurePath(dest_name).with_name(src_chk_path.name) + self.datas.append((str(dest_chk_path), str(src_chk_path), 'DATA')) + + # Final normalization of `datas` and `binaries`: + # - normalize both TOCs together (to avoid having duplicates across the lists) + # - process the combined normalized TOC for symlinks + # - split back into `binaries` (BINARY, EXTENSION) and `datas` (everything else) + combined_toc = normalize_toc(self.datas + self.binaries) + combined_toc = toc_process_symbolic_links(combined_toc) + + # On macOS, look for binaries collected from .framework bundles, and collect their Info.plist files. + if is_darwin: + combined_toc += osxutils.collect_files_from_framework_bundles(combined_toc) + + self.datas = [] + self.binaries = [] + for entry in combined_toc: + dest_name, src_name, typecode = entry + if typecode in {'BINARY', 'EXTENSION'}: + self.binaries.append(entry) + else: + self.datas.append(entry) + + # On macOS, the Finder app seems to litter visited directories with `.DS_Store` files. These cause issues with + # codesigning when placed in mixed-content directories, where our .app bundle generator cross-links data files + # from `Resources` to `Frameworks` tree, and the `codesign` utility explicitly forbids a `.DS_Store` file to be + # a symbolic link. + # But there is no reason for `.DS_Store` files to be collected in the first place, so filter them out. + if is_darwin: + self.datas = [(dest_name, src_name, typecode) for dest_name, src_name, typecode in self.datas + if os.path.basename(src_name) != '.DS_Store'] + + # Write warnings about missing modules. + self._write_warnings() + # Write debug information about the graph + self._write_graph_debug() + + # On macOS, check the SDK version of the binaries to be collected, and warn when the SDK version is either + # invalid or too low. Such binaries will likely refuse to be loaded when hardened runtime is enabled and + # while we cannot do anything about it, we can at least warn the user about it. + # See: https://developer.apple.com/forums/thread/132526 + if is_darwin: + binaries_with_invalid_sdk = [] + for dest_name, src_name, typecode in self.binaries: + try: + sdk_version = osxutils.get_macos_sdk_version(src_name) + except Exception: + logger.warning("Failed to query macOS SDK version of %r!", src_name, exc_info=True) + binaries_with_invalid_sdk.append((dest_name, src_name, "unavailable")) + continue + + if sdk_version < (10, 9, 0): + binaries_with_invalid_sdk.append((dest_name, src_name, sdk_version)) + if binaries_with_invalid_sdk: + logger.warning("Found one or more binaries with invalid or incompatible macOS SDK version:") + for dest_name, src_name, sdk_version in binaries_with_invalid_sdk: + logger.warning(" * %r, collected as %r; version: %r", src_name, dest_name, sdk_version) + logger.warning("These binaries will likely cause issues with code-signing and hardened runtime!") + + def _write_warnings(self): + """ + Write warnings about missing modules. Get them from the graph and use the graph to figure out who tried to + import them. + """ + def dependency_description(name, dep_info): + if not dep_info or dep_info == 'direct': + imptype = 0 + else: + imptype = (dep_info.conditional + 2 * dep_info.function + 4 * dep_info.tryexcept) + return '%s (%s)' % (name, IMPORT_TYPES[imptype]) + + from PyInstaller.config import CONF + miss_toc = self.graph.make_missing_toc() + with open(CONF['warnfile'], 'w', encoding='utf-8') as wf: + wf.write(WARNFILE_HEADER) + for (n, p, status) in miss_toc: + importers = self.graph.get_importers(n) + print( + status, + 'module named', + n, + '- imported by', + ', '.join(dependency_description(name, data) for name, data in importers), + file=wf + ) + logger.info("Warnings written to %s", CONF['warnfile']) + + def _write_graph_debug(self): + """ + Write a xref (in html) and with `--log-level DEBUG` a dot-drawing of the graph. + """ + from PyInstaller.config import CONF + with open(CONF['xref-file'], 'w', encoding='utf-8') as fh: + self.graph.create_xref(fh) + logger.info("Graph cross-reference written to %s", CONF['xref-file']) + if logger.getEffectiveLevel() > logging.DEBUG: + return + # The `DOT language's `_ default character encoding (see the end + # of the linked page) is UTF-8. + with open(CONF['dot-file'], 'w', encoding='utf-8') as fh: + self.graph.graphreport(fh) + logger.info("Graph drawing written to %s", CONF['dot-file']) + + def exclude_system_libraries(self, list_of_exceptions=None): + """ + This method may be optionally called from the spec file to exclude any system libraries from the list of + binaries other than those containing the shell-style wildcards in list_of_exceptions. Those that match + '*python*' or are stored under 'lib-dynload' are always treated as exceptions and not excluded. + """ + + self.binaries = [ + entry for entry in self.binaries if _should_include_system_binary(entry, list_of_exceptions or []) + ] + + +class ExecutableBuilder: + """ + Class that constructs the executable. + """ + # TODO wrap the 'main' and 'build' function into this class. + + +def build(spec, distpath, workpath, clean_build): + """ + Build the executable according to the created SPEC file. + """ + from PyInstaller.config import CONF + + # Ensure starting tilde in distpath / workpath is expanded into user's home directory. This is to work around for + # tilde not being expanded when using ˙--workpath=~/path/abc` instead of ˙--workpath ~/path/abc` (or when the path + # argument is quoted). See https://github.com/pyinstaller/pyinstaller/issues/696 + distpath = os.path.abspath(os.path.expanduser(distpath)) + workpath = os.path.abspath(os.path.expanduser(workpath)) + + CONF['spec'] = os.path.abspath(spec) + CONF['specpath'], CONF['specnm'] = os.path.split(CONF['spec']) + CONF['specnm'] = os.path.splitext(CONF['specnm'])[0] + + # Add 'specname' to workpath and distpath if they point to PyInstaller homepath. + if os.path.dirname(distpath) == HOMEPATH: + distpath = os.path.join(HOMEPATH, CONF['specnm'], os.path.basename(distpath)) + CONF['distpath'] = distpath + if os.path.dirname(workpath) == HOMEPATH: + workpath = os.path.join(HOMEPATH, CONF['specnm'], os.path.basename(workpath), CONF['specnm']) + else: + workpath = os.path.join(workpath, CONF['specnm']) + CONF['workpath'] = workpath + + CONF['warnfile'] = os.path.join(workpath, 'warn-%s.txt' % CONF['specnm']) + CONF['dot-file'] = os.path.join(workpath, 'graph-%s.dot' % CONF['specnm']) + CONF['xref-file'] = os.path.join(workpath, 'xref-%s.html' % CONF['specnm']) + + CONF['code_cache'] = dict() + + # Clean PyInstaller cache (CONF['cachedir']) and temporary files (workpath) to be able start a clean build. + if clean_build: + logger.info('Removing temporary files and cleaning cache in %s', CONF['cachedir']) + for pth in (CONF['cachedir'], workpath): + if os.path.exists(pth): + # Remove all files in 'pth'. + for f in glob.glob(pth + '/*'): + # Remove dirs recursively. + if os.path.isdir(f): + shutil.rmtree(f) + else: + os.remove(f) + + # Create DISTPATH and workpath if they does not exist. + for pth in (CONF['distpath'], CONF['workpath']): + os.makedirs(pth, exist_ok=True) + + # Construct NAMESPACE for running the Python code from .SPEC file. + # NOTE: Passing NAMESPACE allows to avoid having global variables in this module and makes isolated environment for + # running tests. + # NOTE: Defining NAMESPACE allows to map any class to a apecific name for .SPEC. + # FIXME: Some symbols might be missing. Add them if there are some failures. + # TODO: What from this .spec API is deprecated and could be removed? + spec_namespace = { + # Set of global variables that can be used while processing .spec file. Some of them act as configuration + # options. + 'DISTPATH': CONF['distpath'], + 'HOMEPATH': HOMEPATH, + 'SPEC': CONF['spec'], + 'specnm': CONF['specnm'], + 'SPECPATH': CONF['specpath'], + 'WARNFILE': CONF['warnfile'], + 'workpath': CONF['workpath'], + # PyInstaller classes for .spec. + 'TOC': TOC, # Kept for backward compatibility even though `TOC` class is deprecated. + 'Analysis': Analysis, + 'BUNDLE': BUNDLE, + 'COLLECT': COLLECT, + 'EXE': EXE, + 'MERGE': MERGE, + 'PYZ': PYZ, + 'Tree': Tree, + 'Splash': Splash, + # Python modules available for .spec. + 'os': os, + } + + # Execute the specfile. Read it as a binary file... + try: + with open(spec, 'rb') as f: + # ... then let Python determine the encoding, since ``compile`` accepts byte strings. + code = compile(f.read(), spec, 'exec') + except FileNotFoundError: + raise SystemExit(f'Spec file "{spec}" not found!') + exec(code, spec_namespace) + + +def __add_options(parser): + parser.add_argument( + "--distpath", + metavar="DIR", + default=DEFAULT_DISTPATH, + help="Where to put the bundled app (default: ./dist)", + ) + parser.add_argument( + '--workpath', + default=DEFAULT_WORKPATH, + help="Where to put all the temporary work files, .log, .pyz and etc. (default: ./build)", + ) + parser.add_argument( + '-y', + '--noconfirm', + action="store_true", + default=False, + help="Replace output directory (default: %s) without asking for confirmation" % + os.path.join('SPECPATH', 'dist', 'SPECNAME'), + ) + parser.add_argument( + '--upx-dir', + default=None, + help="Path to UPX utility (default: search the execution path)", + ) + parser.add_argument( + '--clean', + dest='clean_build', + action='store_true', + default=False, + help="Clean PyInstaller cache and remove temporary files before building.", + ) + + +def main( + pyi_config, + specfile, + noconfirm=False, + distpath=DEFAULT_DISTPATH, + workpath=DEFAULT_WORKPATH, + upx_dir=None, + clean_build=False, + **kw +): + from PyInstaller.config import CONF + CONF['noconfirm'] = noconfirm + + # If configuration dict is supplied - skip configuration step. + if pyi_config is None: + import PyInstaller.configure as configure + CONF.update(configure.get_config(upx_dir=upx_dir)) + else: + CONF.update(pyi_config) + + CONF['ui_admin'] = kw.get('ui_admin', False) + CONF['ui_access'] = kw.get('ui_uiaccess', False) + + build(specfile, distpath, workpath, clean_build) diff --git a/venv/Lib/site-packages/PyInstaller/building/datastruct.py b/venv/Lib/site-packages/PyInstaller/building/datastruct.py new file mode 100644 index 0000000..ca16286 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/building/datastruct.py @@ -0,0 +1,459 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import os +import pathlib +import warnings + +from PyInstaller import log as logging +from PyInstaller.building.utils import _check_guts_eq +from PyInstaller.utils import misc + +logger = logging.getLogger(__name__) + + +def unique_name(entry): + """ + Return the filename used to enforce uniqueness for the given TOC entry. + + Parameters + ---------- + entry : tuple + + Returns + ------- + unique_name: str + """ + name, path, typecode = entry + if typecode in ('BINARY', 'DATA', 'EXTENSION', 'DEPENDENCY'): + name = os.path.normcase(name) + + return name + + +# This class is deprecated and has been replaced by plain lists with explicit normalization (de-duplication) via +# `normalize_toc` and `normalize_pyz_toc` helper functions. +class TOC(list): + """ + TOC (Table of Contents) class is a list of tuples of the form (name, path, typecode). + + typecode name path description + -------------------------------------------------------------------------------------- + EXTENSION Python internal name. Full path name in build. Extension module. + PYSOURCE Python internal name. Full path name in build. Script. + PYMODULE Python internal name. Full path name in build. Pure Python module (including __init__ modules). + PYZ Runtime name. Full path name in build. A .pyz archive (ZlibArchive data structure). + PKG Runtime name. Full path name in build. A .pkg archive (Carchive data structure). + BINARY Runtime name. Full path name in build. Shared library. + DATA Runtime name. Full path name in build. Arbitrary files. + OPTION The option. Unused. Python runtime option (frozen into executable). + + A TOC contains various types of files. A TOC contains no duplicates and preserves order. + PyInstaller uses TOC data type to collect necessary files bundle them into an executable. + """ + def __init__(self, initlist=None): + super().__init__() + + # Deprecation warning + warnings.warn( + "TOC class is deprecated. Use a plain list of 3-element tuples instead.", + DeprecationWarning, + stacklevel=2, + ) + + self.filenames = set() + if initlist: + for entry in initlist: + self.append(entry) + + def append(self, entry): + if not isinstance(entry, tuple): + logger.info("TOC found a %s, not a tuple", entry) + raise TypeError("Expected tuple, not %s." % type(entry).__name__) + + unique = unique_name(entry) + + if unique not in self.filenames: + self.filenames.add(unique) + super().append(entry) + + def insert(self, pos, entry): + if not isinstance(entry, tuple): + logger.info("TOC found a %s, not a tuple", entry) + raise TypeError("Expected tuple, not %s." % type(entry).__name__) + unique = unique_name(entry) + + if unique not in self.filenames: + self.filenames.add(unique) + super().insert(pos, entry) + + def __add__(self, other): + result = TOC(self) + result.extend(other) + return result + + def __radd__(self, other): + result = TOC(other) + result.extend(self) + return result + + def __iadd__(self, other): + for entry in other: + self.append(entry) + return self + + def extend(self, other): + # TODO: look if this can be done more efficient with out the loop, e.g. by not using a list as base at all. + for entry in other: + self.append(entry) + + def __sub__(self, other): + # Construct new TOC with entries not contained in the other TOC + other = TOC(other) + return TOC([entry for entry in self if unique_name(entry) not in other.filenames]) + + def __rsub__(self, other): + result = TOC(other) + return result.__sub__(self) + + def __setitem__(self, key, value): + if isinstance(key, slice): + if key == slice(None, None, None): + # special case: set the entire list + self.filenames = set() + self.clear() + self.extend(value) + return + else: + raise KeyError("TOC.__setitem__ doesn't handle slices") + + else: + old_value = self[key] + old_name = unique_name(old_value) + self.filenames.remove(old_name) + + new_name = unique_name(value) + if new_name not in self.filenames: + self.filenames.add(new_name) + super(TOC, self).__setitem__(key, value) + + +class Target: + invcnum = 0 + + def __init__(self): + from PyInstaller.config import CONF + + # Get a (per class) unique number to avoid conflicts between toc objects + self.invcnum = self.__class__.invcnum + self.__class__.invcnum += 1 + self.tocfilename = os.path.join(CONF['workpath'], '%s-%02d.toc' % (self.__class__.__name__, self.invcnum)) + self.tocbasename = os.path.basename(self.tocfilename) + self.dependencies = [] + + def __postinit__(self): + """ + Check if the target need to be rebuild and if so, re-assemble. + + `__postinit__` is to be called at the end of `__init__` of every subclass of Target. `__init__` is meant to + setup the parameters and `__postinit__` is checking if rebuild is required and in case calls `assemble()` + """ + logger.info("checking %s", self.__class__.__name__) + data = None + last_build = misc.mtime(self.tocfilename) + if last_build == 0: + logger.info("Building %s because %s is non existent", self.__class__.__name__, self.tocbasename) + else: + try: + data = misc.load_py_data_struct(self.tocfilename) + except Exception: + logger.info("Building because %s is bad", self.tocbasename) + else: + # create a dict for easier access + data = dict(zip((g[0] for g in self._GUTS), data)) + # assemble if previous data was not found or is outdated + if not data or self._check_guts(data, last_build): + self.assemble() + self._save_guts() + + _GUTS = [] + + def _check_guts(self, data, last_build): + """ + Returns True if rebuild/assemble is required. + """ + if len(data) != len(self._GUTS): + logger.info("Building because %s is bad", self.tocbasename) + return True + for attr, func in self._GUTS: + if func is None: + # no check for this value + continue + if func(attr, data[attr], getattr(self, attr), last_build): + return True + return False + + def _save_guts(self): + """ + Save the input parameters and the work-product of this run to maybe avoid regenerating it later. + """ + data = tuple(getattr(self, g[0]) for g in self._GUTS) + misc.save_py_data_struct(self.tocfilename, data) + + +class Tree(Target, list): + """ + This class is a way of creating a TOC (Table of Contents) list that describes some or all of the files within a + directory. + """ + def __init__(self, root=None, prefix=None, excludes=None, typecode='DATA'): + """ + root + The root of the tree (on the build system). + prefix + Optional prefix to the names of the target system. + excludes + A list of names to exclude. Two forms are allowed: + + name + Files with this basename will be excluded (do not include the path). + *.ext + Any file with the given extension will be excluded. + typecode + The typecode to be used for all files found in this tree. See the TOC class for for information about + the typcodes. + """ + Target.__init__(self) + list.__init__(self) + self.root = root + self.prefix = prefix + self.excludes = excludes + self.typecode = typecode + if excludes is None: + self.excludes = [] + self.__postinit__() + + _GUTS = ( # input parameters + ('root', _check_guts_eq), + ('prefix', _check_guts_eq), + ('excludes', _check_guts_eq), + ('typecode', _check_guts_eq), + ('data', None), # tested below + # no calculated/analysed values + ) + + def _check_guts(self, data, last_build): + if Target._check_guts(self, data, last_build): + return True + # Walk the collected directories as check if they have been changed - which means files have been added or + # removed. There is no need to check for the files, since `Tree` is only about the directory contents (which is + # the list of files). + stack = [data['root']] + while stack: + d = stack.pop() + if misc.mtime(d) > last_build: + logger.info("Building %s because directory %s changed", self.tocbasename, d) + return True + for nm in os.listdir(d): + path = os.path.join(d, nm) + if os.path.isdir(path): + stack.append(path) + self[:] = data['data'] # collected files + return False + + def _save_guts(self): + # Use the attribute `data` to save the list + self.data = self + super()._save_guts() + del self.data + + def assemble(self): + logger.info("Building Tree %s", self.tocbasename) + stack = [(self.root, self.prefix)] + excludes = set() + xexcludes = set() + for name in self.excludes: + if name.startswith('*'): + xexcludes.add(name[1:]) + else: + excludes.add(name) + result = [] + while stack: + dir, prefix = stack.pop() + for filename in os.listdir(dir): + if filename in excludes: + continue + ext = os.path.splitext(filename)[1] + if ext in xexcludes: + continue + fullfilename = os.path.join(dir, filename) + if prefix: + resfilename = os.path.join(prefix, filename) + else: + resfilename = filename + if os.path.isdir(fullfilename): + stack.append((fullfilename, resfilename)) + else: + result.append((resfilename, fullfilename, self.typecode)) + self[:] = result + + +def normalize_toc(toc): + # Default priority: 0 + _TOC_TYPE_PRIORITIES = { + # DEPENDENCY entries need to replace original entries, so they need the highest priority. + 'DEPENDENCY': 3, + # SYMLINK entries have higher priority than other regular entries + 'SYMLINK': 2, + # BINARY/EXTENSION entries undergo additional processing, so give them precedence over DATA and other entries. + 'BINARY': 1, + 'EXTENSION': 1, + } + + def _type_case_normalization_fcn(typecode): + # Case-normalize all entries except OPTION. + return typecode not in { + "OPTION", + } + + return _normalize_toc(toc, _TOC_TYPE_PRIORITIES, _type_case_normalization_fcn) + + +def normalize_pyz_toc(toc): + # Default priority: 0 + _TOC_TYPE_PRIORITIES = { + # Ensure that entries with higher optimization level take precedence. + 'PYMODULE-2': 2, + 'PYMODULE-1': 1, + 'PYMODULE': 0, + } + + return _normalize_toc(toc, _TOC_TYPE_PRIORITIES) + + +def _normalize_toc(toc, toc_type_priorities, type_case_normalization_fcn=lambda typecode: False): + options_toc = [] + tmp_toc = dict() + for dest_name, src_name, typecode in toc: + # Exempt OPTION entries from de-duplication processing. Some options might allow being specified multiple times. + if typecode == 'OPTION': + options_toc.append(((dest_name, src_name, typecode))) + continue + + # Always sanitize the dest_name with `os.path.normpath` to remove any local loops with parent directory path + # components. `pathlib` does not seem to offer equivalent functionality. + dest_name = os.path.normpath(dest_name) + + # Normalize the destination name for uniqueness. Use `pathlib.PurePath` to ensure that keys are both + # case-normalized (on OSes where applicable) and directory-separator normalized (just in case). + if type_case_normalization_fcn(typecode): + entry_key = pathlib.PurePath(dest_name) + else: + entry_key = dest_name + + existing_entry = tmp_toc.get(entry_key) + if existing_entry is None: + # Entry does not exist - insert + tmp_toc[entry_key] = (dest_name, src_name, typecode) + else: + # Entry already exists - replace if its typecode has higher priority + _, _, existing_typecode = existing_entry + if toc_type_priorities.get(typecode, 0) > toc_type_priorities.get(existing_typecode, 0): + tmp_toc[entry_key] = (dest_name, src_name, typecode) + + # Return the items as list. The order matches the original order due to python dict maintaining the insertion order. + # The exception are OPTION entries, which are now placed at the beginning of the TOC. + return options_toc + list(tmp_toc.values()) + + +def toc_process_symbolic_links(toc): + """ + Process TOC entries and replace entries whose files are symbolic links with SYMLINK entries (provided original file + is also being collected). + """ + # Dictionary of all destination names, for a fast look-up. + all_dest_files = set([dest_name for dest_name, src_name, typecode in toc]) + + # Process the TOC to create SYMLINK entries + new_toc = [] + for entry in toc: + dest_name, src_name, typecode = entry + + # Skip entries that are already symbolic links + if typecode == 'SYMLINK': + new_toc.append(entry) + continue + + # Skip entries without valid source name (e.g., OPTION) + if not src_name: + new_toc.append(entry) + continue + + # Source path is not a symbolic link (i.e., it is a regular file or directory) + if not os.path.islink(src_name): + new_toc.append(entry) + continue + + # Try preserving the symbolic link, under strict relative-relationship-preservation check + symlink_entry = _try_preserving_symbolic_link(dest_name, src_name, all_dest_files) + + if symlink_entry: + new_toc.append(symlink_entry) + else: + new_toc.append(entry) + + return new_toc + + +def _try_preserving_symbolic_link(dest_name, src_name, all_dest_files): + seen_src_files = set() + + # Set initial values for the loop + ref_src_file = src_name + ref_dest_file = dest_name + + while True: + # Guard against cyclic links... + if ref_src_file in seen_src_files: + break + seen_src_files.add(ref_src_file) + + # Stop when referenced source file is not a symbolic link anymore. + if not os.path.islink(ref_src_file): + break + + # Read the symbolic link's target, but do not fully resolve it using os.path.realpath(), because there might be + # other symbolic links involved as well (for example, /lib64 -> /usr/lib64 whereas we are processing + # /lib64/liba.so -> /lib64/liba.so.1) + symlink_target = os.readlink(ref_src_file) + if os.path.isabs(symlink_target): + break # We support only relative symbolic links. + + ref_dest_file = os.path.join(os.path.dirname(ref_dest_file), symlink_target) + ref_dest_file = os.path.normpath(ref_dest_file) # remove any '..' + + ref_src_file = os.path.join(os.path.dirname(ref_src_file), symlink_target) + ref_src_file = os.path.normpath(ref_src_file) # remove any '..' + + # Check if referenced destination file is valid (i.e., we are collecting a file under referenced name). + if ref_dest_file in all_dest_files: + # Sanity check: original source name and current referenced source name must, after complete resolution, + # point to the same file. + if os.path.realpath(src_name) == os.path.realpath(ref_src_file): + # Compute relative link for the destination file (might be modified, if we went over non-collected + # intermediate links). + rel_link = os.path.relpath(ref_dest_file, os.path.dirname(dest_name)) + return dest_name, rel_link, 'SYMLINK' + + # If referenced destination is not valid, do another iteration in case we are dealing with chained links and we + # are not collecting an intermediate link... + + return None diff --git a/venv/Lib/site-packages/PyInstaller/building/icon.py b/venv/Lib/site-packages/PyInstaller/building/icon.py new file mode 100644 index 0000000..de298f2 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/building/icon.py @@ -0,0 +1,90 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2022-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from typing import Tuple + +import os +import hashlib + + +def normalize_icon_type(icon_path: str, allowed_types: Tuple[str], convert_type: str, workpath: str) -> str: + """ + Returns a valid icon path or raises an Exception on error. + Ensures that the icon exists, and, if necessary, attempts to convert it to correct OS-specific format using Pillow. + + Takes: + icon_path - the icon given by the user + allowed_types - a tuple of icon formats that should be allowed through + EX: ("ico", "exe") + convert_type - the type to attempt conversion too if necessary + EX: "icns" + workpath - the temp directory to save any newly generated image files + """ + + # explicitly error if file not found + if not os.path.exists(icon_path): + raise FileNotFoundError(f"Icon input file {icon_path} not found") + + _, extension = os.path.splitext(icon_path) + extension = extension[1:] # get rid of the "." in ".whatever" + + # if the file is already in the right format, pass it back unchanged + if extension in allowed_types: + # Check both the suffix and the header of the file to guard against the user confusing image types. + signatures = hex_signatures[extension] + with open(icon_path, "rb") as f: + header = f.read(max(len(s) for s in signatures)) + if any(list(header)[:len(s)] == s for s in signatures): + return icon_path + + # The icon type is wrong! Let's try and import PIL + try: + from PIL import Image as PILImage + import PIL + + except ImportError: + raise ValueError( + f"Received icon image '{icon_path}' which exists but is not in the correct format. On this platform, " + f"only {allowed_types} images may be used as icons. If Pillow is installed, automatic conversion will " + f"be attempted. Please install Pillow or convert your '{extension}' file to one of {allowed_types} " + f"and try again." + ) + + # Let's try to use PIL to convert the icon file type + try: + _generated_name = f"generated-{hashlib.sha256(icon_path.encode()).hexdigest()}.{convert_type}" + generated_icon = os.path.join(workpath, _generated_name) + with PILImage.open(icon_path) as im: + # If an image uses a custom palette + transparency, convert it to RGBA for a better alpha mask depth. + if im.mode == "P" and im.info.get("transparency", None) is not None: + # The bit depth of the alpha channel will be higher, and the images will look better when eventually + # scaled to multiple sizes (16,24,32,..) for the ICO format for example. + im = im.convert("RGBA") + im.save(generated_icon) + icon_path = generated_icon + except PIL.UnidentifiedImageError: + raise ValueError( + f"Something went wrong converting icon image '{icon_path}' to '.{convert_type}' with Pillow, " + f"perhaps the image format is unsupported. Try again with a different file or use a file that can " + f"be used without conversion on this platform: {allowed_types}" + ) + + return icon_path + + +# Possible initial bytes of icon types PyInstaller needs to be able to recognise. +# Taken from: https://en.wikipedia.org/wiki/List_of_file_signatures +hex_signatures = { + "png": [[0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]], + "exe": [[0x4D, 0x5A], [0x5A, 0x4D]], + "ico": [[0x00, 0x00, 0x01, 0x00]], + "icns": [[0x69, 0x63, 0x6e, 0x73]], +} diff --git a/venv/Lib/site-packages/PyInstaller/building/makespec.py b/venv/Lib/site-packages/PyInstaller/building/makespec.py new file mode 100644 index 0000000..98dac8b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/building/makespec.py @@ -0,0 +1,905 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Automatically build spec files containing a description of the project. +""" + +import argparse +import os +import re +import sys + +from PyInstaller import DEFAULT_SPECPATH, HOMEPATH +from PyInstaller import log as logging +from PyInstaller.building.templates import bundleexetmplt, bundletmplt, onedirtmplt, onefiletmplt, splashtmpl +from PyInstaller.compat import is_darwin, is_win + +logger = logging.getLogger(__name__) + +# This list gives valid choices for the ``--debug`` command-line option, except for the ``all`` choice. +DEBUG_ARGUMENT_CHOICES = ['imports', 'bootloader', 'noarchive'] +# This is the ``all`` choice. +DEBUG_ALL_CHOICE = ['all'] + + +def escape_win_filepath(path): + # escape all \ with another \ after using normpath to clean up the path + return os.path.normpath(path).replace('\\', '\\\\') + + +def make_path_spec_relative(filename, spec_dir): + """ + Make the filename relative to the directory containing .spec file if filename is relative and not absolute. + Otherwise keep filename untouched. + """ + if os.path.isabs(filename): + return filename + else: + filename = os.path.abspath(filename) + # Make it relative. + filename = os.path.relpath(filename, start=spec_dir) + return filename + + +# Support for trying to avoid hard-coded paths in the .spec files. Eg, all files rooted in the Installer directory tree +# will be written using "HOMEPATH", thus allowing this spec file to be used with any Installer installation. Same thing +# could be done for other paths too. +path_conversions = ((HOMEPATH, "HOMEPATH"),) + + +class SourceDestAction(argparse.Action): + """ + A command line option which takes multiple source:dest pairs. + """ + def __init__(self, *args, default=None, metavar=None, **kwargs): + super().__init__(*args, default=[], metavar='SOURCE:DEST', **kwargs) + + def __call__(self, parser, namespace, value, option_string=None): + try: + # Find the only separator that isn't a Windows drive. + separator, = (m for m in re.finditer(rf"(^\w:[/\\])|[:{os.pathsep}]", value) if not m[1]) + except ValueError: + # Split into SRC and DEST failed, wrong syntax + raise argparse.ArgumentError(self, f'Wrong syntax, should be {self.option_strings[0]}=SOURCE:DEST') + src = value[:separator.start()] + dest = value[separator.end():] + if not src or not dest: + # Syntax was correct, but one or both of SRC and DEST was not given + raise argparse.ArgumentError(self, "You have to specify both SOURCE and DEST") + + # argparse is not particularly smart with copy by reference typed defaults. If the current list is the default, + # replace it before modifying it to avoid changing the default. + if getattr(namespace, self.dest) is self.default: + setattr(namespace, self.dest, []) + getattr(namespace, self.dest).append((src, dest)) + + +def make_variable_path(filename, conversions=path_conversions): + if not os.path.isabs(filename): + # os.path.commonpath can not compare relative and absolute paths, and if filename is not absolute, none of the + # paths in conversions will match anyway. + return None, filename + for (from_path, to_name) in conversions: + assert os.path.abspath(from_path) == from_path, ("path '%s' should already be absolute" % from_path) + try: + common_path = os.path.commonpath([filename, from_path]) + except ValueError: + # Per https://docs.python.org/3/library/os.path.html#os.path.commonpath, this raises ValueError in several + # cases which prevent computing a common path. + common_path = None + if common_path == from_path: + rest = filename[len(from_path):] + if rest.startswith(('\\', '/')): + rest = rest[1:] + return to_name, rest + return None, filename + + +def removed_key_option(x): + from PyInstaller.exceptions import RemovedCipherFeatureError + raise RemovedCipherFeatureError("Please remove your --key=xxx argument.") + + +class _RemovedFlagAction(argparse.Action): + def __init__(self, *args, **kwargs): + kwargs["help"] = argparse.SUPPRESS + kwargs["nargs"] = 0 + super().__init__(*args, **kwargs) + + +class _RemovedNoEmbedManifestAction(_RemovedFlagAction): + def __call__(self, *args, **kwargs): + from PyInstaller.exceptions import RemovedExternalManifestError + raise RemovedExternalManifestError("Please remove your --no-embed-manifest argument.") + + +class _RemovedWinPrivateAssembliesAction(_RemovedFlagAction): + def __call__(self, *args, **kwargs): + from PyInstaller.exceptions import RemovedWinSideBySideSupportError + raise RemovedWinSideBySideSupportError("Please remove your --win-private-assemblies argument.") + + +class _RemovedWinNoPreferRedirectsAction(_RemovedFlagAction): + def __call__(self, *args, **kwargs): + from PyInstaller.exceptions import RemovedWinSideBySideSupportError + raise RemovedWinSideBySideSupportError("Please remove your --win-no-prefer-redirects argument.") + + +# An object used in place of a "path string", which knows how to repr() itself using variable names instead of +# hard-coded paths. +class Path: + def __init__(self, *parts): + self.path = os.path.join(*parts) + self.variable_prefix = self.filename_suffix = None + + def __repr__(self): + if self.filename_suffix is None: + self.variable_prefix, self.filename_suffix = make_variable_path(self.path) + if self.variable_prefix is None: + return repr(self.path) + return "os.path.join(" + self.variable_prefix + "," + repr(self.filename_suffix) + ")" + + +# An object used to construct extra preamble for the spec file, in order to accommodate extra collect_*() calls from the +# command-line +class Preamble: + def __init__( + self, datas, binaries, hiddenimports, collect_data, collect_binaries, collect_submodules, collect_all, + copy_metadata, recursive_copy_metadata + ): + # Initialize with literal values - will be switched to preamble variable name later, if necessary + self.binaries = binaries or [] + self.hiddenimports = hiddenimports or [] + self.datas = datas or [] + # Preamble content + self.content = [] + + # Import statements + if collect_data: + self._add_hookutil_import('collect_data_files') + if collect_binaries: + self._add_hookutil_import('collect_dynamic_libs') + if collect_submodules: + self._add_hookutil_import('collect_submodules') + if collect_all: + self._add_hookutil_import('collect_all') + if copy_metadata or recursive_copy_metadata: + self._add_hookutil_import('copy_metadata') + if self.content: + self.content += [''] # empty line to separate the section + # Variables + if collect_data or copy_metadata or collect_all or recursive_copy_metadata: + self._add_var('datas', self.datas) + self.datas = 'datas' # switch to variable + if collect_binaries or collect_all: + self._add_var('binaries', self.binaries) + self.binaries = 'binaries' # switch to variable + if collect_submodules or collect_all: + self._add_var('hiddenimports', self.hiddenimports) + self.hiddenimports = 'hiddenimports' # switch to variable + # Content - collect_data_files + for entry in collect_data: + self._add_collect_data(entry) + # Content - copy_metadata + for entry in copy_metadata: + self._add_copy_metadata(entry) + # Content - copy_metadata(..., recursive=True) + for entry in recursive_copy_metadata: + self._add_recursive_copy_metadata(entry) + # Content - collect_binaries + for entry in collect_binaries: + self._add_collect_binaries(entry) + # Content - collect_submodules + for entry in collect_submodules: + self._add_collect_submodules(entry) + # Content - collect_all + for entry in collect_all: + self._add_collect_all(entry) + # Merge + if self.content and self.content[-1] != '': + self.content += [''] # empty line + self.content = '\n'.join(self.content) + + def _add_hookutil_import(self, name): + self.content += ['from PyInstaller.utils.hooks import {0}'.format(name)] + + def _add_var(self, name, initial_value): + self.content += ['{0} = {1}'.format(name, initial_value)] + + def _add_collect_data(self, name): + self.content += ['datas += collect_data_files(\'{0}\')'.format(name)] + + def _add_copy_metadata(self, name): + self.content += ['datas += copy_metadata(\'{0}\')'.format(name)] + + def _add_recursive_copy_metadata(self, name): + self.content += ['datas += copy_metadata(\'{0}\', recursive=True)'.format(name)] + + def _add_collect_binaries(self, name): + self.content += ['binaries += collect_dynamic_libs(\'{0}\')'.format(name)] + + def _add_collect_submodules(self, name): + self.content += ['hiddenimports += collect_submodules(\'{0}\')'.format(name)] + + def _add_collect_all(self, name): + self.content += [ + 'tmp_ret = collect_all(\'{0}\')'.format(name), + 'datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2]' + ] + + +def __add_options(parser): + """ + Add the `Makespec` options to a option-parser instance or a option group. + """ + g = parser.add_argument_group('What to generate') + g.add_argument( + "-D", + "--onedir", + dest="onefile", + action="store_false", + default=None, + help="Create a one-folder bundle containing an executable (default)", + ) + g.add_argument( + "-F", + "--onefile", + dest="onefile", + action="store_true", + default=None, + help="Create a one-file bundled executable.", + ) + g.add_argument( + "--specpath", + metavar="DIR", + help="Folder to store the generated spec file (default: current directory)", + ) + g.add_argument( + "-n", + "--name", + help="Name to assign to the bundled app and spec file (default: first script's basename)", + ) + g.add_argument( + "--contents-directory", + help="For onedir builds only, specify the name of the directory in which all supporting files (i.e. everything " + "except the executable itself) will be placed in. Use \".\" to re-enable old onedir layout without contents " + "directory.", + ) + + g = parser.add_argument_group('What to bundle, where to search') + g.add_argument( + '--add-data', + action=SourceDestAction, + dest='datas', + help="Additional data files or directories containing data files to be added to the application. The argument " + 'value should be in form of "source:dest_dir", where source is the path to file (or directory) to be ' + "collected, dest_dir is the destination directory relative to the top-level application directory, and both " + "paths are separated by a colon (:). To put a file in the top-level application directory, use . as a " + "dest_dir. This option can be used multiple times." + ) + g.add_argument( + '--add-binary', + action=SourceDestAction, + dest="binaries", + help='Additional binary files to be added to the executable. See the ``--add-data`` option for the format. ' + 'This option can be used multiple times.', + ) + g.add_argument( + "-p", + "--paths", + dest="pathex", + metavar="DIR", + action="append", + default=[], + help="A path to search for imports (like using PYTHONPATH). Multiple paths are allowed, separated by ``%s``, " + "or use this option multiple times. Equivalent to supplying the ``pathex`` argument in the spec file." % + repr(os.pathsep), + ) + g.add_argument( + '--hidden-import', + '--hiddenimport', + action='append', + default=[], + metavar="MODULENAME", + dest='hiddenimports', + help='Name an import not visible in the code of the script(s). This option can be used multiple times.', + ) + g.add_argument( + '--collect-submodules', + action="append", + default=[], + metavar="MODULENAME", + dest='collect_submodules', + help='Collect all submodules from the specified package or module. This option can be used multiple times.', + ) + g.add_argument( + '--collect-data', + '--collect-datas', + action="append", + default=[], + metavar="MODULENAME", + dest='collect_data', + help='Collect all data from the specified package or module. This option can be used multiple times.', + ) + g.add_argument( + '--collect-binaries', + action="append", + default=[], + metavar="MODULENAME", + dest='collect_binaries', + help='Collect all binaries from the specified package or module. This option can be used multiple times.', + ) + g.add_argument( + '--collect-all', + action="append", + default=[], + metavar="MODULENAME", + dest='collect_all', + help='Collect all submodules, data files, and binaries from the specified package or module. This option can ' + 'be used multiple times.', + ) + g.add_argument( + '--copy-metadata', + action="append", + default=[], + metavar="PACKAGENAME", + dest='copy_metadata', + help='Copy metadata for the specified package. This option can be used multiple times.', + ) + g.add_argument( + '--recursive-copy-metadata', + action="append", + default=[], + metavar="PACKAGENAME", + dest='recursive_copy_metadata', + help='Copy metadata for the specified package and all its dependencies. This option can be used multiple ' + 'times.', + ) + g.add_argument( + "--additional-hooks-dir", + action="append", + dest="hookspath", + default=[], + help="An additional path to search for hooks. This option can be used multiple times.", + ) + g.add_argument( + '--runtime-hook', + action='append', + dest='runtime_hooks', + default=[], + help='Path to a custom runtime hook file. A runtime hook is code that is bundled with the executable and is ' + 'executed before any other code or module to set up special features of the runtime environment. This option ' + 'can be used multiple times.', + ) + g.add_argument( + '--exclude-module', + dest='excludes', + action='append', + default=[], + help='Optional module or package (the Python name, not the path name) that will be ignored (as though it was ' + 'not found). This option can be used multiple times.', + ) + g.add_argument( + '--key', + dest='key', + help=argparse.SUPPRESS, + type=removed_key_option, + ) + g.add_argument( + '--splash', + dest='splash', + metavar="IMAGE_FILE", + help="(EXPERIMENTAL) Add an splash screen with the image IMAGE_FILE to the application. The splash screen can " + "display progress updates while unpacking.", + ) + + g = parser.add_argument_group('How to generate') + g.add_argument( + "-d", + "--debug", + # If this option is not specified, then its default value is an empty list (no debug options selected). + default=[], + # Note that ``nargs`` is omitted. This produces a single item not stored in a list, as opposed to a list + # containing one item, as per `nargs `_. + nargs=None, + # The options specified must come from this list. + choices=DEBUG_ALL_CHOICE + DEBUG_ARGUMENT_CHOICES, + # Append choice, rather than storing them (which would overwrite any previous selections). + action='append', + # Allow newlines in the help text; see the ``_SmartFormatter`` in ``__main__.py``. + help=( + "R|Provide assistance with debugging a frozen\n" + "application. This argument may be provided multiple\n" + "times to select several of the following options.\n" + "\n" + "- all: All three of the following options.\n" + "\n" + "- imports: specify the -v option to the underlying\n" + " Python interpreter, causing it to print a message\n" + " each time a module is initialized, showing the\n" + " place (filename or built-in module) from which it\n" + " is loaded. See\n" + " https://docs.python.org/3/using/cmdline.html#id4.\n" + "\n" + "- bootloader: tell the bootloader to issue progress\n" + " messages while initializing and starting the\n" + " bundled app. Used to diagnose problems with\n" + " missing imports.\n" + "\n" + "- noarchive: instead of storing all frozen Python\n" + " source files as an archive inside the resulting\n" + " executable, store them as files in the resulting\n" + " output directory.\n" + "\n" + ), + ) + g.add_argument( + '--optimize', + dest='optimize', + metavar='LEVEL', + type=int, + choices={-1, 0, 1, 2}, + default=None, + help='Bytecode optimization level used for collected python modules and scripts. For details, see the section ' + '“Bytecode Optimization Level” in PyInstaller manual.', + ) + g.add_argument( + '--python-option', + dest='python_options', + metavar='PYTHON_OPTION', + action='append', + default=[], + help='Specify a command-line option to pass to the Python interpreter at runtime. Currently supports ' + '"v" (equivalent to "--debug imports"), "u", "W ", "X ", and "hash_seed=". ' + 'For details, see the section "Specifying Python Interpreter Options" in PyInstaller manual.', + ) + g.add_argument( + "-s", + "--strip", + action="store_true", + help="Apply a symbol-table strip to the executable and shared libs (not recommended for Windows)", + ) + g.add_argument( + "--noupx", + action="store_true", + default=False, + help="Do not use UPX even if it is available (works differently between Windows and *nix)", + ) + g.add_argument( + "--upx-exclude", + dest="upx_exclude", + metavar="FILE", + action="append", + help="Prevent a binary from being compressed when using upx. This is typically used if upx corrupts certain " + "binaries during compression. FILE is the filename of the binary without path. This option can be used " + "multiple times.", + ) + + g = parser.add_argument_group('Windows and Mac OS X specific options') + g.add_argument( + "-c", + "--console", + "--nowindowed", + dest="console", + action="store_true", + default=None, + help="Open a console window for standard i/o (default). On Windows this option has no effect if the first " + "script is a '.pyw' file.", + ) + g.add_argument( + "-w", + "--windowed", + "--noconsole", + dest="console", + action="store_false", + default=None, + help="Windows and Mac OS X: do not provide a console window for standard i/o. On Mac OS this also triggers " + "building a Mac OS .app bundle. On Windows this option is automatically set if the first script is a '.pyw' " + "file. This option is ignored on *NIX systems.", + ) + g.add_argument( + "--hide-console", + type=str, + choices={'hide-early', 'hide-late', 'minimize-early', 'minimize-late'}, + default=None, + help="Windows only: in console-enabled executable, have bootloader automatically hide or minimize the console " + "window if the program owns the console window (i.e., was not launched from an existing console window).", + ) + g.add_argument( + "-i", + "--icon", + action='append', + dest="icon_file", + metavar='', + help="FILE.ico: apply the icon to a Windows executable. FILE.exe,ID: extract the icon with ID from an exe. " + "FILE.icns: apply the icon to the .app bundle on Mac OS. If an image file is entered that isn't in the " + "platform format (ico on Windows, icns on Mac), PyInstaller tries to use Pillow to translate the icon into " + "the correct format (if Pillow is installed). Use \"NONE\" to not apply any icon, thereby making the OS show " + "some default (default: apply PyInstaller's icon). This option can be used multiple times.", + ) + g.add_argument( + "--disable-windowed-traceback", + dest="disable_windowed_traceback", + action="store_true", + default=False, + help="Disable traceback dump of unhandled exception in windowed (noconsole) mode (Windows and macOS only), " + "and instead display a message that this feature is disabled.", + ) + + g = parser.add_argument_group('Windows specific options') + g.add_argument( + "--version-file", + dest="version_file", + metavar="FILE", + help="Add a version resource from FILE to the exe.", + ) + g.add_argument( + "--manifest", + metavar="", + help="Add manifest FILE or XML to the exe.", + ) + g.add_argument( + "-m", + dest="shorthand_manifest", + metavar="", + help="Deprecated shorthand for --manifest.", + ) + g.add_argument( + "--no-embed-manifest", + action=_RemovedNoEmbedManifestAction, + ) + g.add_argument( + "-r", + "--resource", + dest="resources", + metavar="RESOURCE", + action="append", + default=[], + help="Add or update a resource to a Windows executable. The RESOURCE is one to four items, " + "FILE[,TYPE[,NAME[,LANGUAGE]]]. FILE can be a data file or an exe/dll. For data files, at least TYPE and NAME " + "must be specified. LANGUAGE defaults to 0 or may be specified as wildcard * to update all resources of the " + "given TYPE and NAME. For exe/dll files, all resources from FILE will be added/updated to the final executable " + "if TYPE, NAME and LANGUAGE are omitted or specified as wildcard *. This option can be used multiple times.", + ) + g.add_argument( + '--uac-admin', + dest='uac_admin', + action="store_true", + default=False, + help="Using this option creates a Manifest that will request elevation upon application start.", + ) + g.add_argument( + '--uac-uiaccess', + dest='uac_uiaccess', + action="store_true", + default=False, + help="Using this option allows an elevated application to work with Remote Desktop.", + ) + + g = parser.add_argument_group('Windows Side-by-side Assembly searching options (advanced)') + g.add_argument( + "--win-private-assemblies", + action=_RemovedWinPrivateAssembliesAction, + ) + g.add_argument( + "--win-no-prefer-redirects", + action=_RemovedWinNoPreferRedirectsAction, + ) + + g = parser.add_argument_group('Mac OS specific options') + g.add_argument( + "--argv-emulation", + dest="argv_emulation", + action="store_true", + default=False, + help="Enable argv emulation for macOS app bundles. If enabled, the initial open document/URL event is " + "processed by the bootloader and the passed file paths or URLs are appended to sys.argv.", + ) + + g.add_argument( + '--osx-bundle-identifier', + dest='bundle_identifier', + help="Mac OS .app bundle identifier is used as the default unique program name for code signing purposes. " + "The usual form is a hierarchical name in reverse DNS notation. For example: com.mycompany.department.appname " + "(default: first script's basename)", + ) + + g.add_argument( + '--target-architecture', + '--target-arch', + dest='target_arch', + metavar='ARCH', + default=None, + help="Target architecture (macOS only; valid values: x86_64, arm64, universal2). Enables switching between " + "universal2 and single-arch version of frozen application (provided python installation supports the target " + "architecture). If not target architecture is not specified, the current running architecture is targeted.", + ) + + g.add_argument( + '--codesign-identity', + dest='codesign_identity', + metavar='IDENTITY', + default=None, + help="Code signing identity (macOS only). Use the provided identity to sign collected binaries and generated " + "executable. If signing identity is not provided, ad-hoc signing is performed instead.", + ) + + g.add_argument( + '--osx-entitlements-file', + dest='entitlements_file', + metavar='FILENAME', + default=None, + help="Entitlements file to use when code-signing the collected binaries (macOS only).", + ) + + g = parser.add_argument_group('Rarely used special options') + g.add_argument( + "--runtime-tmpdir", + dest="runtime_tmpdir", + metavar="PATH", + help="Where to extract libraries and support files in `onefile` mode. If this option is given, the bootloader " + "will ignore any temp-folder location defined by the run-time OS. The ``_MEIxxxxxx``-folder will be created " + "here. Please use this option only if you know what you are doing. Note that on POSIX systems, PyInstaller's " + "bootloader does NOT perform shell-style environment variable expansion on the given path string. Therefore, " + "using environment variables (e.g., ``~`` or ``$HOME``) in path will NOT work.", + ) + g.add_argument( + "--bootloader-ignore-signals", + action="store_true", + default=False, + help="Tell the bootloader to ignore signals rather than forwarding them to the child process. Useful in " + "situations where for example a supervisor process signals both the bootloader and the child (e.g., via a " + "process group) to avoid signalling the child twice.", + ) + + +def main( + scripts, + name=None, + onefile=False, + console=True, + debug=[], + python_options=[], + strip=False, + noupx=False, + upx_exclude=None, + runtime_tmpdir=None, + contents_directory=None, + pathex=[], + version_file=None, + specpath=None, + bootloader_ignore_signals=False, + disable_windowed_traceback=False, + datas=[], + binaries=[], + icon_file=None, + manifest=None, + resources=[], + bundle_identifier=None, + hiddenimports=[], + hookspath=[], + runtime_hooks=[], + excludes=[], + uac_admin=False, + uac_uiaccess=False, + collect_submodules=[], + collect_binaries=[], + collect_data=[], + collect_all=[], + copy_metadata=[], + splash=None, + recursive_copy_metadata=[], + target_arch=None, + codesign_identity=None, + entitlements_file=None, + argv_emulation=False, + hide_console=None, + optimize=None, + **_kwargs +): + # Default values for onefile and console when not explicitly specified on command-line (indicated by None) + if onefile is None: + onefile = False + + if console is None: + console = True + + # If appname is not specified - use the basename of the main script as name. + if name is None: + name = os.path.splitext(os.path.basename(scripts[0]))[0] + + # If specpath not specified - use default value - current working directory. + if specpath is None: + specpath = DEFAULT_SPECPATH + else: + # Expand starting tilde into user's home directory, as a work-around for tilde not being expanded by shell when + # using ˙--specpath=~/path/abc` instead of ˙--specpath ~/path/abc` (or when the path argument is quoted). + specpath = os.path.expanduser(specpath) + # If cwd is the root directory of PyInstaller, generate the .spec file in ./appname/ subdirectory. + if specpath == HOMEPATH: + specpath = os.path.join(HOMEPATH, name) + # Create directory tree if missing. + if not os.path.exists(specpath): + os.makedirs(specpath) + + # Handle additional EXE options. + exe_options = '' + if version_file: + exe_options += "\n version='%s'," % escape_win_filepath(version_file) + if uac_admin: + exe_options += "\n uac_admin=True," + if uac_uiaccess: + exe_options += "\n uac_uiaccess=True," + if icon_file: + # Icon file for Windows. + # On Windows, the default icon is embedded in the bootloader executable. + if icon_file[0] == 'NONE': + exe_options += "\n icon='NONE'," + else: + exe_options += "\n icon=[%s]," % ','.join("'%s'" % escape_win_filepath(ic) for ic in icon_file) + # Icon file for Mac OS. + # We need to encapsulate it into apostrofes. + icon_file = "'%s'" % icon_file[0] + else: + # On Mac OS, the default icon has to be copied into the .app bundle. + # The the text value 'None' means - use default icon. + icon_file = 'None' + if contents_directory: + exe_options += "\n contents_directory='%s'," % (contents_directory or "_internal") + if hide_console: + exe_options += "\n hide_console='%s'," % hide_console + + if bundle_identifier: + # We need to encapsulate it into apostrofes. + bundle_identifier = "'%s'" % bundle_identifier + + if _kwargs["shorthand_manifest"]: + manifest = _kwargs["shorthand_manifest"] + logger.log( + logging.DEPRECATION, "PyInstaller v7 will remove the -m shorthand flag. Please use --manifest=%s instead", + manifest + ) + if manifest: + if "<" in manifest: + # Assume XML string + exe_options += "\n manifest='%s'," % manifest.replace("'", "\\'") + else: + # Assume filename + exe_options += "\n manifest='%s'," % escape_win_filepath(manifest) + if resources: + resources = list(map(escape_win_filepath, resources)) + exe_options += "\n resources=%s," % repr(resources) + + hiddenimports = hiddenimports or [] + upx_exclude = upx_exclude or [] + + # If file extension of the first script is '.pyw', force --windowed option. + if is_win and os.path.splitext(scripts[0])[-1] == '.pyw': + console = False + + # If script paths are relative, make them relative to the directory containing .spec file. + scripts = [make_path_spec_relative(x, specpath) for x in scripts] + # With absolute paths replace prefix with variable HOMEPATH. + scripts = list(map(Path, scripts)) + + # Translate the default of ``debug=None`` to an empty list. + if debug is None: + debug = [] + # Translate the ``all`` option. + if DEBUG_ALL_CHOICE[0] in debug: + debug = DEBUG_ARGUMENT_CHOICES + + # Create preamble (for collect_*() calls) + preamble = Preamble( + datas, binaries, hiddenimports, collect_data, collect_binaries, collect_submodules, collect_all, copy_metadata, + recursive_copy_metadata + ) + + if splash: + splash_init = splashtmpl % {'splash_image': splash} + splash_binaries = "\n splash.binaries," + splash_target = "\n splash," + else: + splash_init = splash_binaries = splash_target = "" + + # Infer byte-code optimization level. + opt_level = sum([opt == 'O' for opt in python_options]) + if opt_level > 2: + logger.warning( + "The switch '--python-option O' has been specified %d times - it should be specified at most twice!", + opt_level, + ) + opt_level = 2 + + if optimize is None: + if opt_level == 0: + # Infer from running python process + optimize = sys.flags.optimize + else: + # Infer from `--python-option O` switch(es). + optimize = opt_level + elif optimize != opt_level and opt_level != 0: + logger.warning( + "Mismatch between optimization level passed via --optimize switch (%d) and number of '--python-option O' " + "switches (%d)!", + optimize, + opt_level, + ) + + if optimize >= 0: + # Ensure OPTIONs passed to bootloader match the optimization settings. + python_options += max(0, optimize - opt_level) * ['O'] + + # Create OPTIONs array + if 'imports' in debug and 'v' not in python_options: + python_options.append('v') + python_options_array = [(opt, None, 'OPTION') for opt in python_options] + + d = { + 'scripts': scripts, + 'pathex': pathex or [], + 'binaries': preamble.binaries, + 'datas': preamble.datas, + 'hiddenimports': preamble.hiddenimports, + 'preamble': preamble.content, + 'name': name, + 'noarchive': 'noarchive' in debug, + 'optimize': optimize, + 'options': python_options_array, + 'debug_bootloader': 'bootloader' in debug, + 'bootloader_ignore_signals': bootloader_ignore_signals, + 'strip': strip, + 'upx': not noupx, + 'upx_exclude': upx_exclude, + 'runtime_tmpdir': runtime_tmpdir, + 'exe_options': exe_options, + # Directory with additional custom import hooks. + 'hookspath': hookspath, + # List with custom runtime hook files. + 'runtime_hooks': runtime_hooks or [], + # List of modules/packages to ignore. + 'excludes': excludes or [], + # only Windows and Mac OS distinguish windowed and console apps + 'console': console, + 'disable_windowed_traceback': disable_windowed_traceback, + # Icon filename. Only Mac OS uses this item. + 'icon': icon_file, + # .app bundle identifier. Only OSX uses this item. + 'bundle_identifier': bundle_identifier, + # argv emulation (macOS only) + 'argv_emulation': argv_emulation, + # Target architecture (macOS only) + 'target_arch': target_arch, + # Code signing identity (macOS only) + 'codesign_identity': codesign_identity, + # Entitlements file (macOS only) + 'entitlements_file': entitlements_file, + # splash screen + 'splash_init': splash_init, + 'splash_target': splash_target, + 'splash_binaries': splash_binaries, + } + + # Write down .spec file to filesystem. + specfnm = os.path.join(specpath, name + '.spec') + with open(specfnm, 'w', encoding='utf-8') as specfile: + if onefile: + specfile.write(onefiletmplt % d) + # For Mac OS create .app bundle. + if is_darwin and not console: + specfile.write(bundleexetmplt % d) + else: + specfile.write(onedirtmplt % d) + # For Mac OS create .app bundle. + if is_darwin and not console: + specfile.write(bundletmplt % d) + + return specfnm diff --git a/venv/Lib/site-packages/PyInstaller/building/osx.py b/venv/Lib/site-packages/PyInstaller/building/osx.py new file mode 100644 index 0000000..1d5e0ff --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/building/osx.py @@ -0,0 +1,723 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import os +import pathlib +import plistlib +import shutil +import subprocess + +from PyInstaller.building.api import COLLECT, EXE +from PyInstaller.building.datastruct import Target, logger, normalize_toc +from PyInstaller.building.utils import _check_path_overlap, _rmtree, process_collected_binary +from PyInstaller.compat import is_darwin, strict_collect_mode +from PyInstaller.building.icon import normalize_icon_type +import PyInstaller.utils.misc as miscutils + +if is_darwin: + import PyInstaller.utils.osx as osxutils + +# Character sequence used to replace dot (`.`) in names of directories that are created in `Contents/MacOS` or +# `Contents/Frameworks`, where only .framework bundle directories are allowed to have dot in name. +DOT_REPLACEMENT = '__dot__' + + +class BUNDLE(Target): + def __init__(self, *args, **kwargs): + from PyInstaller.config import CONF + + # BUNDLE only has a sense under Mac OS, it's a noop on other platforms + if not is_darwin: + return + + # Get a path to a .icns icon for the app bundle. + self.icon = kwargs.get('icon') + if not self.icon: + # --icon not specified; use the default in the pyinstaller folder + self.icon = os.path.join( + os.path.dirname(os.path.dirname(__file__)), 'bootloader', 'images', 'icon-windowed.icns' + ) + else: + # User gave an --icon=path. If it is relative, make it relative to the spec file location. + if not os.path.isabs(self.icon): + self.icon = os.path.join(CONF['specpath'], self.icon) + + super().__init__() + + # .app bundle is created in DISTPATH. + self.name = kwargs.get('name', None) + base_name = os.path.basename(self.name) + self.name = os.path.join(CONF['distpath'], base_name) + + self.appname = os.path.splitext(base_name)[0] + # Ensure version is a string, even if user accidentally passed an int or a float. + # Having a `CFBundleShortVersionString` entry of non-string type in `Info.plist` causes the .app bundle to + # crash at start (#4466). + self.version = str(kwargs.get("version", "0.0.0")) + self.toc = [] + self.strip = False + self.upx = False + self.console = True + self.target_arch = None + self.codesign_identity = None + self.entitlements_file = None + + # .app bundle identifier for Code Signing + self.bundle_identifier = kwargs.get('bundle_identifier') + if not self.bundle_identifier: + # Fallback to appname. + self.bundle_identifier = self.appname + + self.info_plist = kwargs.get('info_plist', None) + + for arg in args: + # Valid arguments: EXE object, COLLECT object, and TOC-like iterables + if isinstance(arg, EXE): + # Add EXE as an entry to the TOC, and merge its dependencies TOC + self.toc.append((os.path.basename(arg.name), arg.name, 'EXECUTABLE')) + self.toc.extend(arg.dependencies) + # Inherit settings + self.strip = arg.strip + self.upx = arg.upx + self.upx_exclude = arg.upx_exclude + self.console = arg.console + self.target_arch = arg.target_arch + self.codesign_identity = arg.codesign_identity + self.entitlements_file = arg.entitlements_file + elif isinstance(arg, COLLECT): + # Merge the TOC + self.toc.extend(arg.toc) + # Inherit settings + self.strip = arg.strip_binaries + self.upx = arg.upx_binaries + self.upx_exclude = arg.upx_exclude + self.console = arg.console + self.target_arch = arg.target_arch + self.codesign_identity = arg.codesign_identity + self.entitlements_file = arg.entitlements_file + elif miscutils.is_iterable(arg): + # TOC-like iterable + self.toc.extend(arg) + else: + raise TypeError(f"Invalid argument type for BUNDLE: {type(arg)!r}") + + # Infer the executable name from the first EXECUTABLE entry in the TOC; it might have come from the COLLECT + # (as opposed to the stand-alone EXE). + for dest_name, src_name, typecode in self.toc: + if typecode == "EXECUTABLE": + self.exename = src_name + break + else: + raise ValueError("No EXECUTABLE entry found in the TOC!") + + # Normalize TOC + self.toc = normalize_toc(self.toc) + + self.__postinit__() + + _GUTS = ( + # BUNDLE always builds, just want the toc to be written out + ('toc', None), + ) + + def _check_guts(self, data, last_build): + # BUNDLE always needs to be executed, in order to clean the output directory. + return True + + # Helper for determining whether the given file belongs to a .framework bundle or not. If it does, it returns + # the path to the top-level .framework bundle directory; otherwise, returns None. + @staticmethod + def _is_framework_file(dest_path): + for parent in dest_path.parents: + if parent.name.endswith('.framework'): + return parent + return None + + # Helper that computes relative cross-link path between link's location and target, assuming they are both + # rooted in the `Contents` directory of a macOS .app bundle. + @staticmethod + def _compute_relative_crosslink(crosslink_location, crosslink_target): + # We could take symlink_location and symlink_target as they are (relative to parent of the `Contents` + # directory), but that would introduce an unnecessary `../Contents` part. So instead, we take both paths + # relative to the `Contents` directory. + return os.path.join( + *['..' for level in pathlib.PurePath(crosslink_location).relative_to('Contents').parent.parts], + pathlib.PurePath(crosslink_target).relative_to('Contents'), + ) + + # This method takes the original (input) TOC and processes it into final TOC, based on which the `assemble` method + # performs its file collection. The TOC processing here represents the core of our efforts to generate an .app + # bundle that is compatible with Apple's code-signing requirements. + # + # For in-depth details on the code-signing, see Apple's `Technical Note TN2206: macOS Code Signing In Depth` at + # https://developer.apple.com/library/archive/technotes/tn2206/_index.html + # + # The requirements, framed from PyInstaller's perspective, can be summarized as follows: + # + # 1. The `Contents/MacOS` directory is expected to contain only the program executable and (binary) code (= dylibs + # and nested .framework bundles). Alternatively, the dylibs and .framework bundles can be also placed into + # `Contents/Frameworks` directory (where same rules apply as for `Contents/MacOS`, so the remainder of this + # text refers to the two inter-changeably, unless explicitly noted otherwise). The code in `Contents/MacOS` + # is expected to be signed, and the `codesign` utility will recursively sign all found code when using `--deep` + # option to sign the .app bundle. + # + # 2. All non-code files should be be placed in `Contents/Resources`, so they become sealed (data) resources; + # i.e., their signature data is recorded in `Contents/_CodeSignature/CodeResources`. (As a side note, + # it seems that signature information for data/resources in `Contents/Resources` is kept nder `file` key in + # the `CodeResources` file, while the information for contents in `Contents/MacOS` is kept under `file2` key). + # + # 3. The directories in `Contents/MacOS` may not contain dots (`.`) in their names, except for the nested + # .framework bundle directories. The directories in `Contents/Resources` have no such restrictions. + # + # 4. There may not be any content in the top level of a bundle. In other words, if a bundle has a `Contents` + # or a `Versions` directory at its top level, there may be no other files or directories alongside them. The + # sole exception is that alongside ˙Versions˙, there may be symlinks to files and directories in + # `Versions/Current`. This rule is important for nested .framework bundles that we collect from python packages. + # + # Next, let us consider the consequences of violating each of the above requirements: + # + # 1. Code signing machinery can directly store signature only in Mach-O binaries and nested .framework bundles; if + # a data file is placed in `Contents/MacOS`, the signature is stored in the file's extended attributes. If the + # extended attributes are lost, the program's signature will be broken. Many file transfer techniques (e.g., a + # zip file) do not preserve extended attributes, nor are they preserved when uploading to the Mac App Store. + # + # 2. Putting code (a dylib or a .framework bundle) into `Contents/Resources` causes it to be treated as a resource; + # the outer signature (i.e., of the whole .app bundle) does not know that this nested content is actually a code. + # Consequently, signing the bundle with ˙codesign --deep` will NOT sign binaries placed in the + # `Contents/Resources`, which may result in missing signatures when .app bundle is verified for notarization. + # This might be worked around by signing each binary separately, and then signing the whole bundle (without the + # `--deep˙ option), but requires the user to keep track of the offending binaries. + # + # 3. If a directory in `Contents/MacOS` contains a dot in the name, code-signing the bundle fails with + # ˙bundle format unrecognized, invalid, or unsuitable` due to code signing machinery treating directory as a + # nested .framework bundle directory. + # + # 4. If nested .framework bundle is malformed, the signing of the .app bundle might succeed, but subsequent + # verification will fail, for example with `embedded framework contains modified or invalid version` (as observed + # with .framework bundles shipped by contemporary PyQt/PySide PyPI wheels). + # + # The above requirements are unfortunately often at odds with the structure of python packages: + # + # * In general, python packages are mixed-content directories, where binaries and data files may be expected to + # be found next to each other. + # + # For example, `opencv-python` provides a custom loader script that requires the package to be collected in the + # source-only form by PyInstaller (i.e., the python modules and scripts collected as source .py files). At the + # same time, it expects the .py loader script to be able to find the binary extension next to itself. + # + # Another example of mixed-mode directories are Qt QML components' sub-directories, which contain both the + # component's plugin (a binary) and associated meta files (data files). + # + # * In python world, the directories often contain dots in their names. + # + # Dots are often used for private directories containing binaries that are shipped with a package. For example, + # `numpy/.dylibs`, `scipy/.dylibs`, etc. + # + # Qt QML components may also contain a dot in their name; couple of examples from `PySide2` package: + # `PySide2/Qt/qml/QtQuick.2`, ˙PySide2/Qt/qml/QtQuick/Controls.2˙, ˙PySide2/Qt/qml/QtQuick/Particles.2˙, etc. + # + # The packages' metadata directories also invariably contain dots in the name due to version (for example, + # `numpy-1.24.3.dist-info`). + # + # In the light of all above, PyInstaller attempts to strictly place all files to their mandated location + # (`Contents/MacOS` or `Contents/Frameworks` vs `Contents/Resources`). To preserve the illusion of mixed-content + # directories, the content is cross-linked from one directory to the other. Specifically: + # + # * All entries with DATA typecode are assumed to be data files, and are always placed in corresponding directory + # structure rooted in `Contents/Resources`. + # + # * All entries with BINARY or EXTENSION typecode are always placed in corresponding directory structure rooted in + # `Contents/Frameworks`. + # + # * All entries with EXECUTABLE are placed in `Contents/MacOS` directory. + # + # * For the purposes of relocation, nested .framework bundles are treated as a single BINARY entity; i.e., the + # whole .bundle directory is placed in corresponding directory structure rooted in `Contents/Frameworks` (even + # though some of its contents, such as `Info.plist` file, are actually data files). + # + # * Top-level data files and binaries are always cross-linked to the other directory. For example, given a data file + # `data_file.txt` that was collected into `Contents/Resources`, we create a symbolic link called + # `Contents/MacOS/data_file.txt` that points to `../Resources/data_file.txt`. + # + # * The executable itself, while placed in `Contents/MacOS`, are cross-linked into both `Contents/Framworks` and + # `Contents/Resources`. + # + # * The stand-alone PKG entries (used with onefile builds that side-load the PKG archive) are treated as data files + # and collected into `Contents/Resources`, but cross-linked only into `Contents/MacOS` directory (because they + # must appear to be next to the program executable). This is the only entry type that is cross-linked into the + # `Contents/MacOS` directory and also the only data-like entry type that is not cross-linked into the + # `Contents/Frameworks` directory. + # + # * For files in sub-directories, the cross-linking behavior depends on the type of directory: + # + # * A data-only directory is created in directory structure rooted in `Contents/Resources`, and cross-linked + # into directory structure rooted in `Contents/Frameworks` at directory level (i.e., we link the whole + # directory instead of individual files). + # + # This largely saves us from having to deal with dots in the names of collected metadata directories, which + # are examples of data-only directories. + # + # * A binary-only directory is created in directory structure rooted in `Contents/Frameworks`, and cross-linked + # into `Contents/Resources` at directory level. + # + # * A mixed-content directory is created in both directory structures. Files are placed into corresponding + # directory structure based on their type, and cross-linked into other directory structure at file level. + # + # * This rule is applied recursively; for example, a data-only sub-directory in a mixed-content directory is + # cross-linked at directory level, while adjacent binary and data files are cross-linked at file level. + # + # * To work around the issue with dots in the names of directories in `Contents/Frameworks` (applicable to + # binary-only or mixed-content directories), such directories are created with modified name (the dot replaced + # with a pre-defined pattern). Next to the modified directory, a symbolic link with original name is created, + # pointing to the directory with modified name. With mixed-content directories, this modification is performed + # only on the `Contents/Frameworks` side; the corresponding directory in `Contents/Resources` can be created + # directly, without name modification and symbolic link. + # + # * If a symbolic link needs to be created in a mixed-content directory due to a SYMLINK entry from the original + # TOC (i.e., a "collected" symlink originating from analysis, as opposed to the cross-linking mechanism described + # above), the link is created in both directory structures, each pointing to the resource in its corresponding + # directory structure (with one such resource being an actual file, and the other being a cross-link to the file). + # + # Final remarks: + # + # NOTE: the relocation mechanism is codified by tests in `tests/functional/test_macos_bundle_structure.py`. + # + # NOTE: by placing binaries and nested .framework entries into `Contents/Frameworks` instead of `Contents/MacOS`, + # we have effectively relocated the `sys._MEIPASS` directory from the `Contents/MacOS` (= the parent directory of + # the program executable) into `Contents/Frameworks`. This requires the PyInstaller's bootloader to detect that it + # is running in the app-bundle mode (e.g., by checking if program executable's parent directory is `Contents/NacOS`) + # and adjust the path accordingly. + # + # NOTE: the implemented relocation mechanism depends on the input TOC containing properly classified entries + # w.r.t. BINARY vs DATA. So hooks and .spec files triggering collection of binaries as datas (and vice versa) will + # result in incorrect placement of those files in the generated .app bundle. However, this is *not* the proper place + # to address such issues; if necessary, automatic (re)classification should be added to analysis process, to ensure + # that BUNDLE (as well as other build targets) receive correctly classified TOC. + # + # NOTE: similar to the previous note, the relocation mechanism is also not the proper place to enforce compliant + # structure of the nested .framework bundles. Instead, this is handled by the analysis process, using the + # `PyInstaller.utils.osx.collect_files_from_framework_bundles` helper function. So the input TOC that BUNDLE + # receives should already contain entries that reconstruct compliant nested .framework bundles. + def _process_bundle_toc(self, toc): + bundle_toc = [] + + # Step 1: inspect the directory layout and classify the directories according to their contents. + directory_types = dict() + + _MIXED_DIR_TYPE = 'MIXED-DIR' + _DATA_DIR_TYPE = 'DATA-DIR' + _BINARY_DIR_TYPE = 'BINARY-DIR' + _FRAMEWORK_DIR_TYPE = 'FRAMEWORK-DIR' + + _TOP_LEVEL_DIR = pathlib.PurePath('.') + + for dest_name, src_name, typecode in toc: + dest_path = pathlib.PurePath(dest_name) + + framework_dir = self._is_framework_file(dest_path) + if framework_dir: + # Mark the framework directory as FRAMEWORK-DIR. + directory_types[framework_dir] = _FRAMEWORK_DIR_TYPE + # Treat the framework directory as BINARY file when classifying parent directories. + typecode = 'BINARY' + parent_dirs = framework_dir.parents + else: + parent_dirs = dest_path.parents + # Treat BINARY and EXTENSION as BINARY to simplify further processing. + if typecode == 'EXTENSION': + typecode = 'BINARY' + + # (Re)classify parent directories + for parent_dir in parent_dirs: + # Skip the top-level `.` dir. This is also the only directory that can contain EXECUTABLE and PKG + # entries, so we do not have to worry about. + if parent_dir == _TOP_LEVEL_DIR: + continue + + directory_type = _BINARY_DIR_TYPE if typecode == 'BINARY' else _DATA_DIR_TYPE # default + directory_type = directory_types.get(parent_dir, directory_type) + + if directory_type == _DATA_DIR_TYPE and typecode == 'BINARY': + directory_type = _MIXED_DIR_TYPE + if directory_type == _BINARY_DIR_TYPE and typecode == 'DATA': + directory_type = _MIXED_DIR_TYPE + + directory_types[parent_dir] = directory_type + + logger.debug("Directory classification: %r", directory_types) + + # Step 2: process the obtained directory structure and create symlink entries for directories that need to be + # cross-linked. Such directories are data-only and binary-only directories (and framework directories) that are + # located either in the top-level directory (have no parent) or in a mixed-content directory. + for directory_path, directory_type in directory_types.items(): + # Cross-linking at directory level applies only to data-only and binary-only directories (as well as + # framework directories). + if directory_type == _MIXED_DIR_TYPE: + continue + + # The parent needs to be either top-level directory or a mixed-content directory. Otherwise, the parent + # (or one of its ancestors) will get cross-linked, and we do not need the link here. + parent_dir = directory_path.parent + requires_crosslink = parent_dir == _TOP_LEVEL_DIR or directory_types.get(parent_dir) == _MIXED_DIR_TYPE + if not requires_crosslink: + continue + + logger.debug("Cross-linking directory %r of type %r", directory_path, directory_type) + + # Data-only directories are created in `Contents/Resources`, needs to be cross-linked into `Contents/MacOS`. + # Vice versa for binary-only or framework directories. The directory creation is handled implicitly, when we + # create parent directory structure for collected files. + if directory_type == _DATA_DIR_TYPE: + symlink_src = os.path.join('Contents/Resources', directory_path) + symlink_dest = os.path.join('Contents/Frameworks', directory_path) + else: + symlink_src = os.path.join('Contents/Frameworks', directory_path) + symlink_dest = os.path.join('Contents/Resources', directory_path) + symlink_ref = self._compute_relative_crosslink(symlink_dest, symlink_src) + + bundle_toc.append((symlink_dest, symlink_ref, 'SYMLINK')) + + # Step 3: first part of the work-around for directories that are located in `Contents/Frameworks` but contain a + # dot in their name. As per `codesign` rules, the only directories in `Contents/Frameworks` that are allowed to + # contain a dot in their name are .framework bundle directories. So we replace the dot with a custom character + # sequence (stored in global `DOT_REPLACEMENT` variable), and create a symbolic with original name pointing to + # the modified name. This is the best we can do with code-sign requirements vs. python community showing their + # packages' dylibs into `.dylib` subdirectories, or Qt storing their Qml components in directories named + # `QtQuick.2`, `QtQuick/Controls.2`, `QtQuick/Particles.2`, `QtQuick/Templates.2`, etc. + # + # In this step, we only prepare symlink entries that link the original directory name (with dot) to the modified + # one (with dot replaced). The parent paths for collected files are modified in later step(s). + for directory_path, directory_type in directory_types.items(): + # .framework bundle directories contain a dot in the name, but are allowed that. + if directory_type == _FRAMEWORK_DIR_TYPE: + continue + + # Data-only directories are fully located in `Contents/Resources` and cross-linked to `Contents/Frameworks` + # at directory level, so they are also allowed a dot in their name. + if directory_type == _DATA_DIR_TYPE: + continue + + # Apply the work-around, if necessary... + if '.' not in directory_path.name: + continue + + logger.debug( + "Creating symlink to work around the dot in the name of directory %r (%s)...", str(directory_path), + directory_type + ) + + # Create a SYMLINK entry, but only for this level. In case of nested directories with dots in names, the + # symlinks for ancestors will be created by corresponding loop iteration. + bundle_toc.append(( + os.path.join('Contents/Frameworks', directory_path), + directory_path.name.replace('.', DOT_REPLACEMENT), + 'SYMLINK', + )) + + # Step 4: process the entries for collected files, and decide whether they should be placed into + # `Contents/MacOS`, `Contents/Frameworks`, or `Contents/Resources`, and whether they should be cross-linked into + # other directories. + for orig_dest_name, src_name, typecode in toc: + orig_dest_path = pathlib.PurePath(orig_dest_name) + + # Special handling for EXECUTABLE and PKG entries + if typecode == 'EXECUTABLE': + # Place into `Contents/MacOS`, ... + file_dest = os.path.join('Contents/MacOS', orig_dest_name) + bundle_toc.append((file_dest, src_name, typecode)) + # ... and do nothing else. We explicitly avoid cross-linking the executable to `Contents/Frameworks` and + # `Contents/Resources`, because it should be not necessary (the executable's location should be + # discovered via `sys.executable`) and to prevent issues when executable name collides with name of a + # package from which we collect either binaries or data files (or both); see #7314. + continue + elif typecode == 'PKG': + # Place into `Contents/Resources` ... + file_dest = os.path.join('Contents/Resources', orig_dest_name) + bundle_toc.append((file_dest, src_name, typecode)) + # ... and cross-link only into `Contents/MacOS`. + # This is used only in `onefile` mode, where there is actually no other content to distribute among the + # `Contents/Resources` and `Contents/Frameworks` directories, so cross-linking into the latter makes + # little sense. + symlink_dest = os.path.join('Contents/MacOS', orig_dest_name) + symlink_ref = self._compute_relative_crosslink(symlink_dest, file_dest) + bundle_toc.append((symlink_dest, symlink_ref, 'SYMLINK')) + continue + + # Standard data vs binary processing... + + # Determine file location based on its type. + if self._is_framework_file(orig_dest_path): + # File from a framework bundle; put into `Contents/Frameworks`, but never cross-link the file itself. + # The whole .framework bundle directory will be linked as necessary by the directory cross-linking + # mechanism. + file_base_dir = 'Contents/Frameworks' + crosslink_base_dir = None + elif typecode == 'DATA': + # Data file; relocate to `Contents/Resources` and cross-link it back into `Contents/Frameworks`. + file_base_dir = 'Contents/Resources' + crosslink_base_dir = 'Contents/Frameworks' + else: + # Binary; put into `Contents/Frameworks` and cross-link it into `Contents/Resources`. + file_base_dir = 'Contents/Frameworks' + crosslink_base_dir = 'Contents/Resources' + + # Determine if we need to cross-link the file. We need to do this for top-level files (the ones without + # parent directories), and for files whose parent directories are mixed-content directories. + requires_crosslink = False + if crosslink_base_dir is not None: + parent_dir = orig_dest_path.parent + requires_crosslink = parent_dir == _TOP_LEVEL_DIR or directory_types.get(parent_dir) == _MIXED_DIR_TYPE + + # Special handling for SYMLINK entries in original TOC; if we need to cross-link a symlink entry, we create + # it in both locations, and have each point to the (relative) resource in the same directory (so one of the + # targets will likely be a file, and the other will be a symlink due to cross-linking). + if typecode == 'SYMLINK' and requires_crosslink: + bundle_toc.append((os.path.join(file_base_dir, orig_dest_name), src_name, typecode)) + bundle_toc.append((os.path.join(crosslink_base_dir, orig_dest_name), src_name, typecode)) + continue + + # The file itself. + file_dest = os.path.join(file_base_dir, orig_dest_name) + bundle_toc.append((file_dest, src_name, typecode)) + + # Symlink for cross-linking + if requires_crosslink: + symlink_dest = os.path.join(crosslink_base_dir, orig_dest_name) + symlink_ref = self._compute_relative_crosslink(symlink_dest, file_dest) + bundle_toc.append((symlink_dest, symlink_ref, 'SYMLINK')) + + # Step 5: sanitize all destination paths in the new TOC, to ensure that paths that are rooted in + # `Contents/Frameworks` do not contain directories with dots in their names. Doing this as a post-processing + # step keeps code simple and clean and ensures that this step is applied to files, symlinks that originate from + # cross-linking files, and symlinks that originate from cross-linking directories. This in turn ensures that + # all directory hierarchies created during the actual file collection have sanitized names, and that collection + # outcome does not depend on the order of entries in the TOC. + sanitized_toc = [] + for dest_name, src_name, typecode in bundle_toc: + dest_path = pathlib.PurePath(dest_name) + + # Paths rooted in Contents/Resources do not require sanitizing. + if dest_path.parts[0] == 'Contents' and dest_path.parts[1] == 'Resources': + sanitized_toc.append((dest_name, src_name, typecode)) + continue + + # Special handling for files from .framework bundle directories; sanitize only parent path of the .framework + # directory. + framework_path = self._is_framework_file(dest_path) + if framework_path: + parent_path = framework_path.parent + remaining_path = dest_path.relative_to(parent_path) + else: + parent_path = dest_path.parent + remaining_path = dest_path.name + + sanitized_dest_path = pathlib.PurePath( + *parent_path.parts[:2], # Contents/Frameworks + *[part.replace('.', DOT_REPLACEMENT) for part in parent_path.parts[2:]], + remaining_path, + ) + sanitized_dest_name = str(sanitized_dest_path) + + if sanitized_dest_path != dest_path: + logger.debug("Sanitizing dest path: %r -> %r", dest_name, sanitized_dest_name) + + sanitized_toc.append((sanitized_dest_name, src_name, typecode)) + + bundle_toc = sanitized_toc + + # Normalize and sort the TOC for easier inspection + bundle_toc = sorted(normalize_toc(bundle_toc)) + + return bundle_toc + + def assemble(self): + from PyInstaller.config import CONF + + if _check_path_overlap(self.name) and os.path.isdir(self.name): + _rmtree(self.name) + + logger.info("Building BUNDLE %s", self.tocbasename) + + # Create a minimal Mac bundle structure. + os.makedirs(os.path.join(self.name, "Contents", "MacOS")) + os.makedirs(os.path.join(self.name, "Contents", "Resources")) + os.makedirs(os.path.join(self.name, "Contents", "Frameworks")) + + # Makes sure the icon exists and attempts to convert to the proper format if applicable + self.icon = normalize_icon_type(self.icon, ("icns",), "icns", CONF["workpath"]) + + # Ensure icon path is absolute + self.icon = os.path.abspath(self.icon) + + # Copy icns icon to Resources directory. + shutil.copyfile(self.icon, os.path.join(self.name, 'Contents', 'Resources', os.path.basename(self.icon))) + + # Key/values for a minimal Info.plist file + info_plist_dict = { + "CFBundleDisplayName": self.appname, + "CFBundleName": self.appname, + + # Required by 'codesign' utility. + # The value for CFBundleIdentifier is used as the default unique name of your program for Code Signing + # purposes. It even identifies the APP for access to restricted OS X areas like Keychain. + # + # The identifier used for signing must be globally unique. The usual form for this identifier is a + # hierarchical name in reverse DNS notation, starting with the toplevel domain, followed by the company + # name, followed by the department within the company, and ending with the product name. Usually in the + # form: com.mycompany.department.appname + # CLI option --osx-bundle-identifier sets this value. + "CFBundleIdentifier": self.bundle_identifier, + "CFBundleExecutable": os.path.basename(self.exename), + "CFBundleIconFile": os.path.basename(self.icon), + "CFBundleInfoDictionaryVersion": "6.0", + "CFBundlePackageType": "APPL", + "CFBundleShortVersionString": self.version, + } + + # Set some default values. But they still can be overwritten by the user. + if self.console: + # Setting EXE console=True implies LSBackgroundOnly=True. + info_plist_dict['LSBackgroundOnly'] = True + else: + # Let's use high resolution by default. + info_plist_dict['NSHighResolutionCapable'] = True + + # Merge info_plist settings from spec file + if isinstance(self.info_plist, dict) and self.info_plist: + info_plist_dict.update(self.info_plist) + + plist_filename = os.path.join(self.name, "Contents", "Info.plist") + with open(plist_filename, "wb") as plist_fh: + plistlib.dump(info_plist_dict, plist_fh) + + # Pre-process the TOC into its final BUNDLE-compatible form. + bundle_toc = self._process_bundle_toc(self.toc) + + # Perform the actual collection. + CONTENTS_FRAMEWORKS_PATH = pathlib.PurePath('Contents/Frameworks') + for dest_name, src_name, typecode in bundle_toc: + # Create parent directory structure, if necessary + dest_path = os.path.join(self.name, dest_name) # Absolute destination path + dest_dir = os.path.dirname(dest_path) + try: + os.makedirs(dest_dir, exist_ok=True) + except FileExistsError: + raise SystemExit( + f"Pyinstaller needs to create a directory at {dest_dir!r}, " + "but there already exists a file at that path!" + ) + # Copy extensions and binaries from cache. This ensures that these files undergo additional binary + # processing - have paths to linked libraries rewritten (relative to `@rpath`) and have rpath set to the + # top-level directory (relative to `@loader_path`, i.e., the file's location). The "top-level" directory + # in this case corresponds to `Contents/MacOS` (where `sys._MEIPASS` also points), so we need to pass + # the cache retrieval function the *original* destination path (which is without preceding + # `Contents/MacOS`). + if typecode in ('EXTENSION', 'BINARY'): + orig_dest_name = str(pathlib.PurePath(dest_name).relative_to(CONTENTS_FRAMEWORKS_PATH)) + src_name = process_collected_binary( + src_name, + orig_dest_name, + use_strip=self.strip, + use_upx=self.upx, + upx_exclude=self.upx_exclude, + target_arch=self.target_arch, + codesign_identity=self.codesign_identity, + entitlements_file=self.entitlements_file, + strict_arch_validation=(typecode == 'EXTENSION'), + ) + if typecode == 'SYMLINK': + os.symlink(src_name, dest_path) # Create link at dest_path, pointing at (relative) src_name + else: + # BUNDLE does not support MERGE-based multipackage + assert typecode != 'DEPENDENCY', "MERGE DEPENDENCY entries are not supported in BUNDLE!" + + # At this point, `src_name` should be a valid file. + if not os.path.isfile(src_name): + raise ValueError(f"Resource {src_name!r} is not a valid file!") + # If strict collection mode is enabled, the destination should not exist yet. + if strict_collect_mode and os.path.exists(dest_path): + raise ValueError( + f"Attempting to collect a duplicated file into BUNDLE: {dest_name} (type: {typecode})" + ) + # Use `shutil.copyfile` to copy file with default permissions. We do not attempt to preserve original + # permissions nor metadata, as they might be too restrictive and cause issues either during subsequent + # re-build attempts or when trying to move the application bundle. For binaries (and data files with + # executable bit set), we manually set the executable bits after copying the file. + shutil.copyfile(src_name, dest_path) + if ( + typecode in ('EXTENSION', 'BINARY', 'EXECUTABLE') + or (typecode == 'DATA' and os.access(src_name, os.X_OK)) + ): + os.chmod(dest_path, 0o755) + + # Sign the bundle + logger.info('Signing the BUNDLE...') + try: + osxutils.sign_binary(self.name, self.codesign_identity, self.entitlements_file, deep=True) + except Exception as e: + # Display a warning or re-raise the error, depending on the environment-variable setting. + if os.environ.get("PYINSTALLER_STRICT_BUNDLE_CODESIGN_ERROR", "0") == "0": + logger.warning("Error while signing the bundle: %s", e) + logger.warning("You will need to sign the bundle manually!") + else: + raise RuntimeError("Failed to codesign the bundle!") from e + + logger.info("Building BUNDLE %s completed successfully.", self.tocbasename) + + # Optionally verify bundle's signature. This is primarily intended for our CI. + if os.environ.get("PYINSTALLER_VERIFY_BUNDLE_SIGNATURE", "0") != "0": + logger.info("Verifying signature for BUNDLE %s...", self.name) + self.verify_bundle_signature(self.name) + logger.info("BUNDLE verification complete!") + + @staticmethod + def verify_bundle_signature(bundle_dir): + # First, verify the bundle signature using codesign. + cmd_args = ['/usr/bin/codesign', '--verify', '--all-architectures', '--deep', '--strict', bundle_dir] + p = subprocess.run(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf8') + if p.returncode: + raise SystemError( + f"codesign command ({cmd_args}) failed with error code {p.returncode}!\noutput: {p.stdout}" + ) + + # Ensure that code-signing information is *NOT* embedded in the files' extended attributes. + # + # This happens when files other than binaries are present in `Contents/MacOS` or `Contents/Frameworks` + # directory; as the signature cannot be embedded within the file itself (contrary to binaries with + # `LC_CODE_SIGNATURE` section in their header), it ends up stores in the file's extended attributes. However, + # if such bundle is transferred using a method that does not support extended attributes (for example, a zip + # file), the signatures on these files are lost, and the signature of the bundle as a whole becomes invalid. + # This is the primary reason why we need to relocate non-binaries into `Contents/Resources` - the signatures + # for files in that directory end up stored in `Contents/_CodeSignature/CodeResources` file. + # + # This check therefore aims to ensure that all files have been properly relocated to their corresponding + # locations w.r.t. the code-signing requirements. + + try: + import xattr + except ModuleNotFoundError: + logger.info("xattr package not available; skipping verification of extended attributes!") + return + + CODESIGN_ATTRS = ( + "com.apple.cs.CodeDirectory", + "com.apple.cs.CodeRequirements", + "com.apple.cs.CodeRequirements-1", + "com.apple.cs.CodeSignature", + ) + + for entry in pathlib.Path(bundle_dir).rglob("*"): + if not entry.is_file(): + continue + + file_attrs = xattr.listxattr(entry) + if any([codesign_attr in file_attrs for codesign_attr in CODESIGN_ATTRS]): + raise ValueError(f"Code-sign attributes found in extended attributes of {str(entry)!r}!") diff --git a/venv/Lib/site-packages/PyInstaller/building/splash.py b/venv/Lib/site-packages/PyInstaller/building/splash.py new file mode 100644 index 0000000..1f1371b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/building/splash.py @@ -0,0 +1,442 @@ +# ----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +# ----------------------------------------------------------------------------- +import io +import os +import re +import struct +import pathlib + +from PyInstaller import log as logging +from PyInstaller.archive.writers import SplashWriter +from PyInstaller.building import splash_templates +from PyInstaller.building.datastruct import Target +from PyInstaller.building.utils import _check_guts_eq, _check_guts_toc, misc +from PyInstaller.compat import is_darwin +from PyInstaller.depend import bindepend +from PyInstaller.utils.hooks.tcl_tk import tcltk_info + +try: + from PIL import Image as PILImage +except ImportError: + PILImage = None + +logger = logging.getLogger(__name__) + +# These requirement files are checked against the current splash screen script. If you wish to modify the splash screen +# and run into tcl errors/bad behavior, this is a good place to start and add components your implementation of the +# splash screen might use. +# NOTE: these paths use the *destination* layout for Tcl/Tk scripts, which uses unversioned tcl and tk directories +# (see `PyInstaller.utils.hooks.tcl_tk.collect_tcl_tk_files`). +splash_requirements = [ + # prepended tcl/tk binaries + os.path.join(tcltk_info.TK_ROOTNAME, "license.terms"), + os.path.join(tcltk_info.TK_ROOTNAME, "text.tcl"), + os.path.join(tcltk_info.TK_ROOTNAME, "tk.tcl"), + # Used for customizable font + os.path.join(tcltk_info.TK_ROOTNAME, "ttk", "ttk.tcl"), + os.path.join(tcltk_info.TK_ROOTNAME, "ttk", "fonts.tcl"), + os.path.join(tcltk_info.TK_ROOTNAME, "ttk", "cursors.tcl"), + os.path.join(tcltk_info.TK_ROOTNAME, "ttk", "utils.tcl"), +] + + +class Splash(Target): + """ + Bundles the required resources for the splash screen into a file, which will be included in the CArchive. + + A Splash has two outputs, one is itself and one is stored in splash.binaries. Both need to be passed to other + build targets in order to enable the splash screen. + """ + def __init__(self, image_file, binaries, datas, **kwargs): + """ + :param str image_file: + A path-like object to the image to be used. Only the PNG file format is supported. + + .. note:: If a different file format is supplied and PIL (Pillow) is installed, the file will be converted + automatically. + + .. note:: *Windows*: The color ``'magenta'`` / ``'#ff00ff'`` must not be used in the image or text, as it is + used by splash screen to indicate transparent areas. Use a similar color (e.g., ``'#ff00fe'``) instead. + + .. note:: If PIL (Pillow) is installed and the image is bigger than max_img_size, the image will be resized + to fit into the specified area. + :param list binaries: + The TOC list of binaries the Analysis build target found. This TOC includes all extension modules and their + binary dependencies. This is required to determine whether the user's program uses `tkinter`. + :param list datas: + The TOC list of data the Analysis build target found. This TOC includes all data-file dependencies of the + modules. This is required to check if all splash screen requirements can be bundled. + + :keyword text_pos: + An optional two-integer tuple that represents the origin of the text on the splash screen image. The + origin of the text is its lower left corner. A unit in the respective coordinate system is a pixel of the + image, its origin lies in the top left corner of the image. This parameter also acts like a switch for + the text feature. If omitted, no text will be displayed on the splash screen. This text will be used to + show textual progress in onefile mode. + :type text_pos: Tuple[int, int] + :keyword text_size: + The desired size of the font. If the size argument is a positive number, it is interpreted as a size in + points. If size is a negative number, its absolute value is interpreted as a size in pixels. Default: ``12`` + :type text_size: int + :keyword text_font: + An optional name of a font for the text. This font must be installed on the user system, otherwise the + system default font is used. If this parameter is omitted, the default font is also used. + :keyword text_color: + An optional color for the text. HTML color codes (``'#40e0d0'``) and color names (``'turquoise'``) are + supported. Default: ``'black'`` + (Windows: the color ``'magenta'`` / ``'#ff00ff'`` is used to indicate transparency, and should not be used) + :type text_color: str + :keyword text_default: + The default text which will be displayed before the extraction starts. Default: ``"Initializing"`` + :type text_default: str + :keyword full_tk: + By default Splash bundles only the necessary files for the splash screen (some tk components). This + options enables adding full tk and making it a requirement, meaning all tk files will be unpacked before + the splash screen can be started. This is useful during development of the splash screen script. + Default: ``False`` + :type full_tk: bool + :keyword minify_script: + The splash screen is created by executing an Tcl/Tk script. This option enables minimizing the script, + meaning removing all non essential parts from the script. Default: ``True`` + :keyword name: + An optional alternative filename for the .res file. If not specified, a name is generated. + :type name: str + :keyword script_name: + An optional alternative filename for the Tcl script, that will be generated. If not specified, a name is + generated. + :type script_name: str + :keyword max_img_size: + Maximum size of the splash screen image as a tuple. If the supplied image exceeds this limit, it will be + resized to fit the maximum width (to keep the original aspect ratio). This option can be disabled by + setting it to None. Default: ``(760, 480)`` + :type max_img_size: Tuple[int, int] + :keyword always_on_top: + Force the splashscreen to be always on top of other windows. If disabled, other windows (e.g., from other + applications) can cover the splash screen by user bringing them to front. This might be useful for + frozen applications with long startup times. Default: ``True`` + :type always_on_top: bool + """ + from ..config import CONF + Target.__init__(self) + + # Splash screen is not supported on macOS. It operates in a secondary thread and macOS disallows UI operations + # in any thread other than main. + if is_darwin: + raise SystemExit("Splash screen is not supported on macOS.") + + # Ensure tkinter (and thus Tcl/Tk) is available. + if not tcltk_info.available: + raise SystemExit( + "Your platform does not support the splash screen feature, since tkinter is not installed. Please " + "install tkinter and try again." + ) + + # Check if the Tcl/Tk version is supported. + self._check_tcl_tk_compatibility() + + # Make image path relative to .spec file + if not os.path.isabs(image_file): + image_file = os.path.join(CONF['specpath'], image_file) + image_file = os.path.normpath(image_file) + if not os.path.exists(image_file): + raise ValueError("Image file '%s' not found" % image_file) + + # Copy all arguments + self.image_file = image_file + self.full_tk = kwargs.get("full_tk", False) + self.name = kwargs.get("name", None) + self.script_name = kwargs.get("script_name", None) + self.minify_script = kwargs.get("minify_script", True) + self.max_img_size = kwargs.get("max_img_size", (760, 480)) + + # text options + self.text_pos = kwargs.get("text_pos", None) + self.text_size = kwargs.get("text_size", 12) + self.text_font = kwargs.get("text_font", "TkDefaultFont") + self.text_color = kwargs.get("text_color", "black") + self.text_default = kwargs.get("text_default", "Initializing") + + # always-on-top behavior + self.always_on_top = kwargs.get("always_on_top", True) + + # Save the generated file separately so that it is not necessary to generate the data again and again + root = os.path.splitext(self.tocfilename)[0] + if self.name is None: + self.name = root + '.res' + if self.script_name is None: + self.script_name = root + '_script.tcl' + + # Internal variables + # Store path to _tkinter extension module, so that guts check can detect if the path changed for some reason. + self._tkinter_file = tcltk_info.tkinter_extension_file + + # Calculated / analysed values + self.uses_tkinter = self._uses_tkinter(self._tkinter_file, binaries) + logger.debug("Program uses tkinter: %r", self.uses_tkinter) + self.script = self.generate_script() + self.tcl_lib = tcltk_info.tcl_shared_library # full path to shared library + self.tk_lib = tcltk_info.tk_shared_library + + assert self.tcl_lib is not None + assert self.tk_lib is not None + + logger.debug("Using Tcl shared library: %r", self.tcl_lib) + logger.debug("Using Tk shared library: %r", self.tk_lib) + + self.splash_requirements = set([ + # NOTE: the implicit assumption here is that Tcl and Tk shared library are collected into top-level + # application directory, which, at tme moment, is true in practically all cases. + os.path.basename(self.tcl_lib), + os.path.basename(self.tk_lib), + *splash_requirements, + ]) + + logger.info("Collect Tcl/Tk data files for the splash screen") + tcltk_tree = tcltk_info.data_files # 3-element tuple TOC + if self.full_tk: + # The user wants a full copy of Tk, so make all Tk files a requirement. + self.splash_requirements.update(entry[0] for entry in tcltk_tree) + + # Scan for binary dependencies of the Tcl/Tk shared libraries, and add them to `binaries` TOC list (which + # should really be called `dependencies` as it is not limited to binaries. But it is too late now, and + # existing spec files depend on this naming). We specify these binary dependencies (which include the + # Tcl and Tk shared libaries themselves) even if the user's program uses tkinter and they would be collected + # anyway; let the collection mechanism deal with potential duplicates. + tcltk_libs = [(os.path.basename(src_name), src_name, 'BINARY') for src_name in (self.tcl_lib, self.tk_lib)] + self.binaries = bindepend.binary_dependency_analysis(tcltk_libs) + + # Put all shared library dependencies in `splash_requirements`, so they are made available in onefile mode. + self.splash_requirements.update(entry[0] for entry in self.binaries) + + # If the user's program does not use tkinter, add resources from Tcl/Tk tree to the dependencies list. + # Do so only for the resources that are part of splash requirements. + if not self.uses_tkinter: + self.binaries.extend(entry for entry in tcltk_tree if entry[0] in self.splash_requirements) + + # Check if all requirements were found. + collected_files = set(entry[0] for entry in (binaries + datas + self.binaries)) + + def _filter_requirement(filename): + if filename not in collected_files: + # Item is not bundled, so warn the user about it. This actually may happen on some tkinter installations + # that are missing the license.terms file. + logger.warning( + "The local Tcl/Tk installation is missing the file %s. The behavior of the splash screen is " + "therefore undefined and may be unsupported.", filename + ) + return False + return True + + # Remove all files which were not found. + self.splash_requirements = set(filter(_filter_requirement, self.splash_requirements)) + + logger.debug("Splash Requirements: %s", self.splash_requirements) + + self.__postinit__() + + _GUTS = ( + # input parameters + ('image_file', _check_guts_eq), + ('name', _check_guts_eq), + ('script_name', _check_guts_eq), + ('text_pos', _check_guts_eq), + ('text_size', _check_guts_eq), + ('text_font', _check_guts_eq), + ('text_color', _check_guts_eq), + ('text_default', _check_guts_eq), + ('always_on_top', _check_guts_eq), + ('full_tk', _check_guts_eq), + ('minify_script', _check_guts_eq), + ('max_img_size', _check_guts_eq), + # calculated/analysed values + ('uses_tkinter', _check_guts_eq), + ('script', _check_guts_eq), + ('tcl_lib', _check_guts_eq), + ('tk_lib', _check_guts_eq), + ('splash_requirements', _check_guts_eq), + ('binaries', _check_guts_toc), + # internal value + # Check if the tkinter installation changed. This is theoretically possible if someone uses two different python + # installations of the same version. + ('_tkinter_file', _check_guts_eq), + ) + + def _check_guts(self, data, last_build): + if Target._check_guts(self, data, last_build): + return True + + # Check if the image has been modified. + if misc.mtime(self.image_file) > last_build: + logger.info("Building %s because file %s changed", self.tocbasename, self.image_file) + return True + + return False + + def assemble(self): + logger.info("Building Splash %s", self.name) + + # Function to resize a given image to fit into the area defined by max_img_size. + def _resize_image(_image, _orig_size): + if PILImage: + _w, _h = _orig_size + _ratio_w = self.max_img_size[0] / _w + if _ratio_w < 1: + # Image width exceeds limit + _h = int(_h * _ratio_w) + _w = self.max_img_size[0] + + _ratio_h = self.max_img_size[1] / _h + if _ratio_h < 1: + # Image height exceeds limit + _w = int(_w * _ratio_h) + _h = self.max_img_size[1] + + # If a file is given it will be open + if isinstance(_image, PILImage.Image): + _img = _image + else: + _img = PILImage.open(_image) + _img_resized = _img.resize((_w, _h)) + + # Save image into a stream + _image_stream = io.BytesIO() + _img_resized.save(_image_stream, format='PNG') + _img.close() + _img_resized.close() + _image_data = _image_stream.getvalue() + logger.info("Resized image %s from dimensions %r to (%d, %d)", self.image_file, _orig_size, _w, _h) + return _image_data + else: + raise ValueError( + "The splash image dimensions (w: %d, h: %d) exceed max_img_size (w: %d, h:%d), but the image " + "cannot be resized due to missing PIL.Image! Either install the Pillow package, adjust the " + "max_img_size, or use an image of compatible dimensions." % + (_orig_size[0], _orig_size[1], self.max_img_size[0], self.max_img_size[1]) + ) + + # Open image file + image_file = open(self.image_file, 'rb') + + # Check header of the file to identify it + if image_file.read(8) == b'\x89PNG\r\n\x1a\n': + # self.image_file is a PNG file + image_file.seek(16) + img_size = (struct.unpack("!I", image_file.read(4))[0], struct.unpack("!I", image_file.read(4))[0]) + + if img_size > self.max_img_size: + # The image exceeds the maximum image size, so resize it + image = _resize_image(self.image_file, img_size) + else: + image = os.path.abspath(self.image_file) + elif PILImage: + # Pillow is installed, meaning the image can be converted automatically + img = PILImage.open(self.image_file, mode='r') + + if img.size > self.max_img_size: + image = _resize_image(img, img.size) + else: + image_data = io.BytesIO() + img.save(image_data, format='PNG') + img.close() + image = image_data.getvalue() + logger.info("Converted image %s to PNG format", self.image_file) + else: + raise ValueError( + "The image %s needs to be converted to a PNG file, but PIL.Image is not available! Either install the " + "Pillow package, or use a PNG image for you splash screen." % (self.image_file,) + ) + + image_file.close() + + SplashWriter( + self.name, + self.splash_requirements, + os.path.basename(self.tcl_lib), # tcl86t.dll + os.path.basename(self.tk_lib), # tk86t.dll + tcltk_info.TK_ROOTNAME, + image, + self.script + ) + + @staticmethod + def _check_tcl_tk_compatibility(): + tcl_version = tcltk_info.tcl_version # (major, minor) tuple + tk_version = tcltk_info.tk_version + + if is_darwin and tcltk_info.is_macos_system_framework: + # Outdated Tcl/Tk 8.5 system framework is not supported. + raise SystemExit("The splash screen feature does not support macOS system framework version of Tcl/Tk.") + + # Test if tcl/tk version is supported + if tcl_version < (8, 6) or tk_version < (8, 6): + logger.warning( + "The installed Tcl/Tk (%d.%d / %d.%d) version might not work with the splash screen feature of the " + "bootloader, which was tested against Tcl/Tk 8.6", *tcl_version, *tk_version + ) + + # This should be impossible, since tcl/tk is released together with the same version number, but just in case + if tcl_version != tk_version: + logger.warning( + "The installed version of Tcl (%d.%d) and Tk (%d.%d) do not match. PyInstaller is tested against " + "matching versions", *tcl_version, *tk_version + ) + + # Ensure that Tcl is built with multi-threading support. + if not tcltk_info.tcl_threaded: + # This is a feature breaking problem, so exit. + raise SystemExit( + "The installed Tcl version is not threaded. PyInstaller only supports the splash screen " + "using threaded Tcl." + ) + + def generate_script(self): + """ + Generate the script for the splash screen. + + If minify_script is True, all unnecessary parts will be removed. + """ + d = {} + if self.text_pos is not None: + logger.debug("Add text support to splash screen") + d.update({ + 'pad_x': self.text_pos[0], + 'pad_y': self.text_pos[1], + 'color': self.text_color, + 'font': self.text_font, + 'font_size': self.text_size, + 'default_text': self.text_default, + }) + script = splash_templates.build_script(text_options=d, always_on_top=self.always_on_top) + + if self.minify_script: + # Remove any documentation, empty lines and unnecessary spaces + script = '\n'.join( + line for line in map(lambda line: line.strip(), script.splitlines()) + if not line.startswith('#') # documentation + and line # empty lines + ) + # Remove unnecessary spaces + script = re.sub(' +', ' ', script) + + # Write script to disk, so that it is transparent to the user what script is executed. + with open(self.script_name, "w", encoding="utf-8") as script_file: + script_file.write(script) + return script + + @staticmethod + def _uses_tkinter(tkinter_file, binaries): + # Test for _tkinter extension instead of tkinter module, because user might use a different wrapping library for + # Tk. Use `pathlib.PurePath˙ in comparisons to account for case normalization and separator normalization. + tkinter_file = pathlib.PurePath(tkinter_file) + for dest_name, src_name, typecode in binaries: + if pathlib.PurePath(src_name) == tkinter_file: + return True + return False diff --git a/venv/Lib/site-packages/PyInstaller/building/splash_templates.py b/venv/Lib/site-packages/PyInstaller/building/splash_templates.py new file mode 100644 index 0000000..e93c696 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/building/splash_templates.py @@ -0,0 +1,229 @@ +# ----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +# ----------------------------------------------------------------------------- +""" +Templates for the splash screen tcl script. +""" +from PyInstaller.compat import is_cygwin, is_darwin, is_win + +ipc_script = r""" +proc _ipc_server {channel clientaddr clientport} { + # This function is called if a new client connects to + # the server. This creates a channel, which calls + # _ipc_caller if data was send through the connection + set client_name [format <%s:%d> $clientaddr $clientport] + + chan configure $channel \ + -buffering none \ + -encoding utf-8 \ + -eofchar \x04 \ + -translation cr + chan event $channel readable [list _ipc_caller $channel $client_name] +} + +proc _ipc_caller {channel client_name} { + # This function is called if a command was sent through + # the tcp connection. The current implementation supports + # two commands: update_text and exit, although exit + # is implemented to be called if the connection gets + # closed (from python) or the character 0x04 was received + chan gets $channel cmd + + if {[chan eof $channel]} { + # This is entered if either the connection was closed + # or the char 0x04 was send + chan close $channel + exit + + } elseif {![chan blocked $channel]} { + # RPC methods + + # update_text command + if {[string match "update_text*" $cmd]} { + global status_text + set first [expr {[string first "(" $cmd] + 1}] + set last [expr {[string last ")" $cmd] - 1}] + + set status_text [string range $cmd $first $last] + } + # Implement other procedures here + } +} + +# By setting the port to 0 the os will assign a free port +set server_socket [socket -server _ipc_server -myaddr localhost 0] +set server_port [fconfigure $server_socket -sockname] + +# This environment variable is shared between the python and the tcl +# interpreter and publishes the port the tcp server socket is available +set env(_PYI_SPLASH_IPC) [lindex $server_port 2] +""" + +image_script = r""" +# The variable $_image_data, which holds the data for the splash +# image is created by the bootloader. +image create photo splash_image +splash_image put $_image_data +# delete the variable, because the image now holds the data +unset _image_data + +proc canvas_text_update {canvas tag _var - -} { + # This function is rigged to be called if the a variable + # status_text gets changed. This updates the text on + # the canvas + upvar $_var var + $canvas itemconfigure $tag -text $var +} +""" + +splash_canvas_setup = r""" +package require Tk + +set image_width [image width splash_image] +set image_height [image height splash_image] +set display_width [winfo screenwidth .] +set display_height [winfo screenheight .] + +set x_position [expr {int(0.5*($display_width - $image_width))}] +set y_position [expr {int(0.5*($display_height - $image_height))}] + +# Toplevel frame in which all widgets should be positioned +frame .root + +# Configure the canvas on which the splash +# screen will be drawn +canvas .root.canvas \ + -width $image_width \ + -height $image_height \ + -borderwidth 0 \ + -highlightthickness 0 + +# Draw the image into the canvas, filling it. +.root.canvas create image \ + [expr {$image_width / 2}] \ + [expr {$image_height / 2}] \ + -image splash_image +""" + +splash_canvas_text = r""" +# Create a text on the canvas, which tracks the local +# variable status_text. status_text is changed via C to +# update the progress on the splash screen. +# We cannot use the default label, because it has a +# default background, which cannot be turned transparent +.root.canvas create text \ + %(pad_x)d \ + %(pad_y)d \ + -fill %(color)s \ + -justify center \ + -font myFont \ + -tag vartext \ + -anchor sw +trace variable status_text w \ + [list canvas_text_update .root.canvas vartext] +set status_text "%(default_text)s" +""" + +splash_canvas_default_font = r""" +font create myFont {*}[font actual TkDefaultFont] +font configure myFont -size %(font_size)d +""" + +splash_canvas_custom_font = r""" +font create myFont -family %(font)s -size %(font_size)d +""" + +if is_win or is_cygwin: + transparent_setup = r""" +# If the image is transparent, the background will be filled +# with magenta. The magenta background is later replaced with transparency. +# Here is the limitation of this implementation, that only +# sharp transparent image corners are possible +wm attributes . -transparentcolor magenta +.root.canvas configure -background magenta +""" + +elif is_darwin: + # This is untested, but should work following: https://stackoverflow.com/a/44296157/5869139 + transparent_setup = r""" +wm attributes . -transparent 1 +. configure -background systemTransparent +.root.canvas configure -background systemTransparent +""" + +else: + # For Linux there is no common way to create a transparent window + transparent_setup = r"" + +pack_widgets = r""" +# Position all widgets in the window +pack .root +grid .root.canvas -column 0 -row 0 -columnspan 1 -rowspan 2 +""" + +# Enable always-on-top behavior, by setting overrideredirect and the topmost attribute. +position_window_on_top = r""" +# Set position and mode of the window - always-on-top behavior +wm overrideredirect . 1 +wm geometry . +${x_position}+${y_position} +wm attributes . -topmost 1 +""" + +# Disable always-on-top behavior +if is_win or is_cygwin or is_darwin: + # On Windows, we disable the always-on-top behavior while still setting overrideredirect + # (to disable window decorations), but set topmost attribute to 0. + position_window = r""" +# Set position and mode of the window +wm overrideredirect . 1 +wm geometry . +${x_position}+${y_position} +wm attributes . -topmost 0 +""" +else: + # On Linux, we must not use overrideredirect; instead, we set X11-specific type attribute to splash, + # which lets the window manager to properly handle the splash screen (without window decorations + # but allowing other windows to be brought to front). + position_window = r""" +# Set position and mode of the window +wm geometry . +${x_position}+${y_position} +wm attributes . -type splash +""" + +raise_window = r""" +raise . +""" + + +def build_script(text_options=None, always_on_top=False): + """ + This function builds the tcl script for the splash screen. + """ + # Order is important! + script = [ + ipc_script, + image_script, + splash_canvas_setup, + ] + + if text_options: + # If the default font is used we need a different syntax + if text_options['font'] == "TkDefaultFont": + script.append(splash_canvas_default_font % text_options) + else: + script.append(splash_canvas_custom_font % text_options) + script.append(splash_canvas_text % text_options) + + script.append(transparent_setup) + + script.append(pack_widgets) + script.append(position_window_on_top if always_on_top else position_window) + script.append(raise_window) + + return '\n'.join(script) diff --git a/venv/Lib/site-packages/PyInstaller/building/templates.py b/venv/Lib/site-packages/PyInstaller/building/templates.py new file mode 100644 index 0000000..24e5080 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/building/templates.py @@ -0,0 +1,126 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Templates to generate .spec files. +""" + +onefiletmplt = """# -*- mode: python ; coding: utf-8 -*- +%(preamble)s + +a = Analysis( + %(scripts)s, + pathex=%(pathex)s, + binaries=%(binaries)s, + datas=%(datas)s, + hiddenimports=%(hiddenimports)s, + hookspath=%(hookspath)r, + hooksconfig={}, + runtime_hooks=%(runtime_hooks)r, + excludes=%(excludes)s, + noarchive=%(noarchive)s, + optimize=%(optimize)r, +) +pyz = PYZ(a.pure) +%(splash_init)s +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.datas,%(splash_target)s%(splash_binaries)s + %(options)s, + name='%(name)s', + debug=%(debug_bootloader)s, + bootloader_ignore_signals=%(bootloader_ignore_signals)s, + strip=%(strip)s, + upx=%(upx)s, + upx_exclude=%(upx_exclude)s, + runtime_tmpdir=%(runtime_tmpdir)r, + console=%(console)s, + disable_windowed_traceback=%(disable_windowed_traceback)s, + argv_emulation=%(argv_emulation)r, + target_arch=%(target_arch)r, + codesign_identity=%(codesign_identity)r, + entitlements_file=%(entitlements_file)r,%(exe_options)s +) +""" + +onedirtmplt = """# -*- mode: python ; coding: utf-8 -*- +%(preamble)s + +a = Analysis( + %(scripts)s, + pathex=%(pathex)s, + binaries=%(binaries)s, + datas=%(datas)s, + hiddenimports=%(hiddenimports)s, + hookspath=%(hookspath)r, + hooksconfig={}, + runtime_hooks=%(runtime_hooks)r, + excludes=%(excludes)s, + noarchive=%(noarchive)s, + optimize=%(optimize)r, +) +pyz = PYZ(a.pure) +%(splash_init)s +exe = EXE( + pyz, + a.scripts,%(splash_target)s + %(options)s, + exclude_binaries=True, + name='%(name)s', + debug=%(debug_bootloader)s, + bootloader_ignore_signals=%(bootloader_ignore_signals)s, + strip=%(strip)s, + upx=%(upx)s, + console=%(console)s, + disable_windowed_traceback=%(disable_windowed_traceback)s, + argv_emulation=%(argv_emulation)r, + target_arch=%(target_arch)r, + codesign_identity=%(codesign_identity)r, + entitlements_file=%(entitlements_file)r,%(exe_options)s +) +coll = COLLECT( + exe, + a.binaries, + a.datas,%(splash_binaries)s + strip=%(strip)s, + upx=%(upx)s, + upx_exclude=%(upx_exclude)s, + name='%(name)s', +) +""" + +bundleexetmplt = """app = BUNDLE( + exe, + name='%(name)s.app', + icon=%(icon)s, + bundle_identifier=%(bundle_identifier)s, +) +""" + +bundletmplt = """app = BUNDLE( + coll, + name='%(name)s.app', + icon=%(icon)s, + bundle_identifier=%(bundle_identifier)s, +) +""" + +splashtmpl = """splash = Splash( + %(splash_image)r, + binaries=a.binaries, + datas=a.datas, + text_pos=None, + text_size=12, + minify_script=True, + always_on_top=True, +) +""" diff --git a/venv/Lib/site-packages/PyInstaller/building/utils.py b/venv/Lib/site-packages/PyInstaller/building/utils.py new file mode 100644 index 0000000..f32c069 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/building/utils.py @@ -0,0 +1,805 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import fnmatch +import glob +import hashlib +import marshal +import os +import pathlib +import platform +import py_compile +import shutil +import struct +import subprocess +import sys +import zipfile + +from PyInstaller import compat +from PyInstaller import log as logging +from PyInstaller.compat import EXTENSION_SUFFIXES, is_darwin, is_win, is_linux +from PyInstaller.config import CONF +from PyInstaller.exceptions import InvalidSrcDestTupleError +from PyInstaller.utils import misc + +if is_win: + from PyInstaller.utils.win32 import versioninfo + +if is_darwin: + import PyInstaller.utils.osx as osxutils + +logger = logging.getLogger(__name__) + +# -- Helpers for checking guts. +# +# NOTE: by _GUTS it is meant intermediate files and data structures that PyInstaller creates for bundling files and +# creating final executable. + + +def _check_guts_eq(attr_name, old_value, new_value, last_build): + """ + Rebuild is required if values differ. + """ + if old_value != new_value: + logger.info("Building because %s changed", attr_name) + return True + return False + + +def _check_guts_toc_mtime(attr_name, old_toc, new_toc, last_build): + """ + Rebuild is required if mtimes of files listed in old TOC are newer than last_build. + + Use this for calculated/analysed values read from cache. + """ + for dest_name, src_name, typecode in old_toc: + if misc.mtime(src_name) > last_build: + logger.info("Building because %s changed", src_name) + return True + return False + + +def _check_guts_toc(attr_name, old_toc, new_toc, last_build): + """ + Rebuild is required if either TOC content changed or mtimes of files listed in old TOC are newer than last_build. + + Use this for input parameters. + """ + return _check_guts_eq(attr_name, old_toc, new_toc, last_build) or \ + _check_guts_toc_mtime(attr_name, old_toc, new_toc, last_build) + + +def add_suffix_to_extension(dest_name, src_name, typecode): + """ + Take a TOC entry (dest_name, src_name, typecode) and adjust the dest_name for EXTENSION to include the full library + suffix. + """ + # No-op for non-extension + if typecode != 'EXTENSION': + return dest_name, src_name, typecode + + # If dest_name completely fits into end of the src_name, it has already been processed. + if src_name.endswith(dest_name): + return dest_name, src_name, typecode + + # Change the dotted name into a relative path. This places C extensions in the Python-standard location. + dest_name = dest_name.replace('.', os.sep) + # In some rare cases extension might already contain a suffix. Skip it in this case. + if os.path.splitext(dest_name)[1] not in EXTENSION_SUFFIXES: + # Determine the base name of the file. + base_name = os.path.basename(dest_name) + assert '.' not in base_name + # Use this file's existing extension. For extensions such as ``libzmq.cp36-win_amd64.pyd``, we cannot use + # ``os.path.splitext``, which would give only the ```.pyd`` part of the extension. + dest_name = dest_name + os.path.basename(src_name)[len(base_name):] + + return dest_name, src_name, typecode + + +def process_collected_binary( + src_name, + dest_name, + use_strip=False, + use_upx=False, + upx_exclude=None, + target_arch=None, + codesign_identity=None, + entitlements_file=None, + strict_arch_validation=False +): + """ + Process the collected binary using strip or UPX (or both), and apply any platform-specific processing. On macOS, + this rewrites the library paths in the headers, and (re-)signs the binary. On-disk cache is used to avoid processing + the same binary with same options over and over. + + In addition to given arguments, this function also uses CONF['cachedir'] and CONF['upx_dir']. + """ + from PyInstaller.config import CONF + + # We need to use cache in the following scenarios: + # * extra binary processing due to use of `strip` or `upx` + # * building on macOS, where we need to rewrite library paths in binaries' headers and (re-)sign the binaries. + if not use_strip and not use_upx and not is_darwin: + return src_name + + # Match against provided UPX exclude patterns. + upx_exclude = upx_exclude or [] + if use_upx: + src_path = pathlib.PurePath(src_name) + for upx_exclude_entry in upx_exclude: + # pathlib.PurePath.match() matches from right to left, and supports * wildcard, but does not support the + # "**" syntax for directory recursion. Case sensitivity follows the OS default. + if src_path.match(upx_exclude_entry): + logger.info("Disabling UPX for %s due to match in exclude pattern: %s", src_name, upx_exclude_entry) + use_upx = False + break + + # Additional automatic disablement rules for UPX and strip. + + # On Windows, avoid using UPX with binaries that have control flow guard (CFG) enabled. + if use_upx and is_win and versioninfo.pefile_check_control_flow_guard(src_name): + logger.info('Disabling UPX for %s due to CFG!', src_name) + use_upx = False + + # Avoid using UPX with Qt plugins, as it strips the data required by the Qt plugin loader. + if use_upx and misc.is_file_qt_plugin(src_name): + logger.info('Disabling UPX for %s due to it being a Qt plugin!', src_name) + use_upx = False + + # On linux, if a binary has an accompanying HMAC or CHK file, avoid modifying it in any way. + if (use_upx or use_strip) and is_linux: + src_path = pathlib.Path(src_name) + hmac_path = src_path.with_name(f".{src_path.name}.hmac") + chk_path = src_path.with_suffix(".chk") + if hmac_path.is_file(): + logger.info('Disabling UPX and/or strip for %s due to accompanying .hmac file!', src_name) + use_upx = use_strip = False + elif chk_path.is_file(): + logger.info('Disabling UPX and/or strip for %s due to accompanying .chk file!', src_name) + use_upx = use_strip = False + del src_path, hmac_path, chk_path + + # Exit early if no processing is required after above rules are applied. + if not use_strip and not use_upx and not is_darwin: + return src_name + + # Prepare cache directory path. Cache is tied to python major/minor version, but also to various processing options. + pyver = f'py{sys.version_info[0]}{sys.version_info[1]}' + arch = platform.architecture()[0] + cache_dir = os.path.join( + CONF['cachedir'], + f'bincache{use_strip:d}{use_upx:d}{pyver}{arch}', + ) + if target_arch: + cache_dir = os.path.join(cache_dir, target_arch) + if is_darwin: + # Separate by codesign identity + if codesign_identity: + # Compute hex digest of codesign identity string to prevent issues with invalid characters. + csi_hash = hashlib.sha256(codesign_identity.encode('utf-8')) + cache_dir = os.path.join(cache_dir, csi_hash.hexdigest()) + else: + cache_dir = os.path.join(cache_dir, 'adhoc') # ad-hoc signing + # Separate by entitlements + if entitlements_file: + # Compute hex digest of entitlements file contents + with open(entitlements_file, 'rb') as fp: + ef_hash = hashlib.sha256(fp.read()) + cache_dir = os.path.join(cache_dir, ef_hash.hexdigest()) + else: + cache_dir = os.path.join(cache_dir, 'no-entitlements') + os.makedirs(cache_dir, exist_ok=True) + + # Load cache index, if available + cache_index_file = os.path.join(cache_dir, "index.dat") + try: + cache_index = misc.load_py_data_struct(cache_index_file) + except FileNotFoundError: + cache_index = {} + except Exception: + # Tell the user they may want to fix their cache... However, do not delete it for them; if it keeps getting + # corrupted, we will never find out. + logger.warning("PyInstaller bincache may be corrupted; use pyinstaller --clean to fix it.") + raise + + # Look up the file in cache; use case-normalized destination name as identifier. + cached_id = os.path.normcase(dest_name) + cached_name = os.path.join(cache_dir, dest_name) + src_digest = _compute_file_digest(src_name) + + if cached_id in cache_index: + # If digest matches to the cached digest, return the cached file... + if src_digest == cache_index[cached_id]: + return cached_name + + # ... otherwise remove it. + os.remove(cached_name) + + # Ensure parent path exists + os.makedirs(os.path.dirname(cached_name), exist_ok=True) + + # Use `shutil.copyfile` to copy the file with default permissions bits, then manually set executable + # bits. This way, we avoid copying permission bits and metadata from the original file, which might be too + # restrictive for further processing (read-only permissions, immutable flag on FreeBSD, and so on). + shutil.copyfile(src_name, cached_name) + os.chmod(cached_name, 0o755) + + # Apply strip + if use_strip: + strip_options = [] + if is_darwin: + # The default strip behavior breaks some shared libraries under macOS. + strip_options = ["-S"] # -S = strip only debug symbols. + + cmd = ["strip", *strip_options, cached_name] + logger.info("Executing: %s", " ".join(cmd)) + try: + p = subprocess.run( + cmd, + stdin=subprocess.DEVNULL, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + check=True, + errors='ignore', + encoding='utf-8', + ) + logger.debug("Output from strip command:\n%s", p.stdout) + except subprocess.CalledProcessError as e: + logger.warning("Failed to run strip on %r!", cached_name, exc_info=True) + logger.warning("Output from strip command:\n%s", e.stdout) + except Exception: + logger.warning("Failed to run strip on %r!", cached_name, exc_info=True) + + # Apply UPX + if use_upx: + upx_exe = 'upx' + upx_dir = CONF['upx_dir'] + if upx_dir: + upx_exe = os.path.join(upx_dir, upx_exe) + + upx_options = [ + # Do not compress icons, so that they can still be accessed externally. + '--compress-icons=0', + # Use LZMA compression. + '--lzma', + # Quiet mode. + '-q', + ] + if is_win: + # Binaries built with Visual Studio 7.1 require --strip-loadconf or they will not compress. + upx_options.append('--strip-loadconf') + + cmd = [upx_exe, *upx_options, cached_name] + logger.info("Executing: %s", " ".join(cmd)) + try: + p = subprocess.run( + cmd, + stdin=subprocess.DEVNULL, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + check=True, + errors='ignore', + encoding='utf-8', + ) + logger.debug("Output from upx command:\n%s", p.stdout) + except subprocess.CalledProcessError as e: + logger.warning("Failed to upx strip on %r!", cached_name, exc_info=True) + logger.warning("Output from upx command:\n%s", e.stdout) + except Exception: + logger.warning("Failed to run upx on %r!", cached_name, exc_info=True) + + # On macOS, we need to modify the given binary's paths to the dependent libraries, in order to ensure they are + # relocatable and always refer to location within the frozen application. Specifically, we make all dependent + # library paths relative to @rpath, and set @rpath to point to the top-level application directory, relative to + # the binary's location (i.e., @loader_path). + # + # While modifying the headers invalidates existing signatures, we avoid removing them in order to speed things up + # (and to avoid potential bugs in the codesign utility, like the one reported on Mac OS 10.13 in #6167). + # The forced re-signing at the end should take care of the invalidated signatures. + if is_darwin: + try: + osxutils.binary_to_target_arch(cached_name, target_arch, display_name=src_name) + #osxutils.remove_signature_from_binary(cached_name) # Disabled as per comment above. + target_rpath = str( + pathlib.PurePath('@loader_path', *['..' for level in pathlib.PurePath(dest_name).parent.parts]) + ) + osxutils.set_dylib_dependency_paths(cached_name, target_rpath) + osxutils.sign_binary(cached_name, codesign_identity, entitlements_file) + except osxutils.InvalidBinaryError: + # Raised by osxutils.binary_to_target_arch when the given file is not a valid macOS binary (for example, + # a linux .so file; see issue #6327). The error prevents any further processing, so just ignore it. + pass + except osxutils.IncompatibleBinaryArchError: + # Raised by osxutils.binary_to_target_arch when the given file does not contain (all) required arch slices. + # Depending on the strict validation mode, re-raise or swallow the error. + # + # Strict validation should be enabled only for binaries where the architecture *must* match the target one, + # i.e., the extension modules. Everything else is pretty much a gray area, for example: + # * a universal2 extension may have its x86_64 and arm64 slices linked against distinct single-arch/thin + # shared libraries + # * a collected executable that is launched by python code via a subprocess can be x86_64-only, even though + # the actual python code is running on M1 in native arm64 mode. + if strict_arch_validation: + raise + logger.debug("File %s failed optional architecture validation - collecting as-is!", src_name) + except Exception as e: + raise SystemError(f"Failed to process binary {cached_name!r}!") from e + + # Update cache index + cache_index[cached_id] = src_digest + misc.save_py_data_struct(cache_index_file, cache_index) + + return cached_name + + +def _compute_file_digest(filename): + hasher = hashlib.sha1() + with open(filename, "rb") as fp: + for chunk in iter(lambda: fp.read(16 * 1024), b""): + hasher.update(chunk) + return bytearray(hasher.digest()) + + +def _check_path_overlap(path): + """ + Check that path does not overlap with WORKPATH or SPECPATH (i.e., WORKPATH and SPECPATH may not start with path, + which could be caused by a faulty hand-edited specfile). + + Raise SystemExit if there is overlap, return True otherwise + """ + from PyInstaller.config import CONF + specerr = 0 + if CONF['workpath'].startswith(path): + logger.error('Specfile error: The output path "%s" contains WORKPATH (%s)', path, CONF['workpath']) + specerr += 1 + if CONF['specpath'].startswith(path): + logger.error('Specfile error: The output path "%s" contains SPECPATH (%s)', path, CONF['specpath']) + specerr += 1 + if specerr: + raise SystemExit( + 'Error: Please edit/recreate the specfile (%s) and set a different output name (e.g. "dist").' % + CONF['spec'] + ) + return True + + +def _make_clean_directory(path): + """ + Create a clean directory from the given directory name. + """ + if _check_path_overlap(path): + if os.path.isdir(path) or os.path.isfile(path): + try: + os.remove(path) + except OSError: + _rmtree(path) + + os.makedirs(path, exist_ok=True) + + +def _rmtree(path): + """ + Remove directory and all its contents, but only after user confirmation, or if the -y option is set. + """ + from PyInstaller.config import CONF + if CONF['noconfirm']: + choice = 'y' + elif sys.stdout.isatty(): + choice = input( + 'WARNING: The output directory "%s" and ALL ITS CONTENTS will be REMOVED! Continue? (y/N)' % path + ) + else: + raise SystemExit( + 'Error: The output directory "%s" is not empty. Please remove all its contents or use the -y option (remove' + ' output directory without confirmation).' % path + ) + if choice.strip().lower() == 'y': + if not CONF['noconfirm']: + print("On your own risk, you can use the option `--noconfirm` to get rid of this question.") + logger.info('Removing dir %s', path) + shutil.rmtree(path) + else: + raise SystemExit('User aborted') + + +# TODO Refactor to prohibit empty target directories. As the docstring below documents, this function currently permits +# the second item of each 2-tuple in "hook.datas" to be the empty string, in which case the target directory defaults to +# the source directory's basename. However, this functionality is very fragile and hence bad. Instead: +# +# * An exception should be raised if such item is empty. +# * All hooks currently passing the empty string for such item (e.g., +# "hooks/hook-babel.py", "hooks/hook-matplotlib.py") should be refactored +# to instead pass such basename. +def format_binaries_and_datas(binaries_or_datas, workingdir=None): + """ + Convert the passed list of hook-style 2-tuples into a returned set of `TOC`-style 2-tuples. + + Elements of the passed list are 2-tuples `(source_dir_or_glob, target_dir)`. + Elements of the returned set are 2-tuples `(target_file, source_file)`. + For backwards compatibility, the order of elements in the former tuples are the reverse of the order of elements in + the latter tuples! + + Parameters + ---------- + binaries_or_datas : list + List of hook-style 2-tuples (e.g., the top-level `binaries` and `datas` attributes defined by hooks) whose: + * The first element is either: + * A glob matching only the absolute or relative paths of source non-Python data files. + * The absolute or relative path of a source directory containing only source non-Python data files. + * The second element is the relative path of the target directory into which these source files will be + recursively copied. + + If the optional `workingdir` parameter is passed, source paths may be either absolute or relative; else, source + paths _must_ be absolute. + workingdir : str + Optional absolute path of the directory to which all relative source paths in the `binaries_or_datas` + parameter will be prepended by (and hence converted into absolute paths) _or_ `None` if these paths are to be + preserved as relative. Defaults to `None`. + + Returns + ---------- + set + Set of `TOC`-style 2-tuples whose: + * First element is the absolute or relative path of a target file. + * Second element is the absolute or relative path of the corresponding source file to be copied to this target + file. + """ + toc_datas = set() + + for src_root_path_or_glob, trg_root_dir in binaries_or_datas: + # Disallow empty source path. Those are typically result of errors, and result in implicit collection of the + # whole current working directory, which is never a good idea. + if not src_root_path_or_glob: + raise InvalidSrcDestTupleError( + (src_root_path_or_glob, trg_root_dir), + "Empty SRC is not allowed when adding binary and data files, as it would result in collection of the " + "whole current working directory." + ) + if not trg_root_dir: + raise InvalidSrcDestTupleError( + (src_root_path_or_glob, trg_root_dir), + "Empty DEST_DIR is not allowed - to collect files into application's top-level directory, use " + f"{os.curdir!r}." + ) + # Disallow absolute target paths, as well as target paths that would end up pointing outside of the + # application's top-level directory. + if os.path.isabs(trg_root_dir): + raise InvalidSrcDestTupleError((src_root_path_or_glob, trg_root_dir), "DEST_DIR must be a relative path!") + if os.path.normpath(trg_root_dir).startswith('..'): + raise InvalidSrcDestTupleError( + (src_root_path_or_glob, trg_root_dir), + "DEST_DIR must not point outside of application's top-level directory!", + ) + + # Convert relative to absolute paths if required. + if workingdir and not os.path.isabs(src_root_path_or_glob): + src_root_path_or_glob = os.path.join(workingdir, src_root_path_or_glob) + + # Normalize paths. + src_root_path_or_glob = os.path.normpath(src_root_path_or_glob) + if os.path.isfile(src_root_path_or_glob): + src_root_paths = [src_root_path_or_glob] + else: + # List of the absolute paths of all source paths matching the current glob. + src_root_paths = glob.glob(src_root_path_or_glob) + + if not src_root_paths: + raise SystemExit(f'Unable to find {src_root_path_or_glob!r} when adding binary and data files.') + + for src_root_path in src_root_paths: + if os.path.isfile(src_root_path): + # Normalizing the result to remove redundant relative paths (e.g., removing "./" from "trg/./file"). + toc_datas.add(( + os.path.normpath(os.path.join(trg_root_dir, os.path.basename(src_root_path))), + os.path.normpath(src_root_path), + )) + elif os.path.isdir(src_root_path): + for src_dir, src_subdir_basenames, src_file_basenames in os.walk(src_root_path): + # Ensure the current source directory is a subdirectory of the passed top-level source directory. + # Since os.walk() does *NOT* follow symlinks by default, this should be the case. (But let's make + # sure.) + assert src_dir.startswith(src_root_path) + + # Relative path of the current target directory, obtained by: + # + # * Stripping the top-level source directory from the current source directory (e.g., removing + # "/top" from "/top/dir"). + # * Normalizing the result to remove redundant relative paths (e.g., removing "./" from + # "trg/./file"). + trg_dir = os.path.normpath(os.path.join(trg_root_dir, os.path.relpath(src_dir, src_root_path))) + + for src_file_basename in src_file_basenames: + src_file = os.path.join(src_dir, src_file_basename) + if os.path.isfile(src_file): + # Normalize the result to remove redundant relative paths (e.g., removing "./" from + # "trg/./file"). + toc_datas.add(( + os.path.normpath(os.path.join(trg_dir, src_file_basename)), os.path.normpath(src_file) + )) + + return toc_datas + + +def get_code_object(modname, filename, optimize): + """ + Get the code-object for a module. + + This is a simplifed non-performant version which circumvents __pycache__. + """ + + if filename in ('-', None): + # This is a NamespacePackage, modulegraph marks them by using the filename '-'. (But wants to use None, so + # check for None, too, to be forward-compatible.) + logger.debug('Compiling namespace package %s', modname) + txt = '#\n' + code_object = compile(txt, filename, 'exec', optimize=optimize) + else: + _, ext = os.path.splitext(filename) + ext = ext.lower() + + if ext == '.pyc': + # The module is available in binary-only form. Read the contents of .pyc file using helper function, which + # supports reading from either stand-alone or archive-embedded .pyc files. + logger.debug('Reading code object from .pyc file %s', filename) + pyc_data = _read_pyc_data(filename) + code_object = marshal.loads(pyc_data[16:]) + else: + # Assume this is a source .py file, but allow an arbitrary extension (other than .pyc, which is taken in + # the above branch). This allows entry-point scripts to have an arbitrary (or no) extension, as tested by + # the `test_arbitrary_ext` in `test_basic.py`. + logger.debug('Compiling python script/module file %s', filename) + + with open(filename, 'rb') as f: + source = f.read() + + # If entry-point script has no suffix, append .py when compiling the source. In POSIX builds, the executable + # has no suffix either; this causes issues with `traceback` module, as it tries to read the executable file + # when trying to look up the code for the entry-point script (when current working directory contains the + # executable). + _, ext = os.path.splitext(filename) + if not ext: + logger.debug("Appending .py to compiled entry-point name...") + filename += '.py' + + try: + code_object = compile(source, filename, 'exec', optimize=optimize) + except SyntaxError: + logger.warning("Sytnax error while compiling %s", filename) + raise + + return code_object + + +def strip_paths_in_code(co, new_filename=None): + # Paths to remove from filenames embedded in code objects + replace_paths = sys.path + CONF['pathex'] + # Make sure paths end with os.sep and the longest paths are first + replace_paths = sorted((os.path.join(f, '') for f in replace_paths), key=len, reverse=True) + + if new_filename is None: + original_filename = os.path.normpath(co.co_filename) + for f in replace_paths: + if original_filename.startswith(f): + new_filename = original_filename[len(f):] + break + + else: + return co + + code_func = type(co) + + consts = tuple( + strip_paths_in_code(const_co, new_filename) if isinstance(const_co, code_func) else const_co + for const_co in co.co_consts + ) + + return co.replace(co_consts=consts, co_filename=new_filename) + + +def _should_include_system_binary(binary_tuple, exceptions): + """ + Return True if the given binary_tuple describes a system binary that should be included. + + Exclude all system library binaries other than those with "lib-dynload" in the destination or "python" in the + source, except for those matching the patterns in the exceptions list. Intended to be used from the Analysis + exclude_system_libraries method. + """ + dest = binary_tuple[0] + if dest.startswith('lib-dynload'): + return True + src = binary_tuple[1] + if fnmatch.fnmatch(src, '*python*'): + return True + if not src.startswith('/lib') and not src.startswith('/usr/lib'): + return True + for exception in exceptions: + if fnmatch.fnmatch(dest, exception): + return True + return False + + +def compile_pymodule(name, src_path, workpath, optimize, code_cache=None): + """ + Given the name and source file for a pure-python module, compile the module in the specified working directory, + and return the name of resulting .pyc file. The paths in the resulting .pyc module are anonymized by having their + absolute prefix removed. + + If a .pyc file with matching name already exists in the target working directory, it is re-used (provided it has + compatible bytecode magic in the header, and that its modification time is newer than that of the source file). + + If the specified module is available in binary-only form, the input .pyc file is copied to the target working + directory and post-processed. If the specified module is available in source form, it is compiled only if + corresponding code object is not available in the optional code-object cache; otherwise, it is copied from cache + and post-processed. When compiling the module, the specified byte-code optimization level is used. + + It is up to caller to ensure that the optional code-object cache contains only code-objects of target optimization + level, and that if the specified working directory already contains .pyc files, that they were created with target + optimization level. + """ + + # Construct the target .pyc filename in the workpath + split_name = name.split(".") + if "__init__" in src_path: + # __init__ module; use "__init__" as module name, and construct parent path using all components of the + # fully-qualified name + parent_dirs = split_name + mod_basename = "__init__" + else: + # Regular module; use last component of the fully-qualified name as module name, and the rest as the parent + # path. + parent_dirs = split_name[:-1] + mod_basename = split_name[-1] + pyc_path = os.path.join(workpath, *parent_dirs, mod_basename + '.pyc') + + # If .pyc file already exists in our workpath, check if we can re-use it. For that: + # - its modification timestamp must be newer than that of the source file + # - it must be compiled for compatible python version + if os.path.exists(pyc_path): + can_reuse = False + if misc.mtime(pyc_path) > misc.mtime(src_path): + with open(pyc_path, 'rb') as fh: + can_reuse = fh.read(4) == compat.BYTECODE_MAGIC + + if can_reuse: + return pyc_path + + # Ensure the existence of parent directories for the target pyc path + os.makedirs(os.path.dirname(pyc_path), exist_ok=True) + + # Check if optional cache contains module entry + code_object = code_cache.get(name, None) if code_cache else None + + if code_object is None: + _, ext = os.path.splitext(src_path) + ext = ext.lower() + + if ext == '.py': + # Source py file; compile... + py_compile.compile(src_path, pyc_path, optimize=optimize) + # ... and read the contents + with open(pyc_path, 'rb') as fp: + pyc_data = fp.read() + elif ext == '.pyc': + # The module is available in binary-only form. Read the contents of .pyc file using helper function, which + # supports reading from either stand-alone or archive-embedded .pyc files. + pyc_data = _read_pyc_data(src_path) + else: + raise ValueError(f"Invalid python module file {src_path}; unhandled extension {ext}!") + + # Unmarshal code object; this is necessary if we want to strip paths from it + code_object = marshal.loads(pyc_data[16:]) + + # Strip code paths from the code object + code_object = strip_paths_in_code(code_object) + + # Write module file + with open(pyc_path, 'wb') as fh: + fh.write(compat.BYTECODE_MAGIC) + fh.write(struct.pack('= 3.10 stdlib, or equivalent importlib-metadata >= 4.6. +if _setup_py_mode: + importlib_metadata = None +else: + if sys.version_info >= (3, 10): + import importlib.metadata as importlib_metadata + else: + try: + import importlib_metadata + except ImportError as e: + from PyInstaller.exceptions import ImportlibMetadataError + raise ImportlibMetadataError() from e + + import packaging.version # For importlib_metadata version check + + # Validate the version + if packaging.version.parse(importlib_metadata.version("importlib-metadata")) < packaging.version.parse("4.6"): + from PyInstaller.exceptions import ImportlibMetadataError + raise ImportlibMetadataError() + +# Strict collect mode, which raises error when trying to collect duplicate files into PKG/CArchive or COLLECT. +strict_collect_mode = os.environ.get("PYINSTALLER_STRICT_COLLECT_MODE", "0") != "0" + +# Copied from https://docs.python.org/3/library/platform.html#cross-platform. +is_64bits: bool = sys.maxsize > 2**32 + +# Distinguish specific code for various Python versions. Variables 'is_pyXY' mean that Python X.Y and up is supported. +# Keep even unsupported versions here to keep 3rd-party hooks working. +is_py35 = sys.version_info >= (3, 5) +is_py36 = sys.version_info >= (3, 6) +is_py37 = sys.version_info >= (3, 7) +is_py38 = sys.version_info >= (3, 8) +is_py39 = sys.version_info >= (3, 9) +is_py310 = sys.version_info >= (3, 10) +is_py311 = sys.version_info >= (3, 11) +is_py312 = sys.version_info >= (3, 12) +is_py313 = sys.version_info >= (3, 13) + +is_win = sys.platform.startswith('win') +is_win_10 = is_win and (platform.win32_ver()[0] == '10') +is_win_11 = is_win and (platform.win32_ver()[0] == '11') +is_win_wine = False # Running under Wine; determined later on. +is_cygwin = sys.platform == 'cygwin' +is_darwin = sys.platform == 'darwin' # Mac OS X + +# Unix platforms +is_linux = sys.platform.startswith('linux') +is_solar = sys.platform.startswith('sun') # Solaris +is_aix = sys.platform.startswith('aix') +is_freebsd = sys.platform.startswith('freebsd') +is_openbsd = sys.platform.startswith('openbsd') +is_hpux = sys.platform.startswith('hp-ux') + +# Some code parts are similar to several unix platforms (e.g. Linux, Solaris, AIX). +# Mac OS is not considered as unix since there are many platform-specific details for Mac in PyInstaller. +is_unix = is_linux or is_solar or is_aix or is_freebsd or is_hpux or is_openbsd + +# Linux distributions such as Alpine or OpenWRT use musl as their libc implementation and resultantly need specially +# compiled bootloaders. On musl systems, ldd with no arguments prints 'musl' and its version. +is_musl = is_linux and "musl" in subprocess.run(["ldd"], capture_output=True, encoding="utf-8").stderr + +# macOS version +_macos_ver = tuple(int(x) for x in platform.mac_ver()[0].split('.')) if is_darwin else None + +# macOS 11 (Big Sur): if python is not compiled with Big Sur support, it ends up in compatibility mode by default, which +# is indicated by platform.mac_ver() returning '10.16'. The lack of proper Big Sur support breaks find_library() +# function from ctypes.util module, as starting with Big Sur, shared libraries are not visible on disk anymore. Support +# for the new library search mechanism was added in python 3.9 when compiled with Big Sur support. In such cases, +# platform.mac_ver() reports version as '11.x'. The behavior can be further modified via SYSTEM_VERSION_COMPAT +# environment variable; which allows explicitly enabling or disabling the compatibility mode. However, note that +# disabling the compatibility mode and using python that does not properly support Big Sur still leaves find_library() +# broken (which is a scenario that we ignore at the moment). +# The same logic applies to macOS 12 (Monterey). +is_macos_11_compat = bool(_macos_ver) and _macos_ver[0:2] == (10, 16) # Big Sur or newer in compat mode +is_macos_11_native = bool(_macos_ver) and _macos_ver[0:2] >= (11, 0) # Big Sur or newer in native mode +is_macos_11 = is_macos_11_compat or is_macos_11_native # Big Sur or newer + +# Check if python >= 3.13 was built with Py_GIL_DISABLED / free-threading (PEP703). +# +# This affects the shared library name, which has the "t" ABI suffix, as per: +# https://github.com/python/steering-council/issues/221#issuecomment-1841593283 +# +# It also affects the layout of PyConfig structure used by bootloader; consequently +# a) we need to inform bootloader what kind of build it is dealing with +# b) we must not mix up shared libraries, in case multiple builds are present on the system. Thus, strictly enforce the +# "t" ABI suffix in the PYDYLIB_NAMES, if applicable. +is_nogil = bool(sysconfig.get_config_var('Py_GIL_DISABLED')) + +_py_suffix = "t" if is_nogil else "" + +# On different platforms is different file for dynamic python library. +_py_major, _py_minor = sys.version_info[:2] +if is_win or is_cygwin: + PYDYLIB_NAMES = { + f'python{_py_major}{_py_minor}{_py_suffix}.dll', + f'libpython{_py_major}{_py_minor}{_py_suffix}.dll', + f'libpython{_py_major}.{_py_minor}{_py_suffix}.dll', + } # For MSYS2 environment +elif is_darwin: + # The suffix in .framework library name is capitalized, e.g., PythonT for freethreading-enabled build. + # The `libpython%d.%d%s.dylib` is there primarily for Anaconda installations, but it also serves as a fallback in + # .framework builds, where `/Library/Frameworks/Python.framework/Versions/3.X/lib/libpython3.13.dylib` is a symbolic + # link that points to `../Python`. + PYDYLIB_NAMES = { + f'Python{_py_suffix.upper()}', + f'.Python{_py_suffix.upper()}', + f'Python{_py_major}{_py_suffix.upper()}', + f'libpython{_py_major}.{_py_minor}{_py_suffix}.dylib', + } +elif is_aix: + # Shared libs on AIX may be archives with shared object members, hence the ".a" suffix. However, starting with + # python 2.7.11 libpython?.?.so and Python3 libpython?.?m.so files are produced. + PYDYLIB_NAMES = { + f'libpython{_py_major}.{_py_minor}{_py_suffix}.a', + f'libpython{_py_major}.{_py_minor}{_py_suffix}.so', + } +elif is_freebsd: + PYDYLIB_NAMES = { + f'libpython{_py_major}.{_py_minor}{_py_suffix}.so.1', + f'libpython{_py_major}.{_py_minor}{_py_suffix}.so.1.0', + } +elif is_openbsd: + PYDYLIB_NAMES = { + f'libpython{_py_major}.{_py_minor}{_py_suffix}.so.0.0', + } +elif is_hpux: + PYDYLIB_NAMES = { + f'libpython{_py_major}.{_py_minor}{_py_suffix}.so', + } +elif is_unix: + # Other *nix platforms. + # Python 2 .so library on Linux is: libpython2.7.so.1.0 + # Python 3 .so library on Linux is: libpython3.3.so.1.0 + PYDYLIB_NAMES = { + f'libpython{_py_major}.{_py_minor}{_py_suffix}.so.1.0', + f'libpython{_py_major}.{_py_minor}{_py_suffix}.so', + } +else: + raise SystemExit('Your platform is not yet supported. Please define constant PYDYLIB_NAMES for your platform.') + +del _py_major, _py_minor, _py_suffix + +# In a virtual environment created by virtualenv (github.com/pypa/virtualenv) there exists sys.real_prefix with the path +# to the base Python installation from which the virtual environment was created. This is true regardless of the version +# of Python used to execute the virtualenv command. +# +# In a virtual environment created by the venv module available in the Python standard lib, there exists sys.base_prefix +# with the path to the base implementation. This does not exist in a virtual environment created by virtualenv. +# +# The following code creates compat.is_venv and is.virtualenv that are True when running a virtual environment, and also +# compat.base_prefix with the path to the base Python installation. + +base_prefix: str = os.path.abspath(getattr(sys, 'real_prefix', getattr(sys, 'base_prefix', sys.prefix))) +# Ensure `base_prefix` is not containing any relative parts. +is_venv = is_virtualenv = base_prefix != os.path.abspath(sys.prefix) + +# Conda environments sometimes have different paths or apply patches to packages that can affect how a hook or package +# should access resources. Method for determining conda taken from https://stackoverflow.com/questions/47610844#47610844 +is_conda = os.path.isdir(os.path.join(base_prefix, 'conda-meta')) + +# Similar to ``is_conda`` but is ``False`` using another ``venv``-like manager on top. In this case, no packages +# encountered will be conda packages meaning that the default non-conda behaviour is generally desired from PyInstaller. +is_pure_conda = os.path.isdir(os.path.join(sys.prefix, 'conda-meta')) + +# Full path to python interpreter. +python_executable = getattr(sys, '_base_executable', sys.executable) + +# Is this Python from Microsoft App Store (Windows only)? Python from Microsoft App Store has executable pointing at +# empty shims. +is_ms_app_store = is_win and os.path.getsize(python_executable) == 0 + +if is_ms_app_store: + # Locate the actual executable inside base_prefix. + python_executable = os.path.join(base_prefix, os.path.basename(python_executable)) + if not os.path.exists(python_executable): + raise SystemExit( + 'PyInstaller cannot locate real python executable belonging to Python from Microsoft App Store!' + ) + +# Bytecode magic value +BYTECODE_MAGIC = importlib.util.MAGIC_NUMBER + +# List of suffixes for Python C extension modules. +EXTENSION_SUFFIXES = importlib.machinery.EXTENSION_SUFFIXES +ALL_SUFFIXES = importlib.machinery.all_suffixes() + +# On Windows we require pywin32-ctypes. +# -> all pyinstaller modules should use win32api from PyInstaller.compat to +# ensure that it can work on MSYS2 (which requires pywin32-ctypes) +if is_win: + if _setup_py_mode: + pywintypes = None + win32api = None + else: + try: + # Hide the `cffi` package from win32-ctypes by temporarily blocking its import. This ensures that `ctypes` + # backend is always used, even if `cffi` is available. The `cffi` backend uses `pycparser`, which is + # incompatible with -OO mode (2nd optimization level) due to its removal of docstrings. + # See https://github.com/pyinstaller/pyinstaller/issues/6345 + # On the off chance that `cffi` has already been imported, store the `sys.modules` entry so we can restore + # it after importing `pywin32-ctypes` modules. + orig_cffi = sys.modules.get('cffi') + sys.modules['cffi'] = None + + from win32ctypes.pywin32 import pywintypes # noqa: F401, E402 + from win32ctypes.pywin32 import win32api # noqa: F401, E402 + except ImportError as e: + raise SystemExit( + 'Could not import `pywintypes` or `win32api` from `win32ctypes.pywin32`.\n' + 'Please make sure that `pywin32-ctypes` is installed and importable, for example:\n\n' + 'pip install pywin32-ctypes\n' + ) from e + finally: + # Unblock `cffi`. + if orig_cffi is not None: + sys.modules['cffi'] = orig_cffi + else: + del sys.modules['cffi'] + del orig_cffi + +# macOS's platform.architecture() can be buggy, so we do this manually here. Based off the python documentation: +# https://docs.python.org/3/library/platform.html#platform.architecture +if is_darwin: + architecture = '64bit' if sys.maxsize > 2**32 else '32bit' +else: + architecture = platform.architecture()[0] + +# Cygwin needs special handling, because platform.system() contains identifiers such as MSYS_NT-10.0-19042 and +# CYGWIN_NT-10.0-19042 that do not fit PyInstaller's OS naming scheme. Explicitly set `system` to 'Cygwin'. +system = 'Cygwin' if is_cygwin else platform.system() + +# Machine suffix for bootloader. +if is_win: + # On Windows ARM64 using an x64 Python environment, platform.machine() returns ARM64 but + # we really want the bootloader that matches the Python environment instead of the OS. + machine = _pyi_machine(os.environ.get("PROCESSOR_ARCHITECTURE", platform.machine()), platform.system()) +else: + machine = _pyi_machine(platform.machine(), platform.system()) + + +# Wine detection and support +def is_wine_dll(filename: str | os.PathLike): + """ + Check if the given PE file is a Wine DLL (PE-converted built-in, or fake/placeholder one). + + Returns True if the given file is a Wine DLL, False if not (or if file cannot be analyzed or does not exist). + """ + _WINE_SIGNATURES = ( + b'Wine builtin DLL', # PE-converted Wine DLL + b'Wine placeholder DLL', # Fake/placeholder Wine DLL + ) + _MAX_LEN = max([len(sig) for sig in _WINE_SIGNATURES]) + + # Wine places their DLL signature in the padding area between the IMAGE_DOS_HEADER and IMAGE_NT_HEADERS. So we need + # to compare the bytes that come right after IMAGE_DOS_HEADER, i.e., after initial 64 bytes. We can read the file + # directly and avoid using the pefile library to avoid performance penalty associated with full header parsing. + try: + with open(filename, 'rb') as fp: + fp.seek(64) + signature = fp.read(_MAX_LEN) + return signature.startswith(_WINE_SIGNATURES) + except Exception: + pass + return False + + +if is_win: + try: + import ctypes.util # noqa: E402 + is_win_wine = is_wine_dll(ctypes.util.find_library('kernel32')) + except Exception: + pass + +# Set and get environment variables does not handle unicode strings correctly on Windows. + +# Acting on os.environ instead of using getenv()/setenv()/unsetenv(), as suggested in +# : "Calling putenv() directly does not change os.environ, so it is +# better to modify os.environ." (Same for unsetenv.) + + +def getenv(name: str, default: str | None = None): + """ + Returns unicode string containing value of environment variable 'name'. + """ + return os.environ.get(name, default) + + +def setenv(name: str, value: str): + """ + Accepts unicode string and set it as environment variable 'name' containing value 'value'. + """ + os.environ[name] = value + + +def unsetenv(name: str): + """ + Delete the environment variable 'name'. + """ + # Some platforms (e.g., AIX) do not support `os.unsetenv()` and thus `del os.environ[name]` has no effect on the + # real environment. For this case, we set the value to the empty string. + os.environ[name] = "" + del os.environ[name] + + +# Exec commands in subprocesses. + + +def exec_command( + *cmdargs: str, encoding: str | None = None, raise_enoent: bool | None = None, **kwargs: int | bool | list | None +): + """ + Run the command specified by the passed positional arguments, optionally configured by the passed keyword arguments. + + .. DANGER:: + **Ignore this function's return value** -- unless this command's standard output contains _only_ pathnames, in + which case this function returns the correct filesystem-encoded string expected by PyInstaller. In all other + cases, this function's return value is _not_ safely usable. + + For backward compatibility, this function's return value non-portably depends on the current Python version and + passed keyword arguments: + + * Under Python 3.x, this value is a **decoded `str` string**. However, even this value is _not_ necessarily + safely usable: + * If the `encoding` parameter is passed, this value is guaranteed to be safely usable. + * Else, this value _cannot_ be safely used for any purpose (e.g., string manipulation or parsing), except to be + passed directly to another non-Python command. Why? Because this value has been decoded with the encoding + specified by `sys.getfilesystemencoding()`, the encoding used by `os.fsencode()` and `os.fsdecode()` to + convert from platform-agnostic to platform-specific pathnames. This is _not_ necessarily the encoding with + which this command's standard output was encoded. Cue edge-case decoding exceptions. + + Parameters + ---------- + cmdargs : + Variadic list whose: + 1. Mandatory first element is the absolute path, relative path, or basename in the current `${PATH}` of the + command to run. + 2. Optional remaining elements are arguments to pass to this command. + encoding : str, optional + Optional keyword argument specifying the encoding with which to decode this command's standard output under + Python 3. As this function's return value should be ignored, this argument should _never_ be passed. + raise_enoent : boolean, optional + Optional keyword argument to simply raise the exception if the executing the command fails since to the command + is not found. This is useful to checking id a command exists. + + All remaining keyword arguments are passed as is to the `subprocess.Popen()` constructor. + + Returns + ---------- + str + Ignore this value. See discussion above. + """ + + proc = subprocess.Popen(cmdargs, stdout=subprocess.PIPE, **kwargs) + try: + out = proc.communicate(timeout=60)[0] + except OSError as e: + if raise_enoent and e.errno == errno.ENOENT: + raise + print('--' * 20, file=sys.stderr) + print("Error running '%s':" % " ".join(cmdargs), file=sys.stderr) + print(e, file=sys.stderr) + print('--' * 20, file=sys.stderr) + raise ExecCommandFailed("Error: Executing command failed!") from e + except subprocess.TimeoutExpired: + proc.kill() + raise + + # stdout/stderr are returned as a byte array NOT as string, so we need to convert that to proper encoding. + try: + if encoding: + out = out.decode(encoding) + else: + # If no encoding is given, assume we are reading filenames from stdout only because it is the common case. + out = os.fsdecode(out) + except UnicodeDecodeError as e: + # The sub-process used a different encoding; provide more information to ease debugging. + print('--' * 20, file=sys.stderr) + print(str(e), file=sys.stderr) + print('These are the bytes around the offending byte:', file=sys.stderr) + print('--' * 20, file=sys.stderr) + raise + return out + + +def exec_command_rc(*cmdargs: str, **kwargs: float | bool | list | None): + """ + Return the exit code of the command specified by the passed positional arguments, optionally configured by the + passed keyword arguments. + + Parameters + ---------- + cmdargs : list + Variadic list whose: + 1. Mandatory first element is the absolute path, relative path, or basename in the current `${PATH}` of the + command to run. + 2. Optional remaining elements are arguments to pass to this command. + + All keyword arguments are passed as is to the `subprocess.call()` function. + + Returns + ---------- + int + This command's exit code as an unsigned byte in the range `[0, 255]`, where 0 signifies success and all other + values signal a failure. + """ + + # 'encoding' keyword is not supported for 'subprocess.call'; remove it from kwargs. + if 'encoding' in kwargs: + kwargs.pop('encoding') + return subprocess.call(cmdargs, **kwargs) + + +def exec_command_all(*cmdargs: str, encoding: str | None = None, **kwargs: int | bool | list | None): + """ + Run the command specified by the passed positional arguments, optionally configured by the passed keyword arguments. + + .. DANGER:: + **Ignore this function's return value.** If this command's standard output consists solely of pathnames, consider + calling `exec_command()` + + Parameters + ---------- + cmdargs : str + Variadic list whose: + 1. Mandatory first element is the absolute path, relative path, or basename in the current `${PATH}` of the + command to run. + 2. Optional remaining elements are arguments to pass to this command. + encoding : str, optional + Optional keyword argument specifying the encoding with which to decode this command's standard output. As this + function's return value should be ignored, this argument should _never_ be passed. + + All remaining keyword arguments are passed as is to the `subprocess.Popen()` constructor. + + Returns + ---------- + (int, str, str) + Ignore this 3-element tuple `(exit_code, stdout, stderr)`. See the `exec_command()` function for discussion. + """ + proc = subprocess.Popen( + cmdargs, + bufsize=-1, # Default OS buffer size. + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + **kwargs + ) + # Waits for subprocess to complete. + try: + out, err = proc.communicate(timeout=60) + except subprocess.TimeoutExpired: + proc.kill() + raise + # stdout/stderr are returned as a byte array NOT as string. Thus we need to convert that to proper encoding. + try: + if encoding: + out = out.decode(encoding) + err = err.decode(encoding) + else: + # If no encoding is given, assume we're reading filenames from stdout only because it's the common case. + out = os.fsdecode(out) + err = os.fsdecode(err) + except UnicodeDecodeError as e: + # The sub-process used a different encoding, provide more information to ease debugging. + print('--' * 20, file=sys.stderr) + print(str(e), file=sys.stderr) + print('These are the bytes around the offending byte:', file=sys.stderr) + print('--' * 20, file=sys.stderr) + raise + + return proc.returncode, out, err + + +def __wrap_python(args, kwargs): + cmdargs = [sys.executable] + + # Mac OS X supports universal binaries (binary for multiple architectures. We need to ensure that subprocess + # binaries are running for the same architecture as python executable. It is necessary to run binaries with 'arch' + # command. + if is_darwin: + if architecture == '64bit': + if platform.machine() == 'arm64': + py_prefix = ['arch', '-arm64'] # Apple M1 + else: + py_prefix = ['arch', '-x86_64'] # Intel + elif architecture == '32bit': + py_prefix = ['arch', '-i386'] + else: + py_prefix = [] + # Since Mac OS 10.11, the environment variable DYLD_LIBRARY_PATH is no more inherited by child processes, so we + # proactively propagate the current value using the `-e` option of the `arch` command. + if 'DYLD_LIBRARY_PATH' in os.environ: + path = os.environ['DYLD_LIBRARY_PATH'] + py_prefix += ['-e', 'DYLD_LIBRARY_PATH=%s' % path] + cmdargs = py_prefix + cmdargs + + if not __debug__: + cmdargs.append('-O') + + cmdargs.extend(args) + + env = kwargs.get('env') + if env is None: + env = dict(**os.environ) + + # Ensure python 3 subprocess writes 'str' as utf-8 + env['PYTHONIOENCODING'] = 'UTF-8' + # ... and ensure we read output as utf-8 + kwargs['encoding'] = 'UTF-8' + + return cmdargs, kwargs + + +def exec_python(*args: str, **kwargs: str | None): + """ + Wrap running python script in a subprocess. + + Return stdout of the invoked command. + """ + cmdargs, kwargs = __wrap_python(args, kwargs) + return exec_command(*cmdargs, **kwargs) + + +def exec_python_rc(*args: str, **kwargs: str | None): + """ + Wrap running python script in a subprocess. + + Return exit code of the invoked command. + """ + cmdargs, kwargs = __wrap_python(args, kwargs) + return exec_command_rc(*cmdargs, **kwargs) + + +# Path handling. + + +# Site-packages functions - use native function if available. +def getsitepackages(prefixes: list | None = None): + """ + Returns a list containing all global site-packages directories. + + For each directory present in ``prefixes`` (or the global ``PREFIXES``), this function finds its `site-packages` + subdirectory depending on the system environment, and returns a list of full paths. + """ + # This implementation was copied from the ``site`` module, python 3.7.3. + sitepackages = [] + seen = set() + + if prefixes is None: + prefixes = [sys.prefix, sys.exec_prefix] + + for prefix in prefixes: + if not prefix or prefix in seen: + continue + seen.add(prefix) + + if os.sep == '/': + 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, "lib", "site-packages")) + return sitepackages + + +# Backported for virtualenv. Module 'site' in virtualenv might not have this attribute. +getsitepackages = getattr(site, 'getsitepackages', getsitepackages) + + +# Wrapper to load a module from a Python source file. This function loads import hooks when processing them. +def importlib_load_source(name: str, pathname: str): + # Import module from a file. + mod_loader = importlib.machinery.SourceFileLoader(name, pathname) + mod = types.ModuleType(mod_loader.name) + mod.__file__ = mod_loader.get_filename() # Some hooks require __file__ attribute in their namespace + mod_loader.exec_module(mod) + return mod + + +# Patterns of module names that should be bundled into the base_library.zip to be available during bootstrap. +# These modules include direct or indirect dependencies of encodings.* modules. The encodings modules must be +# recursively included to set the I/O encoding during python startup. Similarly, this list should include +# modules used by PyInstaller's bootstrap scripts and modules (loader/pyi*.py) + +PY3_BASE_MODULES = { + '_collections_abc', + '_weakrefset', + 'abc', + 'codecs', + 'collections', + 'copyreg', + 'encodings', + 'enum', + 'functools', + 'genericpath', # dependency of os.path + 'io', + 'heapq', + 'keyword', + 'linecache', + 'locale', + 'ntpath', # dependency of os.path + 'operator', + 'os', + 'posixpath', # dependency of os.path + 're', + 'reprlib', + 'sre_compile', + 'sre_constants', + 'sre_parse', + 'stat', # dependency of os.path + 'traceback', # for startup errors + 'types', + 'weakref', + 'warnings', +} + +if not is_py310: + PY3_BASE_MODULES.add('_bootlocale') + +# Object types of Pure Python modules in modulegraph dependency graph. +# Pure Python modules have code object (attribute co_code). +PURE_PYTHON_MODULE_TYPES = { + 'SourceModule', + 'CompiledModule', + 'Package', + 'NamespacePackage', + # Deprecated. + # TODO Could these module types be removed? + 'FlatPackage', + 'ArchiveModule', +} +# Object types of special Python modules (built-in, run-time, namespace package) in modulegraph dependency graph that do +# not have code object. +SPECIAL_MODULE_TYPES = { + # Omit AliasNode from here (and consequently from VALID_MODULE_TYPES), in order to prevent PyiModuleGraph from + # running standard hooks for aliased modules. + #'AliasNode', + 'BuiltinModule', + 'RuntimeModule', + 'RuntimePackage', + + # PyInstaller handles scripts differently and not as standard Python modules. + 'Script', +} +# Object types of Binary Python modules (extensions, etc) in modulegraph dependency graph. +BINARY_MODULE_TYPES = { + 'Extension', + 'ExtensionPackage', +} +# Object types of valid Python modules in modulegraph dependency graph. +VALID_MODULE_TYPES = PURE_PYTHON_MODULE_TYPES | SPECIAL_MODULE_TYPES | BINARY_MODULE_TYPES +# Object types of bad/missing/invalid Python modules in modulegraph dependency graph. +# TODO: should be 'Invalid' module types also in the 'MISSING' set? +BAD_MODULE_TYPES = { + 'BadModule', + 'ExcludedModule', + 'InvalidSourceModule', + 'InvalidCompiledModule', + 'MissingModule', + + # Runtime modules and packages are technically valid rather than bad, but exist only in-memory rather than on-disk + # (typically due to pre_safe_import_module() hooks), and hence cannot be physically frozen. For simplicity, these + # nodes are categorized as bad rather than valid. + 'RuntimeModule', + 'RuntimePackage', +} +ALL_MODULE_TYPES = VALID_MODULE_TYPES | BAD_MODULE_TYPES +# TODO: review this mapping to TOC, remove useless entries. +# Dictionary to map ModuleGraph node types to TOC typecodes. +MODULE_TYPES_TO_TOC_DICT = { + # Pure modules. + 'AliasNode': 'PYMODULE', + 'Script': 'PYSOURCE', + 'SourceModule': 'PYMODULE', + 'CompiledModule': 'PYMODULE', + 'Package': 'PYMODULE', + 'FlatPackage': 'PYMODULE', + 'ArchiveModule': 'PYMODULE', + # Binary modules. + 'Extension': 'EXTENSION', + 'ExtensionPackage': 'EXTENSION', + # Special valid modules. + 'BuiltinModule': 'BUILTIN', + 'NamespacePackage': 'PYMODULE', + # Bad modules. + 'BadModule': 'bad', + 'ExcludedModule': 'excluded', + 'InvalidSourceModule': 'invalid', + 'InvalidCompiledModule': 'invalid', + 'MissingModule': 'missing', + 'RuntimeModule': 'runtime', + 'RuntimePackage': 'runtime', + # Other. + 'does not occur': 'BINARY', +} + + +def check_requirements(): + """ + Verify that all requirements to run PyInstaller are met. + + Fail hard if any requirement is not met. + """ + # Fail hard if Python does not have minimum required version + if sys.version_info < (3, 8): + raise EnvironmentError('PyInstaller requires Python 3.8 or newer.') + + # There are some old packages which used to be backports of libraries which are now part of the standard library. + # These backports are now unmaintained and contain only an older subset of features leading to obscure errors like + # "enum has not attribute IntFlag" if installed. + from importlib.metadata import distribution, PackageNotFoundError + + for name in ["enum34", "typing", "pathlib"]: + try: + dist = distribution(name) + except PackageNotFoundError: + continue + remove = "conda remove" if is_conda else f'"{sys.executable}" -m pip uninstall {name}' + raise SystemExit( + f"The '{name}' package is an obsolete backport of a standard library package and is incompatible with " + f"PyInstaller. Please remove this package (located in {dist.locate_file('')}) using\n {remove}\n" + "then try again." + ) + + # Bail out if binutils is not installed. + if is_linux and shutil.which("objdump") is None: + raise SystemExit( + "On Linux, objdump is required. It is typically provided by the 'binutils' package " + "installable via your Linux distribution's package manager." + ) diff --git a/venv/Lib/site-packages/PyInstaller/config.py b/venv/Lib/site-packages/PyInstaller/config.py new file mode 100644 index 0000000..e6cb695 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/config.py @@ -0,0 +1,56 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +This module holds run-time PyInstaller configuration. + +Variable CONF is a dict() with all configuration options that are necessary for the build phase. Build phase is done by +passing .spec file to exec() function. CONF variable is the only way how to pass arguments to exec() and how to avoid +using 'global' variables. + +NOTE: Having 'global' variables does not play well with the test suite because it does not provide isolated environments +for tests. Some tests might fail in this case. + +NOTE: The 'CONF' dict() is cleaned after building phase to not interfere with any other possible test. + +To pass any arguments to build phase, just do: + + from PyInstaller.config import CONF + CONF['my_var_name'] = my_value + +And to use this variable in the build phase: + + from PyInstaller.config import CONF + foo = CONF['my_var_name'] + + +This is the list of known variables. (Please update it if necessary.) + +cachedir +hiddenimports +noconfirm +pathex +ui_admin +ui_access +upx_available +upx_dir +workpath + +tests_modgraph - cached PyiModuleGraph object to speed up tests + +code_cache - dictionary associating `Analysis.pure` list instances with code cache dictionaries. Used by PYZ writer. +""" + +# NOTE: Do not import other PyInstaller modules here. Just define constants here. + +CONF = { + # Unit tests require this key to exist. + 'pathex': [], +} diff --git a/venv/Lib/site-packages/PyInstaller/configure.py b/venv/Lib/site-packages/PyInstaller/configure.py new file mode 100644 index 0000000..46234b8 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/configure.py @@ -0,0 +1,107 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Configure PyInstaller for the current Python installation. +""" + +import os +import subprocess + +from PyInstaller import compat +from PyInstaller import log as logging + +logger = logging.getLogger(__name__) + + +def _check_upx_availability(upx_dir): + logger.debug('Testing UPX availability ...') + + upx_exe = "upx" + if upx_dir: + upx_exe = os.path.normpath(os.path.join(upx_dir, upx_exe)) + + # Check if we can call `upx -V`. + try: + output = subprocess.check_output( + [upx_exe, '-V'], + stdin=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + encoding='utf-8', + ) + except Exception: + logger.debug('UPX is not available.') + return False + + # Read the first line to display version string + try: + version_string = output.splitlines()[0] + except IndexError: + version_string = 'version string unavailable' + + logger.debug('UPX is available: %s', version_string) + return True + + +def _get_pyinstaller_cache_dir(): + old_cache_dir = None + if compat.getenv('PYINSTALLER_CONFIG_DIR'): + cache_dir = compat.getenv('PYINSTALLER_CONFIG_DIR') + elif compat.is_win: + cache_dir = compat.getenv('LOCALAPPDATA') + if not cache_dir: + cache_dir = os.path.expanduser('~\\Application Data') + elif compat.is_darwin: + cache_dir = os.path.expanduser('~/Library/Application Support') + else: + # According to XDG specification: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + old_cache_dir = compat.getenv('XDG_DATA_HOME') + if not old_cache_dir: + old_cache_dir = os.path.expanduser('~/.local/share') + cache_dir = compat.getenv('XDG_CACHE_HOME') + if not cache_dir: + cache_dir = os.path.expanduser('~/.cache') + cache_dir = os.path.join(cache_dir, 'pyinstaller') + # Move old cache-dir, if any, to new location. + if old_cache_dir and not os.path.exists(cache_dir): + old_cache_dir = os.path.join(old_cache_dir, 'pyinstaller') + if os.path.exists(old_cache_dir): + parent_dir = os.path.dirname(cache_dir) + if not os.path.exists(parent_dir): + os.makedirs(parent_dir) + os.rename(old_cache_dir, cache_dir) + return cache_dir + + +def get_config(upx_dir=None): + config = {} + + config['cachedir'] = _get_pyinstaller_cache_dir() + config['upx_dir'] = upx_dir + + # Disable UPX on non-Windows. Using UPX (3.96) on modern Linux shared libraries (for example, the python3.x.so + # shared library) seems to result in segmentation fault when they are dlopen'd. This happens in recent versions + # of Fedora and Ubuntu linux, as well as in Alpine containers. On macOS, UPX (3.96) fails with + # UnknownExecutableFormatException on most .dylibs (and interferes with code signature on other occasions). And + # even when it would succeed, compressed libraries cannot be (re)signed due to failed strict validation. + upx_available = _check_upx_availability(upx_dir) + if upx_available: + if compat.is_win or compat.is_cygwin: + logger.info("UPX is available and will be used if enabled on build targets.") + elif os.environ.get("PYINSTALLER_FORCE_UPX", "0") != "0": + logger.warning( + "UPX is available and force-enabled on platform with known compatibility problems - use at own risk!" + ) + else: + upx_available = False + logger.info("UPX is available but is disabled on non-Windows due to known compatibility problems.") + config['upx_available'] = upx_available + + return config diff --git a/venv/Lib/site-packages/PyInstaller/depend/__init__.py b/venv/Lib/site-packages/PyInstaller/depend/__init__.py new file mode 100644 index 0000000..792d600 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/depend/__init__.py @@ -0,0 +1 @@ +# diff --git a/venv/Lib/site-packages/PyInstaller/depend/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/depend/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6106225288dc532a3216489884dd350b6fd5834c GIT binary patch literal 189 zcmZ3^%ge<81gF(}(wTttV-N=h7@>^MY(U0zh7^Wi22Do4l?+87m7hV9zXIH?V)7Dm zV@irjD^v3d3w3i+Q06C$UA4q&)W@KdizyKqP Hn1Nyd&Pg!F literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/depend/__pycache__/analysis.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/depend/__pycache__/analysis.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fde1f3b87afe85810bd09e89e40ee11a2c87255 GIT binary patch literal 45837 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 SGSZXQdP^DP=2;07GydNK2&^Fh literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/depend/__pycache__/bindepend.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/depend/__pycache__/bindepend.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a0bd9facf01ab735fa71b3175f3fa19f95b7f58 GIT binary patch literal 35246 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/depend/__pycache__/bytecode.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/depend/__pycache__/bytecode.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9df9235447c0cb7de5616d8babb5f2ce465bdf8b GIT binary patch literal 12686 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 qoyxVRD?Y=oT)#N_@-(x7Dk>`NW$f=4fm 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/depend/__pycache__/imphook.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/depend/__pycache__/imphook.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09418b3f3d796823fa2c6b47748645616bf9987f GIT binary patch literal 25103 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 YrMJj%MUzN^=Bnf&J^ONv3^vjK2O-rKNdN!< literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/depend/__pycache__/imphookapi.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/depend/__pycache__/imphookapi.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de5c4ca34c83e690121b58e1f648b7ac5eee68af GIT binary patch literal 23741 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/depend/analysis.py b/venv/Lib/site-packages/PyInstaller/depend/analysis.py new file mode 100644 index 0000000..f4f28f2 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/depend/analysis.py @@ -0,0 +1,1014 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Define a modified ModuleGraph that can return its contents as a TOC and in other ways act like the old ImpTracker. +TODO: This class, along with TOC and Tree, should be in a separate module. + +For reference, the ModuleGraph node types and their contents: + + nodetype identifier filename + + Script full path to .py full path to .py + SourceModule basename full path to .py + BuiltinModule basename None + CompiledModule basename full path to .pyc + Extension basename full path to .so + MissingModule basename None + Package basename full path to __init__.py + packagepath is ['path to package'] + globalnames is set of global names __init__.py defines + ExtensionPackage basename full path to __init__.{so,dll} + packagepath is ['path to package'] + +The main extension here over ModuleGraph is a method to extract nodes from the flattened graph and return them as a +TOC, or added to a TOC. Other added methods look up nodes by identifier and return facts about them, replacing what +the old ImpTracker list could do. +""" + +import ast +import os +import re +import sys +import traceback +from collections import defaultdict +from copy import deepcopy + +from PyInstaller import HOMEPATH, PACKAGEPATH +from PyInstaller import log as logging +from PyInstaller.building.utils import add_suffix_to_extension +from PyInstaller.compat import ( + BAD_MODULE_TYPES, BINARY_MODULE_TYPES, MODULE_TYPES_TO_TOC_DICT, PURE_PYTHON_MODULE_TYPES, PY3_BASE_MODULES, + VALID_MODULE_TYPES, importlib_load_source, is_win +) +from PyInstaller.depend import bytecode +from PyInstaller.depend.imphook import AdditionalFilesCache, ModuleHookCache +from PyInstaller.depend.imphookapi import (PreFindModulePathAPI, PreSafeImportModuleAPI) +from PyInstaller.lib.modulegraph.find_modules import get_implies +from PyInstaller.lib.modulegraph.modulegraph import ModuleGraph, DEFAULT_IMPORT_LEVEL, ABSOLUTE_IMPORT_LEVEL, Package +from PyInstaller.log import DEBUG, INFO, TRACE +from PyInstaller.utils.hooks import collect_submodules, is_package + +logger = logging.getLogger(__name__) + +# Location-based hook priority constants +HOOK_PRIORITY_BUILTIN_HOOKS = -2000 # Built-in hooks. Lowest priority. +HOOK_PRIORITY_CONTRIBUTED_HOOKS = -1000 # Hooks from pyinstaller-hooks-contrib package. +HOOK_PRIORITY_UPSTREAM_HOOKS = 0 # Hooks provided by packages themselves, via entry-points. +HOOK_PRIORITY_USER_HOOKS = 1000 # User-supplied hooks (command-line / spec file). Highest priority. + + +class PyiModuleGraph(ModuleGraph): + """ + Directed graph whose nodes represent modules and edges represent dependencies between these modules. + + This high-level subclass wraps the lower-level `ModuleGraph` class with support for graph and runtime hooks. + While each instance of `ModuleGraph` represents a set of disconnected trees, each instance of this class *only* + represents a single connected tree whose root node is the Python script originally passed by the user on the + command line. For that reason, while there may (and typically do) exist more than one `ModuleGraph` instance, + there typically exists only a singleton instance of this class. + + Attributes + ---------- + _hooks : ModuleHookCache + Dictionary mapping the fully-qualified names of all modules with normal (post-graph) hooks to the absolute paths + of such hooks. See the the `_find_module_path()` method for details. + _hooks_pre_find_module_path : ModuleHookCache + Dictionary mapping the fully-qualified names of all modules with pre-find module path hooks to the absolute + paths of such hooks. See the the `_find_module_path()` method for details. + _hooks_pre_safe_import_module : ModuleHookCache + Dictionary mapping the fully-qualified names of all modules with pre-safe import module hooks to the absolute + paths of such hooks. See the `_safe_import_module()` method for details. + _user_hook_dirs : list + List of the absolute paths of all directories containing user-defined hooks for the current application. + _excludes : list + List of module names to be excluded when searching for dependencies. + _additional_files_cache : AdditionalFilesCache + Cache of all external dependencies (e.g., binaries, datas) listed in hook scripts for imported modules. + _module_collection_mode : dict + A dictionary of module/package collection mode settings set by hook scripts for their modules. + _bindepend_symlink_suppression : set + A set of paths or path patterns corresponding to shared libraries for which binary dependency analysis should + not create symbolic links into top-level application directory. + _base_modules: list + Dependencies for `base_library.zip` (which remain the same for every executable). + """ + + # Note: these levels are completely arbitrary and may be adjusted if needed. + LOG_LEVEL_MAPPING = {0: INFO, 1: DEBUG, 2: TRACE, 3: TRACE, 4: TRACE} + + def __init__(self, pyi_homepath, user_hook_dirs=(), excludes=(), **kwargs): + super().__init__(excludes=excludes, **kwargs) + # Homepath to the place where is PyInstaller located. + self._homepath = pyi_homepath + # modulegraph Node for the main python script that is analyzed by PyInstaller. + self._top_script_node = None + + # Absolute paths of all user-defined hook directories. + self._excludes = excludes + self._reset(user_hook_dirs) + self._analyze_base_modules() + + def _reset(self, user_hook_dirs): + """ + Reset for another set of scripts. This is primary required for running the test-suite. + """ + self._top_script_node = None + self._additional_files_cache = AdditionalFilesCache() + self._module_collection_mode = dict() + self._bindepend_symlink_suppression = set() + # Hook sources: user-supplied (command-line / spec file), entry-point (upstream hooks, contributed hooks), and + # built-in hooks. The order does not really matter anymore, because each entry is now a (location, priority) + # tuple, and order is determined from assigned priority (which may also be overridden by hooks themselves). + self._user_hook_dirs = [ + *user_hook_dirs, + (os.path.join(PACKAGEPATH, 'hooks'), HOOK_PRIORITY_BUILTIN_HOOKS), + ] + # Hook-specific lookup tables. These need to reset when reusing cached PyiModuleGraph to avoid hooks to refer to + # files or data from another test-case. + logger.info('Initializing module graph hook caches...') + self._hooks = self._cache_hooks("") + self._hooks_pre_safe_import_module = self._cache_hooks('pre_safe_import_module') + self._hooks_pre_find_module_path = self._cache_hooks('pre_find_module_path') + + # Search for run-time hooks in all hook directories. + self._available_rthooks = defaultdict(list) + for uhd, _ in self._user_hook_dirs: + uhd_path = os.path.abspath(os.path.join(uhd, 'rthooks.dat')) + try: + with open(uhd_path, 'r', encoding='utf-8') as f: + rthooks = ast.literal_eval(f.read()) + except FileNotFoundError: + # Ignore if this hook path doesn't have run-time hooks. + continue + except Exception as e: + logger.error('Unable to read run-time hooks from %r: %s' % (uhd_path, e)) + continue + + self._merge_rthooks(rthooks, uhd, uhd_path) + + # Convert back to a standard dict. + self._available_rthooks = dict(self._available_rthooks) + + def _merge_rthooks(self, rthooks, uhd, uhd_path): + """ + The expected data structure for a run-time hook file is a Python dictionary of type ``Dict[str, List[str]]``, + where the dictionary keys are module names and the sequence strings are Python file names. + + Check then merge this data structure, updating the file names to be absolute. + """ + # Check that the root element is a dict. + assert isinstance(rthooks, dict), 'The root element in %s must be a dict.' % uhd_path + for module_name, python_file_name_list in rthooks.items(): + # Ensure the key is a string. + assert isinstance(module_name, str), \ + '%s must be a dict whose keys are strings; %s is not a string.' % (uhd_path, module_name) + # Ensure the value is a list. + assert isinstance(python_file_name_list, list), \ + 'The value of %s key %s must be a list.' % (uhd_path, module_name) + if module_name in self._available_rthooks: + logger.warning( + 'Runtime hooks for %s have already been defined. Skipping the runtime hooks for %s that are ' + 'defined in %s.', module_name, module_name, os.path.join(uhd, 'rthooks') + ) + # Skip this module + continue + # Merge this with existing run-time hooks. + for python_file_name in python_file_name_list: + # Ensure each item in the list is a string. + assert isinstance(python_file_name, str), \ + '%s key %s, item %r must be a string.' % (uhd_path, module_name, python_file_name) + # Transform it into an absolute path. + abs_path = os.path.join(uhd, 'rthooks', python_file_name) + # Make sure this file exists. + assert os.path.exists(abs_path), \ + 'In %s, key %s, the file %r expected to be located at %r does not exist.' % \ + (uhd_path, module_name, python_file_name, abs_path) + # Merge it. + self._available_rthooks[module_name].append(abs_path) + + @staticmethod + def _findCaller(*args, **kwargs): + # Used to add an additional stack-frame above logger.findCaller. findCaller expects the caller to be three + # stack-frames above itself. + return logger.findCaller(*args, **kwargs) + + def msg(self, level, s, *args): + """ + Print a debug message with the given level. + + 1. Map the msg log level to a logger log level. + 2. Generate the message format (the same format as ModuleGraph) + 3. Find the caller, which findCaller expects three stack-frames above itself: + [3] caller -> [2] msg (here) -> [1] _findCaller -> [0] logger.findCaller + 4. Create a logRecord with the caller's information. + 5. Handle the logRecord. + """ + try: + level = self.LOG_LEVEL_MAPPING[level] + except KeyError: + return + if not logger.isEnabledFor(level): + return + + msg = "%s %s" % (s, ' '.join(map(repr, args))) + + try: + fn, lno, func, sinfo = self._findCaller() + except ValueError: # pragma: no cover + fn, lno, func, sinfo = "(unknown file)", 0, "(unknown function)", None + record = logger.makeRecord(logger.name, level, fn, lno, msg, [], None, func, None, sinfo) + + logger.handle(record) + + # Set logging methods so that the stack is correctly detected. + msgin = msg + msgout = msg + + def _cache_hooks(self, hook_type): + """ + Create a cache of all hooks of the specified type. + + The cache will include all official hooks defined by the PyInstaller codebase _and_ all unofficial hooks + defined for the current application. + + Parameters + ---------- + hook_type : str + Type of hooks to be cached, equivalent to the basename of the subpackage of the `PyInstaller.hooks` + package containing such hooks (e.g., empty string for standard hooks, `pre_safe_import_module` for + pre-safe-import-module hooks, `pre_find_module_path` for pre-find-module-path hooks). + """ + # Cache of this type of hooks. + hook_dirs = [] + for user_hook_dir, priority in self._user_hook_dirs: + # Absolute path of the user-defined subdirectory of this hook type. If this directory exists, add it to the + # list to be cached. + user_hook_type_dir = os.path.join(user_hook_dir, hook_type) + if os.path.isdir(user_hook_type_dir): + hook_dirs.append((user_hook_type_dir, priority)) + + return ModuleHookCache(self, hook_dirs) + + def _analyze_base_modules(self): + """ + Analyze dependencies of the the modules in base_library.zip. + """ + logger.info('Analyzing base_library.zip ...') + required_mods = [] + # Collect submodules from required modules in base_library.zip. + for m in PY3_BASE_MODULES: + if is_package(m): + required_mods += collect_submodules(m) + else: + required_mods.append(m) + # Initialize ModuleGraph. + self._base_modules = [mod for req in required_mods for mod in self.import_hook(req)] + + def add_script(self, pathname, caller=None): + """ + Wrap the parent's 'run_script' method and create graph from the first script in the analysis, and save its + node to use as the "caller" node for all others. This gives a connected graph rather than a collection of + unrelated trees. + """ + if self._top_script_node is None: + # Remember the node for the first script. + try: + self._top_script_node = super().add_script(pathname) + except SyntaxError: + print("\nSyntax error in", pathname, file=sys.stderr) + formatted_lines = traceback.format_exc().splitlines(True) + print(*formatted_lines[-4:], file=sys.stderr) + sys.exit(1) + # Create references from the top script to the base_modules in graph. + for node in self._base_modules: + self.add_edge(self._top_script_node, node) + # Return top-level script node. + return self._top_script_node + else: + if not caller: + # Defaults to as any additional script is called from the top-level script. + caller = self._top_script_node + return super().add_script(pathname, caller=caller) + + def process_post_graph_hooks(self, analysis): + """ + For each imported module, run this module's post-graph hooks if any. + + Parameters + ---------- + analysis: build_main.Analysis + The Analysis that calls the hooks + + """ + # For each iteration of the infinite "while" loop below: + # + # 1. All hook() functions defined in cached hooks for imported modules are called. This may result in new + # modules being imported (e.g., as hidden imports) that were ignored earlier in the current iteration: if + # this is the case, all hook() functions defined in cached hooks for these modules will be called by the next + # iteration. + # 2. All cached hooks whose hook() functions were called are removed from this cache. If this cache is empty, no + # hook() functions will be called by the next iteration and this loop will be terminated. + # 3. If no hook() functions were called, this loop is terminated. + logger.info('Processing module hooks (post-graph stage)...') + while True: + # Set of the names of all imported modules whose post-graph hooks are run by this iteration, preventing the + # next iteration from re- running these hooks. If still empty at the end of this iteration, no post-graph + # hooks were run; thus, this loop will be terminated. + hooked_module_names = set() + + # For each remaining hookable module and corresponding hooks... + for module_name, module_hook in self._hooks.items(): + # Graph node for this module if imported or "None" otherwise. + module_node = self.find_node(module_name, create_nspkg=False) + + # If this module has not been imported, temporarily ignore it. This module is retained in the cache, as + # a subsequently run post-graph hook could import this module as a hidden import. + if module_node is None: + continue + + # If this module is unimportable, permanently ignore it. + if type(module_node).__name__ not in VALID_MODULE_TYPES: + hooked_module_names.add(module_name) + continue + + # Run this script's post-graph hook. + module_hook.post_graph(analysis) + + # Cache all external dependencies listed by this script after running this hook, which could add + # dependencies. + self._additional_files_cache.add(module_name, module_hook.binaries, module_hook.datas) + + # Update package collection mode settings. + self._module_collection_mode.update(module_hook.module_collection_mode) + + # Update symbolic link suppression patterns for binary dependency analysis. + self._bindepend_symlink_suppression.update(module_hook.bindepend_symlink_suppression) + + # Prevent this module's hooks from being run again. + hooked_module_names.add(module_name) + + # Prevent all post-graph hooks run above from being run again by the next iteration. + self._hooks.remove_modules(*hooked_module_names) + + # If no post-graph hooks were run, terminate iteration. + if not hooked_module_names: + break + + def _find_all_excluded_imports(self, module_name): + """ + Collect excludedimports from the hooks of the specified module and all its parents. + """ + excluded_imports = set() + while module_name: + # Gather excluded imports from hook belonging to the module. + module_hook = self._hooks.get(module_name, None) + if module_hook: + excluded_imports.update(module_hook.excludedimports) + # Change module name to the module's parent name + module_name = module_name.rpartition('.')[0] + return excluded_imports + + def _safe_import_hook( + self, target_module_partname, source_module, target_attr_names, level=DEFAULT_IMPORT_LEVEL, edge_attr=None + ): + if source_module is not None: + # Gather all excluded imports for the referring modules, as well as its parents. + # For example, we want the excluded imports specified by hook for PIL to be also applied when the referring + # module is its submodule, PIL.Image. + excluded_imports = self._find_all_excluded_imports(source_module.identifier) + + # Apply extra processing only if we have any excluded-imports rules + if excluded_imports: + # Resolve the base module name. Level can be ABSOLUTE_IMPORT_LEVEL (= 0) for absolute imports, or an + # integer indicating the relative level. We do not use equality comparison just in case we ever happen + # to get ABSOLUTE_OR_RELATIVE_IMPORT_LEVEL (-1), which is a remnant of python2 days. + if level > ABSOLUTE_IMPORT_LEVEL: + if isinstance(source_module, Package): + # Package + base_module_name = source_module.identifier + else: + # Module in a package; base name must be the parent package name! + base_module_name = '.'.join(source_module.identifier.split('.')[:-1]) + + if target_module_partname: + base_module_name += '.' + target_module_partname + + # Adjust the base module name based on level + if level > 1: + base_module_name = '.'.join(base_module_name.split('.')[:-(level - 1)]) + else: + base_module_name = target_module_partname + + def _exclude_module(module_name, excluded_imports): + """ + Helper for checking whether given module should be excluded. + Returns the name of exclusion rule if module should be excluded, None otherwise. + """ + module_name_parts = module_name.split('.') + for excluded_import in excluded_imports: + excluded_import_parts = excluded_import.split('.') + match = module_name_parts[:len(excluded_import_parts)] == excluded_import_parts + if match: + return excluded_import + return None + + # First, check if base module name is to be excluded. + # This covers both basic `import a` and `import a.b.c`, as well as `from d import e, f` where base + # module `d` is excluded. + excluded_import_rule = _exclude_module(base_module_name, excluded_imports) + if excluded_import_rule: + logger.debug( + "Suppressing import of %r from module %r due to excluded import %r specified in a hook for %r " + "(or its parent package(s)).", base_module_name, source_module.identifier, excluded_import_rule, + source_module.identifier + ) + return [] + + # If we have target attribute names, check each of them, and remove excluded ones from the + # `target_attr_names` list. + if target_attr_names: + filtered_target_attr_names = [] + for target_attr_name in target_attr_names: + submodule_name = base_module_name + '.' + target_attr_name + excluded_import_rule = _exclude_module(submodule_name, excluded_imports) + if excluded_import_rule: + logger.debug( + "Suppressing import of %r from module %r due to excluded import %r specified in a hook " + "for %r (or its parent package(s)).", submodule_name, source_module.identifier, + excluded_import_rule, source_module.identifier + ) + else: + filtered_target_attr_names.append(target_attr_name) + + # Swap with filtered target attribute names list; if no elements remain after the filtering, pass + # None... + target_attr_names = filtered_target_attr_names or None + + ret_modules = super()._safe_import_hook( + target_module_partname, source_module, target_attr_names, level, edge_attr + ) + + # Ensure that hooks are pre-loaded for returned module(s), in an attempt to ensure that hooks are called in the + # order of imports. The hooks are cached, so there should be no downsides to pre-loading hooks early (as opposed + # to loading them in post-graph analysis). When modules are imported from other modules, the hooks for those + # referring (source) modules and their parent package(s) are loaded by the exclusion mechanism that takes place + # before the above `super()._safe_import_hook` call. The code below attempts to complement that, but for the + # referred (target) modules and their parent package(s). + for ret_module in ret_modules: + if type(ret_module).__name__ not in VALID_MODULE_TYPES: + continue + # (Ab)use the `_find_all_excluded_imports` helper to load all hooks for the given module and its parent + # package(s). + self._find_all_excluded_imports(ret_module.identifier) + + return ret_modules + + def _safe_import_module(self, module_basename, module_name, parent_package): + """ + Create a new graph node for the module with the passed name under the parent package signified by the passed + graph node. + + This method wraps the superclass method with support for pre-import module hooks. If such a hook exists for + this module (e.g., a script `PyInstaller.hooks.hook-{module_name}` containing a function + `pre_safe_import_module()`), that hook will be run _before_ the superclass method is called. + + Pre-Safe-Import-Hooks are performed just *prior* to importing the module. When running the hook, the modules + parent package has already been imported and ti's `__path__` is set up. But the module is just about to be + imported. + + See the superclass method for description of parameters and return value. + """ + # If this module has a pre-safe import module hook, run it. Make sure to remove it first, to prevent subsequent + # calls from running it again. + hook = self._hooks_pre_safe_import_module.pop(module_name, None) + if hook is not None: + # Dynamically import this hook as a fabricated module. + hook_path, hook_basename = os.path.split(hook.hook_filename) + logger.info('Processing pre-safe-import-module hook %r from %r', hook_basename, hook_path) + hook_module_name = 'PyInstaller_hooks_pre_safe_import_module_' + module_name.replace('.', '_') + hook_module = importlib_load_source(hook_module_name, hook.hook_filename) + + # Object communicating changes made by this hook back to us. + hook_api = PreSafeImportModuleAPI( + module_graph=self, + module_basename=module_basename, + module_name=module_name, + parent_package=parent_package, + ) + + # Run this hook, passed this object. + if not hasattr(hook_module, 'pre_safe_import_module'): + raise NameError('pre_safe_import_module() function not defined by hook %r.' % hook_module) + hook_module.pre_safe_import_module(hook_api) + + # Respect method call changes requested by this hook. + module_basename = hook_api.module_basename + module_name = hook_api.module_name + + # Call the superclass method. + return super()._safe_import_module(module_basename, module_name, parent_package) + + def _find_module_path(self, fullname, module_name, search_dirs): + """ + Get a 3-tuple detailing the physical location of the module with the passed name if that module exists _or_ + raise `ImportError` otherwise. + + This method wraps the superclass method with support for pre-find module path hooks. If such a hook exists + for this module (e.g., a script `PyInstaller.hooks.hook-{module_name}` containing a function + `pre_find_module_path()`), that hook will be run _before_ the superclass method is called. + + See superclass method for parameter and return value descriptions. + """ + # If this module has a pre-find module path hook, run it. Make sure to remove it first, to prevent subsequent + # calls from running it again. + hook = self._hooks_pre_find_module_path.pop(fullname, None) + if hook is not None: + # Dynamically import this hook as a fabricated module. + hook_path, hook_basename = os.path.split(hook.hook_filename) + logger.info('Processing pre-find-module-path hook %r from %r', hook_basename, hook_path) + hook_fullname = 'PyInstaller_hooks_pre_find_module_path_' + fullname.replace('.', '_') + hook_module = importlib_load_source(hook_fullname, hook.hook_filename) + + # Object communicating changes made by this hook back to us. + hook_api = PreFindModulePathAPI( + module_graph=self, + module_name=fullname, + search_dirs=search_dirs, + ) + + # Run this hook, passed this object. + if not hasattr(hook_module, 'pre_find_module_path'): + raise NameError('pre_find_module_path() function not defined by hook %r.' % hook_module) + hook_module.pre_find_module_path(hook_api) + + # Respect search-directory changes requested by this hook. + search_dirs = hook_api.search_dirs + + # Call the superclass method. + return super()._find_module_path(fullname, module_name, search_dirs) + + def get_code_objects(self): + """ + Get code objects from ModuleGraph for pure Python modules. This allows to avoid writing .pyc/pyo files to hdd + at later stage. + + :return: Dict with module name and code object. + """ + code_dict = {} + mod_types = PURE_PYTHON_MODULE_TYPES + for node in self.iter_graph(start=self._top_script_node): + # TODO This is terrible. To allow subclassing, types should never be directly compared. Use isinstance() + # instead, which is safer, simpler, and accepts sets. Most other calls to type() in the codebase should also + # be refactored to call isinstance() instead. + + # get node type e.g. Script + mg_type = type(node).__name__ + if mg_type in mod_types: + if node.code: + code_dict[node.identifier] = node.code + return code_dict + + def _make_toc(self, typecode=None): + """ + Return the name, path and type of selected nodes as a TOC. The selection is determined by the given list + of PyInstaller TOC typecodes. If that list is empty we return the complete flattened graph as a TOC with the + ModuleGraph note types in place of typecodes -- meant for debugging only. Normally we return ModuleGraph + nodes whose types map to the requested PyInstaller typecode(s) as indicated in the MODULE_TYPES_TO_TOC_DICT. + + We use the ModuleGraph (really, ObjectGraph) flatten() method to scan all the nodes. This is patterned after + ModuleGraph.report(). + """ + # Construct regular expression for matching modules that should be excluded because they are bundled in + # base_library.zip. + # + # This expression matches the base module name, optionally followed by a period and then any number of + # characters. This matches the module name and the fully qualified names of any of its submodules. + regex_str = '(' + '|'.join(PY3_BASE_MODULES) + r')(\.|$)' + module_filter = re.compile(regex_str) + + toc = list() + for node in self.iter_graph(start=self._top_script_node): + # Skip modules that are in base_library.zip. + if module_filter.match(node.identifier): + continue + entry = self._node_to_toc(node, typecode) + # Append the entry. We do not check for duplicates here; the TOC normalization is left to caller. + # However, as entries are obtained from modulegraph, there should not be any duplicates at this stage. + if entry is not None: + toc.append(entry) + return toc + + def make_pure_toc(self): + """ + Return all pure Python modules formatted as TOC. + """ + # PyInstaller should handle special module types without code object. + return self._make_toc(PURE_PYTHON_MODULE_TYPES) + + def make_binaries_toc(self): + """ + Return all binary Python modules formatted as TOC. + """ + return self._make_toc(BINARY_MODULE_TYPES) + + def make_missing_toc(self): + """ + Return all MISSING Python modules formatted as TOC. + """ + return self._make_toc(BAD_MODULE_TYPES) + + @staticmethod + def _node_to_toc(node, typecode=None): + # TODO This is terrible. Everything in Python has a type. It is nonsensical to even speak of "nodes [that] are + # not typed." How would that even occur? After all, even "None" has a type! (It is "NoneType", for the curious.) + # Remove this, please. + + # Get node type, e.g., Script + mg_type = type(node).__name__ + assert mg_type is not None + + if typecode and mg_type not in typecode: + # Type is not a to be selected one, skip this one + return None + # Extract the identifier and a path if any. + if mg_type == 'Script': + # for Script nodes only, identifier is a whole path + (name, ext) = os.path.splitext(node.filename) + name = os.path.basename(name) + elif mg_type == 'ExtensionPackage': + # Package with __init__ module being an extension module. This needs to end up as e.g. 'mypkg/__init__.so'. + # Convert the packages name ('mypkg') into the module name ('mypkg.__init__') *here* to keep special cases + # away elsewhere (where the module name is converted to a filename). + name = node.identifier + ".__init__" + else: + name = node.identifier + path = node.filename if node.filename is not None else '' + # Ensure name is really 'str'. Module graph might return object type 'modulegraph.Alias' which inherits fromm + # 'str'. But 'marshal.dumps()' function is able to marshal only 'str'. Otherwise on Windows PyInstaller might + # fail with message like: + # ValueError: unmarshallable object + name = str(name) + # Translate to the corresponding TOC typecode. + toc_type = MODULE_TYPES_TO_TOC_DICT[mg_type] + return name, path, toc_type + + def nodes_to_toc(self, nodes): + """ + Given a list of nodes, create a TOC representing those nodes. This is mainly used to initialize a TOC of + scripts with the ones that are runtime hooks. The process is almost the same as _make_toc(), but the caller + guarantees the nodes are valid, so minimal checking. + """ + return [self._node_to_toc(node) for node in nodes] + + # Return true if the named item is in the graph as a BuiltinModule node. The passed name is a basename. + def is_a_builtin(self, name): + node = self.find_node(name) + if node is None: + return False + return type(node).__name__ == 'BuiltinModule' + + def get_importers(self, name): + """ + List all modules importing the module with the passed name. + + Returns a list of (identifier, DependencyIinfo)-tuples. If the names module has not yet been imported, this + method returns an empty list. + + Parameters + ---------- + name : str + Fully-qualified name of the module to be examined. + + Returns + ---------- + list + List of (fully-qualified names, DependencyIinfo)-tuples of all modules importing the module with the passed + fully-qualified name. + + """ + def get_importer_edge_data(importer): + edge = self.graph.edge_by_node(importer, name) + # edge might be None in case an AliasModule was added. + if edge is not None: + return self.graph.edge_data(edge) + + node = self.find_node(name) + if node is None: + return [] + _, importers = self.get_edges(node) + importers = (importer.identifier for importer in importers if importer is not None) + return [(importer, get_importer_edge_data(importer)) for importer in importers] + + # TODO: create a class from this function. + def analyze_runtime_hooks(self, custom_runhooks): + """ + Analyze custom run-time hooks and run-time hooks implied by found modules. + + :return : list of Graph nodes. + """ + rthooks_nodes = [] + logger.info('Analyzing run-time hooks ...') + # Process custom runtime hooks (from --runtime-hook options). The runtime hooks are order dependent. First hooks + # in the list are executed first. Put their graph nodes at the head of the priority_scripts list Pyinstaller + # defined rthooks and thus they are executed first. + if custom_runhooks: + for hook_file in custom_runhooks: + logger.info("Including custom run-time hook %r", hook_file) + hook_file = os.path.abspath(hook_file) + # Not using "try" here because the path is supposed to exist, if it does not, the raised error will + # explain. + rthooks_nodes.append(self.add_script(hook_file)) + + # Find runtime hooks that are implied by packages already imported. Get a temporary TOC listing all the scripts + # and packages graphed so far. Assuming that runtime hooks apply only to modules and packages. + temp_toc = self._make_toc(VALID_MODULE_TYPES) + for (mod_name, path, typecode) in temp_toc: + # Look if there is any run-time hook for given module. + if mod_name in self._available_rthooks: + # There could be several run-time hooks for a module. + for abs_path in self._available_rthooks[mod_name]: + hook_path, hook_basename = os.path.split(abs_path) + logger.info("Including run-time hook %r from %r", hook_basename, hook_path) + rthooks_nodes.append(self.add_script(abs_path)) + + return rthooks_nodes + + def add_hiddenimports(self, module_list): + """ + Add hidden imports that are either supplied as CLI option --hidden-import=MODULENAME or as dependencies from + some PyInstaller features when enabled (e.g., crypto feature). + """ + assert self._top_script_node is not None + # Analyze the script's hidden imports (named on the command line). + for modnm in module_list: + node = self.find_node(modnm) + if node is not None: + logger.debug('Hidden import %r already found', modnm) + else: + logger.info("Analyzing hidden import %r", modnm) + # ModuleGraph throws ImportError if import not found. + try: + nodes = self.import_hook(modnm) + assert len(nodes) == 1 + node = nodes[0] + except ImportError: + logger.error("Hidden import %r not found", modnm) + continue + # Create references from the top script to the hidden import, even if found otherwise. Do not waste time + # checking whether it is actually added by this (test-) script. + self.add_edge(self._top_script_node, node) + + def get_code_using(self, module: str) -> dict: + """ + Find modules that import a given **module**. + """ + co_dict = {} + pure_python_module_types = PURE_PYTHON_MODULE_TYPES | { + 'Script', + } + node = self.find_node(module) + if node: + referrers = self.incoming(node) + for r in referrers: + # Under python 3.7 and earlier, if `module` is added to hidden imports, one of referrers ends up being + # None, causing #3825. Work around it. + if r is None: + continue + # Ensure that modulegraph objects have 'code' attribute. + if type(r).__name__ not in pure_python_module_types: + continue + identifier = r.identifier + if identifier == module or identifier.startswith(module + '.'): + # Skip self references or references from `modules`'s own submodules. + continue + # The code object may be None if referrer ends up shadowed by eponymous directory that ends up treated + # as a namespace package. See #6873 for an example. + if r.code is None: + continue + co_dict[r.identifier] = r.code + return co_dict + + def metadata_required(self) -> set: + """ + Collect metadata for all packages that appear to need it. + """ + + # List every function that we can think of which is known to require metadata. + out = set() + + out |= self._metadata_from( + "pkg_resources", + ["get_distribution"], # Requires metadata for one distribution. + ["require"], # Requires metadata for all dependencies. + ) + + # importlib.metadata is often `import ... as` aliased to importlib_metadata for compatibility with < py38. + # Assume both are valid. + for importlib_metadata in ["importlib.metadata", "importlib_metadata"]: + out |= self._metadata_from( + importlib_metadata, + ["metadata", "distribution", "version", "files", "requires"], + [], + ) + + return out + + def _metadata_from(self, package, methods=(), recursive_methods=()) -> set: + """ + Collect metadata whose requirements are implied by given function names. + + Args: + package: + The module name that must be imported in a source file to trigger the search. + methods: + Function names from **package** which take a distribution name as an argument and imply that metadata + is required for that distribution. + recursive_methods: + Like **methods** but also implies that a distribution's dependencies' metadata must be collected too. + Returns: + Required metadata in hook data ``(source, dest)`` format as returned by + :func:`PyInstaller.utils.hooks.copy_metadata()`. + + Scan all source code to be included for usage of particular *key* functions which imply that that code will + require metadata for some distribution (which may not be its own) at runtime. In the case of a match, + collect the required metadata. + """ + from PyInstaller.utils.hooks import copy_metadata + from PyInstaller.compat import importlib_metadata + + # Generate sets of possible function names to search for. + need_metadata = set() + need_recursive_metadata = set() + for method in methods: + need_metadata.update(bytecode.any_alias(package + "." + method)) + for method in recursive_methods: + need_recursive_metadata.update(bytecode.any_alias(package + "." + method)) + + out = set() + + for name, code in self.get_code_using(package).items(): + for calls in bytecode.recursive_function_calls(code).values(): + for function_name, args in calls: + # Only consider function calls taking one argument. + if len(args) != 1: + continue + package = args[0] + try: + if function_name in need_metadata: + out.update(copy_metadata(package)) + elif function_name in need_recursive_metadata: + out.update(copy_metadata(package, recursive=True)) + + except importlib_metadata.PackageNotFoundError: + # Currently, we opt to silently skip over missing metadata. + continue + + return out + + def get_collected_packages(self) -> list: + """ + Return the list of collected python packages. + """ + # `node.identifier` might be an instance of `modulegraph.Alias`, hence explicit conversion to `str`. + return [ + str(node.identifier) for node in self.iter_graph(start=self._top_script_node) + if type(node).__name__ == 'Package' + ] + + def make_hook_binaries_toc(self) -> list: + """ + Return the TOC list of binaries collected by hooks." + """ + toc = [] + for node in self.iter_graph(start=self._top_script_node): + module_name = str(node.identifier) + for dest_name, src_name in self._additional_files_cache.binaries(module_name): + toc.append((dest_name, src_name, 'BINARY')) + + return toc + + def make_hook_datas_toc(self) -> list: + """ + Return the TOC list of data files collected by hooks." + """ + toc = [] + for node in self.iter_graph(start=self._top_script_node): + module_name = str(node.identifier) + for dest_name, src_name in self._additional_files_cache.datas(module_name): + toc.append((dest_name, src_name, 'DATA')) + + return toc + + +_cached_module_graph_ = None + + +def initialize_modgraph(excludes=(), user_hook_dirs=()): + """ + Create the cached module graph. + + This function might appear weird but is necessary for speeding up test runtime because it allows caching basic + ModuleGraph object that gets created for 'base_library.zip'. + + Parameters + ---------- + excludes : list + List of the fully-qualified names of all modules to be "excluded" and hence _not_ frozen into the executable. + user_hook_dirs : list + List of the absolute paths of all directories containing user-defined hooks for the current application or + `None` if no such directories were specified. + + Returns + ---------- + PyiModuleGraph + Module graph with core dependencies. + """ + # Normalize parameters to ensure tuples and make comparison work. + user_hook_dirs = user_hook_dirs or () + excludes = excludes or () + + # Ensure that __main__ is always excluded from the modulegraph, to prevent accidentally pulling PyInstaller itself + # into the modulegraph. This seems to happen on Windows, because modulegraph is able to resolve `__main__` as + # `.../PyInstaller.exe/__main__.py` and analyze it. The `__main__` has a different meaning during analysis compared + # to the program run-time, when it refers to the program's entry-point (which would always be part of the + # modulegraph anyway, by virtue of being the starting point of the analysis). + if "__main__" not in excludes: + excludes += ("__main__",) + + # If there is a graph cached with the same excludes, reuse it. See ``PyiModulegraph._reset()`` for what is + # reset. This cache is used primarily to speed up the test-suite. Fixture `pyi_modgraph` calls this function with + # empty excludes, creating a graph suitable for the huge majority of tests. + global _cached_module_graph_ + if _cached_module_graph_ and _cached_module_graph_._excludes == excludes: + logger.info('Reusing cached module dependency graph...') + graph = deepcopy(_cached_module_graph_) + graph._reset(user_hook_dirs) + return graph + + logger.info('Initializing module dependency graph...') + + # Construct the initial module graph by analyzing all import statements. + graph = PyiModuleGraph( + HOMEPATH, + excludes=excludes, + # get_implies() are hidden imports known by modulgraph. + implies=get_implies(), + user_hook_dirs=user_hook_dirs, + ) + + if not _cached_module_graph_: + # Only cache the first graph, see above for explanation. + logger.info('Caching module dependency graph...') + # cache a deep copy of the graph + _cached_module_graph_ = deepcopy(graph) + # Clear data which does not need to be copied from the cached graph since it will be reset by + # ``PyiModulegraph._reset()`` anyway. + _cached_module_graph_._hooks = None + _cached_module_graph_._hooks_pre_safe_import_module = None + _cached_module_graph_._hooks_pre_find_module_path = None + + return graph + + +def get_bootstrap_modules(): + """ + Get TOC with the bootstrapping modules and their dependencies. + :return: TOC with modules + """ + # Import 'struct' modules to get real paths to module file names. + mod_struct = __import__('struct') + # Basic modules necessary for the bootstrap process. + loader_mods = list() + loaderpath = os.path.join(HOMEPATH, 'PyInstaller', 'loader') + # On some platforms (Windows, Debian/Ubuntu) '_struct' and zlib modules are built-in modules (linked statically) + # and thus does not have attribute __file__. 'struct' module is required for reading Python bytecode from + # executable. 'zlib' is required to decompress this bytecode. + for mod_name in ['_struct', 'zlib']: + mod = __import__(mod_name) # C extension. + if hasattr(mod, '__file__'): + mod_file = os.path.abspath(mod.__file__) + if os.path.basename(os.path.dirname(mod_file)) == 'lib-dynload': + # Divert extensions originating from python's lib-dynload directory, to match behavior of #5604. + mod_name = os.path.join('lib-dynload', mod_name) + loader_mods.append(add_suffix_to_extension(mod_name, mod_file, 'EXTENSION')) + loader_mods.append(('struct', os.path.abspath(mod_struct.__file__), 'PYMODULE')) + # Loader/bootstrap modules. + # NOTE: These modules should be kept simple without any complicated dependencies. + loader_mods += [ + ('pyimod01_archive', os.path.join(loaderpath, 'pyimod01_archive.py'), 'PYMODULE'), + ('pyimod02_importers', os.path.join(loaderpath, 'pyimod02_importers.py'), 'PYMODULE'), + ('pyimod03_ctypes', os.path.join(loaderpath, 'pyimod03_ctypes.py'), 'PYMODULE'), + ] + if is_win: + loader_mods.append(('pyimod04_pywin32', os.path.join(loaderpath, 'pyimod04_pywin32.py'), 'PYMODULE')) + # The bootstrap script + loader_mods.append(('pyiboot01_bootstrap', os.path.join(loaderpath, 'pyiboot01_bootstrap.py'), 'PYSOURCE')) + return loader_mods diff --git a/venv/Lib/site-packages/PyInstaller/depend/bindepend.py b/venv/Lib/site-packages/PyInstaller/depend/bindepend.py new file mode 100644 index 0000000..cfb448f --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/depend/bindepend.py @@ -0,0 +1,946 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Find external dependencies of binary libraries. +""" + +import ctypes.util +import os +import pathlib +import re +import sys +import sysconfig +import subprocess + +from PyInstaller import compat +from PyInstaller import log as logging +from PyInstaller.depend import dylib, utils +from PyInstaller.utils.win32 import winutils + +if compat.is_darwin: + import PyInstaller.utils.osx as osxutils + +logger = logging.getLogger(__name__) + +_exe_machine_type = None +if compat.is_win: + _exe_machine_type = winutils.get_pe_file_machine_type(compat.python_executable) + +#- High-level binary dependency analysis + + +def _get_paths_for_parent_directory_preservation(): + """ + Return list of paths that serve as prefixes for parent-directory preservation of collected binaries and/or + shared libraries. If a binary is collected from a location that starts with a path from this list, the relative + directory structure is preserved within the frozen application bundle; otherwise, the binary is collected to the + frozen application's top-level directory. + """ + + # Use only site-packages paths. We have no control over contents of `sys.path`, so using all paths from that may + # lead to unintended behavior in corner cases. For example, if `sys.path` contained the drive root (see #7028), + # all paths that do not match some other sub-path rooted in that drive will end up recognized as relative to the + # drive root. In such case, any DLL collected from `c:\Windows\system32` will be collected into `Windows\system32` + # sub-directory; ucrt DLLs collected from MSVC or Windows SDK installed in `c:\Program Files\...` will end up + # collected into `Program Files\...` subdirectory; etc. + # + # On the other hand, the DLL parent directory preservation is primarily aimed at packages installed via PyPI + # wheels, which are typically installed into site-packages. Therefore, limiting the directory preservation for + # shared libraries collected from site-packages should do the trick, and should be reasonably safe. + import site + + orig_paths = site.getsitepackages() + orig_paths.append(site.getusersitepackages()) + + # Explicitly excluded paths. `site.getsitepackages` seems to include `sys.prefix`, which we need to exclude, to + # avoid issue swith DLLs in its sub-directories. We need both resolved and unresolved variant to handle cases + # where `base_prefix` itself is a symbolic link (e.g., `scoop`-installed python on Windows, see #8023). + excluded_paths = { + pathlib.Path(sys.base_prefix), + pathlib.Path(sys.base_prefix).resolve(), + pathlib.Path(sys.prefix), + pathlib.Path(sys.prefix).resolve(), + } + + # For each path in orig_paths, append a resolved variant. This helps with linux venv where we need to consider + # both `venv/lib/python3.11/site-packages` and `venv/lib/python3.11/site-packages` and `lib64` is a symlink + # to `lib`. + orig_paths += [pathlib.Path(path).resolve() for path in orig_paths] + + paths = set() + for path in orig_paths: + if not path: + continue + path = pathlib.Path(path) + # Filter out non-directories (e.g., /path/to/python3x.zip) or non-existent paths + if not path.is_dir(): + continue + # Filter out explicitly excluded paths + if path in excluded_paths: + continue + paths.add(path) + + # Sort by length (in term of path components) to ensure match against the longest common prefix (for example, match + # /path/to/venv/lib/site-packages instead of /path/to/venv when both paths are in site paths). + paths = sorted(paths, key=lambda x: len(x.parents), reverse=True) + + return paths + + +def _select_destination_directory(src_filename, parent_dir_preservation_paths): + # Check parent directory preservation paths + for parent_dir_preservation_path in parent_dir_preservation_paths: + if parent_dir_preservation_path in src_filename.parents: + # Collect into corresponding sub-directory. + return src_filename.relative_to(parent_dir_preservation_path) + + # Collect into top-level directory. + return src_filename.name + + +def binary_dependency_analysis(binaries, search_paths=None, symlink_suppression_patterns=None): + """ + Perform binary dependency analysis on the given TOC list of collected binaries, by recursively scanning each binary + for linked dependencies (shared library imports). Returns new TOC list that contains both original entries and their + binary dependencies. + + Additional search paths for dependencies' full path resolution may be supplied via optional argument. + """ + + # Get all path prefixes for binaries' parent-directory preservation. For binaries collected from packages in (for + # example) site-packages directory, we should try to preserve the parent directory structure. + parent_dir_preservation_paths = _get_paths_for_parent_directory_preservation() + + # Keep track of processed binaries and processed dependencies. + processed_binaries = set() + processed_dependencies = set() + + # Keep track of unresolved dependencies, in order to defer the missing-library warnings until after everything has + # been processed. This allows us to suppress warnings for dependencies that end up being collected anyway; for + # details, see the end of this function. + missing_dependencies = [] + + # Populate output TOC with input binaries - this also serves as TODO list, as we iterate over it while appending + # new entries at the end. + output_toc = binaries[:] + for dest_name, src_name, typecode in output_toc: + # Do not process symbolic links (already present in input TOC list, or added during analysis below). + if typecode == 'SYMLINK': + continue + + # Keep track of processed binaries, to avoid unnecessarily repeating analysis of the same file. Use pathlib.Path + # to avoid having to worry about case normalization. + src_path = pathlib.Path(src_name) + if src_path in processed_binaries: + continue + processed_binaries.add(src_path) + + logger.debug("Analyzing binary %r", src_name) + + # Analyze imports (linked dependencies) + for dep_name, dep_src_path in get_imports(src_name, search_paths): + logger.debug("Processing dependency, name: %r, resolved path: %r", dep_name, dep_src_path) + + # Skip unresolved dependencies. Defer the missing-library warnings until after binary dependency analysis + # is complete. + if not dep_src_path: + missing_dependencies.append((dep_name, src_name)) + continue + + # Compare resolved dependency against global inclusion/exclusion rules. + if not dylib.include_library(dep_src_path): + logger.debug("Skipping dependency %r due to global exclusion rules.", dep_src_path) + continue + + dep_src_path = pathlib.Path(dep_src_path) # Turn into pathlib.Path for subsequent processing + + # Avoid processing this dependency if we have already processed it. + if dep_src_path in processed_dependencies: + logger.debug("Skipping dependency %r due to prior processing.", str(dep_src_path)) + continue + processed_dependencies.add(dep_src_path) + + # Try to preserve parent directory structure, if applicable. + # NOTE: do not resolve the source path, because on macOS and linux, it may be a versioned .so (e.g., + # libsomething.so.1, pointing at libsomething.so.1.2.3), and we need to collect it under original name! + dep_dest_path = _select_destination_directory(dep_src_path, parent_dir_preservation_paths) + dep_dest_path = pathlib.PurePath(dep_dest_path) # Might be a str() if it is just a basename... + + # If we are collecting library into top-level directory on macOS, check whether it comes from a + # .framework bundle. If it does, re-create the .framework bundle in the top-level directory + # instead. + if compat.is_darwin and dep_dest_path.parent == pathlib.PurePath('.'): + if osxutils.is_framework_bundle_lib(dep_src_path): + # dst_src_path is parent_path/Name.framework/Versions/Current/Name + framework_parent_path = dep_src_path.parent.parent.parent.parent + dep_dest_path = pathlib.PurePath(dep_src_path.relative_to(framework_parent_path)) + + logger.debug("Collecting dependency %r as %r.", str(dep_src_path), str(dep_dest_path)) + output_toc.append((str(dep_dest_path), str(dep_src_path), 'BINARY')) + + # On non-Windows, if we are not collecting the binary into application's top-level directory ('.'), + # add a symbolic link from top-level directory to the actual location. This is to accommodate + # LD_LIBRARY_PATH being set to the top-level application directory on linux (although library search + # should be mostly done via rpaths, so this might be redundant) and to accommodate library path + # rewriting on macOS, which assumes that the library was collected into top-level directory. + if compat.is_win: + # We do not use symlinks on Windows. + pass + elif dep_dest_path.parent == pathlib.PurePath('.'): + # The shared library itself is being collected into top-level application directory. + pass + elif any(dep_src_path.match(pattern) for pattern in symlink_suppression_patterns): + # Honor symlink suppression patterns specified by hooks. + logger.debug( + "Skipping symbolic link from %r to top-level application directory due to source path matching one " + "of symlink suppression path patterns.", str(dep_dest_path) + ) + else: + logger.debug("Adding symbolic link from %r to top-level application directory.", str(dep_dest_path)) + output_toc.append((str(dep_dest_path.name), str(dep_dest_path), 'SYMLINK')) + + # Display warnings about missing dependencies + seen_binaries = set([ + os.path.normcase(os.path.basename(src_name)) for dest_name, src_name, typecode in output_toc + if typecode != 'SYMLINK' + ]) + for dependency_name, referring_binary in missing_dependencies: + # Ignore libraries that we would not collect in the first place. + if not dylib.include_library(dependency_name): + continue + # Apply global warning suppression rules. + if not dylib.warn_missing_lib(dependency_name): + continue + # If the binary with a matching basename happens to be among the discovered binaries, suppress the message as + # well. This might happen either because the library was collected by some other mechanism (for example, via + # hook, or supplied by the user), or because it was discovered during the analysis of another binary (which, + # for example, had properly set run-paths on Linux/macOS or was located next to that other analyzed binary on + # Windows). + if os.path.normcase(os.path.basename(dependency_name)) in seen_binaries: + continue + logger.warning("Library not found: could not resolve %r, dependency of %r.", dependency_name, referring_binary) + + return output_toc + + +#- Low-level import analysis + + +def get_imports(filename, search_paths=None): + """ + Analyze the given binary file (shared library or executable), and obtain the list of shared libraries it imports + (i.e., link-time dependencies). + + Returns set of tuples (name, fullpath). The name component is the referenced name, and on macOS, may not be just + a base name. If the library's full path cannot be resolved, fullpath element is None. + + Additional list of search paths may be specified via `search_paths`, to be used as a fall-back when the + platform-specific resolution mechanism fails to resolve a library fullpath. + """ + if compat.is_win: + if str(filename).lower().endswith(".manifest"): + return [] + return _get_imports_pefile(filename, search_paths) + elif compat.is_darwin: + return _get_imports_macholib(filename, search_paths) + else: + return _get_imports_ldd(filename, search_paths) + + +def _get_imports_pefile(filename, search_paths): + """ + Windows-specific helper for `get_imports`, which uses the `pefile` library to walk through PE header. + """ + import pefile + + output = set() + + # By default, pefile library parses all PE information. We are only interested in the list of dependent dlls. + # Performance is improved by reading only needed information. https://code.google.com/p/pefile/wiki/UsageExamples + pe = pefile.PE(filename, fast_load=True) + pe.parse_data_directories( + directories=[ + pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_IMPORT'], + pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_EXPORT'], + ], + forwarded_exports_only=True, + import_dllnames_only=True, + ) + + # If a library has no binary dependencies, pe.DIRECTORY_ENTRY_IMPORT does not exist. + for entry in getattr(pe, 'DIRECTORY_ENTRY_IMPORT', []): + dll_str = entry.dll.decode('utf-8') + output.add(dll_str) + + # We must also read the exports table to find forwarded symbols: + # http://blogs.msdn.com/b/oldnewthing/archive/2006/07/19/671238.aspx + exported_symbols = getattr(pe, 'DIRECTORY_ENTRY_EXPORT', None) + if exported_symbols: + for symbol in exported_symbols.symbols: + if symbol.forwarder is not None: + # symbol.forwarder is a bytes object. Convert it to a string. + forwarder = symbol.forwarder.decode('utf-8') + # symbol.forwarder is for example 'KERNEL32.EnterCriticalSection' + dll = forwarder.split('.')[0] + output.add(dll + ".dll") + + pe.close() + + # Attempt to resolve full paths to referenced DLLs. Always add the input binary's parent directory to the search + # paths. + search_paths = [os.path.dirname(filename)] + (search_paths or []) + output = {(lib, resolve_library_path(lib, search_paths)) for lib in output} + + return output + + +def _get_imports_ldd(filename, search_paths): + """ + Helper for `get_imports`, which uses `ldd` to analyze shared libraries. Used on Linux and other POSIX-like platforms + (with exception of macOS). + """ + + output = set() + + # Output of ldd varies between platforms... + if compat.is_aix: + # Match libs of the form + # 'archivelib.a(objectmember.so/.o)' + # or + # 'sharedlib.so' + # Will not match the fake lib '/unix' + LDD_PATTERN = re.compile(r"^\s*(((?P(.*\.a))(?P\(.*\)))|((?P(.*\.so))))$") + elif compat.is_hpux: + # Match libs of the form + # 'sharedlib.so => full-path-to-lib + # e.g. + # 'libpython2.7.so => /usr/local/lib/hpux32/libpython2.7.so' + LDD_PATTERN = re.compile(r"^\s+(.*)\s+=>\s+(.*)$") + elif compat.is_solar: + # Match libs of the form + # 'sharedlib.so => full-path-to-lib + # e.g. + # 'libpython2.7.so.1.0 => /usr/local/lib/libpython2.7.so.1.0' + # Will not match the platform specific libs starting with '/platform' + LDD_PATTERN = re.compile(r"^\s+(.*)\s+=>\s+(.*)$") + elif compat.is_linux: + # Match libs of the form + # libpython3.13.so.1.0 => /home/brenainn/.pyenv/versions/3.13.0/lib/libpython3.13.so.1.0 (0x00007a9e15800000) + # or + # /tmp/python/install/bin/../lib/libpython3.13.so.1.0 (0x00007b9489c82000) + LDD_PATTERN = re.compile(r"^\s*(?:(.*?)\s+=>\s+)?(.*?)\s+\(.*\)") + else: + LDD_PATTERN = re.compile(r"\s*(.*?)\s+=>\s+(.*?)\s+\(.*\)") + + # Resolve symlinks since GNU ldd contains a bug in processing a symlink to a binary + # using $ORIGIN: https://sourceware.org/bugzilla/show_bug.cgi?id=25263 + p = subprocess.run( + ['ldd', os.path.realpath(filename)], + stdin=subprocess.DEVNULL, + stderr=subprocess.PIPE, + stdout=subprocess.PIPE, + encoding='utf-8', + ) + + ldd_warnings = [] + for line in p.stderr.splitlines(): + if not line: + continue + # Python extensions (including stdlib ones) are not linked against python.so but rely on Python's symbols having + # already been loaded into symbol space at runtime. musl's ldd issues a series of harmless warnings to stderr + # telling us that those symbols are unfindable. These should be suppressed. + elif line.startswith("Error relocating ") and line.endswith(" symbol not found"): + continue + # Shared libraries should have the executable bits set; however, this is not the case for shared libraries + # shipped in PyPI wheels, which cause ldd to emit `ldd: warning: you do not have execution permission for ...` + # warnings. Suppress these. + elif line.startswith("ldd: warning: you do not have execution permission for "): + continue + # When `ldd` is ran against a file that is not a dynamic binary (i.e., is not a binary at all, or is a static + # binary), it emits a "not a dynamic executable" warning. Suppress it. + elif "not a dynamic executable" in line: + continue + # Propagate any other warnings it might have. + ldd_warnings.append(line) + if ldd_warnings: + logger.warning("ldd warnings for %r:\n%s", filename, "\n".join(ldd_warnings)) + + for line in p.stdout.splitlines(): + name = None # Referenced name + lib = None # Resolved library path + + m = LDD_PATTERN.search(line) + if m: + if compat.is_aix: + libarchive = m.group('libarchive') + if libarchive: + # We matched an archive lib with a request for a particular embedded shared object. + # 'archivelib.a(objectmember.so/.o)' + lib = libarchive + name = os.path.basename(lib) + m.group('objectmember') + else: + # We matched a stand-alone shared library. + # 'sharedlib.so' + lib = m.group('libshared') + name = os.path.basename(lib) + elif compat.is_hpux: + name, lib = m.group(1), m.group(2) + else: + name, lib = m.group(1), m.group(2) + name = name or os.path.basename(lib) + if compat.is_linux: + # Skip all ld variants listed https://sourceware.org/glibc/wiki/ABIList + # plus musl's ld-musl-*.so.*. + if re.fullmatch(r"ld(64)?(-linux|-musl)?(-.+)?\.so(\..+)?", os.path.basename(lib)): + continue + if name[:10] in ('linux-gate', 'linux-vdso'): + # linux-gate is a fake library which does not exist and should be ignored. See also: + # http://www.trilithium.com/johan/2005/08/linux-gate/ + continue + + if compat.is_cygwin: + # exclude Windows system library + if lib.lower().startswith('/cygdrive/c/windows/system'): + continue + + # Reset library path if it does not exist + if not os.path.exists(lib): + lib = None + elif line.endswith("not found"): + # On glibc-based linux distributions, missing libraries are marked with name.so => not found + tokens = line.split('=>') + if len(tokens) != 2: + continue + name = tokens[0].strip() + lib = None + else: + # TODO: should we warn about unprocessed lines? + continue + + # Fall back to searching the supplied search paths, if any. + if not lib: + lib = _resolve_library_path_in_search_paths( + os.path.basename(name), # Search for basename of the referenced name. + search_paths, + ) + + # Normalize the resolved path, to remove any extraneous "../" elements. + if lib: + lib = os.path.normpath(lib) + + # Return referenced name as-is instead of computing a basename, to provide additional context when library + # cannot be resolved. + output.add((name, lib)) + + return output + + +def _get_imports_macholib(filename, search_paths): + """ + macOS-specific helper for `get_imports`, which uses `macholib` to analyze library load commands in Mach-O headers. + """ + from macholib.dyld import dyld_find + from macholib.mach_o import LC_RPATH + from macholib.MachO import MachO + + try: + from macholib.dyld import _dyld_shared_cache_contains_path + except ImportError: + _dyld_shared_cache_contains_path = None + + output = set() + referenced_libs = set() # Libraries referenced in Mach-O headers. + + # Parent directory of the input binary and parent directory of python executable, used to substitute @loader_path + # and @executable_path. The MacOS dylib loader (dyld) fully resolves the symbolic links when using @loader_path + # and @executable_path references, so we need to do the same using `os.path.realpath`. + bin_path = os.path.dirname(os.path.realpath(filename)) + python_bin_path = os.path.dirname(os.path.realpath(sys.executable)) + + # Walk through Mach-O headers, and collect all referenced libraries. + m = MachO(filename) + for header in m.headers: + for idx, name, lib in header.walkRelocatables(): + referenced_libs.add(lib) + + # Find LC_RPATH commands to collect rpaths. macholib does not handle @rpath, so we need to handle run paths + # ourselves. + run_paths = set() + for header in m.headers: + for command in header.commands: + # A command is a tuple like: + # (, + # , + # '../lib\x00\x00') + cmd_type = command[0].cmd + if cmd_type == LC_RPATH: + rpath = command[2].decode('utf-8') + # Remove trailing '\x00' characters. E.g., '../lib\x00\x00' + rpath = rpath.rstrip('\x00') + # If run path starts with @, ensure it starts with either @loader_path or @executable_path. We cannot + # process anything else. + if rpath.startswith("@") and not rpath.startswith(("@executable_path", "@loader_path")): + logger.warning("Unsupported rpath format %r found in binary %r - ignoring...", rpath, filename) + continue + run_paths.add(rpath) + + # For distributions like Anaconda, all of the dylibs are stored in the lib directory of the Python distribution, not + # alongside of the .so's in each module's subdirectory. Usually, libraries using @rpath to reference their + # dependencies also set up their run-paths via LC_RPATH commands. However, they are not strictly required to do so, + # because run-paths are inherited from the process within which the libraries are loaded. Therefore, if the python + # executable uses an LC_RPATH command to set up run-path that resolves the shared lib directory (for example, + # `@loader_path/../lib` in case of the Anaconda python), all libraries loaded within the python process are able + # to resolve the shared libraries within the environment's shared lib directory without using LC_RPATH commands + # themselves. + # + # Our analysis does not account for inherited run-paths, and we attempt to work around this limitation by + # registering the following fall-back run-path. + run_paths.add(os.path.join(compat.base_prefix, 'lib')) + + def _resolve_using_loader_path(lib, bin_path, python_bin_path): + # macholib does not support @loader_path, so replace it with @executable_path. Strictly speaking, @loader_path + # should be anchored to parent directory of analyzed binary (`bin_path`), while @executable_path should be + # anchored to the parent directory of the process' executable. Typically, this would be python executable + # (`python_bin_path`), unless we are analyzing a collected 3rd party executable. In that case, `bin_path` + # is correct option. So we first try resolving using `bin_path`, and then fall back to `python_bin_path`. + # This does not account for transitive run paths of higher-order dependencies, but there is only so much we + # can do here... + if lib.startswith('@loader_path'): + lib = lib.replace('@loader_path', '@executable_path') + + try: + # Try resolving with binary's path first... + return dyld_find(lib, executable_path=bin_path) + except ValueError: + # ... and fall-back to resolving with python executable's path + try: + return dyld_find(lib, executable_path=python_bin_path) + except ValueError: + return None + + def _resolve_using_path(lib): + # Absolute paths should not be resolved; we should just check whether the library exists or not. This used to + # be done using macholib's dyld_find() as well (as it properly handles system libraries that are hidden on + # Big Sur and later), but it turns out that even if given an absolute path, it gives precedence to search paths + # from DYLD_LIBRARY_PATH. This leads to confusing errors when directory in DYLD_LIBRARY_PATH contains a file + # (shared library or data file) that happens to have the same name as a library from a system framework. + if os.path.isabs(lib): + if _dyld_shared_cache_contains_path is not None and _dyld_shared_cache_contains_path(lib): + return lib + if os.path.isfile(lib): + return lib + return None + + try: + return dyld_find(lib) + except ValueError: + return None + + # Try to resolve full path of the referenced libraries. + for referenced_lib in referenced_libs: + resolved_lib = None + + # If path starts with @rpath, we have to handle it ourselves. + if referenced_lib.startswith('@rpath'): + lib = os.path.join(*referenced_lib.split(os.sep)[1:]) # Remove the @rpath/ prefix + + # Try all run paths. + for run_path in run_paths: + # Join the path. + lib_path = os.path.join(run_path, lib) + + if lib_path.startswith(("@executable_path", "@loader_path")): + # Run path starts with @executable_path or @loader_path. + lib_path = _resolve_using_loader_path(lib_path, bin_path, python_bin_path) + else: + # If run path was relative, anchor it to binary's location. + if not os.path.isabs(lib_path): + os.path.join(bin_path, lib_path) + lib_path = _resolve_using_path(lib_path) + + if lib_path and os.path.exists(lib_path): + resolved_lib = lib_path + break + else: + if referenced_lib.startswith(("@executable_path", "@loader_path")): + resolved_lib = _resolve_using_loader_path(referenced_lib, bin_path, python_bin_path) + else: + resolved_lib = _resolve_using_path(referenced_lib) + + # Fall back to searching the supplied search paths, if any. + if not resolved_lib: + resolved_lib = _resolve_library_path_in_search_paths( + os.path.basename(referenced_lib), # Search for basename of the referenced name. + search_paths, + ) + + # Normalize the resolved path, to remove any extraneous "../" elements. + if resolved_lib: + resolved_lib = os.path.normpath(resolved_lib) + + # Return referenced library name as-is instead of computing a basename. Full referenced name carries additional + # information that might be useful for the caller to determine how to deal with unresolved library (e.g., ignore + # unresolved libraries that are supposed to be located in system-wide directories). + output.add((referenced_lib, resolved_lib)) + + return output + + +#- Library full path resolution + + +def resolve_library_path(name, search_paths=None): + """ + Given a library name, attempt to resolve full path to that library. The search for library is done via + platform-specific mechanism and fall back to optionally-provided list of search paths. Returns None if library + cannot be resolved. If give library name is already an absolute path, the given path is returned without any + processing. + """ + # No-op if path is already absolute. + if os.path.isabs(name): + return name + + if compat.is_unix: + # Use platform-specific helper. + fullpath = _resolve_library_path_unix(name) + if fullpath: + return fullpath + # Fall back to searching the supplied search paths, if any + return _resolve_library_path_in_search_paths(name, search_paths) + elif compat.is_win: + # Try the caller-supplied search paths, if any. + fullpath = _resolve_library_path_in_search_paths(name, search_paths) + if fullpath: + return fullpath + + # Fall back to default Windows search paths, using the PATH environment variable (which should also include + # the system paths, such as c:\windows and c:\windows\system32) + win_search_paths = [path for path in compat.getenv('PATH', '').split(os.pathsep) if path] + return _resolve_library_path_in_search_paths(name, win_search_paths) + else: + return ctypes.util.find_library(name) + + return None + + +# Compatibility aliases for hooks from contributed hooks repository. All of these now point to the high-level +# `resolve_library_path`. +findLibrary = resolve_library_path +findSystemLibrary = resolve_library_path + + +def _resolve_library_path_in_search_paths(name, search_paths=None): + """ + Low-level helper for resolving given library name to full path in given list of search paths. + """ + for search_path in search_paths or []: + fullpath = os.path.join(search_path, name) + if not os.path.isfile(fullpath): + continue + + # On Windows, ensure that architecture matches that of running python interpreter. + if compat.is_win: + try: + dll_machine_type = winutils.get_pe_file_machine_type(fullpath) + except Exception: + # A search path might contain a DLL that we cannot analyze; for example, a stub file. Skip over. + continue + if dll_machine_type != _exe_machine_type: + continue + + return os.path.normpath(fullpath) + + return None + + +def _resolve_library_path_unix(name): + """ + UNIX-specific helper for resolving library path. + + Emulates the algorithm used by dlopen. `name` must include the prefix, e.g., ``libpython2.4.so``. + """ + assert compat.is_unix, "Current implementation for Unix only (Linux, Solaris, AIX, FreeBSD)" + + if name.endswith('.so') or '.so.' in name: + # We have been given full library name that includes suffix. Use `_resolve_library_path_in_search_paths` to find + # the exact match. + lib_search_func = _resolve_library_path_in_search_paths + else: + # We have been given a library name without suffix. Use `_which_library` as search function, which will try to + # find library with matching basename. + lib_search_func = _which_library + + # Look in the LD_LIBRARY_PATH according to platform. + if compat.is_aix: + lp = compat.getenv('LIBPATH', '') + elif compat.is_darwin: + lp = compat.getenv('DYLD_LIBRARY_PATH', '') + else: + lp = compat.getenv('LD_LIBRARY_PATH', '') + lib = lib_search_func(name, filter(None, lp.split(os.pathsep))) + + # Look in /etc/ld.so.cache + # Solaris does not have /sbin/ldconfig. Just check if this file exists. + if lib is None: + utils.load_ldconfig_cache() + lib = utils.LDCONFIG_CACHE.get(name) + if lib: + assert os.path.isfile(lib) + + # Look in the known safe paths. + if lib is None: + # Architecture independent locations. + paths = ['/lib', '/usr/lib'] + # Architecture dependent locations. + if compat.architecture == '32bit': + paths.extend(['/lib32', '/usr/lib32']) + else: + paths.extend(['/lib64', '/usr/lib64']) + # Machine dependent locations. + if compat.machine == 'intel': + if compat.architecture == '32bit': + paths.extend(['/usr/lib/i386-linux-gnu']) + else: + paths.extend(['/usr/lib/x86_64-linux-gnu']) + + # On Debian/Ubuntu /usr/bin/python is linked statically with libpython. Newer Debian/Ubuntu with multiarch + # support puts the libpythonX.Y.so in paths like /usr/lib/i386-linux-gnu/. Try to query the arch-specific + # sub-directory, if available. + arch_subdir = sysconfig.get_config_var('multiarchsubdir') + if arch_subdir: + arch_subdir = os.path.basename(arch_subdir) + paths.append(os.path.join('/usr/lib', arch_subdir)) + else: + logger.debug('Multiarch directory not detected.') + + # Termux (a Ubuntu like subsystem for Android) has an additional libraries directory. + if os.path.isdir('/data/data/com.termux/files/usr/lib'): + paths.append('/data/data/com.termux/files/usr/lib') + + if compat.is_aix: + paths.append('/opt/freeware/lib') + elif compat.is_hpux: + if compat.architecture == '32bit': + paths.append('/usr/local/lib/hpux32') + else: + paths.append('/usr/local/lib/hpux64') + elif compat.is_freebsd or compat.is_openbsd: + paths.append('/usr/local/lib') + lib = lib_search_func(name, paths) + + return lib + + +def _which_library(name, dirs): + """ + Search for a shared library in a list of directories. + + Args: + name: + The library name including the `lib` prefix but excluding any `.so` suffix. + dirs: + An iterable of folders to search in. + Returns: + The path to the library if found or None otherwise. + + """ + matcher = _library_matcher(name) + for path in filter(os.path.exists, dirs): + for _path in os.listdir(path): + if matcher(_path): + return os.path.join(path, _path) + + +def _library_matcher(name): + """ + Create a callable that matches libraries if **name** is a valid library prefix for input library full names. + """ + return re.compile(name + r"[0-9]*\.").match + + +#- Python shared library search + + +def get_python_library_path(): + """ + Find Python shared library that belongs to the current interpreter. + + Return full path to Python dynamic library or None when not found. + + PyInstaller needs to collect the Python shared library, so that bootloader can load it, import Python C API + symbols, and use them to set up the embedded Python interpreter. + + The name of the shared library is typically fixed (`python3.X.dll` on Windows, libpython3.X.so on Unix systems, + and `libpython3.X.dylib` on macOS for shared library builds and `Python.framework/Python` for framework build). + Its location can usually be inferred from the Python interpreter executable, when the latter is dynamically + linked against the shared library. + + However, some situations require extra handling due to various quirks; for example, debian-based some linux + distributions statically link the Python interpreter executable against the Python library, while also providing + a shared library variant for external users. + """ + def _find_lib_in_libdirs(*libdirs): + for libdir in libdirs: + for name in compat.PYDYLIB_NAMES: + full_path = os.path.join(libdir, name) + if not os.path.exists(full_path): + continue + # Resolve potential symbolic links to achieve consistent results with linker-based search; e.g., on + # POSIX systems, linker resolves unversioned library names (python3.X.so) to versioned ones + # (libpython3.X.so.1.0) due to former being symbolic linkes to the latter. See #6831. + full_path = os.path.realpath(full_path) + if not os.path.exists(full_path): + continue + return full_path + return None + + # If this is Microsoft App Store Python, check the compat.base_path first. While compat.python_executable resolves + # to actual python.exe file, the latter contains a relative library reference that we fail to properly resolve. + if compat.is_ms_app_store: + python_libname = _find_lib_in_libdirs(compat.base_prefix) + if python_libname: + return python_libname + + # Try to get Python library name from the Python executable. It assumes that Python library is not statically + # linked. + imported_libraries = get_imports(compat.python_executable) # (name, fullpath) tuples + for _, lib_path in imported_libraries: + if lib_path is None: + continue # Skip unresolved imports + for name in compat.PYDYLIB_NAMES: + if os.path.normcase(os.path.basename(lib_path)) == name: + # Python library found. Return absolute path to it. + return lib_path + + # Work around for Python venv having VERSION.dll rather than pythonXY.dll + if compat.is_win and any([os.path.normcase(lib_name) == 'version.dll' for lib_name, _ in imported_libraries]): + pydll = 'python%d%d.dll' % sys.version_info[:2] + return resolve_library_path(pydll, [os.path.dirname(compat.python_executable)]) + + # Search the `sys.base_prefix` and `lib` directory in `sys.base_prefix`. + # This covers various Python installations in case we fail to infer the shared library location for whatever reason; + # Anaconda Python, `uv` and `rye` Python, etc. + python_libname = _find_lib_in_libdirs( + compat.base_prefix, + os.path.join(compat.base_prefix, 'lib'), + ) + if python_libname: + return python_libname + + # On Unix-like systems, perform search in the configured library search locations. This should be done after + # exhausting all other options; it primarily caters to debian-packaged Python, but we need to make sure that we do + # not collect shared library from system-installed Python when the current interpreter is in fact some other Python + # build (for example, `uv` or `rye` Python of the same version as system-installed Python). + if compat.is_unix: + for name in compat.PYDYLIB_NAMES: + python_libname = resolve_library_path(name) + if python_libname: + return python_libname + + # Python library NOT found. Return None and let the caller deal with this. + return None + + +#- Binary vs data (re)classification + + +def classify_binary_vs_data(filename): + """ + Classify the given file as either BINARY or a DATA, using appropriate platform-specific method. Returns 'BINARY' + or 'DATA' string depending on the determined file type, or None if classification cannot be performed (non-existing + file, missing tool, and other errors during classification). + """ + + # We cannot classify non-existent files. + if not os.path.isfile(filename): + return None + + # Use platform-specific implementation. + return _classify_binary_vs_data(filename) + + +if compat.is_linux: + + def _classify_binary_vs_data(filename): + # First check for ELF signature, in order to avoid calling `objdump` on every data file, which can be costly. + try: + with open(filename, 'rb') as fp: + sig = fp.read(4) + except Exception: + return None + + if sig != b"\x7FELF": + return "DATA" + + # Verify the binary by checking if `objdump` recognizes the file. The preceding ELF signature check should + # ensure that this is an ELF file, while this check should ensure that it is a valid ELF file. In the future, + # we could try checking that the architecture matches the running platform. + cmd_args = ['objdump', '-a', filename] + try: + p = subprocess.run( + cmd_args, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + stdin=subprocess.DEVNULL, + encoding='utf8', + ) + except Exception: + return None # Failed to run `objdump` or `objdump` unavailable. + + return 'BINARY' if p.returncode == 0 else 'DATA' + +elif compat.is_win: + + def _classify_binary_vs_data(filename): + import pefile + + # First check for MZ signature, which should allow us to quickly classify the majority of data files. + try: + with open(filename, 'rb') as fp: + sig = fp.read(2) + except Exception: + return None + + if sig != b"MZ": + return "DATA" + + # Check if the file can be opened using `pefile`. + try: + with pefile.PE(filename, fast_load=True) as pe: # noqa: F841 + pass + return 'BINARY' + except pefile.PEFormatError: + return 'DATA' + except Exception: + pass + + return None + +elif compat.is_darwin: + + def _classify_binary_vs_data(filename): + # See if the file can be opened using `macholib`. + import macholib.MachO + + try: + macho = macholib.MachO.MachO(filename) # noqa: F841 + return 'BINARY' + except Exception: + # TODO: catch only `ValueError`? + pass + + return 'DATA' + +else: + + def _classify_binary_vs_data(filename): + # Classification not implemented for the platform. + return None diff --git a/venv/Lib/site-packages/PyInstaller/depend/bytecode.py b/venv/Lib/site-packages/PyInstaller/depend/bytecode.py new file mode 100644 index 0000000..bd633ef --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/depend/bytecode.py @@ -0,0 +1,337 @@ +# -*- coding: utf-8 -*- +""" +Tools for searching bytecode for key statements that indicate the need for additional resources, such as data files +and package metadata. + +By *bytecode* I mean the ``code`` object given by ``compile()``, accessible from the ``__code__`` attribute of any +non-builtin function or, in PyInstallerLand, the ``PyiModuleGraph.node("some.module").code`` attribute. The best +guide for bytecode format I have found is the disassembler reference: https://docs.python.org/3/library/dis.html + +This parser implementation aims to combine the flexibility and speed of regex with the clarity of the output of +``dis.dis(code)``. It has not achieved the 2nd, but C'est la vie... + +The biggest clarity killer here is the ``EXTENDED_ARG`` opcode which can appear almost anywhere and therefore needs +to be tiptoed around at every step. If this code needs to expand significantly, I would recommend an upgrade to a +regex-based grammar parsing library such as Reparse. This way, little steps like unpacking ``EXTENDED_ARGS`` can be +defined once then simply referenced forming a nice hierarchy rather than copied everywhere its needed. +""" + +import dis +import re +from types import CodeType +from typing import Pattern + +from PyInstaller import compat + +# opcode name -> opcode map +# Python 3.11 introduced specialized opcodes that are not covered by opcode.opmap (and equivalent dis.opmap), but dis +# has a private map of all opcodes called _all_opmap. So use the latter, if available. +opmap = getattr(dis, '_all_opmap', dis.opmap) + + +def _instruction_to_regex(x: str): + """ + Get a regex-escaped opcode byte from its human readable name. + """ + return re.escape(bytes([opmap[x]])) + + +def bytecode_regex(pattern: bytes, flags=re.VERBOSE | re.DOTALL): + """ + A regex-powered Python bytecode matcher. + + ``bytecode_regex`` provides a very thin wrapper around :func:`re.compile`. + + * Any opcode names wrapped in backticks are substituted for their corresponding opcode bytes. + * Patterns are compiled in VERBOSE mode by default so that whitespace and comments may be used. + + This aims to mirror the output of :func:`dis.dis`, which is far more readable than looking at raw byte strings. + """ + assert isinstance(pattern, bytes) + + # Replace anything wrapped in backticks with regex-escaped opcodes. + pattern = re.sub( + rb"`(\w+)`", + lambda m: _instruction_to_regex(m[1].decode()), + pattern, + ) + return re.compile(pattern, flags=flags) + + +def finditer(pattern: Pattern, string: bytes): + """ + Call ``pattern.finditer(string)``, but remove any matches beginning on an odd byte (i.e., matches where + match.start() is not a multiple of 2). + + This should be used to avoid false positive matches where a bytecode pair's argument is mistaken for an opcode. + """ + assert isinstance(string, bytes) + string = _cleanup_bytecode_string(string) + matches = pattern.finditer(string) + while True: + for match in matches: + if match.start() % 2 == 0: + # All is good. This match starts on an OPCODE. + yield match + else: + # This match has started on an odd byte, meaning that it is a false positive and should be skipped. + # There is a very slim chance that a genuine match overlaps this one and, because re.finditer() does not + # allow overlapping matches, it would be lost. To avoid that, restart the regex scan, starting at the + # next even byte. + matches = pattern.finditer(string, match.start() + 1) + break + else: + break + + +# Opcodes involved in function calls with constant arguments. The differences between python versions are handled by +# variables below, which are then used to construct the _call_function_bytecode regex. +# NOTE1: the _OPCODES_* entries are typically used in (non-capturing) groups that match the opcode plus an arbitrary +# argument. But because the entries themselves may contain more than on opcode (with OR operator between them), they +# themselves need to be enclosed in another (non-capturing) group. E.g., "(?:(?:_OPCODES_FUNCTION_GLOBAL).)". +# NOTE2: _OPCODES_EXTENDED_ARG2 is an exception, as it is used as a list of opcodes to exclude, i.e., +# "[^_OPCODES_EXTENDED_ARG2]". Therefore, multiple opcodes are not separated by the OR operator. +if not compat.is_py311: + # Python 3.7 introduced two new function-related opcodes, LOAD_METHOD and CALL_METHOD + _OPCODES_EXTENDED_ARG = rb"`EXTENDED_ARG`" + _OPCODES_EXTENDED_ARG2 = _OPCODES_EXTENDED_ARG + _OPCODES_FUNCTION_GLOBAL = rb"`LOAD_NAME`|`LOAD_GLOBAL`|`LOAD_FAST`" + _OPCODES_FUNCTION_LOAD = rb"`LOAD_ATTR`|`LOAD_METHOD`" + _OPCODES_FUNCTION_ARGS = rb"`LOAD_CONST`" + _OPCODES_FUNCTION_CALL = rb"`CALL_FUNCTION`|`CALL_METHOD`|`CALL_FUNCTION_EX`" + + def _cleanup_bytecode_string(bytecode): + return bytecode # Nothing to do here +elif not compat.is_py312: + # Python 3.11 removed CALL_FUNCTION and CALL_METHOD, and replaced them with PRECALL + CALL instruction sequence. + # As both PRECALL and CALL have the same parameter (the argument count), we need to match only up to the PRECALL. + # The CALL_FUNCTION_EX is still present. + # From Python 3.11b1 on, there is an EXTENDED_ARG_QUICK specialization opcode present. + _OPCODES_EXTENDED_ARG = rb"`EXTENDED_ARG`|`EXTENDED_ARG_QUICK`" + _OPCODES_EXTENDED_ARG2 = rb"`EXTENDED_ARG``EXTENDED_ARG_QUICK`" # Special case; see note above the if/else block! + _OPCODES_FUNCTION_GLOBAL = rb"`LOAD_NAME`|`LOAD_GLOBAL`|`LOAD_FAST`" + _OPCODES_FUNCTION_LOAD = rb"`LOAD_ATTR`|`LOAD_METHOD`" + _OPCODES_FUNCTION_ARGS = rb"`LOAD_CONST`" + _OPCODES_FUNCTION_CALL = rb"`PRECALL`|`CALL_FUNCTION_EX`" + + # Starting with python 3.11, the bytecode is peppered with CACHE instructions (which dis module conveniently hides + # unless show_caches=True is used). Dealing with these CACHE instructions in regex rules is going to render them + # unreadable, so instead we pre-process the bytecode and filter the offending opcodes out. + _cache_instruction_filter = bytecode_regex(rb"(`CACHE`.)|(..)") + + def _cleanup_bytecode_string(bytecode): + return _cache_instruction_filter.sub(rb"\2", bytecode) +else: + # Python 3.12 merged EXTENDED_ARG_QUICK back in to EXTENDED_ARG, and LOAD_METHOD in to LOAD_ATTR + # PRECALL is no longer a valid key + _OPCODES_EXTENDED_ARG = rb"`EXTENDED_ARG`" + _OPCODES_EXTENDED_ARG2 = _OPCODES_EXTENDED_ARG + _OPCODES_FUNCTION_GLOBAL = rb"`LOAD_NAME`|`LOAD_GLOBAL`|`LOAD_FAST`" + _OPCODES_FUNCTION_LOAD = rb"`LOAD_ATTR`" + _OPCODES_FUNCTION_ARGS = rb"`LOAD_CONST`" + _OPCODES_FUNCTION_CALL = rb"`CALL`|`CALL_FUNCTION_EX`" + + # In Python 3.13, PUSH_NULL opcode is emitted after the LOAD_NAME (and after LOAD_ATTR opcode(s), if applicable). + # In python 3.11 and 3.12, it was emitted before the LOAD_NAME, and thus fell outside of our regex matching; now, + # we have to deal with it. But, instead of trying to add it to matching rules and adjusting the post-processing + # to deal with it, we opt to filter them out (at the same time as we filter out CACHE opcodes), and leave the rest + # of processing untouched. + if compat.is_py313: + _cache_instruction_filter = bytecode_regex(rb"(`CACHE`.)|(`PUSH_NULL`.)|(..)") + + def _cleanup_bytecode_string(bytecode): + return _cache_instruction_filter.sub(rb"\3", bytecode) + else: + _cache_instruction_filter = bytecode_regex(rb"(`CACHE`.)|(..)") + + def _cleanup_bytecode_string(bytecode): + return _cache_instruction_filter.sub(rb"\2", bytecode) + + +# language=PythonVerboseRegExp +_call_function_bytecode = bytecode_regex( + rb""" + # Matches `global_function('some', 'constant', 'arguments')`. + + # Load the global function. In code with >256 of names, this may require extended name references. + ( + (?:(?:""" + _OPCODES_EXTENDED_ARG + rb""").)* + (?:(?:""" + _OPCODES_FUNCTION_GLOBAL + rb""").) + ) + + # For foo.bar.whizz(), the above is the 'foo', below is the 'bar.whizz' (one opcode per name component, each + # possibly preceded by name reference extension). + ( + (?: + (?:(?:""" + _OPCODES_EXTENDED_ARG + rb""").)* + (?:""" + _OPCODES_FUNCTION_LOAD + rb"""). + )* + ) + + # Load however many arguments it takes. These (for now) must all be constants. + # Again, code with >256 constants may need extended enumeration. + ( + (?: + (?:(?:""" + _OPCODES_EXTENDED_ARG + rb""").)* + (?:""" + _OPCODES_FUNCTION_ARGS + rb"""). + )* + ) + + # Call the function. If opcode is CALL_FUNCTION_EX, the parameter are flags. For other opcodes, the parameter + # is the argument count (which may be > 256). + ( + (?:(?:""" + _OPCODES_EXTENDED_ARG + rb""").)* + (?:""" + _OPCODES_FUNCTION_CALL + rb"""). + ) +""" +) + +# language=PythonVerboseRegExp +_extended_arg_bytecode = bytecode_regex( + rb"""( + # Arbitrary number of EXTENDED_ARG pairs. + (?:(?:""" + _OPCODES_EXTENDED_ARG + rb""").)* + + # Followed by some other instruction (usually a LOAD). + [^""" + _OPCODES_EXTENDED_ARG2 + rb"""]. +)""" +) + + +def extended_arguments(extended_args: bytes): + """ + Unpack the (extended) integer used to reference names or constants. + + The input should be a bytecode snippet of the following form:: + + EXTENDED_ARG ? # Repeated 0-4 times. + LOAD_xxx ? # Any of LOAD_NAME/LOAD_CONST/LOAD_METHOD/... + + Each ? byte combined together gives the number we want. + """ + return int.from_bytes(extended_args[1::2], "big") + + +def load(raw: bytes, code: CodeType) -> str: + """ + Parse an (extended) LOAD_xxx instruction. + """ + # Get the enumeration. + index = extended_arguments(raw) + + # Work out what that enumeration was for (constant/local var/global var). + + # If the last instruction byte is a LOAD_FAST: + if raw[-2] == opmap["LOAD_FAST"]: + # Then this is a local variable. + return code.co_varnames[index] + # Or if it is a LOAD_CONST: + if raw[-2] == opmap["LOAD_CONST"]: + # Then this is a literal. + return code.co_consts[index] + # Otherwise, it is a global name. + if compat.is_py311 and raw[-2] == opmap["LOAD_GLOBAL"]: + # In python 3.11, namei>>1 is pushed on stack... + return code.co_names[index >> 1] + if compat.is_py312 and raw[-2] == opmap["LOAD_ATTR"]: + # In python 3.12, namei>>1 is pushed on stack... + return code.co_names[index >> 1] + + return code.co_names[index] + + +def loads(raw: bytes, code: CodeType) -> list: + """ + Parse multiple consecutive LOAD_xxx instructions. Or load() in a for loop. + + May be used to unpack a function's parameters or nested attributes ``(foo.bar.pop.whack)``. + """ + return [load(i, code) for i in _extended_arg_bytecode.findall(raw)] + + +def function_calls(code: CodeType) -> list: + """ + Scan a code object for all function calls on constant arguments. + """ + match: re.Match + out = [] + + for match in finditer(_call_function_bytecode, code.co_code): + function_root, methods, args, function_call = match.groups() + + # For foo(): + # `function_root` contains 'foo' and `methods` is empty. + # For foo.bar.whizz(): + # `function_root` contains 'foo' and `methods` contains the rest. + function_root = load(function_root, code) + methods = loads(methods, code) + function = ".".join([function_root] + methods) + + args = loads(args, code) + if function_call[0] == opmap['CALL_FUNCTION_EX']: + flags = extended_arguments(function_call) + if flags != 0: + # Keyword arguments present. Unhandled at the moment. + continue + # In calls with const arguments, args contains a single + # tuple with all values. + if len(args) != 1 or not isinstance(args[0], tuple): + continue + args = list(args[0]) + else: + arg_count = extended_arguments(function_call) + + if arg_count != len(args): + # This happens if there are variable or keyword arguments. Bail out in either case. + continue + + out.append((function, args)) + + return out + + +def search_recursively(search: callable, code: CodeType, _memo=None) -> dict: + """ + Apply a search function to a code object, recursing into child code objects (function definitions). + """ + if _memo is None: + _memo = {} + if code not in _memo: + _memo[code] = search(code) + for const in code.co_consts: + if isinstance(const, CodeType): + search_recursively(search, const, _memo) + return _memo + + +def recursive_function_calls(code: CodeType) -> dict: + """ + Scan a code object for function calls on constant arguments, recursing into function definitions and bodies of + comprehension loops. + """ + return search_recursively(function_calls, code) + + +def any_alias(full_name: str): + """List possible aliases of a fully qualified Python name. + + >>> list(any_alias("foo.bar.wizz")) + ['foo.bar.wizz', 'bar.wizz', 'wizz'] + + This crudely allows us to capture uses of wizz() under any of + :: + import foo + foo.bar.wizz() + :: + from foo import bar + bar.wizz() + :: + from foo.bar import wizz + wizz() + + However, it will fail for any form of aliases and quite likely find false matches. + """ + parts = full_name.split('.') + while parts: + yield ".".join(parts) + parts = parts[1:] diff --git a/venv/Lib/site-packages/PyInstaller/depend/dylib.py b/venv/Lib/site-packages/PyInstaller/depend/dylib.py new file mode 100644 index 0000000..32cbd28 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/depend/dylib.py @@ -0,0 +1,361 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Manipulating with dynamic libraries. +""" + +import os +import pathlib +import re + +from PyInstaller import compat +import PyInstaller.log as logging + +logger = logging.getLogger(__name__) + +# Ignoring some system libraries speeds up packaging process +_excludes = { + # Ignore annoying warnings with Windows system DLLs. + # + # 'W: library kernel32.dll required via ctypes not found' + # 'W: library coredll.dll required via ctypes not found' + # + # These these dlls has to be ignored for all operating systems because they might be resolved when scanning code for + # ctypes dependencies. + r'advapi32\.dll', + r'ws2_32\.dll', + r'gdi32\.dll', + r'oleaut32\.dll', + r'shell32\.dll', + r'ole32\.dll', + r'coredll\.dll', + r'crypt32\.dll', + r'kernel32', + r'kernel32\.dll', + r'msvcrt\.dll', + r'rpcrt4\.dll', + r'user32\.dll', + # Some modules tries to import the Python library. e.g. pyreadline.console.console + r'python\%s\%s', +} + +# Regex includes - overrides excludes. Include list is used only to override specific libraries from exclude list. +_includes = set() + +_win_includes = { + # We need to allow collection of Visual Studio C++ (VC) runtime DLLs from system directories in order to avoid + # missing DLL errors when the frozen application is run on a system that does not have the corresponding VC + # runtime installed. The VC runtime DLLs may be dependencies of python shared library itself or of extension + # modules provided by 3rd party packages. + + # Visual Studio 2010 (VC10) runtime + # http://msdn.microsoft.com/en-us/library/8kche8ah(v=vs.100).aspx + r'atl100\.dll', + r'msvcr100\.dll', + r'msvcp100\.dll', + r'mfc100\.dll', + r'mfc100u\.dll', + r'mfcmifc80\.dll', + r'mfcm100\.dll', + r'mfcm100u\.dll', + + # Visual Studio 2012 (VC11) runtime + # https://docs.microsoft.com/en-us/visualstudio/releases/2013/2012-redistribution-vs + # + # VC110.ATL + r'atl110\.dll', + # VC110.CRT + r'msvcp110\.dll', + r'msvcr110\.dll', + r'vccorlib110\.dll', + # VC110.CXXAMP + r'vcamp110\.dll', + # VC110.MFC + r'mfc110\.dll', + r'mfc110u\.dll', + r'mfcm110\.dll', + r'mfcm110u\.dll', + # VC110.MFCLOC + r'mfc110chs\.dll', + r'mfc110cht\.dll', + r'mfc110enu\.dll', + r'mfc110esn\.dll', + r'mfc110deu\.dll', + r'mfc110fra\.dll', + r'mfc110ita\.dll', + r'mfc110jpn\.dll', + r'mfc110kor\.dll', + r'mfc110rus\.dll', + # VC110.OpenMP + r'vcomp110\.dll', + # DIA SDK + r'msdia110\.dll', + + # Visual Studio 2013 (VC12) runtime + # https://docs.microsoft.com/en-us/visualstudio/releases/2013/2013-redistribution-vs + # + # VC120.CRT + r'msvcp120\.dll', + r'msvcr120\.dll', + r'vccorlib120\.dll', + # VC120.CXXAMP + r'vcamp120\.dll', + # VC120.MFC + r'mfc120\.dll', + r'mfc120u\.dll', + r'mfcm120\.dll', + r'mfcm120u\.dll', + # VC120.MFCLOC + r'mfc120chs\.dll', + r'mfc120cht\.dll', + r'mfc120deu\.dll', + r'mfc120enu\.dll', + r'mfc120esn\.dll', + r'mfc120fra\.dll', + r'mfc120ita\.dll', + r'mfc120jpn\.dll', + r'mfc120kor\.dll', + r'mfc120rus\.dll', + # VC120.OPENMP + r'vcomp120\.dll', + # DIA SDK + r'msdia120\.dll', + # Cpp REST Windows SDK + r'casablanca120.winrt\.dll', + # Mobile Services Cpp Client + r'zumosdk120.winrt\.dll', + # Cpp REST SDK + r'casablanca120\.dll', + + # Universal C Runtime Library (since Visual Studio 2015) + # + # NOTE: these should be put under a switch, as they need not to be bundled if deployment target is Windows 10 + # and later, as "UCRT is now a system component in Windows 10 and later, managed by Windows Update". + # (https://docs.microsoft.com/en-us/cpp/windows/determining-which-dlls-to-redistribute?view=msvc-170) + # And as discovered in #6326, Windows prefers system-installed version over the bundled one, anyway + # (see https://docs.microsoft.com/en-us/cpp/windows/universal-crt-deployment?view=msvc-170#local-deployment). + r'api-ms-win-core.*', + r'api-ms-win-crt.*', + r'ucrtbase\.dll', + + # Visual Studio 2015/2017/2019/2022 (VC14) runtime + # https://docs.microsoft.com/en-us/visualstudio/releases/2022/redistribution + # + # VC141.CRT/VC142.CRT/VC143.CRT + r'concrt140\.dll', + r'msvcp140\.dll', + r'msvcp140_1\.dll', + r'msvcp140_2\.dll', + r'msvcp140_atomic_wait\.dll', + r'msvcp140_codecvt_ids\.dll', + r'vccorlib140\.dll', + r'vcruntime140\.dll', + r'vcruntime140_1\.dll', + # VC141.CXXAMP/VC142.CXXAMP/VC143.CXXAMP + r'vcamp140\.dll', + # VC141.OpenMP/VC142.OpenMP/VC143.OpenMP + r'vcomp140\.dll', + # DIA SDK + r'msdia140\.dll', + + # Allow pythonNN.dll, pythoncomNN.dll, pywintypesNN.dll + r'py(?:thon(?:com(?:loader)?)?|wintypes)\d+\.dll', +} + +_win_excludes = { + # On Windows, only .dll files can be loaded. + r'.*\.so', + r'.*\.dylib', + + # MS assembly excludes + r'Microsoft\.Windows\.Common-Controls', +} + +_unix_excludes = { + r'libc\.so(\..*)?', + r'libdl\.so(\..*)?', + r'libm\.so(\..*)?', + r'libpthread\.so(\..*)?', + r'librt\.so(\..*)?', + r'libthread_db\.so(\..*)?', + # glibc regex excludes. + r'ld-linux\.so(\..*)?', + r'libBrokenLocale\.so(\..*)?', + r'libanl\.so(\..*)?', + r'libcidn\.so(\..*)?', + r'libcrypt\.so(\..*)?', + r'libnsl\.so(\..*)?', + r'libnss_compat.*\.so(\..*)?', + r'libnss_dns.*\.so(\..*)?', + r'libnss_files.*\.so(\..*)?', + r'libnss_hesiod.*\.so(\..*)?', + r'libnss_nis.*\.so(\..*)?', + r'libnss_nisplus.*\.so(\..*)?', + r'libresolv\.so(\..*)?', + r'libutil\.so(\..*)?', + # graphical interface libraries come with graphical stack (see libglvnd) + r'libE?(Open)?GLX?(ESv1_CM|ESv2)?(dispatch)?\.so(\..*)?', + r'libdrm\.so(\..*)?', + # a subset of libraries included as part of the Nvidia Linux Graphics Driver as of 520.56.06: + # https://download.nvidia.com/XFree86/Linux-x86_64/520.56.06/README/installedcomponents.html + r'nvidia_drv\.so', + r'libglxserver_nvidia\.so(\..*)?', + r'libnvidia-egl-(gbm|wayland)\.so(\..*)?', + r'libnvidia-(cfg|compiler|e?glcore|glsi|glvkspirv|rtcore|allocator|tls|ml)\.so(\..*)?', + r'lib(EGL|GLX)_nvidia\.so(\..*)?', + # libcuda.so, libcuda.so.1, and libcuda.so.{version} are run-time part of NVIDIA driver, and should not be + # collected, as they need to match the rest of driver components on the target system. + r'libcuda\.so(\..*)?', + r'libcudadebugger\.so(\..*)?', + # libxcb-dri changes ABI frequently (e.g.: between Ubuntu LTS releases) and is usually installed as dependency of + # the graphics stack anyway. No need to bundle it. + r'libxcb\.so(\..*)?', + r'libxcb-dri.*\.so(\..*)?', +} + +_aix_excludes = { + r'libbz2\.a', + r'libc\.a', + r'libC\.a', + r'libcrypt\.a', + r'libdl\.a', + r'libintl\.a', + r'libpthreads\.a', + r'librt\\.a', + r'librtl\.a', + r'libz\.a', +} + +if compat.is_win: + _includes |= _win_includes + _excludes |= _win_excludes +elif compat.is_aix: + # The exclude list for AIX differs from other *nix platforms. + _excludes |= _aix_excludes +elif compat.is_unix: + # Common excludes for *nix platforms -- except AIX. + _excludes |= _unix_excludes + + +class MatchList: + def __init__(self, entries): + self._regex = re.compile('|'.join(entries), re.I) if entries else None + + def check_library(self, libname): + if self._regex: + return self._regex.match(os.path.basename(libname)) + return False + + +if compat.is_darwin: + import macholib.util + + class MacExcludeList(MatchList): + def __init__(self, entries): + super().__init__(entries) + + def check_library(self, libname): + # Try the global exclude list. + result = super().check_library(libname) + if result: + return result + + # Exclude libraries in standard system locations. + return macholib.util.in_system_path(libname) + + exclude_list = MacExcludeList(_excludes) + include_list = MatchList(_includes) + +elif compat.is_win: + from PyInstaller.utils.win32 import winutils + + class WinExcludeList(MatchList): + def __init__(self, entries): + super().__init__(entries) + + self._windows_dir = pathlib.Path(winutils.get_windows_dir()).resolve() + + # When running as SYSTEM user, the home directory is `%WINDIR%\system32\config\systemprofile`. + self._home_dir = pathlib.Path.home().resolve() + self._system_home = self._windows_dir in self._home_dir.parents + + def check_library(self, libname): + # Try the global exclude list. The global exclude list contains lower-cased names, so lower-case the input + # for case-normalized comparison. + result = super().check_library(libname.lower()) + if result: + return result + + # Exclude everything from the Windows directory by default; but allow contents of user's gome directory if + # that happens to be rooted under Windows directory (e.g., when running PyInstaller as SYSTEM user). + lib_fullpath = pathlib.Path(libname).resolve() + exclude = self._windows_dir in lib_fullpath.parents + if exclude and self._system_home and self._home_dir in lib_fullpath.parents: + exclude = False + return exclude + + exclude_list = WinExcludeList(_excludes) + include_list = MatchList(_includes) +else: + exclude_list = MatchList(_excludes) + include_list = MatchList(_includes) + +_seen_wine_dlls = set() # Used for warning tracking in include_library() + + +def include_library(libname): + """ + Check if the dynamic library should be included with application or not. + """ + if exclude_list.check_library(libname) and not include_list.check_library(libname): + # Library is excluded and is not overridden by include list. It should be excluded. + return False + + # If we are running under Wine and the library is a Wine built-in DLL, ensure that it is always excluded. Typically, + # excluding a DLL leads to an incomplete bundle and run-time errors when the said DLL is not installed on the target + # system. However, having Wine built-in DLLs collected is even more detrimental, as they usually provide Wine's + # implementation of low-level functionality, and therefore cannot be used on actual Windows (i.e., system libraries + # from the C:\Windows\system32 directory that might end up collected due to ``_win_includes`` list; a prominent + # example are VC runtime DLLs, for which Wine provides their own implementation, unless user explicitly installs + # Microsoft's VC redistributable package in their Wine environment). Therefore, excluding the Wine built-in DLLs + # actually improves the chances of the bundle running on Windows, or at least makes the issue easier to debug by + # turning it into the "standard" missing DLL problem. Exclusion should not affect the bundle's ability to run under + # Wine itself, as the excluded DLLs are available there. + if compat.is_win_wine and compat.is_wine_dll(libname): + # Display warning message only once per DLL. Note that it is also displayed only if the DLL were to be included + # in the first place. + if libname not in _seen_wine_dlls: + logger.warning("Excluding Wine built-in DLL: %s", libname) + _seen_wine_dlls.add(libname) + return False + + return True + + +# Patterns for suppressing warnings about missing dynamically linked libraries +_warning_suppressions = [] + +# On some systems (e.g., openwrt), libc.so might point to ldd. Suppress warnings about it. +if compat.is_linux: + _warning_suppressions.append(r'ldd') + +# Suppress warnings about unresolvable UCRT DLLs (see issue #1566) on Windows 10 and 11. +if compat.is_win_10 or compat.is_win_11: + _warning_suppressions.append(r'api-ms-win-.*\.dll') + +missing_lib_warning_suppression_list = MatchList(_warning_suppressions) + + +def warn_missing_lib(libname): + """ + Check if a missing-library warning should be displayed for the given library name (or full path). + """ + return not missing_lib_warning_suppression_list.check_library(libname) diff --git a/venv/Lib/site-packages/PyInstaller/depend/imphook.py b/venv/Lib/site-packages/PyInstaller/depend/imphook.py new file mode 100644 index 0000000..b4f184a --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/depend/imphook.py @@ -0,0 +1,582 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Code related to processing of import hooks. +""" + +import glob +import os.path +import sys +import weakref +import re + +from PyInstaller import log as logging +from PyInstaller.building.utils import format_binaries_and_datas +from PyInstaller.compat import importlib_load_source +from PyInstaller.depend.imphookapi import PostGraphAPI +from PyInstaller.exceptions import ImportErrorWhenRunningHook + +logger = logging.getLogger(__name__) + + +class ModuleHookCache(dict): + """ + Cache of lazily loadable hook script objects. + + This cache is implemented as a `dict` subclass mapping from the fully-qualified names of all modules with at + least one hook script to lists of `ModuleHook` instances encapsulating these scripts. As a `dict` subclass, + all cached module names and hook scripts are accessible via standard dictionary operations. + + Attributes + ---------- + module_graph : ModuleGraph + Current module graph. + _hook_module_name_prefix : str + String prefixing the names of all in-memory modules lazily loaded from cached hook scripts. See also the + `hook_module_name_prefix` parameter passed to the `ModuleHook.__init__()` method. + """ + + _cache_id_next = 0 + """ + 0-based identifier unique to the next `ModuleHookCache` to be instantiated. + + This identifier is incremented on each instantiation of a new `ModuleHookCache` to isolate in-memory modules of + lazily loaded hook scripts in that cache to the same cache-specific namespace, preventing edge-case collisions + with existing in-memory modules in other caches. + + """ + def __init__(self, module_graph, hook_dirs): + """ + Cache all hook scripts in the passed directories. + + **Order of caching is significant** with respect to hooks for the same module, as the values of this + dictionary are lists. Hooks for the same module will be run in the order in which they are cached. Previously + cached hooks are always preserved rather than overridden. + + By default, official hooks are cached _before_ user-defined hooks. For modules with both official and + user-defined hooks, this implies that the former take priority over and hence will be loaded _before_ the + latter. + + Parameters + ---------- + module_graph : ModuleGraph + Current module graph. + hook_dirs : list + List of the absolute or relative paths of all directories containing **hook scripts** (i.e., + Python scripts with filenames matching `hook-{module_name}.py`, where `{module_name}` is the module + hooked by that script) to be cached. + """ + super().__init__() + + # To avoid circular references and hence increased memory consumption, a weak rather than strong reference is + # stored to the passed graph. Since this graph is guaranteed to live longer than this cache, + # this is guaranteed to be safe. + self.module_graph = weakref.proxy(module_graph) + + # String unique to this cache prefixing the names of all in-memory modules lazily loaded from cached hook + # scripts, privatized for safety. + self._hook_module_name_prefix = '__PyInstaller_hooks_{}_'.format(ModuleHookCache._cache_id_next) + ModuleHookCache._cache_id_next += 1 + + # Cache all hook scripts in the passed directories. + self._cache_hook_dirs(hook_dirs) + + def _cache_hook_dirs(self, hook_dirs): + """ + Cache all hook scripts in the passed directories. + + Parameters + ---------- + hook_dirs : list + List of the absolute or relative paths of all directories containing hook scripts to be cached. + """ + + for hook_dir, default_priority in hook_dirs: + # Canonicalize this directory's path and validate its existence. + hook_dir = os.path.abspath(hook_dir) + if not os.path.isdir(hook_dir): + raise FileNotFoundError('Hook directory "{}" not found.'.format(hook_dir)) + + # For each hook script in this directory... + hook_filenames = glob.glob(os.path.join(hook_dir, 'hook-*.py')) + for hook_filename in hook_filenames: + # Fully-qualified name of this hook's corresponding module, constructed by removing the "hook-" prefix + # and ".py" suffix. + module_name = os.path.basename(hook_filename)[5:-3] + + # Lazily loadable hook object. + module_hook = ModuleHook( + module_graph=self.module_graph, + module_name=module_name, + hook_filename=hook_filename, + hook_module_name_prefix=self._hook_module_name_prefix, + default_priority=default_priority, + ) + + # Add this hook to this module's list of hooks. + module_hooks = self.setdefault(module_name, []) + module_hooks.append(module_hook) + + # Post-processing: we allow only one instance of hook per module. Currently, the priority order is defined + # implicitly, via order of hook directories, so the first hook in the list has the highest priority. + for module_name in self.keys(): + hooks = self[module_name] + if len(hooks) == 1: + self[module_name] = hooks[0] + else: + # Order by priority value, in descending order. + sorted_hooks = sorted(hooks, key=lambda hook: hook.priority, reverse=True) + self[module_name] = sorted_hooks[0] + + def remove_modules(self, *module_names): + """ + Remove the passed modules and all hook scripts cached for these modules from this cache. + + Parameters + ---------- + module_names : list + List of all fully-qualified module names to be removed. + """ + + for module_name in module_names: + # Unload this module's hook script modules from memory. Since these are top-level pure-Python modules cached + # only in the "sys.modules" dictionary, popping these modules from this dictionary suffices to garbage + # collect them. + module_hook = self.pop(module_name, None) # Remove our reference, if available. + if module_hook is not None: + sys.modules.pop(module_hook.hook_module_name, None) + + +def _module_collection_mode_sanitizer(value): + if isinstance(value, dict): + # Hook set a dictionary; use it as-is + return value + elif isinstance(value, str): + # Hook set a mode string; convert to a dictionary and assign the string to `None` (= the hooked module). + return {None: value} + + raise ValueError(f"Invalid module collection mode setting value: {value!r}") + + +def _bindepend_symlink_suppression_sanitizer(value): + if isinstance(value, (list, set)): + # Hook set a list or a set; use it as-is + return set(value) + elif isinstance(value, str): + # Hook set a string; create a set with single element. + return set([value]) + + raise ValueError(f"Invalid value for bindepend_symlink_suppression: {value!r}") + + +# Dictionary mapping the names of magic attributes required by the "ModuleHook" class to 2-tuples "(default_type, +# sanitizer_func)", where: +# +# * "default_type" is the type to which that attribute will be initialized when that hook is lazily loaded. +# * "sanitizer_func" is the callable sanitizing the original value of that attribute defined by that hook into a +# safer value consumable by "ModuleHook" callers if any or "None" if the original value requires no sanitization. +# +# To avoid subtleties in the ModuleHook.__getattr__() method, this dictionary is declared as a module rather than a +# class attribute. If declared as a class attribute and then undefined (...for whatever reason), attempting to access +# this attribute from that method would produce infinite recursion. +_MAGIC_MODULE_HOOK_ATTRS = { + # Collections in which order is insignificant. This includes: + # + # * "datas", sanitized from hook-style 2-tuple lists defined by hooks into TOC-style 2-tuple sets consumable by + # "ModuleHook" callers. + # * "binaries", sanitized in the same way. + 'datas': (set, format_binaries_and_datas), + 'binaries': (set, format_binaries_and_datas), + 'excludedimports': (set, None), + + # Collections in which order is significant. This includes: + # + # * "hiddenimports", as order of importation is significant. On module importation, hook scripts are loaded and hook + # functions declared by these scripts are called. As these scripts and functions can have side effects dependent + # on module importation order, module importation itself can have side effects dependent on this order! + 'hiddenimports': (list, None), + + # Flags + 'warn_on_missing_hiddenimports': (lambda: True, bool), + + # Package/module collection mode dictionary. + 'module_collection_mode': (dict, _module_collection_mode_sanitizer), + + # Path patterns for suppression of symbolic links created by binary dependency analysis. + 'bindepend_symlink_suppression': (set, _bindepend_symlink_suppression_sanitizer), +} + + +class ModuleHook: + """ + Cached object encapsulating a lazy loadable hook script. + + This object exposes public attributes (e.g., `datas`) of the underlying hook script as attributes of the same + name of this object. On the first access of any such attribute, this hook script is lazily loaded into an + in-memory private module reused on subsequent accesses. These dynamic attributes are referred to as "magic." All + other static attributes of this object (e.g., `hook_module_name`) are referred to as "non-magic." + + Attributes (Magic) + ---------- + datas : set + Set of `TOC`-style 2-tuples `(target_file, source_file)` for all external non-executable files required by + the module being hooked, converted from the `datas` list of hook-style 2-tuples `(source_dir_or_glob, + target_dir)` defined by this hook script. + binaries : set + Set of `TOC`-style 2-tuples `(target_file, source_file)` for all external executable files required by the + module being hooked, converted from the `binaries` list of hook-style 2-tuples `(source_dir_or_glob, + target_dir)` defined by this hook script. + excludedimports : set + Set of the fully-qualified names of all modules imported by the module being hooked to be ignored rather than + imported from that module, converted from the `excludedimports` list defined by this hook script. These + modules will only be "locally" rather than "globally" ignored. These modules will remain importable from all + modules other than the module being hooked. + hiddenimports : set + Set of the fully-qualified names of all modules imported by the module being hooked that are _not_ + automatically detectable by PyInstaller (usually due to being dynamically imported in that module), + converted from the `hiddenimports` list defined by this hook script. + warn_on_missing_hiddenimports : bool + Boolean flag indicating whether missing hidden imports from the hook should generate warnings or not. This + behavior is enabled by default, but individual hooks can opt out of it. + module_collection_mode : dict + A dictionary of package/module names and their corresponding collection mode strings ('pyz', 'pyc', 'py', + 'pyz+py', 'py+pyz'). + bindepend_symlink_suppression : set + A set of paths or path patterns corresponding to shared libraries for which binary dependency analysis should + not create symbolic links into top-level application directory. + + Attributes (Non-magic) + ---------- + module_graph : ModuleGraph + Current module graph. + module_name : str + Name of the module hooked by this hook script. + hook_filename : str + Absolute or relative path of this hook script. + hook_module_name : str + Name of the in-memory module of this hook script's interpreted contents. + _hook_module : module + In-memory module of this hook script's interpreted contents, lazily loaded on the first call to the + `_load_hook_module()` method _or_ `None` if this method has yet to be accessed. + _default_priority : int + Default (location-based) priority for this hook. + priority : int + Actual priority for this hook. Might be different from `_default_priority` if hook file specifies the hook + priority override. + """ + + #-- Magic -- + + def __init__(self, module_graph, module_name, hook_filename, hook_module_name_prefix, default_priority): + """ + Initialize this metadata. + + Parameters + ---------- + module_graph : ModuleGraph + Current module graph. + module_name : str + Name of the module hooked by this hook script. + hook_filename : str + Absolute or relative path of this hook script. + hook_module_name_prefix : str + String prefixing the name of the in-memory module for this hook script. To avoid namespace clashes with + similar modules created by other `ModuleHook` objects in other `ModuleHookCache` containers, this string + _must_ be unique to the `ModuleHookCache` container containing this `ModuleHook` object. If this string + is non-unique, an existing in-memory module will be erroneously reused when lazily loading this hook + script, thus erroneously resanitizing previously sanitized hook script attributes (e.g., `datas`) with + the `format_binaries_and_datas()` helper. + default_priority : int + Default, location-based priority for this hook. Used to select active hook when multiple hooks are defined + for the same module. + """ + # Note that the passed module graph is already a weak reference, avoiding circular reference issues. See + # ModuleHookCache.__init__(). TODO: Add a failure message + assert isinstance(module_graph, weakref.ProxyTypes) + self.module_graph = module_graph + self.module_name = module_name + self.hook_filename = hook_filename + + # Default priority; used as fall-back for dynamic `hook_priority` attribute. + self._default_priority = default_priority + + # Name of the in-memory module fabricated to refer to this hook script. + self.hook_module_name = hook_module_name_prefix + self.module_name.replace('.', '_') + + # Attributes subsequently defined by the _load_hook_module() method. + self._loaded = False + self._has_hook_function = False + self._hook_module = None + + def __getattr__(self, attr_name): + """ + Get the magic attribute with the passed name (e.g., `datas`) from this lazily loaded hook script if any _or_ + raise `AttributeError` otherwise. + + This special method is called only for attributes _not_ already defined by this object. This includes + undefined attributes and the first attempt to access magic attributes. + + This special method is _not_ called for subsequent attempts to access magic attributes. The first attempt to + access magic attributes defines corresponding instance variables accessible via the `self.__dict__` instance + dictionary (e.g., as `self.datas`) without calling this method. This approach also allows magic attributes to + be deleted from this object _without_ defining the `__delattr__()` special method. + + See Also + ---------- + Class docstring for supported magic attributes. + """ + + if attr_name == 'priority': + # If attribute is part of hook metadata, read metadata from hook script and return the attribute value. + self._load_hook_metadata() + return getattr(self, attr_name) + if attr_name in _MAGIC_MODULE_HOOK_ATTRS and not self._loaded: + # If attribute is hook's magic attribute, load and run the hook script, and return the attribute value. + self._load_hook_module() + return getattr(self, attr_name) + else: + # This is an undefined attribute. Raise an exception. + raise AttributeError(attr_name) + + def __setattr__(self, attr_name, attr_value): + """ + Set the attribute with the passed name to the passed value. + + If this is a magic attribute, this hook script will be lazily loaded before setting this attribute. Unlike + `__getattr__()`, this special method is called to set _any_ attribute -- including magic, non-magic, + and undefined attributes. + + See Also + ---------- + Class docstring for supported magic attributes. + """ + + # If this is a magic attribute, initialize this attribute by lazy loading this hook script before overwriting + # this attribute. + if attr_name in _MAGIC_MODULE_HOOK_ATTRS: + self._load_hook_module() + + # Set this attribute to the passed value. To avoid recursion, the superclass method rather than setattr() is + # called. + return super().__setattr__(attr_name, attr_value) + + #-- Loading -- + + def _load_hook_metadata(self): + """ + Load hook metadata from its source file. + """ + self.priority = self._default_priority + + # Priority override pattern: `# $PyInstaller-Hook-Priority: ` + priority_pattern = re.compile(r"^\s*#\s*\$PyInstaller-Hook-Priority:\s*(?P[\S]+)") + + with open(self.hook_filename, "r", encoding="utf-8") as f: + for line in f: + # Attempt to match and parse hook priority directive + m = priority_pattern.match(line) + if m is not None: + try: + self.priority = int(m.group('value')) + except Exception: + logger.warning( + "Failed to parse hook priority value string: %r!", m.group('value'), exc_info=True + ) + # Currently, this is our only line of interest, so we can stop the search here. + return + + def _load_hook_module(self, keep_module_ref=False): + """ + Lazily load this hook script into an in-memory private module. + + This method (and, indeed, this class) preserves all attributes and functions defined by this hook script as + is, ensuring sane behaviour in hook functions _not_ expecting unplanned external modification. Instead, + this method copies public attributes defined by this hook script (e.g., `binaries`) into private attributes + of this object, which the special `__getattr__()` and `__setattr__()` methods safely expose to external + callers. For public attributes _not_ defined by this hook script, the corresponding private attributes will + be assigned sane defaults. For some public attributes defined by this hook script, the corresponding private + attributes will be transformed into objects more readily and safely consumed elsewhere by external callers. + + See Also + ---------- + Class docstring for supported attributes. + """ + + # If this hook script module has already been loaded, noop. + if self._loaded and (self._hook_module is not None or not keep_module_ref): + return + + # Load and execute the hook script. Even if mechanisms from the import machinery are used, this does not import + # the hook as the module. + hook_path, hook_basename = os.path.split(self.hook_filename) + logger.info('Processing standard module hook %r from %r', hook_basename, hook_path) + try: + self._hook_module = importlib_load_source(self.hook_module_name, self.hook_filename) + except ImportError: + logger.debug("Hook failed with:", exc_info=True) + raise ImportErrorWhenRunningHook(self.hook_module_name, self.hook_filename) + + # Mark as loaded + self._loaded = True + + # Check if module has hook() function. + self._has_hook_function = hasattr(self._hook_module, 'hook') + + # Copy hook script attributes into magic attributes exposed as instance variables of the current "ModuleHook" + # instance. + for attr_name, (default_type, sanitizer_func) in _MAGIC_MODULE_HOOK_ATTRS.items(): + # Unsanitized value of this attribute. + attr_value = getattr(self._hook_module, attr_name, None) + + # If this attribute is undefined, expose a sane default instead. + if attr_value is None: + attr_value = default_type() + # Else if this attribute requires sanitization, do so. + elif sanitizer_func is not None: + attr_value = sanitizer_func(attr_value) + # Else, expose the unsanitized value of this attribute. + + # Expose this attribute as an instance variable of the same name. + setattr(self, attr_name, attr_value) + + # If module_collection_mode has an entry with None key, reassign it to the hooked module's name. + setattr( + self, 'module_collection_mode', { + key if key is not None else self.module_name: value + for key, value in getattr(self, 'module_collection_mode').items() + } + ) + + # Release the module if we do not need the reference. This is the case when hook is loaded during the analysis + # rather as part of the post-graph operations. + if not keep_module_ref: + self._hook_module = None + + #-- Hooks -- + + def post_graph(self, analysis): + """ + Call the **post-graph hook** (i.e., `hook()` function) defined by this hook script, if any. + + Parameters + ---------- + analysis: build_main.Analysis + Analysis that calls the hook + + This method is intended to be called _after_ the module graph for this application is constructed. + """ + + # Lazily load this hook script into an in-memory module. + # The script might have been loaded before during modulegraph analysis; in that case, it needs to be reloaded + # only if it provides a hook() function. + if not self._loaded or self._has_hook_function: + # Keep module reference when loading the hook, so we can call its hook function! + self._load_hook_module(keep_module_ref=True) + + # Call this hook script's hook() function, which modifies attributes accessed by subsequent methods and + # hence must be called first. + self._process_hook_func(analysis) + + # Order is insignificant here. + self._process_hidden_imports() + + def _process_hook_func(self, analysis): + """ + Call this hook's `hook()` function if defined. + + Parameters + ---------- + analysis: build_main.Analysis + Analysis that calls the hook + """ + + # If this hook script defines no hook() function, noop. + if not hasattr(self._hook_module, 'hook'): + return + + # Call this hook() function. + hook_api = PostGraphAPI(module_name=self.module_name, module_graph=self.module_graph, analysis=analysis) + try: + self._hook_module.hook(hook_api) + except ImportError: + logger.debug("Hook failed with:", exc_info=True) + raise ImportErrorWhenRunningHook(self.hook_module_name, self.hook_filename) + + # Update all magic attributes modified by the prior call. + self.datas.update(set(hook_api._added_datas)) + self.binaries.update(set(hook_api._added_binaries)) + self.hiddenimports.extend(hook_api._added_imports) + self.module_collection_mode.update(hook_api._module_collection_mode) + self.bindepend_symlink_suppression.update(hook_api._bindepend_symlink_suppression) + + # FIXME: `hook_api._deleted_imports` should be appended to `self.excludedimports` and used to suppress module + # import during the modulegraph construction rather than handled here. However, for that to work, the `hook()` + # function needs to be ran during modulegraph construction instead of in post-processing (and this in turn + # requires additional code refactoring in order to be able to pass `analysis` to `PostGraphAPI` object at + # that point). So once the modulegraph rewrite is complete, remove the code block below. + for deleted_module_name in hook_api._deleted_imports: + # Remove the graph link between the hooked module and item. This removes the 'item' node from the graph if + # no other links go to it (no other modules import it) + self.module_graph.removeReference(hook_api.node, deleted_module_name) + + def _process_hidden_imports(self): + """ + Add all imports listed in this hook script's `hiddenimports` attribute to the module graph as if directly + imported by this hooked module. + + These imports are typically _not_ implicitly detectable by PyInstaller and hence must be explicitly defined + by hook scripts. + """ + + # For each hidden import required by the module being hooked... + for import_module_name in self.hiddenimports: + try: + # Graph node for this module. Do not implicitly create namespace packages for non-existent packages. + caller = self.module_graph.find_node(self.module_name, create_nspkg=False) + + # Manually import this hidden import from this module. + self.module_graph.import_hook(import_module_name, caller) + # If this hidden import is unimportable, print a non-fatal warning. Hidden imports often become + # desynchronized from upstream packages and hence are only "soft" recommendations. + except ImportError: + if self.warn_on_missing_hiddenimports: + logger.warning('Hidden import "%s" not found!', import_module_name) + + +class AdditionalFilesCache: + """ + Cache for storing what binaries and datas were pushed by what modules when import hooks were processed. + """ + def __init__(self): + self._binaries = {} + self._datas = {} + + def add(self, modname, binaries, datas): + + self._binaries.setdefault(modname, []) + self._binaries[modname].extend(binaries or []) + self._datas.setdefault(modname, []) + self._datas[modname].extend(datas or []) + + def __contains__(self, name): + return name in self._binaries or name in self._datas + + def binaries(self, modname): + """ + Return list of binaries for given module name. + """ + return self._binaries.get(modname, []) + + def datas(self, modname): + """ + Return list of datas for given module name. + """ + return self._datas.get(modname, []) diff --git a/venv/Lib/site-packages/PyInstaller/depend/imphookapi.py b/venv/Lib/site-packages/PyInstaller/depend/imphookapi.py new file mode 100644 index 0000000..c51830b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/depend/imphookapi.py @@ -0,0 +1,486 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Classes facilitating communication between PyInstaller and import hooks. + +PyInstaller passes instances of classes defined by this module to corresponding functions defined by external import +hooks, which commonly modify the contents of these instances before returning. PyInstaller then detects and converts +these modifications into appropriate operations on the current `PyiModuleGraph` instance, thus modifying which +modules will be frozen into the executable. +""" + +from PyInstaller.building.utils import format_binaries_and_datas +from PyInstaller.lib.modulegraph.modulegraph import (RuntimeModule, RuntimePackage) + + +class PreSafeImportModuleAPI: + """ + Metadata communicating changes made by the current **pre-safe import module hook** (i.e., hook run immediately + _before_ a call to `ModuleGraph._safe_import_module()` recursively adding the hooked module, package, + or C extension and all transitive imports thereof to the module graph) back to PyInstaller. + + Pre-safe import module hooks _must_ define a `pre_safe_import_module()` function accepting an instance of this + class, whose attributes describe the subsequent `ModuleGraph._safe_import_module()` call creating the hooked + module's graph node. + + Each pre-safe import module hook is run _only_ on the first attempt to create the hooked module's graph node and + then subsequently ignored. If this hook successfully creates that graph node, the subsequent + `ModuleGraph._safe_import_module()` call will observe this fact and silently return without attempting to + recreate that graph node. + + Pre-safe import module hooks are typically used to create graph nodes for **runtime modules** (i.e., + modules dynamically defined at runtime). Most modules are physically defined in external `.py`-suffixed scripts. + Some modules, however, are dynamically defined at runtime (e.g., `six.moves`, dynamically defined by the + physically defined `six.py` module). However, `ModuleGraph` only parses `import` statements residing in external + scripts. `ModuleGraph` is _not_ a full-fledged, Turing-complete Python interpreter and hence has no means of + parsing `import` statements performed by runtime modules existing only in-memory. + + 'With great power comes great responsibility.' + + + Attributes (Immutable) + ---------------------------- + The following attributes are **immutable** (i.e., read-only). For safety, any attempts to change these attributes + _will_ result in a raised exception: + + module_graph : PyiModuleGraph + Current module graph. + parent_package : Package + Graph node for the package providing this module _or_ `None` if this module is a top-level module. + + Attributes (Mutable) + ----------------------------- + The following attributes are editable. + + module_basename : str + Unqualified name of the module to be imported (e.g., `text`). + module_name : str + Fully-qualified name of this module (e.g., `email.mime.text`). + """ + def __init__(self, module_graph, module_basename, module_name, parent_package): + self._module_graph = module_graph + self.module_basename = module_basename + self.module_name = module_name + self._parent_package = parent_package + + # Immutable properties. No corresponding setters are defined. + @property + def module_graph(self): + """ + Current module graph. + """ + return self._module_graph + + @property + def parent_package(self): + """ + Parent Package of this node. + """ + return self._parent_package + + def add_runtime_module(self, module_name): + """ + Add a graph node representing a non-package Python module with the passed name dynamically defined at runtime. + + Most modules are statically defined on-disk as standard Python files. Some modules, however, are dynamically + defined in-memory at runtime (e.g., `gi.repository.Gst`, dynamically defined by the statically defined + `gi.repository.__init__` module). + + This method adds a graph node representing such a runtime module. Since this module is _not_ a package, + all attempts to import submodules from this module in `from`-style import statements (e.g., the `queue` + submodule in `from six.moves import queue`) will be silently ignored. To circumvent this, simply call + `add_runtime_package()` instead. + + Parameters + ---------- + module_name : str + Fully-qualified name of this module (e.g., `gi.repository.Gst`). + + Examples + ---------- + This method is typically called by `pre_safe_import_module()` hooks, e.g.: + + def pre_safe_import_module(api): + api.add_runtime_module(api.module_name) + """ + + self._module_graph.add_module(RuntimeModule(module_name)) + + def add_runtime_package(self, package_name): + """ + Add a graph node representing a non-namespace Python package with the passed name dynamically defined at + runtime. + + Most packages are statically defined on-disk as standard subdirectories containing `__init__.py` files. Some + packages, however, are dynamically defined in-memory at runtime (e.g., `six.moves`, dynamically defined by + the statically defined `six` module). + + This method adds a graph node representing such a runtime package. All attributes imported from this package + in `from`-style import statements that are submodules of this package (e.g., the `queue` submodule in `from + six.moves import queue`) will be imported rather than ignored. + + Parameters + ---------- + package_name : str + Fully-qualified name of this package (e.g., `six.moves`). + + Examples + ---------- + This method is typically called by `pre_safe_import_module()` hooks, e.g.: + + def pre_safe_import_module(api): + api.add_runtime_package(api.module_name) + """ + + self._module_graph.add_module(RuntimePackage(package_name)) + + def add_alias_module(self, real_module_name, alias_module_name): + """ + Alias the source module to the target module with the passed names. + + This method ensures that the next call to findNode() given the target module name will resolve this alias. + This includes importing and adding a graph node for the source module if needed as well as adding a reference + from the target to the source module. + + Parameters + ---------- + real_module_name : str + Fully-qualified name of the **existing module** (i.e., the module being aliased). + alias_module_name : str + Fully-qualified name of the **non-existent module** (i.e., the alias to be created). + """ + + self._module_graph.alias_module(real_module_name, alias_module_name) + + def append_package_path(self, directory): + """ + Modulegraph does a good job at simulating Python's, but it cannot handle packagepath `__path__` modifications + packages make at runtime. + + Therefore there is a mechanism whereby you can register extra paths in this map for a package, and it will be + honored. + + Parameters + ---------- + directory : str + Absolute or relative path of the directory to be appended to this package's `__path__` attribute. + """ + + self._module_graph.append_package_path(self.module_name, directory) + + +class PreFindModulePathAPI: + """ + Metadata communicating changes made by the current **pre-find module path hook** (i.e., hook run immediately + _before_ a call to `ModuleGraph._find_module_path()` finding the hooked module's absolute path) back to PyInstaller. + + Pre-find module path hooks _must_ define a `pre_find_module_path()` function accepting an instance of this class, + whose attributes describe the subsequent `ModuleGraph._find_module_path()` call to be performed. + + Pre-find module path hooks are typically used to change the absolute path from which a module will be + subsequently imported and thus frozen into the executable. To do so, hooks may overwrite the default + `search_dirs` list of the absolute paths of all directories to be searched for that module: e.g., + + def pre_find_module_path(api): + api.search_dirs = ['/the/one/true/package/providing/this/module'] + + Each pre-find module path hook is run _only_ on the first call to `ModuleGraph._find_module_path()` for the + corresponding module. + + Attributes + ---------- + The following attributes are **mutable** (i.e., modifiable). All changes to these attributes will be immediately + respected by PyInstaller: + + search_dirs : list + List of the absolute paths of all directories to be searched for this module (in order). Searching will halt + at the first directory containing this module. + + Attributes (Immutable) + ---------- + The following attributes are **immutable** (i.e., read-only). For safety, any attempts to change these attributes + _will_ result in a raised exception: + + module_name : str + Fully-qualified name of this module. + module_graph : PyiModuleGraph + Current module graph. For efficiency, this attribute is technically mutable. To preserve graph integrity, + this attribute should nonetheless _never_ be modified. While read-only `PyiModuleGraph` methods (e.g., + `findNode()`) are safely callable from within pre-find module path hooks, methods modifying the graph are + _not_. If graph modifications are required, consider an alternative type of hook (e.g., pre-import module + hooks). + """ + def __init__( + self, + module_graph, + module_name, + search_dirs, + ): + # Mutable attributes. + self.search_dirs = search_dirs + + # Immutable attributes. + self._module_graph = module_graph + self._module_name = module_name + + # Immutable properties. No corresponding setters are defined. + @property + def module_graph(self): + """ + Current module graph. + """ + return self._module_graph + + @property + def module_name(self): + """ + Fully-qualified name of this module. + """ + return self._module_name + + +class PostGraphAPI: + """ + Metadata communicating changes made by the current **post-graph hook** (i.e., hook run for a specific module + transitively imported by the current application _after_ the module graph of all `import` statements performed by + this application has been constructed) back to PyInstaller. + + Post-graph hooks may optionally define a `post_graph()` function accepting an instance of this class, + whose attributes describe the current state of the module graph and the hooked module's graph node. + + Attributes (Mutable) + ---------- + The following attributes are **mutable** (i.e., modifiable). All changes to these attributes will be immediately + respected by PyInstaller: + + module_graph : PyiModuleGraph + Current module graph. + module : Node + Graph node for the currently hooked module. + + 'With great power comes great responsibility.' + + Attributes (Immutable) + ---------- + The following attributes are **immutable** (i.e., read-only). For safety, any attempts to change these attributes + _will_ result in a raised exception: + + __name__ : str + Fully-qualified name of this module (e.g., `six.moves.tkinter`). + __file__ : str + Absolute path of this module. If this module is: + * A standard (rather than namespace) package, this is the absolute path of this package's directory. + * A namespace (rather than standard) package, this is the abstract placeholder `-`. (Don't ask. Don't tell.) + * A non-package module or C extension, this is the absolute path of the corresponding file. + __path__ : list + List of the absolute paths of all directories comprising this package if this module is a package _or_ `None` + otherwise. If this module is a standard (rather than namespace) package, this list contains only the absolute + path of this package's directory. + co : code + Code object compiled from the contents of `__file__` (e.g., via the `compile()` builtin). + analysis: build_main.Analysis + The Analysis that load the hook. + + Attributes (Private) + ---------- + The following attributes are technically mutable but private, and hence should _never_ be externally accessed or + modified by hooks. Call the corresponding public methods instead: + + _added_datas : list + List of the `(name, path)` 2-tuples or TOC objects of all external data files required by the current hook, + defaulting to the empty list. This is equivalent to the global `datas` hook attribute. + _added_imports : list + List of the fully-qualified names of all modules imported by the current hook, defaulting to the empty list. + This is equivalent to the global `hiddenimports` hook attribute. + _added_binaries : list + List of the `(name, path)` 2-tuples or TOC objects of all external C extensions imported by the current hook, + defaulting to the empty list. This is equivalent to the global `binaries` hook attribute. + _module_collection_mode : dict + Dictionary of package/module names and their corresponding collection mode strings. This is equivalent to the + global `module_collection_mode` hook attribute. + _bindepend_symlink_suppression : set + A set of paths or path patterns corresponding to shared libraries for which binary dependency analysis should + not generate symbolic links into top-level application directory. + """ + def __init__(self, module_name, module_graph, analysis): + # Mutable attributes. + self.module_graph = module_graph + self.module = module_graph.find_node(module_name) + assert self.module is not None # should not occur + + # Immutable attributes. + self.___name__ = module_name + self.___file__ = self.module.filename + self._co = self.module.code + self._analysis = analysis + + # To enforce immutability, convert this module's package path if any into an immutable tuple. + self.___path__ = tuple(self.module.packagepath) \ + if self.module.packagepath is not None else None + + #FIXME: Refactor "_added_datas", "_added_binaries", and "_deleted_imports" into sets. Since order of + #import is important, "_added_imports" must remain a list. + + # Private attributes. + self._added_binaries = [] + self._added_datas = [] + self._added_imports = [] + self._deleted_imports = [] + self._module_collection_mode = {} + self._bindepend_symlink_suppression = set() + + # Immutable properties. No corresponding setters are defined. + @property + def __file__(self): + """ + Absolute path of this module's file. + """ + return self.___file__ + + @property + def __path__(self): + """ + List of the absolute paths of all directories comprising this package if this module is a package _or_ `None` + otherwise. If this module is a standard (rather than namespace) package, this list contains only the absolute + path of this package's directory. + """ + return self.___path__ + + @property + def __name__(self): + """ + Fully-qualified name of this module (e.g., `six.moves.tkinter`). + """ + return self.___name__ + + @property + def co(self): + """ + Code object compiled from the contents of `__file__` (e.g., via the `compile()` builtin). + """ + return self._co + + @property + def analysis(self): + """ + build_main.Analysis that calls the hook. + """ + return self._analysis + + # Obsolete immutable properties provided to preserve backward compatibility. + @property + def name(self): + """ + Fully-qualified name of this module (e.g., `six.moves.tkinter`). + + **This property has been deprecated by the `__name__` property.** + """ + return self.___name__ + + @property + def graph(self): + """ + Current module graph. + + **This property has been deprecated by the `module_graph` property.** + """ + return self.module_graph + + @property + def node(self): + """ + Graph node for the currently hooked module. + + **This property has been deprecated by the `module` property.** + """ + return self.module + + # TODO: This incorrectly returns the list of the graph nodes of all modules *TRANSITIVELY* (rather than directly) + # imported by this module. Unfortunately, this implies that most uses of this property are currently broken + # (e.g., "hook-PIL.SpiderImagePlugin.py"). We only require this for the aforementioned hook, so contemplate + # alternative approaches. + @property + def imports(self): + """ + List of the graph nodes of all modules directly imported by this module. + """ + return self.module_graph.iter_graph(start=self.module) + + def add_imports(self, *module_names): + """ + Add all Python modules whose fully-qualified names are in the passed list as "hidden imports" upon which the + current module depends. + + This is equivalent to appending such names to the hook-specific `hiddenimports` attribute. + """ + # Append such names to the current list of all such names. + self._added_imports.extend(module_names) + + def del_imports(self, *module_names): + """ + Remove the named fully-qualified modules from the set of imports (either hidden or visible) upon which the + current module depends. + + This is equivalent to appending such names to the hook-specific `excludedimports` attribute. + """ + self._deleted_imports.extend(module_names) + + def add_binaries(self, binaries): + """ + Add all external dynamic libraries in the passed list of `(src_name, dest_name)` 2-tuples as dependencies of the + current module. This is equivalent to adding to the global `binaries` hook attribute. + + For convenience, the `binaries` may also be a list of TOC-style 3-tuples `(dest_name, src_name, typecode)`. + """ + + # Detect TOC 3-tuple list by checking the length of the first entry + if binaries and len(binaries[0]) == 3: + self._added_binaries.extend(entry[:2] for entry in binaries) + else: + # NOTE: `format_binaries_and_datas` changes tuples from input format `(src_name, dest_name)` to output + # format `(dest_name, src_name)`. + self._added_binaries.extend(format_binaries_and_datas(binaries)) + + def add_datas(self, datas): + """ + Add all external data files in the passed list of `(src_name, dest_name)` 2-tuples as dependencies of the + current module. This is equivalent to adding to the global `datas` hook attribute. + + For convenience, the `datas` may also be a list of TOC-style 3-tuples `(dest_name, src_name, typecode)`. + """ + + # Detect TOC 3-tuple list by checking the length of the first entry + if datas and len(datas[0]) == 3: + self._added_datas.extend(entry[:2] for entry in datas) + else: + # NOTE: `format_binaries_and_datas` changes tuples from input format `(src_name, dest_name)` to output + # format `(dest_name, src_name)`. + self._added_datas.extend(format_binaries_and_datas(datas)) + + def set_module_collection_mode(self, name, mode): + """" + Set the package/module collection mode for the specified module name. If `name` is `None`, the hooked + module/package name is used. `mode` can be one of valid mode strings (`'pyz'`, `'pyc'`, ˙'py'˙, `'pyz+py'`, + ˙'py+pyz'`) or `None`, which clears the setting for the module/package - but only within this hook's context! + """ + if name is None: + name = self.__name__ + if mode is None: + self._module_collection_mode.pop(name) + else: + self._module_collection_mode[name] = mode + + def add_bindepend_symlink_suppression_pattern(self, pattern): + """ + Add the given path or path pattern to the set of patterns that prevent binary dependency analysis from creating + a symbolic link to the top-level application directory. + """ + self._bindepend_symlink_suppression.add(pattern) diff --git a/venv/Lib/site-packages/PyInstaller/depend/utils.py b/venv/Lib/site-packages/PyInstaller/depend/utils.py new file mode 100644 index 0000000..d74360a --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/depend/utils.py @@ -0,0 +1,401 @@ +# -*- coding: utf-8 -*- +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Utility functions related to analyzing/bundling dependencies. +""" + +import ctypes.util +import io +import os +import re +import shutil +import struct +import zipfile +from types import CodeType + +import marshal + +from PyInstaller import compat +from PyInstaller import log as logging +from PyInstaller.depend import bytecode +from PyInstaller.depend.dylib import include_library +from PyInstaller.exceptions import ExecCommandFailed +from PyInstaller.lib.modulegraph import modulegraph + +logger = logging.getLogger(__name__) + + +# TODO find out if modules from base_library.zip could be somehow bundled into the .exe file. +def create_py3_base_library(libzip_filename, graph): + """ + Package basic Python modules into .zip file. The .zip file with basic modules is necessary to have on PYTHONPATH + for initializing libpython3 in order to run the frozen executable with Python 3. + """ + # Import strip_paths_in_code locally to avoid cyclic import between building.utils and depend.utils (this module); + # building.utils imports depend.bindepend, which in turn imports depend.utils. + from PyInstaller.building.utils import strip_paths_in_code + + # Construct regular expression for matching modules that should be bundled into base_library.zip. Excluded are plain + # 'modules' or 'submodules.ANY_NAME'. The match has to be exact - start and end of string not substring. + regex_modules = '|'.join([rf'(^{x}$)' for x in compat.PY3_BASE_MODULES]) + regex_submod = '|'.join([rf'(^{x}\..*$)' for x in compat.PY3_BASE_MODULES]) + regex_str = regex_modules + '|' + regex_submod + module_filter = re.compile(regex_str) + + try: + # Remove .zip from previous run. + if os.path.exists(libzip_filename): + os.remove(libzip_filename) + logger.debug('Adding python files to base_library.zip') + # Class zipfile.PyZipFile is not suitable for PyInstaller needs. + with zipfile.ZipFile(libzip_filename, mode='w') as zf: + zf.debug = 3 + # Sort the graph nodes by identifier to ensure repeatable builds + graph_nodes = list(graph.iter_graph()) + graph_nodes.sort(key=lambda item: item.identifier) + for mod in graph_nodes: + if type(mod) in (modulegraph.SourceModule, modulegraph.Package, modulegraph.CompiledModule): + # Bundling just required modules. + if module_filter.match(mod.identifier): + # Name inside the archive. The ZIP format specification requires forward slashes as directory + # separator. + if type(mod) is modulegraph.Package: + new_name = mod.identifier.replace('.', '/') + '/__init__.pyc' + else: + new_name = mod.identifier.replace('.', '/') + '.pyc' + + # Write code to a file. This code is similar to py_compile.compile(). + with io.BytesIO() as fc: + fc.write(compat.BYTECODE_MAGIC) + fc.write(struct.pack('>> _resolveCtypesImports(['libgs.so']) + [(libgs.so', ''/usr/lib/libgs.so', 'BINARY')] + """ + from ctypes.util import find_library + + from PyInstaller.config import CONF + + if compat.is_unix: + envvar = "LD_LIBRARY_PATH" + elif compat.is_darwin: + envvar = "DYLD_LIBRARY_PATH" + else: + envvar = "PATH" + + def _setPaths(): + path = os.pathsep.join(CONF['pathex']) + old = compat.getenv(envvar) + if old is not None: + path = os.pathsep.join((path, old)) + compat.setenv(envvar, path) + return old + + def _restorePaths(old): + if old is None: + compat.unsetenv(envvar) + else: + compat.setenv(envvar, old) + + ret = [] + + # Try to locate the shared library on the disk. This is done by calling ctypes.util.find_library with + # ImportTracker's local paths temporarily prepended to the library search paths (and restored after the call). + old = _setPaths() + for cbin in cbinaries: + try: + # There is an issue with find_library() where it can run into errors trying to locate the library. See + # #5734. + cpath = find_library(os.path.splitext(cbin)[0]) + except FileNotFoundError: + # In these cases, find_library() should return None. + cpath = None + if compat.is_unix: + # CAVEAT: find_library() is not the correct function. ctype's documentation says that it is meant to resolve + # only the filename (as a *compiler* does) not the full path. Anyway, it works well enough on Windows and + # Mac OS. On Linux, we need to implement more code to find out the full path. + if cpath is None: + cpath = cbin + # "man ld.so" says that we should first search LD_LIBRARY_PATH and then the ldcache. + for d in compat.getenv(envvar, '').split(os.pathsep): + if os.path.isfile(os.path.join(d, cpath)): + cpath = os.path.join(d, cpath) + break + else: + if LDCONFIG_CACHE is None: + load_ldconfig_cache() + if cpath in LDCONFIG_CACHE: + cpath = LDCONFIG_CACHE[cpath] + assert os.path.isfile(cpath) + else: + cpath = None + if cpath is None: + # Skip warning message if cbin (basename of library) is ignored. This prevents messages like: + # 'W: library kernel32.dll required via ctypes not found' + if not include_library(cbin): + continue + # On non-Windows, automatically ignore all ctypes-based referenes to DLL files. This complements the above + # check, which might not match potential case variations (e.g., `KERNEL32.dll`, instead of `kernel32.dll`) + # due to case-sensitivity of the matching that is in effect on non-Windows platforms. + if not compat.is_win and cbin.lower().endswith('.dll'): + continue + logger.warning("Library %s required via ctypes not found", cbin) + else: + if not include_library(cpath): + continue + ret.append((cbin, cpath, "BINARY")) + _restorePaths(old) + return ret + + +LDCONFIG_CACHE = None # cache the output of `/sbin/ldconfig -p` + + +def load_ldconfig_cache(): + """ + Create a cache of the `ldconfig`-output to call it only once. + It contains thousands of libraries and running it on every dylib is expensive. + """ + global LDCONFIG_CACHE + + if LDCONFIG_CACHE is not None: + return + + if compat.is_musl: + # Musl deliberately doesn't use ldconfig. The ldconfig executable either doesn't exist or it's a functionless + # executable which, on calling with any arguments, simply tells you that those arguments are invalid. + LDCONFIG_CACHE = {} + return + + ldconfig = shutil.which('ldconfig') + if ldconfig is None: + # If `ldconfig` is not found in $PATH, search for it in some fixed directories. Simply use a second call instead + # of fiddling around with checks for empty env-vars and string-concat. + ldconfig = shutil.which('ldconfig', path='/usr/sbin:/sbin:/usr/bin:/bin') + + # If we still could not find the 'ldconfig' command... + if ldconfig is None: + LDCONFIG_CACHE = {} + return + + if compat.is_freebsd or compat.is_openbsd: + # This has a quite different format than other Unixes: + # [vagrant@freebsd-10 ~]$ ldconfig -r + # /var/run/ld-elf.so.hints: + # search directories: /lib:/usr/lib:/usr/lib/compat:... + # 0:-lgeom.5 => /lib/libgeom.so.5 + # 184:-lpython2.7.1 => /usr/local/lib/libpython2.7.so.1 + ldconfig_arg = '-r' + splitlines_count = 2 + pattern = re.compile(r'^\s+\d+:-l(\S+)(\s.*)? => (\S+)') + else: + # Skip first line of the library list because it is just an informative line and might contain localized + # characters. Example of first line with locale set to cs_CZ.UTF-8: + #$ /sbin/ldconfig -p + #V keši „/etc/ld.so.cache“ nalezeno knihoven: 2799 + # libzvbi.so.0 (libc6,x86-64) => /lib64/libzvbi.so.0 + # libzvbi-chains.so.0 (libc6,x86-64) => /lib64/libzvbi-chains.so.0 + ldconfig_arg = '-p' + splitlines_count = 1 + pattern = re.compile(r'^\s+(\S+)(\s.*)? => (\S+)') + + try: + text = compat.exec_command(ldconfig, ldconfig_arg) + except ExecCommandFailed: + logger.warning("Failed to execute ldconfig. Disabling LD cache.") + LDCONFIG_CACHE = {} + return + + text = text.strip().splitlines()[splitlines_count:] + + LDCONFIG_CACHE = {} + for line in text: + # :fixme: this assumes library names do not contain whitespace + m = pattern.match(line) + + # Sanitize away any abnormal lines of output. + if m is None: + # Warn about it then skip the rest of this iteration. + if re.search("Cache generated by:", line): + # See #5540. This particular line is harmless. + pass + else: + logger.warning("Unrecognised line of output %r from ldconfig", line) + continue + + path = m.groups()[-1] + if compat.is_freebsd or compat.is_openbsd: + # Insert `.so` at the end of the lib's basename. soname and filename may have (different) trailing versions. + # We assume the `.so` in the filename to mark the end of the lib's basename. + bname = os.path.basename(path).split('.so', 1)[0] + name = 'lib' + m.group(1) + assert name.startswith(bname) + name = bname + '.so' + name[len(bname):] + else: + name = m.group(1) + # ldconfig may know about several versions of the same lib, e.g., different arch, different libc, etc. + # Use the first entry. + if name not in LDCONFIG_CACHE: + LDCONFIG_CACHE[name] = path diff --git a/venv/Lib/site-packages/PyInstaller/exceptions.py b/venv/Lib/site-packages/PyInstaller/exceptions.py new file mode 100644 index 0000000..3562c0d --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/exceptions.py @@ -0,0 +1,82 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller import compat + + +class ExecCommandFailed(SystemExit): + pass + + +class HookError(Exception): + """ + Base class for hook related errors. + """ + pass + + +class ImportErrorWhenRunningHook(HookError): + def __str__(self): + return ( + "Failed to import module {0} required by hook for module {1}. Please check whether module {0} actually " + "exists and whether the hook is compatible with your version of {1}: You might want to read more about " + "hooks in the manual and provide a pull-request to improve PyInstaller.".format(self.args[0], self.args[1]) + ) + + +class RemovedCipherFeatureError(SystemExit): + def __init__(self, message): + super().__init__( + f"Bytecode encryption was removed in PyInstaller v6.0. {message}" + " For the rationale and alternatives see https://github.com/pyinstaller/pyinstaller/pull/6999" + ) + + +class RemovedExternalManifestError(SystemExit): + def __init__(self, message): + super().__init__(f"Support for external executable manifest was removed in PyInstaller v6.0. {message}") + + +class RemovedWinSideBySideSupportError(SystemExit): + def __init__(self, message): + super().__init__( + f"Support for collecting and processing WinSxS assemblies was removed in PyInstaller v6.0. {message}" + ) + + +_MISSING_PYTHON_LIB_MSG = \ +"""Python library not found: {0} + This means your Python installation does not come with proper shared library files. + This usually happens due to missing development package, or unsuitable build parameters of the Python installation. + + * On Debian/Ubuntu, you need to install Python development packages: + * apt-get install python3-dev + * apt-get install python-dev + * If you are building Python by yourself, rebuild with `--enable-shared` (or, `--enable-framework` on macOS). +""" # noqa: E122 + + +class PythonLibraryNotFoundError(IOError): + def __init__(self): + super().__init__(_MISSING_PYTHON_LIB_MSG.format(", ".join(compat.PYDYLIB_NAMES),)) + + +class InvalidSrcDestTupleError(SystemExit): + def __init__(self, src_dest, message): + super().__init__(f"Invalid (SRC, DEST_DIR) tuple: {src_dest!r}. {message}") + + +class ImportlibMetadataError(SystemExit): + def __init__(self): + super().__init__( + "PyInstaller requires importlib.metadata from python >= 3.10 stdlib or importlib_metadata from " + "importlib-metadata >= 4.6" + ) diff --git a/venv/Lib/site-packages/PyInstaller/fake-modules/__pycache__/pyi_splash.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/fake-modules/__pycache__/pyi_splash.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9d675286b1f4dfeda103fef0f48f0de892f8c3d GIT binary patch literal 7780 zcmai3TWlL=cK(MmBuA7)NtAq%CEF8UVykP>j$?1VO6shv^+k;%X(icd6fc-DXGD!n zahRE*WC^m%%^Ik-2nrS0Hg3~xy}{N=kZzw^Z2Qm$Z(kPZ3$Y&b7WN!q?7!$oa3uVjr~fT5_7T(A z4ATTHRupCg{vDf%@o#ZPEHF*{M3|9UycY49M5+BS)00P-6&IKmn@POGO41^`Bfi5H z1>Q<3%JVHVEdtxtvL)J5i{EE6DJ?P6swHRIG+AxeTGVum>Ef-9fKA+YM((?U`$sXx zzQE-jYDP<8tnL7zW3?-w7pv9zR*1T zOrO?`xBYnAqwk-MX}j)A+gcpZcB92XUAUzLd}w>_vu&+j(qdC=pjSOFF_xO1Gi+tv z)G9??$(yB;o_B1;F%@S{S8kf7Q#4ggx9Ewjmo#Nww{5kchfVBqQMKn3J8$WFDVs`- zIts=!N)8(98g*0ij-uL%s!UFd@E6vsn%9+C6N6%o*-9zz7-q><%9gocP^X(q+h#wZ z*p>VojiMPe;gV4*D2{%|QA{h9FPb)fXBBTH>TO~U16OR_!k|meoLQo=3zj;M`8B;v ztd-DrR+%#wdE2}>KVK;sd6hU(77b@^8wY$*^W~yGkDj`AB84fj2$e);8#Y$!D8mz@ z)GSyAgfVRfBHby`6N=#kZ@Dy8rD*2WqT=Msif!g^>yENGXWF__HZ3mHvTEBT(mBhl z6g&p?(t=@`C1OfhP%T5fS=3XAJu1eg`he z7cmM6pt%X{SWt~3v972N*Ez*8=JgZ2qpz8o33jP1I6zASDhCEqzQPiFm6Br=vA>36 zs6}I$?<8#j*u;)FX5K84VtITL^AnzCkg8f`O9#bj12w>G|GySsHgJJOcuexy!e2_r zvRx_jEwps9B@8@gV5!7Hlkt!=eD#KcDMnV$aurcawC3}?<~#%hZ7Y&QbXrDe{Ul6o|KP_cLENP1uoY_JEi{EU z7|F?|z9N(v8;HA|BUi_#F6KtY$Hp#>OplI_xgD3TUW5LPTp6Am9+|#4>B@$k!_F+| zZk+SswpPj-)G$Ye{JG$!{hy1LS}yBWK16d&5ywS7;AsiuBj$hxhc)Pg7|z(O@ZJHq z1xGW|-<4u)MYgC&DB%*oyd5;m-v4F=2{d1F_|QO({4=%#sG>GE1;g zpGQT7DZ*xoW}!fkPd?bNYU@)ixsknpwX;l&U0aUTW15qXrC8>ZnV+fQ-T

LOaWqJ3p0m+qf{>*MmL3gh5w|JN< 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__init__.py b/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__init__.py new file mode 100644 index 0000000..e006337 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__init__.py @@ -0,0 +1,36 @@ +# ----------------------------------------------------------------------------- +# Copyright (c) 2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- + +import sys +import os + +# A boolean indicating whether the frozen application is a macOS .app bundle. +is_macos_app_bundle = sys.platform == 'darwin' and sys._MEIPASS.endswith("Contents/Frameworks") + + +def prepend_path_to_environment_variable(path, variable_name): + """ + Prepend the given path to the list of paths stored in the given environment variable (separated by `os.pathsep`). + If the given path is already specified in the environment variable, no changes are made. If the environment variable + is not set or is empty, it is set/overwritten with the given path. + """ + stored_paths = os.environ.get(variable_name) + if stored_paths: + # If path is already included, make this a no-op. NOTE: we need to split the string and search in the list of + # substrings to find an exact match; searching in the original string might erroneously match a prefix of a + # longer (i.e., sub-directory) path when such entry already happens to be in PATH (see #8857). + if path in stored_paths.split(os.pathsep): + return + # Otherwise, prepend the path + stored_paths = path + os.pathsep + stored_paths + else: + stored_paths = path + os.environ[variable_name] = stored_paths diff --git a/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1744acbd5fd0a1c221015a93d964022403744156 GIT binary patch literal 1288 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 TIKeUUm7sr&gMeN}p-+DUXU1*F literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/tempfile.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/tempfile.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e4f5c13975e3cd662f68b75ae38bfb5ebdd00ad GIT binary patch literal 2129 zcmaJ>TWcFf6rR24Vq3CBCEIdH+ReqmiermhASE$zlh{o|5<4`Be5r!6-W}O1OS_wy zQEV9rM9705^5BL*{1Ait;-+y+^8;F1nnD9@sRTd)mza*)6;7Gt(ZKxeg$gqU+UK%@XmvvZiAutCCj?)gp}P zPAn+uiQ^Ji1KQF}r8R&3j4tsQ5DU87QguDg zTYnT>B-nt`oK1*=yJ_t@kM*`jOhe1Fv>NUuYRCgizQfN$dK%c2-_d0z?`cLdpaqb9 zjvs(jeP0yW#E$`L>L4IO1A7P{jsa8Pfl3ZESwCf(>-e7ItzV&!{$sCi)yIjUJ7k-g zp#9{nnxsMwGS4<;?R4zTJ4P&J{L4MC02a9^us|y!u?)Bl$bJV;Z^6-qp6YgVnQP8; zkBRV0KeP(FZ9-9HZ2=Ep9ZE`4kpu+wv?#$0REdz(kZ_y8jGk1|a4<73Tl#H*%!!2J zFhPn$upmkj#8@C2bwDADAreqlRTXvCHt0yR{Dbu+&x;t!f~E?$>lu}dp0<}1i9#Jo zq-6v>N9L%0V({280TVf`%rsIg1>R+atjD#~H>Obn;!GL}7C=KH$_cW9phPsPsbU7w zO=VR%5;na~3Nw(vqN)&O2_|$Ai5YB$60?vbBvF+WStKxF1!B`RlOuHCGNNv>8aBO2 z3{^>!q3J@RItxwDjjPuZSI6mL+iYc5qch7RTfxpprydVI99rkrV^8HT zZat5cd(V`ELq>3jdVL)aE|t3ao*pXuqJ}S8@`cAKme~-S) zy$t?7^V@8BIA#pTR>mu#y(^#m73!(B(F8j?J5?VDg_kc|eY<_%8hny29gUUSCye%q zl6L}IwfyPB&;>vH!rwY_()FU}TsIwlKF(4Z;l{?sA}z>ALCE@#p}m&ySi-&+z`m{a zp_rcC_xcrhP5l7%Qt`$+R6FCdsGm;hkpY~iqRKH0Qw;;Awb)|y3TQ3by#jniyH`L* u(eBlDz`O6CT9)q(7l$i+xYYbr`Ms`5rV9R7o&{a+8=bwyF{`5^l)%5rxCVOw literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/_win32.py b/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/_win32.py new file mode 100644 index 0000000..80e30ec --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/_win32.py @@ -0,0 +1,333 @@ +# ----------------------------------------------------------------------------- +# Copyright (c) 2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- + +import ctypes +import ctypes.wintypes + +# Constants from win32 headers +TOKEN_QUERY = 0x0008 + +TokenUser = 1 # from TOKEN_INFORMATION_CLASS enum +TokenAppContainerSid = 31 # from TOKEN_INFORMATION_CLASS enum + +ERROR_INSUFFICIENT_BUFFER = 122 + +INVALID_HANDLE = -1 + +FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100 +FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000 + +SDDL_REVISION1 = 1 + +# Structures for ConvertSidToStringSidW +PSID = ctypes.wintypes.LPVOID + + +class SID_AND_ATTRIBUTES(ctypes.Structure): + _fields_ = [ + ("Sid", PSID), + ("Attributes", ctypes.wintypes.DWORD), + ] + + +class TOKEN_USER(ctypes.Structure): + _fields_ = [ + ("User", SID_AND_ATTRIBUTES), + ] + + +PTOKEN_USER = ctypes.POINTER(TOKEN_USER) + + +class TOKEN_APPCONTAINER_INFORMATION(ctypes.Structure): + _fields_ = [ + ("TokenAppContainer", PSID), + ] + + +PTOKEN_APPCONTAINER_INFORMATION = ctypes.POINTER(TOKEN_APPCONTAINER_INFORMATION) + +# SECURITY_ATTRIBUTES structure for CreateDirectoryW +PSECURITY_DESCRIPTOR = ctypes.wintypes.LPVOID + + +class SECURITY_ATTRIBUTES(ctypes.Structure): + _fields_ = [ + ("nLength", ctypes.wintypes.DWORD), + ("lpSecurityDescriptor", PSECURITY_DESCRIPTOR), + ("bInheritHandle", ctypes.wintypes.BOOL), + ] + + +# win32 API functions, bound via ctypes. +# NOTE: we do not use ctypes.windll. to avoid modifying its (global) function prototypes, which might affect +# user's code. +advapi32 = ctypes.WinDLL("advapi32") +kernel32 = ctypes.WinDLL("kernel32") + +advapi32.ConvertSidToStringSidW.restype = ctypes.wintypes.BOOL +advapi32.ConvertSidToStringSidW.argtypes = ( + PSID, # [in] PSID Sid + ctypes.POINTER(ctypes.wintypes.LPWSTR), # [out] LPWSTR *StringSid +) + +advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW.restype = ctypes.wintypes.BOOL +advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW.argtypes = ( + ctypes.wintypes.LPCWSTR, # [in] LPCWSTR StringSecurityDescriptor + ctypes.wintypes.DWORD, # [in] DWORD StringSDRevision + ctypes.POINTER(PSECURITY_DESCRIPTOR), # [out] PSECURITY_DESCRIPTOR *SecurityDescriptor + ctypes.wintypes.PULONG, # [out] PULONG SecurityDescriptorSize +) + +advapi32.GetTokenInformation.restype = ctypes.wintypes.BOOL +advapi32.GetTokenInformation.argtypes = ( + ctypes.wintypes.HANDLE, # [in] HANDLE TokenHandle + ctypes.c_int, # [in] TOKEN_INFORMATION_CLASS TokenInformationClass + ctypes.wintypes.LPVOID, # [out, optional] LPVOID TokenInformation + ctypes.wintypes.DWORD, # [in] DWORD TokenInformationLength + ctypes.wintypes.PDWORD, # [out] PDWORD ReturnLength +) + +kernel32.CloseHandle.restype = ctypes.wintypes.BOOL +kernel32.CloseHandle.argtypes = ( + ctypes.wintypes.HANDLE, # [in] HANDLE hObject +) + +kernel32.CreateDirectoryW.restype = ctypes.wintypes.BOOL +kernel32.CreateDirectoryW.argtypes = ( + ctypes.wintypes.LPCWSTR, # [in] LPCWSTR lpPathName + ctypes.POINTER(SECURITY_ATTRIBUTES), # [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes +) + +kernel32.FormatMessageW.restype = ctypes.wintypes.DWORD +kernel32.FormatMessageW.argtypes = ( + ctypes.wintypes.DWORD, # [in] DWORD dwFlags + ctypes.wintypes.LPCVOID, # [in, optional] LPCVOID lpSource + ctypes.wintypes.DWORD, # [in] DWORD dwMessageId + ctypes.wintypes.DWORD, # [in] DWORD dwLanguageId + ctypes.wintypes.LPWSTR, # [out] LPWSTR lpBuffer + ctypes.wintypes.DWORD, # [in] DWORD nSize + ctypes.wintypes.LPVOID, # [in, optional] va_list *Arguments +) + +kernel32.GetCurrentProcess.restype = ctypes.wintypes.HANDLE +# kernel32.GetCurrentProcess has no arguments + +kernel32.GetLastError.restype = ctypes.wintypes.DWORD +# kernel32.GetLastError has no arguments + +kernel32.LocalFree.restype = ctypes.wintypes.BOOL +kernel32.LocalFree.argtypes = ( + ctypes.wintypes.HLOCAL, # [in] _Frees_ptr_opt_ HLOCAL hMem +) + +kernel32.OpenProcessToken.restype = ctypes.wintypes.BOOL +kernel32.OpenProcessToken.argtypes = ( + ctypes.wintypes.HANDLE, # [in] HANDLE ProcessHandle + ctypes.wintypes.DWORD, # [in] DWORD DesiredAccess + ctypes.wintypes.PHANDLE, # [out] PHANDLE TokenHandle +) + + +def _win_error_to_message(error_code): + """ + Convert win32 error code to message. + """ + message_wstr = ctypes.wintypes.LPWSTR(None) + ret = kernel32.FormatMessageW( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + None, # lpSource + error_code, # dwMessageId + 0x400, # dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT) + ctypes.cast( + ctypes.byref(message_wstr), + ctypes.wintypes.LPWSTR, + ), # pointer to LPWSTR due to FORMAT_MESSAGE_ALLOCATE_BUFFER; needs to be cast to LPWSTR + 64, # due to FORMAT_MESSAGE_ALLOCATE_BUFFER, this is minimum number of characters to allocate + None, + ) + if ret == 0: + return None + + message = message_wstr.value + kernel32.LocalFree(message_wstr) + + # Strip trailing CR/LF. + if message: + message = message.strip() + return message + + +def _get_process_sid(token_information_class): + """ + Obtain the SID from the current process by the given token information class. + + Args: + token_information_class: Token information class identifying the SID that we're + interested in. Only TokenUser and TokenAppContainerSid are supported. + + Returns: SID (if it could be fetched) or None if not available or on error. + """ + process_token = ctypes.wintypes.HANDLE(INVALID_HANDLE) + + try: + # Get access token for the current process + ret = kernel32.OpenProcessToken( + kernel32.GetCurrentProcess(), + TOKEN_QUERY, + ctypes.pointer(process_token), + ) + if ret == 0: + error_code = kernel32.GetLastError() + raise RuntimeError(f"Failed to open process token! Error code: 0x{error_code:X}") + + # Query buffer size for sid + token_info_size = ctypes.wintypes.DWORD(0) + + ret = advapi32.GetTokenInformation( + process_token, + token_information_class, + None, + 0, + ctypes.byref(token_info_size), + ) + + # We expect this call to fail with ERROR_INSUFFICIENT_BUFFER + if ret == 0: + error_code = kernel32.GetLastError() + if error_code != ERROR_INSUFFICIENT_BUFFER: + raise RuntimeError(f"Failed to query token information buffer size! Error code: 0x{error_code:X}") + else: + raise RuntimeError("Unexpected return value from GetTokenInformation!") + + # Allocate buffer + token_info = ctypes.create_string_buffer(token_info_size.value) + ret = advapi32.GetTokenInformation( + process_token, + token_information_class, + token_info, + token_info_size, + ctypes.byref(token_info_size), + ) + if ret == 0: + error_code = kernel32.GetLastError() + raise RuntimeError(f"Failed to query token information! Error code: 0x{error_code:X}") + + # Convert SID to string + # Technically, when UserToken is used, we need to pass user_info->User.Sid, + # but as they are at the beginning of the buffer, just pass the buffer instead... + sid_wstr = ctypes.wintypes.LPWSTR(None) + + if token_information_class == TokenUser: + sid = ctypes.cast(token_info, PTOKEN_USER).contents.User.Sid + elif token_information_class == TokenAppContainerSid: + sid = ctypes.cast(token_info, PTOKEN_APPCONTAINER_INFORMATION).contents.TokenAppContainer + else: + raise ValueError(f"Unexpected token information class: {token_information_class}") + + ret = advapi32.ConvertSidToStringSidW(sid, ctypes.pointer(sid_wstr)) + if ret == 0: + error_code = kernel32.GetLastError() + raise RuntimeError(f"Failed to convert SID to string! Error code: 0x{error_code:X}") + sid = sid_wstr.value + kernel32.LocalFree(sid_wstr) + except Exception: + sid = None + finally: + # Close the process token + if process_token.value != INVALID_HANDLE: + kernel32.CloseHandle(process_token) + + return sid + + +# Get and cache current user's SID +_user_sid = _get_process_sid(TokenUser) + +# Get and cache current app container's SID (if any) +_app_container_sid = _get_process_sid(TokenAppContainerSid) + + +def secure_mkdir(dir_name): + """ + Replacement for mkdir that limits the access to created directory to current user. + """ + + # Create security descriptor + # Prefer actual user SID over SID S-1-3-4 (current owner), because at the time of writing, Wine does not properly + # support the latter. + user_sid = _user_sid or "S-1-3-4" + + # DACL descriptor (D): + # ace_type;ace_flags;rights;object_guid;inherit_object_guid;account_sid;(resource_attribute) + # - ace_type = SDDL_ACCESS_ALLOWED (A) + # - rights = SDDL_FILE_ALL (FA) + # - account_sid = current user (queried SID) + security_desc_str = f"D:(A;;FA;;;{user_sid})" + + # If the app is running within an AppContainer, the app container SID has to be added to the DACL. + # Otherwise our process will not have access to the temp dir. + # + # Quoting https://learn.microsoft.com/en-us/windows/win32/secauthz/implementing-an-appcontainer: + # "The AppContainer SID is a persistent unique identifier for the appcontainer. ... + # To allow a single AppContainer to access a resource, add its AppContainerSID to the ACL for that resource." + if _app_container_sid: + security_desc_str += f"(A;;FA;;;{_app_container_sid})" + security_desc = ctypes.wintypes.LPVOID(None) + + ret = advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW( + security_desc_str, + SDDL_REVISION1, + ctypes.byref(security_desc), + None, + ) + if ret == 0: + error_code = kernel32.GetLastError() + raise RuntimeError( + f"Failed to create security descriptor! Error code: 0x{error_code:X}, " + f"message: {_win_error_to_message(error_code)}" + ) + + security_attr = SECURITY_ATTRIBUTES() + security_attr.nLength = ctypes.sizeof(SECURITY_ATTRIBUTES) + security_attr.lpSecurityDescriptor = security_desc + security_attr.bInheritHandle = False + + # Create directory + ret = kernel32.CreateDirectoryW( + dir_name, + security_attr, + ) + if ret == 0: + # Call failed; store error code immediately, to avoid it being overwritten in cleanup below. + error_code = kernel32.GetLastError() + + # Free security descriptor + kernel32.LocalFree(security_desc) + + # Exit on succeess + if ret != 0: + return + + # Construct OSError from win error code + error_message = _win_error_to_message(error_code) + + # Strip trailing dot to match error message from os.mkdir(). + if error_message and error_message[-1] == '.': + error_message = error_message[:-1] + + raise OSError( + None, # errno + error_message, # strerror + dir_name, # filename + error_code, # winerror + None, # filename2 + ) diff --git a/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/qt.py b/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/qt.py new file mode 100644 index 0000000..b406677 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/qt.py @@ -0,0 +1,118 @@ +# ----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- + +import os +import importlib +import atexit + +# Helper for ensuring that only one Qt bindings package is registered at run-time via run-time hooks. +_registered_qt_bindings = None + + +def ensure_single_qt_bindings_package(qt_bindings): + global _registered_qt_bindings + if _registered_qt_bindings is not None: + raise RuntimeError( + f"Cannot execute run-time hook for {qt_bindings!r} because run-time hook for {_registered_qt_bindings!r} " + "has been run before, and PyInstaller-frozen applications do not support multiple Qt bindings in the same " + "application!" + ) + _registered_qt_bindings = qt_bindings + + +# Helper for relocating Qt prefix via embedded qt.conf file. +_QT_CONF_FILENAME = ":/qt/etc/qt.conf" + +_QT_CONF_RESOURCE_NAME = ( + # qt + b"\x00\x02" + b"\x00\x00\x07\x84" + b"\x00\x71" + b"\x00\x74" + # etc + b"\x00\x03" + b"\x00\x00\x6c\xa3" + b"\x00\x65" + b"\x00\x74\x00\x63" + # qt.conf + b"\x00\x07" + b"\x08\x74\xa6\xa6" + b"\x00\x71" + b"\x00\x74\x00\x2e\x00\x63\x00\x6f\x00\x6e\x00\x66" +) + +_QT_CONF_RESOURCE_STRUCT = ( + # : + b"\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01" + # :/qt + b"\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02" + # :/qt/etc + b"\x00\x00\x00\x0a\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03" + # :/qt/etc/qt.conf + b"\x00\x00\x00\x16\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00" +) + + +def create_embedded_qt_conf(qt_bindings, prefix_path): + # The QtCore module might be unavailable if we collected just the top-level binding package (e.g., PyQt5) without + # any of its submodules. Since this helper is called from run-time hook for the binding package, we need to handle + # that scenario here. + try: + QtCore = importlib.import_module(qt_bindings + ".QtCore") + except ImportError: + return + + # No-op if embedded qt.conf already exists + if QtCore.QFile.exists(_QT_CONF_FILENAME): + return + + # Create qt.conf file that relocates Qt prefix. + # NOTE: paths should use POSIX-style forward slashes as separator, even on Windows. + if os.sep == '\\': + prefix_path = prefix_path.replace(os.sep, '/') + + qt_conf = f"[Paths]\nPrefix = {prefix_path}\n" + if os.name == 'nt' and qt_bindings in {"PySide2", "PySide6"}: + # PySide PyPI wheels on Windows set LibraryExecutablesPath to PrefixPath + qt_conf += f"LibraryExecutables = {prefix_path}" + + # Encode the contents; in Qt5, QSettings uses Latin1 encoding, in Qt6, it uses UTF8. + if qt_bindings in {"PySide2", "PyQt5"}: + qt_conf = qt_conf.encode("latin1") + else: + qt_conf = qt_conf.encode("utf-8") + + # Prepend data size (32-bit integer, big endian) + qt_conf_size = len(qt_conf) + qt_resource_data = qt_conf_size.to_bytes(4, 'big') + qt_conf + + # Register + succeeded = QtCore.qRegisterResourceData( + 0x01, + _QT_CONF_RESOURCE_STRUCT, + _QT_CONF_RESOURCE_NAME, + qt_resource_data, + ) + if not succeeded: + return # Tough luck + + # Unregister the resource at exit, to ensure that the registered resource on Qt/C++ side does not outlive the + # `_qt_resource_data` python variable and its data buffer. This also adds a reference to the `_qt_resource_data`, + # which conveniently ensures that the data is not garbage collected before we perform the cleanup (otherwise garbage + # collector might kick in at any time after we exit this helper function, and `qRegisterResourceData` does not seem + # to make a copy of the data!). + atexit.register( + QtCore.qUnregisterResourceData, + 0x01, + _QT_CONF_RESOURCE_STRUCT, + _QT_CONF_RESOURCE_NAME, + qt_resource_data, + ) diff --git a/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/tempfile.py b/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/tempfile.py new file mode 100644 index 0000000..da2307b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/fake-modules/_pyi_rth_utils/tempfile.py @@ -0,0 +1,56 @@ +# ----------------------------------------------------------------------------- +# Copyright (c) 2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- + +import os +import sys +import errno +import tempfile + +# Helper for creating temporary directories with access restricted to the user running the process. +# On POSIX systems, this is already achieved by `tempfile.mkdtemp`, which uses 0o700 permissions mask. +# On Windows, however, the POSIX permissions semantics have no effect, and we need to provide our own implementation +# that restricts the access by passing appropriate security attributes to the `CreateDirectory` function. + +if os.name == 'nt': + from . import _win32 + + def secure_mkdtemp(suffix=None, prefix=None, dir=None): + """ + Windows-specific replacement for `tempfile.mkdtemp` that restricts access to the user running the process. + Based on `mkdtemp` implementation from python 3.11 stdlib. + """ + + prefix, suffix, dir, output_type = tempfile._sanitize_params(prefix, suffix, dir) + + names = tempfile._get_candidate_names() + if output_type is bytes: + names = map(os.fsencode, names) + + for seq in range(tempfile.TMP_MAX): + name = next(names) + file = os.path.join(dir, prefix + name + suffix) + sys.audit("tempfile.mkdtemp", file) + try: + _win32.secure_mkdir(file) + except FileExistsError: + continue # try again + except PermissionError: + # This exception is thrown when a directory with the chosen name already exists on windows. + if (os.name == 'nt' and os.path.isdir(dir) and os.access(dir, os.W_OK)): + continue + else: + raise + return file + + raise FileExistsError(errno.EEXIST, "No usable temporary directory name found") + +else: + secure_mkdtemp = tempfile.mkdtemp diff --git a/venv/Lib/site-packages/PyInstaller/fake-modules/pyi_splash.py b/venv/Lib/site-packages/PyInstaller/fake-modules/pyi_splash.py new file mode 100644 index 0000000..934d288 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/fake-modules/pyi_splash.py @@ -0,0 +1,211 @@ +# ----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- + +# This module is not a "fake module" in the classical sense, but a real module that can be imported. It acts as an RPC +# interface for the functions of the bootloader. +""" +This module connects to the bootloader to send messages to the splash screen. + +It is intended to act as a RPC interface for the functions provided by the bootloader, such as displaying text or +closing. This makes the users python program independent of how the communication with the bootloader is implemented, +since a consistent API is provided. + +To connect to the bootloader, it connects to a local tcp socket whose port is passed through the environment variable +'_PYI_SPLASH_IPC'. The bootloader creates a server socket and accepts every connection request. Since the os-module, +which is needed to request the environment variable, is not available at boot time, the module does not establish the +connection until initialization. + +The protocol by which the Python interpreter communicates with the bootloader is implemented in this module. + +This module does not support reloads while the splash screen is displayed, i.e. it cannot be reloaded (such as by +importlib.reload), because the splash screen closes automatically when the connection to this instance of the module +is lost. +""" + +import atexit +import os + +# Import the _socket module instead of the socket module. All used functions to connect to the ipc system are +# provided by the C module and the users program does not necessarily need to include the socket module and all +# required modules it uses. +import _socket + +__all__ = ["CLOSE_CONNECTION", "FLUSH_CHARACTER", "is_alive", "close", "update_text"] + +try: + # The user might have excluded logging from imports. + import logging as _logging +except ImportError: + _logging = None + +try: + # The user might have excluded functools from imports. + from functools import update_wrapper +except ImportError: + update_wrapper = None + + +# Utility +def _log(level, msg, *args, **kwargs): + """ + Conditional wrapper around logging module. If the user excluded logging from the imports or it was not imported, + this function should handle it and avoid using the logger. + """ + if _logging: + logger = _logging.getLogger(__name__) + logger.log(level, msg, *args, **kwargs) + + +# These constants define single characters which are needed to send commands to the bootloader. Those constants are +# also set in the tcl script. +CLOSE_CONNECTION = b'\x04' # ASCII End-of-Transmission character +FLUSH_CHARACTER = b'\x0D' # ASCII Carriage Return character + +# Module internal variables +_initialized = False +# Keep these variables always synchronized +_ipc_socket_closed = True +_ipc_socket = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM) + + +def _initialize(): + """ + Initialize this module + + :return: + """ + global _initialized, _ipc_socket, _ipc_socket_closed + + # If _ipc_port is zero, the splash screen is intentionally suppressed (for example, we are in sub-process spawned + # via sys.executable). Mark the splash screen as initialized, but do not attempt to connect. + if _ipc_port == 0: + _initialized = True + return + + # Attempt to connect to the splash screen process. + try: + _ipc_socket.connect(("127.0.0.1", _ipc_port)) + _ipc_socket_closed = False + + _initialized = True + _log(10, "IPC connection to the splash screen was successfully established.") # log-level: debug + except OSError as err: + raise ConnectionError(f"Could not connect to TCP port {_ipc_port}.") from err + + +# We expect a splash screen from the bootloader, but if _PYI_SPLASH_IPC is not set, the module cannot connect to it. +# _PYI_SPLASH_IPC being set to zero indicates that splash screen should be (gracefully) suppressed; i.e., the calls +# in this module should become no-op without generating warning messages. +try: + _ipc_port = int(os.environ['_PYI_SPLASH_IPC']) + del os.environ['_PYI_SPLASH_IPC'] + # Initialize the connection upon importing this module. This will establish a connection to the bootloader's TCP + # server socket. + _initialize() +except (KeyError, ValueError): + # log-level: warning + _log( + 30, + "The environment does not allow connecting to the splash screen. Did bootloader fail to initialize it?", + exc_info=True, + ) +except ConnectionError: + # log-level: error + _log(40, "Failed to connect to the bootloader's IPC server!", exc_info=True) + + +def _check_connection(func): + """ + Utility decorator for checking whether the function should be executed. + + The wrapped function may raise a ConnectionError if the module was not initialized correctly. + """ + def wrapper(*args, **kwargs): + """ + Executes the wrapped function if the environment allows it. + + That is, if the connection to to bootloader has not been closed and the module is initialized. + + :raises RuntimeError: if the module was not initialized correctly. + """ + if _initialized and _ipc_socket_closed: + if _ipc_port != 0: + _log(10, "Connection to splash screen has already been closed.") # log-level: debug + return + elif not _initialized: + raise RuntimeError("This module is not initialized; did it fail to load?") + + return func(*args, **kwargs) + + if update_wrapper: + # For runtime introspection + update_wrapper(wrapper, func) + + return wrapper + + +@_check_connection +def _send_command(cmd, args=None): + """ + Send the command followed by args to the splash screen. + + :param str cmd: The command to send. All command have to be defined as procedures in the tcl splash screen script. + :param list[str] args: All arguments to send to the receiving function + """ + if args is None: + args = [] + + full_cmd = "%s(%s)" % (cmd, " ".join(args)) + try: + _ipc_socket.sendall(full_cmd.encode("utf-8") + FLUSH_CHARACTER) + except OSError as err: + raise ConnectionError(f"Unable to send command {full_cmd!r} to the bootloader") from err + + +def is_alive(): + """ + Indicates whether the module can be used. + + Returns False if the module is either not initialized or was disabled by closing the splash screen. Otherwise, + the module should be usable. + """ + return _initialized and not _ipc_socket_closed + + +@_check_connection +def update_text(msg: str): + """ + Updates the text on the splash screen window. + + :param str msg: the text to be displayed + :raises ConnectionError: If the OS fails to write to the socket. + :raises RuntimeError: If the module is not initialized. + """ + _send_command("update_text", [msg]) + + +def close(): + """ + Close the connection to the ipc tcp server socket. + + This will close the splash screen and renders this module unusable. After this function is called, no connection + can be opened to the splash screen again and all functions in this module become unusable. + """ + global _ipc_socket_closed + if _initialized and not _ipc_socket_closed: + _ipc_socket.sendall(CLOSE_CONNECTION) + _ipc_socket.close() + _ipc_socket_closed = True + + +@atexit.register +def _exit(): + close() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__init__.py b/venv/Lib/site-packages/PyInstaller/hooks/__init__.py new file mode 100644 index 0000000..792d600 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/__init__.py @@ -0,0 +1 @@ +# diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50a7235fba3afb05fc3ca20e7341ca96370e485a GIT binary patch literal 188 zcmZ3^%ge<81gF(}(wTttV-N=h7@>^MY(U0zh7^Wi22Do4l?+87m7hV9zx>^;V)7Dm zV@irjD^v3d3w3i+Q#EpxuBRINPJ*sWMurn03(W+ GfnorebTD}U literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.Image.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.Image.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37dac9ba5624b9998b8dbe7af3d4515c56f6731e GIT binary patch literal 460 zcmYjNze~eF6n>Y)pC!_|xHyP{P%(9?1(B{&NJ~LnN7~ z;-4Y7L~zRL~CBxeaKa$9AW#1N0;X5RgS{WVu@4c36`q9Y1_kghuEFOsejK+0E63gV2dZGGgIiU~$I0t`$cS zcZMt+I=0_-q#rY@?|MDtkxp||3uWx$OyaB?MLjvs7EV-}E0y}A+2$p8gEn=mLd{da zkU30ac)$NJ(uzHXDMDxz^=xm2uav|-m!&zYQ0ru7*Qb<)e$bCZEX4-C3B@F~Frm!i vL#kp2q1s56F->$r$YdW#C57`x)FS7(bF3sm8j znNyNlq*qY+i^C>2KczG$)vkygXcx$##X>;h12ZEd;|D1Q5$Oq<4g4Tj#0nG!0REyu A-2eap literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.SpiderImagePlugin.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.SpiderImagePlugin.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..732b5d5c077152eac36dd6620f21e586279237c5 GIT binary patch literal 238 zcmZ3^%ge<81gF(}(pi}q7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfoYmFUii#D@iT# z(`3BGpIVWeQ<{>Rl9^kOUsO`OlHoH*=dVO}tC+mR+?bN0(#q7l!b07g)YRk*-IDzL zoS3rIys{Xd%%qs&%#u{yg2d$P#PrnSn1D*pyyB9?oSf7m{fzwl>|!vf8{p}q7hI5; zl3L`M3se`7Q<|Qcr&mz2KczG$)vkygXd}qM#X>;h12ZEd;|CcA5!nga4g4Tj I#0nG!04<0_+yDRo literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PIL.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fec71158a6d0a4d5fd4714025ff9f7382db3b036 GIT binary patch literal 296 zcmZ3^%ge<81gF(}(tTJM7#@Q-Fu(+5e3k+-rZc27q%bUEjABS-NMTH8tm0*0h+;@# z3TDt`)?~fKUXq=eSCU$Ei#4D!u*CEhdq8DyW=g6Ngl`7p0~wwHl_eSZd48IVxA;>l zl53-XIfidQmx23h&b-`y%EFEKZ!q^PtqHLtKxHzzeUIYYN3KR+j?EH$qz z#wRl=rZ}@CRkt89IXf{uwKyiA(lf8PBrzu^wMaiBKR>$|OzH-B`sfu@{^GF7%}*)K zNwq8D0h-SU#Ko#W;sY}yBjX1p24OeG3qr0y)WH9NgMm?Cg69P5iwtrN{2*8a3LpR; CV^-h* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QAxContainer.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QAxContainer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b0c70196a881b4830f9608b7c640280e650db31 GIT binary patch literal 383 zcmYjNze@u#6n^PhDdKGk;vn22bhy*OTeMijL4+bLZpYz~HnA6)%l$}NdYhyFf&K-G zxcGm#wBU4;;N({5*2!E|=$E|5mynn5d+*saH$dZkztztx0AJq9duA^cL6B4A#4G2xBAXM}il~?ukVz-@N z3aK#XG;@ZEap{C{JdjSRvQoRK1;H)jGzbbaWJFi8D2X#Ai&~cnoat|hD!~fN7nqk~ zi<^sMU*O1B*)XRfO>ItTFSJ!0bALp|$ZxT(FPWltf_nqpr_x{XaIjQgX1kqtl%Z-oWkCn Nc|U&KE>~90{RbkOasB`R literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qsci.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qsci.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fcb58eb369bc39608c3feaf630c958b08312fb2 GIT binary patch literal 375 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)c#9T0icq9Qa5xT*^z!V5=5jxhinlrXALw78 zh>QP+OAAgn2~KW>Zk^0kg?{t$<-JFePm*WL+CW2Aq*=kW>oKFNtPB$R?Ptuq|nDy4N4S|FKAxF z7FTD-fgnksig5`d&m9gB#g0l-9^8Pq3A$_$NT$HaNHiitkip6w4wm$#JH4{6Jhv|+ z=4R!h*-lbA=5ShUYE1oNd8BP-VvJ`y2)8HbWHml*Z(@6I@zm~o*qtfbyR+_ZAGhmK H)c^ehSVV5w literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bc9dde64cbe8acb3e7d802dc78a0bc61b4e3086 GIT binary patch literal 1045 zcmZ8f-Amh06u&n~)6c8}i&ZwT13MIKhi)<*b3Q1@zzx4Z2pN)^Ynz!iHMw=GAow!q zoZudWl`&X0#^%_|9`;}C#Yn)CC&4G*0=^8#a5wET8gG(we&_3V&$%~WI4%On`gwCY zf6f4K;u_v!|A8|D0`LY%K!OV3T}>&lNbwW|6hM?jeAZ-iQOM8iw*(3RKFY^X)Zn~|b}cdf zd~FOxC1#a&bF{mp>PmaIho!)!stBoq68nPc_EN~Mh%w^-%{CwfQFMdYehvtBwk0@E z?qweIhfdx6$NkXm&Lg~3RHcf7mR4jUM2s~#SHZ{*%v5LbuuaY4jX+k+$+u5`UtC;l zuuXTi|Ef)?x}BV0qad_g$Y51fgmqL}7pCQ$pp#uPWpQ~`%p+ZB8{t;7 z`KHXY=A6aZa`ilPzja0rH1`JF-&g-bghN9Jo$CNbw!-dn48{)pufu|1>VWMrf+pK% zv3*-~gJvBNhC|1R&aFocE?Jw~;p^19;QRR7_&#lR4Om?RCYQ0ej04!fP*c=kBhk4x zb(H8mO!OLapB9hO!-whN@1mI=vC<=EV$@2Ez6{rx+HxZr-yPo`uir7FDJz6-vwiJ600DwH z#K=bo44{Y_PYB>upI-&~y>I#}evKH{&@jKNa08Van2<12UPx$41)-wHsJv>dmfP*( zQb>h4r@1>+j7v94l7VzHl~?St9)>rJ(=aTph!LI1;xx&XEbCn+aIVXgHG&nEFEFcM z^YG#*5I7E0J}junGKW*ziyW0CJQz_i3Ru(zNutkW(!%5yvF z;QUNev0{mE(_&t4#t9j6dXleeUe&rh)MjcTgr-}7nqxR#-k-KNw!OD#VxNB4rxVz@ Ov+i#nH>;IbgZ}}FWpXY6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DCore.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DCore.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a1d581fa2c1a0e6ec35fda1efa923af2ee1f601 GIT binary patch literal 379 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsHKdW#kv6htV};&vPyY4hxb=6)q<@is^Q1N{pW zaq<6fX~F3x!O5-At&_Q`&~IM8y!S}*N%Cx2Ye?&Tx79BUgubfcU*=yj+tmn2<16en@CW6GD?7qw>1GUhcMw zt3)cyIThYeF)qC*O$XA;m8jUI6^6Hr(=aUUh!MS$#aSwpEUhj}u+YbpHG&nEFJNB5 z7U=Q>B{)V(3=5j%xyvc-MXpLyjz%;Yp%&{R$rN=n+#BFNm1yM-2TS_W-FDGYzSmJl z=NDrou=KKGVKw5E3^_d$n;KTVTOMnhnGnL+4uFjbI9-iT$DcUwVK-^J~Po0uA%KYBylHg$W5#RaUXfdJx<&PJ^JdLPqpX7A0|}WLfVsfirzfStD3s`2yw@ zY;k>Yf&`9`%JPDWG<7(ogV0fN%+Z*NG3u~Bl1x!2!GjSVQi)dXaImB=-RTxR<+(j| zblw(8uH2+p)SFREa!${(P0gyFEswR$ObFp@2f*e8oUX>F?M-a&Eu7k|54$x5dw16T M?c;Vevg*@+0HCmNng9R* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DLogic.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DLogic.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ede7797a3ddcee8c682ee7bbf3ab2fdb4ac894e GIT binary patch literal 380 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsHKdW#mj2qF||aXSx=^z!V5=6)tEz0J}8K>q?o zT>L*=T5!5aaB?ej>twDf^qZG2?>&-yk~|y622y(8Z}$rgp|7g=m;RT`4^{GjD5997 z2)h^~4FLx22_y8X=C3@p-qqbTw??&V)X=}Hb_17Ngi=3~j!z+lm_i&d5Lb=$a<@}l z#zGR#A-9K;abbr^G7xqq^NL;8egBqm@cq&V8C5%3lqR_pWxdB@lB;9N8YPm57c{S6 zi<^rRFD8*E^I-vTmRTGi2rZc;+#5kW^4hHD2`0fxNiZON5Z=li4wm$#Tb-gS9lI-! z&f7_!1$J62>dh#jLk?&8reamk7RSnFI>vamgK%?#PFLg8bS9?r7EaC9huNBy!!MXl~-_h literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DRender.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DRender.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d74123d1f68228daedcec49b0c6ef9c991e27e3 GIT binary patch literal 381 zcmYjNze@u#6i)7}6!A6%aS(11I@~GfEn0LDL@3hgb_9;JiM`O=uOuzr=IDQ*e}N({ z{vR$aINc;TxfQx~GN}svlK1!$^74J}Jv+`C(0Jc%^-BwYFLU^Z{YPf|nmhmk2;?Av zA%wsJ6jJL60`RKi7f8Pk?QkWm5$hT>>~C}3fYk;jBq~%85t`GK(6q;>ylkvi+wJlq zl?roCg+Ek`OFz!Cf%FR{jCNIzq8r9(6je^lh^}Nwo(UzZdY7eG=x?eT!3xV4Ff(Fv zbbf?VoFFBJB~6RMgI@2G>b zE8|)Cc{#5)lZ*^GJrV0#%=9e}b(-1`!s!-(%`rG$-k)wTc7wNg;+}rErxUPq=iJ{u KZki>`)PDdI;Be~z literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtBluetooth.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtBluetooth.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16e089420c1a60f812994b95ca536e7878f63009 GIT binary patch literal 382 zcmYjNKT88K98K=59O7*X;vn22bhy*OTeMhk5ur$n+i`NF&CgzF?r(C%+Z_D{`Uwz#RfI)l02)(NH3t#nny0_*vsCI>#`gdJ!;%bXf8f4N9D5MZmhzAVBWplmS?Uom@ zkc4x{okB7$oG?j7!pUS_XIDlL+%OJ7P?;g4%E_WM$)%`_K8s1Nj;R`yNFrX)ybfDj zpC9`%iF}zCCB#`~bAUl;%Ov6c7~-+tVSQgP33f^bBQgZxuiW8anZ9JZTlS>u^yC>Y zK-p#Jq~*eBMF}l9oaUPi?=!YALw78 zh>QP+OAAgn2~KW>Zk^0kg?{t$<-JFePm*WL+5oNh{q~?R0KTf?U*=yjKh((s5Fm&{ zjC_Q^0E(#bgaBUk{8gaW`=-C<*NAZi4fDHdH&D5S2?=xMg@k4_AvEbTDlZ%B}I7@|+WxdA|Ec7vDjbMf43(PCn z;`;nJNN^k|F)C=1=MJZ|A2}*bc`&BQIB2t8Aeo|0hWkT2pfXsw!@-iibf;5vmFITV zS%ighvtm(i#wi(bdMY+Gsd}_L(l#>@LbDw}%?X^W#;5H~Z0{|a+N}?}HHE!9>;Cp} JyBebU@*ltLa037U literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtCore.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtCore.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..488bd4f0bf1083bd138dfbe7875e467ab4333e1d GIT binary patch literal 377 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)c#9T0IEYZB#YK*TBW<3&(A=*iE#Btnf1rPX zA};<@UhkX!nqQ;F6>6B@Rl9-9EkbFSD=(ywK|&$vGmw{!^>VjU zTqIHv&Ox{%#kh2%G#yGeSE6E<^)S3)9Kx`)B1ZL27H6qYvaI)5LWDl1tWlzfd_nUH zwzxh&4iXXvN{k9f^4#G7{m4;i%7ZZ^ORBUQc^=5gbZDwMOXFCWtC+K7~K5cJedvDRyZhhFTDcZZU?r$Hr Jt0Af%{{cmRZn#T>;F#hStt%%I8q5+tn2cuOQPB_+PF#56u7wIDSwB{eTOGqu=HlkJvN zK&5A1aY*Q={S`&~iwtrNyd4!Y KL_x3!6yg9pG;e+Y literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDataVisualization.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDataVisualization.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50b6aefe468dc4c90eb08e0b951bf211423a0e57 GIT binary patch literal 390 zcmYjNy-EW?5Z=8r62$8i#6q}6NO7ly*Jv<}AVQD?!QwbLHrX+^WN+_hH{w}Y`Ud(0 zirDxbHVIf=C0N-7(xq}QD&(6VW`>#hhIzKEHKg&r+a44KLSI$#5A!dW?d#wHQA9CE zG4?S=1_BJm6GrG&+b;s$@08yroc%_e@F%(gQXkx7VHb}bc(L>+^#y& z>o1uc5zcOjVu^6mVqR~?2_11b&et_-^#FOG-PFVwPqz?mj?vMwe%jvH_THk2-TJUw R6SQ+@-QPTJR+3lm{{f^FbqN3f literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDesigner.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtDesigner.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76ac3324dcfe310c2b698a754a0fcd5b6393f8f7 GIT binary patch literal 381 zcmYjNze@u#6i#|pig=rXI0&~09qx4S7AguHy;d(XDLfehaFJHw)e&{uW%hxJG1hlV^Lh8Pwo z#sS8th5$qD2_y7s;uplc53FD+*+I4 zd?<~-v{*D+al*y|PV-G8R`sopOqy93as0Pv>a;(c_7v^i+4r}P K+ttdess8{ovvEZL literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtGui.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtGui.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..704619b84e04c0e1d83baf8958c018d8ed9f390e GIT binary patch literal 376 zcmYk2ze@u#6vvZ0D~EWSf;b4b2p#Tp@D?q0EJBeM2jMt4(&pI<&HYTSc$=gDf&K-G zxcGm#wBU4;;N({5*2!E|=r=E4-g_kZBzZQ?Eu{2**d3J`LSJ?9Fa0lB9INC3QA9CE z5%w@f8UhU36GrG&&0qOyy{CH{UV~~^sHuO~?Ix~v2&F+L-GD+0F@<=@KwLIAtNmVi z5erE;hukS7Z_a_if{4N{#f=RGbG8~f;2!HJkM=Scu?OxfJuG5#D zf;nlqG+I$Y3l8V`w&K)J7AMN)I>vauhj43(&er48a;KL27S62pht-~;gFEy7_Hnl! HdHvx(%=T|I literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtHelp.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtHelp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc44e660841de1bdcebe7f05f5395006ad10c56a GIT binary patch literal 377 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)c#9T0s!*iGMUI0bZJxc*T<%BG;%$!p2l^K% z;^P0|(t^`Xf|FaJTPJf>q2IiGdGC?rljPa5Hjvi)etS?D2z^z>zs$d6eyEcNL=nXt z#n{If83-^KPZ*(BJ%1JG^}gw^`88@>p@#WgwHvtHB9w-i@%(qM(cYbPfBU#y IjlBBtA4PO;nE(I) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtLocation.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtLocation.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c16a4827f1ef480e953ee79351366118af947bd7 GIT binary patch literal 381 zcmYk2F-rq66vvZ0D@D9bK^%lzgbsH)c#9T0icqA*?Fby{CH6vd$=xL_-sb2x&`+R< zi{Hbg1*e+?C$~bkPUfmY|9ScI-XqB`$+P2Z0i*ZB?y$4~_^OM4*?-C6*dz~t00KEk zVF)3x0EN_gf&jdl`731BhjzFTHi&f%TK0F{Zoz5?6B6Y*hzQN7AXLPRs;ky!wcjf* zh0>UFTKHqlxbhPzN6OE2QM0RN6x}dRqo{HcM$Ar@X0p(#Y7Usdg*m2b5UjC!0gD>8 zL>H$>;1ua%TvCze9;Y-;JS`O}z}qBRr%Et=-{hMPIqsEBiX|`?@P* zteF&kRxX?ERFW~L=f$>x)$dj(#^yGJaJ~m%dkW6hpwPzaZLaK literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMacExtras.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMacExtras.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d501f1f08a656a9ce53a69e0752d54c6012ab89 GIT binary patch literal 382 zcmYk2K}*9h6vva+$q;)}5D!8x!Vaw->_vw=i3n3Ryp>AHnz)9gX`5tYy?OK-=qFIb zi{Hb`2A+BnJb4@Jwv*{p*gr3S-g_kZC3&{24WRYD-|iO%0AE${FY_;%AL`@*V1OY5 z3G^WZ1|X0aPY{4tJ%1JG^}gw^`88}@gNFHCwHvV9LKug+@uE!9)`D+kuWT+m}0$?CRr+!EbBeWk*TL(u^Bi40cmaImB=-RTrv<+)vT ziK4Ty5=gpPv8Xqb6b~6W6`Pt?JzO4Xo0$;8*$#ls2{>7ePurW=-djAiTOW373ij@- M`|;y;HAMC8KdE?eod5s; literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMultimedia.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMultimedia.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..818c478411440e13df72231dbc932bd64ebff601 GIT binary patch literal 383 zcmYk2ze@u#6vvZ0D~EWSf;b4b2p#Tp@D?q06roCs+i`fL&9fJp`lewzUZ(hE<_ek0XRLKLPh+>W+ z>|u;F1Q@g@jL@r^zw*_3Pxscm2Gy=mQ~$2pO5Sg%c*pNI03yYj$M>!42aO1eF;ws&=v{O>!wJqt9ZJt7EDLC6b62G_PTc z>$77&CXp}mqJ%ihYz{C8ZJ8w8A45F$JFM>uCc#e0U_^!>{FOT#Ea^+PyJb(hPETGG zT(Sr#BTiZ_j8>G;g2QRPsc`kn#gVd^jxnC?Al#aulhydN+==DBg;T5jVYR1d@6Nox LecY}`UjO?KFfno= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMultimediaWidgets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtMultimediaWidgets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e82caca8105f96d2bd6beccab2581ec61b7a7bcf GIT binary patch literal 390 zcmYjNKTE?<5PvVR62xo@;vi%ZIwU%nMT;FpsM6vfgg|)hJDW#e{=S!DHb=jKegZ{Y z{2neXIAs!?+zQ<~`BD}7yFc6=clSH)*)%th!ux(_SZWA;)yY5fzhHi-f(Jwq#T-T0 z!x(7@FlbL0p;u+U@KwL3duv{UYFDVKf7j(EuC@rJK_=aRLJBd3c)&nhHrK1&Zh0OH zNjQhxDJ0{<36o?boJ{65cVz^@4dW05l^HUsCRvmwxfGSrXEDjunyNvGB;p0lYqABL z9s4nfe3=&|#93x@fI(=>B;o!T;<4XheP1vMc1i{#G6dnT+;FgDUwXS+_N43dw8}wFFVIBI9(?2J#_Dy z%=-xK##LQyd(|__SUR@dlwpCAq0Bg%>SN4eWU+uL0>Q%pdFO8)_ppGV% z3lj~M8kuNpb*)>kIH>$I-RA<+v=ZN`(E~KeKMFS% z+7{U9m%Fwb?b@CDHBnLC`fqZ@CIa8;Rky4DOta_UxV1IZJxc*+^;03-sb3kpnriP zF8&`bEjZmIIJp(Nbuw2K`pwIi_Z~?;NuEt}18KeQcSc1Gp|7g=m+_a(4|Vc@D5997 z2zwZ#8UhTpCydamp1<<-de89IygIF2qNed(wVSxyB9sQ1asvt}#1!Ho1KDk^m%F{< zB9@A94#LS5E*Q-n){iwcw0yR1N{pW zaq<6fX~F3x!O5-At&_Q`&~IM8y!S}*N%CwMJ4osMxIHX1gubfcU;1CNJXOg9qKIOS zBJ5&}Gz1v5Cydamn!obYdRKS1+#1zxP(%N&+6`Rp5la0`IzELIVhVAL1eLdO^{4iIk6(8Xqan$FC0-om-r`Y>B_bTl>Y?;iK7 Ikyju71ISNrCIA2c literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtOpenGL.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtOpenGL.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6f5bc0873636df145cd2ca81ad066c7cdee94ad GIT binary patch literal 379 zcmYjNze@u#6n?q0QpDR7#6h@4=y0clw`j3r5sJ3B9f2clVlOoJGimWQNB;x;3lwqj z|8Qx+=_bL+tjxvt@08#`|GsSQr3b)!`rJA6Xo0@&FVl5)dID zAuxa;W;`K)R~^5=`n_-Z8-9%%*U&J(tLp|TcL=3Hro4c%l*N?A1J2}SW3$}v78kKp zL>y7H63w7#oC+N)mx5ES}&F?_(?*VE~;cR_>+TPUm-olyP`mkFwIJmR!Zy$H7 Il~*(W0VzaqHvj+t literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPositioning.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPositioning.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25f072a8fe4432e050602c6c0f783c5b90c0e13b GIT binary patch literal 384 zcmYjNF-rq66n^PhDdKGk;vn22bhy*OTeR3wgd#0&$H9>{u@{<4?k;KZHb?(~{sKi@ z{2wkYINc;TxfQx~GFKJ)z2xIdc<+5LdA98>FnB-g42v4TS9SP@^(Pj`Mmzukf;c27 zKnQ9;5v@HTfLF7B5t{tK3O0f|sa-?U`mU~8Wi zok_vO&`XPDqm@W9=JY(@Hh$I9)rq0Gg%FzW0cuU*Y<+z?{?zf`;+fO_aN09CxU=tX LA9t(BtB?NyxAt6bPY{4teSQ_{_kk5`1a(~NgQoRu!cAE1AdI72`4J`=;h69tCGx7dS?zbr zOD+{+j0mq#lu0j6)3Nk&B@DZ2M9~dpB#J6KrdVgvBuj;oRbxOo61q%P$4DXh0u~0g zyuLUMIZ8q$ijwd=cNrnW*i~uD!U^G%utNu-q>8v18jjJ3$Z+isM=Scuy4|v;e6Odv zf^yX_GQ;(}8TA^-pY literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPurchasing.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtPurchasing.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1571bb66106ef17c4f04b09d2adab1a21de49be3 GIT binary patch literal 383 zcmYk2K}*9h6vva+$q;)}5D!8x!Vaw->_vw=iZEouTPc>TiECJzwn;kdZAZU>egZ|j z_&vOA;Hf9UlefWcJDE;}{qyqYy+@K?l4r}>0$T5f-C=0}@KqQ8GXIjru}&TU1{gAs zKp#S200N2e1Oa%}^H+gh@08 zytz0HI7$K~ijwd=cNig2?5H$l!I;p;9z3i M-#zZuL)8EN12YkFDgXcg literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQml.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQml.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09527fcc36cdbf4f07193aa1d4dc684048fc585b GIT binary patch literal 556 zcmZWl&ubGw6n?Ymrkm0gsfu+ELM}qUtfyQ=Z0SXWpa~v?WntOuyf$NJf6Yuv*He!9 z5A-jnNH6{$Ub2uw*puMNTcNk&!P(V_;G3Dp_q};PzL`(9y#w05J{q3%Fb9iEZpOs7;MG&};pub9+X0H>5Pk)gYjlVL~y97|LodE9w|$6A_9cV99a%s<%@) zqvB;ERmeFCccvJZ?letLrJE~JzeQ|mS6M-D%s2)?WltH^Em@qULdnXSup|_9f0KqP zl+~Rm)vY3>1>`Yrs${iW!@rrGnl;&<;kwp*^Y+D4KM7-BiCKY3p7%LoH0`T2<^CBa zXa0~)e908{voJahPf+^*$bQlYZhU`KjMcy$t8vWTthlkB#VMU}d@gS5IrWcA)b6T9 z2)Wt^G9pWO{r~>f9W1+pFVnJnu<9O^@NjM~&OhE;JBLf>@yaZQiFV9|R?q_nv+dBFm=wG0S zi~om93r;r)PHu&6oy=8*e)IC>y+@Kyl4rx%LQ3z4-C?OA^i>!C(*Kghu}U5gMHF)s zVHabhA;6$LVT4}Q{FSHHySlsKHmG)uTKae0ZsBT&Q0iyW@hPMbQ-}iw;;OY-?f1&d zSV+P-;02QMHprX_8A(H3uvvxjLq5P$G$VL5mu; zytz2_ViI{WFG`5B%;Eq+Xvrku-WcMs*JT4wFbP&lf)N>l@Ye2dw4$%v>Xm)z*nQbA zSTM5Fa@lN02`xCB=i7=@KU$n9o9h_k`5waUDLPw^Pt%#2&RaM$J0E6eh7Kmi{oUhk JJ@Wd?e*nYua1HQ*?PNL?_RY(e_Z~?;NuCX34V2z@JA+aK_^OM4>3_*=UnLJffFKSL zauEUzD5BaE0(e#PSDsq$>h6l$AlenQ^zXXeLe&N)#LuMT6PnVP&^TaJT((xL?QVGy z3yC?Wxm`%cg&iizP}rHwYj)N2{Ts%q?^j01h}y}bG|8o?ntc}ITpd$22$op9z^sPN zug{OX7)PGWi;~7!W^qb`(2_~Qy%CK^UWfHP!6da(91QV*3UBESdkgx)t!~+qj@^^J zf(65aGdnHk&32TKg42_HU9swCi$i5o9U(N`0@NPE@p62c&e(L`!ijnMVV+K4=gzpl LecY@^UVr)zoE>n7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuickWidgets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuickWidgets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22b11f70a9b1649c7982c230f7b786ee735f9dbf GIT binary patch literal 385 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)c#9T0icqA*K{yW1^z!V5=6)tuyv@=7K>q?o zT>L*=T5!5aaB?ej>twDf^qZG2?>&-yk~|y622y(8?+!~1p|865m;RT`4^{GjD5997 z2)h^~4FLx22_y8X=C3@p-qqbTw?VZ_)Y8A}b_-Wqgi=3~j!z+lm_i&d5ErfWYPVOO z$3ha$A-4<3xUj<{83{X+dCjhxzJJ3w_^RjAuItwlewzUZ(hE<_ek0XRLKLPh+>W+ z>|%^G1Q@g@jL@r^zw*?2S9jOk8r7~*L;tSY4P0&!O8rbaK7|xw3UR^RjAuItHz(+1H9k#eVmfc()NFm2ttr~O OGw#Qa+ttXcum1s}t#eNR literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtScript.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtScript.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec09f7855b2856807bccfc5a1acade359e0e597d GIT binary patch literal 379 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)c#9T0icqAb+i`HDmuD|D_bW+@w>kPB=wG0S zi~om93r;r)PHu&6oy=7Qzj^uc-XqB;$&+PmA+5K=?x-{n`mBpTnZL>MSSR<0B8oXm zu#Yh^5MVGKF+wkT{wUDvebe9Y8`Kz}mibk;Te#XGl!k@!LJB#g6w-)+ylQP$`@Qlq zm5Ois{d{RE1* z_&r=&aLOb&xfQx~@=_K0zjuG$d)(dc?w&1c3u(O{wugm*&{tLb%lu0g$2xgH6j97j zf_;pUfdGT?gb{kx^H+gh@0@=&QQ?%lvZ|$J%*76j97k zjD3uefdGT?gb{kx=U0J#@0wT6Gq05vtN)(YVXi>qI z*B7TjLgGM)aREu5I~-sTIVw$gFo9$ev{^rpOo5Y;!H5h&25WyfTG3b5=@eb%xn0!* z!3ghYs+$$ddNWSxn8Uf)*0`#3d7{nS#2C-_5N=M<+4}ypy{YZJMKingVYg=J;Lf_g LecY{C(9FUa}yyn-viW~!r6L!+TPUm-lCb^`mkFwIJmR!Zy$H7 Ikyju71JJQ=KL7v# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSvg.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtSvg.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c0b92775188ccafac569fe887c01008addf7ebe GIT binary patch literal 376 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)c#9T0icqAbgK!)iY4hxb=6)q<@is^Q1N{pW zaq<6fX~F3x!O5-At&_Q`&~IM8y!S}*N%Cx2TS)8uustjcgubfcU*=!3IM&GnqKIOS zV(ep#3*SWO<@(Zeon*dk8nD=xjYcZEtFOZ_&(deb}uTI=Hj$Zy$H7 IA*v7m0noN@KL7v# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtTest.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtTest.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72880b9c79e018d9cfbc79d83bb38aeeb524372f GIT binary patch literal 377 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)c#9T0icq9Q2RROow0ZVIb3c<7Z*%lN(7!+t z7yl2J7MyMpoZJfCI+;|3e)IC>y+@Kyl4r}>KuYiX?LlcE^ree`nSaUrP$dtDB8oYR zv5zq_5MVH#FhZ|t{wh%GebZm_Yt*c01*H zA|&A)3U?$K7jBfML*eGK(Cn%nhBu5u7*OGc_LLF1pD3L_Gpt*)E zuFsBxgv5a?MkOS9?r?y9wnHb~Q4#Ld|I$4cR+ndA9ibs_U^3v+sAD^ H3jO0hO+s(5 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtTextToSpeech.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtTextToSpeech.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06c5ade98b167a2d536a1de2e3ab3bc60da1be6c GIT binary patch literal 385 zcmYjNKT88K98G#wig=rXI0&~09qx4S7AZh6FYhIJHq9-h@P61D78QiP^yVMNpI96#@qj3zn4<`L z7^4aT43#I0(5qU%@KwKOcpF}oR=TKeeCu)@mpg>gAd_xDA%&PiJYXQM>YL?$ySR*n zB%DL;j3wj336o?boJ{6AyQ~Gl4dW05r5Q4+PO>OXaw*DMpT#6sHf5C(NyH0U=&u1Un^z5gCH;*Y0q%N?)&%FcA8xihr4Z$!uRI4~Qa) zIf}85F)|QfFrF|%uX_F}(CdBEU-4_yxI_)}yJ|OZxj`rmGv$R8QV5ekuPXg z!RFUzhk+n*pz>h>BFh{O(2E?EBs>^_7zHiX4J1?Gq@*_>eUQP@9rhOVg*)w{qdd2x zuAqAw5g~xPX)&)i;6X|Na9VQE}}6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngine.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngine.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5dd14337a0f6c0d7be5623e9c48111a9fb21d3d1 GIT binary patch literal 382 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)c#9UDM1&$O4#IJAq|LJzn#=u2TD;BC|3Lo& zMO^$pTv~9tNpNy2bn9fUD)gI|FYi5)e3Cp{)*8}!-);2^1EH^~_?P*Y%=UHifGDDv zqZs=bBLe{j;|U}5s^_l)z1}zd6~9J}OVlvGt9ApI8-&s@Q(j0R1wldd7|4spYPsDm z&V^KjbI9GHVqCgWk_@Dqsk~yB^)S3)9Kx`)B1ZL27N<$BWLfVrL2`XeS))V|`GRH@ zY<_)q7zh#vDjyagvdrNCy~t5X!h;crQP5)DKr#hRN_qp*2N^8gVQ)cSxYI5=%5yvF z3c9DF&jh$>F|Rk{gbq0z=j)nQJzO4Wo0=Ho=@!DxF*;g~Pum;Y-di-WPd@CE3EH`{ N?r$GAtC3gV{sW@saftu` literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngineCore.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngineCore.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f8920885dd47b230e4cff846e97684d755afabe GIT binary patch literal 648 zcmah`Pixdb6rV}b-Rx>u6)7ruDXh9FiKl{<;$BCr=l!k0nT*g`Wh_M4 zwVZzt&sP+n0EZ~T7LFuK!U&{;MF#q4NC+?}Cm5kqasP-d;?|PYu$m$&9jFWciBL`# z2C^lQ)w0^qfYy6W=nZH>yVjb4^cq#SC;zJQds1=J4FYG(*PH-GKm(vYfuy)GN-JMT zJm#|0A#^`})w@#M*-l^3gu7t~%$#r%Cgw1X4-<3DS;d_x0*dAoSVCf2sE)HwLU5cy z88tC%qw{K= z3-{R*o4S$B*(3!z9vdNmKQwq8hxQcc)ZQYVoe&Pj$n_810VMW68$GIbsnOU@clesQ z!*{{ktl9Kq2IeTeP&cADn1t|@T^AFpuSq@&C}oUsc?)BsME?gBDa$kYUMBbE-Sw=y z{^McZ?a#XXTv<7K`Q`EPo3epccX6g~%=EXpzBkkNa^*p$EFX8~%GK=JN|pG0uCzWm TxpMbtvpS`Q6kT*=9YNV_U*3Bp`6PL^tPP~~zTXK81EH^~_?P*Y%nx<)fGDDv zqZoS_BLe{j;|U}5s^_nKz1}muHLpgEE7UZLZGmf0L&7}+XGxPJrU#_zC!FPQ>6CBqR3LHa9qI9Sq`Zg-2Ga-E*) z!{AJWOhBK}5R`P%Vo`6!2_17d%{Mi)dcQoI$!evKMes9}Cr?FKHl2&G}JypTc$35BH3KwdW1%iT_K zo=8PF2jPws5)ubWj0#Bd+~ENI$Wdv^gE1uIpv`)LWD1;&^oL{sGFZ98!IHjor&Dy5=XTXK z^e&ikvtm(i#wi_fI2D^3RlQmsX`7iCc literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebKitWidgets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebKitWidgets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb0f5ecd61221429ff4feddabf031d0b20b5dae7 GIT binary patch literal 386 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)c#9T0iddw@p>P}=Y4hxb=6)rqc$=gDf&K-G zxcGm#wBU4;;N({5*2!E|=r=E4-g_kZBzd;14W#wH-yRkQLSI$!FY_;%AL`@*QA9CE zG4?S=1_BJm6GrG&&tC<4y>I$!evKMes9}Cr?FKHl2&G}JypTc$358_9KwdW1%iT_K zo=8PF2jPwtp|F**b#-K<#Dn{i6V98SfiCRUG^N7`m4#(1`aaC3rAR^!w5Cbst$P3_i)-I}7k OJL~@Tal0C#`uZQ4Kyx+# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebSockets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebSockets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c4a74aa21e9bed05a9b4ac9a7993ca0c0aaa15e GIT binary patch literal 383 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)c#9T0icqAbgK!)k>E+oA&HYSTdYhyFf&K-G zxcGm#wBU4;;N({5*2!E|=r=E4-g_kZBzZQBEu{2**d7!bLSI$!Fa0lB9INC3QA9CE z5q2>~8UhU36GrG&&0l$Hy{o$$ZjEX^)X=}Hb_16?gi=3~j!z+lm_i&d5Lb=Oa=%kt z#zGR#A-6}8abbr^G8A?u^NL;8egBqm@cq&V8C5%3lqR_pWxda0lB;9N8YPm57qqBg z%bSZ+FD8*E^HBkDmRTGi2rZc;+#5qY_S&rP2`0fxNiZY>5Z>Ayj#l)QTb-gS9lI;9 zq2Eh_AxL4T#j@Uv5<22=o^LB$^>T5dY_4OB=X(e@r|4`wK22w8I&b03Y<-xm89KN# N?kA7C)yS)V{{bm)au5Ij literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWidgets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtWidgets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec34332babe9bf5610724c67bd81b2a65bca4fd8 GIT binary patch literal 380 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)c#9T0icqA*K{yYNw0ZVIbH9?bc$=gDf&K-G zxcGm#wBU4;;N({5*2!E|=r=E4-g_kZBzd;14W#wH-yReOLSI$!FY_;%AL`@*QA9CE zG4?S=1_BJm6GrG&&tC<4y>I$!evKNJs9}Cr?FKHl2&G}JypTc$35BH3KwdP~%iT_K zo=8PF2jPws_vw=i3meBJP4&yvL&uzY1$^)SZ^Nv2KosU z@#6RJvVo_b1W(=uyX|B;752}|pZ6X~eo3A!YXfM#@3;De0l-&P{LB1H=7&0Y02pA% zKmr2@fdL34#uEhKRnK3AdVOF9Ye5YgSHLm9tF{BnErfBDD?h>{BODXnqeNah>*a2{ zxZqMD#)$BSiZbcNX*!Tzu0+Ky>rr$|8Hu9OiYeARX_BQv$+F(190`3)S;I&n`2yw@ zY;kjb9CDO|N(>9a^W0^G^kP?~DGNu0kHQx1hLS4cW~etneImn^I~*+OOLyBvNBLey zT~mHGRsu;cD;D)elHwsFr(#pns)x%XZ8H->INJfRF##v5@oD=L+kcCvcJsq-PQl)t Nbw7UGu7;?-{Rgw-ak>Bi literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtX11Extras.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtX11Extras.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..354fe0b2c564e171699ee11b684513a50b97d0d3 GIT binary patch literal 382 zcmYk2K}*9h6vva+$q;)}5D!8x!Vawt>_vw=i3meByhy2(Y>8`Fnzl(c)|*Gafqnu- zy!bu5Y~ZOU!IQVaZabMyh5hsL=elR%0Ps~7|1$rQ`Jql800tN` z5JMkAU;qM%@dN>Q)$><@UhkX!nqR@j6{wltWxEE8ErfBHDKEq%B^(ppqeNcT){EVC ze!-Nl|Zr`a}jRcQ{zmm+rLlj`G}& zx~|vH#!4XRrum}Uh!Z?yy+@Kyl4r}>KuYiX?LlcE^ree`nSaUrP$dtDB8oYR zv5zq_5MVH#FhZ|t{wh%GebZm_Yt*c01*H zA|&A)3U?$K7jBfML*eGK(Cn%nhBu5u7*OGc_LLF1pD3L_Gpt*)E zuFj5wgv5a?MkOS9?r?y9diQ%BMzs7w#!){H{-ko)S`?#$~ Hp+Ecw(F|`u literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtXmlPatterns.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.QtXmlPatterns.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27aaec2f26309fe258e74ef10b11caad8a5990a3 GIT binary patch literal 384 zcmYk2F-rq66vvaEl_K7zAP&MULWesYyhV#0MJUqZBFDjzHqTyYE_aut;%$z81N{Vw zxcEI>T5!5aaB?ej>twDf^q-eM?>&i4lGYexp+d;TBK_{#6>G%`Je~YJ1`@?BZ(cYbX MfBU#y4OxBs53zW1nE(I) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..559e2b3bdf4bc1dabca11edaa0ce0663485ab4c3 GIT binary patch literal 568 zcmZWlL2DC16n?Y2NvaT2q^%-&hzDf@iKl`F@v1_V7H?r?*<{AeG_y0iGn3HuRDXpx z5f2sVPw}#aoaXAu+d^+WIg@rl@Xfr(_dVX@eeeC~c5j2VUyl#cuK~bsM;h~Qz$Lce z3t+&AL53zM^Clhw4~U1oGX!vM{n`)^blmj8=iL-=@EuJ8TZ@icP1TtN=M8~L8~g9U zdD!~nvY}`0=4GMxV@9Vkk!4KzM`8MetED8dqC90JE_6Jl99yE|Jee($l$h3Gd8GH> zg}(6>%|G4R(2<3vlP}VxrY!832Z!Ywu5`i}kt3H=qqz_ZH7c}p(xtrvn9hnwMFltA zImMW8n&m=jW%g#mHqLZRPP9y%ghW!J%vOVb!lhf{>gd%t;z<^1xhx4UiXkIpHXmvs zShOO16&=uNq^Kst8}%ysN7&Piq)i-NZ;_W*TQ4$!myEoW+jfFGy5cs}K0>Iz59kA` zAo~B;Z9tDI=zn{10fRLRDj3*Qu($RfR(@D}o!xc~O*nm9@4)u+s@Grlo?Z0D>)!bE QwR`nF2nM!Z-mxS90-ZCZOaK4? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.uic.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt5.uic.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57b60e25cae8d1d24de97f57ff17f451b5d5f561 GIT binary patch literal 358 zcmZ3^%ge<81gF(}(l0YJFgylvV1O0M_^bnDOlL@8NMX!j$YqRTWMp7sNM%f6N?}f6 zSq9X#8i*kviYbLPm_d{6C5WrZcuOcbKPM+Oxg8URGbKH>M7JQPG(9t~*iV!BmUuv=XI^nhB2ZtEUTH~YPO)A_etvdw5y+BTtRRDm zS2BDCS@0{=-6|$8F*l~9sI)RQudq-zCp9%WL$@S9KPRRvHLonjCo?IgII|>Gw;(Y& zJ25@AI0ngdeXzM;QWx$fy@JYL95%W6DWy57c14^(TNr`3*aS#?U}j`w{2;-=Xnujg k3>kgkV&Ig%z#%omdIie`J-dq>_E$LU8(2ZGh#jaA0Au}Tt^fc4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QAxContainer.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QAxContainer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6c24d5b1282425356b3ef9cd9a498dd665ef98f GIT binary patch literal 383 zcmYjNze@u#6i#|pig=rXI0&~09qx3n9kf`)L4+bLZpYz~HqTyYF83p8>1~ew2l^K% z;^P0|(t^`Xf|FaJTPJf>plRfLg=eF{KNPo^FvJ@5JePo z6k-=+R6>BE^n?+5)$t2YzjqCH%`MZ?HL4ol#dQ_uTZB?SQFWg}41$8_F_2f)^?bLT zT?(lP=a4!>#kh2WC>ls7QE8!_SA74Laq#`z3>ejwER3U6$-L5Kf~5MJyiAEA@&(Nc zvBk~Bu_s9AsdSiuND`X^^a5K&5%)$QMqZ0`J;@ZM(5pnn#T>;F#hStt%%I8q5+tn2cuOQPB_+PF#4J7~wIDSwB{eTOGqu=HlkJvN zK&5A1aYMvSCg|nmU})Ug)Se=KhF^k>6rnUou6V1osBGPo=-~hrI=TVV!o~Q4P1F z4$jXs6)P4CH_7MKlPD%bPEWIS%`01%huTa{gwS*g(8(B%m-nY#AKUe}aAG$Mf0=*DY+ol2h$4zP zim-<pjz3@ha4~Mm6)hY}atHK`0F})d(o05L1YI4CGa9wb*Xw zm$6iYa}e%OF)rOONe0r*lqlInH3)7Phaf1dkWsypMQI|GEUH}=6QPeODwHT9U(l?C z&Ap2wKPHi{#4v|A%N!2S3mugt+#f+a@>{IyOQyg{NpC>@DaEciMSJHQbIm zI6q4SxM@DGo9ayS+18dbhp9%`GK7~|;{!Y5;Nyd0l)eQej?!inAdu$vRKb7$S( LK5mvnlz;vM9Q1G$ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DExtras.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DExtras.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc1b16a5451d289b86069e745c10a87d531c1d1f GIT binary patch literal 381 zcmYk2KT88K7{-%3D@D9bK^%lzgbsHK+74RmqKHtW#q9_jX%l;)xqnHn^fpJofqnu- zT>Ks`EjZmIIJp(Nbuw2K`sB^S`@SUkC3&{24WRYD-yY-!0AFSCFY_;%AL`@*5I`UY zA@m>w2B44{PY{4tJ%5Gtde8LMyb3XHK+XIv+cj8hVM6>=HGD!78W9@x8I{+y^ zbbc{b0!uf^7u9AMlZ?|dv8iF@yXCRAnF%4B?Eu)EfYa6ZwCfYQ{uWH_)`#7ig1tNI Me*Cyy4pIL44;?CT1ONa4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DInput.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DInput.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75ba881c9a7a4ce35f81e027c16af79193b74c76 GIT binary patch literal 380 zcmYk2K}*9h6vva+$q;)}5D!8x!Vay1ZU-IiBFJFKhPPTM*%H^VG;Nb~*qcYcfqnu- zy!bu5Y~ZOU!IQVaZabMyh5hsL=eQ)$>=rUhkRSnpeTb6{wltWxEE8ErfB9sz!iGLO3RTK#9Dptrxr9 zyv?OTj1l2xiZbbjaXgZ4szk{yszGo=83}^I3Mtk*X_Ul5$)eh)90`3)QNc(d`2yx8 zY;k>Y;&T-FN@O|VY3eXS2BD+knE7ME$9{+QeMuE@5;Pd0A(8&d9S)ZCr90icry6cg z9i6v%k|{UI7u9AI|oB#j- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DLogic.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DLogic.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30bad9f27b3a3d631256e019ad1fefba49ab0e36 GIT binary patch literal 380 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsHK+74RmB8X6=#qB&e(#x|Kn){iw^fpKT1N{pW zaq<6fX~F3x!O5-At&_Q`&~IM8y!S}*N%CwM8%XJWzunI@gucq+U;1A%KUB#BqKIOS zLhN9SGz1v5Cydamn!j?@dPjHGoC?*hQBD6Y+cjKl5lX#OHarRmL=+;Qfw-!z7rUMO zG7^$-4w*faj0-!6Up<}gXa}Sz^K~E!X(b5D5^ackxU&^R49=|yr6jr zTijfnxDg3mnGJJ@($wMreqhNs=I#ihk=tfHS1<`yLi_>ggK$^waImB=-Rk6B*|59v z=)4{GnQtfgqS_2&I^=McZ7NpzY;mk?relm}I|w%?=yWwc&HBWwzXemX^M<75D zhbAf`1O`wBo z1(Vcn;c5fdsBo7w9M0M2)?TPRy13CZgifnBOJth?>2P`$t|>CT6LGH0#6$>9b^v9E saJqcQ$;>dB`KXVQxvyky1bYMP;r?lR4AyXSf4GqvL26*>6YBr@1zNv+;s5{u literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtBluetooth.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtBluetooth.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e03cb425f64432f907e15c15ac9d8dbfe54e483 GIT binary patch literal 382 zcmYjNKT88K98K=59O7*X;vn22bhy*OcFh79bquLd!>)%zmj>|1Vsh`TGPa%PbLNs6?F6-;%ZnwCI zge06p=H!xb;RJC!5>6_!D!Vj%|Auk!{n88=RZbQraVAA+^jSnQbxc{KL=y3W=2h6@ z`uy07Na)EdFCa=&n*$62TgEZ>#t@CY4(oe@Nw5<#7?B|eZ{-dL%k(AN-J&O(PEVfk z9F$!KPEst4Rv6Qq!)dmu(yE7xBSkYEV?5hIxHUm1tMk)pOsvLRFtyqrR(p!}?#%n! L$L(rl)wlluyCHGS literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtCharts.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtCharts.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7d492abac68cfb46e1fd227e8e356e34574ad99 GIT binary patch literal 379 zcmYk2y-EW?5XWb8MuK>qf>;RG2r2HgFex->VIe}01iRzl*ks4tlD*H}1h2F74fF{V zvGF}@60o{Tu(AuJOXXfv$bWZ-*R-yY-@fUolMFXPXdA8O|T7%(Cr zBrYLP0VG&?A^@-Y{L0hsUBg{-tE_Sjb>q7X*GaKO8S_)s^cf}?F^u{ghdsP%Y6GhL>rGODP2fq4mA zxEIG>L_<$yqa33&wFP27uvHujZ;a8{YxABbxk5Xk{UIHo^j7|Gu%s`o-O0PE>2%e3 zKsC@w@+Hiio5J3md4K!3 JU9PO0`42z8aCra# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtCore.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtCore.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca06f5ebb7b386a7f7f23fd72f073366b2cb642b GIT binary patch literal 377 zcmZ3^%ge<81gF(}(kq!57#@Q-Fu)9Dd^P|wrZc24q%h_%n#T>;F#hStt%%I8q5+tn2cuOQPB_+PF#4J7~wIDSwB{eTOGqu=HlkJvN zK&5A1aY*Q={S`&~iwtrNyd4!Y KL_x3!6yg9z>2I3= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDBus.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDBus.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c70d742311d7cfbde12d36584874986daf8610c GIT binary patch literal 377 zcmZ3^%ge<81gF(}(kq!57#@Q-Fu)9Dd^P|wrZc24q%h_%n#T>;F#hStt%%I8q5+tn2cuOQPB_+PF#4J7~wIDSwB{eTOGqu=HlkJvN zK&5A1aY*Q={S`&~iwtrNyd4!Y KL_x3!6yg9qo^OBv literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDataVisualization.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtDataVisualization.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c23e501480046f3c647b3df71afadb178aebee0e GIT binary patch literal 390 zcmYjNJ4*vW5Z=8r62$8i#6q}6NO7lyNuj|sf(Stp1dHR~*ks4tlD)mhZh~iJ=|9k4 zpooqC!zKZ%s{|{%K)O`!`G9=$U}l(^ZmT0TG?Xg4!4#*c01~PcxZx8YcLSNTeL3IYt3CydamiC+-&-naZUzsf4tsBV3i*L7TMQO1H)HvI#5<=;}BYWDIgl+Pp^;*Wf0!KcoXtWW~e5Qhk}-PTti`udB~N z@qsk{l6+BXMKK!*IL$VVSlPEaGHGUEjAuItwdIiPLxsr_R}jb2deLclQ15 K<94~Sa_T=dC2>ap literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtGui.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtGui.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1100bef925641666db6e9df2c17dc29d87d7f021 GIT binary patch literal 376 zcmYk2ze@u#6vtogtQ_KP3gRH#B6PUZ!FJGM$08JIaS)D!BW+?YH1{*P;%$!p2l^K% z;^P0|(t^`Xf|FaJTPJf>q2IiGdGC?rljPYnw?OIrusbR=fUm0fm;RS5j#csi1PI~~ zA{QahfFi0rA%Iskf90w5uI_HQHKJWXUH`7ybyV(PLi|)VeL@o&5gH8{6_@qRa=%wx zL_%WDY3AgTap44UJQhwWvx;3BzJJ3w_5IQe7*RV}n8cYBr7>U;&eSnwjbMqz3oI(w z^15^CML6_imKQWiQ=3yd3~U+4+?&v7;&s`;6HHP&!NV~gQQ@uK;b=u)x!o)Jvg!0? zCudGlER9welbqA@Y+G@vCyNtha~&Zx-viW|!r6L!T8*jIcnfA$`@?F_;NZ@@zkS@T IMpk|J56)h1HUIzs literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtHelp.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtHelp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a436cebe8d2b21357e4618e61b6c66ab76abf76c GIT binary patch literal 377 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ9ks6vqz7dZ}&w0ZVIbGaW$i?=!YALw78 zh>QP+OAAgn2~KW>Zk^0kg?{t$<-JFePm*WL+CW90pI9Sq`?sW35YPel> z4m@#_d{J#iF&%L@%{Dcte6u{#HZw8CvmJz+6Lhi~pLTs>*Wbda-TJUwQ?z$y-QPZL Jmm@2G{0BzfZ<_!B literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtMultimedia.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtMultimedia.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e74a7a3771c75b7dc35a215ff8a2c6831f5f5c51 GIT binary patch literal 383 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ9kC_Af@;H?y%4h`l^b5>3_-mP$dtDB8oW* zv4b(v5Ma=rFhZ|t{>oMB9o<=TYE-*I4gI@nH*mQ{DD_g=@+c$_QHXp7; zxIQ~}BNDnY%L|Co)ZzesV97YJ@$2vitHP z=aPj$8L^XMQE!Ja%{iQAn+jLGTpTHz=@{eL4#MpTI$4cRvpF%FZ^6{;e3+dn+PgFE MZy&d-kyZcx12Ly^BLDyZ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtMultimediaWidgets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtMultimediaWidgets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..968b1d939cfa60b9601a4031183bab4c1c3b4cdd GIT binary patch literal 390 zcmYjNy-EW?5Z=8r62$8i#6q}6xZ+L=lR|?jMTnAMAsh$CCOhVq?EUUu@H$K1K%YPn z8{fkw0jsM7E4x6tRPIHEeDlN1Ff-pU&xWyq6yEnc!$L#ot4jW%{{{0y6+9q{DCQ`{ zF2+bhfI)l02)!!%g{S&m-Cc8QRJ%f!{#}(VTy7Cc{Zux63JF9Mq5%VOX|0#L-QqkF zl5h^0lS{^h6U6aIIH}Ak?y~OtH;jYtmqx&-nq*-TXHt~)K8r}E)|53$BoQxYUXd-} z?AVJ)=*cWEAWBo40}KLN#xeKC5RJVK>wAJpuoE&Eks%0g<%WYL`_kLpq9>b9PhR9) zvJfaE*NhH93MVNR^;Q_uoWp6hsaUHAh$H1@I>vamgK%qtPFD5PY)s6?TQD`-A7*=s P_U?@P+sExnvg-Xmqlk3@ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNetwork.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNetwork.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44307c7de29a620bdd1afb4e758e0ca990d688b2 GIT binary patch literal 500 zcmZWlziS&Y6n;9#?NRPBl$Mqb0WSd$zDzNulx8f2kUHs7t_O#FdWlu*q_ZTay-peX zAGCi#O30GGB1;z=JcOG9ow5b8Ws1&;q0lG2kM~3Gdms88hEKrRpY`p7a}VHeoh+^K z5Zrun!B1eoh=82LB==&EfCoshaZCVCo!?vHX5y8&89&0N>w8}wFFVIBI9(?2J#_Dy z%=-xK##LQyd(|__SUR@dlwpCAq0Bg%>SN4eWU+uL0>Q%pdFO8)_ppGV% z3lj~M8kuNpb*)>kIH>$I-RA<+v=ZN`(E~KeKMFS% z+7{U9m%Fwb?b@CDHBnLC`fqZ@CIa8;Rky4DOta_Uxd( qv)0zUwKapaqwvSKU(YYVp9bA&ur?36v!FK*dNb%9`SsC(qrC$aW|M3H literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNetworkAuth.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNetworkAuth.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..425b3b854be200c263c714b5ab8d850d1c9c387c GIT binary patch literal 384 zcmYk2Jxc>I7{`-4D@D9bK^%lzgbsH)*bZ7OP9l`j;&vPyY4g|%&AlaQ^)^Spfqnu- zT>Ks`EjZmIIJp(Nbu#A*^q(hxp64OSFUgZ-Z6K|;{q`_75c({Of0=*D;!r2|h$4zP zim-<pjz3^D5N1L^boPY}atHMJNq2)d(o05L1W;3}mOaUhH=B zi&!ecIS6;G7?*CCBqQl&N|fxP8U$C2Ll6{J$f(}QqBIdo7S%qBiO|Os6-pG5&uCG? zmcjY4ACt&eVw^*qWex`zgpNuQ?oS||_-)qrB~##}WH2H_kp9XY4u0rA?sW5>YPdbs z0d<{-(b-sqZkjKv%_yN`4yR&M^U9~oBW-gNV?5tMxH&~9tMOsir*{1{oY}2+yEQ|5 Ox7OXw!*)4D`SIVeU2>HG literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNfc.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtNfc.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..910b3093f899fbab6b29329907456578bf6313d3 GIT binary patch literal 376 zcmZ3^%ge<81gF(}(kq!57#@Q-Fu)9Dd^P|wrZc24q%h_%n#T>;F#hStt%%I8q5+tn2cuOQPB_+PF#4J7~wIDSwB{eTOGqu=HlkJvN zK&5A1aYfNi+Z_E5^e<4v z#s9;l1*e+?C$~bkPUfmYzvMl>guHy;d(W1&1sd;%ondYOe3gfPn15t(tjPlqAc#YR zJcPgiim35~0A6+c!q@LT)7$VW#JGl<`CVSuP_csv2~yPv2u-LUR16rEm$l7eznfnO zsW9g>bH|Et>4tGUl5VQ9QoE=I!42ay2ns7?L|3vXi8CdOYM%+5>2Hb(!3xV4Sd?N* zuYKwZ9Qi66=TxMr!zmqvj*4UMPpFvq9oF|HQ`AZDV1$QM`fDDJR_d$lbn~8SxIJ~H zEw?*vk}s>xC?;c0&$DeURdy{;befw8q4^%5<`mA>_orQ-+V!_^X16}<)(j5rtoz%? K-Ew8+%zpqXvT!*7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtOpenGLWidgets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtOpenGLWidgets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1edc508fa8233e28bd4bc6078a2f6be175f2f681 GIT binary patch literal 386 zcmYjNze@u#6i)7}6!A6%aS(11I^5}CJ7}?E5sJ1r2uI*Zn`bXH_cLknHb?&h{RlR1AtzvMl>guHy;dry|Nfi&LsJHy;S=(9Zh!~7$QLrv}xLktTP zVh>|vAi!WeVuW6F{DSEBp6RW56=qzbn)y{;*Kn~#8S_)s@EIf!F^C2n5zJJXH_n#T>;F#hStt%%I8q5+tn2cuOQPB_+PF#4J7~wIDSwB{eTOGqu=HlkJvN zK&5A1aY=rUhkRSnpdI56{?xvWxIxpEkbFKszyK|0YO3Z7|6@oda>Ki zFN9QtbI9D0VqCgm91o?Ns;p!e)gb6I4na^@A)|UHi;_4~vZ!{MAela`HaImB=-D&3?)o?qi zP5al34nRpa$rsgT6w?uh(`-}Y%9qO{Z8H;NJljFIIYB3@@oCp5cKt1!+Gij3*%a;F OS@*Y(+vUj0fByj|uW|_h literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPositioning.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPositioning.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38833b9954c54c3218e2fe544d50afad1813ff3a GIT binary patch literal 384 zcmYjNF-rq66n^PhDdKGk;vn22bhy*OcF$|+JqhbdW5~jKt5}Hs!s2DJ+uIih`emB1q zN@LDx=8ZMu%8R5NDKFJo>0Q*q@P=_3hJ_t5Vk%jj$V{uE)@K4|rcF^LSY!19i_&Zv zUYrI3$AQkqITdN@a!Lo0tEJ?@go;VfVf{ccP2B_!MtDe7ur|Zd%6-LdH}C1D*VA2T z(wP)Y480^@)>^S7V@}VrZR1xyU7Z-3TL_`~9-!6~&eqqb)0jGqw`k_HKb-aq4({yx M+sEB9vhw490J&~*tN;K2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPrintSupport.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtPrintSupport.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31c1e1f05d4893146d5510470b228748e810ff7d GIT binary patch literal 385 zcmYk2F-rq66vvZ0D@D9bK^%lzgbsH)*bZ9kC_<5zZpXoyHnA6)%iSeu@is@lfqnu- zT>Ks`EjZmIIJp(Nbuy_6{U>?6Jo4Tz?>#%t7SMV>Y!3?yfG>0Tm;L7~jT1Oj#l)Q^*TjYHT2`)g)W+@5mG zf1rOsMSAi7@REfb!kz?A-U_`H56-Mc1mDa&zVFTZ@y&d)?M+bj_0izurvdO?leM+} zfNQ3}2Z$ji3=-mz#PAFP1|Y%K1p&BJ=ePN)#@p~rudQy4cemE@3k5FM1bj8gv%C(P zXr0>%o7l!qgW9q2270X@I=5%kJ7F9Lh1?Hf%rT8IjVOwGJ1=#N(J>Es8PN1Nd)3>l zoniSh6*6QDxjU7V33rlZr@}2H*Kgq)%GFj798-otP}>t4tClp$GcHAKjcFQk-QSEu z8H)ODl&MycR04{GHC3YC((rF)N3$mTGhA!UH*a4&_0ur%C7+g<7Db;SMw7nGGUlIQ zdgc%4*cVh{KM$kR@C1ebkL)Ln;Kuid=RDtI`v=kGt>TRDdd=kd}xtem5zb5z0o+18w{ Yz?u&#*qvD`Fy{{{*q)hs@!M+BFJR21i2wiq literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuick.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuick.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70761f8e6fb666d8c71b528c20d3dd4865397bc8 GIT binary patch literal 378 zcmYk2ze@u#6vtogtQ7G!1#u8=5jx!IU^{5BqX

oIDPW^b&iaxu40E-sb3kpnriP zF8&`bEjZmIIJp(Nbuw2K`pwIi_Z~?;NuCX33zXguyTd{Q_^OJ3>3_-MSS1fYfFKSb zau5OyD5BaE0(e#PSFT#`=+1^yBic1I^zW+OK;;f5#7kw%BQ&8Ap^?w1xN2;c`@P~a z5)yMxGdq`z3p)Z&!-fhFUZyJH%S-7Xurf=Oy6*dO5`74F&{j#l)QTfL$$TXtXe zbLNliq*&J5VN7yP&$Dessva#)l+AU7(0mV2dkSak@o6@vX7eqWnVk=_GlPRW<9_nE JTaB#x@*l-ua1a0h literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuick3D.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuick3D.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88cf7ad54408fd7b33e117fa212ca20bf1235f9b GIT binary patch literal 380 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsHK+72pq5kx4`;&vV!>E+oA&HYTSc$=gDf&K-G zxcGm#wBU4;;N({5*2!E|=r=E4-g_kZBzZQBHKg>u+ZhxZLSI$!Fa0l>?W^PgQA9CE zA$BlE8UhU36GrG&&0o1{y`wuTPK|0;sG)yX?FKG42&G;sTONf3A_|euKwLIf%k6G) z5eZ2+hs@3;;CZDHFsgR4Fo`oM%6gwgBvZ$fHA*BAFKAZ5 z=GW&(ZbU*?W_bZonpzyd4=fqS+#NwQayzW=3MRoyh(9C)5bn|)_7?PoTiv23TXs+O za^?>Y&g`U^*H6Nj<{VD5b;YWlEe@4Ub&T~`6}6-Af@;H&LGzi`YMZm>3_-mP$dtDB8oW* zv4b(v5Ma=rFhZ|t{>oMB9o<=TDpb2dHT}D6*Kn~#DD_g=@F*k@QHXp7;=HzA>~{0B zNJzptWcElhF6v$FqiQD$lQ@&2sPliO|Os6-pG5FKAK1 zme&`jJ}0rS#5f0@Wex)vgpNuQ=1+i6{C3p$Wu(AK$zVi=ApNyF9IfapcRG1jHQcW1 z0hfu8ZkjKv%{ZZB2Ipd1v&v`76K!)7V?5tOxH&~<>+xyVr*{1#w K<8C=b`RPB#0dWEV literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSerialPort.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSerialPort.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..713acba67707147a744fcb3ef66f7e7ede0870c7 GIT binary patch literal 383 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ9kC_<5zZpYz~HqTyY?pKl)Z*%lN(7!+t z7yl2J7MyMpoZJfCI+?2q{U&+5Jo4Tr?>$@A7Seh@Y!7n-p|A4tFZ0h?9BbzRQA9CE z5%w@f1_BJm6GrG&pI`ar-WD1;=3`S%K(qH?-(TcvZPABiGhTBy= z5RCASrn+gqtTv;Bjyar*ZH+5CmnYiHO^oq;58>t%ovrUryFRt+Z{f^teb}uTI=Hj$ MZy$HdCCa(~051D-9RL6T literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSpatialAudio.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSpatialAudio.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc9d3eed33820151361658ac542f933e86dbfdb2 GIT binary patch literal 385 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ7OP9hX(>2@5PY4hxb=6)tudYhyFf&K-G zxcGm#wBU4;;N({5*2!E|=r=E4-g_kZBzZQBEu{2**dFE@LSJR^Fa0lB9INC3QA9CE z0d_D(8UhU36GrG&&0o1{y`wuDPK9bcRMWr9b`2Lhgiht$p_06-p!#FKAK1 zmN%EDZb$-GrdbYQl2{yI;9D|^xI2b$?6z6o6-0n4|G6J>K9V?5tOxH&~<>+xyUr)K@lpP8)>vo%8p OcgFqXakm_4`SU*^_Hx<) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSql.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSql.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..756dc6a1bba5f9b84665d55b4055565bb486a31c GIT binary patch literal 376 zcmYk2ze@u#6vtogtQ7G!1#u8=5jx!IU^{5BqX

Ita(Xkv6dxn){Wc#oHYH5A-ik z#Kr%^r3I&(1Shvbw@&7&Lce+W^4=rKC&{yAZGqPNVSAVx0AFSCFY_;19P8u(2oS^} zLLNe307cYzLIAIN{>s+0zy+76B-W~l~=XRV!xAL z#!_Lz>% literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSvg.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtSvg.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96152cad9081f90811094cd467a1c8723e3c05d2 GIT binary patch literal 376 zcmZ3^%ge<81gF(}(kq!57#@Q-Fu)9Dd^P|wrZc24q%h_%n#T>;F#hStt%%I8q5+tn2cuOQPB_+PF#4J7~wIDSwB{eTOGqu=HlkJvN zK&5A1aY1~ew2l^K% z;^P0|(t^`Xf|FaJTPJf>q2IiGdGC?rljPYjwvf{MVcX9&gucq+U;1CNI9AC6qKIOS zLhN9SGz1v5Cydamn!j?@dPjFQoC?)?sHT6H?HVq22&G;s8yUp<}gXa}Sz^K~E!X(b5D5`xHkxU&^R49=|yr4x1 zTi#rpx)BLonT>LY($wMrgTRt;%-u0WW4F!vu3!?Zgbaqn2jQ;W;b=u)xz)+LvSD{+ zZ|q+)>Vp(^k}s>xFs368=h?Qxl`j`3%H}%8c)o{lbBfN^=rUhkRSnpdI5C90XKd z&xKTkbI9D0VqCgm91o?Ns;p!e)gZWG9D<;*LPqsY7A0|}WKr!gK{9d>($wJq{m@Zy%>6NlvEODrUor(wLi$580O_yX;b2K$y3@(Ks^NCk z6-ebK`J&p4Vmjh*nr&)O`DS^fZDwMOXFCWtC+K7~KJEI%uD^v-yY*qWrfBcZy1#wg JE=N}W_zzC3Z?XUY literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtTextToSpeech.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtTextToSpeech.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df634d2dd19efb40ba7e0022ca224f6a0735d2ce GIT binary patch literal 385 zcmYjNJxc>I7*6i26!A6%aS*x)9qx3n9kkd{gd#2NbR3*%^V$o|eI_lv&C!3Lzd#We z|A$KpPB#foZiQ~0O#Fa8NgkfOym_7^PnNZX6y6S7!`wjVQ*ZuZ{)y$W68DHAia83g zi!m|~U@#srLN99l!c+aO>2A0sYIIT6{LHeHM{S*%T#8BoWVOsl!&+ z7pGoCLQiJn9HKO}Ilv&WWgK&F0@1{4vA!pm1Un&v5gCH;*6wihlm5eYJMYN4(~&)x z%3j<}w2zbIt8ycZ>6pWLwygs7+r^2Zg^4j<>>=Ekp|kb*QK`);wbx)?X}(vQb98WP N-Ax~M^~m(ke*+>ea@qg@ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebChannel.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebChannel.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..406b3af1b55452dfc14f294deb2b924be08e0d1b GIT binary patch literal 383 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ8Ba1fzLi-T|+9%=LJh30ZUk``}s^gqzQ zKoJ-J50@64ZW5f_3f(%Hs|x+*<;#1IB%dVDmbHeo-gjI5+(787EdFKwC9{2hZ`!Fa+5z3TZZU$6H}Z^f%n;}X@(@3LLP#Rj1?NL3@Ckbs~ddJN=6ZME2L z=jTEy!Z~E_P%$puFpdY(O;uL1i)s+uFb+XbSRtc&CySCeQ?jUbnIM@yrl?S&h>4t}mGaCn3E7>4Wr_?y$F@FWhP89o29< z>I%B2ArS(&o8;O- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineCore.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineCore.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d28c584c25d147731013e6967dede4461846c57a GIT binary patch literal 833 zcmah{&rcIU6rR~`*`-i0gdh-27Ltms*)`!ngb**JK@v0=qL5~jb=rNDq1)Ydc8V@1 z^u*Dd9E}HzA-kPiA0=yh?>sv$B%(5<5l|p=loeP36-E-I+R`?PZ$90P z}9N5vvz9$V42 zf(_T_#BqQv_}Wvx1LdMyr7mcGtI_Zn*BCTgltKKsq%9eX#-ipi%^@7vTz)i~9mrs` zICXqu-}7p|(c~=NA(MrQltW-X_1q}49rzsT#aEO^s%7m_2P`Yf?o(UzPwR0-KT^xo zB`h8$Z4*xXXr|(c4l7(t`x45KG?;M3xYv%qtnq7K!vBOWMHA?Xtgo0Zshga&0&ts6 z-2tfV>)i7k^AOxabCZ@$pK{O}q*5bQ@Xdkg?k964THgx9HjIIFt$7TLMsTIB);+uB zz(Y1ED#o9}{~}Z`g)#0;W32bk|CNg5sZQ#4n9BEtkUHB@=H73_=eweZiheOReR2@a zyl9V+&KL<*@*}q#=9a(SZRgfHxwW=DfBg9EgVSe%dv6Dah1E{sdAqRNDeSi8g;1V4 i9lwxA!yEH);G+w9_{3_D@$fL6l_^qUT?9#PQ<* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineQuick.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineQuick.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..581740a500ea95c3a19f9a6622745c2f37836106 GIT binary patch literal 387 zcmYk2ze~eF6vyupD@DwvAPzznp+lmB?V!a@B0`ZC2O$K)CHHKOUM@fGTFmC?f1rPX zA};1WF184zUaDFig#-iz5ipRKjrC%; zmtP2}2(m5^Xa1|Z#)I~*+OOSgJ?U$yMM zx(5GD448oahy_DC$rtr@6w?uh(`>UuRI7{`;Il_K7zAP&MULWesYYzHlN5)q2DI24Y9BW)h-B)=q2rn!N%-u62|UP0)yEdFKuC5uCy+#`x8 z<|x80#;Ae-L*)@8^rGjlJiXpE+%>mKD_5v)e3k7wF184zeyW;2g#-izF=QYw>+8jC zH@^^45zZlV#)@(2gmFBQPO7q!UDSO4nsM;`!VDSJJ6V*(nUY0qzy!(kF-4UUMdUMD zl&~c|KlTKPJe7@e5NT?2fMIB>IOg62#Kh~cfhU;)J0Zgn2|#))cR2W=|G3@Fd#dU5 zR38RsB47ggj0T{jljO@GKk+!*kF`n-r+?t}3)%dU)Q>*bB&aC#k S)t;ffTl4PbVY?hz`TO4z8+2&^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebSockets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebSockets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..372f7994a842362f5a0731011555d384439d77f1 GIT binary patch literal 383 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ9kC_<5z4#IJGq?czeH1{)U>1~ew2l^K% z;^P0|(t^`Xf|FaJTPJf>q2IiGdGC?rljPYjwvf{MVSA8k2z`~szx2OkajcRDL=nXt zh1kIuX$UZAPZ*(BHGk!*^^WdrI2Ee(P)+|X+cjM55K6sNHarRmL=+;Qfw-z|7WUp<}gXa}Sz^K~E!X(b5D5`xHkxU&^R49=|yr4x1 zTi#rpx)BLonT>LY($wMreqhNs=I$7xvD;>SS1<`yLi`~afNxFs368=h?Qxl`j`3%H}%8c)o{lbBfN^n#T>;F#hStt%%I8q5+tn2cuOQPB_+PF#4J7~wIDSwB{eTOGqu=HlkJvN zK&5A1aYOp@x~3RnBQc=On&WvJA zI89O^wJLX}!Zc2GNKUkj?CeNVqRMuSe!`7ae|!9X6!0hsv|Q$dXW4)eGMx>y5G+^` zz6uWMBv4e7!M$u1{3GnmM$#q@?tYQxx9z<|;3Xsb(l-3Zk~Ru9>L>xh2LHKZ?F8(+8>=B P*i&tR*EhAYW5)djAn>8* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.uic.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PyQt6.uic.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb563868afb6ca4e12299c29c136f7e5bed1983c GIT binary patch literal 358 zcmZ3^%ge<81gF(}(l0YJFgylvV1O0M_^bnDOlL@8NMX!j$YqRTWMp7sNM%f6N?}f6 zSq9X#8i*kviYbLPm_d{6C5WrZcuOcbKPM+Oxg8URGbKH>M7JQPG(9t~*iV!BmUuv=XI^nhB2ZtEUTH~YPO)A_etvdw5y+BTtRRDm zS2BDCS@0{=-6|$8F*l~9sI)RQudq-zCp9%WL$@S9KPRRvHLonjCo?IgII|>Gw;(Y& zJ25@AI0ngdeXzM;QWx$fy@JYL95%W6DWy57c14^(TNr`3*aS#?U}j`w{2;-=Xnujg k3>kgkV&Ig%z#%omdIie`J-dq>_E$LU8(2ZGh#jaA0A)jFumAu6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DAnimation.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DAnimation.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7720ccfc22498e4495c19f50cf4c0d5836692aa GIT binary patch literal 386 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsI#+C_^+5JV_a>2@3(Y4hxb=5jxh7H@O(KhVEG z5f}dtmlm9E5}e!$-8z}83jHQ|ygc&WC+|I5)*8}!-);4C1EH_-@-OqxneA)m0Z~LT zM-lcgMg{^5#uG;9Ri9t^`n_j*D_(^f9aJ;F%Ww@B8-&szRrP>E0)m3*F_2fa)ndDy zUka%R=a9KW#kh3CI37qhRawa{szGqWI0Qjqg^cP<7A0|}WKr!hK{8#Ys8FJad_l7k zHYXRyz95mWvSAJ)O&t!<3mp~5+#i7$`7PG<`TtX;U@XK+K6I02?H;w0ZVIb3c<7Z*%lN(7!+t z7yl2J7MyMpoZJfCI+?2q{pRJ%dygcaB+r($hP2*yTm9TX=&LOLW&S0zeVsfYh8Pwo z#2&`TK!Cw`!U(S zkyKO&$lRggLb^d552Tx_tYjBe-@oAke7~>)&h$ zoLn4}h=xRE!yKYCbp${!a8w)%GJVvMI-2sg&)WH~t2-HyW}ZJxc*+^-}pz0J}8K>q?o zT>L*=T5!5aaB?ej>twDf^qZG2?>&-yl02K{8q#{-ZT7MfLSIGkFXJzn?d#+LQA9CE zA$BoFB?K5sPZ*(BJ%8ot^{(NrxMf;uqpI;;w5vGZAe8#4s`(TWh$uu|2J))9ns2wV z%SbB1IS6N<7?(~E$9?IfN)+t8;`_IZgYV~Nz^LBI!Xy?-=9LbMh|tI6Wl9v0FKAZ4 z<~J9|UPMAqi9rTYn%W$o8`vt2xi^Gp=rvi#lT3k~kZzy!Kzd7e*jvySZnv^Fqj2C{ ztHZPNkrG5YNj9(4!h+-+urN;c>wL literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DInput.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DInput.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ee27e6b4e1a38f9120d7e8d5c000e1c2518fc61 GIT binary patch literal 382 zcmYk2ze@u#6vvaEl_K7zAP&MULWes=?V@5AK?+4G-HwwZZJxc*T<%A5#oHYH5A-ik z#Kr%^r3I&(1Shvbw@&7&Lce+W^4=rKC&{yEt|6`W-S!}_AoNuh|1$oP*}hI55JePo z6k-=+R6&5D@`Mq3)$>=LUhf+2id&_XE~*>fWxI}x4MM4(sD@7=20=me8OY1}YO&qP zTS6+rIiyae7?(~EMMLQ%DlOSX&G&B@2j4HufKk1Zg>jTBS=4$=kW?R2R4GwJzMxqN zn_piXdxC_XO0yh9lGq%eAJ{62xHkeZ^4hHDNv6P#Nq@DaEw>x>4Q8;j} z)Zuwc#F=v9d|o>ZBbsqIOV>56e7HQ)HZ?HD(=CKg$LM4^KCQ;sYP?`wx;BaajNW literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DLogic.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DLogic.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8adc21499740e117bc5f2461c2d4db0425518737 GIT binary patch literal 382 zcmYk2ze@u#6vvZ0D@D9bK^%lzgd6S@wTl+J2qF}zbURLt^z!V5=6)tE-sb3kpnriP zF8&`bEjZmIIJp(Nbuw2K`pwIi_Z~?;NuCX34Jp0vw)=&K&{tLbOaDt|`zm=r6j97k zgk6l0h5&>1gb{jG^H-i)@9OS~TccVRS^9U?ws5&YDD^Yh@F}DaQ-}iw;?i0zw>!l} zEF|F^a%U(R7fzTY1L0&cuh?bX_iq>n-!F}jQMHprX_8A()_W`_xjLq-Q6hW+ z>|u-y1Q?7bjL@r&U-$5{YCXuhiAcr{191hS89hD^9A3{9zo2=tYroc%_w@-Q?{RIy@bM<+4T6vpM*mEz{ z{^?ceTDWOGs~$%Q9dI}it6Hw?Tps8&F)_xI4TO(J=xA|&+VzoLe+$QUX_?2L=gossI20 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtAxContainer.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtAxContainer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56b078fddd2abcc29255b57ab5db55565cae1b7e GIT binary patch literal 386 zcmYjNze@u#6i)7}6!A6%aS(11I@~E@7cCZX5TQt=+i`HD&9fJp%l$}NdYhyFf&K-G zxcGm#wBU4;;N({5*2!E|=$E|5mynn5d+*t@Hju{qeyg7w2z`}@f0%z{eyGUl!Y$2&F-)>H&oW1O?G!Ag^od#cn&l z5>gS)A#;a{ap{I}JdkdxvQoRK2Ei@k5Cnx4GO892S=SgJ3x)6P4L!jXHU z&c_$AP=pC>GRYU!MikQ_hqG)`E0)d6W1VIu#(1`aaASf_SNEq~pV;-caB4R{?B*2h P-C6hJ$L(@u<>-F^m{D^w literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtCharts.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtCharts.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bb7bcc0995f7a9cc1b5b220711208dfc2d64ec5 GIT binary patch literal 381 zcmYk2ze@u#6vvZ0D~EWSf;b4b2p#Sev5OWvIEYZB((MQwY4hxb=6)tE-sb3kpnriP zF8&`bEjZmIIJp(Nbuw2K`c3k9dE~uM-g~y~4W#wH-yReOLSNP8U*?}PKh(|xVu)dZ zBJ5*~3I$!evKJjR5!n?a2=Ohl(8UFjetQ4F@w0zL0;9@%iT_K z8B0ZlfZQ7?E~FPG$xwQk$}4th1;Gs$5Co+ia;7tRlqR{7rPbpx&2^cw#;Bt51RQ>XRew5Dk9&c45W K+^$w$P5lQh_;EG> literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtConcurrent.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtConcurrent.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..914048d483a84e2f4d21922ea8a525d15b17a9b9 GIT binary patch literal 385 zcmYk2F-yZh6vyupD@DwvAPzznp+lmGU9{-nAVQH!w-AWe+_O2FT#~zMF`J{`KtF*Z zE`AS}7MwB(PHu&6oxD_q{_owN_a1lmySr!0T0>gzyX}5qAoNug|1$rQ*}hI55JeQn zD8U}a$UuO>c)|$1>iH{QulG!E#j8=HiyG#4)o$Q&gHRgesu@tofK%Wh19{n4Ew?+x z1(%A%F$j04SS;NrO$XA=m8jTdJqT`C3_(y@5u*#~ z>MZ5qPzd14&5C)wm85hS!--he!0PStP}|hR7*DqlZjI6La(vp&vE6)&CidxveL6uq Och>#w<7PEP_47X~aB}zn literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtCore.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtCore.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c8cdcfcee08ef3c4ce00eae5636366ace4d2f9e GIT binary patch literal 379 zcmYk2ze@u#6vvZ0D~EWSf;b4b2p#Sev5OWvIEYZB((O1n(&pI<&HYN!;%$!p2l^K% z;^P0|(t^`Xf|FaJTPJf>q2IiGdGC?rljPa9H;~r*etS?D2z^z>zs$d6eyEcNL=nXt z#n{If83-^KPZ*(BJ%1JG^}gw^`88^EQQiEm+I3uR5lX{cH9`s*BovZ919??nFLyh| zWg->f9E3Mgj7u*{)1mZoB`S7lh2ah35Qe24F{*d6I7@|+rPX5z5&D?2Mu{Tw1{|gE1uIpv`)LWD4Aj^oL{sGFZ98!IHjow^MW(g(L4; zou>l4tXNphIHe;FXJS*Ms#nWnZ8H;NJljFIIYFnZ@#!=sPU9__I;{_XfF37Y4MyK{SWjn zP{hUm!=(kMn*=AfLbp!lszSd>9xso)_X+PkThVTFw9Oco_^resm=GC?w3rl?S&h5#)owywEl3*@0TQxju6-9orAM#szh)2@&0`dc`$ Vn;&*_f_Cn#`C2^)?S?@DJGJQ;0qeKz;g60)$ zaos-g1&Mr>Z2YChHt1SLy{3Y{4ojd>oMg)Y! zB?Kyf1S?Mj;8o9Gd3wETxNB~eRk~0&zRPx<6kC)rKUEE%VS*9EsLxSe)z^#NPJS6l zMTNl387VHL6U6aQI;qM^c2V>F8!piI3p3zM@8n?;XG#{e9*=0Ik148*Dk@)KUcwgc z`H2_N&{Nqc$0$v0f!Ggh701FGV>I^Kyyr=-&`xN7NCzmrl{*|P=}Wged6zRha<0_{ zio{9sMXedeY$Wh3+tjG?)$&-|%pio!c7QY|aJm|wR%2o{-h!#s`mkD4*t;|DZy&eI Ik(Gb`12ma%SO5S3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtLocation.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtLocation.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83aeb09f9bd9857cc4a1124e2ea0a1ab28665350 GIT binary patch literal 383 zcmYk2K}*9h6vva+$q;)}5D!8x!Vaw>?xMpTMHn*KtrSbvJlC)^X`5`=n@7KaegZ|j z_&vOA;Hf9UlefWcJK0W!{qyqYy+@K?l4r}>K&9UIJA>Rn=&LIJW&S1e!!mh56j97k zj6IBzfdGT?gb{iz=db*7y=QuBUX2<()G)uRb^{k%gwi0@&45Azf`SMcsLRHBvD?ir zgwlj_$lQ@;T)B~yL*=GAtJp<72yPgMASkSe(Q+q?6PamM)cZ`3tURWuQKE@@LGuc> zxIRDe1&Mu~jdBoa>TrNCamdftK-sUCdPQSgK%qtPFLg8ZcgmxTQs%XA9j0+_U^3v M+sEx{WYxd_04T3=3;+NC literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtMacExtras.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtMacExtras.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..664665e1c3042c1e9244361495d6c6354bbdfa20 GIT binary patch literal 384 zcmYk2ze@u#6vvaEl_K7zAP&MULWes=?4rd^B0`l)x8vYQFV9|R?pKnQ-sb3kpnriP zF8&`bEjZmIIJp(Nbuw2K`pwIi_Z~?;NuEt}18KeQxBGbop|7&|m+_a(4|Vc@D5997 z2)h`g3IYt3Cydamp1<<+de?B*+$ybfQQi11+jU%Q5la0`HGB#w#1!IyfxND-7rUMO zGM0*P4#F8K#-$S`$v`@p5+%E+`Ti~A;QNIcGOBm7C{2WtMXkqTBJ?pul@dkd3!0a( zg@1A4#U%2S80HXXnau%$&{j#py%EGCug!X%WD4w*1Ow6s>8;%1U`b!P-O0O*!jW^M zu1Ih`R)R<;%@?(1l+YoEGqI_8<B(dNpngFS zUHTtglsfGx=+sT{=BZgD@X$AJ-s6Lh_kGMfnPv(!-uBDQcLU%nB7e|)fmu*WB462;rfpw|QdqQy+8K+mAHBrfn%u2XZ8Ju}iQ6Vs}dWs8awS2!Vt*#29kYUns zZn!|l3C$K~dM$T5exPKStaFbB+9OObs;GR1S(IdceR^nn)U{R68=%+iW(8uSl~ukk z>^^#ZyUgphq?o zT>L*=T5!5aaB?ej>twDf^qZG2?>&-yLh@`F8%XJWzvCAgLSI$!Fa0l>AFAX5QA9CE zA$BlE8UhU36GrG&&0o1{y`wv8PK|0k)X=}Hb_17NgiH~fNn)Y?R literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtNetwork.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtNetwork.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7ff9aa37a2741322cf48af6f5995cec5e9daa79 GIT binary patch literal 504 zcmZWlO=}x55FM@Kb}73(rL^=A;!D8?Z=qlarX1Q|9w5QSDFL`}=gAV+6EDTh_!%}`-TU%m}zZKTQw0z%;GG0cVbs=Y`VNRDPdJs_O|&MlChf>r6SS%sL4Y z?N_CT^G-Fg}n73HJ)+XTjPu=*@!O6nZCqy>#Gc{{W2tl?MO- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtOpenGL.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtOpenGL.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a60e960c0dc3f4c95a0fbb8152f0280e40de6fe8 GIT binary patch literal 381 zcmYjNze@u#6i)7}6!A6%aS(11I@~E@7cF)yLeWaMBXFe6vlp8CnY8paNB;x;3lwqj z|8Qx+=_bL+tjxvt?}|jrYU$AU6>DDi8lK|H$H4lLy2Q!vcla z!x$L|Fc?o5p;sNhAo{&$dK+Ga8C_H}zsu_yE_NtmeyZv|g9IW5QJ;gns%;kgo%}MA ziV6XlJ5pRoH;Ch*bW@d;+C|m(Z@B>9FRXwwUCF~F&Xg>wJs#0ae^XQ#RaCy9MJcu< ztuqqQkf>~wLzJeD0O$vfieo{>5RFNj_lV>QoP_p=bO4g9c{p0Bud>t0yPUy^d!w$k z=~mlK@@2IV#%v_uBHPwtW#95tr@4tSp6?;tn4ycKt1w+075TIYS3`*8Svh Jw_I5{^&c7QaP|NI literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtOpenGLFunctions.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtOpenGLFunctions.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0037fe54bf6da78ff9147a76664abc0a075d286e GIT binary patch literal 390 zcmYjNKTE?<5PvVRQp9Wu;vi%ZIwXqNMT^}mLeWaM5D2e%XY*+C^5?x2vpM<=^b;uJ z;`eZA!6}pAyxXZfd-LMcmuQUQi)g+6OIFq8R4;UwzT2t02kwm z&WX!Ot%|kfLHWh320CB9`Ovf0{b`Wk&(CMmvn$3yXd<&*#`@?Kc Q(cYbLfBU#yNmjl82Zt4OxBvhE literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtPositioning.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtPositioning.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..852086090d7a90f0e655644f5eecd3a01ac9ac96 GIT binary patch literal 386 zcmYjNF-rq67)|c16!A6%aS(11I@~E@7cDx9P^8lBI5^Vgvlp66?k;KZHb?(~{sKi@ z{2wkYINc;TxfQx~GFKJ)l005MzL%He*>N_I!TWxDP*@0kRhxg#;VvZ6V zV2msT7_29Z(5qR$2u*)r2Wvr%T3ytzzpHWsms^C=DAUb|LJER{=rd4PjrDT3Q(OwA z3FnaeBh9$-V=0Hq&vag8m-Q&RVH~2UbYe!0lO?IlwJPg9CP;3MDQlEyqF&Iv3R{qi zlTeT()cL3Yk!2nS=*OOxl80ju_iWo6Nb7ySGc0QeeVNO@tUqUdsGSEy5yc$E z*vA;v5MZc1VT4}w`Bk9b`jJ5(i2YB_w(7a)3ePsx;-n7?N?&Vf{cd1#U(LBQgXTto-3%NncvGTlN@*Bkx*u z1xr+~$PC%b%0;6cr?lX3CN?$FbT5y!nOPX)*$%?(2|8WfpH6GywBDkrbN=C+Pto3; NeSiD7ZI&>z{{b&JbKw90 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQml.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQml.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed15bbe1ab74693e0b1d061dd93adf2b67af7df5 GIT binary patch literal 600 zcmZWm&uiN-6n=8z%qjKQkB)Ud3{u7*hqy4vrIZy)p$x)k*3*o^IMHjORkjmJDRoad z=D6GT7j%qX_J8aWLk_{G!cMytdh2PjN4CK}Nl)LC-qZIU`eNH_pz-}>XYir|@S|{6 z(0+;AbG>~63Y2h&h({vBGYA-f1S^*W;7YIG@O6$?^-Qm(Z;cQ4R_B+RT&*1N4IO29 zbu`hsur)WahV_!wuu6>qDS4Gvj-groS>!d1d?TbZ7^`+bafC6&xX)1L8>3V*imw9B zdLk5Qz~YnS!ahomi&M9&4kzqwb1ip{(l@bGA?GOEiDF#3!z4MC?pTSUQBl<Fm!Pcj4@3&cVVt$l&R8ea4nx%{m!uPOT-Fvu7DRnwr;Of83rw+{$2UY8OM?*RsC= DZ1b?( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuick.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuick.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95848aa146245fff0b7848c92c8803b05a881936 GIT binary patch literal 380 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsI#*hPySMJUqJ?L0Wr%d;1n`K`kkb2MXIN+meO1N3^uJ_rtda*r5yc#Z z*ufZS2ry_*7@=1+f90z6j_zzYHLCSdL;tSY4P5RJO1)GzJqig#6e6F2xNdBg``zLy z5|VHZnVn0^GYLNRPAJ85@%AB^#O}Wrj99Vlt?08(4vAZ zZ!XW=h=i`p@&ckXwK#wuSTc^eJBDcNcG$obOoEjVe?*2L+_gI#t>`Pax<#K+II(-O zmotB4C&jYf3S*jcxX88@t9rILRW{c##`8UdTT^tt9-n4&YBt}3nc4m@+cR`!!Y0@U?us4r>1N{Vw zc=3C9*}zjzf+uf--FC8_3j62f&wGy~za-C=wFOGOA9hE%0l-&P{LB1H7RP1s05HIi zff#xa0s|08j3)@dYdL@Am+L*#+wf}G7=VWPU9}sq*g+Tvscr?BB!pwaLrT?>T?wPT4p)nY3eXS!pPA=Fn>b$#P8Cfuc#(Yg2FKx5#_Jl;b=u)xzo!B6qBag z*Zqu!;|syH6ihYUBwyCsvA`K4=W@G*R_|9QrOizU;d~Fk_7t40$EV$z+O4-}W_Ld9 S&I}yfS@*Y(yVa1@@BaV}#&lc& literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuickWidgets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtQuickWidgets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f7346e7fff20905f637b8e81144cf7283d1fa6c GIT binary patch literal 387 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsI#*hPySMJUqJK{yVM^z!V5=6)tudYhyFf&K-G zxcGm#wBU4;;N({5*2!E|=r=E4-g_kZBzZQBEu{2**clcYLSI$!Fa0lB9INC3QA9CE zA$BlE8UhU36GrG&&0o1{y`wuDPK|1P)X=}Hb_16?giJQ8*)vx;5TJ@1xr@VwFp7*#u2n8cYBWqrURlBr|L8YPm57qqBg z%faQD8gu8Z!qZNJSR=4Og3MY0? z_HyQrZWtYc6n0W9>#Z=RIfsjETOq60i&JHD9b-J-L%20X=j-ulHm7FuEtr|@53@Z( P2Y1H(d80u0&{M(9<|UwLZ1tGg?1jcQ$F>EBh`!sP~`)X!wYr;tKSAr2Ubb8EHS?i6RS zkc4x{ouOo0IAM|ugpX@=di6r6$%_`VD zI6d-W5_vKo77%Bd%>jbYmPx|B5yT^}&3c|-66}-&1JVcKE!|;nL0`DtDY}fpfpaOZ zAW9@$^ll)K!byvHy%{BR$l)YkSIp}9;!xRC#~4qy5N?jq@p62cjj`Ey3nyml!)#5^ P&Yf|8`?y(+y!!kfn45GC literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScript.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScript.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..659f9bb266db4a6428712f06d6d142dfb1d3b341 GIT binary patch literal 381 zcmYk2ze@u#6vvaEl_K7zAP&MULWes=?4m_S5sFm09f2dgJbR(JUrAcL&C&lr{{lr^ z{6Ab;aJorwaw~M}WUeaoo0l)|J(7HqJlpmLGJ4o1ufn&bg7#IQgy z_Ay2^1Q=>h7@=1)e?`oC-}2Y|I;-_i)B3L3O?mlozGxP1f?BuW_I#8OQlw2qt6p6%`s)2QBBngnpdy| zxi}#Sjfs|{0+Kv;1wa_NI!y%`Loy~E-Y1G{a5EYX=>Qa2xx>MdzI3-+^f-ef?^^dl z$usR`#iG%UQ#KNCCN~YNdbc_@HnT9svmJ!n6Lh*7pH6GywBDkrbN=C+Pto3;eSiD7 JT@6|N`VTaraYg_D literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScriptTools.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScriptTools.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..297639d05267197800695e16bfd9bb15b61f4dfc GIT binary patch literal 386 zcmYjNKT88K98K=56!A6%aS(11I@~E@7cF)ap-81p$H9?ae)d9h|B|$Lo1@=AKY=1H zeh-%xoNf}F+zQ<~nX3wYNggjhet9p+vt?}{jraY|pfC{nsy6>H|HS-Iiw8sz#T>=h z!x$L|Fc?o5p;x_r;p=|S^wzu@HF~IFeplrNF1HA!L9Utsg$xo3NytE6HrC7CZgG)F zMK}lHjuhk4jnZ@|-CT((yQ~Mn4dW05r4=!%PqH{mg_32x&k`cEO($=L6(zAu>qCnMpI3_$uTcQ{z4FWKo9Jx1Zky;8kU zuuNTR3+ZOXqTY&AI^u99Hg#h4czLX8W@3zII|#QX=yY{{+RcgGe2b=b`@?Qe(cYbP MfBU#y4N-ml52t%`TmS$7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScxml.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtScxml.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91c480e7931c9aa6635d608239b9c046c0bcf360 GIT binary patch literal 380 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsI#*hPzuA{41~I}eWZ^6Z7?azB!m-sb3kpnriP zF8&`bEjZmIIJp(Nbuw2K`pwIi_Z~?;NuDih18KeQxBG>G&{tLb%lu2`hdOyc6j97k zj6IBzfdGT?gb{kx^H;uJ@0s43SEEK3HO%j--N5A*p)|-;GoX-ypddm9@~W|3?skex zAr;{qa(Ad0mu{3K1LmK=mh`1NoubPq9J$x3 z8;)b{rp2P(iW55IaF%asR`qOotZimujAuItwSCUDmP literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSensors.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSensors.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2dbee6819e16375dbc402148beafc63e8b2c26fa GIT binary patch literal 382 zcmYk2F-rq66vvaEl_K7zAP&MULWes=?4revA{41~J5G+YdGxBvi_3!p-CPPMHF)s zV;^HwL4cw1gb{i*^H+gc?_2(wU!|2Us$1V>yN-)3LTQ-kMo1wAK|%BxsLT3#vD?Wn zgwlj_klsi$uDmEohRVydEZIdZ3~v~RFf8ndQL~f9X(F{MYCR^1G{+QGN;FX~XkNk= z*XJjJAaS7OCcE(hpGu1*pjj6sZpHtPk7X>e20ACdv6VC4=6OZw8?PTpk{j=U?~ z1)&nDyfk0bnsGu$9M0sXp_LC;$HrzB#(1`aaC3rASL4%ZOq|ABG<8}ZPHT$x?(F;9 L$L(^+^4os^wfS+s literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSerialPort.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSerialPort.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ccc787faa50307063b8fa2b9eafb62fc019f283 GIT binary patch literal 385 zcmYk2ze@u#6vvZ0D~EWSf;b4b2p#Sev5OWvicqA|?Kn8o=GhC){Yui}ZI1p2`WGnT z;{V~&g40cclUt!%Cv#Py-z1NhN8bD7y=U9rKw9tn?LlE6^i^H{W&SzyL+v~uiYVqN z#y-Z#K!Cw`!U(gIP9uH$lxP#Wf{5mLw?p^)?$$jkbAx!Wl& z5~&F1AiR-cTzXNO4yBhXQL#%a3~v~RFf8qeQJu-+EEP(YR*xk_=rU!E5=G<-npd#J z_4!GVkT_6cR6vsFE(hpGu1ZrLj3F5ZZPp7UQ{ZN#KO_T?!O9;Fmh`1{J4KgKIP$Jk z7X%}`qq$yIEUadn(h-LZQin`bXH_cLknHb?&h{RlewzUZ(hE<_ek zmk_7`60AHCfLA?#<>~dV;jXz=R_Q|B_%7RZQfyJi{8Tl3h6zRtqdrG@Szj-9JNZQ< z6%_(AXQa50P7udK>7*(v*+tFwZ@56;FU){5y_1JYoGDq4ilXp48Bj-wW zQ{g1}qSg#!HWGN2ZE8~aXnCw{W)MPVJ3yKfI9-iTt1+<}Z^6`ReORq2?A@97w~yQ9 I$jUGO0lyV*{r~^~ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSvg.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtSvg.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4b04b6c5ffb1c27cfaa0994fc877a63b65ee45a GIT binary patch literal 378 zcmYk2ze@u#6vtnBR*HC=f;b4b2p#Sev5OWvicqA|$>ZQin`bXH_cLknHb?&h{RlewzUZ(hE<_ek zmk_7`60AHCfLA?#<>~dV;jXz=R_Q|B_%7RZQfyJi{8Tl3h6zRtqdrG@Szj-9JNZQ< z6%_(AXQa50P7udK>7*(v*+tFwZ@56;FU){5y_1JYoGDq4ilXp48Bj-wW z#{(zH7qw;>vys5FY*UlUN6TYvGlLK^+X2#?!0BpyT8)X-cnhXh>%(eIVeihozkS>; IM^=9M55F33{r~^~ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtTest.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtTest.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f253b03928493f601f2c43eb4aae53c2332d39a0 GIT binary patch literal 379 zcmYk2ze@u#6vtnBR*HC=f;b4b2p#Sev5OWvicq9dr{myAn`bXH_cLknHb?&h{RlewzUZ(hE<_ek zmk_7`60AHCfLA?#<>~dV;jXz=R_Q|B_%7RZQfyJi{8Tl3h6zRtqdrG@Szj-9JNZQ< z6%_(AXQa50P7udK>7*(v*+tFwZ@56;FU){5y_1JYoGDq2RvtRZvX%Q literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtTextToSpeech.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtTextToSpeech.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06e26692f6d632d0b9a1db86a21c0aadf5dae623 GIT binary patch literal 387 zcmYjNKT88K98K=56!A6%aS(11I@~E@7cF)ap-82jj)Nm@e)d9hf0LHp=IA%jPoRj4 z-@~N^r<(*Pw?em0CRL#?$>Zh6FYhIJwyZ6r@P61D6b3?Hdh-wSPb`j=ct8|U%u$3r zjFEu=gYkqBdR6NezUuc(Z^Nrlql0SZw=UOkxkD%oGFcBOq!3ex`wYZ&ZL{2O7gw>6 zgmcKu=%AZhqL!89KPL N?kA7CdgS`=e*hKXbC&=B literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtUiTools.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtUiTools.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9786156627ee18f374837a16e8b5c108f3b18732 GIT binary patch literal 422 zcmYjOu}T9$5S`5>62vP61+fs4LP&8J5YlKcScwoM5(Nn-$0a)^OZM)P+fDFNrL?ru zFHpqBuduO6z(TGPtn32mQn?ou^LBQafw%J>I}f_P3<|H?<>pHQ;4^Oip#2upqAG5I z0wo+=QX>QsfCLlw1mH>CA6SZC(`w0D3N@N&l7SxgRI5TR`4v-gBwBMQwY#!lQ|zEe z(Q7ai1HBSf8O0s*M4r3+IJXpSR>C7sNQZL_%${Uim@VIL3$rVO*jALb?Muedwj;g8 zs2arFjvq)7rR&Ud0yQ;CQAaxB5vH;B?Ba0O@*LNaK`%tF+ch|1qh(0n=T;xRzEx&* zOE8H>$7!^kCJJl8Lw>G4&&I#mGj^(;3$qi>(nZ&&J&yaqic*XJL>#Cz(Fh@v4Isr4 r>@CJerZCDBo?GKg=`B+l!`4v0zPej~2mK~LTFs6jJJjP7#OwJ6X!?CM literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebChannel.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebChannel.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59e486a041f72facb9f3653ed2a8c8158270193d GIT binary patch literal 385 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsI#*hPyS97HHm=^z{jXWBe_p}E|Tq{Z7D{SWjn zP{hUm!=(kMn*=AfLbp!lszSec`SRW)$tTIPWvwBt_uW=MHxT+Ni+`Da$!uRI4~Qa) zIf}4{F)|QfFrF|%uX_H<*XupgTk$H?=%AYUUAAku*dUY!sj3GQ5)c$bkAb|Xtrpwu z{9H&yIETy~D#oQ7#_>S9sme-rQ4N9{#vup_D`ZsfWKj}lN*2{F6C~5e6ctJokuPXg z!sgd!N4_ADud-ndB266*&0_FtnnA7EbKuhuxf@ PojdFP_HnZuS^4un5d3ni literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngine.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngine.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9cb677a36a100f7ef2c54c852f9cd05ac876566 GIT binary patch literal 384 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsI#*hPz-M1&%h4#IJ8q|LJzn#=u2T6&wK|AGDm zin#cHxU}GOli=i5=+?V_U*3Bp`6PL^tPP~~zTfKS20~wD@h|f)nIG!p0Z~LT zM-lcgMg{^5#uG;9RnK4fdc9|QYhHyK9aJ;F%XSSHTZGaeRrP>E0)m3*F_2fa^7n;O+gT>NH3wNP^D5tT^5$zo!4aA&Fp4o5?K#Y zZ{n%9_7ha3U%>C+Wdk{cy?PQa3%&K^>`JUR-|&9({{NZzQm@yLqVKo2dcR5t{m7L$ zDZQYx59&HX1Q8sd0k-f!vowrA+nYzAkEVtIgMNY$I#v9KY~{BWtg=;6UTx2q+fS5m zI#-absi>+|gECa#*Ogp`3e*azLbM%}bF1_-k8f$|l1qp)ln)#N5ikPGry$a$C>E5! zeJ7wEcX{kkwi~`^T}p3k$IqCMZV&+Pj3f<2ryqvEV2^=~?Jerrf=VzW*WY)0AnboOS}S%b(A)weilZ%o^7CT(llwkGZHVIf=C0N-7(xr0G2jrUvGsDb$!#tVh2GV%jZwGk=q0ch;hw&FI4s~#kD5997 z2)h`g3IYt3M~u*mwqJO<-!c=yRX?o8)M~tjGpqG( SwPtAV*1WrU*e)e2|NjjL%5^3H literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebKit.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebKit.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c97583a29ee738e8b6cc77422ba84ebf4645051 GIT binary patch literal 381 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsI#*hPySMJ!V3ARK`sZJxc*+|Q(?w>kPB=wG0S zi~om93r;r)PHu&6oy=8*e)IC>y+@Kyl4r}>Kw9tnt$uDG^i>xBGXIkKp-vtULktTP zVh>|vAi!WeVT4}w{1wsbJ=0tBD$MAhn)zL}Yq;2=jQOdm`wS9@7(_h|@~XC8?6&iZ zNGd7>WbROLA>AO32hvSdRhdsCIcoGkr`^VN_B1g61V` zLC#M|L_?yoVGdE6Is%{89_86E#4)PD{vCp8_+&TvT}!mC4K2mJMVA?NA9({ zf$k+&ZjvvmjWA|I0cY8!hL!J@$J%Bl#(1`aaASf_SL4&JPwe_zFtwW>c5{mM?yURq L<90c+^4EU=B(HH7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebKitWidgets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebKitWidgets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0085e0caba5d872edc57993806dbc1bcd509dc17 GIT binary patch literal 388 zcmYk2ze@u#6vvZ0D~EWSf;b4b2p#Sev5OWviddx5p>P}=>E+oA&HYSTyv@=7K>q?o zT>L*=T5!5aaB?ej>twDf^qZG2?>&-yl02K{22y(8Zx0F$p|7g=m;RT`4^{GjD5997 z2)h^~4FLx22_y8X=C3@p-qqbTw??%ts_WlXyN=5(LaCq0hEE}dm_i&d5Lfl}a<@}l z#6l9zA$LZSap8nXG89fG^NL*>zJJ3w_ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebSockets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWebSockets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7d5a9aca2b27763d7d0ad16954377e1b81f44c0 GIT binary patch literal 385 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsI#*hPzuA{41~5RQX0y*zuNx!jMW#oHYH5A-ik z#Kr%^r3I&(1Shvbw@&7&Lce+W^4=rKC&{yAts$-V-FCk)5c;Z$f0=*DY+ol2h$4zP zim`_=G7w-eo-jhMdj87S>pjz3@oLoQqK5fhwHvtHAe07~Y6cWi5EMknKwdOf%k55a zE~FxyL+%b0F5Co+aF{*d6I8AaT%X*IqlIvs28YPOz7c{G2 z^Xs!CUy#^W`LF#w<7PGT>gRs|9U5}a literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWidgets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWidgets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7930a1daee7004797ab7b3792c9788182e8d1a54 GIT binary patch literal 382 zcmYk2ze@u#6vtnBR*HC=f;b4b2p#Sev5OWRMJQ6~ARH%0+B|!qxt~dkw>kPB=wG0S zi~om93r;r)PHu&6oy=8*e)IC>y+@Kyl4sLg1FiSnRzI%*e3iw&jK5^IuagI0z=(j5 zxP(9jkYMGB0KDq?D^IU?4R^(@vPuW)#&_ASlVXE1=BKLRGfXgI81*>Hi~4G@-OkS= zsi+W`IYY&Tbb>e@NGDZU$u4TXf5Qd(eqjcj>76`G;!Me+*5wh+^f5)1QAOno%u3k& z`s~PyXy~bIm}8Wtwm|F!wu)onjW8N{E#CDcS7;}+H=uo#-qIcR7W9SN?YzSo9ypik zinBf{=_L8Q)(m4d6nK)YYg+kmd8ln_5JIL~K$>GXUXD+zF}50S!NfZKuudnib7$V) LK5mvHE5H2*u6c2( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWinExtras.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtWinExtras.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47f62dcdbb3685ec251b67f869231a134413dacc GIT binary patch literal 384 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsI#*hPz-M1&%h4#IJ8q|LJzn#=u2T6&wK|AGDm zin#cHxU}GOli=i5=+?V_U*3Bp`6PL^tPP~~zTfKS20~wD@h|f)nIG!p0Z~LT zM-lcgMg{^5#uG;9RnK4fdc9|QYhHyK9aJ;F%XSSHTZGaeRrP>E0)m3*F_2fa^1~ew2l^K% z;^P0|(t^`Xf|FaJTPJf>q2IiGdGC?rljPYnH;~r*eyg7u2z?dBze<0}{7@$kh$4zP z3bBhZG7w-eo-jhMdj87O>)n#O=9a0^LDkZC(XQfri%{yPs_s)rAfgcU7|5&YdcNDv zE+eT3=OCP+Vq7{w91o O?#%n~<90Db@$o->TXF>e literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtXml.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtXml.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77230cd3d57844142cc624198964920dd3024975 GIT binary patch literal 378 zcmYk2ze@u#6vtnBR*HC=f;b4b2p#Sev5OWRMJQ6~qQ}9JHqTyY?q|~CZI1p2`WGnT z;{V~&g40cclUt!%Cv#Py-@JTz?~&w_XWK*N6#Fd`r% zE+J3>Bv^SO0Iz!f%G2vz!(DN!tkQwH@m;p-q}ZU0`KfC73=@nPMm>)5qP|*exAXHz zDk=nK&QNh7ogj_}(n(cTvWuGU-*ADxUzh=BdM6K)I8(Byb$LWHeN0hhR8jc?vl2GH zK0ERv8hR=l<`|`^Ef9Nwt>RdCBaB8~i+4TA71{~y4QL;ww{(ZS1%2UmJMVCY2hOFs z3Wby8^I9{E*-+p~wysI#qvfHtsX+*tZUJeI;dnVdt;X1Dyaf~M^us!xz|Ng{fBU#u Ij;#FhAHQ&K{{R30 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtXmlPatterns.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.QtXmlPatterns.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e707d533184444dc88f7584012a629dba0085ed GIT binary patch literal 386 zcmYk2F-rq66vvaEl_K7zAP&MULWes=?4revA{41~k>lVT5!5aaB?ej>twDf^q-eM?>&0;g61V` zLC#MCLE=EmQ4S)@Tn^BWT%9C57=suGZPp7E)8MA0KO_TC!O9&Dmh`2&oxIB^9C=sz zI_4dsHAtbnG+)%3aY9EN&g7;cmXBA*#%31Ac(#LZbAnD+wf^H|rYiA{Oz|Ls3d;si3V9i95q?Y&O|WW-Gh2 zum=y)i@kXj4=duIqK5=>C;_41$=gaj_2ipucl+bgzPx!e@5`6>=9?s64MRs@KMG5g zpDBcX%cO6RCwBAiXBwL8yKSsqRJP%p)mZm&q6fy9(92Ez4sKv4V5VhV(NLc zWxySUs%xm2{v)|X9249397`}-R9o4V=9*2}y}4Df;BnTJ{;*JC$Q>U2g8&*ZRiuVpBsJ_}kp}q0c0fT#f&Ihi8NacEKM(ZvQ8`n!gMkU7 zXBb_ml)iGMp-U=hSFS`ZR@%XE#>2~83W7scSKo>Iu_nCbMy=kA({3^iCpqJGIo1G4 z7J7nNoLkM90GOu2nMy zZ#0>^wN-K$D_2Xx^Bi-Vx!dNF{l@fd!Af}_-xW2F)hw-~r&)f8qSQ@-? z5HSbaA1iw!CIkX;WQ< z(-Q|I^HJZ^_aB60JR;)(8SimkhT2S|%}7qZ&v_V<$%sq_WU|LGLv1$FW+i8;&zTQN zJ|g*mPzX_@Q^!!&4x+#ot_ZGr40h&JRha>Aj;%%clgcLo(qg_SE*SiS9-xN~D2FPuM VvqA0-c$h0hxk88vZ9`s3`~RJ{{_+3- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide2.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8319e46af7b42f334dbb3360eaf4cc7c3ff6c758 GIT binary patch literal 650 zcmZWmL2DC16n?YWX467g#a4=f+7{H%-3UF_;8lexh1|m8u*pm}(`;swnc3iass};* z1NN9xRr*uBY$S&=C&5#0f!=y@Ha1Z3&CKI_558}{H}kDpT>}$8A0I@i4e+NZmQlI} zmtPF{3Iqs>p^sXqZ?!B07Ep^=X9(cjoPU9UqT?kGK0YNjS&6KceX~o-#EGolf*{J& zCY1<%r~w`=(LicdY+9DJgX8b78Ta?RG zP%IgbVv2_fw;3mO*1qZAhNT#TN zJ&p`+7<;y`w8;MTl=VS&RcZ7SlE(CfxMS`p{!4x`Xb_`fR~r{3v-V1Nt#}n`bWqLwF2glkY!FI=R5bz$2?z?J$3R}yR*UU+ zekr6PoI~ag730zk<9Hz5RAnW*s0P6e;}8Ue6*8(bS(LMf0=*DY+ol2h$4zP zim-<k|}V~pf?EmAj#4l_7?PoJMFx~C^Xz_ zb#Q)`2yoMUUOkBtI^=LF)-|krw>;D~H8IB1Erd_T=y*9k?fTfRzl9UK`C&IFXy?wl MzkS>+hbVvj2M)Jz)&Kwi literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DExtras.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DExtras.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b196bce0293fad06345fe510c206aa0accdb9db1 GIT binary patch literal 383 zcmYk2ze@u#6vvaEl_K7zAP&MULWesAZ3h**C?XW8bUO}@w0ZVIbH9?b^fpKT1N{pW zaq<6fX~F3x!O5-At&_Q`&~IM8y!S}*N%Cx(Ye?&Tx7o`|2z?dBzl^_Rwy%>1L=nXt zh1kUyl@MSkJz<1i_578m*Sm(h;+AQtjjG0X(XQfrgHYZYQEjd zE+eT3=OCPcVq7{w9QUP@Dp9cWitpbt4!)n80i${+3zJwVnO8b2B0?XNmnl(1zMxqF zo8MdR*lj1%sjzQezP$HH@=5Y+7#m3GeZMozHH5y(;$Qk-GCx$w10slE zhC=LMj5Guov?q+vtD3)Z)p|#F)|?8_dZ?ynHWKtWvA){EV4 z-sVF3j6rH=k}_cjQ8W^EBGZyxR6Xy8GVr{@2q;lIX&6VT6h*a9xu2?IiVE?iFJ92R zge|TwPF(JXu1vEWc#>EQU=Ua`ikLeFK6X2_?+Plxiv7XJAA)dK?r^ZAFWu_qJxZWq zU&*8MHjguD$N8e#3?q^;I7>Gbt$esRRyNZy#|Up^@T2$wgc=Ye3qAh`khw5H(3Phh=fuWL}do`!6$-==M}^ zegpjkig@vRc$r8JvM0e)Zh_uijc-x$^si*e@o)J1hh4ojbF=)S@-R-xG=fKLThZyO z^ViC(OpNhr7vV0JsPq5-S>KcOy|1Hr{a{f)n4=qK_PaM9YO5-;b{FPNY2J~|!$q?t qJ6-wwg>3h}H+!<#`(a&`*KW(2Gq;?xC;F{SWZhl2>pHulxPJqp_^G}C literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtAxContainer.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtAxContainer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbc61b614e1ae59ed3f7575722f3c490e72e4a5e GIT binary patch literal 386 zcmYjNze@u#6i)7}6!A6%aS(11I^5}CJ7}?pg9t?`-HwAJZJxc*T<%BG(%T&U5A-ik z#Kr%^r3I&(1Shvbw@&8#0sWHq_!9E+eeXS4)&|me+iwqY1EJ6I@DKBkEDklfM-)-a zQG`8=k%0h%@rV(6(eVpkzxPaU&8twOi)!Xqd0oTB7NImqRU@E~fS@4y4CGa9z1Z#K zmqIGSIb`lgF)rOOj)&4sRaR;j)gZWG9D<;*LPm8Zi;_4~vZ(f$AesKAs8FJad`62> zY)LMTeL*5$WuqKKnmQbyA37?IxjzOm_S>xIOQyg{NPkEMApI2&2S4gR+3Dn6Mxo(e ztFy^@EEHivn@sX$wHd{9#NjmC)QV;E@<^w-i7}q+i`HD&CgzFF83$7;%$z81N{Vw zxcEI>T5!5aaB?ej>twDf^d)(`{P^X)B+r($fi&LtJHx_2=&RcN!~7HTLoFT7&|5=G<-npa_q z;NsX9B=S|37a-Eq;Q)isQE|-uF^I9>VSQgR1x`W+BQgZ(uiW8anZ9JFTl5%(mV2$v zc@Ek@g>F(T>g_0|Ifv71Q|DDrmq(grCdPQSgK&F-PFClq-JICXw{U8oeb{GHw0CFS M-#%_vBdb3C2d^-4j{pDw literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtCharts.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtCharts.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f22b3bea9f3cd66ece80bf60e5fd489346e7a6a GIT binary patch literal 381 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ9k;2=VgO1C3$q|LJzn){iw^fpKT1N{pW zaq<6fX~F3x!O5-At&_Q`&~K8*%Omf7^4_y$Z6U4q!}cII5c(=F|1$ra#j$oC5JL*Do@G8vcqMG?#hHJRkp^W*dYWNHih!{kD4)VITS?qW6 zt4Jy;1Z3_=aUtCxj)&4sRaUZ#s_)-&0lr^Y0cSdshe@0%SyX#GqM0sJR2WrMzMw@3 zTawFD648*TY?MQkrj7vU2abwkLBI?A8n&+*$XN L$K7&e<*S>>^ndUEy!W`f-`zbM#s*S)-|r3!4WX~9_?P~d%nw!afCwTu zLNRtQMj8SP+7m|TRn1?yYQ3X7Yfg=5ebmsut9ApITRtIPCR-kX6c_;(P!N}m^>VjY zTreU1C<1Qhl19P~lVl|9O!A6d);;frM&Nm+5mKUd(l|}H6lHxtna|ZRWsUgK7cXdD z!4}u&$1d|@SMt07mSt815QLUYlE@tc8@pXPa0QiMrG7B-halXQI~*+OOSgJOpAu-< zSMn@jLC!faX{W`a-i{NJM{vqF6|j1{I8rv#F~+kUgxeEzvKpUeb7D5%!l~K$FgsJU PcW2z+K5kcoS3my)E)H`2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtCore.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtCore.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f80038af5497fe55bb00cfe3418dd21898a16c9 GIT binary patch literal 379 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ9k;2=VgO1IOK)@ZKhVEG z5f}dtmlm9E5}e!$-8z}83jOBg%X^O`pCr$gwS~0a58H#>K6pi({QUAc`pF zD8e4b$UuO>c)|$1>iH{QulG!E!>drEi)!X~*{YxIcz??6+CZmrQ|^lKzkkK>BNUI9kzH?sW1lqtI|~ z)I}n|P4i{786|YY;aqHMRQYOoqHS(sjOTj@H>c=qJwEOF)ULmUGrRR+w`SXzpin#oHYH5A-ik z#Kr%^r3I&(1Shvbw@&7&Lce+W^4=rKC&{yEZXl)i{m!t^5c;Z$f9Ze8{7@wih$4zP z3bBhZ(hy+Ko-jhMYW~Vo>s{Slb8A%Vp}PKEwd=UtB9!{6Z2A-uh$ut@2I8u|UhZ~_ z%ScGVIb=>Q85d3v$0OmSGOO67;rlm?gYTDSz^K~E!X(b5D2+agNT!Y{Ym`VLUeLUP zE!>M^FCw8Qv%G*PO>GV^2y7Y0+#5qQ_ByQZ2`0f#$Y4Z_2)k=*>FMt literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtDataVisualization.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtDataVisualization.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90b0dda706e0179b791b29cd4aa70ca1384ec9d9 GIT binary patch literal 392 zcmYk3ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ9kB8X6=QgAp9jZgb_demhC(BwxT5r4UL2e-QSzi8S{yFn~?c5`Z zDCQ`_9>&N(fWdgg2)*d@D__6&OmD@jP@{`#=2sc6;bMbO8l82_x*+n%7t{8_PD6EiCoynpk&Xg>wJtjz|%M=w#6p_zp zUcwfG(?eg7$XD4Y2a%=@2k3{6iev7NL5%%2>-mx?a1zoVk^xA6=?{B9^dIYV@-Cy$ za4*z}23#^ZBAne2#bV(m`J&p4Vmjh*oULna*#dc>&CJ9Y&$bY5PSDZv{;=y4yZ#zZ V?bf^9nxdUs>+bqtvs_s@fN!72bl!Y$2&F-)8Ucj_1O?G&ATMj{#cn6R z5K<{9 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGraphs.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGraphs.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b88e00abadbb53c2ce59b16ce1b5530fd785806a GIT binary patch literal 381 zcmYk2ze@u#6vvaEl_K7zAP&MULWesYYzHkm7NJO`+Yva@=GhC){Yui}ZI1p2`WGnT z;{V~&g40cclUt!%Cv#Py-@JTz?~&w_c&kGl&Nq)Kz`6*ze|- zvC>osklt8xp}a6jM#{^yEZIdZ2yVE5ASmpRGqaONX(F{MYJDD4X^ttXjB2W0(4vGb zN&A$!KwL2WG=qq=-d5<$_de^!w zX&Ndo&6l-Sl(4aYbGdC`<-661vAKmYp6?;tnxeDy_;eamr|}lfoQn_VVulXx?EBlt K-EzqC*M9&id2u!X literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGraphsWidgets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGraphsWidgets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21e30fc8dba6004c54c533fe516f779f672b03a4 GIT binary patch literal 463 zcmZ8eK}!Nb6rR~tk!Yi$B029`AiT_`aEW)U-7u@p@Eke<=uk#KSMtWiu%#+<(8zi|GDvo-TGh+IOH7tV_-K z*?2{ksfsb4?ju|b(fMk;XYyet|6)%v<+n_Ef)2;p?alq}G==a+xP2U+l)^1Zm&aOs Ig7_c50lWo_OaK4? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGui.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtGui.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d6dea1ab1bb40f7e3747509c9e31b6a0e1aaef5 GIT binary patch literal 378 zcmYk2ze@u#6vvZ0D~EWSf;b4b2p#TpupPA6u?R&fojeYXw0ZVIb3c1gb{jG^H-i)@9OS`TccVZ)%EYHUB~4Pq0~=h)2EO?L?Ie75SR7Ma=%wx zL_!kIA#-xcxNw3v9t$UxS;a05-@joTe7`gUM%7LhCUGW3X$)9IGIdN@qeK$%f)*8Q zdEGhnA`*Hs%L|Co)aC%gz?N~$y$M7UugeCWU=r+v498>y!dtt;(TcuuyI1rXg{E^Q zJ2`WbVrjI(nC2YLvu#DH9xYCk&2^0Nd=KH)6rHWdr`4ERjkjQCwLh%(3?1B=_qUI` J)yS$Z{{g+#Z}lewzUZ(hE<_ek zmk_7`60AHCfLA?#<>~dV;jXz=R_Q|B_%7RZQfyJi{8Tl4h6zRtqdrG@RbMZ5JNacK z6%_(AXQa50P7udK>7*(v*+tFwZ@56;FU){5y_1JYoGDq0GM| z6p54Mi&`s;*+}4Nwy9C&tL2flnL!Ad?Eq;_;AAyEt;WP^yaiM1?87>n!rq;EfBU#y Ij;#FiA2%6rT>t<8 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtHttpServer.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtHttpServer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee6e8b27880ea8eed5c60f8a5614b588902ebf34 GIT binary patch literal 435 zcmYk3K}!Nb6vyAV8WL?#7(|D_OSA{=q=%9`R8$~gcv}{>)p_aQI=jw{lAb*F4eApV z(WURvMWNH4f==B8Z=RYpBL6eh~*0=i7#zv{Pu%M3W57*i)khR`NSeu}GBhD0RE4=u!-kQ{)YX za+s+OYK&qrf2~de-slN|TwPf!(N1-6$))mqA4R^Wm@o6KAZW{cSBaP|O1thY^U-x9 zv&E>c$2wskl#J4K#yz2nM=9zlPrkq`Mws86A3EIYI7;*e$h+N~kJxDCR1o-1A9>%Y zu(~6e!d&Pz+Flc-v&3+)=)Q=#f94CN!WxRcW()`Obg2{2o{z_3O*f3EBTsdh8ibJP xHjvU7j+XCdwlK~X-ddAv`6FAN!0yPrzkA%8rh%-FH}}UI)P86Oev>Ic*`fq(!2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtLocation.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtLocation.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8afbb5b52e97fe49de7a69216f42b6d57d43e430 GIT binary patch literal 383 zcmYk2F-yZh6vyupD@DwvAPzznp+lmB?Vv?R5sFm0gpjz3^J>)Sp@#WgwHvtDB9sQHZUqz)5EMknKwUQ0i`{O1 zA(SSZL*|Y&@ZZXz$Lt MzkS@UMppg%4=Y1*5dZ)H literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtMultimedia.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtMultimedia.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b766d223d482797c28f7b65ce309ea1b65e79cc5 GIT binary patch literal 442 zcmZuuK}!Nb6n^7sh_pdb5Cwskz=Nw7J(T1nh`_?|5XizdIxiiZ-PN5@(v!#jLH&Xv zy7WJ~DAZ+7L8oqlH&4wPL5IG1^By03yzgV?(KJ(_@w#7Wy&C|Z5&4DYOUz4p+yMhd z1h}M52*dyh#vTa3v%WvDwZ3lD0;GvdssK_>ncNirndq>MQ|Rdg73(PQW} zIm*#)by(vJi`IoY>kGwQWSm}d)MJg!)%N|4w0bItLWW7l zx#j{LCp6of>9ySL`hk*RvcWwXXpb<#sG{--=24Qx)yaYFQP);Me~4bMmlcT3c2@bm zum|W3>JAsllIyd+z@uPQ8%B>Lk9C_Fgpk=b wkkSMW|JFykFi96)+S7FTEnS|%-q^gox!;zx2OkeyEZML=nXt zh1kIuX$UZAPZ*(BHGk!*^^WeWIW?;FQA7W(+6`Q85lX#Owmb?6L=>VS1990{FL!&z zc_bv^95OqXj0-!6~`6}6-2>5FPFL;w9{+a)@zZa!ufh+f+8@2yqz<#`vQ#%Z5d_8vB&fN_&#d@w#&9 zf8hKA2jj-S!)fl|3bR!pRXT$^SJ9qx5XeXx-ppv;Jn4HFz657K-fbV>c>uraU~Y}S z;PKFbOJKl=fSkl6_hOHL2S~7SMF4KxdA7v$#0zmVet}I__r5I7D_0KO%mX+J-MuFB z4xrumU1!@~wL}?9hju+>SfFGmGmfTODoVo{uBU?cG}UFw<&oNH`_;;Bxh0LILZFUD zmJ1X0l^U36XmzbzFF05EX?ny3rfC)SIdh~uFO;^X@_SrTT~BB-YN@H-WXe%x)=7|P zzbZYLb((8(Ht!{dTkI4x8_;7k$v+C; z&$P{aXSY14Uli@xo##POQ9k(}a>YghKk8R*TK%DB-?@hdA>?5h$UYgv-v9e&Yi-qf@4+7j8{^>ZG}xE~-D%LBK=<6Qmku25AC;7q5C8xG literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtNetworkAuth.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtNetworkAuth.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a9dc80f2e4c7a1a162458b9279ca1f7548fd0f3 GIT binary patch literal 386 zcmYk2Jxc>I7{`-4D@D9bK^%lzgbsH)*bZ7OP9l_2>2@3(Y4g|%&AlaQ^)^Spfqnu- zT>Ks`EjZmIIJp(Nbu#A*^q(hxp64OSFUgZ-Z6K|;{q`_75c({Of0=*D;!r2|h$4zP zim-<pjz3^D5Nnp_=(swrjZ9B9sQ1Y6KKgh$+Ma2C`FIFLt~6 zMJyHJ9E3Yoj7v96l96;XB}#Tt4T3AiAqWa9WK{2DQJM%Pi)x?6MCfCR3MGojXS66` zOLBhf$0YKV80QdYnZp4Fp`((7`xA&Kew+1u$rLy#8H~sfq`z{9gCF{jJKem;C^Xzl z)d6*#h|$?tg>ITJtIa5(V-BZcQxnU_%Oh=b6JtEzLAW_ZC#&&c*Qa*q?o zT>L*=T5!5aaB?ej>twDf^qZG2?>&-yk~|y64pMqQZVz(}p|7&|m;RS5PgU}OD5997 z5IYzn4FLx22_y8X=C53}-qD>cr$V(Js_EZlyM~KBLaCR^hDRZRh(hEu5S`j~aoEkT zBOwXrklAC&xUhpb9tk^@S;;P{o;P3|Jg+bUM%7LhCUGW3QSGycWa^lrLWv~e1uaY1 z>h|i~jY#OqY@9=srWObA153s+cP9`{+&1gGf=RFv;*ZD>gu8KvlQn(qRyXf43Jv>4 zb_Twk1}uwX7o_a{4TF+xY(hL`KfC73=)VKL<0`;vbI_5ck_!# zDk=nI?pSdl-5`!f(oI!XY8O@Czu^LWzpw(%bR`dyI8(By_IX4z{Y_C}R8jeY7Nyvd zv`A4pEvq0$>n0Dvkx2Kr|s8-Y1ePa1uHg(IH5(=HY0izRFHF?{NkV_gY

kPB=wG0S zi~om93r;r)PHu&6oy=8*e#v`$33>Ux_nr-73n{!Gb_ThI&{ui*hyF(v$BH~4iYVqN z#16(tLx4eh!U(;p_=T(9JG!&sRH)WNHT}E1uHj;bQ0k?!;ZaB+q7eBE#AR)>*ze{S zk&uLQ$n241T-ZSz4~3n|tkf>5o_EVQcwS)yjH*f&CUGW3QSGycWa^uuLWv~e1uaUk zrQbevBNDnY8|4tCsl@^Oz>;yy-7!RCx5N6bU=pl^_(L)P;jVc&TB)zH)y;d1Lc_k6 zSITs|bHnHWq_C5GS#5?f9dS6%wv}etzBo~7u49bndk8nD=xlv|n)Rt!e+y=2>%(l# Q(7~N?KY83OS5^-H2Zk_n*#H0l literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPdf.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPdf.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99e0269e9f220075c14fbfbe7e6277bfdd61a043 GIT binary patch literal 378 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ9kC_<4+Cy#?8ZC-n!xnD_Iyv@=7K>q?o zT>L*=T5!5aaB?ej>twDf^qZG2?>&-yk~~}17Seh@Y!7n-p|7&|m-&}0j&<^YD5997 z2zwYK0|5r(2_y8X=dXOd-ZQ-ouR@J3s+r$qyM~J$LTQkxMnEBjm_poVAg^kh#eOHh zjHM!+gK)=+ap{IhGLmklM9D6yK`>w(f}pTMM)gh>rHN3osP=rUhkRSnpdGl2i45)vR%W)7NImqRU@E~fS@3H4CG~Pz1VH% z7eXq+Ib`lgF)rOOj)&4sRaUZ#Y7q1phaf1dkWsypMM<0~Sya1BkW3#_R47qIzMy#t zTil!<`+`Ki%0@YeG<7&YFLYEKbAJqC?6+9gmrQ|^klv6CK>90pI9Sq`?zHm`qtI}# zRGap%86AL{pS{pra(79Kw>kO`^cN`N z;{R}I!RaQ!$*s_>lewzUm*nyC@x8nx&$hjV4Bihr!@PpfSGoCz^(Pj`Mm!*jDCQ`} zKE|km07K;oBlK$4F9Or=TmFV$rIjA4Ti<25j*A^aX_)F}NFf11K@1qEtNLcK-_0+D z(u8x!ys>6nd6ASO<)u0+vx{07-Y^bfSlAJx#>wJDW?B`sJ`*G}#}rjcG*K^TQHCwa z#c3c&9O!JEgGf`C0}LWpOUZ)?h)K|4{Xj7dZbAklG6WT@-Qj4JzGAnV_ZWqycdfh9 z7?>1H480^@)>^ToV-Dxpwn;1>uTBijEsXJe58>7novqJLr!jRJZ_&(Ye>m+KI=Hj% MZy$Hdk(FQn1Fr>hZU6uP literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPrintSupport.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtPrintSupport.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd627f7c08e2ce327a518978979a4aa1305b7a42 GIT binary patch literal 387 zcmYk2F-rq66vvZ0D@D9bK^%lzgbsH)*bZ9kC_<4+x8vYQo7fA@Ks`EjZmIIJp(Nbuy_6{U>?6Jo4Tz?>#%t7SMV>?2bwcfG>0Tm;L7~j-&-lBGh)sy?6`30IuqKzsL;P&&p-Jous&6~Mc4pw< O&bhyR+%-#>+5Z4B;B)2x literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQml.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQml.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdeeece2f271345bbd36a3c88edc104e87a77a28 GIT binary patch literal 560 zcmZWl&ubGw6n?Ymrkm0gu@&ncgj|FivYy(5h=o!RAxL9SE(^;h^V*D^{WUWwuBROH zALw6DkzV{iyksGVuqVNjw?c0{IkOTG{AT9O`)0m3@4flrx?7;}{psKwS^z%{Swr&% zw_IK^Ai>rZ0l3!d4?-OiYy@`D*0>gI|WaiF4e15p{juxK3^o}a;ckPB=wG0S zi~om93r;r)PHu&6oy=8*e)IC>y+@Kyl4rx%LQ3z4-BF<-^i>uA(*Kghu}U5gMHF)s zVh3ZSA;6$LVT4}Q{FSTLJG!&s)TlN<4gI@nH*mQ_DD_g=@+c$_QHXp7;;OM(?)Qqz zNJzptWOgnY7j_WGV_~NJG>06-p!#FKAxE z7S|UiPDlbrrdbYQlGHhX=htNvac2zS*y*r=BbbDGOuP{pf^b&uaImB=z243Hj6&1u z$zI01(b2gT=Zk79h-k*)EZtPJ^5NoG*-Xb6&vp=QP0;CTe434k*?9A(X8XfzPto3; Naew=`U5>Q;_8*WGaZ3OI literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuickControls2.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuickControls2.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f759fd602f2246b24c9593bb3129fe025a66813b GIT binary patch literal 432 zcmZ8eze~eV5WbhRQp6yNf;b4lB6LUup$=Ls=paIomTn~w(!R5O^fgKIUW@6}(f>d< zH$`0hKU`XH%2aT2D|G8*QWc8d{ooFc`#$cTHEk7QydRXBj|#wN()>aFEoOzdxCaW9 zaOjX4A)o*fRGtXHYaBnY;`y3dOV!e-Ql&`-TGCUs3c1u*GLj?FmP4uCmB%(kA6<%W zgP|C#m%}Qfcx+Z=rN)cATTMn;WAsx;!Fnf}5VYWQ4EzGVA5@Auswr?0m+m5sr zqwy-%@x4HbC{t&y6U2L?GA{+nYUU;qyJT8t*Kb&U@9gp@no&{?$X>uHK9;c~F2$}8x tDU9HB*(Z8_r03sSW4-vH7ss$S)b4H{wkM#CHupyx*)e2?T4F)+sBex`fb#$V literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuickWidgets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtQuickWidgets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..047a2b71f0a791bbdf8f9a5e3152cfe5b157eda7 GIT binary patch literal 387 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ9kC_<5z4#IJ8q?czeH1{*P;%$!p2l^K% z;^P0|(t^`Xf|FaJTPJf>q2IiGdGC?rljPYjwvf{MVRuw$2z^z>zx2OkajcRDL=nXt zh1kIuX$UZAPZ*(BHGk!*^^WdrI5nybP(%N&+6`Rp5K6sNwmb?6L=+;Qfw*dHmixWp zG7^$-4w;=x#)Tck@mScY%qn(S_q-d%!ShNZU{vj7VG?Ijl=UHtNT!Y{Ym`VLUeKa~ zEr%DUZbU*?W_bZonpzyd4=fqS+?_x)al35j3MRoyh(9JH5boL?j#l)QTfJhyD75Up z?B~oMUo$!aDeRvauhj4p}&er48Y);MQTQD;_A7*EU Q4(^Qm+sEB%WYypQ03QQ$umAu6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtRemoteObjects.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtRemoteObjects.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1851ea7339ea2bad0190c33f0683a2f36918e14 GIT binary patch literal 388 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ9kScIb0ZpXoqUY@Af@;H&LGzi`YMZm>3_-mP$dtDB8oW* zv4b(v5Ma=rFhZ|t{>oMB9o<=TDpc#Cn*Lq3Yq;1VlzORbcoY(dC`3L3ab8<5cDwmm zBqZS+GJ7N$7j_WGLt&>fE7?WW^R5{O&nt|8QMHqWNt{VhRQoI Q?cEvow~yQ9$jZs46951J literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtScxml.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtScxml.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7828a083f5ee9419684e8f71c52b58c164f0c1e GIT binary patch literal 380 zcmYk2ze@u#6vvZ0D~EWSf;b4b2p#TpupPA6QG_CuZs);~UY@kPB=wG0S zi~om93r;r)PHu&6oy=8*e)IC>y+@Kyl4sN0LQ3z4ok5`?^i>uA(*Kghu}U5gMHF)s zVHabhA;6$LVT4}Q{FSHHySlsK)~MD)b^W_)*KxT+DD^Yh^eLneQ-}iw;;Oz`?stpJ zSV+P-098Tq?p_LC;N5*CqjPYy-;noD5tj4F)m^h8MXzHAOIA>F|cW2+< LK5myomf!vZxQKDY literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSerialBus.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSerialBus.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42be6b719be7809a8554f8d83d495eebc6165a21 GIT binary patch literal 384 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ70Ttp~R>2@3(Y4hxb=6)r);%$!p2l^K% z;^P0|(t^`Xf|FaJTPJf>q2IiGdGC?rljPa5Hjvi)erH%12z^z>zs$d6eyEcNL=nXt zMcBg_83-^KPZ*(BJ%8ov^`7aic{OVEP{aJL+6`Q85lVwhwE_w$#1!HI19{b0FL%4e zWh@op9E6)I#-$r3$w<1H5*53w2f+>F5Co+aGOBm7C{2WtWxda0BJ?q3jS@xV3z}E3 zMR0NK$0YKV$P0+G%;5lo&{0Xk{V~L2zr*^zWD1;=3`S%K(qFm5!IHjor(5(Gg_e7* zdLS6#=ecy#Vo`5L3C%g2icQU{o-U8H%}k8(YzN`?1f8tLr`?>`&9`uBpMBV8Q?z$y N-QPZLS3^`E{{x^ua$^7h literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSerialPort.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSerialPort.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..938f9f09391d73e32534e474931d6093ddfc3ae4 GIT binary patch literal 385 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ9kC_<4+x8vYUn`bXH_bW+DZ*%lN(7!+t z7yl2J7MyMpoZJfCI+?2q{U&+5Jo4Tr?>$@A7Seh@Y!7k+p|A4tFZ0h?9BbzRQA9CE z5%w@f1_BJm6GrG&pI`a|LH{GdD5D^F4%{Q*^ezKkfR|uD^vdyY*qWX6WF~ Nx}QAmmP?eA{{bV;a^C;| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSpatialAudio.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSpatialAudio.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2a276e9ad6d541638a1c4e45f87405704e7140c GIT binary patch literal 387 zcmYk2F-yZh6vyupD@DwvAPzznp+lmB?Vv?*5}`pjz3^J>)Sp@#WgwHvtHB9sQHY6TP$h$+Ma2J))0UhZ~_ z%UCMHIb?3G7?*A+#7MfS$|`nQ4}u%UAqYw-%6k6`J z>Lo-m!q0QcgqswLdOH#{=Wv>BYGn0#d8BP-VvJ`y2)8HbWHmnR=EQEkg;V?N!#+y(Y`k121sG{-(<|S-# zeSYjkH1t$9$}vh)TOjrWTg9>P#u$ygHt%_oE3^~ZAJPFzZ{-dLOZw97PTu7Vo6eQ$ zrou_`MXeRaY$WhB+tj4;(eg;!%pio!c7U`daIzYoR%2o{-h!!h_F; IM^=9M55bUd0{{R3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtStateMachine.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtStateMachine.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93f71982b85d82bbbe94230e076d8f4552a7e723 GIT binary patch literal 387 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ8B6roC`+i`HDmuD|Dm-~^lc$=gDf&K-G zxcGm#wBU4;;N({5*2!E|=r=E4-g_kZBzd;14W#wH-x(AJLSI$!FY_;%AL`@*QA9CE zG4?P<1_BJm6GrG&&tLg^y=QuBUX2<()G)uRb_17Ngwh~Wt$;!bf`SMc$g9SBx!Wx+ zgj9rc$lZ}*T)I(`45gc?ykeL2Ah=;1f}pe_M)gh>r%A44S?@DJa(zr$qeKz;g60)$ z(LX=-1&Mu?j|vc3=5T;8a#WIVe+**mcUa$-Oo5Y+y(Y`k121sG{-(<|S-# zeSYjkH1t$9$}vh)TOjrWTg9>P#u$ygHt%_oE3^~ZAJPFzZ{-dLOZw97PTu7Vo6eQ$ zjt5SXFKVqYW+Q>8*`_9ykCsQ;W(FZ-wgaR!fs@tvv>Fqu@fJ+2vk&WR3VV0v{q5s+ JIkNK0e*nRia037U literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSvgWidgets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtSvgWidgets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40cc0b451dfb51307ecba5761bd7ba0d47cb21bf GIT binary patch literal 385 zcmYk2ze@u#6vvZ0D~EWSf;b4b2p#TpupPA6QG_Cu4#IJ8rp@y%H1{)U@is^Q1N{pW zaq<6fX~F3x!O5-At&_Q`&~IM8y!S}*N%Cx(8%XJWzY`Q1LSI$!Fa0l>AFAX5QA9CE z5q2>~8UhU36GrG&&0l$Hy{o%xZjEX^RM)?&b{&^ngi=3~O`k#vF@<=*KwQ+<%iV5q z9t%l0huj%S#)T6m$xt|%%qw~&b*6HJ1glEIJ!AiR}394zTex4T7;QD{1s zvNsN{7!5!QCoL96D@y2y!)d;$fYsZ@k+PYNF`n%p+?t@1)%dg;6RYtSPObKb)t;ig OJM;ebal0CM_47X@f^y*i literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtTest.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtTest.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75023b8678873f04eddd5292a9da4f7b871efa0f GIT binary patch literal 379 zcmYk2ze@u#6vtnBR*HC=f;b4b2p#TpupPAMC_<4+osNSeZJxc*+|Q)N+Z_E5^e<4v z#s9;l1*e+?C$~bkPUfmYzj^uc-XqB;$+Ky0fY$qddyrQEzRKcX#$Pf&)X4)dU_?Mj zTtc7%NU-um0ABU{m8aLchP&ogS)~hg+y(Y`k121sG{-(<|S<5 zo*#P=4Ly~Oa*Wc{7Kr`8R&gx6F-Bvr&3m5Y3hjjUhjf6_Te-u*lD>4ilXp48rgNpP zQ7R|N7qwOxvys5lY*VAkSIZ-9GlLK^+X2#=z{zTST8)X-cnhZ1*@tyDg}poT{`PUZ I99jA2KR)MhbN~PV literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtTextToSpeech.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtTextToSpeech.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b006fe60423d8e59b0eee55a450461f0d530be0 GIT binary patch literal 387 zcmYjNKT88K98K=56!A6%aS(11I^5}CJ802Sgd&x8Iu4Gs`PmE2{Y_eWo1@=AKY=1H zeh-%xoNf}F+zQ<~nN)?oB#)OLzr2^^*|N5f!uw%sP#6e(>CHdPKe0Gg;sH@aF-H;h zFh&Lf48{{i=vA#>_^RJCy$!EIjSi}r-@07GjhDkCMZYFb`T~>qOmT?Gz(h3<>Cs~vxxfEr!$6}Hzo3cWQB;o}vbl9?Y zdFsa`@?}0MAkH#}1N1{jCJFb)5Rd&9>-mC7a8lAAk^u;R?G8t)^c6epqQfXO+#A`2 ziR>nwR6Dt8v8*W+ z>|u-y1Q?7bjL@rIzwmXxXL>7Mg&G}HGr!An4Hp}P(jZlhfIAai(NZ?J_|!eN0iIL=pLdW@Xs? z`t;BjB=S`@%t557!vT7sqvDwRBM>9M#k#&^3Y>)W2BZ(tU%JEIB7MP5JMSV0pjPY~};pP|}EzeK8KDO&`;lw`quumpv=gzvn LecUWZR(|^rt~ha~ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebChannel.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebChannel.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29d1751b3c37ca80b8c44e3b2a7bab33f2ba7d29 GIT binary patch literal 385 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ8Ba1fzLrGs!BoN4pyh30ZUk``}s^gqzQ zKoJ-J50@64ZW5f_3f(%Hs|x+*<;#1IB%dVDmbHeo-gjI5+(787EdFKwC9{2hZ`!Fa+5z3TZZU$6H}Z^f%nql0SZciFDtVuMf`q^c26NI*~!JqGfkwpwhr z^K&5;;T$q|s2G=S7{>$YrYbAhMKuU+7>6JztdLQ?lSN6KDOpszOpr_;Q&cEXM82R| z37cP^9r}VqzRHFb%7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineCore.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineCore.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e87cbb4bc3a7a5f0c7a79bca1951b2ecc5b15033 GIT binary patch literal 887 zcmah{%}*0S6rb5{+oe!Yf&`SrimBLQw+V+vh~YvSHG+XOM%`?(Zo7{%u-$EErf4}K zCyw6aXgpvH|9~;^FYvN8J&-+-c;eQC8z*NM3-#oi%**e6{N{aRz9f?gB;@D4YO^4a%svo zInX;hq5SwZP)1zGPn24W zL#_CZa9=Tubz*~I_{j}oiOEPU=!E%7nK&j5#*A7fH<>?KaYg49F81&i$`Cdla+yDR z<+x;xT=_!&S9B(tK!bF;O%4JnV;1-3Z3GJArY&i~g?^Bu{iA zx4p=0H-?m{PW( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineQuick.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineQuick.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c3ac538815c8b8c4f88a545e465ec5e7a7076bc GIT binary patch literal 389 zcmYk2Jxjwt7{~7tD@DwvAPzznp+lmB?V!a@B0`at4nhcoYwoc*np|G)Qq1P)H_%U@ zh>PFDr3I%zpLpXYhFyWibC8O8=udfV@g3Jsyps`!`wmn;rda*rsY zI7AV4Fh&{z4B8_`=ta$6xoW+mJ8MpjY6H~Jzp8cvms^BVFO@BiLIRuu_Zf)G#(KHi zD=xT@Bn%<5bIC$s2XQbx$ z-IrG|JmVwAp`SB^}HeD;CZOucP_)I{LQ6H4F<7`=Nh7lceI8V0=+VTVPq;PW`V?5tOxH&~<>-uTdr)K>vn3=5) Svo%8pcgFqg<8CQw`TrjahIK0d literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebSockets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWebSockets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41ed1a5e5946360385bbc0d6d5c17242e3f31cb1 GIT binary patch literal 385 zcmYk2ze@u#6vvZ0D~EWSf;b4b2p#TpupPA6QG_Cu4#IJ8rk7_gH1{)U@is^Q1N{pW zaq<6fX~F3x!O5-At&_Q`&~IM8y!S}*N%Cx(8%XJWzcVN_gubfcU;1A%KUB#BqKIOS zBJ5&}Gz1v5Cydamn!obYdRKSX+#1z-sIGrk?K&>E2&H}|n?8jUVhVA5Z=li4wm$#+ufqaC^Vf* zc?JDm5)45KCoL96D@y2y!)d;$fYsZ@k+PYNF`n%p+?t@1)%dg;6RYtSPObKb)t;ig OJM;ebal0CM_47X;xN_70 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWidgets.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtWidgets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80d4ab8d52f7c39e736891370b7663f94f488495 GIT binary patch literal 382 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ9kC_<4+2jMt5(&pI<&E=rUhkRSnpdGl7uC$~vR%W)7NImqRU@E~fS@4y4CF;^z1Z#K z=RzvNIb`lgF)rOOj)&4sRaUZ#Y7pEo4na^@A)|UHi;_4~vZ(f$Aela`HaImB=-Rb0AMxo(e zsw+kZpro7Ri)u59>4?K=wyA05!{w2-nTau;?I7Hopp(`3wCfYQ{uWN{)`#7iqP;uo M{`PUZ99jA8Kd}gLt^fc4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtXml.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.QtXml.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be89fee396f9f1be57a425c0f13233fdebb40e26 GIT binary patch literal 378 zcmYk2ze@u#6vvZ0D@D9bK^%lzgbsH)*bZ9kC_<4+7d;M+w0ZVIbGaW$i?=!YALw78 zh>QP+OAAgn2~KW>Zk^0kg?{t$<-JFePm*WL+CWxIOQyg{NPkEMApMm)94zTecRG2OQE0fA z>MG)Hk}s;wD5fJ0r`e_^m5-K3+GZxkc(#LZbAnD*u>}B literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-PySide6.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9449e9e563956ea19a5465eee9397258fe8b5012 GIT binary patch literal 756 zcmZuuF>ljA6n+=Gv5OR?KnrOXT97J5bqoWfsD!S7R8XaEQH16A9?3QK*}1z!q*K|L zSy&i46`}qV7DviZd1YdY)U6AgOClAi@9v(y_wIe~-o5v|RJsLPes1n{{+Iy2a$_#W z3|xHC;44s|B!q}G3CVFGEJQ}rh|H!*pa5u6GMwrpmDe`w?1vs1zPMBnnfK; zsP%uWC}NS?9dc9xxQZ|itvT~lgR{8-O`Dnrke}+}@7!A@+3lc^Iq_Y#D7&m3 z_mI~!i*cD?ppKSix9htv*X!<6_sP-P%;U;IlEgx}6cd4guaH(3v-|s_H(V+|3{kiP z#X{+JrN~*7zaz7IL9EjT%EOOJ`1wzK z!BA%Q9Q}X`&4q=(o+jXv literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-_pyi_rth_utils.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-_pyi_rth_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3ce140100968c456d64b57c8ab1cad0d1691e6c GIT binary patch literal 378 zcmZ8dze~eF6n>Y6T9nYC6g%lAbck)$NyJeRiVAKe5Mu5~&t7ur-9=47=-~h0pP>FN zE_Eweo!kQ5I(b(Vir@QjJl^-dcf41}*#wP`y?*p&0eqR_54v7qaipIYziT$QrS*6`_d(x`Qh>V4`h*8$ufu)sV+&pe9W}&8aWc(9aZQa^HWT$>G6e z+b*`Q^NU2PfH5M3(JkuaF=QDgn8qm=N)}Zr4gVb$Ms+zjKlYL!_LRtSl8nbLBP1NU zigV`OljPp((_2qcMcgz9M?plSx3;4*_{-?H;Nm7&^lc5ttwb&!mqpH)UZG4WT50CJQ{c^~e9WLF^`5P*I z%+=5s(2`u0wWQ$szT>;n6hR9w_Tt2j+@>vgr$?i9 z+hmk_4O7N3v%56v+LhqW7J;N@%k@IHPKABlyNrZ%8Ke9_sfi3tM}|QpDYsg^L|5~? zfDRkj#4f@Ur0cL^{OFtC`sT~SXlwsVH%GcToaGodfhu5o!NBUsfC($JvG5(yB&#aZ veh02TiRTd}`O{|XcNjh61`btm;t(O#2q9?+$ng-47BgL4BUTE_kZJw{9$k5Y literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-babel.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-babel.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50fcb620ef2a824b8f6b3ce209bf7afcd1146ed7 GIT binary patch literal 426 zcmYjNK}*9h82!?&(m4z2MbYCx=%Le-0}=5i!VtyVD2%j;TUpv}Njq3i`xkofm=xY@>YFj~SzW(jz#*y@!BNksBWND6?x>qdc_a z6&2ZbC0OiZM%C+VtE!Ax$}!8VN=0etQ7&%mTE2HXy^chJr2%iHNx(#F5XVEoRrcIa zJw$E|0zzmMgrk@z;vE($*z)e`%#Cp9COnyeP^ny2}gZdb8DXGvALd8Cy_8d;vXR!hG!?}6z)c!J? V-)3`W6sEDG6|kb2r3SCdCVy0oeM$fT literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-difflib.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-difflib.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09ba0c42a257463667abc04faa66ed2039c09262 GIT binary patch literal 224 zcmZ3^%ge<81gF(}(jA!?7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfoYmPsvX%Ni8n% z(`3BGpIVWeQ<{>Rl9^kOUsO`OlHoH*=dWOQtC+mR+?bN0(#q7l!b07g)YRk*-IDzL zoS3rIys{Xd%%qs&%#u{yg2d$P#PrnSn1D*pyyB9?oSf7m{fzwl>|!vfo06H9mXn#J vS5Wzj!zMRBr8Fniu819I2gr%VLO|jJGb1D82Pp;-*$LVW{2*Aw3KRwaRzg4k literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.command.check.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.command.check.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ed3cb184341dfe9049709f5ae57915573f8832a GIT binary patch literal 241 zcmZ3^%ge<81gF(}(&LyI7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfoa6NXbtwEy>I& z_S0m%#h+S{oKu>Tnv$7YkY7|%yprKFNb9d;cdMAZ#N3#YqSDILyuw1=oYd6h4Be9a z{G6Dw)V#77pUk9~;>?m%-GapA?8Nlc;+TL+&%EN2#GIVeBK?f~{On>dshg5nTmrUE zFF8LqH!&|oFF7MMIa{xw@)w6qZhlH>PO4oIJJ3#$n~Q~j#0O?ZM#c|P3?gz9bQ<_U Ju!t2X3;>hlM(+Rs literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-distutils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0f9cc9565afb5317ef56fed5a3636e68bbfd1b5 GIT binary patch literal 687 zcmYjM&ubGw6n?X_NxHSM+M3jZAgNMFVK>LNp;V+w5gHN1L&HMYWT%^HHoNJ}ByD=i z*^?)|iU+m$5BNWL*+>pyPlBi37J3OiIh(p|9&aA+$M?SX&9`iJ9;E$R+jmF?;BQUI8arzxTCnZiix5C!AA)mzDoR$gasUQmIaCT?mPjKdI}69 zH~>#Qfm3_{Cy1bsL%&#DF3S7da8#j_`e# z*Qj^szb+~l+wras>)!GUl^Tvw9YFt-4FX zOph>5eeWDDB{^KZ+bf%L#}usFC*JX~?h?{y>hX8X9`SnSKCPRa3Zi$cM$2*tH)n*G zrjn;ozxkZe>0ixlw|%?ok{z}vuORvOcNrp#5Q-iGdKSRWtpB;UG{{B^X{3$S2SMUv z^?s1w_&`VbjbVOkl-~++<)K<0R0fsFIFpM2BW)(6A*BsoL>bwgOeWD1sLLb#C<25^ xpC6A3n?Lt{7j}cf?vz#!a>h_KVy;0Y)>WDUTnv$7YkY7|%yprKF$cSH2?p85*iMcT)MWvOgd4+|# zIjO118M-C;`8hFVsd;5FKAA}|#hE3kx&?{J*@@|?#W4Yuo_WP3i8(o`Mfw@}`Ps!_ zQa2^DxTLfsGpAS&MCuh({^GF7%}*)KNwq6t16l=gakXi#j J2o|vb#Q`l%MrQy3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.contrib.sessions.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.contrib.sessions.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..801b167afe8a7f2288b409a1173dfe1190c83d17 GIT binary patch literal 376 zcmZ`!Jxjzu5S>i~KOhinv=jv~MPjEQV&{o)h+uaFB*`wxdYj$5oy|eCxqsn5P{f~N zbAr`Xf|cFDbyvB$Q@F-AGmn{K=Dm6LybZ8;+i&L&4!~D4{K5TgrU$lp1PYW0C`pG9 zaDWl&JQ09bTMKj?>fS)G^4*L98E!tkP1^N-(_Np?8VQRg@`dG*2UBh+IjG z(j@CLN%1Oh$6MF+r9_k1Z5>sH3ycb-x~LmNW3S+pGRe!H(gt5(+Q`kai<4L;Wo&d+ zGuiKlg0ZX!jZz{WFgb|ZJdKeX7WS-Ck~55#R1W9&=N$g$uvgF4P8WZi>2<5wJdTm2 iiAxBXYy&wS!O?Pl`nw~Wd*|%(siy(aXkUHJibZ*blK literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.cache.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.cache.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91140856785a4f9925921cb65a7feec6b48a8c83 GIT binary patch literal 364 zcmZ3^%ge<81gF(}(o2~b7#@Q-Fu)9DeAWOmrZc24q%h_%w literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.mail.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.core.mail.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..273b78c13f93785c8ebe45b060e9b0b1ba8ddcc1 GIT binary patch literal 766 zcmZWn&5G1O5bn(WNnmhY#B(1+9GFB9ye#5X76uU%ge5R^(ltpro$hRRXX4Dsw-B#h z#Aoph_Ua1^>}^k0XRgW3^^?f{!8J(X`W@U27*st)oJEOt5IV0x_lkAd} zOh(_L%SevivB`n>8Zj2jk3yFwEsTY<7N~gZ!0|>{&&`7S3OMv|BZ{RcA&uV?)L4@% zs5!cG-c_I}33bVBs~y-CSl*$pxM)39RYpi&8wu0Cny)Mn;49&IQ9-eEd|@oPL<1yW zprZEPVp)QvPpu^iHpaR!*1Ntg>i=m?c@Bjj>UX4PVza*JlZXvv>_j}J2pOKw(-(c) zoK$tfN?w?{5gv0?=+~1p{s5tg<{Bu$8?Hqi5JMeEOB+ZE$19YQf(CX|ZUWg3DTvh3 zG(7fM^!zi5VE`Q})pu0_b-bGw=@tb9PH8+j+MM;I)0&E;H8@A(-<Q;FSKl86d(MmLLCZp?<`COV}KEEFClng?Cu$!BZ_maLVfBR_NBrORLbu@7{aIZ+YK$_iUOa(0V`Y_-_WlR|bF5ywvJI@tvWC(yGTPC7!yGQ9tB3qC{FoT4;A;HQ+2Q zg{~S=u4vFt3u+iJMa2C+zIB<;>mC=R9=go+Nl2K|9BRVy%F3s^-MG!9a`kdik5oWq zeZcupiY#|pCU+i_KPnt&*ClmmnRN$Lq~}yCTu*mDIwm#R-993 zLfFLV1bs&air6F98|oO+S+hM_8ZM{(PvTL$D4wpKeJ)IGnf;SI(_>~Jgl2nynh7-4 kYgUAvW>RhFnwDpquw6?k2TASXqtg1Uw5Dcu#FpOh1FB<+1ONa4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-django.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a241fb04172faa8f1ca843c59b21e1e4a71792a4 GIT binary patch literal 3748 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 a6i(Lj)8C)kJm|jry$`?l;I*MPE#(ISoNWXE literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-encodings.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-encodings.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4612c26e65fed323f4958c80af745af04c5b274 GIT binary patch literal 338 zcmZ3^%ge<81gF(}(o>ii7#@Q-Fu)9DeAWOmrZc24q%h_%~gtXgqN6 z&?7gmJynhU13Y^7vQ0dYJvH&<4TC36z5z^{_-5xf^FH>y-+S{hn_UHz?+*`JQyt)^ zQvOL|d6~BH@&PDN;(|vE;%SCPfNE54X@;%=BQ!?i?|~-hN{gH)&td>ya4*EfyhhB3 z8wnP}SPf%S=c{KL#^7GaaaP69^lK<&ekoHyi_&)By3Cdh%XOoy9drf_k4cMK(wbds zu^#hfNircFzctHT(M6P4Xf|19SBENvL}0psfX$G1&?6n4YU;$YdX2}?!&TFtp+KUT zZ+T3p6nAH@o=EbA{UYHZ>S_Lbty?sDPu zSgo)UZC~M8>Pp8Ir8!%!X2sPTMr+Fy)bTn2mm-SKb4AIf<6GQOMcNLf%wPI>O8trt z3OtQ~jV|a_x#~|1RP+!gIw53o6UdVgs{enNn-5Ow;YMY+c6o32^!7NG8E-Yht;YDq zt?_1Vv^z<~?`yvS;g5m~xHF6o`=i`s9Z2FNcaj_RKUKn1`65;Rfe2-ErxiKY0rIo39 zg@w8~sj0~sx+VGfIWc9ad1Wy^nMpClnI);Z1&PVoiRr1uF#(mHdBr7(IXS6C`WgB8 z*~MT|7ie2Sk#j*nyMY%3i&%g% E0N#2-VE_OC literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Adw.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Adw.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e2c50512386b5362d60e3235a56a1d4faded6e0 GIT binary patch literal 520 zcmYjMF;81D5Vqe-N+`_}0|UxP^&(}+Ypa$8AtVNrAknH)x2H!VC%z^w&hx`|g5Ji+ z$Oa=52=Nd47rHbkQjw=how`M0W5P~I#o2ehJKuNr-Br2#5?T3K-Ru7F5c=zaxfGt9 zdv2XGL=nXt^>K_b@(^I^QUB6nZmiBE_Q3n@&m&m@?_%C#o}9jy*53TjBo+}D;}`J) zEqp;vYsG)=w}#ED2Ky-JfWvP3O&EWh9vS@ZQ>|nwpYz>RX~H?kXrLKaQBQ~i6?K_( z49rr0ifb_kTqHxnIB9b*D;;4m9o^D-2As89lxSi~ZI%+rK$)V8l_~carI50ICZtx^ z=-v@}*l%nkDd{I#4su8j59=JD)2nMCcrt`^nC!83qL_wyMmh(i3o3cW^Uaju)YiK! zl8^~oD`Xzoy`n6CC~eM2Z^>ml4O>-Tt(o{3CEoFJ6y=>Nuz# uFWvdU*k7F>jGOo_eEU1xxea$lVPhONMuoNG<_VncyW=`G@vKe;cElsehLe8) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.AppIndicator3.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.AppIndicator3.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60afa9bfb2fefdfe855228b5a500d83ba346b111 GIT binary patch literal 542 zcmY*Uzi$&U6t?dY8d@$a9jc6#4k<&9(lS*D#1JKsT2zVcbPze`$Hmk+Uu`GSF?H<7 z1|w5{sQ*V77E(oObyKBIY>~Qk!cGV(&wkJEJ-_$8@11zwGBWb>*-modAarYkg_Qm} zcicGN5JePoG{7Oo$U%UqL)~N3b8d7lp##omcM-`NI6oE`i{$J*Hun5qCNdpiIeZi@ z(b9WlwO;;hf9tq-(qg-U4motvPonVNW?3htEGAmWtuO9I@Zw#)Qq=bHPO3EF9Aq%m zjH{q8#J&m=CM}y{WiZ3&G7IvUj0oeT$Dvq_h3ScPSLYdU*6UKDNm1#slt>1uDBD;S zUY}74DH~)$YITP0EV=unwH>8o5NSEgAw4)~aDceq&_eKN1nDT+VZBH(4ULS%`y>Gs zJ>dC##&BjE2@51-!qf_x2mkFDWchvN)tvro`P9tCM%71SrY^>Kx`yz}Uuf&$y{XoY z`1d!b&2e>eQr$dUxpu1)cWsI=ZsTiz> F;t%leo09+l literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Atk.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Atk.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2007ae576ed0a2ffbf8cb2deab79de17154ed6ea GIT binary patch literal 1129 zcmZ`%K}#D!6rS0gO_Rn{D<#HKi_}I8m{e&`AryL$Xlte5EkweaUDq+2-MBlkL^hB^ z51xuQy)~z_B^UokFIh=3EEI&EdJ9M|p895Mg01ai=IwiL-oE#}`Q~FJavOnsnO)T~ z1flQT8HjLYT+D%SgcPJ;9hGqoV{Qw&P!@AyndAug;yaX+6ta#I(hvSy0(+yH$_m@2 zSt=AwV~c7D!5hia*QQd{)fHpQ^d^g@uB$~>&~&<4V3usyy3D9)*hPHRntvqNBJ7J8 zM2`@=cBWuOXaUUj04l0u2k#6sY(YWm$idCwIWIVn78vb;gYwX$F4V<3VYh}s^E zpF`dwP6k|iV9gU>u+qM`m|E}zjd~$nHngg&skSG{thBh02wK1}@aOYQT&+gjc{|58nQ*9VwiihTrn+XCjws3r&+F0FI@KdEl^Hy zaF{Rg!nPOLri!8(S3mxSSkS4>Y(D<9FP9tHbl#B5d1h5>sfrKr)2VY&LuNlGSeY5JrZjycS-Cx*&%bobpa638eH?lwK-E&Ms+*oPwO-0 z-T%*NN~1pUKBfNPpOF=Vl2#PdWia!bvgg(VaQUOOUxMn37~_5n;b$H6^!n2azT9AMB^_{RiDQ|s>}SLfLH5(MB`8aXk!tIszY%V}tCjNV`>Z9j zA)JE>2ZnJS_M|-3VV5aKDqrePq1w!0JtsrLIO%Z6R}yJ^64N$W3Y>M?)K1Au9VUok zp!1@ObzbflGlApO{=K?dUNtj+sz$- z^!}<;FZk`t&984pmF;n5`+VunuZ;cG3BtIE?}Ck=!NHHSb>6&yPe<-J M$R?iEsj{8%2Mw&d_O&oaV5we9}6FpI@_+A-3?OPL|Dxe^2R{ AssI20 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Clutter.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Clutter.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cec10228e40cf4e246b8dfe15a725a6eddb50ebf GIT binary patch literal 530 zcmYjMze{655Z-++IpdGS#zImGPY9T&$6cd{jYuM>2zHNm7dF|sWY5jp=k6x(tSl|< zw6s#hf5P6zNI-d&U}YDuv%1~H9M0~{&dkm?^UZZWKZT6kFYYw&9E4tNFqX`x^UjTP zjwqs-qc#pOMh*f@9qL{g%&pOp1P(ZV-Eky~;9QP-jFZFn%Glfgnb07DZ163ZpqT?? zwUm9cza^Z`RM@Vd9S+;kACXRM@{ZOZkKOP7%3dj#7Wb3wNNK`3NWY^QSAI)~L*+M_ zv^>)3_7GiT7CuS3gmF^mkj^!P!8CMDCoynVuTi2&nya&jNCqm++E}Ie7NZm*){ceL z>IS`AS|6mc7Dl8UYS~F3Iyx$IfJUpVh2UWqqHegu>Y-v9$}wpik|wC|3(w^t!=WuV znJ*z0rdG(r|J=@xlaJi`i1>z_H50K>_1l<%i!mO|BmDCL{rGxc3dK`?v3d!;!cxDm wbTa+y7W(e|0AXCk&)&+DxAo|4^}I^otMoDpC)HCp`(=;qSjD3{nKvW;0iI%)YXATM literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.DBus.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.DBus.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6f95abb66b4b4ad0de99be8c15e4c1e6ac19653 GIT binary patch literal 524 zcmYjMF;5#Y6t?e@5()_m1Ik$GD&3GPh_*w87!W8y0))hNx)M3@BXM!ghwVfp8sV{|N`1I{mZ63H?+my;fo(CX#{5@-|jkvCSxjm~|2% zwfc>oEvJ|L>W?TUok+`W3h~iVg#$F(6)gmhdJy-bE!Kz>(@;rB^N_SaMelfi88IB$ zN{a;&5@BkEOar@Gkfbk#l`-p8IcLUUqiWxnp^GsdE+G8%9xcDWPo?rHzxaOntzYs7 xCI4jR(Jc+!g(1SYh9AAfKic0V+$N`j@${7MR0yjI3~%_d2Qm|dnPm$K{l8PW@+XC zSubV(+Sd|J7b|Q}&@P8sbSMm}?L#aS(?TYv?uNhiwUkSX-;!FSG~pbi-_?vOzb(YE z@>@(=G3i2QL{Vp!V~+F)zpy?i wte-7BxrKqdJVY2*@sqdq=T#Oo-JyMA{VWENkN6YSr!dBzk?Ln#Idmz%Mevl5iO*tW|6thpH8GUz>)tl zM5;Oj*2tQ~NbC`@9{1}7b;f2Y0}qpxz%yVot-(6ouun%sIPNPTN6x6Tb*>IA|G)@r z(j5sNk+ox*gGY6r%~^rI21ti&-*^`LVX_xTyn-WMyyX8sFDo?kF}}BM4Yi8Ums=yJ z^=*LG6x&jHnDUwD}{_x8p(Yz5>r9G zM72~CO9Wj!#oObheSyv?>fkqvWw|Pv`_YoAi?7tw!&F&TblG^AmS4+POgcGbP_W^E zxGN$>EGROL_AzSh=`sbdBwC^YiI+i9V(^qvWMEb^G1Nt?jA2DXDxRPZgG5Nkz_6rf z1tsZ-cugY2PF*reKZ*p zhs#KkWc50**8_60X<dGdm^))50}feYf^`P8F*;%c$+i>dTiYMV5=@l%;7( zZdX=!bDOA;Gm#~ybg}q?_A|G=x1pMrNZzvX2~EuOc&dcbhOBGES2Om~^fuD^9){Gz zh?66uwv#VES)7*PZO(7V$Dsg zIq+U%{Xl;6{2v}nFSLX|?w4?0;9YpJ_4*{{gjd|~iUU^~t6d)WCf(8auDR}n5^gBb_QnMaoxzz?IP<3F zz&RJrwc%Wc+G3|L)_mZ=xC`TL81KN@#<~k#ldRBSF_8>ZmbX}C#Wtf9V%AB7)anww zSXr+mScziNiL~sd5by6-IY6^r)k5&72XQajWQ|BM4b_A+_ecv=^hxKBk-|}|wwNy= z5vEqi)PMh-pQNva)v@q3Icp|jDTkm_pzzh1h?}xP`INr6(cC6uXoh+IWZ#mGH00000 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GObject.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GObject.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15c136fa8110782b47c81577f580c5761c0cfa65 GIT binary patch literal 721 zcmZ`$zi-n(6uyg{*hxrG5kE>7Dx@GHYExPj2~@FFp;CcLY?e{v*bnELvz?rsNY2zT zY;4VhIt8KrDJ%(!MC7Rw6Pu-Ooj5xQ3IosYo!@uw(|h0DeJzy=h}-u^NA@QHpS;)c^IatFu$ul(L2%3OV27zD+mN?2Fbire8nh4@ac8S;%5YKZ$0+oQ?Y>&dOWTd$f$I{5zpkakOSO!EDtTbh?Cr z18%@KZ`8;e&+1Y*bU%8LRD0Jr0W;_eJL-1-)^WJNoBNx)>dv0}tY5T=TDQHF^|o4w z?j47Rt{)hb0#myIp}yMmyq3?nToi5mr>fe7C3hGVopgAeB-8Uo&mh!jP>61u9`9%d z^&o5mC5^ge1V$t`h-)wcew0nHAC;QKvcM%y+hc+M4P7Niy*6qub=Pq8fOSJ~I~|1r zm`x?{JgWD=?deCPq5C8NrEQok!v790>(JLi}3R?+FSJ*+8zJvm*tHC9lkh+NqK8p-a0MLgz{8akCBM0v�* z%E6Dy!K6}~R%#RR;pyuEeEx7Lt&h3iS0<7=mDCvFY;`8z87jjE6Z!F=lzefXH%Pn0 MIbKdV>?YUt2X|)8fdBvi literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gdk.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gdk.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..661b82cf670e63a307338e70dd4e2d560a40a71e GIT binary patch literal 1276 zcmZ`&&uiOO9DkCYWOqrHRc#fwG^JanP(!U1TH3LNom!mI9~<-*T#VxPs=P*)97zt? z$l${cK8@U(qfco^F8x1xv5X+9PJyvQZ-y`!J?;Ax+jTnn<>~vrKR)k$e?7fkSojJ7 zy<2^3?Z^oI#gz$(W8vg`5MCjIh+w0-uptOs7HzREZAc(XzoQLI@H14DKky?(A)PO? zCoXB)^r7>@1%1(?L3PV@x2rYRdBLojFut2_5En`Coe;3TLcxqLgqTD;0Pi73WYiHt z!81akKZBe25M*-z_QR>KBZi`{eG!d`d;oPGPHIIR(GiK<5d)spn1~dLpP{5sdO6L= z7YTZXLaC1@Cua8pP!6Yt3Y_ZTj@(f~g(xIviR}fjC?V?4M4ZA=D4(rIK!8*}`9Db^ z{v0U+_GNB@2$eq&pB&67|1=dX)?Tb(rx2bd){J3)ne6} z$vn4x0W^;`T%QH5*D^9=G4Ju3Qwiql@qVP|%w3b&=B7>4i#6A_X)UM*tp>H(W|f$M z2>?Pe$xr9GxXB#TW7JRQxW?)Y*9-h&F3o4p#cZ&2oMv^JW^OE{bEgGV8N9MIKfOuj zf&6q~ixEPd@s&Pr#Pw79_`Lj6#WCxZz-zXsv$IpODXndl0@t-GyVTjOJZ75}D3q2O zW^LQFs9*W5_0aJH6Dsn4;Hmi;FP&`)^v`ItQp^F~5(NAPKL0(iF8W77ORN2@w|H>3 z9BJ#Zw%+|U$!Q}b%Y{V!_DI!-s@|uOdNWpU_HxN0xP)^*CYpYv6^B~!jsEshq}_|P zd%g0%$Ldlq_qTd&zuC7U)reK2`zV>y;<@W^NM20xU-y(_{nnBGV5mQc^m441Bm7-= zy+`++C;0rHGg$q3aA_^VYuzWuc>V}$L#*vJBfK2rV z3*Ge?7xqg7d}F#!pg8ojD5qCuI%G5hX8T6gC&OZ=Ph;r|fb0on-TD)G1-Q-AfPKub rolf@`?<%PLhxYFS8%cs7j0#A&GeEazS8`Sb*GRc26i4X)EQ|6Vz>r7R literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GdkPixbuf.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GdkPixbuf.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..710cb044bdcf30e043b4d65a3047d14191b787fd GIT binary patch literal 6096 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 bB;c{50`?ywKzJ%3PV6Is>*#f09LIkF&vsnF literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gio.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gio.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ad12ac2a13de16b91764fc27dff56953c3b604d GIT binary patch literal 2549 zcmbVNTTI(#6#kw2#koMkB_XBZ5?b1lbVXAq+OlzJ854ujPTl0Cvz+)RICbpQPM{#I z;$f2_gaoQ85miXdL&cbQ;c+jM_P!SzSt7Fb5NS_)^VGLK?RUV`VHZ_%{>wSX=lth8 z-+$!%;PZI^dVU?4$qpgucU>_a$BFP}+y=llpaG4sfH>YU0z0numI@Dxs3y%XBPutAI;;3@S^uF+D6-VEy#}Mi5-V{&Sz*_nD86KtA0Z_ z@4HCZKQ*MR01yEpNVFjT)>E@dX!a-0(HIee)?Az6B6LG6*KTOl4ns2U@Eq-+owREg zv9gcm@k4~TpWioj7vbDT^CYsfDK2c-%{%ODW=_1-6!XtG&6PyVrx`M;yz5l%%vzdr z&~ClXGgbZ%tU~lXuy)d(Gd&RE+Mu@@HSn2t+S`m212809LA?ZWr*1IR>@x`-g^BYp zQ0+c-F$wTIjW3+39|Iea|G?mDJ|AH)^^y2J?WY4-3vq!CqUvKtswE)wzzfwLLpSd< zFniL$ca6}@49au?Rr8SOeGguH=@z>6OuzLt#l1^o0t5S+s}mwH_%F=$(dYio9Qq1i z55UF)eKqD_=np-^>>#E(GJL*36_JEbF`x5viG|bL0na$~&2 z(JaGdn;aRjaf(Pv z>icSPikuw#VvL-ezW+eA<(WKk(APwU$}A$e;g{4cgZ-*4%kpW}!i%c+-pVv57Acm6 zf}np6)PTv7VEHVn7%fh;WD#sNVt!pJGOU$tAr`{S;!u(2+0+sWPt7ptl*km} zP=U%krm|2>ndnY7h;FPyStcRC0*`!oVI_f@E>T!{>$-JZ{HX8&%BKItiJRyTO|xPc zrgZ`gU-Rm}8gQ>Qes$0-HIEwTk(x&h3`@lYPa$WcNl6mgMeHrF*nISDvfmt(&v!vr^Z%j87=|goIDjo$VTM*zaStmdIA< zMY!^@+;T-}xuOBgeXX&S$7*eMX~8&mD1SMluk{ND5X-uvEFz5X535T&Oru4&A1BsLL8}} z$D}1vEDUDw4zu`oWJDMz35ViCR~SrJcXXZsXGw<=O^RB=QX(0sqH1GR)ccH5NZBA0 zQmbq9YSBzi%LsqIN9(WeQ=@st&o?fH9__VILe<^o2C8%FZusjzDut|kknYAx6V5^UJ)Ea?-*NrOYS)D#BO)ODREz*(bCi6&X0!D1pAs4Q<|l@;5JQixeM5mKu= z^lmAA90i+EOuCVly%ge;lPU*jwyRnQ9`zyaM|-RhDW;*CkY(AcKleaVQf}s}-aw})GbGSIN$9AmYNu4a35q|*~^^=+a literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gst.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gst.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac6ec9a7c751da101655bec1e8891e5d1262136a GIT binary patch literal 4237 zcmbtXU2GHC6~6Ohd+hNKNx=DYkl8qZtvEnIEP{w#QCJLQQv^If2(lc{#F^~a6Yfla zM0Vw^s4xh1skAMr+Lipof_PXSd2HzmQeQmLpjabCLh4iByrPv5Pd#@gHZum)hfc<4 z&b{~Cd(S=ReCMA07zzatJpb4|RrqZPp?{J_`(d`2H-7}?Arg>4$!LarX_+e0Gjx%e zVJN$wEqZ3W7SG7OA~(ZXJS+Q)ftf&&pW%zanIMH|BzhNNANvu*k0^wm!q0wYA|kiA zt=$qlx6vbLJZ*QNnI6G=8_o0zKA?R9brB`Gf05DYByC0tqLy7yly9*@7(1Wz~fo z7PDlMY7V+aG@L7`u!N+P)O<%lU|9GO!@U`YV}a2q0m-Ohf2j&prs}j)yv+-=z&wJH zr=3wSASJLeQ)DYNh01i@)0TC91>`m%kzDk)CF;I5=lr^jT4BmeopX-2dBNjeyTX>) zy1zZ@{C2JADWgRztcXmVcS^STa@X46O7Ao#hc}tis`idKFtI;LVX}%D%qv(FWw9uh zG&LDCX+<^Zf@DUpczsy{2i*{{3XU*C1!)3{ONuIK3SO}%vrw?m<)u8 z$Sb3#LzyFli>em_#cM6JjaDV6gx~Fcn9kQzf>J zThF^|r;pCUq*)CwuZX4V*VD2n<`>eMqR6v1#L|t~DQRvNbQ9A{x%@Y|f~d}(UpZ4! zwH$;T-bZ3rwP@OPjtQ{G#L|knJxdfVsM?m|S)wT(hW!VLBHsh4qStJwdWQTp-!t9~ zHoDG6A1tqlI-4-qM1xH<*e?kLmnQgWpLyLiaznWDen!afzc!VoYCOo3X3_yV5M98eWlH}EVOMsq-~j0BJ1eFSSg zC3;&=#UuDmqH8-UURccmy0RC*=1ML0diSG#q;+yJ>dLhhU+K^&(uj+;o&>^sDxB8I z&j4+QMr|pC1g^}v_ak>f#dn2J?$=z2v%fc~o9GsE1>K~|K3vvzykB9lqkY-uwnW9( zWd*+wa9iOX|A7SGB@wvGe;X8nx6xhxWY?+h@pl6-7J{+B2V(&t4EEhq@t5gZpvKSB zLgY4A_SJ*$HGj{Q{cg>>SF?OT-``tCb%zfe^BMPiNbIQY@PW=p34bD zY<0W4Qx!k#Ehx%IWS0x_inY;aM4$9mIY`1nTvOtL2tY1MB{AMnC~of>CrR&Ud`va{ zogp*QzUj9#Gb8Q$eyhU;c5;uB%~Pv7soi11FB@PxAR z%M;q9C-$4Hm6OP|6}OYpyTGIj7foI%E*)PTASr!fQdaUgSv?L+d*nRXeix7`Y7Aen z-{+TJ#eVVZkRCf?#Ex`&Kg?DCpZa(&?23~>REO4>nBvpwULbSQgpkacWLEtoKc^-H zSzhJ0*cGUkRyn(&DlUVQ%w`$<5-@+Dw@jYsHu+uVF6~C@PkmY^yCKN0Zl?%no(9K^ zL0rQf0Say1i)xa_qzW?`2<9YzCJkl8a+$nGKwtcr@ zavz!g+zkLkZcY}>?d{rATUioGVJhUb942`cK`;i%X;|HNCP@D2Ukf z-OS;VR4SN0f*qJ`vgb*S!xm&^4t5a)YdO^n5_V21<*)?xE>BugaY?~e(ZyM%b#6&A z`Jz=WXC+cEa~*jP(MdH!3z8s+rLBo}_Q+bMW|y#1=v?MR7n2fAo*V}n*3Es8oZ}D> zmE=^bs4mfR?oC(Z;!Wye4a^*)Yw)S`NOYzQjZTk8`OJ_89m2z z?pV!J^R&FIXLvK3(xc->biBsb__v$<_7LsOfXASObgFD-d z4iWM8-&=TE9+*bH9OC*~sMm9q+Ki5TFV~Oh(S1gAUyTP{2lmu&JsWNu|CQc<-snGH z3vTxB?&^VK1_v7aXw%9&f1QO)qYqy&hA-5nntcDq2U-CXI|<=U`$>=!T07Sa!b!TL z-r4h#-^g5E&s=U?5%i2`WJG)LXKT{GEed=H*2>f}#Q33hnX0oR20PMVN1AMKgB@IF z2iNxM?5M$xHrUZ7J5bFS?7&*O!S3z6>Hx&U-wuaQc+d+^;KX6(MP%f}0p`U45AezD z_$UmU{f=sTVp)@9b;7E-Z46l{BjOYR{Fn?OK7u5IAl@;INg_6f96io8Ckm2Ub!!3zI(+@uY?uqFOr<6{&{F-)l70_}JS-yBhAdiQ*0S+e8bEPrtAIL$!XxKeTp4_a_X0qUr_5 m(E)?%ZP9*eR|^68nL%`4r)Pko#=!Ay!X2cNE%YI=4*6fezw6t?e@Hc&1s9jc5-hm;{lDV-3a>JVKj6;z4sbZz9E9~V>Se6^iO*QsO2 zZtciaK>Z&qEDef8brTX3TcmECuoHsHv)}W3&+mQjd!Ib-Au{sq>2CVfLFkta7E<}^ z+;ZcbBZ?^IXn-S(k%ItJhq{-h=gR0@A_trg?jn*6a6T?D7RlLrY3$X%Ol&%$YP1wB z)5<$!wORdbf19{`6tXvh4ms>(??vf_N^f&65~77v$L{lB{cW>WHuj30OliV7$Y7`$ zS3zHhLlvYwXrI_ zKBE*eHpqq4>I=HHgtmUwP?C7Y)0g`@83&G|v~rRhk`z>Y zkLR-)!1^URR_jQU5xQ`4dKme^y2>gS#O;3 zi>=S?aeZS_-#A&haqAOzZHh4N;2VGahu{A0x5s`s@xyWD$w}uF&i3uGh#fqylb#vz E2a2qmH2?qr literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstApp.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstApp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a36fff164cfb4c336d7d5510be32e01622cfd3b0 GIT binary patch literal 528 zcmYjMF>4z!6qfGn#BFMK>0mqtu3(HWDa{ZXINuOO6m!(aA;!o-fT=^>3xl~fx{%NT=h$6FvI5Tevd1zxe=m%^e#k@y5$3~{ zaFyoXBdgW?Kl@w7*|UHh2s-4j7k?JnN}%*^l6-Mr`J3;mg{*Rz?!`(I&O!P^&A9S= zLYyeS%cP}|t@Y>N7PIIlWJDMzZ4TLsjxd;xZs{}u&e|RJdMjUXOH`>Y))rlFpY&I##)iXQRY zm@}N)dYAbU5@BkEO#Q`jev;l5-Yj^(mCwyUY*c+RX6j;$r)7k4z!6qfGn#BE}C=@2{yuHfOW3C$Ejp+h(a+*0UvTx)dJtF1;pT_m01GG)xz ztr;^pl>Ca$S?XeFxT(;on;~1KN_Ma0N$=^sr}w@0y{l&PF*0)VtT+7TAoSY?mDK(@ zcicE%5JePoG{zCe$U%UqL*1#tTpL|Ub5=d$WiC718i*z5n9*dU^Mv=*(? z+B;;mQ~zUsJGk5o*=s>_4oB%nQ8q%QU*(jEQ+GGmdDCf>?YG5Isx;voWRPpdRWK6b zSOr5SEs=6#yoC3e#Xlkw!Z=Adlurl3U_N8Vw6J4 z#+i^>eMNVc*L@Q1$0-@dTIL0$Cnr7!7>s-^1dk_>PU0R*V#PH085tatA*lEP&*w{q zOY09=AR!Z`R>&f#)(f)YzHzW({!%_MBe7BS!I*`MFeB=^sG z=EnJgD59979u6@^4gyRa>fV^1JEKzx9dJIovq)CJxt?Lnl9Ttw*t`Fk$aIAHa3Nfz zxnpFtn*U>et2kQ;*at!T9QNZAkre}_cM09;Qzp*cb-#XCEo7CWbU#*_a1PS%YsQt| z72;I+9VRW8tk|0%G?|51A_KxWX>rI_+rsp;byKGaaMo&4qDfY0v6x5(D$CngWu-2o z6k^s(gw*OgdbZSFAlQsz(u=h0rx2f=)i^-AThl`DXaMmbI$*6xF%7kZv`9$09cHv`&`Hh`&53 BnbQCO literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstBase.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstBase.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..260228fff1febbb820f2a4ebb23de7851484ddd8 GIT binary patch literal 530 zcmYjMF-s#s6rR~lG^dx?SV+o)6#`~Y(MAyqK{kSS9M~yR zrIp9wpSb>-%Mm!)O0cpE*jYJ~81c=#H}Ac9-+SNtSuD;WBY&0;TE88H9&9j`+^h4% zjq@E*L@`Gl9AbiCEo5En4x~|g%IBV1?(IhK0SWF}XmE~=$vSOQ23Nh;> zLTdF3Jy}}MB-n~#(uuU}r4VSG5p4>OY*ZZ^GjcJ;qa}nl{-X8w_r6rVbYxvGv{qODl^Y#W_F!X{!?$br>60VNyu^nr8QYVXM#0xQ;miGVv literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstCheck.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstCheck.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50709e9b8a779f05a2fab08466b061142f582f29 GIT binary patch literal 532 zcmYjMF>4z!6qfGn)@f>I$q+miuHfOWDeV+OmJrT?q!hXxml)mY)mAN^E|P4xP8l3#2g?|ZZP3>o?P@}U32LFm>7mDK(@ z_uM#N5k(YpG{OaVuOh4(Ua&Y zt$jdNJM}yJ+rj1YkR1v-=CGfA6lEh+dUpWn@U#0m*nHP%lx3Mal14b!i zY?KSB)g`*OydIKpE6&I$)^c1xc5>o#fOOz%A$UB2Y!V-^Bvwp=pObV*`k>-RJYOvs zF09{YfrMO`S|N*|S}(|phsO4j`HoyOBe79+Y|Pxn7|%Ble)|i(d3^u0+GqUR*7X-517fN7W0 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstCodecs.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstCodecs.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a0db6b256c8692c22cb28020e09eafa2b200065 GIT binary patch literal 534 zcmYjMF;5#Y6t?dY2+*Vp1ImbWl`_Pof{9jL5V|1IsuJ7jXylw<6Bp-v*iNKlVq|24 zk%_kAU$Ay*P$bYzm6+Hfu`$(mX%NqT&+k3I@4fH+s8$z|mEUi6yVnjv_jxdr(tqbs zSmz8e#IQhp9AJzb1eiI@y|kDst5XRaaK5{l^cH(a`Tky5nk_;k!CUZ<-IWQ#xP|Y$wOeod#@ilw{@C+JrPbrs37qcdC-2z8(>hhPBmM!;_?TA! literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstController.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstController.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e4b2ced75268e277ae16dcc9cbfc97b4cb0e3d9 GIT binary patch literal 542 zcmY*UF;5#Y6t?e@5}=nZ9Z*K3L&}gVrJbs(9Z+;Z0#u3ZbZz9suNN2ReArH;>%_>| ztsOg25dVXPr9qKEHz6^xMPg&Boir7F_IrNs`MvLb@0aH-AtM)S+sV0u(5(&TQu^!M zbK`tR6j97kA4eD?2LYxIb&pNYnbDa<4me-jc_eG#{G4OVlhgOu*t36`*mOkY=t;Cd zOMA#_y?keX>$rFtvK>JO9JbQWqVPhcH$|$Y;2h*v_hqoYTdx$g5BXNAG_lEGpcz*| zPl$aLBurX1#d3d&(PkE8kqimrq{E?j-nBqo-PU;qoORliXi`)Bm|Qa!3yj8XTb8YiJ>OJcM)@Z?jIUn1)71y89#n6+hzn zV#;u88wm>}WWv-6nFs&v7-acF)+_r<9k!B9q}LU zPnx6Z#<;q1xP0wa$L`7mVcf#k{`!^Qy!4wRKOFnvsI+?6I)ZN>?Xie0JgbwQ8Sw|I CD4bOQ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGL.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGL.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6ac2ec0c7a5288ac990c6b1c1886012bc083354 GIT binary patch literal 526 zcmYjMF>4z!6qfGn#;s##=@2{?uHb;L2`Lmx=w{9VHx#-Z*BaS+wUx-HizFK^lShx; z+A)($@qg$a$Wj+W!%c-w-3-}0RXW!tPkK-9J-zR}?|rFM9w8$)Puu-(4nn_eu$96; z=Z+ia6QYP>j)pkI7&!7ae(9{Go7^-@-Qlb*&(6V5^UBh9$-2SQvZ zzt5y)k(Gxzw!2vFm&HUfP+8H&Dys|_r4X}W zBBWMd(VZo=?gTHRm<%H=M=8XYmkkck8#J^KJQ_nhj@qmnDW;*3klqF9gNp9)e3moJ zZKKb835hVZLZ*Jco1diX(#eMQE4gRpVWaB3F)J5iyxK?j`FC`D|Ng4hru_4Z>*k_* yu&f?T%C~NH>F%!(#w~p79scy1KfLC`3zlB6C_I_8rttBdJ+@;DZ|Y>ljQ9&#-<10R literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLEGL.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLEGL.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..041711877c61b94d49ad260faa48838fcb26e3dc GIT binary patch literal 532 zcmYjMF;5#Y6t?dY2!*5z1Ik$GDrLAU2quKsq6<=5RqA%SHuA-uRFOb8RqE6&5*t(PghM?0J-_$-zW2WOtzLhDjQo7v9sF<*`fGzyDv!=R zH_j!Zh+>XLIKmh?2rzZ1du=c`Mwb#f;2gVUB%9z|l|9Pj;=MNZ<|z{!L{yDdqE%Y? zfULHv|LkuI7aJjaE9jWRQTkaFwNUA>+YY;5+?`BevM2B<0RowZ1#o0^mR|?8E}^LDAA;-B`hV9fhwvtRz-ctD20@b zG9k74j_xh5ha}vOQ!@DVJl{fi?-$yAe*ZL@=ltvb)p*+Q yXAS>s{myO7+^spnxP$M!?OU(?+iOp~aOQ>6%B!=^Ib3|S$9C-CWu2^>5&r?G)0XW3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLWayland.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLWayland.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8c9d2e33d7cc0169e4d46ede999647e94b1b3d5 GIT binary patch literal 540 zcmYjMF;5#Y6t?dYNJ|qI29y!$DrLw))Us3+8@eC`gwz4)bZz9skHp0}AGQ3z^ zU}S<;{0=4-f+7{&RH;+9NNh~ClLqD4@7dq;d*AzfQ!Ktk#_r!YI(H62e=L|;?*HYP zo67~Fh+>XyMp#P?8Jw{Af4{tOH})!pth}G@#7Yy+LHd2oxbnL~ z94WuUq!p7b^(GWeW;x!F0b!i9IAkkrVS3uSsnY~FYc(m+BrCL7Oe6!9-fpr_~mUsdfP)U7v(s!A;AbP)OC*Tls+AGQ3zm zm63_6;#YL;(x6C1H&yDy7Kx1sJK-vx{hr@@e&2iF`(CfFAtS$DcLzTmg#Ou}l**%X z$Bpw1QA9CEBOGCj90Zs;)V(yAE2B$^9B{t4Wh9&6T$DY^3_!(Cc)nRM zTv&g=0tuNgwL<1Wxn7Xv_qF#+<{#t>GZGtBhsMlZjPZN};dj5$+o$($qj|>9w=Txh zhCgfgr|UOvW9Dwm5yl;S<8A)&wy(YIsTa-G~^Tsv=tK7b&=?(uoH61*faJU&%AlQ%ID{hvHO*+)}4dUiv<(Qd|Y0+ zxtt-2DCVex1B{V_08@v$m!{{|_}BsmoPBqKWD%T;3CAQkIxkJU{htXUJrY7IzYp)P!@8epfTD{I(DW z%5O1g#ia9{5k;L@j#<(pjFSe3bg3y!PgB=*5(8(AIwhK3 z;V70{%$E=gQ!8ZRPk+&mlegT@vHCT+XvSjW>W>LS7h^nJM)=zU`Z~Rz3&j(DzIOe+ zU#JWUmE-v*w=i&*hX~^ue)3iyy^X)#M&GLrylOx5`M7ohr@MAp#u^^i$-Eiy4)Ow< A6951J literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstMpegts.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstMpegts.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb947222b6c932e3ecbac8d6389bcf49887e0b38 GIT binary patch literal 534 zcmYjMF;5#Y6t?e@5}-*J29y!$kTS%jYNxj9hAv2ekl0QKk#l~%xH#v-b|PITM#gUK z*on5{Uv%w4P$bYzNK9;z*qHEL8pN~T^Lx+ld+&R{>h&dL<=^^t{MSL~wg~1@`S08d z>wHHHF)Yvk2N)v<0cH+!&n)KL>P!L$oGj$}gtTghjcFZ$Z-q!1hZ)qO)Yc3ZW)xtDDv+E5`tk)h#2lfINk zn#5ccO!DPHiSP2V0Uc2;Xiq@C5=o1ROxI*72;S>5YG_{T@q{W4IsX>>$m(BU(luSh9RyFhQB-MJNDLQuWtWMSKh(`*An3Vtk literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstNet.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstNet.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d438e061d5ed90c448f89a9985652ab2a79931c9 GIT binary patch literal 528 zcmYjMF;5#Y6t?dYNJ|qI29&YVRfRuVljnT1$4mbzyB$8!tE+;)E$1M1n;T)vj)r>2@EySVn zTTEIS*-U2yt}~1NKzf96(%_KIHHE=6bzP?kaMq|(qDfY0u$V{&D$CngWyLn56k^s% zgw*OcdbX@yeg>;iOgfR4-4x=ZqbdhzwyRnQ9`zvZMO&;9DW;*Ckmez2fr{SoTpTeR z*=mdV5)xr*g-reNa(fa!V}>rqcsP&nx4-D?`}!eLkyJmynUmwVmE?2cdf#%%$|#dEmzR zi729&qX7;vMh*f@9qOK%nG2&c2_100x${WY!8w^@%#+1?YV5_oOk^g)a`+-#pry~q zYNPzeRvS2f8L*Fn4moTmUq!wYD7_mGHRI~L`_^Co)Tre3-E2Eins5%%FG_x2h<)Yv zn6y;#u~mu;-_YM)UG2^*wB zYV`{}SZ0qj*oYD`h_oDLkQ^K|IY77H)I#uR1j#7cVR59GhGt5-`=kdddd9O=Ff44d z$9xH?Fug)%{{Ij9Y4%vzoN@mkUzw%YsQO~e)WsN2R}p@Hh2A~CceVNvKi)ilJ+8GT xwbtSCty`P8t5bw=8{c~CH{RB@w>9>Hi5HAZZw}i>@MF&&i`d4qK3O#@o&b9>nUMeh literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPlay.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPlay.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b807fda5b8b014e79a7a42c9806ff38a04043e6 GIT binary patch literal 530 zcmYjMF-s#s6rR~l&YYUqSV&4?g@9Q-?ixkxWFvToV7IJ>N#>c1PIlIrNnoukE$zJ0 z%H!})*k5yzfU=cfWf!osawak2n|W{Ed-J~czW1kCoJL0eE$y^!9fY22Fp=E5^TLgD zi729&qYe%+Mh*f@9qL{i%#G2pgbp}I?j(|BaIPjjCdtuzZS2iQCNhXHAASj^Xl@T# zt>mBWZv|(w0sARvm&0~^D6*+Q>0M6JQ}>&{`m0jN%Dd@ytTf>qq~FzyE59wovGQ9? zS{~UMwe+v|dTD9>t^+Y1vI7J~^p!fM&a@h2T*S;$F1F8j)festIWxlNPAx6VH_q!;!7F zm@gp_rdG(*f8Wke($~VqnE0lgGZV2U+V!3;Mamv)Vaa?Av2I*6_Ga7R`t^WGt60 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPlayer.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstPlayer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c146040a5b4d08fc33959dcaa81eddfd4a9b3c05 GIT binary patch literal 534 zcmYjMF;5#Y6t?e@l0p*}hA3mDtCS&zs+|gALzhT^kh+}?BIo>?xH#v-b|PITM#gUK z*olJp7hStFRivVuDlxG|Vq?O0A&6(c=l7o9_ult@R;$a%%I`P3{a+43H+is-(xY=H ztn&>q#IQg^9AJzb1eiI@J-3)Et8)n)a6Y?>NHxIuvFNc#7Vo*WS5KMHB7$=8B3NRj zk0{q>`8NM;;_Q{r_aqw$=)|97_R`npK+qJ_7xyjM*l$*{#zESNwV^_QA|u0vCIcyt zHR*GeGs#wl1-{FR26RlhpgjTES|lwdGF_7|Dboz@BdokOnl$GC{Jo+ xS|g_`*KTd<)@KOgHoo>Y{&_opy`72YPd$H9dVShHgRh7A$vd|3yiQf^hzA7wn2!Je literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtp.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f5affe410f5535bc321dc2c2ceb840b916955ed GIT binary patch literal 528 zcmYjMF;5#Y6t?dYNDE1q4k#niAw^LR5FHSzx}ggat*W9fr)yIuek3l=`LLZx$Hd6k ztsOH3Rs4wlfG!P+1iA@{savFMOtq5+@$C2f-t+t3``%@-_#7Gey>Zz7RsV6KeLC3L{~>MkN#24}G7u}IF|p|MwwnaCi*e7F=Y z)7%lVTFL*lzZIOV2JEe%Jq`!)vB;JJr9bH8%-#04-c<@&`F(m2D@`~D>Gw3_%I^qq zqWm_KmPWSHoq-$7qMwmIVVpEMWG`F7U|PDN(*!tcHYm{~D>PY5Bmn1{K^%G4ktA{VaUKEpVq-8IK`1G{K0a~4!7J^58i2KnYYetG`s3oLzLfW9BCpZ@6vAT)InUfU zmxv;YIqKjLW8@&f)S>RR!Q2=fOXz@e(CX#{5@-|jkvCSxjm~|2% zwfcjeEv*+4Y(z2XL|S%Jh)+(c9H7~*Y9V;kgSZ#%vPPtshH65Z$D{=+`oME##BgM* zE#^x|gsBxW_20Jhlk}yqIVQd(=gdTGR2>>KbTP)m1%$u;Lu()JL#ceuf306ZzqC9k wEuYQYyQP73}jKU8M}U0_}vVc8V@Y6rr-6u8o}dadC0ZhwVf(qNr|+4um;W-c>4?hFljtce zZ6mAo@?ZN~$Hj|~eG+uQVLjaug%>LQS*vUt8QCY*x|2AXjd z^n}<|LBgbEQ!MnS7;R=jo{=G8oOC!8ue!qYbah+j8F1EVQ=&;x>9CYY2C69ASQTE6 zQ3@&RXF_Uqfo?6iyChtTQ__#M9ORJh?KL<+x7W}@@OTL6Fy3IDSTPNajC6NN0xEvQ z^Uaju)HV_pNXUe#6*3S0+cC)UyUP0+{SWe`nTw68uf|MVjPYa<;dejK+sF5JwRXr) zK7MbGs;lGb>cPT|TOGTL6NGUK-}uYF{N_);Ir77?AC5{(2dzUm`eKhoY~fj*^vsBR DqS~BI literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstSdp.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstSdp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eed30cffccbeea51de2e545c04e82c32f7f0d1af GIT binary patch literal 528 zcmYjMF;5#Y6t?dY2&D;22b2-%kRp^Ts2vbO-OvRIDkQ{mItWhuni!n(VLOqIiIK5e z8JR#8KY|~?LQtfln<{l;i^Rr+osf!WzvuU!-}m14u8YMF$jIH|R_oS5=${QHl6!NW zxp96WiYVr&gF}pwg8);9x>p8sV{|N`1J02bg!7;H*)nM3b!0U@?&lRF=1~%8G49Da5Rk z2&vU?^lVwZ90qGqOgfR4-4x=JlPU*jwyRnQ9`zvZMO&;9DW;*CkmfOIfr{So{5)bf zveg#zB_zVs3Yq%j<@_XlDXfoqf0J`&AU3KFj2XHZYE_xEq9e9kXcFZcST zr9o-wZ1&MD4cz%5!nlSXz2!gN#)G%f_kw{J^m7YmwR8BnZ;$O*!{a(xG$URC0DhJ^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstTag.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstTag.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86692c76e5872e3bf0ee788063f505ff5db4e8fe GIT binary patch literal 528 zcmYjMF;5#Y6t?dYNDE1q4k%-#s}!LeAQ%v;x}ggaMM$*E>1gW2kBh-MUu-ARF)=cB zYeyz3#E;+ybRkuwqMIspVvEGaR6A)9&wkJEJ-_e0@BJv3Um_zv-|ogY4nluzFq6W6 z=YbpN8={C}j=DI+7&!5<1`aO{#d$m$t-OqLsr3vRC{k~>g`5hrn zlpix`Y2*vt3Ao8D`UM#f#z~7q{<MG5IfTJ|$Ydc8UaXm{#b2p$a}8AQ9R6)C2no|5(ni9torc&!CfiV*^j?WZ8`P2kZov ABLDyZ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstTranscoder.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstTranscoder.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1334c8de1cfd6450e2c8be804622944ae9bb066 GIT binary patch literal 542 zcmY*UF>ezw6t?dY8d@%07^;kwu2O~^r7$5>rsz_st&m_k9YoIgaWQqySKEnnojP`8 zgORCF^?$Ii5EQA^O_e%zi`1BO^aIcGDjYLf1A}Nae3{ z%Z>9HQA9CE0~}$D90Zs;)IBvl=SJreIpBPB7m;j$^L2r-NY36oiFiv_L%EyT?J&Eq>A_vZTT}m`5Ydw|`$v~A=8>`am zGfE+2gIq|h&d{wTcbA4Q;*1PpEr$hUhlec=kn~$x2p*3h8^yb<7b~Wrm6POvq@dz^ zJfF-M&TK1XfrMO`S|N+zza4|TxU0RK)8Ce>W-d0W-WxM@F~-w1grEOH&+gx=dgFwD zdG)76|mv4iJz(laCe E0FCOLHvj+t literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVideo.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstVideo.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82efa38fb1a4c31b0badff1465e39e49f06162de GIT binary patch literal 532 zcmYjMF>ezw6t?e@5@-_^hAJb{A!WFu6`iVzt-4ey2nmVdbP)OCM`G%nFSZluI(6*W z4aQDID8GW4g`h}8Hz6^xMaq^5JLy$@_IrNs`F-zw?`ysO2pReD?6mjYLFlgyN~zpB zOKzOch$4zP8sG?Hs{XUTEnMt`?3JJ+4kzhHQPe`E-!Tf}+}#iMUbkvR^G$w|Dor>C8H_aJD(DMw zrh*=mmPoNZSi?Ka;vbSRVVoo!iYHxRFkRizc?O&%9ZEDQY6(k;WT1+wja5kiLwUKjvO-!8gVLOqIiII`5 z9XnAf{sn6nQbj7dsZytIk=U5(yAZ^)-}8IV?|bii->cP^$jZ;x2i+S7p}%=Bm(rti zFRb$gF~qPy0~}zC90Zs-%)PXjYpXK}9B_`^d8F##e4F=}CyV#e+UuuGXc0jX(xAY%dC`E5C>OLNAX|x~#YCoU(gXzWv>7!tt8{ow6$hP_^H^uq9%l?< zK1if8`Ukqti9JOAP8iccXw)!;_~fK10HR*gNGZY*#G~+lcS6k#G!q*2X%}?(jOTj6 zu&~W8Ckhg2Yo$ub(|#mLA1ZHW)OXdgor$gLPu5IbjPZ08;q6ezw6t?dY2$Tc{hA3=Ehm_&2t)L4+Y}KVwK}bj-ovws7A?5pjIbW9yH zvavE1P=5(xX;37pn~<2;B6aJ8oiwQ8+3)$i=l8z%z0dXfZDi&9qy51*524>KSWD%~ zx!~6Mh$y0%qcKh}Mjir8J?fv>o>QwUNj&fl{dJ^T;C)(Stdq<4#M;w;nbdY9)#OHU zlU80Mr|s$=_uIzhotV9lH0Q7<-pTS_tj(L8kBE3n3Qh!l?{7z2FWa@U^{Utt+7Qk` zMY&;IM?)z`IvOzL2$dV-B}|t&oLgi<7$-dr<^8_2J$=(PMFyPpx|A4F)_P13#Xy%; z7wfVR+#E-;{b3SY*(sg2F z>;@wfE#h}Dv5+bf=q992-6F9uVJA(MXTN8E&+mQj^Ur*K9vQn`-frDE2>r2OYMFnR zCvGlhh$4zP>f!)nEByIb*Bzm#%maW~nDlqQ^m^n03d z<+p|CD8I#|6_YM>#}svDIbM@KVVpELr0<%-^fYx{Coyo=s8gaznrpC#NCqm+TCCE1 zn^6i8>&8NAb%ma+w&$bjS{RXTsAVsK==iwI0h;Zy7J`R;i2C6+YlMnvD95DPAuUkh zjLwy@!f`COm@gp~rdG(rpZ%gAC(pT06ZPxztr?4rt3wk;F2;DYi13Fy^nP|f7K*3* zeErwQL7_4%R8AHi+``aZ93hNr_`zGf_cnifn**;p^s0l*(n;+UejM0k8Ebe_C-Y{+ E3wk`7lK=n! literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstWebRTC.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GstWebRTC.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..417ff9c32faca2ab7295d042158f3329110b5fce GIT binary patch literal 534 zcmYjMF>ezw6t?e@Hc%3l4pl~^L&^|S)J`qxQdO5q1tF+}bUGUO&aa7E=X|xDNXOK% zBO8oN1=N4R%0f`2RyQFru|?|EslE%T`t0}o-t+t3``*`j{UNgQ^XXpihl9}HBA83% zzjH0D^9eD;us{PGV2m6Dm^sWnx0nm7GYK4Uj@)^qn&5ny_n0Tk_uSfxyG&>iK{Z$i z7Fp#jDzsJoSNyhc{>bMqB^wIZO%7%Lz}My-L~r)DKe*4y>Z?{QZ@$iU6K$vvpvcg0 zp-ErLV@-No6-@G_L5c73vH=}YE@&hmUyh~4#HMSq6aPQf1_BKayrQwHGt$Tk5f$iLL4bYo;#7c)Eh{`Y*J0|Ndz-&&21= zZ`E;wOd8~L>B?ag literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gtk.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Gtk.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d93bf5c8470fd070ca4df8933ce9ad1a0d8903ee GIT binary patch literal 2361 zcmbVNO=ufO6rR=2{^`f|3d^xeou*A?TL&q|DycE1F4V5$zfcl-QDwwhyO!2o?JB!# z7l$>d(1Q-8gkEAO1)W^CPN|PQ`dH{iYt}?86awv~H$mtnr_PKl*>Yk?Gn$=w^XAQa z-W(m~F{2g|DK8zqc+7`|&9JGHjdkF{QFkjtvm|3to zvCDRQw8^=))^D(FKeY=n+d2Sb)?xP%`om5JuR`-pT90n^$I_r7Cw)4E;)3!M+!KghHl@>#R*)t3?SQ$p0=d}zXh26h~GVT zeR|&Bd`PELXNAS<%nd_ySHer>U0hLoE71l5$JK5V@5-(O8(gH#+6T>ikqzmr7aN z+}cs}2M>~(qU4K7+c323wxVxmm({hbrP@leEaf-x{$)SgSjI`?*?e;BzGmZ(-+oo$50(^&GCwI_vNwV$=$K0KavQwv^d z!Hq3?u|+q$Se>iRHEFVh1wzlMm^c`9#R*TGaQTTUgCa%WtqmT0a5U(OQ=T|gS!{4( zof~e%-oY_eNTe02I(I43A{b%7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkChamplain.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkChamplain.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a074e919681a2d4f517e3d0161071883f2dc15cb GIT binary patch literal 541 zcmYjMzfT)66t?e@Hk2kT3@9VgRmzZqrWFH1EEP(S03mfdT^l*^BXQ$9AGQstCmivEs z;^uOOD59972nQG=2LYxIbuUfNt?{V^4mjW38IomiE@m9F!>wXZwQoIqb$q!XVxI)Fn~E35&ny*8TUjgGwPQAEvvp(u8x6eqS@L z{H_o^<#(90YO=*>!qH@wWPuC_;(!|D&Iz&xNh2`fa&n#$w~@s|jNlV?16#_~QfmFu#A7%BTE% z`+8$os*Osulf_53G;&wQ2;&BR^wxiQJ3qahp;sSy^ DM+uua literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkClutter.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkClutter.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e6acff5ae934013ac18797bb16d0e263a5c4f4d GIT binary patch literal 536 zcmYjMF;5#Y6t?dYNP&a}B$TnzRmzYH2quJB5V{~yRH@tPO60_k#KbutwiD@?7#Z1M z>_l7fGdi*~RivVuDs}1>iH!+6X$sGN&+k3I_r33ZDHa!yk^6Ut?e7jke{3+5+&|}$ z8|NBPL@`G_9Abq@|KA_9g%gW)a?y0b!gpIbVR~A+q0(wKZk*YqL^qH_ z51xuQg(7&eE%wl3|A$@@*7z2^6H<$PM<^bqGhX$y^4Oo>nBnWir9oUd{c^xR|w}2{=H<2YdORpPv#oV;K zc+oNpT(t8ggB0?ttWlibBnDi0kChJ=}?y(@I^l1=cfYWOA9)1 zD?l+x2kXFr$AfSOFn>Ma`ZVyUoTDYR4fv225;;{`90YI z$0F7tapZr|5OCzk5R5yV|9BygICd+D#6j-?FD%bT39Wf!S-Y}s)oBs$$dA)Y3iQHd z%c|tH8rhjF*%juWH3)v2Qo>Y}#~afc8ZoqjfxYQL@$F^}i~8%Dtx=JrH`>6I5zFLo zUHARWn-JRqF*Qms^CH3`)tW_Zri7>n(2G?4&gO||Z8(621TXWVWuoiYyuQOkq2`5L z6|>J&Q>&^rtv9i`y`3^JE|ycaWf^J%n+7Y32TGK-UM(^-Pr}$(?T(!Z^*n`8}PnmDaomi$D%eb*j`&BP8 z<3{HD0EVV|;mN&`i{#RIGIN&9bdy;(neC#7?d3hZ|E50)LgPQ8$A(=X20G=b1s_ept+v#&7Psz!^JL2xG2#ozf1+Rr#$B7R5xhWUwo26UQVqA{+n!q5LU;|0CTP4Q3JQ?B|l Ygs>k6a1C}qZg})ZZb79FhLunK2Sj8C-v9sr literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkosxApplication.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.GtkosxApplication.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54561e3afbbe44d837e41deaa05da8beabe7b1e2 GIT binary patch literal 648 zcmZWl&x;c=6izzR?R4EDJ9rRT_2lA!GwZKY5y69$(kgwb68umJdJz}oCT z$=Q)k-UAFUWFUbdgeI@BN@9f;1Oy7d0*HkzY@bvBIMu$g&?ffF>KchXVt?FPqs{e1 zgVVnok=7B`LMN=_>T|GmZ|j%o@L*A=vWJm)MN z7%9rrH`blt_ET@WaG&MvR4T+65kbt83@M?BKyhWWFjkbwV95DM1_LV04-^-YB|(oG zhB}%c%21z?;!@1@WwGk1JR^+uwJ3!Or%zKPD3L|gU|BSV6l0RoB;!KK&*02F<9yU= zMkz`nCB`{P4-b7tNIdiv=Pa6#bP{!GKax}tKSS{d4Ty|3bRH}fE~7u7fgl;zyGiu` z9?#t7+-)9p7BzQX+baRA>Z*7DyVw5awP#*u?saC){yXRR#)qqBlr?jHbxUcR?$sG_ HQA_y^COEpM literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.HarfBuzz.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.HarfBuzz.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b07c90bc41c6eb7821453febee4323ed7805ec3c GIT binary patch literal 532 zcmYjMF>4z!6qfGn#!YHx$q+miuHfOWhIR_2Lm}9Kq!hXx*BG7kVylr)7fEM0PZ=|2 zYsX9pCBGtbmbw@cZVF_|X2_PQlHDtL(tCRE>3#2g@1kB`MMkdQ><+FRgzjxnO68yP z$c^&@QA9CEBOGFk90Zs;)IB$tOQTB(9dN$8Wh9&6oRvMwK>O^$R^(UQcmnD@w>H(lW~-IXdz=K!50KA$T-~WE}0XI8sc5pOXF|8GwqO@qD{r zxUl|!1rkzWYK6>$a=jqUpK2eL%s^QP2;(lk_1ZVy_8)J1>UCybXIgoE+&zKQZ}!-ZUA(N5bu;2Gx^kEj literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Pango.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.Pango.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5efa6f4605ac302c25520df8004c3fb9fdf34993 GIT binary patch literal 526 zcmYjMK}#D!6rR~lYN{r^c#s^06(VG{v>+7m77{^4=xtdIlgx87I@wugCV}nAqsQL# z=*d$25B>o!rUWW`5_;+_;LVdWo2K|?-kbN{yzjm5{V12`k&*k=-RRCi=#LF%QuyaQ zbK_hhiYVr&j{}U6g8);9x;F-MYji4s1I~#%i)0m?>sgOkGJkK3z5SmF4I(H8?}9m6 z_=>F7ihu2I4QGo@wkPO-!%loGvf=@WBk|4s=x^-TN?G+F-HDYZoP+cSnsMd#gg8}x z#H3}BE%bA2n_2LCG9-+X4u@>1D-5Qq+d55vvrd~5O|nvl#Y8etS<%KSEB6?s5VL+F zq*g!CvnBP?Zhi@4(hs#9q!6E-)j2@7SJy)Da0u}*+-03mF%9*EbWceHDtyCpJ!hEP zdc=GQi7>T7rhdMgpQJCPttsto`N7P?M%9rq6BlDVSw{Ht1N!v#K2@q0{A%;MF{-SM xD{JQqk8Wk`E>94~E&S+h{Pr5ZyvE3Dj=konuyWqIfbWO)*p4kct&?Rl;uX3pm16(^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.PangoCairo.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.PangoCairo.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c6674d56dd52937866a59233412d22c4b72ba44 GIT binary patch literal 536 zcmYjMF;5#Y6t?dYNP&cfN+@HctCS%Z5KIVlsZfGME2M6xE0GhwUJTCpVmpzpQ^t&J zbnHZ1@iRJhX{tz|n~*wni^Rr+oe;{i-}8IV?|tuk--^W*WaQWDqv)rD&|e!YB=_jt zapPPdiYVr&ivx_2g8);9x|gQs%II7I2b@!P5y>(*Ul$mQ}+AOpfUX>rIl+QRg-byKGaaMo&4qDfY0v6x5(D$CngWyKDo z6k^s*gw*N>y0gsgX?-t@NjKE8pF-U0RXISrQ`JK7Z~*ZjJYua-F%8v(w9iNcDtyMX zHe)!m)rk2L5@BkEO#S~0`bm0U*q?KMBiGGPY*d{XGj%b>(@lhTf1{n}_qJ3X@h|(| zUye()NvSqmy>UwucXNs`Zr~el>)Jc`;~k8>`oyb`bFYSt5uAUt$09cHyiOL)hzBF> BnKb|a literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.cairo.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.cairo.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..649add2136c65d39a3cf85d39331406350658c0a GIT binary patch literal 526 zcmYjMF>4z!6qfGn)J0mq-uHb;L2?+#3>1OOeQVQLUOO1SbwbjU{izFMalgEtN z(lJv?$baY`=u#I$%}s?&*$mz?RXWEZPkK-9J-zR}@BJv3*O8H5Zw`Au9fWReu#&=q zv*5}OmGWO;%6B$GR6V5^UL(RDI`$C*3 zzsICyk!=ieY=>F!b21`~lP-tsRU`~1(jA>9z*)CLi6&X8%VHuKsH|vXm6iL9Qi$0g z5mKvbw6LV^JFWdNCWBDRVG8l-X@dhq{e~8Tha-qb;UVjWifL#hBsw8IP~j7vZ*zvZ zZS@DVJg*|W`y1^%z5gn;GyZ+=vN@@2 yPAi+^jhS1Sy45+txQ%Dt)?csr$7@c!*3@fF3a`iQGdMrC$98PvWt}XW5&r?{50#Yw literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.freetype2.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-gi.repository.freetype2.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efbd53902eb656d1136d66684467111a2fa830b6 GIT binary patch literal 534 zcmYjMF;5#Y6t?e@HWU(;4k#niRmu<-0aHQUP=Z7e65Ht@a?X#$;G7TJiFBP98N0P( zC)$dC(X|VyA{E_KiHR)|8&mB|gLw9P_IrNc_db8CR$n1&zuxTietHPqxnypo|Ca}0 zFP{-Z3=1^CA;!o~ft~`GBm6c(}B z<3vF!ZLd@rdHNqov&YKzO!|AZY-eKY`q+l4k1?LEAiQ~lHlFXlwfd#_vh}?@u8~QN wTrA%DwTZtnMHsj7ZLszy*!dmojDyxBXpKv&7wt>!}2yqPz*#o{zF^7wVD_23}%VuOj~{yA^l zIG2bbiaF}w5M$&Zz|^7cjltX-9ZTqdbLdVYSqA5N(qobwy*I|*|Ib7Q5$40G@Dt7L zBCCG>)&BZ8o2{~KLAx9_;{%c9PB?3vx=X?0j$g>iKhw=vX~H?kpsN{IL0gC;6||VN zB(j;#2wGR8Q3^5ZBtmL+ zhu$ow_xmPE?jKfCNzA-}=V?3Nkc;y#b{&@eC%IExQ?RvFe@&_gV vZ06Z54cz%5!nlT?y~QVQ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-heapq.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-heapq.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13fe51ead24ffba01654b4ae811f613f6f10489b GIT binary patch literal 222 zcmZ3^%ge<81gF(}(w&$X7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfoYmPsvX%Ni8n% z(`3BGpIVWeQ<{>Rl9^kOUsO`OlHoH*=dVC_tC+mR+?bN0(#q7l!b07g)YRk*-IDzL zoS3rIys{Xd%%qs&%#u{yg2d$P#PrnSn1D*pyyB9?oSf7m{fzwl>|!vfn~|DWP^ec> t`HRCQH$SB`C)KWq9cTl{fyF{V;sY}yBjX1t1`*i_+70|5Si}kx1^~wqKRy5e literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-idlelib.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-idlelib.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e1e1ed2484677044ef026b9760ff69acb8541d4 GIT binary patch literal 326 zcmZ3^%ge<81gF(}(xaFd7#@Q-Fu)9DeAWOmrZc24q%h_%Uhd6n=6E>4KCK+LR^5}oy zf1rq`{vBQvJk7PI-WI%hGUKlbz9f&A$NS#*zT~XmkBGO+)!o_mE+K#0%d>?~!R>|* zPKY2ABB%%yErLlvNkAYF;VC8L!keR`P7lXArYrxyMc`ojHk`E9q(`wF50Y8kvDo@ys_t z>!QknWjJN!e3lxpSQ$^kKs(P_qDQfB;~mDe_|NGRarCcMFr-aC!?J#vxmkIuV6i+5?x7Kz+-72DJPC}86+dmg&-J8hDx?S*A24<&|Y$tSP(k7W=dvU=J z;Wtkg`2m%XGi=a~oz(*}B5}W!IksQhQ;itl>rF~jf)Xgn3 zHvY-TlVTrs^W@4aV5C->9+Zw)G~_~stmg_Uc_Mr&k1&(i!#&R*7$4@xSOpZf?8gsr z#7PoTe3@onrj>pe_?nen^8@M+biq-=1dV8{vgDOw-u(RzIU=fppM0Y&>?lQgNTFRFDN2(D}j>cjy5#OrFWNNoH{zX`5!3a zpW@O&r>stHfo`3=Yb}VryL-p?IKKDp?$xq3LE_`E(Y@CJK2@=TtQVM_%k3F3U=%`x zS}4+58UhUn!rBW0c$aI5mM&Ed>wnY|E;XTQe5pfKE#L8J7!qH!dD@96PD8?T%cn`! zj)?HEC%gx{Pcjz7-CD=<`y|FZU;j~Vt46+em)*o%c(Mztr6LGBZP{5K$mC?7yoCm2HTafeK4*ZPwe{C Zu8*w3gpJ)t>nWI+<*8X78EP=~QQz1Ie8vC( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-kivy.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-kivy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c4bf2c805bffe30c5ae9cd7331d713d36aebcb9 GIT binary patch literal 1080 zcmah{&1(}u6ras*zO&YtK-)vgBD6M#L|gHo)QYzFfk|4MgRlgaZDyLR*^hK~lQum? z5%gF=u*aS%(u;qBcQ3oJhcKsrCvU~xdU7UdBoV>cH*e;>`Mo#4H~T(|VhqsneW6g> z5diqXjL`^PZqBcB0DJ-vKu!k+CkHsT59quh$N~of011#kp_o%ThXZd>grEnFkQ_3? za@dH-5hE%`2a!SQkI6A3F2@Jap%WT(Itm2?UwG07L$iO*#L1b6PO1e4VH_*93EzQnFWM%jRRx#^D*68*xs?K z=K9oL| zjvx5x+udR>J#)BzlsZbenOju6%(9V!Z literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-lib2to3.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-lib2to3.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae5f8188cb2e16a5e06a825b89872f42ff2d9657 GIT binary patch literal 326 zcmZ3^%ge<81gF(}(tDX07#@Q-Fu)9DeAWOmrZc24q%h_%YB;VLillhi- zK&5A1aY-UjQITG0NoG#5UPgX?c5xBN-dn67UBxRIK7&mA73^*mlb4tqQ&Ln~nVMHv zsGF0Tnw+6qlAoUwQRl9^kOUsO`OlHoH*=dToZtC+mR+?bN0(#q7l!b07g)YRk*-IDzL zoS3rIys{Xd%%qs&%#u{yg2d$P#PrnSn1D*pyyB9?oSf7m{fzwl>|!vfo10itkdt4M zlbNKK1XP-umlB_pSe#m{S5Wzj!zMRBr8Fniu819IDag&mLO|jJGb1D82MGod*$LVW L{2*Aw3KRwaE(u11 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.backend_qtagg.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.backend_qtagg.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cf74d59d2b5fc908f1e14d5be466667f8b365b6 GIT binary patch literal 248 zcmZ3^%ge<81gF(}((9NR7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfoYm4X6w(G4s=8 zyv3hdk(^VSlA4m4TaaH=QoNGkGf3aBTz9LOyu{p?lA_Ye)V#t%-JI0ax)FSmL#U9>lIY~;;_lhPbtkwwJTx=+75Dhu@I2>z|6?V_(6d|M0$c| L13w5Bu>yqwlCMc% literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.backend_qtcairo.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.backend_qtcairo.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fe63b130171f28f324abd824c476a717ae1d90f GIT binary patch literal 250 zcmZ3^%ge<81gF(}(i@l=7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfoYm4X6w(G4s=8 zyv3hdk(^VSlA4m4TaaH=QoNGkGf3aBe0Qsuyu{p?lA_Ye)V#t%-JI0ax)FSmLw-;7Uk;|RQ}?y$<0qG%}KQ@Vh7p}a(uB6kodsN$jJCXfk8xi Nf@T9h2o|vdg#kYuN<#nu literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.backends.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..856f1baee0164b08e36854bb378f1951870723ba GIT binary patch literal 8523 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..310f3bddea8b35f27d85d9201e3c42a1af968ae6 GIT binary patch literal 1086 zcmY*XO>fgc5S?|L#Lh?Q2SL3Qr3$SSNYVfYBt(0IQmLwtDp9baMy|aiZtXZ-JFQZI z6r}zDZd^GP5I=>BgCY_6R0(n5X4G3x%sRMD#_RE$x4Um9TKK#{4iA6CORuoYYz-%m%I^~4!LEqq7D7Q^{W6zj>!`I-QrWR)o@(dvetyy+$+pHbY)=_QK*sD2)OUrFlJ5U?cslDiKv>aD8P0CinBZR(u zov_mG`WdTjj&kY-W4!k>JZT1CoWy!8aSD|)>}cX zGOvG}%&)EHA66b!s^Mw2iZ}f9SYeEJk%{R1nK8Q3aShX9an8%U_AvG(ooY723knPM z<2;w+OM6C3Wd?QpgyGbWjg~*7HK}$`XY{aRFly13>o00HHbTSxQuBx&Hz_si*mI|j z$41&_U4MFPYNR|j#zaZJ0^@%qlhIvDPb^#Sm~@TJW5{pH`He1!5ki7_Ad4R4$Hx$E zdy``bRc~?x2@p~PG8+g2Sq=c*-xvsUS4;*Hv%T8;-P2t!ch?i|1u;PudhtMl%v4Vb zra(-ct_C2IJ6^8(;q@R__3l6G=hg?g^^hHwcD`&3N;}>wyEG~J(_%n&1nDUgl=9$# z3_CC5{$qwrfzPG!Qp`rWP-w+7%VEBR6q(ZqOUHbM4w+E7vEDJES)n=Fw#+PWu%rI) zpz16ZzB-noX|V~&6lWHyfd$QtO2Aqut3W~3RT5@*!=O4!5^m;6QiYk|9QEJ$PqJxM zZ=Y_jVht+xwkT1rR*^)UXOTBX#%t8;cp_%86CR^Ku`a$Z$J%+2676MX%+l>R`hVXj rFSosGWq2X+#txcwv~hRdP~D-F)@K3j)}*E0;Ym=FJ-vpl+4kqZ(rk9_ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.pyplot.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-matplotlib.pyplot.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a00a5daf7e1463988b951b216f660d4e94c78fb GIT binary patch literal 265 zcmZ3^%ge<81gF(}(hZmx7#@Q-FaYF(!Dl`oHJu@aA%!uWDT*P5DVRZ%`4+opKxIir zeqNP0l%bcLUzDm>P??jMRFa>cQ|zb7c#A)^A~~ltB{d~8w;;c$q2PG%C&Y7h%Z{o=66%}*)KNwq6t2inF6#KmGj;sY}y ZBjX1N1`*i{a^@F=EE@Phu!t2X1pvQkPp1F? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-multiprocessing.util.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-multiprocessing.util.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b39874a7eb53a237f72d800c49cd776f3e6e3995 GIT binary patch literal 234 zcmZ3^%ge<81gF(}(#4q>7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfoYmDM>9Z@zZ3y z#h+S{oKu>Tnv$7YkY7|%yprKFNZYRjcdMAZ#N3#YqSDILyuw1=oYd6h4Be9a{G6Dw z)V#77pUk9~;>?m%-GapA?8Nlc;+TL+&%EN2#GIVeBK?f~{On>dsheAxQ<7Owl%Jeh zT%4Jgu2));nWI-w`HRCQH$SB`C)KWq9cUrQvBg3_;sY}yBjX1J1`(+V8V&p)Si}kx F1^_f&L@xjU literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-numpy.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-numpy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bbeb4320b4dd77d62bae1e9561546f8ad1d7ea0 GIT binary patch literal 1880 zcmah}O>7%Q6rTO@?#A)Pu^s=V386xiTF4G5f;KHbQlUj{8VVGsWVzaGJ%h8!de@y@ zr*$MGBlXauZ}b>}RD{|?jy?9yWo=o)+EXM>y)EjkC*JJZ#VH5IGvj&hee=DadG>Fr z8b>hxICZV@YaXG$m@pZ!@!&5+a3{GVPW)gI%TJU?fP5UHnLcDtA(#0HioQkScxE@O3|$89 z_?SBn+_S))s;0sUq_9X-GWR6$NB~Ay(Wn7;RfVYHSRJz{B!TB}vcZSm5>^`I`34tB zfJ=>W66n*f^xRH*!buZ=%ItTq--0HANsCyRSapLqCH^^UkmrlA z`9jNR0pR2-AH>`vcee>KLpK^WD7dz12jYrh-PIjmxoucFjfmK*Qnu|E!yqbJ-KM0X zVYkyFTAl6A{_-(Xvu(PDPO09}T;jOSejzgd_hN~svnrr!yAEaDLRriEsg_>f)fDoFOLzvOo>T!$Vd$%&?fpQ!l~|2w+##rA8|P}$=tGE9%X+9 zzGOJsUBjYtOi(}wTgOk5dv&vo2_9ej9lZbmdinJi=WEb|HJ7$K#JY2*Y!Xu6F0)G3 z_K3AtyJp<3IfhHhQBK6EP36BDW*+Y4sBW#!OXZ`cjoT*qguV+NSYtX#XsAHoI4<~{ zL)?mo-k6>NFK~Q-{(p-j?v#h#o}NeZ`JVhx8Wz_6EUXU->rdb57cLG97yI*{4cXl2 zs-yHuuY4f))2D~&)7|9Jd>V90yc-+Ms$C^WAa2G>yb1Fl-%pf=iBcbxKrbON(`yWb zWlvZ>5c&yhIesjCle4b{~{`5E@qjlQ}ugk9X|UII=re*fbD@tn@}ZXGlR*|L`{ zAFe+8ZgA$RcjoFyyy6|7qug09clN3LtnJ;@yxdklw>8Xd{dB#1>A|@`L1Ljx`CF?Do^NQ3 z@8pG%m>DTBi$P2%NPi_=Kqz`bF+?l`0?*7mGqX=1AQAE?(h@YrKLbb% AMF0Q* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-packaging.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-packaging.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e43eafa5a5d4730ad00030049a153503d5cd0961 GIT binary patch literal 231 zcmZ3^%ge<81gF(}(jA!?7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfoa6EyzxfFG?-W zFD*(=E%wu7yv3W5nUa#4mzi6TUsO`OlHoH*_peZQtC+mR+?bN0(#q7l!b07g)YRk* z-IDzLoS3rIys{Xd%%qs&%#u{yg2d$P#PrnSn1D*pyyB9?oSf7m{fzwl>|!tpmCwve x*DI*}#bJ}1pHiBWYFES#v<2kQVqqZhftit!@q-kDkm3aa#RgswEMf(U0|0F(Lc#z5 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9565dd225ed7f19c0de082a3f2e696ca6fbaf7d GIT binary patch literal 481 zcmZWlJxc>Y5S_g}C4L+xV$e#1LL@~_O(~jIB2h#u!$G**F1aK3k?igTlFFZ8XKSU1 zKf#}1lRyf&*2?Z6T`Ko32#Rla-ZC@HyqSI0v}KTZFV@>{7~nH;ejxo6(`)%W00Dwr z@K6JJN<%@Q07XQ3LIAJQ=4fCURS5nYWf_Wz+D1bSpn=K44J1}t{7Q;SO0;eTu1hV^ z^bEnm0rh*m zvP-FDmqie`MxXk9qwcf}?g(1$npVebQ*Qi{I!HxQmictl?qHTVnXgo3D^eo)Dc+J4 zV}ww=1?U`&p!Wa9i;&wJWp^K|<7{P;t=wsG2GslrZ;bNAG2Wlx{TLA1`A~EB?fcuY Rx_x(%oTTqgnqf;)<{N)bh;RS^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.io.clipboard.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.io.clipboard.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a2f76754d4086861b4d0e56e5857427914e676b GIT binary patch literal 234 zcmZ3^%ge<81gF(}(py*<7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfoYm4X6w(G4<1A zyv3hdk(^VSlA4m4TaaH=QoNGkGf3aBcz3Iqyu{p?lA_Ye)V#t%-JI0ax)FS$ftit!@q-$Ji1Y-_27VAMVg(8V E04@PTuK)l5 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.io.formats.style.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.io.formats.style.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11e21e5e6a9503140e5ab71db94de3fe426c7b30 GIT binary patch literal 393 zcmZ8cJxc>Y5S_hC!X+#Vn~0$1=Cq&%;PaRyxUDkOo_%^ z;(=5VG5V@i%J#0)%UBy?#}u9!E;JrVInk=PC-X;~QWo?-T&&g4uqx!%;l*hX zlPEB1ma=#{Z41W2QQJr?Rf?2jr-cdx1`!!dW~fhzj>W^ud^r@rmA-O E8&%_T`~Uy| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.plotting.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pandas.plotting.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b43b1a404042806fb976492a21bd660f7bf41e8 GIT binary patch literal 479 zcmZ8dPfG$p6rXXeM34%Uf-asELAO6zhe)pxS_Iu}LDrpNcX0NPGqZx8`WAhIqWS`T zhb}94h`n~|w&2ZEJ1e5}oA=)Eem~~DH}5r<%YqnRrH=Wo0PrJ|72-U>yc1u~009Ik zuwfTMkOCN@)C&aQBlacOUcxH>*d3HMVK;@g9>B^g+rRQj1%~^Eg^fXv;h|3$wy`57 zyPobKoflip;;C9!Pr|IN3y->jlK$jqDXKCT#4*+0TD+?$;lcg*#^FMz6f@NqgmTq# z-2rFvFJaCi2w{iVp34M(19LgW;_>=Yb97r1%pYTCIIK~O4XY+xmue&IjI<8vYn%vN z^K@gNo0w}GU5=CbNsM(l`Fc2SyvSVHF7hdEF}Y{CE8dSoq(BIxLjW%VaK33#7NiS- vk`D@{sZyRPkik^<6j%^7W@%d1SRl!mb0$#BKfnFK&v9 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pickle.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pickle.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b47d84e90aff22ff6fd4fc542e2b5c8c09b0085 GIT binary patch literal 238 zcmZ3^%ge<81gF(}(tVj27#@Q-FaYF(!Dl`oHJu@aA%!uWDT*P5DVRZ%`4&fFQF=jQ zQE}=m_LThOlGNf7KTXD4{HYbmIi)G7DVezi`9&qgD;Yk6%=i`LZWWW4m>W}4R9cyu zS6HZ$KqUFW#LYfWy KAXvl(lmP&4`bE3| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pkg_resources.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pkg_resources.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0397660382c7ae093e076cc2ff95e96958651e66 GIT binary patch literal 1701 zcmaJ=&2Jk;6rb_>W9??`Iv+HSpxv}l!Qd=OD*=tFTu3M_rJzJTU|CvCb|=o-`{B;6 zli1>5Ar6taaD!vSp$Nf&BYy%Cmv!WWwWmrwMO-!tr=ED@kEB~dXJ?*f-n@_By!YFm zB`Jeo{B`qT^=}EG=ln1piP7fN#0dR>bfjYwS-6a?SUHCIIc5r0yd1}jU&GAJJw;2$D3RU#j8@{3hyysO%D8N$XM+%QrX@Ej!AQqKPWfb3a`a z@AAloXUv~v9KLii8hwaHpV~yl>0|z|Vl0@{9Mhzlr@GB8%h8)Ab%VS{Y}K$D4)fHZ zu84!2OTA{pa~#uE4SU-OL{+tjVXJCUIKBtL7=PD51R^7b$sD4$XBzdY%Bbr!nMPej z-KDnfFzu`<;KJPmSf`vPKmzwX(-CL=^vEs32i`q|~ESi*RJBu8B1t9EJ9vWK}*YN0KgJ^Y9rEcZR)_vRc2o!_8 zzvDP{cOVy|2pX*y;$4$iTRK@~z#DWGmdiIC2E{Q4%O*jz-*`38Ep?AD8w~GqLr(aCd%Ly1vGK*mioAK&4f%s5ELW)$|Qy-JNRqB+WT)7A!rX)nCiPIGLJ?tAU|*IIECsK+PcQVi=c z9rXbl%IqLLY%5UYQ85!-dASNr&oEtO&|$`D$KoJ@>;Ge-oU@+s|2>d)3|*)8@b7Sg z9NpKeqt^Pq;W18fmgQms1h8rNgRL^oB+du71~L>d z#^Ef&53rB!|9AG$svn)tE>Cu({?uFFmpZvHi{eu~;mr`egENQMdh;Lsv2rxO?$57> zNhB8h)a;LQ-PA%awGg62BGVUV{K9*DmOkzl)_R4tuDEs}9Z1i{7yXGFe#wRz3bDD& z2?FsC7qClb4y14biC225tB3C%rAmIP^!v5m@~3~U94$Zgmml-!bGQ7$?XGwmOedqJ z{p{>PEsSC5b9^EQIS30PL_#_PK{JJ3T0VSmlvez-0&zkVpM%S>I6?72_UtPm#hL!Z e^)b?s1*kkw`K2ye>PY+>^x|K5wbro! literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-platform.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-platform.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de73437f84de1c5619e5a96e53233bc0658e48cb GIT binary patch literal 320 zcmZ3^%ge<81gF(}(oZrmFgylvU;xMmgU@VGIVU3TDt`c?lBsyTz80SX7>wcZ;JSC$qRDCo@Tt`4)3=Widz~u_P_O zDEAhBYDIERX-aBJW^O@#QAzPihR-0qze3!tV)7DmV@irjD^v3d3w3i+QF1PfI>x_Ky3iGf?ERs literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pygments.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pygments.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4bdcc83afc2e364c3b86ffa0e8cd01ae9c89982 GIT binary patch literal 669 zcmah`K}#D!6n?Xts7+a#TGM)5DzwcZTk+7EM2fc}ND=fD7M6AAnJmuk#GOg%<{@_rC8N=9giVK*ia+&GvBt;3^yLqxi46 zK2gn2pwI$JsK!X3wKM`6phopm0`NzjyJ+dCXFQK%f-dCI`H8@jyTv>@KM|la+fbby zte3XpjZjFJF^tR(=lkZK&(PfCk+~JO0}Q3G%pDXGsrlWP9kY*-@OfyiSj*OmRr;G* zuab1$~)gQ5#uDb?!W#lt1T!~BJiv0D39EvB=ML%HWT>6$={)+eTqesePR2Ols}HayP!2Tf2MSm*}|?$$nBCsWR3HA>-E? zDU2a2b3i^P@M${7i|}$ODZfpYR)^*Ks9gVHT!L`{3+J$qRNiO#p+2lMMwP}8nj>f? O(EKkzVN^!Xl!aSdskRyb literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pytz.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pytz.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d281de6263f9a9b684567c37b165b525bbd2c006 GIT binary patch literal 322 zcmZ3^%ge<81gF(}((f@bFgylvV1OCQ_^bhBOlL@8NMX!j$YqRTWMp7sNM%f6TE@u0 zuo{RVAc`r4Iha9{SHMt}{C9xziJ}omRwfGiGL1jsmpCRYhv@$iXuuwNA zH8nXywRF+H_72FY}Nu(@DT7i7C$LFF$Fo80`A z(wtPgB9QMvJ}A})5+9fu85uuFFff{5U@${QA2=8|r7v(u%`m&jp>%~qseu&)i#ULK E0Qp;5zyJUM literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pytzdata.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-pytzdata.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07af03d7cd8f5f854261b7a72811503a296807b5 GIT binary patch literal 328 zcmZ3^%ge<81gF(}(xaIe7#@Q-Fu)9DeAWOmrZc24q%h_%6uqtk_c2)q*q#!nNzHnk)NMkTm-WC7Ar_u@k)lzAme_8xLd{KCFaJI6qQz{<`ov| z=A@=3XXuvX=jX(frRJ5z_+%!<6la#C>J}s>XD6no7RMl&t`9aBOzOg1pjS}&i^C>2 zKczG$)vgE>3Lu{p>jH@n%#4hTA0!wU%`Y&RA)^NzQWrR+W>{V1P`kpR*1!saMI1mK E0QVkUX#fBK literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-qtawesome.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-qtawesome.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97e375c0028be5e2b67369c37a7508f865e960cb GIT binary patch literal 536 zcmYjOO>fjN5Vfmq(XK?C7OGZiD)}OOZI`REZO}m3r%`PF5{_wr4b>@tb+}x5dQ(IsAIMJ9*MW=x-a`z{MRd zpE-Am1R5cMg(q?DjXaDz1fJ-9#R&ayXO2-%^bgQ*@cC!(R_h~js7tbMU!8!_Igpjq z+QMu_(Im5JHKttWktu2cWta(wrk2eMhctMtl_iIn1Vfk-gr}^`Sz(9*5X5RS29hZ* zE8)Tu$3}83DhV|B2*%#z{&!xb>vX+i+N*7<6?s87h;upP9}dXcDqVZ-DuREliXmZBt*l+G7iO@Vrn#X(fJ7p|$^(C!rCJjxUa#Oai*9=+$^BrBb z#8;o*Y{iP@u`R0_)N~q30G@_cYZ)JdI*xaG@05EbbvLXm=7IXJFOXwT*@y(Cw9PW}mQ4(^KR zf8yfcP;PZ{JE>DAb7zIVQ zi~s}0*T%FD1QX-6@Q49kbp4@OAjTD##ji}7D8Zq+S?F@!vqII6FHM}}$_ZSbCM%(G zT3$fBpd%eF2o+{A*=WQUfmAMIR8%A7F!R$`gpmK7z_py3BTHYG1 VZ>L40g16d3;uj8eeI)<@ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scapy.layers.all.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scapy.layers.all.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c4829d5997f3bae54f649a19646dae0cfce64b3 GIT binary patch literal 350 zcmZ3^%ge<81gF(}(ibr^FgylvU;xMmgU=d3YC1y-LkeRKLoQnm(=tW| zhSfj}0Z~jT%)tzrEH6P^O~zY7$@w`ssmUer#idEP`6;D2sl`=1#mR{Um3ldem8nI= zewxg;!~-fl^NLFnfhvpiN=q_xiuE$`^RtVKK$hR)&B#niNzKd5Eyyn_DPGC&8D#XY z7_9yLaIIz5 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e03f625ba52a7b7c340f4c6880c12837a3b201f GIT binary patch literal 1842 zcmbVMO>7%Q6rR~#+iQEB*m0Z|5XDGMLQuW9RYfUE!=(rnwGA{vREwkSdS~oxv+H$d z*Dbb+WTYM{REdI+(qjZD4QemkIC8ASWnKAT?Foq!H%q;soOrX2gWV%D^WM(S` zH~Tn~Ng-%|EM2bultkz+z8E+8aPs0gMra2SM6ivt(HCnN)`BfKq9$U#C)$z|(_&6s zi#rJ|;mDedQ5|VXpcECELnIQb3tF0{FQUzwrcit{Gj_E*GoDR;rzB=4PsVcr(HM#E z!Tp{9joS2zDkQNd!a2~WX<5)hH^)mvv(p;v7)|cxj*cfLG)v@~FfEPIgF4uYljQV1 z%R|gLI7yH=P0{4j)buSX0s>sLBuU>xM7fCez|WH-U)o$`GxL(oIGrOib=(2m4kcz^ zlE_o8DU&S8-9u03_Q1;%pivv?5xfDJ+(0Y&zxnpn6&%JbPrqX|R;2KiI`wtOB`urk zH4B*G`^>7gd>ZD=EoyG-jNWQlj5@U8hi{s$ZBx_N3AJz2J6n|6x@}cGoq&YtyR03~ zjYYgxb!6A;BPZ51{Tu-ci4Hi~N(il^1{>X{WGj1j{( zyil%M4TD+KGmjDuK}bM6!7q*j+kvvXi#8KqL5beQoj5|@2@hll7=Vk+s{E4bqW22| zyMkH{vEy-&ip7IZKYG8?Fr13dT5a06b*p4kYHpQ$*R?CRY2$X~vQ@2kmQPDf!`wFN z)T?~bzSQu11At)fY`N~X7xB`_Q?q@LTD2|DH(jT>#&}u11?0UBtc!wdWiJ49e|hM?dU}Ttish! z_CGb%hr4==KW(Ti3BaTtPgRj+fgi}Lw&7HXvBr3+&H{M~ur7LbGPp*be@wcF&A|q* zN+>{|vXy)&)or&L3a%H6P;ahG4YHU0WB|vK{ly16KBTPV1^JqeuOGh_~8_gzdkTA1l5kec5({$Nk z>`@TokVl2T#+JY($HMy+_)x?c504|Pbkn>KP_i5KKha_^J%&OI3q$n(*bGu;y7E9y zbz?&rNhxlpGG}I-ADn-9y_Y`GPoEefoGcBL`ES?1S$}kW z*L$?yQ%?1jQ-N~opJ5zHg+QDS3X45)sV^>pFgEc1yQA-5;asqA?zhD6t>AM#Sh&$! zxY1v@@%4K5!~5@nYHkzr2cmufyqB%?vz2a!$279I)DxHcA_Rl+2LmY=EL;c*YdvYL rdu6DMWhT7VFc&H;!`N4X3xtmX?G*Xevx)FSJ{%#4hTAEX$Bv@Zx~H}HaB5erZp E0244scmMzZ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.linalg.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.linalg.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d40aadf86eb589f9dc46dcd6d78d9f27ab37500 GIT binary patch literal 278 zcmZ3^%ge<81gF(}(kq!57#@Q-FaYF(!Dl`oHJu@aA%!uWDT*P5DVRZ%xk{oqIkTWr zFDElEF(+Lwxw0f9KQBHhC$YFn3Y$z$VnJeZwx1^BE#8dGl$6xG%-n+fqLSj344*-k z{EBe5ipfjNjVUQAtxU};EY!_OO-;_wEy>T%i789XD~s{TOo}PaEJ@V`nUk2FS{xHl z>6uqtl9-c|TBM(mpPyX}CUsG4FR1**VUwGmQks)$SHuRih!Kd3#el>IW=2NF4^j+5 TIu~?3F9>)w@Pc3w3s4FGdty|& literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.sparse.csgraph.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.sparse.csgraph.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34e2c6b6e1e7ef06fefc3393c8cde9780241f213 GIT binary patch literal 261 zcmZ3^%ge<81gF(}(vz7O7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfjnP6enjERO%HM zBo-B?>LnMa7bO;C=*5>M=47TMmSpDV`DrrV;?2lRNlDGi%q_?-Dk)yc@EK&_uLO6i zn7qW?n3AH>%GA8VLfxFy)Z`4^lKlLfn6lKovKXJtq?qE&l2qM-#N_P6^wi>*fJ)E2 z;*!LioYW%yjQsrUVlb(T)eQxezc_4i^HWN5QtgV^fEI$hQ7jB3J}@&fGJcR^5Hh(S NVA8+~f<-JqaRA0BPEh~= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.spatial.transform.rotation.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.spatial.transform.rotation.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39e1c008200c4603fc3d9913c30a557929124bcb GIT binary patch literal 444 zcmZ`#ze@u#6i#|AR-uB>qHbL*cDVQhbP%m}QlX0ARu0N}iFcv7GjCd975|fWb$j<8NC4{A6SS!*fgz&GQT}z>t9u zb|C}>Kp-x>KmguN%pptI@?p1ti}xUlX6ZL8G~r~!3y9b6NivA3Bq8B?w5~iFCH2-> z{Qw=K{n2jDk&0YRU52!Dxq1{bL_I0A(FE`LQpAzEZCaDfyX2ZH?J`CriZx{l1w!utliE?3O3KftyO=>bL)|3CjpCJAg zFP^>n2Nt}DC)0IT^x_LVW&+8)_vW$P_KCxD=eSs%CFHGXCh*3^`+_STNKVd4?iJp- zmrwP{`t;q0f1>k&1j@C(qLRX>WoN-})D_e72ja;iBW!C8uWhJ2mg$$kU(7&7i_UNQT zVHm>c`qXPHNphVf$!nX7JO||-X@mBOyf-m^7Kb~rVr7hGP=mU@4kSRv1Jqi^H=u6f zW0A&IAOsc5u2=y!?$t-iB9qeDXd<>F4*tp4Ir^O2Ek|4FnwFc}?9eVd8cutjH(Y9Y VGego)hb*qVEUetOn`7MS$rtrErxE}F literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.special._ufuncs.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.special._ufuncs.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f83b261976795b63fca6c2e1bd7dfbdb5b52f777 GIT binary patch literal 587 zcmZvY%}T>S5XWbmSgR2HqE-)rCozYtiXRnGuOg@j-Xu_CcH1s)lbB6P(^KEVH&Db! z@sffE>D7~-0^U5i+g8xx?9MRD{&xO5^I#a0AnkeOr1qf$ys5*FX~X36N+x$efFKSH zbcqml)7~*@_lYMsn@hm*tIQKM6JMaZ=4zx_AiySe*J#5M!q*_83)N% zVSg~6!*D_>s?m!?hD<{UWeb3IQz-x5SpjCPblU0|GSf?`HlLPOyPEl;nHeCo_NvdM l^Hy5KT^)B$v;03yxzB8;#htFc(>Ya3$(7anayTy4zX3cet5N^} literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.stats._stats.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-scipy.stats._stats.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..423eb5b34da9eaeffc0249f167bd911029973bac GIT binary patch literal 413 zcmYjNJxc>I7=CkS@dGLd6&)P9SmgliC-3{_eG>9M4|y(^S3u*f*6ci30N;lE!=5#hece0)0fIP0 zsD%(%KoPN?5WuU>KZp{sJE&!mg&QzgFa4N{IvTA7Aq~21L349c&dG%ajJp=Qzk!n8fWFy{g-zjqCg(mdfXx3Y;m%B@UCMD}`}6Du;{^8nY-( zgpw~XG0M~1^J6deBTtDer*W_6a7u&FQAxtRK8^cclihieDe9zt(Dgf1dUGl}#r&c= zGk3~Y61TMry`}kd=_E=>#%V(=YdP}~@=TYpjSw1d0y-LkJ0D+mWvF9)``xa6*tIbr Wn-tsO3%FFl0=}sBE8a*%$#DqjQsrU;v$eEi&%ifEmn|e z#kY7fGE-7g^D=V_@{3A}S2BDCS^6u;-6|$8F*l~9sI)RQudq-zCp9%WL$@S9KPRRv zHLonjCo?IgII|>Gw;(Y&J25@AI0nf^eXw0%QWxSTy@JYL95xV#+7t_XzIK`b literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools._vendor.importlib_metadata.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools._vendor.importlib_metadata.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a3fbf6c5be28888ee3aceb0212055437831405d GIT binary patch literal 735 zcmZXRzi$&U6vv-02{a{Xkzha!B?74;k?xMELRFLr0fh>X7!c9H>3VjOYwuTVr&3TV zWnf_F08<&63aA4s{{u@ZbwDREF|h@ODHG3^rU}Bn`}#fm+3(}$kHz95VEeYZ*=%M3 zeky0$v{PeLMdJV{P~t;fjhasat*#NEnb*Ly?aXw`9XLeuXzD^eOUY9xXMd@gM`e;M z3nn|Uj3QsyUf76Sauy444sCVR=q}0uG@%DCRxHHWBYT>hi`+ij)FTuQG2&-38^bCvx2ba8)4u` zw^hz0nsF;x5ZtvxCtyjQG9gn_DBe=3G;ZHpw{Xppywhc2yRG|-xh-AY)WVFr)~2^* z2~RRTcHAAO$%OT!yAcZM_&(!iD~fhRs``x8IAt~dXEoyPc(Ljut{Vk$jjLC@jK6q* z(uX0CyhG;o_{Q3Y+n=8QC|ufq{Qmx6_2qHFJ}KD4j0${n^X`u}63slyf|X zLvno%*yu>l7eDw{sMKW#zz1E literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools._vendor.jaraco.text.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-setuptools._vendor.jaraco.text.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86a2beb3a8c9acc592e96ad71b9ecbe9dfdfd41f GIT binary patch literal 709 zcmY+Bzi$&U6vv;P29lCc5DQ``5tS+uDR)c=RZ%7cltwKQ10p&U9cL%G^nRqaQxTL( z85kHkz*IJv3RMSI{s)#+>VQsSVqyylQzo7-O%tB)zJ9i!pFhw3oXsu*+V|B;<6{Eg zmmW-wo;jluItRdj5f7@mrylWXl@efyH^6BNcTVg+9HMhP9YS@1k*APf_^oF)^CVi5 zTy@$i3_V$MgL>$Y^H_ij=<8IY2Pg;7fF8V9wh&{F>`^rr**f3UBMc5P;&=)RUvKnC zkJjmXx_=XoCa+ft1#@<)S=;3S3x(OTh3$l<;;)ohK(dSVz_*pt%qJph+=)_BIJLm` zd6Z^cs@RnpE|<%VTMySPT(gwuba}9|Q}j4@nnhifh3R*#iu=-%uHwbE?QGi(F0Cis z^*}1y^SCgZVYn@0EzZD@-5oEMJXb0w^xI{j-|8y<@-a#uhCtGrWL{5J z?tZ%W<@wLdwf(IRj|Qt7Cz;A=rZP*~vw6R%5oZqoh`O1mY4diZseNRq{jD@pxHW!J&RXxq*T-gbc3(S?XWb g?FWDsdi=byOVzp?g{y2Xe6135*6qjr{anq$)Rsx}e4YF>KLp-+87RKnc4B9ambPxi;jkMIQZMl-1)jj2~ zKcKhuICj_v+kdi4S^_IN4R-3y&|6QFoVv-LrRVqY)9<|}^tD_r0VTg4ZT49efWO+w z#k@8yr7}JO3^4RT0NW61+whIRY?~1DK^tKcqrTC$2;3{=$9YkC#oS{xVtul6Z}yL^ zFA#tqYEMKn;=*Uxo+IX7)}4;y;(nH9C1R=g`~(ZYQ5gVL*WA06N7$mOtD+O(3mJYP z_a}I4zXADf&Ryta6Usu529Yb2RpCU$k)YJ)T`zn`kM3fRi&%I*cN8daL+tFto{zia zP#n#moq!K|vcMDW(|*&Gg(wk(3u%RM5GB&aw3o3ojf)Lclo?9BYF6a@>*Qs~h3or- zF@5o}F%xknm3JxK=gzb>hBVN^u5h_5?|K-M&j2&#fqS#-9ITK2Uw`b<&`ND!HO^5jEuyM1ET;80u>L>M6)EJ}22sKh0EgC7v)v%H}${CwWCvVTp<&n9p u4jp&LwUtw}GThR(hp Lzzc#!EI=s$VfRO# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-shiboken6.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-shiboken6.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43a1f5752036d27e843ade0200941d21f84e90e9 GIT binary patch literal 384 zcmZ3^%ge<81gF(}(*H3rFgylvU;xMmgU>cVYC1y-LkeRKLoQNns9VfMHFRmmq0P##?O3`MCv&CAT;$DvC>!N-7Id{WMu`aR*d- z<`tJD=H#Rn6@g5;#gSPYUr=dmXmpDW$STjwyTzN4nUa#4mzi6TUsO`OlHoJR#9yKA zRxx>rxiKY0rIo39g@w8~sj0~sx+VGfIWc9ad1Wy^nMpClnI);Z1&PVoiRr1uF-Ugl zXXNK+7lTRN;*89s{Or^`GrfY!UmP~M`6;D2sdhy?KwB7rxY!p+d|+l|Wc(n(z$kx# rK@J&x;9y|kYO(*oz{sdH!)%T%m~lf?VS;Z17=kn^fdvsn5h&mR+bC(| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-sphinx.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-sphinx.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e527ded6b8021bb734aca72562ca000b3a595ff GIT binary patch literal 923 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-sqlite3.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-sqlite3.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd436ee97e24c8977c044703a6151891002eba85 GIT binary patch literal 531 zcmZ8dze~eF6n>Z38k$C=AUaf`9i#zM2SGuki-HJ6gl;7wY42!*`PJM-sgsj~2#$7i zQp7*SrImsuli=hQaFI@4YXjED-MjB`-*?}8_oyf-;PJ9rZfGLF$Eb*7W&*yhIJg50 z7+GMWDnihJsvrPCSa?7H&wT&J9vrV#MIzqE+W2C8VsV;H7l?45n4(My@{ft&M#D1| zP!pdchKj;W-L))IXD2kM*)9$&Lc>|wvP?!cF47ZFWQ4LqH5o1*wGSN13@-7D0W&RH zY`X3#_4&*YDoqn(;+VGQ`izDme=kgNHZRUi)(n$|=Me`#!Pm%qSlQp!9mCd{AGC?n zYH1cB^`^#L*V503bEcQgnofBmnrGBcjRv9mAN%#O@i=R7n_hb;?fgzr@)hne`cP`~ z6p09-XbI3(7dHQ{_xa4F5+xzM(v_DxW=}5k%Y-U6c1sqJ@vNWC3xzr?MmMpzPvZ{c|Vw&T5S%r{aoGm8z#W7JSoih z7d$W>Tmu1u7<7QbDJl?B>f<~Xm|!1uO4eTrcW?rsAAA=QKQb_JdmFe=UNnsyEUo5OFrg4n^x=$FtYv=6UtVylk8*_eLtJcLz&e)Qn4z_|1E7=6y4~@4b1`v>g!mI;^%nRe*1q{6XYP%o}2R0RjZs z;Gi0El$wG-0jdz?6#;w*k5I#cMFg+1EJh`-5OtLwY5+A%Hts=scJoIT$tq#oG~Bx7 zbUfzQ9gp;E8t$8(ZBx^)^IjvO_%QWkxo4-QKj=`NH$6u4(K%GjX44ub*RKVAn^nWq z-Js%f-w+j9zUNyu&$m7AkuxmxnH)RR+7=>7o9#h76T}XJOko@=PGZH8HpPhmC!Qb1I6cAX86Z?fQ#BqWkE9)6j+3QH UvNTppqZ_%TLK#KR*tU@T1*MsplmGw# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-xml.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-xml.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1d1c51687a3a9dd357b0acac2740f7c59926128 GIT binary patch literal 255 zcmZ3^%ge<81gF(}(k+=77#@Q-FaYF(!Dl`oHJu@aA%!uWDT*P5DVRZ%xk|7iH%G5H zu|f|>7o{eqq!v{P!-P^R3KB~of_|Eew|Fx$Q&Lj%GII;^i%N=DGJFOZ`^(?mDkd*6 zH>RYhv@$iXuuwNAH8nXywRF+H_7CZN(Yuec;J zCnvQ?KO;XsyBJLBf~+m5{Ka9Do1apelWJGQ1~i`$h>OL5#0O?ZM#c{k3__|G)T}QE N*fj8hU=a&Y3IGu%OBw(G literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-xml.dom.domreg.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-xml.dom.domreg.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1601fc4ef555b0a7a56c08702c177c599170427 GIT binary patch literal 238 zcmZ3^%ge<81gF(}(k+=77#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfjptSLEjCrR3-8 zY-D=gH_Nli`8 z&@IW&&xt8Z%`1!X$xMnV&MZmQEl5nxPE1cNjtQvr%quQQ%*jbD($C1x&n^a&x-ct& z))l3u>lIY~;;_lhPbtkwwJTx+S_N`%u`rPMz|6?V_(6(6Ncn<*asw|27O?=u0qy}r AhX4Qo literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-xml.etree.cElementTree.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/__pycache__/hook-xml.etree.cElementTree.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dec96f66a56fe30f952db92be363b420f1ca8330 GIT binary patch literal 252 zcmZ3^%ge<81gF(}($kq37#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfjoaR^;aBrIr+> zrs}!oq~@mPm4pD9Z z@zZ3y#h+S{oKu>Tnv$7YkY7|%yprKFNb9dCcdMAZ#N3#YqSDILyuw1=oYd6h4Be9a z{G6Dw)V#77pUk9~;>?m%-GapA?8Nlc;+TL+&%EN2#GIVeBK?f~{On>dsaus_kgAuN zSCU$kmYAHXS5Wzj!zMRBr8Fniu819I709W@LO|jJGb1D82MGodxd}QA{2*Aw3KRwa Dsa8Wd literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.Image.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.Image.py new file mode 100644 index 0000000..1d9e029 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.Image.py @@ -0,0 +1,17 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This hook was tested with Pillow 2.9.0 (Maintained fork of PIL): https://pypi.python.org/pypi/Pillow + +from PyInstaller.utils.hooks import collect_submodules + +# Include all PIL image plugins - module names containing 'ImagePlugin'. e.g. PIL.JpegImagePlugin +hiddenimports = collect_submodules('PIL', lambda name: 'ImagePlugin' in name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.ImageFilter.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.ImageFilter.py new file mode 100644 index 0000000..528694b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.ImageFilter.py @@ -0,0 +1,13 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# Only used if installed, not mean to pull in numpy. +excludedimports = ["numpy"] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.SpiderImagePlugin.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.SpiderImagePlugin.py new file mode 100644 index 0000000..1b6466f --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.SpiderImagePlugin.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# PIL's SpiderImagePlugin features a tkPhotoImage() method, which imports ImageTk (and thus brings in the whole Tcl/Tk +# library). Assume that if people are really using tkinter in their application, they will also import it directly. +excludedimports = ['tkinter'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.py new file mode 100644 index 0000000..b7a6849 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PIL.py @@ -0,0 +1,21 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This hook was tested with Pillow 2.9.0 (Maintained fork of PIL): +# https://pypi.python.org/pypi/Pillow + +# Ignore tkinter to prevent inclusion of Tcl/Tk library and other GUI libraries. Assume that if people are really using +# tkinter in their application, they will also import it directly and thus PyInstaller bundles the right GUI library. +excludedimports = ['tkinter', 'PyQt5', 'PySide2', 'PyQt6', 'PySide6'] + +# Similarly, prevent inclusion of IPython, which in turn ends up pulling in whole matplotlib, along with its optional +# GUI library dependencies. +excludedimports += ['IPython'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QAxContainer.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QAxContainer.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QAxContainer.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qsci.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qsci.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qsci.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt.py new file mode 100644 index 0000000..3520f3c --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt.py @@ -0,0 +1,29 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# When PyQt5.Qt is imported it implies the import of all PyQt5 modules. See +# http://pyqt.sourceforge.net/Docs/PyQt5/Qt.html. +import os + +from PyInstaller.utils.hooks import get_module_file_attribute + +# Only do this if PyQt5 is found. +mfi = get_module_file_attribute('PyQt5') +if mfi: + # Determine the name of all these modules by looking in the PyQt5 directory. + hiddenimports = [] + for f in os.listdir(os.path.dirname(mfi)): + root, ext = os.path.splitext(os.path.basename(f)) + if root.startswith('Qt') and root != 'Qt': + # On Linux and OS X, PyQt 5.14.1 has a ``.abi3`` suffix on all library names. Remove it. + if root.endswith('.abi3'): + root = root[:-5] + hiddenimports.append('PyQt5.' + root) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DAnimation.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DAnimation.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DAnimation.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DCore.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DCore.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DCore.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DExtras.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DExtras.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DExtras.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DInput.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DInput.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DInput.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DLogic.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DLogic.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DLogic.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DRender.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DRender.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.Qt3DRender.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtBluetooth.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtBluetooth.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtBluetooth.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtChart.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtChart.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtChart.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtCore.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtCore.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtCore.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtDBus.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtDBus.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtDBus.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtDataVisualization.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtDataVisualization.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtDataVisualization.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtDesigner.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtDesigner.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtDesigner.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtGui.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtGui.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtGui.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtHelp.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtHelp.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtHelp.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtLocation.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtLocation.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtLocation.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtMacExtras.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtMacExtras.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtMacExtras.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtMultimedia.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtMultimedia.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtMultimedia.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtMultimediaWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtMultimediaWidgets.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtMultimediaWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtNetwork.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtNetwork.py new file mode 100644 index 0000000..1c8cc67 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtNetwork.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies, pyqt5_library_info + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) +binaries += pyqt5_library_info.collect_qtnetwork_files() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtNetworkAuth.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtNetworkAuth.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtNetworkAuth.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtNfc.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtNfc.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtNfc.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtOpenGL.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtOpenGL.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtOpenGL.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtPositioning.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtPositioning.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtPositioning.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtPrintSupport.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtPrintSupport.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtPrintSupport.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtPurchasing.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtPurchasing.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtPurchasing.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQml.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQml.py new file mode 100644 index 0000000..718d323 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQml.py @@ -0,0 +1,17 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies, pyqt5_library_info + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) +qml_binaries, qml_datas = pyqt5_library_info.collect_qtqml_files() +binaries += qml_binaries +datas += qml_datas diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuick.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuick.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuick.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuick3D.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuick3D.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuick3D.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuickWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuickWidgets.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtQuickWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtRemoteObjects.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtRemoteObjects.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtRemoteObjects.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtScript.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtScript.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtScript.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSensors.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSensors.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSensors.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSerialPort.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSerialPort.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSerialPort.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSql.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSql.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSql.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSvg.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSvg.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtSvg.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtTest.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtTest.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtTest.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtTextToSpeech.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtTextToSpeech.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtTextToSpeech.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebChannel.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebChannel.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebChannel.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngine.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngine.py new file mode 100644 index 0000000..7b67e1b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngine.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngineCore.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngineCore.py new file mode 100644 index 0000000..f575e0d --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngineCore.py @@ -0,0 +1,22 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import \ + add_qt5_dependencies, pyqt5_library_info + +# Ensure PyQt5 is importable before adding info depending on it. +if pyqt5_library_info.version is not None: + hiddenimports, binaries, datas = add_qt5_dependencies(__file__) + + # Include helper process executable, translations, and resources. + webengine_binaries, webengine_datas = pyqt5_library_info.collect_qtwebengine_files() + binaries += webengine_binaries + datas += webengine_datas diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngineWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngineWidgets.py new file mode 100644 index 0000000..7b67e1b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebEngineWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebKit.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebKit.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebKit.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebKitWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebKitWidgets.py new file mode 100644 index 0000000..7b67e1b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebKitWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebSockets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebSockets.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWebSockets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWidgets.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWinExtras.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWinExtras.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtWinExtras.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtX11Extras.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtX11Extras.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtX11Extras.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtXml.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtXml.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtXml.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtXmlPatterns.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtXmlPatterns.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.QtXmlPatterns.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.py new file mode 100644 index 0000000..2325577 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.py @@ -0,0 +1,29 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import pyqt5_library_info, ensure_single_qt_bindings_package + +# Allow only one Qt bindings package to be collected in frozen application. +ensure_single_qt_bindings_package("PyQt5") + +# Only proceed if PyQt5 can be imported. +if pyqt5_library_info.version is not None: + hiddenimports = [ + # PyQt5.10 and earlier uses sip in an separate package; + 'sip', + # PyQt5.11 and later provides SIP in a private package. Support both. + 'PyQt5.sip', + # Imported via __import__ in PyQt5/__init__.py + 'pkgutil', + ] + + # Collect required Qt binaries. + binaries = pyqt5_library_info.collect_extra_binaries() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.uic.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.uic.py new file mode 100644 index 0000000..e4474dd --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt5.uic.py @@ -0,0 +1,17 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_data_files + +# We need to include modules in PyQt5.uic.widget-plugins, so they can be dynamically loaded by uic. They should be +# included as separate (data-like) files, so they can be found by os.listdir and friends. However, as this directory +# is not a package, refer to it using the package (PyQt5.uic) followed by the subdirectory name (``widget-plugins/``). +datas = collect_data_files('PyQt5.uic', True, 'widget-plugins') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QAxContainer.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QAxContainer.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QAxContainer.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qsci.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qsci.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qsci.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DAnimation.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DAnimation.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DAnimation.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DCore.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DCore.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DCore.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DExtras.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DExtras.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DExtras.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DInput.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DInput.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DInput.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DLogic.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DLogic.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DLogic.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DRender.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DRender.py new file mode 100644 index 0000000..58ac06d --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.Qt3DRender.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) + +hiddenimports += ["PyQt6.QtOpenGL"] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtBluetooth.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtBluetooth.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtBluetooth.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtCharts.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtCharts.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtCharts.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtCore.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtCore.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtCore.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtDBus.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtDBus.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtDBus.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtDataVisualization.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtDataVisualization.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtDataVisualization.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtDesigner.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtDesigner.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtDesigner.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtGui.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtGui.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtGui.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtHelp.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtHelp.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtHelp.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtMultimedia.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtMultimedia.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtMultimedia.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtMultimediaWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtMultimediaWidgets.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtMultimediaWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtNetwork.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtNetwork.py new file mode 100644 index 0000000..c780c7c --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtNetwork.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies, pyqt6_library_info + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) +binaries += pyqt6_library_info.collect_qtnetwork_files() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtNetworkAuth.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtNetworkAuth.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtNetworkAuth.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtNfc.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtNfc.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtNfc.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtOpenGL.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtOpenGL.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtOpenGL.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtOpenGLWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtOpenGLWidgets.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtOpenGLWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPdf.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPdf.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPdf.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPdfWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPdfWidgets.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPdfWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPositioning.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPositioning.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPositioning.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPrintSupport.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPrintSupport.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtPrintSupport.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQml.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQml.py new file mode 100644 index 0000000..024696a --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQml.py @@ -0,0 +1,17 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies, pyqt6_library_info + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) +qml_binaries, qml_datas = pyqt6_library_info.collect_qtqml_files() +binaries += qml_binaries +datas += qml_datas diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuick.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuick.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuick.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuick3D.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuick3D.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuick3D.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuickWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuickWidgets.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtQuickWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtRemoteObjects.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtRemoteObjects.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtRemoteObjects.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSensors.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSensors.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSensors.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSerialPort.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSerialPort.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSerialPort.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSpatialAudio.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSpatialAudio.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSpatialAudio.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSql.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSql.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSql.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSvg.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSvg.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSvg.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSvgWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSvgWidgets.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtSvgWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtTest.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtTest.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtTest.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtTextToSpeech.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtTextToSpeech.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtTextToSpeech.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebChannel.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebChannel.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebChannel.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineCore.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineCore.py new file mode 100644 index 0000000..a749a7c --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineCore.py @@ -0,0 +1,27 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import \ + add_qt6_dependencies, pyqt6_library_info + +# Ensure PyQt6 is importable before adding info depending on it. +if pyqt6_library_info.version is not None: + # Qt6 prior to 6.2.2 contains a bug that makes it incompatible with the way PyInstaller collects + # QtWebEngine shared libraries and resources. So exit here and now instead of producing a defunct build. + if pyqt6_library_info.version < [6, 2, 2]: + raise SystemExit("Error: PyInstaller's QtWebEngine support requires Qt6 6.2.2 or later!") + + hiddenimports, binaries, datas = add_qt6_dependencies(__file__) + + # Include helper process executable, translations, and resources. + webengine_binaries, webengine_datas = pyqt6_library_info.collect_qtwebengine_files() + binaries += webengine_binaries + datas += webengine_datas diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineQuick.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineQuick.py new file mode 100644 index 0000000..19083de --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineQuick.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineWidgets.py new file mode 100644 index 0000000..19083de --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebEngineWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebSockets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebSockets.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWebSockets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWidgets.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtXml.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtXml.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.QtXml.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.py new file mode 100644 index 0000000..b9e2f51 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.py @@ -0,0 +1,26 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import pyqt6_library_info, ensure_single_qt_bindings_package + +# Allow only one Qt bindings package to be collected in frozen application. +ensure_single_qt_bindings_package("PyQt6") + +# Only proceed if PyQt6 can be imported. +if pyqt6_library_info.version is not None: + hiddenimports = [ + 'PyQt6.sip', + # Imported via __import__ in PyQt6/__init__.py + 'pkgutil', + ] + + # Collect required Qt binaries. + binaries = pyqt6_library_info.collect_extra_binaries() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.uic.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.uic.py new file mode 100644 index 0000000..7744cbc --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PyQt6.uic.py @@ -0,0 +1,17 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_data_files + +# We need to include modules in PyQt6.uic.widget-plugins, so they can be dynamically loaded by uic. They should be +# included as separate (data-like) files, so they can be found by os.listdir and friends. However, as this directory +# is not a package, refer to it using the package (PyQt6.uic) followed by the subdirectory name (``widget-plugins/``). +datas = collect_data_files('PyQt6.uic', True, 'widget-plugins') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DAnimation.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DAnimation.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DAnimation.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DCore.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DCore.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DCore.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DExtras.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DExtras.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DExtras.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DInput.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DInput.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DInput.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DLogic.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DLogic.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DLogic.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DRender.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DRender.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qt3DRender.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtAxContainer.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtAxContainer.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtAxContainer.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtCharts.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtCharts.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtCharts.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtConcurrent.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtConcurrent.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtConcurrent.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtCore.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtCore.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtCore.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtDataVisualization.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtDataVisualization.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtDataVisualization.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtGui.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtGui.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtGui.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtHelp.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtHelp.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtHelp.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtLocation.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtLocation.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtLocation.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtMacExtras.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtMacExtras.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtMacExtras.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtMultimedia.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtMultimedia.py new file mode 100644 index 0000000..1f3f908 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtMultimedia.py @@ -0,0 +1,19 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) + +# Using PySide2 true_properties ("from __feature__ import true_properties") causes a hidden dependency on +# QtMultimediaWidgets python module: +# https://github.com/qtproject/pyside-pyside-setup/blob/5.15.2/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py#L577-L586 +hiddenimports += ['PySide2.QtMultimediaWidgets'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtMultimediaWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtMultimediaWidgets.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtMultimediaWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtNetwork.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtNetwork.py new file mode 100644 index 0000000..4e62091 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtNetwork.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies, pyside2_library_info + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) +binaries += pyside2_library_info.collect_qtnetwork_files() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtOpenGL.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtOpenGL.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtOpenGL.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtOpenGLFunctions.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtOpenGLFunctions.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtOpenGLFunctions.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtPositioning.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtPositioning.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtPositioning.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtPrintSupport.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtPrintSupport.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtPrintSupport.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQml.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQml.py new file mode 100644 index 0000000..a9f7162 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQml.py @@ -0,0 +1,19 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies, pyside2_library_info + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) +qml_binaries, qml_datas = pyside2_library_info.collect_qtqml_files() +binaries += qml_binaries +datas += qml_datas + +hiddenimports += ["PySide2.QtGui"] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQuick.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQuick.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQuick.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQuickControls2.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQuickControls2.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQuickControls2.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQuickWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQuickWidgets.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtQuickWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtRemoteObjects.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtRemoteObjects.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtRemoteObjects.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtScript.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtScript.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtScript.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtScriptTools.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtScriptTools.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtScriptTools.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtScxml.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtScxml.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtScxml.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSensors.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSensors.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSensors.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSerialPort.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSerialPort.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSerialPort.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSql.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSql.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSql.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSvg.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSvg.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtSvg.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtTest.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtTest.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtTest.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtTextToSpeech.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtTextToSpeech.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtTextToSpeech.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtUiTools.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtUiTools.py new file mode 100644 index 0000000..9f47776 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtUiTools.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) +hiddenimports += ['PySide2.QtXml'] # Not inferred from dynamic lib analysis diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebChannel.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebChannel.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebChannel.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngine.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngine.py new file mode 100644 index 0000000..7b67e1b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngine.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngineCore.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngineCore.py new file mode 100644 index 0000000..afb578e --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngineCore.py @@ -0,0 +1,22 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import \ + add_qt5_dependencies, pyside2_library_info + +# Ensure PySide2 is importable before adding info depending on it. +if pyside2_library_info.version is not None: + hiddenimports, binaries, datas = add_qt5_dependencies(__file__) + + # Include helper process executable, translations, and resources. + webengine_binaries, webengine_datas = pyside2_library_info.collect_qtwebengine_files() + binaries += webengine_binaries + datas += webengine_datas diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngineWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngineWidgets.py new file mode 100644 index 0000000..7b67e1b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebEngineWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebKit.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebKit.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebKit.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebKitWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebKitWidgets.py new file mode 100644 index 0000000..7b67e1b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebKitWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebSockets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebSockets.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWebSockets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWidgets.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWinExtras.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWinExtras.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtWinExtras.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtX11Extras.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtX11Extras.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtX11Extras.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtXml.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtXml.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtXml.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtXmlPatterns.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtXmlPatterns.py new file mode 100644 index 0000000..51258b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.QtXmlPatterns.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt5_dependencies + +hiddenimports, binaries, datas = add_qt5_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qwt5.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qwt5.py new file mode 100644 index 0000000..57f3c22 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.Qwt5.py @@ -0,0 +1,31 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller import isolated + +hiddenimports = ['PySide2.QtCore', 'PySide2.QtWidgets', 'PySide2.QtGui', 'PySide2.QtSvg'] + + +@isolated.decorate +def conditional_imports(): + from PySide2 import Qwt5 + + out = [] + if hasattr(Qwt5, "toNumpy"): + out.append("numpy") + if hasattr(Qwt5, "toNumeric"): + out.append("numeric") + if hasattr(Qwt5, "toNumarray"): + out.append("numarray") + return out + + +hiddenimports += conditional_imports() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.py new file mode 100644 index 0000000..aa7a714 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide2.py @@ -0,0 +1,25 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import pyside2_library_info, ensure_single_qt_bindings_package + +# Allow only one Qt bindings package to be collected in frozen application. +ensure_single_qt_bindings_package("PySide2") + +# Only proceed if PySide2 can be imported. +if pyside2_library_info.version is not None: + hiddenimports = ['shiboken2', 'inspect'] + if pyside2_library_info.version < [5, 15]: + # The shiboken2 bootstrap in earlier releases requires __future__ in addition to inspect + hiddenimports += ['__future__'] + + # Collect required Qt binaries. + binaries = pyside2_library_info.collect_extra_binaries() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DAnimation.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DAnimation.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DAnimation.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DCore.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DCore.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DCore.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DExtras.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DExtras.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DExtras.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DInput.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DInput.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DInput.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DLogic.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DLogic.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DLogic.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DRender.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DRender.py new file mode 100644 index 0000000..2bb9b83 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.Qt3DRender.py @@ -0,0 +1,20 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies, pyside6_library_info + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) + +# In PySide 6.7.0, Qt3DRender module added a reference to QtOpenGL type system. The hidden import is required on +# Windows, while on macOS and Linux we seem to pick it up automatically due to the corresponding Qt shared library +# appearing among binary dependencies. Keep it around on all OSes, though - just in case this ever changes. +if pyside6_library_info.version is not None and pyside6_library_info.version >= [6, 7]: + hiddenimports += ['PySide6.QtOpenGL'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtAxContainer.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtAxContainer.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtAxContainer.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtBluetooth.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtBluetooth.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtBluetooth.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtCharts.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtCharts.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtCharts.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtConcurrent.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtConcurrent.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtConcurrent.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtCore.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtCore.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtCore.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtDBus.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtDBus.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtDBus.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtDataVisualization.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtDataVisualization.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtDataVisualization.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtDesigner.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtDesigner.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtDesigner.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtGraphs.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtGraphs.py new file mode 100644 index 0000000..00941c0 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtGraphs.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtGraphsWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtGraphsWidgets.py new file mode 100644 index 0000000..91ae027 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtGraphsWidgets.py @@ -0,0 +1,17 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) + +# These dependencies cannot seem to be inferred from linked libraries. +hiddenimports += ['PySide6.QtQuickWidgets', 'PySide6.QtGraphs'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtGui.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtGui.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtGui.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtHelp.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtHelp.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtHelp.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtHttpServer.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtHttpServer.py new file mode 100644 index 0000000..790cb11 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtHttpServer.py @@ -0,0 +1,18 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) + +# This seems to be necessary on Windows; on other OSes, it is inferred automatically because the extension is linked +# against the Qt6Concurrent shared library. +hiddenimports += ['PySide6.QtConcurrent'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtLocation.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtLocation.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtLocation.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtMultimedia.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtMultimedia.py new file mode 100644 index 0000000..0c2d31b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtMultimedia.py @@ -0,0 +1,19 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) + +# Using PySide6 true_properties ("from __feature__ import true_properties") causes a hidden dependency on +# QtMultimediaWidgets python module: +# https://github.com/qtproject/pyside-pyside-setup/blob/v6.2.2.1/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/mapping.py#L614-L627 +hiddenimports += ['PySide6.QtMultimediaWidgets'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtMultimediaWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtMultimediaWidgets.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtMultimediaWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtNetwork.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtNetwork.py new file mode 100644 index 0000000..a216ecd --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtNetwork.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies, pyside6_library_info + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) +binaries += pyside6_library_info.collect_qtnetwork_files() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtNetworkAuth.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtNetworkAuth.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtNetworkAuth.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtNfc.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtNfc.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtNfc.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtOpenGL.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtOpenGL.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtOpenGL.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtOpenGLWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtOpenGLWidgets.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtOpenGLWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPdf.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPdf.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPdf.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPdfWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPdfWidgets.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPdfWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPositioning.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPositioning.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPositioning.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPrintSupport.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPrintSupport.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtPrintSupport.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQml.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQml.py new file mode 100644 index 0000000..8b6837d --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQml.py @@ -0,0 +1,17 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies, pyside6_library_info + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) +qml_binaries, qml_datas = pyside6_library_info.collect_qtqml_files() +binaries += qml_binaries +datas += qml_datas diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuick.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuick.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuick.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuick3D.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuick3D.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuick3D.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuickControls2.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuickControls2.py new file mode 100644 index 0000000..b405fc6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuickControls2.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) + +hiddenimports += ['PySide6.QtQuick'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuickWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuickWidgets.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtQuickWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtRemoteObjects.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtRemoteObjects.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtRemoteObjects.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtScxml.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtScxml.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtScxml.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSensors.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSensors.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSensors.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSerialBus.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSerialBus.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSerialBus.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSerialPort.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSerialPort.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSerialPort.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSpatialAudio.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSpatialAudio.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSpatialAudio.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSql.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSql.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSql.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtStateMachine.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtStateMachine.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtStateMachine.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSvg.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSvg.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSvg.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSvgWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSvgWidgets.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtSvgWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtTest.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtTest.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtTest.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtTextToSpeech.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtTextToSpeech.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtTextToSpeech.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtUiTools.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtUiTools.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtUiTools.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebChannel.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebChannel.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebChannel.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineCore.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineCore.py new file mode 100644 index 0000000..1889c0c --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineCore.py @@ -0,0 +1,29 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import \ + add_qt6_dependencies, pyside6_library_info + +# Ensure PySide6 is importable before adding info depending on it. +if pyside6_library_info.version is not None: + # Qt6 prior to 6.2.2 contains a bug that makes it incompatible with the way PyInstaller collects + # QtWebEngine shared libraries and resources. So exit here and now instead of producing a defunct build. + if pyside6_library_info.version < [6, 2, 2]: + raise SystemExit("Error: PyInstaller's QtWebEngine support requires Qt6 6.2.2 or later!") + + hiddenimports, binaries, datas = add_qt6_dependencies(__file__) + + # Include helper process executable, translations, and resources. + webengine_binaries, webengine_datas = pyside6_library_info.collect_qtwebengine_files() + binaries += webengine_binaries + datas += webengine_datas + + hiddenimports += ['PySide6.QtPrintSupport'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineQuick.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineQuick.py new file mode 100644 index 0000000..19083de --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineQuick.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineWidgets.py new file mode 100644 index 0000000..19083de --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebEngineWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebSockets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebSockets.py new file mode 100644 index 0000000..49d27d6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWebSockets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWidgets.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWidgets.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtWidgets.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtXml.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtXml.py new file mode 100644 index 0000000..edd5cd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.QtXml.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.qt import add_qt6_dependencies + +hiddenimports, binaries, datas = add_qt6_dependencies(__file__) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.py new file mode 100644 index 0000000..30e2ee6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-PySide6.py @@ -0,0 +1,28 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import check_requirement +from PyInstaller.utils.hooks.qt import pyside6_library_info, ensure_single_qt_bindings_package + +# Allow only one Qt bindings package to be collected in frozen application. +ensure_single_qt_bindings_package("PySide6") + +# Only proceed if PySide6 can be imported. +if pyside6_library_info.version is not None: + hiddenimports = ['shiboken6', 'inspect'] + + # Starting with PySide6 6.4.0, we need to collect PySide6.support.deprecated for | and & operators to work with + # Qt key and key modifiers enums. See #7249. + if check_requirement("PySide6 >= 6.4.0"): + hiddenimports += ['PySide6.support.deprecated'] + + # Collect required Qt binaries. + binaries = pyside6_library_info.collect_extra_binaries() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-_pyi_rth_utils.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-_pyi_rth_utils.py new file mode 100644 index 0000000..cbd93aa --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-_pyi_rth_utils.py @@ -0,0 +1,17 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller import compat + +# Exclude submodules specific to non-applicable OSes +excludedimports = [] +if not compat.is_win: + excludedimports += ['_pyi_rth_utils._win32'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-_tkinter.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-_tkinter.py new file mode 100644 index 0000000..7f21b49 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-_tkinter.py @@ -0,0 +1,22 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.tcl_tk import tcltk_info + + +def hook(hook_api): + # Add all Tcl/Tk data files, based on the `TclTkInfo.data_files`. If Tcl/Tk is unavailable, the list is empty. + # + # NOTE: the list contains 3-element TOC tuples with full destination filenames (because other parts of code, + # specifically splash-screen writer, currently require this format). Therefore, we need to use + # `PostGraphAPI.add_datas` (which supports 3-element TOC tuples); if this was 2-element "hook-style" TOC list, + # we could just assign `datas` global hook variable, without implementing the post-graph `hook()` function. + hook_api.add_datas(tcltk_info.data_files) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-babel.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-babel.py new file mode 100644 index 0000000..5f03a97 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-babel.py @@ -0,0 +1,24 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_data_files + +# Ensure that .dat files from locale-data sub-directory are collected. +datas = collect_data_files('babel') + +# Unpickling of locale-data/root.dat currently (babel v2.16.0) requires classes from following modules, so ensure that +# they are always collected: +hiddenimports = [ + "babel.dates", + "babel.localedata", + "babel.plural", + "babel.numbers", +] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-difflib.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-difflib.py new file mode 100644 index 0000000..2416758 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-difflib.py @@ -0,0 +1,13 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2015-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# only required when run as `__main__` +excludedimports = ["doctest"] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-distutils.command.check.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-distutils.command.check.py new file mode 100644 index 0000000..50a17d4 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-distutils.command.check.py @@ -0,0 +1,13 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# Conditionally imported in this module; should not trigger collection. +excludedimports = ['docutils'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-distutils.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-distutils.py new file mode 100644 index 0000000..c9cd63b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-distutils.py @@ -0,0 +1,33 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.setuptools import setuptools_info + +hiddenimports = [] + +# From Python 3.6 and later ``distutils.sysconfig`` takes on the same behaviour as regular ``sysconfig`` of moving the +# config vars to a module (see hook-sysconfig.py). It doesn't use a nice `get module name` function like ``sysconfig`` +# does to help us locate it but the module is the same file that ``sysconfig`` uses so we can use the +# ``_get_sysconfigdata_name()`` from regular ``sysconfig``. +try: + import sysconfig + hiddenimports += [sysconfig._get_sysconfigdata_name()] +except AttributeError: + # Either sysconfig has no attribute _get_sysconfigdata_name (i.e., the function does not exist), or this is Windows + # and the _get_sysconfigdata_name() call failed due to missing sys.abiflags attribute. + pass + +# Starting with setuptools 60.0, the vendored distutils overrides the stdlib one (which will be removed in python 3.12 +# anyway), so check if we are using that version. While the distutils override behavior can be controleld via the +# ``SETUPTOOLS_USE_DISTUTILS`` environment variable, the latter may have a different value during the build and at the +# runtime, and so we need to ensure that both stdlib and setuptools variant of distutils are collected. +if setuptools_info.available and setuptools_info.version >= (60, 0): + hiddenimports += ['setuptools._distutils'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-distutils.util.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-distutils.util.py new file mode 100644 index 0000000..021d459 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-distutils.util.py @@ -0,0 +1,13 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# distutils.util.run_2to3() imports lib2to3. Exclude it as chances are low that it is used by the frozen package. +excludedimports = ['lib2to3.refactor'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-django.contrib.sessions.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.contrib.sessions.py new file mode 100644 index 0000000..5d86e6c --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.contrib.sessions.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_submodules + +hiddenimports = collect_submodules('django.contrib.sessions.backends') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-django.core.cache.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.core.cache.py new file mode 100644 index 0000000..eb319c7 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.core.cache.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_submodules + +hiddenimports = collect_submodules('django.core.cache.backends') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-django.core.mail.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.core.mail.py new file mode 100644 index 0000000..1cee61c --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.core.mail.py @@ -0,0 +1,25 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +django.core.mail uses part of the email package. +The problem is: when using runserver with autoreload mode, the thread that checks for changed files triggers further +imports within the email package, because of the LazyImporter in email (used in 2.5 for backward compatibility). +We then need to name those modules as hidden imports, otherwise at runtime the autoreload thread will complain +with a traceback. +""" + +hiddenimports = [ + 'email.mime.message', + 'email.mime.image', + 'email.mime.text', + 'email.mime.multipart', + 'email.mime.audio', +] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-django.core.management.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.core.management.py new file mode 100644 index 0000000..a8566e0 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.core.management.py @@ -0,0 +1,19 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_submodules + +# Module django.core.management.commands.shell imports IPython, but it introduces many other dependencies that are not +# necessary for a simple django project; ignore the IPython module. +excludedimports = ['IPython', 'matplotlib', 'tkinter'] + +# Django requires management modules for the script 'manage.py'. +hiddenimports = collect_submodules('django.core.management.commands') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-django.db.backends.mysql.base.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.db.backends.mysql.base.py new file mode 100644 index 0000000..951899e --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.db.backends.mysql.base.py @@ -0,0 +1,13 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# Compiler module (see class DatabaseOperations) +hiddenimports = ["django.db.backends.mysql.compiler"] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-django.db.backends.oracle.base.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.db.backends.oracle.base.py new file mode 100644 index 0000000..d50eb97 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.db.backends.oracle.base.py @@ -0,0 +1,12 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +hiddenimports = ["django.db.backends.oracle.compiler"] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-django.db.backends.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.db.backends.py new file mode 100644 index 0000000..e829fe7 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.db.backends.py @@ -0,0 +1,25 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import glob +import os + +from PyInstaller.utils.hooks import get_module_file_attribute + +# Compiler (see class BaseDatabaseOperations) +hiddenimports = ['django.db.models.sql.compiler'] + +# Include all available Django backends. +modpath = os.path.dirname(get_module_file_attribute('django.db.backends')) +for fn in glob.glob(os.path.join(modpath, '*')): + if os.path.isdir(fn): + fn = os.path.basename(fn) + hiddenimports.append('django.db.backends.' + fn + '.base') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-django.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.py new file mode 100644 index 0000000..4a8ee04 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.py @@ -0,0 +1,92 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# Tested with django 2.2 + +import glob +import os + +from PyInstaller import log as logging +from PyInstaller.utils import hooks +from PyInstaller.utils.hooks import django + +logger = logging.getLogger(__name__) + +# Collect everything. Some submodules of django are not importable without considerable external setup. Ignore the +# errors they raise. +datas, binaries, hiddenimports = hooks.collect_all('django', on_error="ignore") + +root_dir = django.django_find_root_dir() +if root_dir: + logger.info('Django root directory %s', root_dir) + # Include imports from the mysite.settings.py module. + settings_py_imports = django.django_dottedstring_imports(root_dir) + # Include all submodules of all imports detected in mysite.settings.py. + for submod in settings_py_imports: + hiddenimports.append(submod) + hiddenimports += hooks.collect_submodules(submod) + # Include main django modules - settings.py, urls.py, wsgi.py. Without them the django server won't run. + package_name = os.path.basename(root_dir) + default_settings_module = f'{package_name}.settings' + settings_module = os.environ.get('DJANGO_SETTINGS_MODULE', default_settings_module) + hiddenimports += [ + # TODO: consider including 'mysite.settings.py' in source code as a data files, + # since users might need to edit this file. + settings_module, + package_name + '.urls', + package_name + '.wsgi', + ] + # Django hiddenimports from the standard Python library. + hiddenimports += [ + 'http.cookies', + 'html.parser', + ] + + # Bundle django DB schema migration scripts as data files. They are necessary for some commands. + logger.info('Collecting Django migration scripts.') + migration_modules = [ + 'django.conf.app_template.migrations', + 'django.contrib.admin.migrations', + 'django.contrib.auth.migrations', + 'django.contrib.contenttypes.migrations', + 'django.contrib.flatpages.migrations', + 'django.contrib.redirects.migrations', + 'django.contrib.sessions.migrations', + 'django.contrib.sites.migrations', + ] + # Include migration scripts of Django-based apps too. + installed_apps = hooks.get_module_attribute(settings_module, 'INSTALLED_APPS') + migration_modules.extend(set(app + '.migrations' for app in installed_apps)) + # Copy migration files. + for mod in migration_modules: + mod_name, bundle_name = mod.split('.', 1) + mod_dir = os.path.dirname(hooks.get_module_file_attribute(mod_name)) + bundle_dir = bundle_name.replace('.', os.sep) + pattern = os.path.join(mod_dir, bundle_dir, '*.py') + files = glob.glob(pattern) + for f in files: + datas.append((f, os.path.join(mod_name, bundle_dir))) + + # Include data files from your Django project found in your django root package. + datas += hooks.collect_data_files(package_name) + + # Include database file if using sqlite. The sqlite database is usually next to the manage.py script. + root_dir_parent = os.path.dirname(root_dir) + # TODO Add more patterns if necessary. + _patterns = ['*.db', 'db.*'] + for p in _patterns: + files = glob.glob(os.path.join(root_dir_parent, p)) + for f in files: + # Place those files next to the executable. + datas.append((f, '.')) + +else: + logger.warning('No django root directory could be found!') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-django.template.loaders.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.template.loaders.py new file mode 100644 index 0000000..18b1374 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-django.template.loaders.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_submodules + +hiddenimports = collect_submodules('django.template.loaders') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-encodings.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-encodings.py new file mode 100644 index 0000000..a4082e1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-encodings.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_submodules + +hiddenimports = collect_submodules('encodings') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gevent.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gevent.py new file mode 100644 index 0000000..40ad953 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gevent.py @@ -0,0 +1,24 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2015-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_all, copy_metadata + +excludedimports = ["gevent.testing", "gevent.tests"] + +datas, binaries, hiddenimports = collect_all( + 'gevent', + filter_submodules=lambda name: ("gevent.testing" not in name or "gevent.tests" not in name), + include_py_files=False, + exclude_datas=["**/tests"] +) + +# Gevent uses ``pkg_resources.require("...")``, which means that all its dependencies must also have their metadata. +datas += copy_metadata('gevent', recursive=True) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.py new file mode 100644 index 0000000..f6b2261 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.py @@ -0,0 +1,12 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +hiddenimports = ['gi._error', 'gi._option'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Adw.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Adw.py new file mode 100644 index 0000000..3327e21 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Adw.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('Adw', '1') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.AppIndicator3.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.AppIndicator3.py new file mode 100644 index 0000000..4b9c894 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.AppIndicator3.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('AppIndicator3', '0.1') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Atk.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Atk.py new file mode 100644 index 0000000..b57ee3f --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Atk.py @@ -0,0 +1,29 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import get_hook_config +from PyInstaller.utils.hooks.gi import GiModuleInfo, collect_glib_translations + + +def hook(hook_api): + module_info = GiModuleInfo('Atk', '1.0') + if not module_info.available: + return + + binaries, datas, hiddenimports = module_info.collect_typelib_data() + + # Collect translations + lang_list = get_hook_config(hook_api, "gi", "languages") + datas += collect_glib_translations('atk10', lang_list) + + hook_api.add_datas(datas) + hook_api.add_binaries(binaries) + hook_api.add_imports(*hiddenimports) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.AyatanaAppIndicator3.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.AyatanaAppIndicator3.py new file mode 100644 index 0000000..36b178a --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.AyatanaAppIndicator3.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('AyatanaAppIndicator3', '0.1') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Champlain.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Champlain.py new file mode 100644 index 0000000..d48def3 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Champlain.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('Champlain', '0.12') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Clutter.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Clutter.py new file mode 100644 index 0000000..9ad56a6 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Clutter.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('Clutter', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.DBus.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.DBus.py new file mode 100644 index 0000000..0580fcb --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.DBus.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('DBus', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GIRepository.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GIRepository.py new file mode 100644 index 0000000..5c6961a --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GIRepository.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GIRepository', '2.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GLib.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GLib.py new file mode 100644 index 0000000..6aa236c --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GLib.py @@ -0,0 +1,42 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import glob +import os + +from PyInstaller.compat import is_win +from PyInstaller.utils.hooks import get_hook_config +from PyInstaller.utils.hooks.gi import GiModuleInfo, collect_glib_share_files, collect_glib_translations + + +def hook(hook_api): + module_info = GiModuleInfo('GLib', '2.0') + if not module_info.available: + return + + binaries, datas, hiddenimports = module_info.collect_typelib_data() + + # Collect translations + lang_list = get_hook_config(hook_api, "gi", "languages") + datas += collect_glib_translations('glib20', lang_list) + + # Collect schemas + datas += collect_glib_share_files('glib-2.0', 'schemas') + + # On Windows, glib needs a spawn helper for g_spawn* API + if is_win: + pattern = os.path.join(module_info.get_libdir(), 'gspawn-*-helper*.exe') + for f in glob.glob(pattern): + binaries.append((f, '.')) + + hook_api.add_datas(datas) + hook_api.add_binaries(binaries) + hook_api.add_imports(*hiddenimports) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GModule.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GModule.py new file mode 100644 index 0000000..0ccaaaf --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GModule.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GModule', '2.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GObject.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GObject.py new file mode 100644 index 0000000..2171165 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GObject.py @@ -0,0 +1,19 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +from PyInstaller.utils.hooks import check_requirement +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GObject', '2.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() + # gi._gobject removed from PyGObject in version 3.25.1 + if check_requirement('PyGObject < 3.25.1'): + hiddenimports += ['gi._gobject'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gdk.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gdk.py new file mode 100644 index 0000000..99fbd08 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gdk.py @@ -0,0 +1,36 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo +from PyInstaller.utils.hooks import get_hook_config + + +def hook(hook_api): + # Use the Gdk version from hook config, if available. If not, try using Gtk version from hook config, so that we + # collect Gdk and Gtk of the same version. + module_versions = get_hook_config(hook_api, 'gi', 'module-versions') + if module_versions: + version = module_versions.get('Gdk') + if not version: + version = module_versions.get('Gtk', '3.0') + else: + version = '3.0' + + module_info = GiModuleInfo('Gdk', version) + if not module_info.available: + return + + binaries, datas, hiddenimports = module_info.collect_typelib_data() + hiddenimports += ['gi._gi_cairo', 'gi.repository.cairo'] + + hook_api.add_datas(datas) + hook_api.add_binaries(binaries) + hook_api.add_imports(*hiddenimports) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GdkPixbuf.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GdkPixbuf.py new file mode 100644 index 0000000..6c6b7c0 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GdkPixbuf.py @@ -0,0 +1,150 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import glob +import os +import shutil +import subprocess + +from PyInstaller import compat +from PyInstaller.config import CONF # workpath +from PyInstaller.utils.hooks import get_hook_config, logger +from PyInstaller.utils.hooks.gi import GiModuleInfo, collect_glib_translations + +LOADERS_PATH = os.path.join('gdk-pixbuf-2.0', '2.10.0', 'loaders') +LOADER_MODULE_DEST_PATH = "lib/gdk-pixbuf/loaders" +LOADER_CACHE_DEST_PATH = "lib/gdk-pixbuf" # NOTE: some search & replace code depends on / being used on all platforms. + + +def _find_gdk_pixbuf_query_loaders_executable(libdir): + # Distributions either package gdk-pixbuf-query-loaders in the GI libs directory (not on the path), or on the path + # with or without a -x64 suffix, depending on the architecture. + cmds = [ + os.path.join(libdir, 'gdk-pixbuf-2.0', 'gdk-pixbuf-query-loaders'), + 'gdk-pixbuf-query-loaders-64', + 'gdk-pixbuf-query-loaders', + ] + + for cmd in cmds: + cmd_fullpath = shutil.which(cmd) + if cmd_fullpath is not None: + return cmd_fullpath + + return None + + +def _collect_loaders(libdir): + # Assume loader plugins have .so library suffix on all non-Windows platforms + lib_ext = "*.dll" if compat.is_win else "*.so" + + # Find all loaders + loader_libs = [] + pattern = os.path.join(libdir, LOADERS_PATH, lib_ext) + for f in glob.glob(pattern): + loader_libs.append(f) + + # Sometimes the loaders are stored in a different directory from the library (msys2) + if not loader_libs: + pattern = os.path.abspath(os.path.join(libdir, '..', 'lib', LOADERS_PATH, lib_ext)) + for f in glob.glob(pattern): + loader_libs.append(f) + + return loader_libs + + +def _generate_loader_cache(gdk_pixbuf_query_loaders, libdir, loader_libs): + # Run the "gdk-pixbuf-query-loaders" command and capture its standard output providing an updated loader + # cache; then write this output to the loader cache bundled with this frozen application. On all platforms, + # we also move the package structure to point to lib/gdk-pixbuf instead of lib/gdk-pixbuf-2.0/2.10.0 in + # order to make compatible for OSX application signing. + # + # On Mac OS we use @executable_path to specify a path relative to the generated bundle. However, on + # non-Windows, we need to rewrite the loader cache because it is not relocatable by default. See + # https://bugzilla.gnome.org/show_bug.cgi?id=737523 + # + # To make it easier to rewrite, we just always write @executable_path, since its significantly easier to + # find/replace at runtime. :) + # + # To permit string munging, decode the encoded bytes output by this command (i.e., enable the + # "universal_newlines" option). + # + # On Fedora, the default loaders cache is /usr/lib64, but the libdir is actually /lib64. To get around this, + # we pass the path to the loader command, and it will create a cache with the right path. + # + # On Windows, the loaders lib directory is relative, starts with 'lib', and uses \\ as path separators + # (escaped \). + cachedata = subprocess.run([gdk_pixbuf_query_loaders, *loader_libs], + check=True, + stdout=subprocess.PIPE, + encoding='utf-8').stdout + + output_lines = [] + prefix = '"' + os.path.join(libdir, 'gdk-pixbuf-2.0', '2.10.0') + plen = len(prefix) + + win_prefix = '"' + '\\\\'.join(['lib', 'gdk-pixbuf-2.0', '2.10.0']) + win_plen = len(win_prefix) + + msys2_prefix = '"' + os.path.abspath(os.path.join(libdir, '..', 'lib', 'gdk-pixbuf-2.0', '2.10.0')) + msys2_plen = len(msys2_prefix) + + # For each line in the updated loader cache... + for line in cachedata.splitlines(): + if line.startswith('#'): + continue + if line.startswith(prefix): + line = '"@executable_path/' + LOADER_CACHE_DEST_PATH + line[plen:] + elif line.startswith(win_prefix): + line = '"' + LOADER_CACHE_DEST_PATH.replace('/', '\\\\') + line[win_plen:] + elif line.startswith(msys2_prefix): + line = ('"' + LOADER_CACHE_DEST_PATH + line[msys2_plen:]).replace('/', '\\\\') + output_lines.append(line) + + return '\n'.join(output_lines) + + +def hook(hook_api): + module_info = GiModuleInfo('GdkPixbuf', '2.0') + if not module_info.available: + return + + binaries, datas, hiddenimports = module_info.collect_typelib_data() + + libdir = module_info.get_libdir() + + # Collect GdkPixbuf loaders and generate loader cache file + gdk_pixbuf_query_loaders = _find_gdk_pixbuf_query_loaders_executable(libdir) + logger.debug("gdk-pixbuf-query-loaders executable: %s", gdk_pixbuf_query_loaders) + if not gdk_pixbuf_query_loaders: + logger.warning("gdk-pixbuf-query-loaders executable not found in GI library directory or in PATH!") + else: + # Find all GdkPixbuf loader modules + loader_libs = _collect_loaders(libdir) + + # Collect discovered loaders + for lib in loader_libs: + binaries.append((lib, LOADER_MODULE_DEST_PATH)) + + # Generate loader cache; we need to store it to CONF['workpath'] so we can collect it as a data file. + cachedata = _generate_loader_cache(gdk_pixbuf_query_loaders, libdir, loader_libs) + cachefile = os.path.join(CONF['workpath'], 'loaders.cache') + with open(cachefile, 'w', encoding='utf-8') as fp: + fp.write(cachedata) + datas.append((cachefile, LOADER_CACHE_DEST_PATH)) + + # Collect translations + lang_list = get_hook_config(hook_api, "gi", "languages") + if gdk_pixbuf_query_loaders: + datas += collect_glib_translations('gdk-pixbuf', lang_list) + + hook_api.add_datas(datas) + hook_api.add_binaries(binaries) + hook_api.add_imports(*hiddenimports) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gio.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gio.py new file mode 100644 index 0000000..46a4351 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gio.py @@ -0,0 +1,63 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import glob +import os + +from PyInstaller import compat +import PyInstaller.log as logging +from PyInstaller.utils.hooks.gi import GiModuleInfo + +logger = logging.getLogger(__name__) + +module_info = GiModuleInfo('Gio', '2.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() + + # Find Gio modules + libdir = module_info.get_libdir() + modules_pattern = None + + if compat.is_win: + modules_pattern = os.path.join(libdir, 'gio', 'modules', '*.dll') + else: + gio_libdir = os.path.join(libdir, 'gio', 'modules') + if not os.path.exists(gio_libdir): + # homebrew installs the files elsewhere... + gio_libdir = os.path.join(os.path.commonprefix([compat.base_prefix, gio_libdir]), 'lib', 'gio', 'modules') + + if os.path.exists(gio_libdir): + modules_pattern = os.path.join(gio_libdir, '*.so') + else: + logger.warning('Could not determine Gio modules path!') + + if modules_pattern: + for f in glob.glob(modules_pattern): + binaries.append((f, 'gio_modules')) + else: + # To add a new platform add a new elif above with the proper is_ and proper pattern for finding the + # Gio modules on your platform. + logger.warning('Bundling Gio modules is not supported on your platform.') + + # Bundle the mime cache -- might not be needed on Windows + # -> this is used for content type detection (also used by GdkPixbuf) + # -> gio/xdgmime/xdgmime.c looks for mime/mime.cache in the users home directory, followed by XDG_DATA_DIRS if + # specified in the environment, otherwise it searches /usr/local/share/ and /usr/share/ + if not compat.is_win: + _mime_searchdirs = ['/usr/local/share', '/usr/share'] + if 'XDG_DATA_DIRS' in os.environ: + _mime_searchdirs.insert(0, os.environ['XDG_DATA_DIRS']) + + for sd in _mime_searchdirs: + spath = os.path.join(sd, 'mime', 'mime.cache') + if os.path.exists(spath): + datas.append((spath, 'share/mime')) + break diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Graphene.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Graphene.py new file mode 100644 index 0000000..bfa4d30 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Graphene.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('Graphene', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gsk.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gsk.py new file mode 100644 index 0000000..9229252 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gsk.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('Gsk', '4.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gst.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gst.py new file mode 100644 index 0000000..939a37b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gst.py @@ -0,0 +1,93 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# GStreamer contains a lot of plugins. We need to collect them and bundle them with the exe file. We also need to +# resolve binary dependencies of these GStreamer plugins. + +import pathlib + +from PyInstaller.utils.hooks import get_hook_config, include_or_exclude_file +import PyInstaller.log as logging +from PyInstaller import isolated +from PyInstaller.utils.hooks.gi import GiModuleInfo, collect_glib_share_files, collect_glib_translations + +logger = logging.getLogger(__name__) + + +@isolated.decorate +def _get_gst_plugin_path(): + import os + import gi + gi.require_version('Gst', '1.0') + from gi.repository import Gst + Gst.init(None) + reg = Gst.Registry.get() + plug = reg.find_plugin('coreelements') + path = plug.get_filename() + return os.path.dirname(path) + + +def _format_plugin_pattern(plugin_name): + return f"**/*gst{plugin_name}.*" + + +def hook(hook_api): + module_info = GiModuleInfo('Gst', '1.0') + if not module_info.available: + return + + binaries, datas, hiddenimports = module_info.collect_typelib_data() + hiddenimports += ["gi.repository.Gio"] + + # Collect data files + datas += collect_glib_share_files('gstreamer-1.0') + + # Translations + lang_list = get_hook_config(hook_api, "gi", "languages") + for prog in [ + 'gst-plugins-bad-1.0', + 'gst-plugins-base-1.0', + 'gst-plugins-good-1.0', + 'gst-plugins-ugly-1.0', + 'gstreamer-1.0', + ]: + datas += collect_glib_translations(prog, lang_list) + + # Plugins + try: + plugin_path = _get_gst_plugin_path() + except Exception as e: + logger.warning("Failed to determine gstreamer plugin path: %s", e) + plugin_path = None + + if plugin_path: + plugin_path = pathlib.Path(plugin_path) + + # Obtain optional include/exclude list from hook config + include_list = get_hook_config(hook_api, "gstreamer", "include_plugins") + exclude_list = get_hook_config(hook_api, "gstreamer", "exclude_plugins") + + # Format plugin basenames into filename patterns for matching + if include_list is not None: + include_list = [_format_plugin_pattern(name) for name in include_list] + if exclude_list is not None: + exclude_list = [_format_plugin_pattern(name) for name in exclude_list] + + # The names of GStreamer plugins typically start with libgst (or just gst, depending on the toolchain). We also + # need to account for different extensions that might be used on a particular OS (for example, on macOS, the + # extension may be either .so or .dylib). + for lib_pattern in ['*gst*.dll', '*gst*.dylib', '*gst*.so']: + binaries += [(str(filename), 'gst_plugins') for filename in plugin_path.glob(lib_pattern) + if include_or_exclude_file(filename, include_list, exclude_list)] + + hook_api.add_datas(datas) + hook_api.add_binaries(binaries) + hook_api.add_imports(*hiddenimports) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstAllocators.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstAllocators.py new file mode 100644 index 0000000..119401a --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstAllocators.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstAllocators', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstApp.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstApp.py new file mode 100644 index 0000000..7c25a44 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstApp.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstApp', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstAudio.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstAudio.py new file mode 100644 index 0000000..cf18078 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstAudio.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstAudio', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstBadAudio.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstBadAudio.py new file mode 100644 index 0000000..0f345b9 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstBadAudio.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstBadAudio', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstBase.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstBase.py new file mode 100644 index 0000000..ea6187b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstBase.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstBase', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstCheck.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstCheck.py new file mode 100644 index 0000000..e631995 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstCheck.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstCheck', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstCodecs.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstCodecs.py new file mode 100644 index 0000000..ffa643e --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstCodecs.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstCodecs', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstController.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstController.py new file mode 100644 index 0000000..c928843 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstController.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstController', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGL.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGL.py new file mode 100644 index 0000000..0075eb0 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGL.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstGL', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLEGL.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLEGL.py new file mode 100644 index 0000000..a3f557d --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLEGL.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstGLEGL', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLWayland.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLWayland.py new file mode 100644 index 0000000..6ef146d --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLWayland.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstGLWayland', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLX11.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLX11.py new file mode 100644 index 0000000..dd68570 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstGLX11.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstGLX11', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstInsertBin.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstInsertBin.py new file mode 100644 index 0000000..c7980bc --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstInsertBin.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstInsertBin', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstMpegts.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstMpegts.py new file mode 100644 index 0000000..b690192 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstMpegts.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstMpegts', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstNet.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstNet.py new file mode 100644 index 0000000..0c268af --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstNet.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstNet', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstPbutils.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstPbutils.py new file mode 100644 index 0000000..173b695 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstPbutils.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstPbutils', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstPlay.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstPlay.py new file mode 100644 index 0000000..edb6020 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstPlay.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstPlay', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstPlayer.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstPlayer.py new file mode 100644 index 0000000..80cb93f --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstPlayer.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstPlayer', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtp.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtp.py new file mode 100644 index 0000000..d18e58d --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtp.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstRtp', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtsp.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtsp.py new file mode 100644 index 0000000..09382dd --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtsp.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstRtsp', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtspServer.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtspServer.py new file mode 100644 index 0000000..d023c3f --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstRtspServer.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstRtspServer', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstSdp.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstSdp.py new file mode 100644 index 0000000..2a78e2b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstSdp.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstSdp', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstTag.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstTag.py new file mode 100644 index 0000000..dbac756 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstTag.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstTag', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstTranscoder.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstTranscoder.py new file mode 100644 index 0000000..3cc1dcf --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstTranscoder.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstTranscoder', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVideo.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVideo.py new file mode 100644 index 0000000..398b503 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVideo.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstVideo', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkan.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkan.py new file mode 100644 index 0000000..588c073 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkan.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstVulkan', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkanWayland.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkanWayland.py new file mode 100644 index 0000000..aaef939 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkanWayland.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstVulkanWayland', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkanXCB.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkanXCB.py new file mode 100644 index 0000000..2351a13 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstVulkanXCB.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstVulkanXCB', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstWebRTC.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstWebRTC.py new file mode 100644 index 0000000..9fcac06 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GstWebRTC.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GstWebRTC', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gtk.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gtk.py new file mode 100644 index 0000000..2495b1d --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Gtk.py @@ -0,0 +1,59 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import os +import os.path + +from PyInstaller.compat import is_win +from PyInstaller.utils.hooks import get_hook_config +from PyInstaller.utils.hooks.gi import GiModuleInfo, collect_glib_etc_files, collect_glib_share_files, \ + collect_glib_translations + + +def hook(hook_api): + module_info = GiModuleInfo('Gtk', '3.0', hook_api=hook_api) # Pass hook_api to read version from hook config + if not module_info.available: + return + + binaries, datas, hiddenimports = module_info.collect_typelib_data() + + # Collect fontconfig data + datas += collect_glib_share_files('fontconfig') + + # Icons, themes, translations + icon_list = get_hook_config(hook_api, "gi", "icons") + if icon_list is not None: + for icon in icon_list: + datas += collect_glib_share_files(os.path.join('icons', icon)) + else: + datas += collect_glib_share_files('icons') + + # Themes + theme_list = get_hook_config(hook_api, "gi", "themes") + if theme_list is not None: + for theme in theme_list: + datas += collect_glib_share_files(os.path.join('themes', theme)) + else: + datas += collect_glib_share_files('themes') + + # Translations + lang_list = get_hook_config(hook_api, "gi", "languages") + datas += collect_glib_translations(f'gtk{module_info.version[0]}0', lang_list) + + # These only seem to be required on Windows + if is_win: + datas += collect_glib_etc_files('fonts') + datas += collect_glib_etc_files('pango') + datas += collect_glib_share_files('fonts') + + hook_api.add_datas(datas) + hook_api.add_binaries(binaries) + hook_api.add_imports(*hiddenimports) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkChamplain.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkChamplain.py new file mode 100644 index 0000000..777b620 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkChamplain.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GtkChamplain', '0.12') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkClutter.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkClutter.py new file mode 100644 index 0000000..cc4fcd7 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkClutter.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('GtkClutter', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkSource.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkSource.py new file mode 100644 index 0000000..5e7efa7 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkSource.py @@ -0,0 +1,31 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo, collect_glib_share_files + + +def hook(hook_api): + module_info = GiModuleInfo('GtkSource', '3.0', hook_api=hook_api) # Pass hook_api to read version from hook config + if not module_info.available: + return + + binaries, datas, hiddenimports = module_info.collect_typelib_data() + + # Collect data files + # The data directory name contains verbatim version, e.g.: + # * GtkSourceView-3.0 -> /usr/share/gtksourceview-3.0 + # * GtkSourceView-4 -> /usr/share/gtksourceview-4 + # * GtkSourceView-5 -> /usr/share/gtksourceview-5 + datas += collect_glib_share_files(f'gtksourceview-{module_info.version}') + + hook_api.add_datas(datas) + hook_api.add_binaries(binaries) + hook_api.add_imports(*hiddenimports) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkosxApplication.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkosxApplication.py new file mode 100644 index 0000000..3437edf --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.GtkosxApplication.py @@ -0,0 +1,18 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.compat import is_darwin +from PyInstaller.utils.hooks.gi import GiModuleInfo + +if is_darwin: + module_info = GiModuleInfo('GtkosxApplication', '1.0') + if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.HarfBuzz.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.HarfBuzz.py new file mode 100644 index 0000000..41cef14 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.HarfBuzz.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('HarfBuzz', '0.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Pango.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Pango.py new file mode 100644 index 0000000..3d8b865 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.Pango.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('Pango', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.PangoCairo.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.PangoCairo.py new file mode 100644 index 0000000..7c058fd --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.PangoCairo.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('PangoCairo', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.cairo.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.cairo.py new file mode 100644 index 0000000..71fed30 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.cairo.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('cairo', '1.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.freetype2.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.freetype2.py new file mode 100644 index 0000000..ffea7a1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.freetype2.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('freetype2', '2.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.xlib.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.xlib.py new file mode 100644 index 0000000..1c2bde3 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-gi.repository.xlib.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks.gi import GiModuleInfo + +module_info = GiModuleInfo('xlib', '2.0') +if module_info.available: + binaries, datas, hiddenimports = module_info.collect_typelib_data() diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-heapq.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-heapq.py new file mode 100644 index 0000000..373025f --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-heapq.py @@ -0,0 +1,13 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2015-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# Only required when run as `__main__`. +excludedimports = ["doctest"] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-idlelib.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-idlelib.py new file mode 100644 index 0000000..505378d --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-idlelib.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_data_files + +datas = collect_data_files('idlelib') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-importlib_metadata.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-importlib_metadata.py new file mode 100644 index 0000000..7abf511 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-importlib_metadata.py @@ -0,0 +1,24 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2019-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +importlib_metadata is a library to access the metadata for a Python package. This functionality intends to replace most +uses of pkg_resources entry point API and metadata API. +""" + +from PyInstaller.utils.hooks import copy_metadata + +# Normally, we should never need to use copy_metadata() in a hook since metadata requirements detection is now +# automatic. However, that detection first uses `PyiModuleGraph.get_code_using("importlib_metadata")` to find +# files which `import importlib_metadata` and `get_code_using()` intentionally excludes internal imports. This +# means that importlib_metadata is not scanned for usages of importlib_metadata and therefore when +# importlib_metadata uses its own API to get its version, this goes undetected. Therefore, we must collect its +# metadata manually. +datas = copy_metadata('importlib_metadata') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-importlib_resources.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-importlib_resources.py new file mode 100644 index 0000000..b43b19b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-importlib_resources.py @@ -0,0 +1,22 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2019-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +`importlib_resources` is a backport of the 3.9+ module `importlib.resources` +""" + +from PyInstaller.utils.hooks import check_requirement, collect_data_files + +# Prior to v1.2.0, a `version.txt` file is used to set __version__. Later versions use `importlib.metadata`. +if check_requirement("importlib_resources < 1.2.0"): + datas = collect_data_files("importlib_resources", includes=["version.txt"]) + +if check_requirement("importlib_resources >= 1.3.1"): + hiddenimports = ['importlib_resources.trees'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-keyring.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-keyring.py new file mode 100644 index 0000000..acbd5ff --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-keyring.py @@ -0,0 +1,19 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_submodules, copy_metadata + +# Collect backends +hiddenimports = collect_submodules('keyring.backends') + +# Keyring performs backend plugin discovery using setuptools entry points, which are listed in the metadata. Therefore, +# we need to copy the metadata, otherwise no backends will be found at run-time. +datas = copy_metadata('keyring') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-kivy.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-kivy.py new file mode 100644 index 0000000..fd01f06 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-kivy.py @@ -0,0 +1,25 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2015-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller import log as logging +from PyInstaller.utils.hooks import check_requirement + +if check_requirement('kivy >= 1.9.1'): + from kivy.tools.packaging.pyinstaller_hooks import (add_dep_paths, get_deps_all, get_factory_modules, kivy_modules) + from kivy.tools.packaging.pyinstaller_hooks import excludedimports, datas # noqa: F401 + + add_dep_paths() + + hiddenimports = get_deps_all()['hiddenimports'] + hiddenimports = list(set(get_factory_modules() + kivy_modules + hiddenimports)) +else: + logger = logging.getLogger(__name__) + logger.warning('Hook disabled because of Kivy version < 1.9.1') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-lib2to3.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-lib2to3.py new file mode 100644 index 0000000..83b0f08 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-lib2to3.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This is needed to bundle lib2to3 Grammars files + +from PyInstaller.utils.hooks import collect_data_files + +datas = collect_data_files('lib2to3') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backend_bases.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backend_bases.py new file mode 100644 index 0000000..f65344c --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backend_bases.py @@ -0,0 +1,12 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +excludedimports = ['IPython'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.backend_qtagg.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.backend_qtagg.py new file mode 100644 index 0000000..b3067db --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.backend_qtagg.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This module conditionally imports PyQt6: +# https://github.com/matplotlib/matplotlib/blob/9e18a343fb58a2978a8e27df03190ed21c61c343/lib/matplotlib/backends/backend_qtagg.py#L52-L53 +# Suppress this import to prevent PyQt6 from being accidentally pulled in; the actually relevant Qt bindings are +# determined by our hook for `matplotlib.backends.qt_compat` module. +excludedimports = ['PyQt6'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.backend_qtcairo.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.backend_qtcairo.py new file mode 100644 index 0000000..0b9174b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.backend_qtcairo.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This module conditionally imports PyQt6: +# https://github.com/matplotlib/matplotlib/blob/9e18a343fb58a2978a8e27df03190ed21c61c343/lib/matplotlib/backends/backend_qtcairo.py#L24-L25 +# Suppress this import to prevent PyQt6 from being accidentally pulled in; the actually relevant Qt bindings are +# determined by our hook for `matplotlib.backends.qt_compat` module. +excludedimports = ['PyQt6'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.py new file mode 100644 index 0000000..318f82e --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.py @@ -0,0 +1,226 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.compat import is_darwin +from PyInstaller.utils.hooks import logger, get_hook_config +from PyInstaller import isolated + + +@isolated.decorate +def _get_configured_default_backend(): + """ + Return the configured default matplotlib backend name, if available as matplotlib.rcParams['backend'] (or overridden + by MPLBACKEND environment variable. If the value of matplotlib.rcParams['backend'] corresponds to the auto-sentinel + object, returns None + """ + import matplotlib + # matplotlib.rcParams overrides the __getitem__ implementation and attempts to determine and load the default + # backend using pyplot.switch_backend(). Therefore, use dict.__getitem__(). + val = dict.__getitem__(matplotlib.rcParams, 'backend') + if isinstance(val, str): + return val + return None + + +@isolated.decorate +def _list_available_mpl_backends(): + """ + Returns the names of all available matplotlib backends. + """ + import matplotlib + return matplotlib.rcsetup.all_backends + + +@isolated.decorate +def _check_mpl_backend_importable(module_name): + """ + Attempts to import the given module name (matplotlib backend module). + + Exceptions are propagated to caller. + """ + __import__(module_name) + + +# Bytecode scanning +def _recursive_scan_code_objects_for_mpl_use(co): + """ + Recursively scan the bytecode for occurrences of matplotlib.use() or mpl.use() calls with const arguments, and + collect those arguments into list of used matplotlib backend names. + """ + + from PyInstaller.depend.bytecode import any_alias, recursive_function_calls + + mpl_use_names = { + *any_alias("matplotlib.use"), + *any_alias("mpl.use"), # matplotlib is commonly aliased as mpl + } + + backends = [] + for calls in recursive_function_calls(co).values(): + for name, args in calls: + # matplotlib.use(backend) or matplotlib.use(backend, force) + # We support only literal arguments. Similarly, kwargs are + # not supported. + if len(args) not in {1, 2} or not isinstance(args[0], str): + continue + if name in mpl_use_names: + backends.append(args[0]) + + return backends + + +def _backend_module_name(name): + """ + Converts matplotlib backend name to its corresponding module name. + + Equivalent to matplotlib.cbook._backend_module_name(). + """ + if name.startswith("module://"): + return name[9:] + return f"matplotlib.backends.backend_{name.lower()}" + + +def _autodetect_used_backends(hook_api): + """ + Returns a list of automatically-discovered matplotlib backends in use, or the name of the default matplotlib + backend. Implements the 'auto' backend selection method. + """ + # Scan the code for matplotlib.use() + modulegraph = hook_api.analysis.graph + mpl_code_objs = modulegraph.get_code_using("matplotlib") + used_backends = [] + for name, co in mpl_code_objs.items(): + co_backends = _recursive_scan_code_objects_for_mpl_use(co) + if co_backends: + logger.info( + "Discovered Matplotlib backend(s) via `matplotlib.use()` call in module %r: %r", name, co_backends + ) + used_backends += co_backends + + # Deduplicate and sort the list of used backends before displaying it. + used_backends = sorted(set(used_backends)) + + if used_backends: + HOOK_CONFIG_DOCS = 'https://pyinstaller.org/en/stable/hooks-config.html#matplotlib-hooks' + logger.info( + "The following Matplotlib backends were discovered by scanning for `matplotlib.use()` calls: %r. If your " + "backend of choice is not in this list, either add a `matplotlib.use()` call to your code, or configure " + "the backend collection via hook options (see: %s).", used_backends, HOOK_CONFIG_DOCS + ) + return used_backends + + # Determine the default matplotlib backend. + # + # Ideally, this would be done by calling ``matplotlib.get_backend()``. However, that function tries to switch to the + # default backend (calling ``matplotlib.pyplot.switch_backend()``), which seems to occasionally fail on our linux CI + # with an error and, on other occasions, returns the headless Agg backend instead of the GUI one (even with display + # server running). Furthermore, using ``matplotlib.get_backend()`` returns headless 'Agg' when display server is + # unavailable, which is not ideal for automated builds. + # + # Therefore, we try to emulate ``matplotlib.get_backend()`` ourselves. First, we try to obtain the configured + # default backend from settings (rcparams and/or MPLBACKEND environment variable). If that is unavailable, we try to + # find the first importable GUI-based backend, using the same list as matplotlib.pyplot.switch_backend() uses for + # automatic backend selection. The difference is that we only test whether the backend module is importable, without + # trying to switch to it. + default_backend = _get_configured_default_backend() # isolated sub-process + if default_backend: + logger.info("Found configured default matplotlib backend: %s", default_backend) + return [default_backend] + + # `QtAgg` supersedes `Qt5Agg`; however, we keep `Qt5Agg` in the candidate list to support older versions of + # matplotlib that do not have `QtAgg`. + candidates = ["QtAgg", "Qt5Agg", "Gtk4Agg", "Gtk3Agg", "TkAgg", "WxAgg"] + if is_darwin: + candidates = ["MacOSX"] + candidates + logger.info("Trying determine the default backend as first importable candidate from the list: %r", candidates) + + for candidate in candidates: + try: + module_name = _backend_module_name(candidate) + _check_mpl_backend_importable(module_name) # NOTE: uses an isolated sub-process. + except Exception: + continue + return [candidate] + + # Fall back to headless Agg backend + logger.info("None of the backend candidates could be imported; falling back to headless Agg!") + return ['Agg'] + + +def _collect_all_importable_backends(hook_api): + """ + Returns a list of all importable matplotlib backends. Implements the 'all' backend selection method. + """ + # List of the human-readable names of all available backends. + backend_names = _list_available_mpl_backends() # NOTE: retrieved in an isolated sub-process. + logger.info("All available matplotlib backends: %r", backend_names) + + # Try to import the module(s). + importable_backends = [] + + # List of backends to exclude; Qt4 is not supported by PyInstaller anymore. + exclude_backends = {'Qt4Agg', 'Qt4Cairo'} + + # Ignore "CocoaAgg" on OSes other than Mac OS; attempting to import it on other OSes halts the current + # (sub)process without printing output or raising exceptions, preventing reliable detection. Apply the + # same logic for the (newer) "MacOSX" backend. + if not is_darwin: + exclude_backends |= {'CocoaAgg', 'MacOSX'} + + # For safety, attempt to import each backend in an isolated sub-process. + for backend_name in backend_names: + if backend_name in exclude_backends: + logger.info(' Matplotlib backend %r: excluded', backend_name) + continue + + try: + module_name = _backend_module_name(backend_name) + _check_mpl_backend_importable(module_name) # NOTE: uses an isolated sub-process. + except Exception: + # Backend is not importable, for whatever reason. + logger.info(' Matplotlib backend %r: ignored due to import error', backend_name) + continue + + logger.info(' Matplotlib backend %r: added', backend_name) + importable_backends.append(backend_name) + + return importable_backends + + +def hook(hook_api): + # Backend collection setting + backends_method = get_hook_config(hook_api, 'matplotlib', 'backends') + if backends_method is None: + backends_method = 'auto' # default method + + # Select backend(s) + if backends_method == 'auto': + logger.info("Matplotlib backend selection method: automatic discovery of used backends") + backend_names = _autodetect_used_backends(hook_api) + elif backends_method == 'all': + logger.info("Matplotlib backend selection method: collection of all importable backends") + backend_names = _collect_all_importable_backends(hook_api) + else: + logger.info("Matplotlib backend selection method: user-provided name(s)") + if isinstance(backends_method, str): + backend_names = [backends_method] + else: + assert isinstance(backends_method, list), "User-provided backend name(s) must be either a string or a list!" + backend_names = backends_method + + # Deduplicate and sort the list of selected backends before displaying it. + backend_names = sorted(set(backend_names)) + + logger.info("Selected matplotlib backends: %r", backend_names) + + # Set module names as hiddenimports + module_names = [_backend_module_name(backend) for backend in backend_names] # backend name -> module name + hook_api.add_imports(*module_names) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.qt_compat.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.qt_compat.py new file mode 100644 index 0000000..4e12fff --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.backends.qt_compat.py @@ -0,0 +1,26 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import qt as qtutils + +# This module conditionally imports all Qt bindings. Prevent all available bindings from being pulled in by trying to +# select the most applicable one. +# +# The preference order for this module appears to be: PyQt6, PySide6, PyQt5, PySide2 (or just PyQt5, PySide2 if Qt5 +# bindings are forced). See: +# https://github.com/matplotlib/matplotlib/blob/9e18a343fb58a2978a8e27df03190ed21c61c343/lib/matplotlib/backends/qt_compat.py#L113-L125 +# +# We, however, use the default preference order of the helper function, in order to keep it consistent across multiple +# hooks that use the same helper. +excludedimports = qtutils.exclude_extraneous_qt_bindings( + hook_name="hook-matplotlib.backends.qt_compat", + qt_bindings_order=None, +) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.numerix.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.numerix.py new file mode 100644 index 0000000..924b400 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.numerix.py @@ -0,0 +1,21 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +The matplotlib.numerix package sneaks these imports in under the radar. +""" + +hiddenimports = [ + 'fft', + 'linear_algebra', + 'random_array', + 'ma', + 'mlab', +] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.py new file mode 100644 index 0000000..e628e9b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.py @@ -0,0 +1,38 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller import isolated +from PyInstaller import compat +from PyInstaller.utils import hooks as hookutils + + +@isolated.decorate +def mpl_data_dir(): + import matplotlib + return matplotlib.get_data_path() + + +datas = [ + (mpl_data_dir(), "matplotlib/mpl-data"), +] + +binaries = [] + +# Windows PyPI wheels for `matplotlib` >= 3.7.0 use `delvewheel`. +# In addition to DLLs from `matplotlib.libs` directory, which should be picked up automatically by dependency analysis +# in contemporary PyInstaller versions, we also need to collect the load-order file. This used to be required for +# python <= 3.7 (that lacked `os.add_dll_directory`), but is also needed for Anaconda python 3.8 and 3.9, where +# `delvewheel` falls back to load-order file codepath due to Anaconda breaking `os.add_dll_directory` implementation. +if compat.is_win and hookutils.check_requirement('matplotlib >= 3.7.0'): + delvewheel_datas, delvewheel_binaries = hookutils.collect_delvewheel_libs_directory('matplotlib') + + datas += delvewheel_datas + binaries += delvewheel_binaries diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.pyplot.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.pyplot.py new file mode 100644 index 0000000..2f78597 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-matplotlib.pyplot.py @@ -0,0 +1,12 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +excludedimports = ['IPython', "IPython.core.pylabtools"] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-multiprocessing.util.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-multiprocessing.util.py new file mode 100644 index 0000000..b9363ba --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-multiprocessing.util.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# In Python 3.8 mutliprocess.utils has _cleanup_tests() to cleanup multiprocessing resources when multiprocessing tests +# completed. This function import `tests` which is the complete Python test-suite, pulling in many more dependencies, +# e.g., tkinter. + +excludedimports = ['test'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-numpy.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-numpy.py new file mode 100644 index 0000000..bbdfa29 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-numpy.py @@ -0,0 +1,116 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. Additional +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# --- Copyright Disclaimer --- +# +# An earlier copy of this hook has been submitted to the NumPy project, where it was integrated in v1.23.0rc1 +# (https://github.com/numpy/numpy/pull/20745), under terms and conditions outlined in their repository [1]. +# +# A special provision is hereby granted to the NumPy project that allows the NumPy copy of the hook to incorporate the +# changes made to this (PyInstaller's) copy of the hook, subject to their licensing terms as opposed to PyInstaller's +# (stricter) licensing terms. +# +# .. refs: +# +# [1] NumPy's license: https://github.com/numpy/numpy/blob/master/LICENSE.txt + +# NOTE: when comparing the contents of this hook and the NumPy version of the hook (for example, to port changes), keep +# in mind that this copy is PyInstaller-centric - it caters to the version of PyInstaller it is bundled with, but needs +# to account for different behavior of different NumPy versions. In contrast, the NumPy copy of the hook caters to the +# version of NumPy it is bundled with, but should account for behavior differences in different PyInstaller versions. + +# Override the default hook priority so that our copy of hook is used instead of NumPy's one (which has priority 0, +# the default for upstream hooks). +# $PyInstaller-Hook-Priority: 1 + +from PyInstaller import compat +from PyInstaller.utils.hooks import ( + get_installer, + collect_dynamic_libs, +) + +from packaging.version import Version + +numpy_version = Version(compat.importlib_metadata.version("numpy")).release +numpy_installer = get_installer('numpy') + +hiddenimports = [] +datas = [] +binaries = [] + +# Collect shared libraries that are bundled inside the numpy's package directory. With PyInstaller 6.x, the directory +# layout of collected shared libraries should be preserved (to match behavior of the binary dependency analysis). In +# earlier versions of PyInstaller, it was necessary to collect the shared libraries into application's top-level +# directory (because that was also what binary dependency analysis in PyInstaller < 6.0 did). +binaries += collect_dynamic_libs("numpy") + +# Check if we are using Anaconda-packaged numpy +if numpy_installer == 'conda': + # Collect DLLs for NumPy and its dependencies (MKL, OpenBlas, OpenMP, etc.) from the communal Conda bin directory. + from PyInstaller.utils.hooks import conda_support + datas += conda_support.collect_dynamic_libs("numpy", dependencies=True) + +# NumPy 1.26 started using `delvewheel` for its Windows PyPI wheels. While contemporary PyInstaller versions +# automatically pick up DLLs from external `numpy.libs` directory, this does not work on Anaconda python 3.8 and 3.9 +# due to defunct `os.add_dll_directory`, which forces `delvewheel` to use the old load-order file approach. So we need +# to explicitly ensure that load-order file as well as DLLs are collected. +if compat.is_win and numpy_version >= (1, 26) and numpy_installer == 'pip': + from PyInstaller.utils.hooks import collect_delvewheel_libs_directory + datas, binaries = collect_delvewheel_libs_directory("numpy", datas=datas, binaries=binaries) + +# Submodules PyInstaller cannot detect (probably because they are only imported by extension modules, which PyInstaller +# cannot read). +if numpy_version >= (2, 0): + # In v2.0.0, `numpy.core` was renamed to `numpy._core`. + # See https://github.com/numpy/numpy/commit/47b70cbffd672849a5d3b9b6fa6e515700460fd0 + hiddenimports += ['numpy._core._dtype_ctypes', 'numpy._core._multiarray_tests'] +else: + hiddenimports += ['numpy.core._dtype_ctypes'] + + # See https://github.com/numpy/numpy/commit/99104bd2d0557078d7ea9a590129c87dd63df623 + if numpy_version >= (1, 25): + hiddenimports += ['numpy.core._multiarray_tests'] + +# This hidden import was removed from NumPy hook in v1.25.0 (https://github.com/numpy/numpy/pull/22666). According to +# comment in the linked PR, it should have been unnecessary since v1.19. +if compat.is_conda and numpy_version < (1, 19): + hiddenimports += ["six"] + +# Remove testing and building code and packages that are referenced throughout NumPy but are not really dependencies. +excludedimports = [ + "scipy", + "pytest", + "nose", + "f2py", + "setuptools", +] + +# As of v1.22.0, numpy.testing (imported for example by some scipy modules) requires numpy.distutils and distutils. +# This was due to numpy.testing adding import of numpy.testing._private.extbuild, which in turn imported numpy.distutils +# and distutils. These imports were moved into functions that require them in v1.22.2 and v.1.23.0. +# See: https://github.com/numpy/numpy/pull/20831 and https://github.com/numpy/numpy/pull/20906 +# So we can exclude them for all numpy versions except for v1.22.0 and v1.22.1 - the main motivation is to avoid pulling +# in `setuptools` (which nowadays provides its vendored version of `distutils`). +if numpy_version < (1, 22, 0) or numpy_version > (1, 22, 1): + excludedimports += [ + "distutils", + "numpy.distutils", + ] + +# In numpy v2.0.0, numpy.f2py submodule has been added to numpy's `__all__` attribute. Therefore, using +# `from numpy import *` leads to an error if `numpy.f2py` is excluded (seen in scipy 1.14). The exclusion in earlier +# releases was not reported to cause any issues, so keep it around. Although it should be noted that it does break an +# explicit import (i.e., ˙import numpy.f2py`) from user's code as well, because it prevents collection of other +# submodules from `numpy.f2py`. +if numpy_version < (2, 0): + excludedimports += [ + "numpy.f2py", + ] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-packaging.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-packaging.py new file mode 100644 index 0000000..c742b4a --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-packaging.py @@ -0,0 +1,13 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# Duplicate hook-pkg_resources.py. +hiddenimports = ["pkg_resources"] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.io.clipboard.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.io.clipboard.py new file mode 100644 index 0000000..2395920 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.io.clipboard.py @@ -0,0 +1,19 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This module conditionally imports PyQt5: +# https://github.com/pandas-dev/pandas/blob/95308514e1221200e4526dfaf248283f3d7ade06/pandas/io/clipboard/__init__.py#L578-L597 +# Suppress this import to prevent PyQt5 from being accidentally pulled in; the actually relevant Qt bindings are +# determined by our hook for `qtpy` module, which contemporary versions of pandas mandate as part of `clipboard` and +# `all` extras: +# https://github.com/pandas-dev/pandas/blob/95308514e1221200e4526dfaf248283f3d7ade06/pyproject.toml#L86 +# https://github.com/pandas-dev/pandas/blob/95308514e1221200e4526dfaf248283f3d7ade06/pyproject.toml#L115 +excludedimports = ['PyQt5'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.io.formats.style.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.io.formats.style.py new file mode 100644 index 0000000..2a56828 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.io.formats.style.py @@ -0,0 +1,18 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_data_files + +# This module indirectly imports jinja2 +hiddenimports = ['jinja2'] + +# It also requires template file stored in pandas/io/formats/templates +datas = collect_data_files('pandas.io.formats') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.plotting.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.plotting.py new file mode 100644 index 0000000..948dd88 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.plotting.py @@ -0,0 +1,18 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import check_requirement + +# Starting with pandas 1.3.0, pandas.plotting._matplotlib is imported via importlib.import_module() and needs to be +# added to hidden imports. But do this only if matplotlib is available in the first place (as it is soft dependency +# of pandas). +if check_requirement('pandas >= 1.3.0') and check_requirement('matplotlib'): + hiddenimports = ['pandas.plotting._matplotlib'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.py new file mode 100644 index 0000000..7b3acad --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-pandas.py @@ -0,0 +1,20 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2017-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_submodules, check_requirement + +# Pandas keeps Python extensions loaded with dynamic imports here. +hiddenimports = collect_submodules('pandas._libs') + +# Pandas 1.2.0 and later require cmath hidden import on linux and macOS. On Windows, this is not strictly required, but +# we add it anyway to keep things simple (and future-proof). +if check_requirement('pandas >= 1.2.0'): + hiddenimports += ['cmath'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-pickle.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-pickle.py new file mode 100644 index 0000000..8d023bb --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-pickle.py @@ -0,0 +1,13 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2015-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# Only required when run as `__main__` +excludedimports = ["argparse", "doctest"] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-pkg_resources.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-pkg_resources.py new file mode 100644 index 0000000..286671f --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-pkg_resources.py @@ -0,0 +1,68 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_submodules, can_import_module +from PyInstaller.utils.hooks.setuptools import setuptools_info + +hiddenimports = [] +excludedimports = ['__main__'] + +# pkg_resources keeps vendored modules in its _vendor subpackage, and does sys.meta_path based import magic to expose +# them as pkg_resources.extern.* +# +# With setuptools >= 71.0, pkg_resources ceased to vendor packages, because vendoring is now done at the setuptools +# level. +if setuptools_info.available and setuptools_info.version < (71, 0, 0): + # The `railroad` package is an optional requirement for `pyparsing`. `pyparsing.diagrams` depends on `railroad`, so + # filter it out when `railroad` is not available. + if can_import_module('railroad'): + hiddenimports += collect_submodules('pkg_resources._vendor') + else: + hiddenimports += collect_submodules( + 'pkg_resources._vendor', filter=lambda name: 'pkg_resources._vendor.pyparsing.diagram' not in name + ) + + # pkg_resources v45.0 dropped support for Python 2 and added this module printing a warning. We could save some + # bytes if we would replace this by a fake module. + if setuptools_info.version >= (45, 0, 0) and setuptools_info.version < (49, 1, 1): + hiddenimports += ['pkg_resources.py2_warn'] + + # As of v60.7, setuptools vendored jaraco and has pkg_resources use it. Currently, the pkg_resources._vendor.jaraco + # namespace package cannot be automatically scanned due to limited support for pure namespace packages in our hook + # utilities. + # + # In setuptools 60.7.0, the vendored jaraco.text package included "Lorem Ipsum.txt" data file, which also has to be + # collected. However, the presence of the data file (and the resulting directory hierarchy) confuses the importer's + # redirection logic; instead of trying to work-around that, tell user to upgrade or downgrade their setuptools. + if setuptools_info.version == (60, 7, 0): + raise SystemExit( + "ERROR: Setuptools 60.7.0 is incompatible with PyInstaller. " + "Downgrade to an earlier version or upgrade to a later version." + ) + # In setuptools 60.7.1, the "Lorem Ipsum.txt" data file was dropped from the vendored jaraco.text package, so we can + # accommodate it with couple of hidden imports. + elif setuptools_info.version >= (60, 7, 1): + hiddenimports += [ + 'pkg_resources._vendor.jaraco.functools', + 'pkg_resources._vendor.jaraco.context', + 'pkg_resources._vendor.jaraco.text', + ] + + # As of setuptools 70.0.0, we need pkg_resources.extern added to hidden imports. + if setuptools_info.version >= (70, 0, 0): + hiddenimports += [ + 'pkg_resources.extern', + ] + +# Some more hidden imports. See: +# https://github.com/pyinstaller/pyinstaller-hooks-contrib/issues/15#issuecomment-663699288 `packaging` can either be +# its own package, or embedded in `pkg_resources._vendor.packaging`, or both. +hiddenimports += collect_submodules('packaging') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-platform.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-platform.py new file mode 100644 index 0000000..d1d8e1d --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-platform.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +import sys + +# see https://github.com/python/cpython/blob/3.9/Lib/platform.py#L411 +# This will exclude `plistlib` for sys.platform != 'darwin' +if sys.platform != 'darwin': + excludedimports = ["plistlib"] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-pygments.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-pygments.py new file mode 100644 index 0000000..529d82b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-pygments.py @@ -0,0 +1,29 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +PyInstaller hook file for Pygments. Tested with version 2.0.2. +""" + +from PyInstaller.utils.hooks import collect_submodules + +# The following applies to pygments version 2.0.2, as reported by ``pip show pygments``. +# +# From pygments.formatters, line 37:: +# +# def _load_formatters(module_name): +# """Load a formatter (and all others in the module too).""" +# mod = __import__(module_name, None, None, ['__all__']) +# +# Therefore, we need all the modules in ``pygments.formatters``. + +hiddenimports = collect_submodules('pygments.formatters') +hiddenimports.extend(collect_submodules('pygments.lexers')) +hiddenimports.extend(collect_submodules('pygments.styles')) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-pytz.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-pytz.py new file mode 100644 index 0000000..d6b6486 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-pytz.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_data_files + +# On Linux pytz installed from distribution repository uses zoneinfo from /usr/share/zoneinfo/ and no data files might +# be collected. +datas = collect_data_files('pytz') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-pytzdata.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-pytzdata.py new file mode 100644 index 0000000..e45626c --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-pytzdata.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_data_files + +datas = collect_data_files("pytzdata") diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-qtawesome.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-qtawesome.py new file mode 100644 index 0000000..9829a03 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-qtawesome.py @@ -0,0 +1,19 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2017-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Hook for QtAwesome (https://github.com/spyder-ide/qtawesome). +Font files and charmaps need to be included with module. +Tested with QtAwesome 0.4.4 and Python 3.6 on macOS 10.12.4. +""" + +from PyInstaller.utils.hooks import collect_data_files + +datas = collect_data_files('qtawesome') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-qtpy.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-qtpy.py new file mode 100644 index 0000000..a6ce00c --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-qtpy.py @@ -0,0 +1,25 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import qt as qtutils + +# This module conditionally imports all Qt bindings. Prevent all available bindings from being pulled in by trying to +# select the most applicable one. +# +# The preference order for this module appears to be: PyQt5, PySide2, PyQt6, PySide6. See: +# https://github.com/spyder-ide/qtpy/blob/3238de7a3e038daeb585c1a76fd9a0c4baf22f11/qtpy/__init__.py#L199-L289 +# +# We, however, use the default preference order of the helper function, in order to keep it consistent across multiple +# hooks that use the same helper. +excludedimports = qtutils.exclude_extraneous_qt_bindings( + hook_name="hook-qtpy", + qt_bindings_order=None, +) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-scapy.layers.all.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-scapy.layers.all.py new file mode 100644 index 0000000..fdcc779 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-scapy.layers.all.py @@ -0,0 +1,19 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_submodules + +# The layers to load can be configured using scapy's conf.load_layers. +# from scapy.config import conf; print(conf.load_layers) +# I decided not to use this, but to include all layer modules. The reason is: When building the package, load_layers may +# not include all the layer modules the program will use later. + +hiddenimports = collect_submodules('scapy.layers') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.io.matlab.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.io.matlab.py new file mode 100644 index 0000000..c69c767 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.io.matlab.py @@ -0,0 +1,13 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# Module scipy.io.matlab allows to parse matlab files. The hidden import is necessary for SciPy 0.11+. +hiddenimports = ['scipy.io.matlab.streams'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.linalg.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.linalg.py new file mode 100644 index 0000000..b1a68b8 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.linalg.py @@ -0,0 +1,13 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# The hidden import is necessary for SciPy 0.16+. +hiddenimports = ['scipy.linalg.cython_blas', 'scipy.linalg.cython_lapack'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.py new file mode 100644 index 0000000..6c16e92 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.py @@ -0,0 +1,52 @@ +# ----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +# ----------------------------------------------------------------------------- + +import glob +import os + +from PyInstaller.compat import is_win +from PyInstaller.utils.hooks import ( + get_module_file_attribute, + check_requirement, + collect_delvewheel_libs_directory, + collect_submodules, +) + +binaries = [] +datas = [] + +# Package the DLL bundle that official scipy wheels for Windows ship The DLL bundle will either be in extra-dll on +# windows proper and in .libs if installed on a virtualenv created from MinGW (Git-Bash for example) +if is_win: + extra_dll_locations = ['extra-dll', '.libs'] + for location in extra_dll_locations: + dll_glob = os.path.join(os.path.dirname(get_module_file_attribute('scipy')), location, "*.dll") + if glob.glob(dll_glob): + binaries.append((dll_glob, ".")) + +# Handle delvewheel-enabled win32 wheels, which have external scipy.libs directory (scipy >= 0.9.2) +if check_requirement("scipy >= 1.9.2") and is_win: + datas, binaries = collect_delvewheel_libs_directory('scipy', datas=datas, binaries=binaries) + +# collect library-wide utility extension modules +hiddenimports = ['scipy._lib.%s' % m for m in ['messagestream', "_ccallback_c", "_fpumode"]] + +# In scipy 1.14.0, `scipy._lib.array_api_compat.numpy` added a programmatic import of its `.fft` submodule, which needs +# to be added to hiddenimports. +if check_requirement("scipy >= 1.14.0"): + hiddenimports += ['scipy._lib.array_api_compat.numpy.fft'] + +# The `scipy._lib.array_api_compat.numpy` module performs a `from numpy import *`; in numpy 2.0.0, `numpy.f2py` was +# added to `numpy.__all__` attribute, but at the same time, the upstream numpy hook adds `numpy.f2py` to +# `excludedimports`. Therefore, the `numpy.f2py` sub-package ends up missing. Due to the way exclusion mechanism works, +# we need to add both `numpy.f2py` and all its submodules to hiddenimports here. +if check_requirement("numpy >= 2.0.0"): + hiddenimports += collect_submodules('numpy.f2py', filter=lambda name: name != 'numpy.f2py.tests') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.sparse.csgraph.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.sparse.csgraph.py new file mode 100644 index 0000000..9cabdbd --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.sparse.csgraph.py @@ -0,0 +1,13 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# The hidden import is necessary for SciPy 0.11+. +hiddenimports = ['scipy.sparse.csgraph._validation'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.spatial.transform.rotation.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.spatial.transform.rotation.py new file mode 100644 index 0000000..4840cf2 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.spatial.transform.rotation.py @@ -0,0 +1,17 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import check_requirement + +# As of scipy 1.6.0, scipy.spatial.transform.rotation is cython-compiled, so we fail to automatically pick up its +# imports. +if check_requirement("scipy >= 1.6.0"): + hiddenimports = ['scipy.spatial.transform._rotation_groups'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.special._ellip_harm_2.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.special._ellip_harm_2.py new file mode 100644 index 0000000..5115b02 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.special._ellip_harm_2.py @@ -0,0 +1,30 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Module hook for the `scipy.special._ellip_harm_2` C extension first introduced by SciPy >= 0.15.0. + +See Also +---------- +https://github.com/scipy/scipy/blob/master/scipy/special/_ellip_harm_2.pyx + This C extension's Cython-based implementation. +""" + +# In SciPy >= 0.15.0: +# +# 1. The "scipy.special.__init__" module imports... +# 2. The "scipy.special._ellip_harm" module imports... +# 3. The "scipy.special._ellip_harm_2" C extension imports... +# 4. The "scipy.integrate" package. +# +# The third import is undetectable by PyInstaller and hence explicitly listed. Since "_ellip_harm" and "_ellip_harm_2" +# were first introduced by SciPy 0.15.0, the following hidden import will only be applied for versions of SciPy +# guaranteed to provide these modules and C extensions. +hiddenimports = ['scipy.integrate'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.special._ufuncs.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.special._ufuncs.py new file mode 100644 index 0000000..f94b22e --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.special._ufuncs.py @@ -0,0 +1,25 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import is_module_satisfies + +# Module scipy.io._ufunc depends on some other C/C++ extensions. The hidden import is necessary for SciPy 0.13+. +# Thanks to dyadkin; see issue #826. +hiddenimports = ['scipy.special._ufuncs_cxx'] + +# SciPy 1.13.0 cythonized cdflib; this introduced new `scipy.special._cdflib` extension that is imported from the +# `scipy.special._ufuncs` extension, and thus we need a hidden import here. +if is_module_satisfies('scipy >= 1.13.0'): + hiddenimports += ['scipy.special._cdflib'] + +# SciPy 1.14.0 introduced `scipy.special._special_ufuncs`, which is imported from `scipy.special._ufuncs` extension. +if is_module_satisfies('scipy >= 1.14.0'): + hiddenimports += ['scipy.special._special_ufuncs'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.stats._stats.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.stats._stats.py new file mode 100644 index 0000000..e5f72a0 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-scipy.stats._stats.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import check_requirement + +if check_requirement("scipy >= 1.5.0"): + hiddenimports = ['scipy.special.cython_special'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-scrapy.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-scrapy.py new file mode 100644 index 0000000..f110bb0 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-scrapy.py @@ -0,0 +1,18 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# Hook for https://pypi.org/project/Scrapy/ +# https://stackoverflow.com/questions/49085970/no-such-file-or-directory-error-using-pyinstaller-and-scrapy + +from PyInstaller.utils.hooks import collect_data_files, collect_submodules + +datas = collect_data_files('scrapy') +hiddenimports = collect_submodules('scrapy') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-setuptools._vendor.importlib_metadata.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-setuptools._vendor.importlib_metadata.py new file mode 100644 index 0000000..e7c92d0 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-setuptools._vendor.importlib_metadata.py @@ -0,0 +1,21 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import fnmatch +from PyInstaller.utils.hooks.setuptools import setuptools_info + +# Collect metadata for setuptools-vendored copy of importlib-metadata, to match the behavior of hook for +# stand-alone version of the package (i.e., `hook-importlib_metadata.py`). + +# Use cached data files list from setuptools_info, and extract relevant bits (to avoid having to call another +# `collect_data_files` and import `setuptools` in isolated process). +datas = [(src_name, dest_name) for src_name, dest_name in setuptools_info.vendored_data + if fnmatch.fnmatch(src_name, "**/setuptools/_vendor/importlib_metadata-*.dist-info/*")] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-setuptools._vendor.jaraco.text.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-setuptools._vendor.jaraco.text.py new file mode 100644 index 0000000..47e65da --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-setuptools._vendor.jaraco.text.py @@ -0,0 +1,18 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import fnmatch +from PyInstaller.utils.hooks.setuptools import setuptools_info + +# Use cached data files list from setuptools_info, and extract relevant bits (to avoid having to call another +# `collect_data_files` and import `setuptools` in isolated process). +datas = [(src_name, dest_name) for src_name, dest_name in setuptools_info.vendored_data + if fnmatch.fnmatch(src_name, "**/setuptools/_vendor/jaraco/text/*")] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-setuptools.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-setuptools.py new file mode 100644 index 0000000..6c2c1bb --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-setuptools.py @@ -0,0 +1,75 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller import compat +from PyInstaller.utils.hooks.setuptools import setuptools_info + +datas = [] + +hiddenimports = [ + # Test case import/test_zipimport2 fails during importing pkg_resources or setuptools when module not present. + 'distutils.command.build_ext', + 'setuptools.msvc', +] + +# Necessary for setuptools on Mac/Unix +if compat.is_unix or compat.is_darwin: + hiddenimports.append('syslog') + +# Prevent the following modules from being collected solely due to reference from anywhere within setuptools (or +# its vendored dependencies). +excludedimports = [ + 'pytest', + 'numpy', # originally from hook-setuptools.msvc + 'docutils', # originally from hool-setuptools._distutils.command.check +] + +# setuptools >= 39.0.0 is "vendoring" its own direct dependencies from "_vendor" to "extern". This also requires +# 'pre_safe_import_module/hook-setuptools.extern.six.moves.py' to make the moves defined in 'setuptools._vendor.six' +# importable under 'setuptools.extern.six'. +# +# With setuptools 71.0.0, the vendored packages are exposed to the outside world by `setuptools._vendor` location being +# appended to `sys.path`, and the `VendorImporter` is gone (i.e., no more mapping to `setuptools.extern`). Since the +# vendored dependencies are now exposed as top-level modules (provided upstream versions are not available, as they +# would take precedence due to `sys.path` ordering), we need pre-safe-import-module hooks that detect when only vendored +# version is available, and add aliases to prevent duplicated collection. For list of vendored packages for which we +# need such pre-safe-import-module hooks, see the code in `PyInstaller.utils.hooks.setuptools`. +# +# The list of submodules from `setuptools._vendor` is now available in `setuptools_info.vendored_modules` (and covers +# all setuptools versions). +# +# NOTE: with setuptools >= 71.0, we do not need to add modules from `setuptools._vendored` to hidden imports anymore, +# because the aliases we set up should ensure that the necessary parts get collected. We still need them for earlier +# versions of setuptools, though. +if setuptools_info.version < (71, 0): + hiddenimports += setuptools_info.vendored_modules + +# The situation with vendored distutils (from `setuptools._distutils`) is a bit more complicated; python >= 3.12 does +# not provide stdlib version of `distutils` anymore, so our corresponding pre-safe-import-module hook sets up aliases. +# In earlier python versions, stdlib version is available as well, and at run-time, we might need both versions present, +# so that whichever is applicable can be used. Therefore, for python < 3.12, we need to add the vendored distuils +# modules to hidden imports. +if setuptools_info.distutils_vendored and not compat.is_py312: + hiddenimports += setuptools_info.distutils_modules + +# With setuptools >= 71.0.0, the vendored packages also have metadata, and might also contain data files that need to +# be collected. The list of corresponding data files is kept cached in `setuptools_info.vendored_data` (to minimize the +# number of times we need to call collect_data_files()). +# +# While it might be tempting to simply collect all data files and be done with it, we actually need to match the +# collection behavior for the stand-alone versions of these packages; i.e., we should collect metadata (and/or data +# files) for the vendored package only if the same data is also collected for stand-alone version. Otherwise, we risk +# inconsistent behavior and potential mismatches; for example, if we collected metadata for vendored package A here, +# but end up collecting stand-alone A, for which we normally do not collect the metadata, then at run-time, we will end +# up with stand-alone copy of A and vendored copy of its metadata being discoverable. +# +# Therefore, if metadata and/or metadata needs to be collected, do it in corresponding sub-package hook (for an example, +# see `hook-setuptools._vendor.jaraco.text.py`). diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-shelve.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-shelve.py new file mode 100644 index 0000000..1df601a --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-shelve.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# Tested on Windows 7 x64 With Python 3.5 + +hiddenimports = ["dbm.ndbm", "dbm.dumb", "dbm.gnu"] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-shiboken6.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-shiboken6.py new file mode 100644 index 0000000..17cf0c3 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-shiboken6.py @@ -0,0 +1,17 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller import compat + +# Up until python 3.12, `xxsubtype` was built-in on all OSes. Now it is an extension on non-Windows, and without it, +# shiboken6 initialization segfaults. +if compat.is_py312 and not compat.is_win: + hiddenimports = ['xxsubtype'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-sphinx.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-sphinx.py new file mode 100644 index 0000000..f5a13ac --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-sphinx.py @@ -0,0 +1,41 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_data_files, collect_submodules, eval_statement + +# Sphinx consists of several extensions that are lazily loaded. So collect all submodules to ensure we do not miss +# any of them. +hiddenimports = collect_submodules('sphinx') + +# For each extension in sphinx.application.builtin_extensions that does not come from the sphinx package, do a +# collect_submodules(). We need to do this explicitly because collect_submodules() does not seem to work with +# namespace packages, which precludes us from simply doing hiddenimports += collect_submodules('sphinxcontrib') +builtin_extensions = list( + eval_statement( + """ + from sphinx.application import builtin_extensions + print(builtin_extensions) + """ + ) +) +for extension in builtin_extensions: + if extension.startswith('sphinx.'): + continue # Already collected + hiddenimports += collect_submodules(extension) + +# This is inherited from an earlier version of the hook, and seems to have been required in Sphinx v.1.3.1 era due to +# https://github.com/sphinx-doc/sphinx/blob/b87ce32e7dc09773f9e71305e66e8d6aead53dd1/sphinx/cmdline.py#L173. +# It does not hurt to keep it around, just in case. +hiddenimports += ['locale'] + +# Collect all data files: *.html and *.conf files in ``sphinx.themes``, translation files in ``sphinx.locale``, etc. +# Also collect all data files for the alabaster theme. +datas = collect_data_files('sphinx') + collect_data_files('alabaster') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-sqlalchemy.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-sqlalchemy.py new file mode 100644 index 0000000..3aafc50 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-sqlalchemy.py @@ -0,0 +1,88 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import re +import importlib.util + +from PyInstaller import isolated +from PyInstaller.lib.modulegraph.modulegraph import SourceModule +from PyInstaller.utils.hooks import check_requirement, collect_entry_point, logger + +datas = [] + +# 'sqlalchemy.testing' causes bundling a lot of unnecessary modules. +excludedimports = ['sqlalchemy.testing'] + +# Include most common database bindings some database bindings are detected and include some are not. We should +# explicitly include database backends. +hiddenimports = ['pysqlite2', 'MySQLdb', 'psycopg2', 'sqlalchemy.ext.baked'] + +if check_requirement('sqlalchemy >= 1.4'): + hiddenimports.append("sqlalchemy.sql.default_comparator") + + +@isolated.decorate +def _get_dialect_modules(module_name): + import importlib + module = importlib.import_module(module_name) + return [f"{module_name}.{submodule_name}" for submodule_name in module.__all__] + + +# In SQLAlchemy >= 0.6, the "sqlalchemy.dialects" package provides dialects. +# In SQLAlchemy <= 0.5, the "sqlalchemy.databases" package provides dialects. +if check_requirement('sqlalchemy >= 0.6'): + hiddenimports += _get_dialect_modules("sqlalchemy.dialects") +else: + hiddenimports += _get_dialect_modules("sqlalchemy.databases") + +# Collect additional dialects and plugins that are registered via entry-points, under assumption that they are available +# in the build environment for a reason (i.e., they are used). +for entry_point_name in ('sqlalchemy.dialects', 'sqlalchemy.plugins'): + ep_datas, ep_hiddenimports = collect_entry_point(entry_point_name) + datas += ep_datas + hiddenimports += ep_hiddenimports + + +def hook(hook_api): + """ + SQLAlchemy 0.9 introduced the decorator 'util.dependencies'. This decorator does imports. E.g.: + + @util.dependencies("sqlalchemy.sql.schema") + + This hook scans for included SQLAlchemy modules and then scans those modules for any util.dependencies and marks + those modules as hidden imports. + """ + + if not check_requirement('sqlalchemy >= 0.9'): + return + + # this parser is very simplistic but seems to catch all cases as of V1.1 + depend_regex = re.compile(r'@util.dependencies\([\'"](.*?)[\'"]\)') + + hidden_imports_set = set() + known_imports = set() + for node in hook_api.module_graph.iter_graph(start=hook_api.module): + if isinstance(node, SourceModule) and node.identifier.startswith('sqlalchemy.'): + known_imports.add(node.identifier) + + # Read the source... + with open(node.filename, 'rb') as f: + source_code = f.read() + source_code = importlib.util.decode_source(source_code) + + # ... and scan it + for match in depend_regex.findall(source_code): + hidden_imports_set.add(match) + + hidden_imports_set -= known_imports + if len(hidden_imports_set): + logger.info(" Found %d sqlalchemy hidden imports", len(hidden_imports_set)) + hook_api.add_imports(*list(hidden_imports_set)) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-sqlite3.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-sqlite3.py new file mode 100644 index 0000000..805bf8f --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-sqlite3.py @@ -0,0 +1,19 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_submodules + +hiddenimports = [] + +# On Windows in Python 3.4 'sqlite3' package might contain tests that are not required in frozen application. +for mod in collect_submodules('sqlite3'): + if not mod.startswith('sqlite3.test'): + hiddenimports.append(mod) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-sysconfig.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-sysconfig.py new file mode 100644 index 0000000..d4331cf --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-sysconfig.py @@ -0,0 +1,29 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +import sys + +# see https://github.com/python/cpython/blob/3.9/Lib/sysconfig.py#L593 +# This will exclude `_osx_support`, `distutils`, `distutils.log` for sys.platform != 'darwin' +if sys.platform != 'darwin': + excludedimports = ["_osx_support"] + +# Python 3.6 uses additional modules like `_sysconfigdata_m_linux_x86_64-linux-gnu`, see +# https://github.com/python/cpython/blob/3.6/Lib/sysconfig.py#L417 +# Note: Some versions of Anaconda backport this feature to before 3.6. See issue #3105. +# Note: on Windows, python.org and Anaconda python provide _get_sysconfigdata_name, but calling it fails due to sys +# module lacking abiflags attribute. It does work on MSYS2/MINGW python, where we need to collect corresponding file. +try: + import sysconfig + hiddenimports = [sysconfig._get_sysconfigdata_name()] +except AttributeError: + # Either sysconfig has no attribute _get_sysconfigdata_name (i.e., the function does not exist), or this is Windows + # and the _get_sysconfigdata_name() call failed due to missing sys.abiflags attribute. + pass diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-wcwidth.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-wcwidth.py new file mode 100644 index 0000000..dc7c2dd --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-wcwidth.py @@ -0,0 +1,14 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2017-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller.utils.hooks import collect_data_files + +datas = collect_data_files('wcwidth') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-win32ctypes.core.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-win32ctypes.core.py new file mode 100644 index 0000000..6971473 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-win32ctypes.core.py @@ -0,0 +1,22 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2020-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# TODO: remove this hook during PyInstaller 4.5 release cycle! + +from PyInstaller.utils.hooks import can_import_module, collect_submodules + +# We need to collect submodules from win32ctypes.core.cffi or win32ctypes.core.ctypes for win32ctypes.core to work. +# Always collect the `ctypes` backend, and add the `cffi` one if `cffi` is available. Having the `ctypes` backend always +# available helps in situations when `cffi` is available in the build environment, but is disabled at run-time or not +# collected (e.g., due to `--exclude cffi`). +hiddenimports = collect_submodules('win32ctypes.core.ctypes') +if can_import_module('cffi'): + hiddenimports += collect_submodules('win32ctypes.core.cffi') diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-xml.dom.domreg.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-xml.dom.domreg.py new file mode 100644 index 0000000..eb7161a --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-xml.dom.domreg.py @@ -0,0 +1,13 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# xml.dom.domreg line 54 +hiddenimports = ['xml.dom.minidom'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-xml.etree.cElementTree.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-xml.etree.cElementTree.py new file mode 100644 index 0000000..95dc702 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-xml.etree.cElementTree.py @@ -0,0 +1,13 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# cElementTree has a hidden import (Python >=2.5 stdlib version) +hiddenimports = ['xml.etree.ElementTree'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-xml.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-xml.py new file mode 100644 index 0000000..d7776a0 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-xml.py @@ -0,0 +1,12 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +hiddenimports = ['xml.sax.xmlreader', 'xml.sax.expatreader'] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/hook-zope.interface.py b/venv/Lib/site-packages/PyInstaller/hooks/hook-zope.interface.py new file mode 100644 index 0000000..b43d023 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/hook-zope.interface.py @@ -0,0 +1,12 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2015-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +excludedimports = ["unittest"] diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__init__.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__init__.py new file mode 100644 index 0000000..792d600 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__init__.py @@ -0,0 +1 @@ +# diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c10400ac0193fedcf1d397374037e7c038f3c0a4 GIT binary patch literal 209 zcmZ3^%ge<81gF(}(wTttV-N=h7@>^MY(U0zh7^Wi22Do4l?+87m7hV9zf#<-V)7Dm zV@irjD^v3d3w3i+Q!#5g$h literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-PyQt5.uic.port_v2.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-PyQt5.uic.port_v2.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b03c52b4ec747c167fbd92ebd2bfccbdcbf28eb8 GIT binary patch literal 390 zcmZ3^%ge<81gF(}(swX1FgylvV1NHb)L<7SEY1sykD=ZQh!00nji~;B!u&R{|MeIOs5i5}R k#bE=n)UJpV$OU<-SPn>hU}j`w{2;}|DEEN@lK|@n0I!r{>i_@% literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-_pyi_rth_utils.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-_pyi_rth_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a551ee5105fb7d32afb8bf93a4d6b9c2f5af879 GIT binary patch literal 862 zcmZuv&1(}u6rb5_s%~2$DCW|`NX3xDHuoTfQcC?OwO~&nu&z6k>@>4G+nGrur9uw9 zcoPwN5&Z9UrXSQdJMYcg_x8Qt{@#3;pZ5^Rm%AI?mnDS$ zSZ6BE$zgH_4u^=M7NVFs0=F>Ol5mnztAr7C4^Ydc&J$EG@BQ?)W3EXoWsihH$mg0+ zt|K{MYDmJAl1K`{BEw}$WQS}GAEeqqB2zU@cxsqRLqURU$OC2Kpl`U)B$2c)7%_2Z zNT%d~Q>KXxaWnKf{j?~jNk=N8`l)Yt!U_a>$pbiS`aR&{NhVmrpbv#^q;{@uXyp+xH`U!jd&EY+w;ho`O0=2J}>RPV?SP zd7Xv|Yi7<|ir+)d=hM6wcprE1J_>C8LMQ^Zoz1ttWv(Uu3yCZq3ESP*& zvrt8GK)KR&CohE=&%NUxE#BEagdEBBW;+d&wo&~dOLupD!B`agMoQ5huyoMg;LqBc z8|G(W)C;>zx6jjON3I*0VnK(eG&remu{3PRzr<*M^MA=|4$xF#YkTWP=vU>&o9f}h z>xH+ykIUaG&F_`w=;4p*?N?&7dhmDzYXW(2_3|r0KxGsJsti8N=b+x-%c=sdosV7vH7;R{$G6JZ9V4r*BkYZ?+4UPOe!cjNXB@mZMweC5<{xnu B@Y4VQ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-distutils.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-distutils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef73bd7ba484751992f23fbc5e2de47f46159478 GIT binary patch literal 1949 zcma(SO=}xRbXJn}mD(XrB)3kBr-lkEiIhtNv0Yk72~FzY8pmKTidU9(>3#5FdL=DgFaF_u3vLvms%j5GXzLW-z(r)Hf@wEVnB4Xm<9!H}8Ajd-`d7 zJdI%entM>YoJUm46K)EMb=R@m`k6$GNP~c+Eq}LmcLCIasS34> z76T1}(mEu>1qvQy9?(%Lu*s<*!E~jK=OAj=CST=oi*mtSz^b_1mx45u7crA6D94p) zqtURL8H9EY)xp^ASI8yR{nS{zo+`^J``30!YksP|)8o*L<^%v1z0R3=qcNW`Hx`Op%EQE&NF910l5Wd&WVJ~vl!ddLp z-YIl0%aPs4)*vbp-442vXXW_7Ikc4sVG=uQ6*?0=M7xn)?SJIPM#;%bpAZzzIGchSLLSAY0RRkq+~vx0Fx$#IhfE8>UOBpBl8OpB7X$8`5=cvGeJGya1EK zZ9$6$g*wFY$$zm(VzbK5{LuAjA!A{&Ixb*NrNN>2pe0qih(HDt#_?x7pY{`Kn1B{P zwgLcGRpQ4R28RjcCpZ$20Xb6kN6FaJ@jq@U7mh+)G(>^*PxUN>{!Q+vhB ztiR6aM;X1FF}#eixBNDd@eVC@@8W1``rvvuoAa`{{R@4rmCov;ZgSI0Zg!HJZ?5JJ3j5Kg7x&?J z0`Z`H+)wB_aZO$4sviBRq4X7l|Epq<#Ne9-A3ey(&xmJ%onL|Dee#RmxcZV$1F8m$ qSc2m?s%hGBHl@Xmkvg(SySO)@es9s;&ZvDHzpTw2qkkWPvA+S(rXA-1 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-pyi_splash.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-pyi_splash.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a01e9294f3f6ef2b85ec95f5ad4ee3ca6ff1964f GIT binary patch literal 1376 zcmZ`&&1)M+6o0e3QdW{9OyDwLpcn{*AGPL|e^e>_^47`Ryh`YIKWA0wZ$TQ(P*V^mRwX zqp)$n>qSf#!;KQdyu)r1@h(Tt#*|*1iMP1nZ}HklRV^m{&{Ij|t4=-XU#u7ZHn^=; zNm^QKT)Wx0zP#4B{W&i4k!a&h0y4(c42U_{_#gg>Vh;)iO^Dzj(PnqtHYb$;W<5pg zXU858akvE+K<6jA03U)}CZOHv&ZdbnY(LHDP4)nEc{*qIQ;hcPIO0R=fz>7tz&rN$ zj?A3@W_EX&+kN=Tz6vxh8Bci3cpQXW)vJZHIJJ-t=9xNS zydl!kjUjuMr4%x?gi4*n*PYbaL?TL4qO_#AFN2Q9LaC~DYWqnj4a(`5i^Bt>Nhy83 zb^WszUbv-Yug~Lq_i7R6L8qpLh+5k`-fpdg>n#;(UK`V2wPtB&o)Yp+a&IGynKvS! zXEIteN44o4kcsK(w<*d~n95oF)wd`fL1vY5l`Id1_Xh5{QGZp2Lgh(maGLGA{J`Y{ zmp^yQyZNJ66_{Jdz{!0*@hbz1GlgbOX zY<%6^cUKPFmBCEU3dYmX(UCGaedBxpKQ>B@%l7Y=2+Hb-^n~Xz5qO>~;5ojg>4P6Z zzc8~?@98j7^&vvT0uC?w8yuo3$O?+r?$r@sOY#gZ%^Om8P-HeCBs-HMP6kGlffOGV c%=Z#54BqU|;nLvEp5^CAC4>J9Igh^o1xV0*L;wH) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-tkinter.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_find_module_path/__pycache__/hook-tkinter.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f5e1bfdc9d550e6340b4cace1fc1e5a6f37a829 GIT binary patch literal 849 zcmZuuL2DC16n?WwHoJ`pC`zOhT(wjpB)y7?2NARoics(n0?X{~WHZ^x?sj&P8u8GB zhvLO!J$h2apW-Ej9LhpL@Z>F!TTjkxnlwcp^WMBS^JeDzzWG)zuYt6mTTTCY4&b*c z7AEV=W-sJ)3?6uhK_9g=q;ier`uSEKfd)kD6)t*#=wA`Q59xDj6}{XCXc=C94{C)! zYO#jW9E*H8>B42U2;612+*PkCpM^3UgOG7yy=7ldTdXDbg}%rEzT_|S%gjSpF(L5b zJ=jak9_&d*5}&sF?v)5=C?e^MY(U0zh7^Wi22Do4l?+87m7hV9ztY^TV)7Dm zV@irjD^v3d3w3i+Q6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BUxbGM4gOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=36H80-lk;6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BS*akq-eOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=3lYrVlZYdyqg zAGsNdGBEo0(KrGdY~q4P%7jQ;aTQN3t7xl-P)^v1P0*8n+3Z9Rq<6w{6(OK4aC%hMrfB%cJ2eqn0}g z7Wuf$oXh3T+~tjexcrQCSYT(5Is zxh`c3JHEfm7Xn62Zf#T3@dBTTK{3(K{HW?e&@O|%L(8@AE`2jP+G0@r#(39bni4Nlt-J9?fqS+Lp&I{wW7!5CKj*uS5YoE=WUdW&Cf6w}x6iL$>JpKqUyMAuf6x8MW_r2g`Rp_@De=r&6-%Heaw9G=FOY;zK@v?x!e^%`!+IJ zdEWu>OK#exw49S+bhf|&hj>sWbA(7=@sz4MmqK6NggMPg&48)>mRC$7(&eBU+8jM? zAqbYDGHKP4OA4oo^W+o47I4J2EuQDGCt2WHI}WfYZzNWSMOh&+hwLEBy*5+WApW%> z;EATQjA39JfeN0?f}dK2HFXwNNu3nn#f=T64%_KgsY^>;*+C|I=WGbP?RQ`Xb)!mU zN@Oexn&e2r7l*^2mfm5OX} ztxQAi2EMp%havSHEL>i)D>P|fszS9xS7@?ZBvQ#D8x9T*p3=wnOIW1DS#6#A%gcF> z((*!{2Z2{wq5eu~(w#3wE~oic$*A;v{iz>u+w&+JPabAGWYmi6m(+5rVZhpSlf!() z9She*@BdR+H`2I@GkSyY8jd@1o3COpw9$AVmF+t=ZXOzUKi>QN=I$YZz}fn{ftu24W!D(F7WWBfaZ~KJ;B5+AbXE=AmxxCnGjx zucYBfJ2}#k%ew&+cJ&GM3z<--%(Updp!)2!x-Ue=lDA^=ORsp@_|O=7gg#xrj+XyRNfN9uA_(@=q6quE>-{%4GbUH7+5*3vq)WHk(yyV z$NnOV_7xWG3o!HTZ01d1DwM~mfv#0O?ZM#c|P N%#1o87%&O2egGa)a%KPk literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.AppIndicator3.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.AppIndicator3.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b68d1f687fdb443cd1d79b9a28522e17dfe414f GIT binary patch literal 473 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg#x78H2qrDP^20(r)I1(mnNui2fB_Ih>I0~L<7SIHU?IX z>nu{2Sfpkc&#}MAqJ4!$`vMGo2C8B3(_{qeTFFqv0pu330f}E6HV~iN6@g+2jF2L?<6tRDcBD|STy literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Atk.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Atk.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c82da5beb63e2e289c4d10dee70086b6fef5e82 GIT binary patch literal 463 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg#xmSpP{RNfN9uA_(@=q6quE>-{%4GbUH7+5*3vq)WHk(yyV z$NnOV_7xWG3o!HTZ01d1DwM~mfv#0O?ZM#c|P N%#1o87%&O2egGiaa%uno literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.AyatanaAppIndicator3.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.AyatanaAppIndicator3.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc43bf9e7f7101ced9029dbd8f92219fb9b4f89b GIT binary patch literal 480 zcmZuuy-UMD6o1!5Eou=Q96CrRA=I`*w<1a>DU>3(Ng$lb*~TWh>s?w1ba2qWK?esX zMf_7-R0JWb|3IKyCtuQ!r9STc-skV#*Gr+W2`KLe?e2~S@S6q;A#-Q4jm|wda0?gU zkaI9{_M(=yATQHNBkLQ(6WUc7!}XH&jNaQaA~+kTl8%v!cd6r8au|fJ&n%xiLyyH< zGiwFZX9kHiDqNM4OVhj4hKX4-l*5PxgF(e(%AF?P1ji9vM%89SLmJSg5Us#*ZHmcy zRYdXL|0CoE9sp@_|O=7gg#xXC&qpqh#lxMULY=301^!hAJ`aJIj*xv zU1E`%VLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7ZC3<}A&_^A<$%No TW=2NF4^qsGIv*G?39xsp@_|O=7gg#x=aiO|q!#HFRNfN9uB(V0=q_F$E>-{%4GbUH7+5*3vq)WH zk(yyV$NnOV_7xWG3o!HTc11d1P!XN%>4#0O?Z RM#c|P%#1o87%&O2egJRJbTI$` literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.DBus.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.DBus.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..640d228d13559c4da70cce61bb409ada3d4fae67 GIT binary patch literal 464 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%HIF%Ob6;$35!>*->9q1@tATCw_5)BL=*cezjuCqv8Vv(9* zJjebbi}n>3?F%sU8K{QAPm>X>Yb8Sw2asFD1|)uQ*g!mNR|JY2kWY){fW!x8Mn=XD OQp}7x9~dwRuzmoZ9CEn; literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GIRepository.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GIRepository.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0932b6fdece53c4e02d464f85ae1274a4137511 GIT binary patch literal 472 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%Hdj=sm1(mnNuxl-12Re=yh>I0~L<7SIHU?IX>nu{2Sfpkc z&#}MAqJ4!$`vMGo2C8B3(_{qeTFFqv0pu330f}E6HV}{76@elNjF2L?<6tRDa_2zDa? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GLib.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GLib.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4546efd795d79429be87eaf650ede53ffbb78dae GIT binary patch literal 464 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H1C7%wsJtbHT}u%=&{4cVT&w^j8W=vXF|cx6XOX(ZA~nN! zj{QXz?JF$W7hvc!Pz{5hCL>taN`@j1Ah(DONc`fkfq2-i2oyOWpBBpji4V+-jEoG3GFklj3{Q#6ra;X3S literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GModule.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GModule.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3436fc5414c9f5c51fdd5db755688de1cf4e4f7 GIT binary patch literal 467 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H`+^;$S5SFN47;u(cA&d>fw))!NHj2fU}IqAxXvPViA8FL z@f`b$EZSFCv@gKWXP_DeKTSrku9XZ$96)Xn8<6yY85tQr ONHH_&d|<#N!1@7AxpVsf literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GObject.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GObject.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c824f613a2d61d3be9ad0a4ae672e808242242f8 GIT binary patch literal 467 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H`zK|kCYR_HRNfN9uB(V0=q_F$E>-{%4GbUH7+5*3vq)WH zk(yyV$NnOV_7xWG3o!HTc11d1P!XN%>4#0O?Z RM#c|P%#1o87%&O2egH%^bL;>B literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gdk.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gdk.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6254041bddc7de4c0881edfe0d972ec1e132be41 GIT binary patch literal 463 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%Hr)29DRNfN9uA_(@=q6quE>-{%4GbUH7+5*3vq)WHk(yyV z$NnOV_7xWG3o!HTZ01d1DwM~mfv#0O?ZM#c|P N%#1o87%&O2egGP(a$o=e literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GdkPixbuf.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GdkPixbuf.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b88971a19ee4f975e817afc13215089fcb705502 GIT binary patch literal 469 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%Hr(_3YRwR|C=@nGo62q>qh#lxMULY=301^!hAJ`aJIj*xv zU1E`%VLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7ZC3<}A&_^A<$%No TW=2NF4^qsGIv*G?39xsp@_|O=7gg%HXXfh_RNfN9uA_(@=q6quE>-{%4GbUH7+5*3vq)WHk(yyV z$NnOV_7xWG3o!HTZ01d1DwM~mfv#0O?ZM#c|P N%#1o87%&O2egGgna%lhn literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Graphene.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Graphene.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bdca1c99f813db97a13162de7599bfe88213d72 GIT binary patch literal 468 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7bO;Cq~@jS6;$35!>+A}9q2G#ATCw_5)BL=*cezjuCqv8 zVv(9*Jjebbi}n>3?F%sU8K{QAPm>X>Yb8Sw2asFD1|)uQ*g!mOR|JY6kZ+6SfW!x8 SMn=XDQp}7x9~dwRuzmpQe{^{O literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gsk.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gsk.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72966514311fbd60c33b23d3f26a78216255e09b GIT binary patch literal 463 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7ia4gRNfN9uA_(@=q6quE>-{%4GbUH7+5*3vq)WHk(yyV z$NnOV_7xWG3o!HTZ01d1DwM~mfv#0O?ZM#c|P N%#1o87%&O2egGr;a&G_t literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gst.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gst.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbbd38add28aeee5acb1f7f86f8f4cb0889cc43b GIT binary patch literal 463 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7nkT2RNfN9uA_(@=q6quE>-{%4GbUH7+5*3vq)WHk(yyV z$NnOV_7xWG3o!HTZ01d1DwM~mfv#0O?ZM#c|P N%#1o87%&O2egG+na(Dm$ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstAllocators.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstAllocators.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..596386245d82cd6713474690631f728a98a74646 GIT binary patch literal 473 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7neBZi2fB_Ih>I0~L<7SIHU?IX z>nu{2Sfpkc&#}MAqJ4!$`vMGo2C8B3(_{qeTFFqv0pu330f}E6HV~iN6@g+2jF2L?<6tRDczzIK)X literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstApp.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstApp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3dc33695f8f8b867922725902406811bb2fd48f GIT binary patch literal 466 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7ne8|6zCOH-V(#EsfZouEM6ckRsa$W3?JASSUIksp@_|O=7gg%H7neAerex;p6;$35!>+A}9q2G#ATCw_5)BL=*cezjuCqv8 zVv(9*Jjebbi}n>3?F%sU8K{QAPm>X>Yb8Sw2asFD1|)uQ*g!mOR|JY6kZ+6SfW!x8 SMn=XDQp}7x9~dwRuzmpK9CU90 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstBadAudio.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstBadAudio.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..183b6eb802aa3a768295d41a1a6e24f05f85633b GIT binary patch literal 471 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7ne9CrZ|?SWajG?RNfN9uCs_8=r&#;E>-{%4GbUH7+5*3 zvq)WHk(yyV$NnOV_7xWG3o!HTf21d1b&hl}Na V#0O?ZM#c|P%#1o87%&O2egJhZb$I{) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstBase.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstBase.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32cff7165809926a5424ec758ec6316ac2b886e5 GIT binary patch literal 467 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7ne9C7N_bJRNfN9uB(V0=q_F$E>-{%4GbUH7+5*3vq)WH zk(yyV$NnOV_7xWG3o!HTc11d1P!XN%>4#0O?Z RM#c|P%#1o87%&O2egI31bN2uM literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstCheck.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstCheck.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88975b216ad096e3c700cda1505d138f8e5e01e9 GIT binary patch literal 468 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7ne9^q$X$U6;$35!>+A}9q2G#ATCw_5)BL=*cezjuCqv8 zVv(9*Jjebbi}n>3?F%sU8K{QAPm>X>Yb8Sw2asFD1|)uQ*g!mOR|JY6kZ+6SfW!x8 SMn=XDQp}7x9~dwRuzmp7p>$gS literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstCodecs.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstCodecs.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89555245c28faf6e5e92ca638ad51d54728406ff GIT binary patch literal 469 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7neBar=%tq>lIYq62q>qh#lxMULY=301^!hAJ`aJIj*xv zU1E`%VLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7ZC3<}A&_^A<$%No TW=2NF4^qsGIv*G?39xsp@_|O=7gg%H7neBa=am%YgLLZ^RNfN9uD6IC=sI2?E>-{%4GbUH7+5*3 zvq)WHk(yyV$NnOV_7xWG3o!Hsp@_|O=7gg%H7nivE=oM7n62q>ih#lxEULY=301^!hAJ`aJIj*xvU1E`% zVLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7Y*z$|9gtUx<$%NoW=2NF P4^qsGIv*G?39xsp@_|O=7gg%H7nivExVro36;$35!>+A}9q2G#ATCw_5)BL=*cezjuCqv8 zVv(9*Jjebbi}n>3?F%sU8K{QAPm>X>Yb8Sw2asFD1|)uQ*g!mOR|JY6kZ+6SfW!x8 SMn=XDQp}7x9~dwRuzmoL2Xp8E literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLWayland.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLWayland.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8e6b55db301fdbdaa6b3f972f17444fb925d621 GIT binary patch literal 472 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7nivEgeO+!B<7{)6;$35!>+Z69q2e-ATCw_5)BL=*cezj zuCqv8Vv(9*Jjebbi}n>3?F%sU8K{QAPm>X>Yb8Sw2asFD1|)uQ*g!mPR|JYAkdKSy WfW!x8Mn=XDQp}7x9~dwRuzmmsE_LJp literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLX11.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLX11.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..512e1c067e26272b8573586f133b327cae06fa8f GIT binary patch literal 468 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7nivEL>L+A}9q2G#ATCw_5)BL=*cezjuCqv8 zVv(9*Jjebbi}n>3?F%sU8K{QAPm>X>Yb8Sw2asFD1|)uQ*g!mOR|JY6kZ+6SfW!x8 SMn=XDQp}7x9~dwRuzmo2lXJ=d literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstInsertBin.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstInsertBin.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca9a0f7deb280ed275a4032e589bb0a86564f154 GIT binary patch literal 472 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7ncAvrxuksW#;J>RNfN9uC<6A=r~>=E>-{%4GbUH7+5*3 zvq)WHk(yyV$NnOV_7xWG3o!Hsp@_|O=7gg%H7nk@Jq^6e?>lIYq62q>qh#lxMULY=301^!hAJ`aJIj*xv zU1E`%VLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7ZC3<}A&_^A<$%No TW=2NF4^qsGIv*G?39xsp@_|O=7gg%H7nk^@mgp5!-V(#EsfZouEM6ckRsa$W3?JASSUIksp@_|O=7gg%H7ncMim6l}Y6zdgK-V(#Ev4|b$G+rPsRsa$W3?JASSUIk< zNL^x)nqfT0{vwO^6&CFaF!ULyhQUvh5v*$^LlFm%Tf_z=esS19ylqzmiXxDIi{*gC U2WCb_#t%}=j5;3}FbS}J02r)wVgLXD literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPlay.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPlay.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e26e9e25cead0a52bd71b55058ae482be0676549 GIT binary patch literal 467 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7ncO&Bv$GbRNfN9uB(V0=q_F$E>-{%4GbUH7+5*3vq)WH zk(yyV$NnOV_7xWG3o!HTc11d1P!XN%>4#0O?Z RM#c|P%#1o87%&O2egIr#bP@mn literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPlayer.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPlayer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99170f5064538f97971aef9543d5ff63821de47a GIT binary patch literal 469 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7ncO&Bvz&t=@nGo62q>qh#lxMULY=301^!hAJ`aJIj*xv zU1E`%VLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7ZC3<}A&_^A<$%No TW=2NF4^qsGIv*G?39xsp@_|O=7gg%H7ncN;6zCOH-V(#EsfZouEM6ckRsa$W3?JASSUIkb%7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtsp.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtsp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36530e58771396180275ef03ad1152c94622c7f0 GIT binary patch literal 467 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7ncN;6c^|fRNfN9uB(V0=q_F$E>-{%4GbUH7+5*3vq)WH zk(yyV$NnOV_7xWG3o!HTc11d1P!XN%>4#0O?Z RM#c|P%#1o87%&O2egJ4jbR_@) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtspServer.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtspServer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a97afbae09d7a4ba329a5b763bae6ba68f08a74b GIT binary patch literal 473 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7ncN;6c+@i7L}zI=@nGo62q>yh#lxUULY=301^!hAJ`aJ zIj*xvU1E`%VLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7ZdU|~C6Jek X<$%NoW=2NF4^qsGIv*G?39xsp@_|O=7gg%H7ncO56zCOH-V(#EsfZouEM6ckRsa$W3?JASSUIksp@_|O=7gg%H7ng)2rt1|{-V(#EsfZouEM6ckRsa$W3?JASSUIksp@_|O=7gg%H7ng(-CFT_;=cl9==@nGo62q>yh#lxUULY=301^!hAJ`aJ zIj*xvU1E`%VLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7ZdU|~C6Jek X<$%NoW=2NF4^qsGIv*G?39xsp@_|O=7gg%H7ng)(rljWU6;$35!>+A}9q2G#ATCw_5)BL=*cezjuCqv8 zVv(9*Jjebbi}n>3?F%sU8K{QAPm>X>Yb8Sw2asFD1|)uQ*g!mOR|JY6kZ+6SfW!x8 SMn=XDQp}7x9~dwRuzmpNUUYN- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkan.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkan.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d331ecb46adc15e65f7127a20e6803b3b466d8a9 GIT binary patch literal 469 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7ng*U=42=4=@nGo62q>qh#lxMULY=301^!hAJ`aJIj*xv zU1E`%VLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7ZC3<}A&_^A<$%No TW=2NF4^qsGIv*G?39xsp@_|O=7gg%H7ng*U=42=4g(p_#B<7{)6;$35!>+xE9q2$_ATCw_5)BL= z*cezjuCqv8Vv(9*Jjebbi}n>3?F%sU8K{QAPm>X>Yb8Sw2asFD1|)uQ*g!mQR|JYE akgtp7fW!x8Mn=XDQp}7x9~dwRuzmn{V0Xp< literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkanXCB.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkanXCB.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db565e02783aaed29c297db54d36cc4b6d3edbb0 GIT binary patch literal 472 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7ng*U=42=4ML0X@6;$35!>+Z69q2e-ATCw_5)BL=*cezj zuCqv8Vv(9*Jjebbi}n>3?F%sU8K{QAPm>X>Yb8Sw2asFD1|)uQ*g!mPR|JYAkdKSy WfW!x8Mn=XDQp}7x9~dwRuzmph*>%qV literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstWebRTC.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstWebRTC.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ac09b7bb41ae0755254bf83685edfce720cf30f GIT binary patch literal 469 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%H7ng*mCIy8!>lIYq62q>qh#lxMULY=301^!hAJ`aJIj*xv zU1E`%VLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7ZC3<}A&_^A<$%No TW=2NF4^qsGIv*G?39xsp@_|O=7gg%Hmt^Y|RNfN9uA_(@=q6quE>-{%4GbUH7+5*3vq)WHk(yyV z$NnOV_7xWG3o!HTZ01d1DwM~mfv#0O?ZM#c|P N%#1o87%&O2egGtza&Q0u literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkChamplain.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkChamplain.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b458cdae371a8da3ca2368eb24a02137665fb8b GIT binary patch literal 472 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%Hmt;F+Z69q2e-ATCw_5)BL=*cezj zuCqv8Vv(9*Jjebbi}n>3?F%sU8K{QAPm>X>Yb8Sw2asFD1|)uQ*g!mPR|JYAkdKSy WfW!x8Mn=XDQp}7x9~dwRuzmm>)^-K} literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkClutter.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkClutter.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb598300ad614b99713e9ac11b1331bc7391c100 GIT binary patch literal 470 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%Hmt;HVl$MmF7U>mK-V(#Ev4|b$G+rPsRsa$W3?JASSUIk< zNL^x)nqfT0{vwO^6&CFaF!ULyhQUvh5v*$^LlFm%Tf_z=esS19ylqzmiXxDIi{*gC U2WCb_#t%}=j5;3}FbS}J026q1S^xk5 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkSource.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkSource.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9cb2a70266953867ab0eb5aceea35c81b38a71c GIT binary patch literal 469 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg%Hmt+U$mlh?b>J?Pp62q>qh#lxMULY=301^!hAJ`aJIj*xv zU1E`%VLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7ZC3<}A&_^A<$%No TW=2NF4^qsGIv*G?39xsp@_|O=7gg%Hmt^M`S2z|F)h#lxcULY=301^!h zAJ`aJIj*xvU1E`%VLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7Z&w70 bDUi2|<$%NoW=2NF4^qsGIv*G?39xsp@_|O=7gg$cBo?JPl~z^h6;$35!>+A}9q2G#ATCw_5)BL=*cezjuCqv8 zVv(9*Jjebbi}n>3?F%sU8K{QAPm>X>Yb8Sw2asFD1|)uQ*g!mOR|JY6kZ+6SfW!x8 SMn=XDQp}7x9~dwRuzmpRLv(up literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Pango.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Pango.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e2b400a8407b11f2d5a81dbb850fdfe2c623921 GIT binary patch literal 465 zcmZ3^%ge<81gF(}()pPg7#@Q-Fu(|9eC7c%rZc24v@k?5q%a0EXfh?ksp@_|O=7gg#7B<7{(>lIYq62q>ih#lxEULY=301^!hAJ`aJIj*xvU1E`% zVLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7Y*z$|9gtUx<$%NoW=2NF P4^qsGIv*G?39xsp@_|O=7gg#7B<7{(J11rqsp@_|O=7gg#dCuSDq>lIYq62q>ih#lxEULY=301^!hAJ`aJIj*xvU1E`% zVLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7Y*z$|9gtUx<$%NoW=2NF P4^qsGIv*G?39xsp@_|O=7gg$|6{V(@R2HNf=@nGo62q>qh#lxMULY=301^!hAJ`aJIj*xv zU1E`%VLZqFB8&DF7VQf#^ckpz!B3MBtZOAh5eJZ4#0DgOao9k7ZC3<}A&_^A<$%No TW=2NF4^qsGIv*G?39xsp@_|O=7gg$2*->9q1@tATCw_5)BL=*cezjuCqv8Vv(9* zJjebbi}n>3?F%sU8K{QAPm>X>Yb8Sw2asFD1|)uQ*g!mNR|JY2kWY){fW!x8Mn=XD OQp}7x9~dwRuzmo?9&-8s literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-importlib_metadata.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-importlib_metadata.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15ea2736b3ec3a00decdccef7eef533e47e0d1ff GIT binary patch literal 324 zcmZ3^%ge<81gF(}(&sQUFgylvV1NnA_$&luOlL@8NMX!j$YqRTWMoKT3TDt`ehE^b z$#_ewpeQxII590XJ~Ou6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BS*b+?MiOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=3Aui0xOp4D6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BS*bGM4gOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=3Aui0xOo}f`EzU13N=_}-E2#X% nVFPiqT@eS+8H_+&tN6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BUxa<_`fOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=3GxO4NQj<&c3Mzkb*g)KASHuCd fnh}VL6@bJCW=2NF4{{8QZj2WgTrp7*8&DAdL6%=g literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.context.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.context.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7708e5f967a240b636fcbdd072b2a829e16349f6 GIT binary patch literal 320 zcmZ3^%ge<81gF(}(&sQUFgylvV1NnA_$&luOlL@8NMX!j$YqRTWMoKT3TDt`ehE^b z$#_ewpeQxII590XJ~Ou6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BS*bhnDhOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=3vl5FElk@eG^YcnlD@ybVDt~d< mK%8q=!~t{xBM=uW0ErLGjEsyQ6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BS*cDIVjOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=3vl5FElk@e`O7oJzw(AvC{^GEK lIM}X;1Ly`uATCw_5+9fu85uvwF)+F@USM#=L`7^sMF0ZjV&?z= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.text.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.text.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b4fb0a1625f889f1cb780c0cf0de6b186836e1c GIT binary patch literal 317 zcmZ3^%ge<81gF(}(&sQUFgylvV1NnA_$&luOlL@8NMX!j$YqRTWMoKT3TDt`ehE^b z$#_ewpeQxII590XJ~Ou6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BUxbGM4gOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=3vl5FElk@dTQY%XI3Mzkb*g)KB jSHuCdo)L(P6@bJCW=2NF4{{8QZj2WgTrp7*8&DAd;n`ry literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-more_itertools.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-more_itertools.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6875c511605bf16d7461c7f03a50ce014d165bd GIT binary patch literal 320 zcmZ3^%ge<81gF(}(&sQUFgylvV1NnA_$&luOlL@8NMX!j$YqRTWMoKT3TDt`ehE^b z$#_ewpeQxII590XJ~Ou6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BS*bhnDhOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=3bMt|21?n#X+pSkn`HRB_;#|8T i4xkGdfw))!NPJ*sWMupx$H3^uc!9wc6BV%m6#)Q08)9Jq literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-ordered_set.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-ordered_set.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..794f5cb8ccb52508f0819c43300f071167f89cee GIT binary patch literal 317 zcmZ3^%ge<81gF(}(&sQUFgylvV1NnA_$&luOlL@8NMX!j$YqRTWMoKT3TDt`ehE^b z$#_ewpeQxII590XJ~Ou6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BUxbGM4gOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=3^NUhai&9hKf%fYaRQ}?yfw6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BUxakq-eOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=l+A{Of^$IF~ao9jyYFESow44!$ cixq&x2WCb_#t(7~jBbn<7+f(?5gSku01;6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BUxcejekOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=33vv=m((;RPQ!19#YoyN$pI*-taJY;6_@E2KCG)lwR{vgPV3 zX%d`~vB1`m!C;J(J!PY0j11O3bo612J?w3Jkb@yc5Gd?vZz|b?$M!;WdeICXih3V%qh`r1$^LPr2@`+aBO8h4JY&BvauohEb z5~;w%x$$i476#Fc_ue;XKE+gn$d>|)u`EX*&wUOA3dtA1LZ1D07R)&DJp*~6#q+5r zJOu(%c(KE8!U8`9H^~$f0{-|jm?5Z(cnflk6Gk7S6~pGoO_t9gk=k*>i+vUcUz2sv zkmBjoGO-%OBI)E7*OUy$4O(Wn!!-SLrbL9E!3k+pD^N==WL2l*63!}@3}sGNofF>6o0es2SLZC%;q!*# z1PXFqP4Etv8gvAPp*TFkQC2GP_{#oA@4S{lmyBi3EvkhZHJEf zpR5hHfHy}`at+4RPKGtBJRym#WRC>fT{iiN$FhtK{ z3ZDcc@I`2dza4y@`<4vx--Xh`kNCVx(!xD{i2oVKi8hm!z7xQT(w%NuQ6zJ&U}v3!cGM+qI zEwdlJp2nN5p;>`lA+kE{a$y0h7tJFc+PeLT7>Ip#`?;#vu_N|vi+vmXozAj2SP=(p zaj=?xcPBl*ogOczCo1U)q&+xF4s1D`w8OF6Mm5~I6OM0(<92`g?(607g-ZB>?RB>u z#Fr4-4K#O|T^P_f{*H9CeElAiUd%s$=inu`FAg6tF=8@NSn<*!G$=G7?kOPsHpE-I N8|@}6x}&WJ{4eMt`!4_h literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-six.moves.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-six.moves.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aaf3319d8ea3aac1a65481f12c1e2cce6bc327d2 GIT binary patch literal 2818 zcmbVOO=ufO6rR<}jw~zw!L8$z{7lkPqSRX3Ng${GYr->0b4NY*6#=9eHoYk%} zv$8ECLrM)zN+^L6(xVR{rR30F3O)AFTYHd$A!cbI&{J;;Zo%Z#H?ymioVq=9Esb_( z-hA)9@4flfU+>!g1OS4f)yQXQ#imjk)F-xC9 z>G&VgEUozoCS03%)H1bjqx|WBuMXeMUtoBEJQ$nTTx4fyE9enSKW;9eWv!-ta-oJ+ zn?Xb?@}`F7B&NC^0m|bDNkcVlHQron|J{y1j;`;Y2JGe7vJPHkl>fMDv6}t}Y#v83 zXz1=fD>en`L*hF56@o}&xXxG>_KFne1zR*q?mQKFTym|7O)(LeV5{no5;KWySFuG4 z%%K+M6~|*G+O%_A3yd8LgHbpqaEX-5U^-J(UKDz6iY;EE9?24~I8iFQ+@n0Nyx5Eg zFb@4nJb^t|#Z@LkF3oaME*eP%c6sM;nbX;Op#Bp2?&rr;Q z;4I7>xj{J<9%M+kg%?QGz!Q$}D6xiN8Qd0K_XZ}GCHX4b#H2;nwkXGnn1ahAuP+fC zrl@ioR$dm0%q&X(HZz$Aln1B|rq(RQ1@4vr3o=s3;r7T2^8_vvP90BGvzelSFUugQ zBPv|-D)%=lo>yK&-WM3u57GxWOVoknLkDz`niY@C*wnyBvPHUZC><2yKdK523C^C& z;^U*oGNvmNA`n;TDI}O<({<)4_n0#qk}kllMavWhFn0?oQnSKkRw~wP)hoIVhFyZe zuL?4N6Ihg~$qLL2dI!>MS{p4g5Y-m=dU)sK6i_AM)9uHB1-M5M|e~WWLQqCVM|@cI8xcgFH&^f;7uk zWv{^_L@w*Wi6f*`DPo|vO5r@537Cdx4TWO1OM(=Y0r+ly48vz2WnG|$R?J49Bd7m$ zM)yHFQuc8I*HY#YAzLL0u<|51Smqbsh>C!{xTB^!<>QFAD1OZ{D z2bChc8t|=34*CI8O|`%vF~NyH9M$14hHN;SsQ^f@92QZPE8kuM;3ab0k};#bdg*`_ z85);4Ol}kUT}^(9aC2XKfEdX1bz@ocB5?-c*6zewvJdwW7lqh%sr~jqO>2p~1v}>= zSziJVU&ii^0AJctGRoFSclb#rm@GADk>7m@l-RnYblC4v4`-Tm_&T(XAD5)0bw6f| z`W;fYEnf#Xp@RdAZ@sY3zcURc(;lx>sdMvY#-`LPW<1xmr{}3NKYfwSObh1GOqrNB z$Sf7pZLKyUB~6T!In4=Dpt+#&b3xCl#Y`*qa`i>>lq|D6=ckuG+_HF_qyahS@+kpJ;2_^UEICr_<4-o;Exv2R> zT2p31w!(Y7SMJ#JFBvSI{GX{G08}B5tV}bdcMWZ%25(;o{j3KPS-IYb^>;us!0=p0odeB@w^8C?eb>>AMEBFg z!6%7>tNO#Dc6xvB|Zu?D|+%@;R;r<60_HPwo54-AMI5P2ndg zTt77S-Mee4v+Jp|b@gfNLW#Ekx)E>f;{6cPBpkx-wxgrCR8fC}l!5A*7l~5=7pFOf gO|qH9Nf@Apn${RX+Mzna?Vm>Hh$f@kc~roE1GsxQE&u=k literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-tomli.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-tomli.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea8b7e83882c0116d62aa707752c7d91349f8fc5 GIT binary patch literal 311 zcmZ3^%ge<81gF(}(&sQUFgylvV1NnA_$&luOlL@8NMX!j$YqRTWMoKT3TDt`ehE^b z$#_ewpeQxII590XJ~Ou6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BUxaJP!dOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=FCgtX2>J?P};;@0Z(yoXDXfY!Y c7b^gX56p~=j349}7~L2zFt}o(A~v8R0CR6%h5!Hn literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-typeguard.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-typeguard.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c87254e3d3a1da30c360bad47aa0d47fbbe2e67e GIT binary patch literal 315 zcmZ3^%ge<81gF(}(&sQUFgylvV1NnA_$&luOlL@8NMX!j$YqRTWMoKT3TDt`ehE^b z$#_ewpeQxII590XJ~Ou6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BUxakq-eOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=3ODYRe(@PVJQuGQce{tAATxwUu h0koVEh>I0~#0O?ZM#c|v42*7!7Z_YIQ4t$Z5da>=U^)N* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-typing_extensions.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-typing_extensions.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fdafb4898295bbf01cb412aa5b482a6a492d903 GIT binary patch literal 323 zcmZuru}T9$5S_UL2|^kROA!m3W1RnP{qiE>$6<9uG5vQc!KMDvro_C~WWlp>ckUMkMU#!NV4@{RSzD0aaY-eJ`} zTl?!Xp^I90*R-Uk(^L_S#%U)MGtx6Ll#ha?r_>gsNl_7tUk-!K@4^3ZHpkSrR_ZFJ oXHS}?(VW?K-8=tDeBpW_1cv70FqSbQE{_1O@DncomfH)WZ;u~iw*UYD literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-urllib3.packages.six.moves.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-urllib3.packages.six.moves.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d025926dd16391191de4ad73039b8c8f799ac42 GIT binary patch literal 1753 zcmbVLO=ufO6n?WS*(+%s$#rWxv0E!`DJVs-6pERG~gh!thMWSm6cYR zT{*Fkz@>&Z#f3mAEq0fq@|4c=XoQn~ERcPxjLqTyt_Xijy5sKp{Hh$PGe3;kMugr|^pq^Zmu# zV#EYQwl%VCKZR_;9xm^EPE?5176`>7_qdMqIB%D?%Jr7} z;I%U82(4gbhfxVLe9LW5A`?;?D^gw8R^CYzO!>QS7eu}2C2`=!FV8=X-yz=XX-#+_&@ej$qzEr!uX3uHWi`m-6tm{X| zx;VH!Z;wnrEdElej$C&6p5P;d1U!V7Pb!$Z}dpv2Op|EUe@UvnJ|)4|6FM(bk2e(}?I52} zAH{JZ^YH0v(h2l>314#?%_cnY4{R;FT)>argXS3zeM7BbSO+52ot;f zkKw8?RTHLcVXB_|=rEZ&NT#aEg<5ifi8)73Y*mcg;`sMQT?`+J(E~ARpHDt~uPR=t ziC1jzar;4d8=+laCyEXtp%h-@P}k-2l=L|N44#8m+_5loqQoqH9fMeNnU~Pu0TSYl T0y%F(wEJ6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BUxaJP!dOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=3%QI3_bMy)-e{tAATxnOt0koJA dh>I0~#0O?ZM#c|v42*7!7Z_YIQ4t$Z5dd#LUUmQg literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-zipp.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-zipp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f70291f33609845a08338bf9df90bda958596a6 GIT binary patch literal 310 zcmZ3^%ge<81gF(}(&sQUFgylvV1NnA_$&luOlL@8NMX!j$YqRTWMoKT3TDt`ehE^b z$#_ewpeQxII590XJ~Ou6TJJrDtAoNn%b;YLQ-PNoG#5UPgX? zcClV@YDsB9Nq&A#aS_m7hLsGTL5BTGcejekOU#WaDJrc@%_}U_%}Gs7&d>!Zj44aa zD~s{TOo}PaEJ@WZNKDR7OiwM2L9#&~Y_>jj=YS=3t1=4;^a?6}ao9i{X;;Jnw3iWx cixq&x2WCb_#t(7~jBbn<7+f(?5gSku01Q%IBLDyZ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-autocommand.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-autocommand.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-autocommand.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-backports.tarfile.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-backports.tarfile.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-backports.tarfile.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-distutils.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-distutils.py new file mode 100644 index 0000000..7f88845 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-distutils.py @@ -0,0 +1,23 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller import compat +from PyInstaller.utils.hooks.setuptools import setuptools_info + + +def pre_safe_import_module(api): + # `distutils` was removed from from stdlib in python 3.12; if it is available, it is provided by `setuptools`. + # Therefore, we need to create package/module alias entries, which prevent the setuptools._distutils` and its + # submodules from being collected as top-level modules (as `distutils` and its submodules) in addition to being + # collected as their "true" names. + if compat.is_py312 and setuptools_info.distutils_vendored: + for aliased_name, real_vendored_name in setuptools_info.get_distutils_aliases(): + api.add_alias_module(real_vendored_name, aliased_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.py new file mode 100644 index 0000000..e71843d --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.py @@ -0,0 +1,37 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2022-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller import compat +from PyInstaller.utils import hooks as hookutils + + +def pre_safe_import_module(api): + if compat.is_linux: + # RHEL/Fedora RPM package for GObject introspection is known to split the `gi` package into two locations: + # - /usr/lib64/python3.x/site-packages/gi + # - /usr/lib/python3.x/site-packages/gi + # The `__init__.py` is located in the first directory, while `repository` and `overrides` are located in + # the second, and `__init__.py` dynamically extends the `__path__` during package import, using + # `__path__ = pkgutil.extend_path(__path__, __name__)`. + # The modulegraph has no way of knowing this, so we need extend the package path in this hook. Otherwise, + # only the first location is scanned, and the `gi.repository` ends up missing. + # + # NOTE: the `get_package_paths`/`get_package_all_paths` helpers read the paths from package's spec without + # importing the (top-level) package, so they do not catch run-time path modifications. Instead, we use + # `get_module_attribute` to import the package in isolated process and query its `__path__` attribute. + try: + paths = hookutils.get_module_attribute(api.module_name, "__path__") + except Exception: + # Most likely `gi` cannot be imported. + paths = [] + + for path in paths: + api.append_package_path(path) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Adw.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Adw.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Adw.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AppIndicator3.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AppIndicator3.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AppIndicator3.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Atk.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Atk.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Atk.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AyatanaAppIndicator3.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AyatanaAppIndicator3.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AyatanaAppIndicator3.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Champlain.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Champlain.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Champlain.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Clutter.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Clutter.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Clutter.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.DBus.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.DBus.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.DBus.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GIRepository.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GIRepository.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GIRepository.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GLib.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GLib.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GLib.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GModule.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GModule.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GModule.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GObject.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GObject.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GObject.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gdk.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gdk.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gdk.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GdkPixbuf.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GdkPixbuf.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GdkPixbuf.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gio.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gio.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gio.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Graphene.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Graphene.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Graphene.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gsk.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gsk.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gsk.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gst.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gst.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gst.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAllocators.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAllocators.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAllocators.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstApp.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstApp.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstApp.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAudio.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAudio.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAudio.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBadAudio.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBadAudio.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBadAudio.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBase.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBase.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBase.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCheck.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCheck.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCheck.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCodecs.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCodecs.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCodecs.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstController.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstController.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstController.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGL.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGL.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGL.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLEGL.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLEGL.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLEGL.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLWayland.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLWayland.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLWayland.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLX11.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLX11.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLX11.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstInsertBin.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstInsertBin.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstInsertBin.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstMpegts.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstMpegts.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstMpegts.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstNet.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstNet.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstNet.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPbutils.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPbutils.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPbutils.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlay.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlay.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlay.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlayer.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlayer.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlayer.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtp.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtp.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtp.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtsp.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtsp.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtsp.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtspServer.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtspServer.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtspServer.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstSdp.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstSdp.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstSdp.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTag.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTag.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTag.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTranscoder.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTranscoder.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTranscoder.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVideo.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVideo.py new file mode 100644 index 0000000..e75bfee --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVideo.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert + # them to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkan.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkan.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkan.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanWayland.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanWayland.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanWayland.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanXCB.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanXCB.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanXCB.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstWebRTC.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstWebRTC.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstWebRTC.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gtk.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gtk.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gtk.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkChamplain.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkChamplain.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkChamplain.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkClutter.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkClutter.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkClutter.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkSource.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkSource.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkSource.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkosxApplication.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkosxApplication.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkosxApplication.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.HarfBuzz.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.HarfBuzz.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.HarfBuzz.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Pango.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Pango.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Pango.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.PangoCairo.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.PangoCairo.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.PangoCairo.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.cairo.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.cairo.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.cairo.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.freetype2.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.freetype2.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.freetype2.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.xlib.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.xlib.py new file mode 100644 index 0000000..131ce95 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.xlib.py @@ -0,0 +1,16 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + + +def pre_safe_import_module(api): + # PyGObject modules loaded through the gi repository are marked as MissingModules by modulegraph, so we convert them + # to RuntimeModules in order for their hooks to be loaded and executed. + api.add_runtime_module(api.module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-importlib_metadata.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-importlib_metadata.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-importlib_metadata.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-importlib_resources.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-importlib_resources.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-importlib_resources.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-inflect.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-inflect.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-inflect.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.context.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.context.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.context.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.functools.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.functools.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.functools.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.text.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.text.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-jaraco.text.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-more_itertools.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-more_itertools.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-more_itertools.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-ordered_set.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-ordered_set.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-ordered_set.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-packaging.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-packaging.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-packaging.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-platformdirs.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-platformdirs.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-platformdirs.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-setuptools.extern.six.moves.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-setuptools.extern.six.moves.py new file mode 100644 index 0000000..5a09a89 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-setuptools.extern.six.moves.py @@ -0,0 +1,39 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller import isolated + +# This is basically a copy of pre_safe_import_module/hook-six.moves.py adopted to setuptools.extern.six resp. +# setuptools._vendor.six. Please see pre_safe_import_module/hook-six.moves.py for documentation. + +# Note that the moves are defined in 'setuptools._vendor.six' but are imported under 'setuptools.extern.six'. + + +def pre_safe_import_module(api): + @isolated.call + def real_to_six_module_name(): + try: + import setuptools._vendor.six as six + except ImportError: + try: + import setuptools.extern.six as six + except ImportError: + return None # unavailable + + return { + moved.mod: 'setuptools.extern.six.moves.' + moved.name + for moved in six._moved_attributes if isinstance(moved, (six.MovedModule, six.MovedAttribute)) + } + + if real_to_six_module_name is not None: + api.add_runtime_package(api.module_name) + for real_module_name, six_module_name in real_to_six_module_name.items(): + api.add_alias_module(real_module_name, six_module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-six.moves.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-six.moves.py new file mode 100644 index 0000000..1c86669 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-six.moves.py @@ -0,0 +1,62 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller import isolated + + +def pre_safe_import_module(api): + """ + Add the `six.moves` module as a dynamically defined runtime module node and all modules mapped by + `six._SixMetaPathImporter` as aliased module nodes to the passed graph. + + The `six.moves` module is dynamically defined at runtime by the `six` module and hence cannot be imported in the + standard way. Instead, this hook adds a placeholder node for the `six.moves` module to the graph, + which implicitly adds an edge from that node to the node for its parent `six` module. This ensures that the `six` + module will be frozen into the executable. (Phew!) + + `six._SixMetaPathImporter` is a PEP 302-compliant module importer converting imports independent of the current + Python version into imports specific to that version (e.g., under Python 3, from `from six.moves import + tkinter_tix` to `import tkinter.tix`). For each such mapping, this hook adds a corresponding module alias to the + graph allowing PyInstaller to translate the former to the latter. + """ + @isolated.call + def real_to_six_module_name(): + """ + Generate a dictionary from conventional module names to "six.moves" attribute names (e.g., from `tkinter.tix` to + `six.moves.tkinter_tix`). + """ + try: + import six + except ImportError: + return None # unavailable + + # Iterate over the "six._moved_attributes" list rather than the "six._importer.known_modules" dictionary, as + # "urllib"-specific moved modules are overwritten in the latter with unhelpful "LazyModule" objects. If this is + # a moved module or attribute, map the corresponding module. In the case of moved attributes, the attribute's + # module is mapped while the attribute itself is mapped at runtime and hence ignored here. + return { + moved.mod: 'six.moves.' + moved.name + for moved in six._moved_attributes if isinstance(moved, (six.MovedModule, six.MovedAttribute)) + } + + # Add "six.moves" as a runtime package rather than module. Modules cannot physically contain submodules; only + # packages can. In "from"-style import statements (e.g., "from six.moves import queue"), this implies that: + # * Attributes imported from customary modules are guaranteed *NOT* to be submodules. Hence, ModuleGraph justifiably + # ignores these attributes. While some attributes declared by "six.moves" are ignorable non-modules (e.g., + # functions, classes), others are non-ignorable submodules that must be imported. Adding "six.moves" as a runtime + # module causes ModuleGraph to ignore these submodules, which defeats the entire point. + # * Attributes imported from packages could be submodules. To disambiguate non-ignorable submodules from ignorable + # non-submodules (e.g., classes, variables), ModuleGraph first attempts to import these attributes as submodules. + # This is exactly what we want. + if real_to_six_module_name is not None: + api.add_runtime_package(api.module_name) + for real_module_name, six_module_name in real_to_six_module_name.items(): + api.add_alias_module(real_module_name, six_module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-tomli.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-tomli.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-tomli.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-typeguard.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-typeguard.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-typeguard.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-typing_extensions.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-typing_extensions.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-typing_extensions.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-urllib3.packages.six.moves.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-urllib3.packages.six.moves.py new file mode 100644 index 0000000..d257f83 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-urllib3.packages.six.moves.py @@ -0,0 +1,34 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from PyInstaller import isolated + +# This basically is a copy of pre_safe_import_module/hook-six.moves.py adopted to urllib3.packages.six. Please see +# pre_safe_import_module/hook-six.moves.py for documentation. + + +def pre_safe_import_module(api): + @isolated.call + def real_to_six_module_name(): + try: + import urllib3.packages.six as six + except ImportError: + return None # unavailable + + return { + moved.mod: 'urllib3.packages.six.moves.' + moved.name + for moved in six._moved_attributes if isinstance(moved, (six.MovedModule, six.MovedAttribute)) + } + + if real_to_six_module_name is not None: + api.add_runtime_package(api.module_name) + for real_module_name, six_module_name in real_to_six_module_name.items(): + api.add_alias_module(real_module_name, six_module_name) diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-wheel.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-wheel.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-wheel.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-zipp.py b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-zipp.py new file mode 100644 index 0000000..83c7249 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/pre_safe_import_module/hook-zipp.py @@ -0,0 +1,15 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# This package/module might be provided by setuptools >= 71.0.0, which makes its vendored dependencies public by +# appending path to its `setuptools._vendored` directory to `sys.path`. The following shared pre-safe-import-module +# hook implementation checks whether this is the case, and sets up aliases to prevent duplicate collection. +from PyInstaller.utils.hooks.setuptools import pre_safe_import_module # noqa: F401 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks.dat b/venv/Lib/site-packages/PyInstaller/hooks/rthooks.dat new file mode 100644 index 0000000..c024452 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks.dat @@ -0,0 +1,23 @@ +{ + 'django': ['pyi_rth_django.py'], + 'gi': ['pyi_rth_gi.py'], + 'gi.repository.Gio': ['pyi_rth_gio.py'], + 'gi.repository.GLib': ['pyi_rth_glib.py'], + 'gi.repository.GdkPixbuf': ['pyi_rth_gdkpixbuf.py'], + 'gi.repository.Gtk': ['pyi_rth_gtk.py'], + 'gi.repository.Gst': ['pyi_rth_gstreamer.py'], + 'gst': ['pyi_rth_gstreamer.py'], + 'inspect': ['pyi_rth_inspect.py'], + 'kivy': ['pyi_rth_kivy.py'], + 'kivy.lib.gstplayer': ['pyi_rth_gstreamer.py'], + 'matplotlib': ['pyi_rth_mplconfig.py'], + 'pkgutil': ['pyi_rth_pkgutil.py'], + 'pkg_resources': ['pyi_rth_pkgres.py'], + 'PyQt5': ['pyi_rth_pyqt5.py'], + 'PyQt6': ['pyi_rth_pyqt6.py'], + 'PySide2': ['pyi_rth_pyside2.py'], + 'PySide6': ['pyi_rth_pyside6.py'], + '_tkinter': ['pyi_rth__tkinter.py'], + 'multiprocessing': ['pyi_rth_multiprocessing.py'], + 'setuptools': ['pyi_rth_setuptools.py'], +} diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__init__.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__init__.py new file mode 100644 index 0000000..792d600 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__init__.py @@ -0,0 +1 @@ +# diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f92a8697a58a6ad07426bde624b2205d1d66e488 GIT binary patch literal 196 zcmZ3^%ge<81gF(}(wTttV-N=h7@>^MY(U0zh7^Wi22Do4l?+87m7hV9zrx+EV)7Dm zV@irjD^v3d3w3i+Qv>XN3e1?3u&*6AQwy}mp3v7d8 zh$^aR0{x}Q7ue%8DK;KXeWy?7hh-;Y$g1KfJ}*1j123p5WJx#u$mEbDONra#gX52v zJ0~-SNP(iN6D{LdBrkSevO7i7a>OZX!Bl(vrpeJGe8*(=AMkkCXDr)i?Y!-CImMar zxmgQjc{w?p7#p0J@cEpfI8zpx^8>mKvVKT27j#`vUCgUHgraNvgvCVsr``e-bkCuT-qTEdCi=k?>00oGt=!@mXTfrowTGs zOWV4mb?1~!R+-l9^jJP&+Kyrv8tI*}tgPKjoP#}=*Jbc!I78iZG}4pH`w{st3rNxm zx&lo58!RrWaDtnlqr%19dvsKTD0XuF(MEbL{kCiC`um6{^p}Nxccc=Ht>4{{)}*(m zx7xRty=Y%K+UE{edDPtUI=an&I(fxSdPDUmtAZ<3xD)QEJ6a?A3ARul4FCWD literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_django.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_django.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1cd9e0dcd6928fa7a154c202475adc0137616b18 GIT binary patch literal 1103 zcmbVK&1(}u6n`_j4gJUxF|`FhN|K5aN>T*{ky0#zA0(uL2ftRAZFWtQZnNpkrZtkn z3IWqn>`ClVL8{WfLa$yT|90prjOPL6;|m9tRX$tS6haPM;Hv)&|!}mGnm|K3W507Baux&|~}obd2Ndd_(n?`23jj zFaLX=A3?roWEU&k^Q&B^LwKDHp$c!{ShQb-ABu)Xs&p6g?)kY1);Rf}k!$cmcm!)C zPBYAArn$tYnRT$1DtQHMMJuSqoS7_DoU#7=FQ=44EXF5i3^S`5d^Xu1 zJc_mQ1yo%dT7xI+!|vCTPHa8gmN(^{=!UYT)M=XvLzAs=q7hDfwi@9pKZBvIJKOV{ z^E-1p>_;%x48|JX=+oFnj+oST~vu&LvRmnmC$gD2IpWgaxq8Sp&L z@DbOkzRivcPT(L3lQ2DVIk@|nk;n}e#MK!&(hU|yPsoL&QMp$ZV~yVU8NK-NY%_YT z8O=1riMALRm~2BIH40Z##J*KaH^nne@p8i(9n1%rIPn<10CW55@$V1LESp-{&}Z2g o`rIF%PoZiHgpl?`h@?mxj_C71g7(NOsV3P{OAOg5JLM(&10s0|O8@`> literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gdkpixbuf.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gdkpixbuf.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2868d7a7926acb0b949c9585946afa381384943 GIT binary patch literal 1967 zcmb7FO-vg{6rTO@ANJyyfSVFkB0xe&O=wG7qKcvhL5u?lQ4msSExE=!2FJ^;GrPn% zT}N((RLTX4BEcb*e28c&E;;ttrpc)nj4WY|6e&_qy%{A36!p+I>zLGuE44GbZ{NIq z?|W~)d29bDNeu|b@2AFRf3P9+2U}DJ|5AC@4$20S(GvO`@d%?WSZ`Oo5Qn}%GB=63 z`PiWi6bIY_+|Ql@4n%V@Qc$+?^_RXg-T&56Q^9O*ztXZ1ZoornnRR8%pIDraP}9y{y{xnTgDWdyzNzWgVP zqk@u{xz#W$Cwo$f#hHcpElJU$GA8=jSTr_=sV$vQ`#zvNnW21o=9X>2i1(b+n<4Zw zyoh59Ms!BOkyO-}>jfn04-St-u7s`)ORED}EFU{aeIv_dga{Vv(jmV*r=*wMVvm{En5St~jF?W&8l6W*X!RFJZ z<~v;*f%U+qe%HJ|^!SlN!84NK{7Z+~-pEm?517ai^UNV56z`aSbO zdbew^&^7o(@~yqQX%wW+qSRSNoa@AWzVz1H8|n4*_nAAH<f@L^cYLH7J#KCoIUzi5<3L{S=B!5g2|WW4 zMA|{Ta1P9C@`8c~$thT}e<1xd2q=Q%%B{z^{xUigA0y6_bAK%@Nja$`dUIpBF>(@| F{|4-F#j5}S literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gi.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gi.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f918284b9d94ed495d5d55fad3155baabd988686 GIT binary patch literal 577 zcmZWjK}+L66n>M=s#wzs-j+R7DMDGQXGH`B=|DJ{SSLx zL=^Gj!Gr(7i^3ktoEALot zE@1i&HuPX06ku?T`fhZGOyDcnqyZ(RIX=UJVq`Fehe$Y0Y;d7F%A`v!p!4nzKa#%x za6vkWM+#fH#_qfE1Wtb#-(}XYv;luWYrm6InQb{{7zNCA4us5CG;?>azNKrMW_@G# zOKCzXzK|Ia2}uJhY)jhl9Zyb~)h(^Q(P+p?=AAj*_eu(%Ks!E(B$Brag}1%Rs^MA3 zM#xVi=AE3BUB;U2a_IZ6afWk-?i?7x30XO?nnzZP38Nlqo(L`1Wqi5q`$uA#hoc-s zj)}F|a+ZQfX3f7Ed$@|vB_URjV(3#f){@nyxp+HSzlw`jl^gw1zn^>f^w@nVR(}?& z@n&!PIbV38^UvuX;xN=oB(=K*ow;$lxO-H8OyI WI0s}V&VEySYOMBYKHiCUQnNq3Fo`k% literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gio.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gio.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96ae77ead7ab752f708ae3272957faca9fcd1782 GIT binary patch literal 577 zcmZWl&r2IY6n?Wi{-DW5&t41-Ed+@kMF~QSBC8vfhFEuOG>jL3`19Ioe$oK$(&Q1C zXBfRi_XRxY!y#zE-~#ij@fk9K58#nHl(ojBh5<#>(MCr|I88hV;C$@KIXQ#&qdt61 z`<~&9v{Q`?o_2xVSCa{xo|>HLRSZ4A7tp7@+sqJsRx3-*3 z^IdsbXe5HPXQ;=ChQL^Srj z*mp2?@U_dmSmm7m1#A)q-j|wOLrP#kjl@jXfEJRSblsL-eP6w-eyje}f8~F7Z%WqR zl9jye?_AF<-q7N8wnsP&du5Wz{QyzGROFHFXRG7?*%0%X5;VDlG}H+p!v#ueWC%~V V03@H}J{x@_F$Q!l*-dscu?L%Kh}{4H literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_glib.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_glib.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69e3149c3bac294dd31a6b04f5c84e997cf58caa GIT binary patch literal 794 zcmZWl%}X0W6o0d`nzYIGL$|gRp+(wapeht5kNqEdG2mgDlh9Ld0WZZ<->M1HzS;MCzxVci&3sXmtAO(J(R^{Y z2jExabVRx!Cqqbfz<@fu1qn>pL;s+Y1q7DBAbChhE8Q3p8I_`*93o&fF~Ek}xg|B? zL%Gu*no-_=;*)aJ<4g=`53>)t6*UR#ao=-k_IB81YfuCJsiHn*eZJ(=O~MqkP>yvf z-Xrm8gf;3&zEs29%QFm`#(!IMOELiOD(8Mjm7<52bY=?WO=d>ROue4cGTB%8R9r|d z7nE1IkSn@Z5^~wK91+(Rrn8Gv`Mijk&Zfm&N6@0_iCC1w%}PpU(M?#ilt@;pmS*Ul zt{D~+$~&Xj^*E0n=03{l(#&MR(bozd+o+n(`ud1%nk%Id&vos>CJrggTgwG*dFDt( zUs=_QCNC^jvkv!k+cw!)$#qxx81v3;G!eO0w5{dQN>wDZiwI`1n>bQI<#mJrLRks2 z(Fx^i!EAKeNl*tqJ=;ldr<-&)xnFGck014q2lK}mp54i9=bA6RXIkpSkvb79gfX=Z za?issar<-aF!30_aBz74$+yYY;L{&UYjC=;@aOo>gN70gjRi03vyBfe`Chvht_*~6 zwUKNjPjC;&rO4T4UxD?Z%Wfc?#?x!Av0 Q>Pn!5^7UXYm^&=>Px# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gstreamer.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gstreamer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a47edc97a89c7c9778f3fc01530c6e541eaeb9a GIT binary patch literal 962 zcmb7CJ#5oJ6h1p{6PlRtQ?&>RN=uYBf}{gXs6r|tgfwju)nO<^GHGnNZe2UQb1J23 zk&!yEGjw67s;U8%fq{XMoh6n!L^mNZu|>+(iFZy@H9`!$^Lu{x?t9<+WM4xRhY;A0 z*u1tUAoPoEdd8n6oe490AwyIiJSwF#f?_(?1ya zBhYpX-nBkO1D>M)Q!&`DqL0td_>@3j?UGkR@a=|jznKQgn-;yAmWuLXDxHyvi%ase z{9<-1s1Z9+HENn}5*lXbh4~lhOinJ$7N2j0u&U|A#`WZ~Zqm@jc8ci81-P^%6;lgd zSKLo|i%=h_6Y5vZO&wb%4af_rOkq}%s8B82D^ysufYHx#qE_QR%x((~GNo5QlH8Rf zd*_7xyGSH*`a1onWR}-UHm=oGb7Lc6sA^>;VOy3_+Js4^d40J=bX!eS%aygVrjk;j zo-v7CHVhR{uUOU^nZ|baU9Iaf&LFb<3_55CTPzwO5IC$W5Uw9piWThZ9z zTqA#wZ$5nLMpGxzRJS$a3gf^u5j`Ajj2(=9tb8`U<=pY?$#|9l-o0^!JM93vpX|aX zU16%}JspsRa&gWR`U&A-*y3vtP6IRRmQpj+$9M#`>>83O2yGw7aqXL7F4;!sA&R(= T6MQS~ijLS4!cNx7dQ5)+8U5pQ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gtk.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gtk.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df2ee4ad549d62e1f24acb1d0a2147037d7640c6 GIT binary patch literal 808 zcmaJ;&ubG=5T2L3q@n3HRXhcMq^)TQ8he)@q&A7$#56PkYh74kcFC{pZo0b(L|R!P z2mb>v9z;Tm^y0xkz`K_&cv$uzf+uf*+=P+e88djwhZR zlOxia>cbJV*h$YMUkd$ytNtsi^vY_$t3r!S=Glk9G@A9Zy`|s@PI>n4N#~fJ1o-k$ z@i$X&Be_am+)7u{Vre&%<@el0mdNa7raZ)WDP4KuE|k*6+>Th_H@Em**DsqjcWII; zKQBMtDP}R92)aJaaQ#N#a6{tL3|~r@%kG@4_L{n;y0lX@8!l~WO*P@u*?-i-2nL%r z7Q5KbJrvaHfne(0zN{V|CKXw(HIk;LDMAl5ghKPBU^GoR*{Rmr)w*m5r9Q73W>ryS zeWRgiZDT_>C%)5fiWrM^v;Cmccf;ak0uSleuph@7cM&XbC};6(Idsw5X6xtO^aB#_2IKq;iK?*^~?RQ z0Xv@k9?woLFWYqG-22AZ7>Wtvjq(Zf>qzw_go{w>K$E(P{7Aonl;Ae*A&mTlkWqA= aXws^QseRZ(CRL1$O50-}yXU>ck)=d_LYnrlw@AF8KJ8r7qy)6B$GPX8dwkC4 z@1FaUpIEjTf&9@wvy^E<=ubST3HjDI>ILH&lF=6W3Xw=bdoVtzMIi!xjbtK>L^4+Q zf#HHiK|9(7wM}f3+tfC_?E)M^MoF|oIX$sMJ3YDM%F_uP??{2JS*QEFD}hlR*&~1h zv=iAO@>IfIACWmCN9L#;opU{K$>bK3L1~nyqiv&z$<~PbZzt(SI~xoobTzysL;zT&%f~Ov-2v z@DA#j88S_3Lb{PEB+m~)We$Wv)T zrZ>Ub0}coEnl^qbLjbE&HF<}WKg)_t!#+&~-aEeIU+3#;kN1ByCc|Ya2EZ+oYk7iOsfWNipy%n_i0=%QllzwN=M*#r5c-?!1p0 zhGu(KRe3$B=r*$$)s<9qRk0Z*CF_slkVYrec*<_pji_cg9+9!#>S98P88(CAo%kk) zjq|nU@Rwm}?u(nZrWb6#q-yacDW1~TAYKAOy1K5#6erO0)@_rjZd3Y(uH!`$1R;y% z&HbrQB7hw+wDk=o_3+_PQc+^dLx!p*Baf8SqsUBrF`~x}WoRuLTZt|ydSq^6It4_N zNkt1TtLlm#)QppUZ6hv$U1NeP)h1zQ1EtLY$9Ix6d@ZTQqDlSw@cF<_AgT*+I*+rc z!goHq@!gHWn8^=X{9ul$@a?iWxfsX)DG*$-L5_^Zy>^QJFk`9itr3g@dLg6(;}u;2Ewqby!6iC15VrZ{Pdlcny- zV)taFLnyWiRR*>C%A8Q*ghIQ?4OrYj718YFiog4Z@v{F)$$w>k;^ow@Gr!CL{6cXq z{QG?~FmDCsP5(X1fA1-C$otEDe~IreY?}P2#gD>wy^!Dc^zLzmZ7;Jzi4_W+CL6HW zKowC&+9+~EG0$&FgvXptE`!iPunXdTdL zKCJMaqT$n};Xex4zISd;&wUmS+ib&9h;Ge~gW9qB2&+a29bYxVr&u(+8g|R6rPD5f zhlQp;0dN!8!<8}YYF0OKpP;}uCs*gq;P2mFlf-e5u1wCUUMk2%ZLM&tdVHxKvI)c+j zR)2DC7OR;JUo~yl(=3Y-UGp?174qxP)LiCqM$P3PvB;LA?^uS*ro;Hk!`zeNQi-Qh z<4kZ|Cc3`MNL}+Pj8q-dW)telQhqH{DzS)RH%#i-DUnXXILe=o5$ZUe%Wp9rkDqNk zxU1OOmg3PJ->|p0)0SbBD{0ShETsYMO3{3wxTa^M>sq;{Z5pn!=I4h$Y|w>@J4q(H&xiH{8YE=K8vcqBTz-Jz(fhutpWt7N2DOnSC3o{miao3N^kGHli$c6#E-E( zyAxgPMi+zJX=3(Zu06j$|H(UE??_B!UnV=rY&V(Z zxs$0I9g;W+zX41`t0^4L|BUEWaOpI_*@Qg2+Iw^cTny^o0_ckvzK{Fp51c_b T7DQi3Eh&(CWGW~Gg^=tQZ85ge literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_mplconfig.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_mplconfig.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0062dacc72b0b984fe3a98d9ef83db5bfc85383a GIT binary patch literal 891 zcmZWnO=uHA6n?WiNw+`SY-?2z{ArbHgtiwcMT$_hme^mcmueu!>@?YSvzyLt+6EF? zp@-l_@S+C~JyoP$z1yo^S}7P73I$Kz0=+%Auk$7b0kI3*lrst*}%+5SYOgv0Hc^W6a zYGf^&vlQdp=1#oLkEUI=Zn(Z=JATy367UIz+^0w8*pvgOs*npa>{s_bPSgb6w;aHbe1{E zxl+P%+_Y&jK9sZVWoHO`3D&T$e8D{78Z4Cj_OJ|0;pdR}5{mN zqZv7*eY@eTE6{ayU%UBB8~&*c?`b3Z+6boh-uCWqJg&alqgU#bM$|*4^KI-+>_haU zx>@>0tFb+0d|w&g4QJz^y}J%1qW)JkrK3u#v@T<`(P%hbSk~9eV?D6b(>B&8@AMMX zGjS3W{uz#N8@Tu$$I58l){7>)$1k8uP@G$+@Fqg)cQk?|P1O&i!)t%7Zm6DGqcLyN Jo8;#)`7g$+;n4s9 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_multiprocessing.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_multiprocessing.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a820c3d5ac27167d6bf7ae3394655baea7021887 GIT binary patch literal 2106 zcma)6T}&fY6ux(6%3oU`MY1d+7Ir}!D64T-)(y*|OI!*C6yl3pGwF6NFfg5#J5&Br zlB#TI3DK^p5sis8Au9$=eDq--eD|f0Cfm#tiP;Csq4_nx2c zoO^D+v)gMBj9)vw)4Np&{iX}W!4#OIc3{3h0$M}wBL)%l806ie7Q*O067VE)F@e$^ zFl^yFiUPBa*O_$|d|&}dXoEFYyulbNW2}tC2DuH4Ax?sswG>_P6-6$N<4l~LVg+`s zY86G%5>7CDW$_ej0RP!I-xUzx;>Hg3eHYeRct4$1_$e9+@}jH~8m0s&KPCC66%%?r zegk|*A3+s92jnW&eVmO%#cWA>4BT!>67ZaXoTkck1m<$l6bbB{QCIr0NrOArNEho~ zve6mAVva-uYAJVwOui}v=3!Yxvt79rgA$ziF3q|Hq&;f&ITTZ*GSp^E42aUDJ3O~W z|LC2BWwvy~>9UN@ZOS8>qfjcMRdeppU*)+Eq7QDa;wVm+dgI(L)U?v<&j*!XWmefJ zD^wM7uMnWqqD&u{ZFZ`9M-)bsHQSc7-hir> z#t!wiIQ;AM^mK)B2M%F9bulZi>b>j?MkG}X(@=mYiYQO_P@;q)G(dQj`U7)>I>lf( zL{(?dFUl)j|7tQ7qH_wN3ufg*y|Yj7ZH*fX$>e+FvTCeEWQ~J&w4l`}s-LRLqNvVj ztU^?cBTFQpQ&H6{O4z?BYc(RgH}DOx^eqWaSa^D1s~__^B3Grx%`FOw#)4Okll?)W zSr+_KgisE`YjqdWgILRoqW6juMl2RPnYwq&2WCE%MwW>@Kkt?Z3Cy_FP)PDE5P8Ap z6(9H%Q6=s$)Wbhb6yH0`9vR?E5~0^-LZLb38dcBM@UqAQ&tHhz6JFNp;ID&_6~Zf# zuwKxWt9(HlJoNNQp@3gf`g<;DH33qkA1ZkqLw`Duy*|mNsuH7{qg(Ip+gdZW*7R%J zH+SCJ?)&Nb{*~U$mENE4J{kID;)(ZZ-{gMZWUgNQon>y<{(*qN=`%-TGLV|tnom2n z)ResE=*T)cer(9NJuvs&BU$&zp39qcdG{UOjKllPR-bH0HEp%0TJ~(MStDT1R`==9 z#!zB-b2vVHU~SG?olmV@`_`_VyFU!=S#M;mH}a^u`ckf;F+P~P)SOyM<1~|IQqerJ z*t-pqWOJ=;--us{JM5S8*YYE4l1q|YL(|sVpWR8`$+dMP2e+PkG@KlM)^;`h-nY%$ z&BcwJtvf!RwY6n!-5J|;m^_BZv`B(M9LLzyNIpMzfaP zI_-oVJABGRAjijW$2qPxHmv^+xaLf8<~V1jI1jkqjCtlOQ1>gb@htazmU}tRUA92V z|4Cj)qu7Tt+8Dml>AQ^LE0~)n~VC)#!PpbNYAt54>e)aGFPDbOIx6i&;Okui0bv99I_`iH#WE{sx&z0L=gZ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pkgres.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pkgres.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8000021ae9d162de05807aae40c366414b00d2d GIT binary patch literal 7394 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 X1{XH{I&>|x5L)54ESy=esQCW?tih;H literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pkgutil.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pkgutil.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af1a72427b7999f9d59fe6d766612e4d9e671a2a GIT binary patch literal 1749 zcma)6&rjQS6n|g;2>Ia*8VX_UJOXq~=^%xTsv1QV+PY4RE~>PS!AWmhPXUH(P zXj}*L2oJ~u3O$f4$ncPOJ9$WDnF^^;IVwx91xm0^78((u>RP@;>(qkl)gu$OPPnOe3utvr+WA(g+8U#w zf>myz{&v%*L@QJtO0-Fp7?ZvZ-;9-5lllJ&P4+*wj1g!$29q(oX&s-m*RL}Ylo$dE zc{GmReWzBZTzh4h$xsR_DEUeqZBaU29i`+qiRoKKm!>~Q&A|pC@aO{eq@xk#{?K}$ z>TgJ`d#jd7+Oz)zr}rI={;2P<26vL)G^ykfNyGzoS6(!PLUC0v)Qn(gqG+G-L{Txc zqEOJpob;{D>IGRcY#Md#prlKRZlslrXfs(UW7w=@h)cTNnM=#^-E?MA$Vp08)a)KS z*92*)plU9&q-K|8QICgg--&|n#68y*|Bb?8UQp6YqEJX{hHeMktOP~Pigvi|$_^eU z>FPH4Y}!cMK1ml))9yf6HYC}O6p9jtAA7%cNUJ0Z)Wc4=N!7xhb;alB(Z0eLqI zH-SWT+s8G2+Ty1x$x3pc z??*Trs|4!&dk%C2dOfIoUhfW0%u=*w{GtayEP3hU$T6eUqpMA@`sQ-W_|YK2dAKSFGVH4p0HqM5u9tmCrVV&wKi-!DrWNJ>yo-c;!Yt z(ziKTi@Z}^*@=wqaHo&Md6^IFghuPpxA&qGyU~eX=d8=Kzt7d8x2@>y9qyHnLj#vU z!vptyi4)EJ%EejjP299|E_5Q;eof3vI{r)TGq;M;4R1a(Cx6^Ht-a+cHcfQ*3mTiA z*3P@8p_YkhF+AzQr5gx`hh?ZUk#f@g?KAvN<8gxh?3cuW*T9bmu$;vV>@gR2nTvJ* zIm1P> bdTPQQ0)#7v?uXaH<#3(pEYFr_Jy-t%PoK0= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyqt5.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyqt5.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3482da004404df08b1654372f8333cd4ab564fe GIT binary patch literal 2101 zcmbVNPfXiZ7=L!2u}K{Mlx{5@D{WIKK?OFX4vj*kG9gNvc2J5`t&yxGeg(IV9c%}b zDUmXXLscPFsw%;u2Q*cbl}hD^rb*jjhe^A{$Xbz4NIUJ8ik^Df_X37^Wq-6Ue&74P z_rCZ0{yjU-!{HzT`n5ea^;;OB->KpeyC>|N0bvozXdZoqSVYhY=xd%8V$dBVGZQGv zruNrB2*C)z*qH|orx_WksIWUT1qO6hWz&HIo5qCzL)QbKa|O(xJYKG;hVol z#x8*+y2pFkvfxS8bDp_Z>*+F0_Q`h)WX~I<~-;3YM%C;`7d5;{?Y5< z2%OBXKnK>mF3?z8-2dZl<*ZDK9yd{m*7@jO+xUs&Q18*0C_p|=SAJitwx=o5Hr4uRL zloFYYl+0?fO5C#Q#+c17T)+>!( zAN%qq7=x7?m{T+tQ!#qPWp%JKbATmfa*AX?Fj-4cO@rPkgQJXo9o*AIGqVPfOhubg zi8NzLNkx-EF(HH0{lpY;F-^tA_jG_4r0c_@W0xl;Tuw1%#c=t({9HlPjdaD5H;B3` zP;QcpD`eD!br<&CplKxx%bZgH@mR_r35!T1og}hMWa>PnYj>l(L0e)Rp=>`~SA^~T zG~C)u4)ltf@V+P+#5C!r?9?v3i;wijwM05@8QC1sW@frnLQ>ORmaePuS%^FyQ<8C0 zu}IfmvSxfNH>yF9s!EKWX_JGsM?A4LFyU?A_V)pJ*vavf^^=qdmDc*o}P zjxDinVdPQlVQi`CY0I*;dS~Oz59faD`M&3uXle4cGnugalTLrq7E_LxdJ|xqgKrVA z2Vsc1^Zd&buUcQU9$&j0b*wGOuI&xr9Za_k4KL46Oxyheg%G!LJ!?%?Y!+pVQ3Fk|~ z`PGS+@r}=HVaO4NO2SZCtkk(<6L+j0TaVg!z`+A0@7aN7q8m}B(%J8j(FUp!0rpN9 zNb7P|C6|nIpwd55GYYI6U>K%+>Jw(LjP}`G1~FnW^i6m^TnumF`r@_XwF=aq98uNV literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyqt6.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyqt6.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e293c62ffb1cd159ab790acd874e82c114bf09c9 GIT binary patch literal 2231 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 V`O5DC%Yl5LNLA;r=dYKc{sBq3^fLee literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_setuptools.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/__pycache__/pyi_rth_setuptools.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9b507500f114bebb9cc371df4f3c499ae1efcc3 GIT binary patch literal 1248 zcmah|O=#R!5S}NkY}t}XmbUq^3o`EFW<%^;QbH1A0$CGG9NVz=A+ioiXrnTIuaB;SKIl9gsYDS&X{E9AY8C`17Y z9+rrAQYV49KcX607Eof^7QntBD(w(#3i*&IIiINT=}ld#NmO2mZ<$0>WkQv@T!ZCq zz3rZE=m~}P)Z`r;>C0rSK$VqPX9F?j-g>H*+E!15bk)xXF2*7_+dK0?I319&597E; zJv^YE`yf(0zi4~Wx%}k(!rc7q>~!8*$WL0isr>xH{M2+l+ZRbbkNUY2R4ak+dpwfe zau8{jwdyeL`ent1k1)k-X>x(J70%Jg5e)$E_v1xDu&0r50auOId}9 zZ;5FF$m!$ER>@xWS!7V>C%fte)~fAQ9hOEfE=D#a=)k^xy->DGg@9Gpo$|wnqn_gw zmqrD&!YTqNOuG*X+zp)33Kq2&9bTAQpDOdf_B@AOUh@4FewhV_du83VP`8dTj8)d7 zVaq-AKVko@na5YHqgc#0HXaX=PmKM4VBF2`*i8f4YI?IzJZ<%Sn5=(Q_}1Kd+%kW7 zW8T;`Z@j+MG;g-dn}4NS=B?&nt~Hno)pPC4l~-&xb1lqV+fujG*K3=`JI#1{{n^AX z6XC#>SEZ(wYiYT^dv~?jP@8S*!(p=8`rsQqv#V#C`bbM336s@PK%XP%yocZ*OQOEX zM@6R+;2X{ob_Q)+eDg!>8 we rewrite on Mac OS to support --onefile mode + if os.path.exists(pixbuf_file) and sys.platform != 'win32': + with open(pixbuf_file, 'rb') as fp: + contents = fp.read() + + # Create a temporary file with the cache and cleverly replace the prefix we injected with the actual path. + fd, pixbuf_file = tempfile.mkstemp() + with os.fdopen(fd, 'wb') as fp: + libpath = os.path.join(sys._MEIPASS, 'lib').encode('utf-8') + fp.write(contents.replace(b'@executable_path/lib', libpath)) + + try: + atexit.register(os.unlink, pixbuf_file) + except OSError: + pass + + os.environ['GDK_PIXBUF_MODULE_FILE'] = pixbuf_file + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gi.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gi.py new file mode 100644 index 0000000..3c3b382 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gi.py @@ -0,0 +1,21 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2015-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + + +def _pyi_rthook(): + import os + import sys + + os.environ['GI_TYPELIB_PATH'] = os.path.join(sys._MEIPASS, 'gi_typelibs') + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gio.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gio.py new file mode 100644 index 0000000..f9fc307 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gio.py @@ -0,0 +1,21 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2015-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + + +def _pyi_rthook(): + import os + import sys + + os.environ['GIO_MODULE_DIR'] = os.path.join(sys._MEIPASS, 'gio_modules') + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_glib.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_glib.py new file mode 100644 index 0000000..35bd7f8 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_glib.py @@ -0,0 +1,37 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2015-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + + +def _pyi_rthook(): + import os + import sys + + # Prepend the frozen application's data dir to XDG_DATA_DIRS. We need to avoid overwriting the existing paths in + # order to allow the frozen application to run system-installed applications (for example, launch a web browser via + # the webbrowser module on Linux). Should the user desire complete isolation of the frozen application from the + # system, they need to clean up XDG_DATA_DIRS at the start of their program (i.e., remove all entries but first). + pyi_data_dir = os.path.join(sys._MEIPASS, 'share') + + xdg_data_dirs = os.environ.get('XDG_DATA_DIRS', None) + if xdg_data_dirs: + if pyi_data_dir not in xdg_data_dirs: + xdg_data_dirs = pyi_data_dir + os.pathsep + xdg_data_dirs + else: + xdg_data_dirs = pyi_data_dir + os.environ['XDG_DATA_DIRS'] = xdg_data_dirs + + # Cleanup aux variables + del xdg_data_dirs + del pyi_data_dir + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gstreamer.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gstreamer.py new file mode 100644 index 0000000..ec3495c --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gstreamer.py @@ -0,0 +1,32 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + + +def _pyi_rthook(): + import os + import sys + + # Without this environment variable set to 'no' importing 'gst' causes 100% CPU load. (Tested on Mac OS.) + os.environ['GST_REGISTRY_FORK'] = 'no' + + gst_plugin_paths = [sys._MEIPASS, os.path.join(sys._MEIPASS, 'gst-plugins')] + os.environ['GST_PLUGIN_PATH'] = os.pathsep.join(gst_plugin_paths) + + # Prevent permission issues on Windows + os.environ['GST_REGISTRY'] = os.path.join(sys._MEIPASS, 'registry.bin') + + # Only use packaged plugins to prevent GStreamer from crashing when it finds plugins from another version which are + # installed system wide. + os.environ['GST_PLUGIN_SYSTEM_PATH'] = '' + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gtk.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gtk.py new file mode 100644 index 0000000..d6ae21c --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_gtk.py @@ -0,0 +1,27 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2015-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + + +def _pyi_rthook(): + import os + import sys + + os.environ['GTK_DATA_PREFIX'] = sys._MEIPASS + os.environ['GTK_EXE_PREFIX'] = sys._MEIPASS + os.environ['GTK_PATH'] = sys._MEIPASS + + # Include these here, as GTK will import pango automatically. + os.environ['PANGO_LIBDIR'] = sys._MEIPASS + os.environ['PANGO_SYSCONFDIR'] = os.path.join(sys._MEIPASS, 'etc') # TODO? + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py new file mode 100644 index 0000000..976d78b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py @@ -0,0 +1,53 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + + +def _pyi_rthook(): + import inspect + import os + import sys + + # Use sys._MEIPASS with normalized path component separator. This is necessary on some platforms (i.e., msys2/mingw + # python on Windows), because we use string comparisons on the paths. + SYS_PREFIX = os.path.normpath(sys._MEIPASS) + + _orig_inspect_getsourcefile = inspect.getsourcefile + + # Provide custom implementation of inspect.getsourcefile() for frozen applications that properly resolves relative + # filenames obtained from object (e.g., inspect stack-frames). See #5963. + def _pyi_getsourcefile(object): + filename = inspect.getfile(object) + filename = os.path.normpath(filename) # Ensure path component separators are normalized. + if not os.path.isabs(filename): + # Check if given filename matches the basename of __main__'s __file__. + main_file = getattr(sys.modules['__main__'], '__file__', None) + if main_file and filename == os.path.basename(main_file): + return main_file + + # If filename ends with .py suffix and does not correspond to frozen entry-point script, convert it to + # corresponding .pyc in sys._MEIPASS. + if filename.endswith('.py'): + filename = os.path.normpath(os.path.join(SYS_PREFIX, filename + 'c')) + # Ensure the relative path did not try to jump out of sys._MEIPASS, just in case... + if filename.startswith(SYS_PREFIX): + return filename + elif filename.startswith(SYS_PREFIX) and filename.endswith('.pyc'): + # If filename is already PyInstaller-compatible, prevent any further processing (i.e., with original + # implementation). + return filename + # Use original implementation as a fallback. + return _orig_inspect_getsourcefile(object) + + inspect.getsourcefile = _pyi_getsourcefile + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_kivy.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_kivy.py new file mode 100644 index 0000000..0846401 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_kivy.py @@ -0,0 +1,24 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2015-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + + +def _pyi_rthook(): + import os + import sys + + root = os.path.join(sys._MEIPASS, 'kivy_install') + + os.environ['KIVY_DATA_DIR'] = os.path.join(root, 'data') + os.environ['KIVY_MODULES_DIR'] = os.path.join(root, 'modules') + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_mplconfig.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_mplconfig.py new file mode 100644 index 0000000..93fec80 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_mplconfig.py @@ -0,0 +1,46 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +# matplotlib will create $HOME/.matplotlib folder in user's home directory. In this directory there is fontList.cache +# file which lists paths to matplotlib fonts. +# +# When you run your onefile exe for the first time it's extracted to for example "_MEIxxxxx" temp directory and +# fontList.cache file is created with fonts paths pointing to this directory. +# +# Second time you run your exe new directory is created "_MEIyyyyy" but fontList.cache file still points to previous +# directory which was deleted. And then you will get error like: +# +# RuntimeError: Could not open facefile +# +# We need to force matplotlib to recreate config directory every time you run your app. + + +def _pyi_rthook(): + import atexit + import os + import shutil + + import _pyi_rth_utils.tempfile # PyInstaller's run-time hook utilities module + + # Isolate matplotlib's config dir into temporary directory. + # Use our replacement for `tempfile.mkdtemp` function that properly restricts access to directory on all platforms. + configdir = _pyi_rth_utils.tempfile.secure_mkdtemp() + os.environ['MPLCONFIGDIR'] = configdir + + try: + # Remove temp directory at application exit and ignore any errors. + atexit.register(shutil.rmtree, configdir, ignore_errors=True) + except OSError: + pass + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py new file mode 100644 index 0000000..f596d93 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py @@ -0,0 +1,55 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2017-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + + +def _pyi_rthook(): + import sys + + import multiprocessing + import multiprocessing.spawn + + from subprocess import _args_from_interpreter_flags + + # Prevent `spawn` from trying to read `__main__` in from the main script + multiprocessing.process.ORIGINAL_DIR = None + + def _freeze_support(): + # We want to catch the two processes that are spawned by the multiprocessing code: + # - the semaphore tracker, which cleans up named semaphores in the `spawn` multiprocessing mode + # - the fork server, which keeps track of worker processes in the `forkserver` mode. + # Both of these processes are started by spawning a new copy of the running executable, passing it the flags + # from `_args_from_interpreter_flags` and then "-c" and an import statement. + # Look for those flags and the import statement, then `exec()` the code ourselves. + + if ( + len(sys.argv) >= 2 and sys.argv[-2] == '-c' and sys.argv[-1].startswith( + ('from multiprocessing.resource_tracker import main', 'from multiprocessing.forkserver import main') + ) and set(sys.argv[1:-2]) == set(_args_from_interpreter_flags()) + ): + exec(sys.argv[-1]) + sys.exit() + + if multiprocessing.spawn.is_forking(sys.argv): + kwds = {} + for arg in sys.argv[2:]: + name, value = arg.split('=') + if value == 'None': + kwds[name] = None + else: + kwds[name] = int(value) + multiprocessing.spawn.spawn_main(**kwds) + sys.exit() + + multiprocessing.freeze_support = multiprocessing.spawn.freeze_support = _freeze_support + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgres.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgres.py new file mode 100644 index 0000000..f84ae31 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgres.py @@ -0,0 +1,171 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +# To make pkg_resources work with frozen modules we need to set the 'Provider' class for PyiFrozenImporter. +# This class decides where to look for resources and other stuff. +# +# 'pkg_resources.NullProvider' is dedicated to PEP302 import hooks like PyiFileImporter is. It uses method +# __loader__.get_data() in methods pkg_resources.resource_string() and pkg_resources.resource_stream() +# +# We provide PyiFrozenProvider, which subclasses the NullProvider and implements _has(), _isdir(), and _listdir() +# methods, which are needed for pkg_resources.resource_exists(), resource_isdir(), and resource_listdir() to work. We +# cannot use the DefaultProvider, because it provides filesystem-only implementations (and overrides _get() with a +# filesystem-only one), whereas our provider needs to also support embedded resources. +# +# The PyiFrozenProvider allows querying/listing both PYZ-embedded and on-filesystem resources in a frozen package. The +# results are typically combined for both types of resources (e.g., when listing a directory or checking whether a +# resource exists). When the order of precedence matters, the PYZ-embedded resources take precedence over the +# on-filesystem ones, to keep the behavior consistent with the actual file content retrieval via _get() method (which in +# turn uses PyiFrozenImporter's get_data() method). For example, when checking whether a resource is a directory via +# _isdir(), a PYZ-embedded file will take precedence over a potential on-filesystem directory. Also, in contrast to +# unfrozen packages, the frozen ones do not contain source .py files, which are therefore absent from content listings. + + +def _pyi_rthook(): + import os + import pathlib + import sys + + import pkg_resources + + import pyimod02_importers # PyInstaller's bootstrap module + + SYS_PREFIX = pathlib.PurePath(sys._MEIPASS) + + class _TocFilesystem: + """ + A prefix tree implementation for embedded filesystem reconstruction. + + NOTE: as of PyInstaller 6.0, the embedded PYZ archive cannot contain data files anymore. Instead, it contains + only .pyc modules - which are by design not returned by `PyiFrozenProvider`. So this implementation has been + reduced to supporting only directories implied by collected packages. + """ + def __init__(self, tree_node): + self._tree = tree_node + + def _get_tree_node(self, path): + path = pathlib.PurePath(path) + current = self._tree + for component in path.parts: + if component not in current: + return None + current = current[component] + return current + + def path_exists(self, path): + node = self._get_tree_node(path) + return isinstance(node, dict) # Directory only + + def path_isdir(self, path): + node = self._get_tree_node(path) + return isinstance(node, dict) # Directory only + + def path_listdir(self, path): + node = self._get_tree_node(path) + if not isinstance(node, dict): + return [] # Non-existent or file + # Return only sub-directories + return [entry_name for entry_name, entry_data in node.items() if isinstance(entry_data, dict)] + + class PyiFrozenProvider(pkg_resources.NullProvider): + """ + Custom pkg_resources provider for PyiFrozenImporter. + """ + def __init__(self, module): + super().__init__(module) + + # Get top-level path; if "module" corresponds to a package, we need the path to the package itself. + # If "module" is a submodule in a package, we need the path to the parent package. + # + # This is equivalent to `pkg_resources.NullProvider.module_path`, except we construct a `pathlib.PurePath` + # for easier manipulation. + # + # NOTE: the path is NOT resolved for symbolic links, as neither are paths that are passed by `pkg_resources` + # to `_has`, `_isdir`, `_listdir` (they are all anchored to `module_path`, which in turn is just + # `os.path.dirname(module.__file__)`. As `__file__` returned by `PyiFrozenImporter` is always anchored to + # `sys._MEIPASS`, we do not have to worry about cross-linked directories in macOS .app bundles, where the + # resolved `__file__` could be either in the `Contents/Frameworks` directory (the "true" `sys._MEIPASS`), or + # in the `Contents/Resources` directory due to cross-linking. + self._pkg_path = pathlib.PurePath(module.__file__).parent + + # Construct _TocFilesystem on top of pre-computed prefix tree provided by pyimod02_importers. + self.embedded_tree = _TocFilesystem(pyimod02_importers.get_pyz_toc_tree()) + + def _normalize_path(self, path): + # Avoid using `Path.resolve`, because it resolves symlinks. This is undesirable, because the pure path in + # `self._pkg_path` does not have symlinks resolved, so comparison between the two would be faulty. Instead, + # use `os.path.normpath` to normalize the path and get rid of any '..' elements (the path itself should + # already be absolute). + return pathlib.Path(os.path.normpath(path)) + + def _is_relative_to_package(self, path): + return path == self._pkg_path or self._pkg_path in path.parents + + def _has(self, path): + # Prevent access outside the package. + path = self._normalize_path(path) + if not self._is_relative_to_package(path): + return False + + # Check the filesystem first to avoid unnecessarily computing the relative path... + if path.exists(): + return True + rel_path = path.relative_to(SYS_PREFIX) + return self.embedded_tree.path_exists(rel_path) + + def _isdir(self, path): + # Prevent access outside the package. + path = self._normalize_path(path) + if not self._is_relative_to_package(path): + return False + + # Embedded resources have precedence over filesystem... + rel_path = path.relative_to(SYS_PREFIX) + node = self.embedded_tree._get_tree_node(rel_path) + if node is None: + return path.is_dir() # No match found; try the filesystem. + else: + # str = file, dict = directory + return not isinstance(node, str) + + def _listdir(self, path): + # Prevent access outside the package. + path = self._normalize_path(path) + if not self._is_relative_to_package(path): + return [] + + # Relative path for searching embedded resources. + rel_path = path.relative_to(SYS_PREFIX) + # List content from embedded filesystem... + content = self.embedded_tree.path_listdir(rel_path) + # ... as well as the actual one. + if path.is_dir(): + # Use os.listdir() to avoid having to convert Path objects to strings... Also make sure to de-duplicate + # the results. + path = str(path) # not is_py36 + content = list(set(content + os.listdir(path))) + return content + + pkg_resources.register_loader_type(pyimod02_importers.PyiFrozenImporter, PyiFrozenProvider) + + # With our PyiFrozenImporter now being a path entry finder, it effectively replaces python's FileFinder. So we need + # to register it with `pkg_resources.find_on_path` to allow metadata to be found on filesystem. + pkg_resources.register_finder(pyimod02_importers.PyiFrozenImporter, pkg_resources.find_on_path) + + # For the above change to fully take effect, we need to re-initialize pkg_resources's master working set (since the + # original one was built with assumption that sys.path entries are handled by python's FileFinder). + # See https://github.com/pypa/setuptools/issues/373 + if hasattr(pkg_resources, '_initialize_master_working_set'): + pkg_resources._initialize_master_working_set() + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py new file mode 100644 index 0000000..8337fa3 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py @@ -0,0 +1,64 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- +# +# The run-time hook provides a custom module iteration function for our PyiFrozenImporter, which allows +# `pkgutil.iter_modules()` to return entries for modules that are embedded in the PYZ archive. The non-embedded modules +# (binary extensions, modules collected as only source .py files, etc.) are enumerated using the `fallback_finder` +# provided by `PyiFrozenImporter` (which typically would be the python's `FileFinder`). +def _pyi_rthook(): + import pkgutil + + import pyimod02_importers # PyInstaller's bootstrap module + + # This could, in fact, be implemented as `iter_modules()` method of the `PyiFrozenImporter`. However, we want to + # avoid importing `pkgutil` in that bootstrap module (i.e., for the `pkgutil.iter_importer_modules()` call on the + # fallback finder). + def _iter_pyi_frozen_file_finder_modules(finder, prefix=''): + # Fetch PYZ TOC tree from pyimod02_importers + pyz_toc_tree = pyimod02_importers.get_pyz_toc_tree() + + # Finder has already pre-computed the package prefix implied by the search path. Use it to find the starting + # node in the prefix tree. + if finder._pyz_entry_prefix: + pkg_name_parts = finder._pyz_entry_prefix.split('.') + else: + pkg_name_parts = [] + + tree_node = pyz_toc_tree + for pkg_name_part in pkg_name_parts: + tree_node = tree_node.get(pkg_name_part) + if not isinstance(tree_node, dict): + # This check handles two cases: + # a) path does not exist (`tree_node` is `None`) + # b) path corresponds to a module instead of a package (`tree_node` is a leaf node (`str`)). + tree_node = {} + break + + # Dump the contents of the tree node. + for entry_name, entry_data in tree_node.items(): + is_pkg = isinstance(entry_data, dict) + yield prefix + entry_name, is_pkg + + # If our finder has a fall-back finder available, iterate its modules as well. By using the public + # `fallback_finder` attribute, we force creation of the fallback finder as necessary. + # NOTE: we do not care about potential duplicates here, because `pkgutil.iter_modules()` itself + # keeps track of yielded names for purposes of de-duplication. + if finder.fallback_finder is not None: + yield from pkgutil.iter_importer_modules(finder.fallback_finder, prefix) + + pkgutil.iter_importer_modules.register( + pyimod02_importers.PyiFrozenImporter, + _iter_pyi_frozen_file_finder_modules, + ) + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyqt5.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyqt5.py new file mode 100644 index 0000000..fa388e8 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyqt5.py @@ -0,0 +1,68 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +# The path to Qt's components may not default to the wheel layout for self-compiled PyQt5 installations. Mandate the +# wheel layout. See ``utils/hooks/qt.py`` for more details. + + +def _pyi_rthook(): + import os + import sys + + from _pyi_rth_utils import is_macos_app_bundle, prepend_path_to_environment_variable + from _pyi_rth_utils import qt as qt_rth_utils + + # Ensure this is the only Qt bindings package in the application. + qt_rth_utils.ensure_single_qt_bindings_package("PyQt5") + + # Try PyQt5 5.15.4-style path first... + pyqt_path = os.path.join(sys._MEIPASS, 'PyQt5', 'Qt5') + if not os.path.isdir(pyqt_path): + # ... and fall back to the older version + pyqt_path = os.path.join(sys._MEIPASS, 'PyQt5', 'Qt') + + os.environ['QT_PLUGIN_PATH'] = os.path.join(pyqt_path, 'plugins') + + if is_macos_app_bundle: + # Special handling for macOS .app bundles. To satisfy codesign requirements, we are forced to split `qml` + # directory into two parts; one that keeps only binaries (rooted in `Contents/Frameworks`) and one that keeps + # only data files (rooted in `Contents/Resources), with files from one directory tree being symlinked to the + # other to maintain illusion of a single mixed-content directory. As Qt seems to compute the identifier of its + # QML components based on location of the `qmldir` file w.r.t. the registered QML import paths, we need to + # register both paths, because the `qmldir` file for a component could be reached via either directory tree. + pyqt_path_res = os.path.normpath( + os.path.join(sys._MEIPASS, '..', 'Resources', os.path.relpath(pyqt_path, sys._MEIPASS)) + ) + os.environ['QML2_IMPORT_PATH'] = os.pathsep.join([ + os.path.join(pyqt_path_res, 'qml'), + os.path.join(pyqt_path, 'qml'), + ]) + else: + os.environ['QML2_IMPORT_PATH'] = os.path.join(pyqt_path, 'qml') + + # Back in the day, this was required because PyQt5 5.12.3 explicitly checked that `Qt5Core.dll` was in `PATH` + # (see #4293), and contemporary PyInstaller versions collected that DLL to `sys._MEIPASS`. + # + # Nowadays, we add `sys._MEIPASS` to `PATH` in order to ensure that `QtNetwork` can discover OpenSSL DLLs that might + # have been collected there (i.e., when they were not shipped with the package, and were collected from an external + # location). + if sys.platform.startswith('win'): + prepend_path_to_environment_variable(sys._MEIPASS, 'PATH') + + # Qt bindings package installed via PyPI wheels typically ensures that its bundled Qt is relocatable, by creating + # embedded `qt.conf` file during its initialization. This run-time generated qt.conf dynamically sets the Qt prefix + # path to the package's Qt directory. For bindings packages that do not create embedded `qt.conf` during their + # initialization (for example, conda-installed packages), try to perform this step ourselves. + qt_rth_utils.create_embedded_qt_conf("PyQt5", pyqt_path) + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyqt6.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyqt6.py new file mode 100644 index 0000000..d3ed0cd --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyqt6.py @@ -0,0 +1,70 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +# The path to Qt's components may not default to the wheel layout for self-compiled PyQt6 installations. Mandate the +# wheel layout. See ``utils/hooks/qt.py`` for more details. + + +def _pyi_rthook(): + import os + import sys + + from _pyi_rth_utils import is_macos_app_bundle, prepend_path_to_environment_variable + from _pyi_rth_utils import qt as qt_rth_utils + + # Ensure this is the only Qt bindings package in the application. + qt_rth_utils.ensure_single_qt_bindings_package("PyQt6") + + # Try PyQt6 6.0.3-style path first... + pyqt_path = os.path.join(sys._MEIPASS, 'PyQt6', 'Qt6') + if not os.path.isdir(pyqt_path): + # ... and fall back to the older version. + pyqt_path = os.path.join(sys._MEIPASS, 'PyQt6', 'Qt') + + os.environ['QT_PLUGIN_PATH'] = os.path.join(pyqt_path, 'plugins') + + if is_macos_app_bundle: + # Special handling for macOS .app bundles. To satisfy codesign requirements, we are forced to split `qml` + # directory into two parts; one that keeps only binaries (rooted in `Contents/Frameworks`) and one that keeps + # only data files (rooted in `Contents/Resources), with files from one directory tree being symlinked to the + # other to maintain illusion of a single mixed-content directory. As Qt seems to compute the identifier of its + # QML components based on location of the `qmldir` file w.r.t. the registered QML import paths, we need to + # register both paths, because the `qmldir` file for a component could be reached via either directory tree. + pyqt_path_res = os.path.normpath( + os.path.join(sys._MEIPASS, '..', 'Resources', os.path.relpath(pyqt_path, sys._MEIPASS)) + ) + os.environ['QML2_IMPORT_PATH'] = os.pathsep.join([ + os.path.join(pyqt_path_res, 'qml'), + os.path.join(pyqt_path, 'qml'), + ]) + else: + os.environ['QML2_IMPORT_PATH'] = os.path.join(pyqt_path, 'qml') + + # Add `sys._MEIPASS` to `PATH` in order to ensure that `QtNetwork` can discover OpenSSL DLLs that might have been + # collected there (i.e., when they were not shipped with the package, and were collected from an external location). + if sys.platform.startswith('win'): + prepend_path_to_environment_variable(sys._MEIPASS, 'PATH') + + # For macOS POSIX builds, we need to add `sys._MEIPASS` to `DYLD_LIBRARY_PATH` so that QtNetwork can discover + # OpenSSL dynamic libraries for its `openssl` TLS backend. This also prevents fallback to external locations, such + # as Homebrew. For .app bundles, this is unnecessary because `QtNetwork` explicitly searches `Contents/Frameworks`. + if sys.platform == 'darwin' and not is_macos_app_bundle: + prepend_path_to_environment_variable(sys._MEIPASS, 'DYLD_LIBRARY_PATH') + + # Qt bindings package installed via PyPI wheels typically ensures that its bundled Qt is relocatable, by creating + # embedded `qt.conf` file during its initialization. This run-time generated qt.conf dynamically sets the Qt prefix + # path to the package's Qt directory. For bindings packages that do not create embedded `qt.conf` during their + # initialization (for example, conda-installed packages), try to perform this step ourselves. + qt_rth_utils.create_embedded_qt_conf("PyQt6", pyqt_path) + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyside2.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyside2.py new file mode 100644 index 0000000..3aca93b --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyside2.py @@ -0,0 +1,63 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +# The path to Qt's components may not default to the wheel layout for self-compiled PySide2 installations. Mandate the +# wheel layout. See ``utils/hooks/qt.py`` for more details. + + +def _pyi_rthook(): + import os + import sys + + from _pyi_rth_utils import is_macos_app_bundle, prepend_path_to_environment_variable + from _pyi_rth_utils import qt as qt_rth_utils + + # Ensure this is the only Qt bindings package in the application. + qt_rth_utils.ensure_single_qt_bindings_package("PySide2") + + if sys.platform.startswith('win'): + pyqt_path = os.path.join(sys._MEIPASS, 'PySide2') + else: + pyqt_path = os.path.join(sys._MEIPASS, 'PySide2', 'Qt') + + os.environ['QT_PLUGIN_PATH'] = os.path.join(pyqt_path, 'plugins') + + if is_macos_app_bundle: + # Special handling for macOS .app bundles. To satisfy codesign requirements, we are forced to split `qml` + # directory into two parts; one that keeps only binaries (rooted in `Contents/Frameworks`) and one that keeps + # only data files (rooted in `Contents/Resources), with files from one directory tree being symlinked to the + # other to maintain illusion of a single mixed-content directory. As Qt seems to compute the identifier of its + # QML components based on location of the `qmldir` file w.r.t. the registered QML import paths, we need to + # register both paths, because the `qmldir` file for a component could be reached via either directory tree. + pyqt_path_res = os.path.normpath( + os.path.join(sys._MEIPASS, '..', 'Resources', os.path.relpath(pyqt_path, sys._MEIPASS)) + ) + os.environ['QML2_IMPORT_PATH'] = os.pathsep.join([ + os.path.join(pyqt_path_res, 'qml'), + os.path.join(pyqt_path, 'qml'), + ]) + else: + os.environ['QML2_IMPORT_PATH'] = os.path.join(pyqt_path, 'qml') + + # Add `sys._MEIPASS` to `PATH` in order to ensure that `QtNetwork` can discover OpenSSL DLLs that might have been + # collected there (i.e., when they were not shipped with the package, and were collected from an external location). + if sys.platform.startswith('win'): + prepend_path_to_environment_variable(sys._MEIPASS, 'PATH') + + # Qt bindings package installed via PyPI wheels typically ensures that its bundled Qt is relocatable, by creating + # embedded `qt.conf` file during its initialization. This run-time generated qt.conf dynamically sets the Qt prefix + # path to the package's Qt directory. For bindings packages that do not create embedded `qt.conf` during their + # initialization (for example, conda-installed packages), try to perform this step ourselves. + qt_rth_utils.create_embedded_qt_conf("PySide2", pyqt_path) + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyside6.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyside6.py new file mode 100644 index 0000000..73db137 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pyside6.py @@ -0,0 +1,69 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +# The path to Qt's components may not default to the wheel layout for self-compiled PySide6 installations. Mandate the +# wheel layout. See ``utils/hooks/qt.py`` for more details. + + +def _pyi_rthook(): + import os + import sys + + from _pyi_rth_utils import is_macos_app_bundle, prepend_path_to_environment_variable + from _pyi_rth_utils import qt as qt_rth_utils + + # Ensure this is the only Qt bindings package in the application. + qt_rth_utils.ensure_single_qt_bindings_package("PySide6") + + if sys.platform.startswith('win'): + pyqt_path = os.path.join(sys._MEIPASS, 'PySide6') + else: + pyqt_path = os.path.join(sys._MEIPASS, 'PySide6', 'Qt') + + os.environ['QT_PLUGIN_PATH'] = os.path.join(pyqt_path, 'plugins') + + if is_macos_app_bundle: + # Special handling for macOS .app bundles. To satisfy codesign requirements, we are forced to split `qml` + # directory into two parts; one that keeps only binaries (rooted in `Contents/Frameworks`) and one that keeps + # only data files (rooted in `Contents/Resources), with files from one directory tree being symlinked to the + # other to maintain illusion of a single mixed-content directory. As Qt seems to compute the identifier of its + # QML components based on location of the `qmldir` file w.r.t. the registered QML import paths, we need to + # register both paths, because the `qmldir` file for a component could be reached via either directory tree. + pyqt_path_res = os.path.normpath( + os.path.join(sys._MEIPASS, '..', 'Resources', os.path.relpath(pyqt_path, sys._MEIPASS)) + ) + os.environ['QML2_IMPORT_PATH'] = os.pathsep.join([ + os.path.join(pyqt_path_res, 'qml'), + os.path.join(pyqt_path, 'qml'), + ]) + else: + os.environ['QML2_IMPORT_PATH'] = os.path.join(pyqt_path, 'qml') + + # Add `sys._MEIPASS` to `PATH` in order to ensure that `QtNetwork` can discover OpenSSL DLLs that might have been + # collected there (i.e., when they were not shipped with the package, and were collected from an external location). + if sys.platform.startswith('win'): + prepend_path_to_environment_variable(sys._MEIPASS, 'PATH') + + # For macOS POSIX builds, we need to add `sys._MEIPASS` to `DYLD_LIBRARY_PATH` so that QtNetwork can discover + # OpenSSL dynamic libraries for its `openssl` TLS backend. This also prevents fallback to external locations, such + # as Homebrew. For .app bundles, this is unnecessary because `QtNetwork` explicitly searches `Contents/Frameworks`. + if sys.platform == 'darwin' and not is_macos_app_bundle: + prepend_path_to_environment_variable(sys._MEIPASS, 'DYLD_LIBRARY_PATH') + + # Qt bindings package installed via PyPI wheels typically ensures that its bundled Qt is relocatable, by creating + # embedded `qt.conf` file during its initialization. This run-time generated qt.conf dynamically sets the Qt prefix + # path to the package's Qt directory. For bindings packages that do not create embedded `qt.conf` during their + # initialization (for example, conda-installed packages), try to perform this step ourselves. + qt_rth_utils.create_embedded_qt_conf("PySide6", pyqt_path) + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_setuptools.py b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_setuptools.py new file mode 100644 index 0000000..0a3ffb8 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_setuptools.py @@ -0,0 +1,37 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2022-2023, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +# This runtime hook performs the equivalent of the distutils-precedence.pth from the setuptools package; +# it registers a special meta finder that diverts import of distutils to setuptools._distutils, if available. + + +def _pyi_rthook(): + def _install_setuptools_distutils_hack(): + import os + import setuptools + + # We need to query setuptools version at runtime, because the default value for SETUPTOOLS_USE_DISTUTILS + # has changed at version 60.0 from "stdlib" to "local", and we want to mimic that behavior. + setuptools_major = int(setuptools.__version__.split('.')[0]) + default_value = "stdlib" if setuptools_major < 60 else "local" + + if os.environ.get("SETUPTOOLS_USE_DISTUTILS", default_value) == "local": + import _distutils_hack + _distutils_hack.add_shim() + + try: + _install_setuptools_distutils_hack() + except Exception: + pass + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/PyInstaller/isolated/__init__.py b/venv/Lib/site-packages/PyInstaller/isolated/__init__.py new file mode 100644 index 0000000..3016e7d --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/isolated/__init__.py @@ -0,0 +1,31 @@ +# ----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) or, at the user's discretion, the MIT License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception OR MIT) +# ----------------------------------------------------------------------------- +""" +PyInstaller hooks typically will need to import the package which they are written for but doing so may manipulate +globals such as :data:`sys.path` or :data:`os.environ` in ways that affect the build. For example, on Windows, +Qt's binaries are added to then loaded via ``PATH`` in such a way that if you import multiple Qt variants in one +session then there is no guarantee which variant's binaries each variant will get! + +To get around this, PyInstaller does any such tasks in an isolated Python subprocess and ships a +:mod:`PyInstaller.isolated` submodule to do so in hooks. :: + + from PyInstaller import isolated + +This submodule provides: + +* :func:`isolated.call() ` to evaluate functions in isolation. +* :func:`@isolated.decorate ` to mark a function as always called in isolation. +* :class:`isolated.Python() ` to efficiently call many functions in a single child instance of Python. + +""" + +# flake8: noqa +from ._parent import Python, call, decorate, SubprocessDiedError diff --git a/venv/Lib/site-packages/PyInstaller/isolated/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/isolated/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8181c0b509456ac198bb6df1b44799dc1a09aa4 GIT binary patch literal 1279 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/isolated/_child.py b/venv/Lib/site-packages/PyInstaller/isolated/_child.py new file mode 100644 index 0000000..0709b68 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/isolated/_child.py @@ -0,0 +1,101 @@ +# ----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) or, at the user's discretion, the MIT License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception OR MIT) +# ----------------------------------------------------------------------------- +""" +The child process to be invoked by IsolatedPython(). + +This file is to be run directly with pipe handles for reading from and writing to the parent process as command line +arguments. + +""" + +import sys +import os +import types +from marshal import loads, dumps +from base64 import b64encode, b64decode +from traceback import format_exception + +if os.name == "nt": + from msvcrt import open_osfhandle + + def _open(osf_handle, mode): + # Convert system file handles to file descriptors before opening them. + return open(open_osfhandle(osf_handle, 0), mode) +else: + _open = open + + +def run_next_command(read_fh, write_fh): + """ + Listen to **read_fh** for the next function to run. Write the result to **write_fh**. + """ + + # Check the first line of input. Receiving an empty line is the signal that there are no more tasks to be ran. + first_line = read_fh.readline() + if first_line == b"\n": + # It's time to end this child process + return False + + # There are 5 lines to read: The function's code, its default args, its default kwargs, its args, and its kwargs. + code = loads(b64decode(first_line.strip())) + _defaults = loads(b64decode(read_fh.readline().strip())) + _kwdefaults = loads(b64decode(read_fh.readline().strip())) + args = loads(b64decode(read_fh.readline().strip())) + kwargs = loads(b64decode(read_fh.readline().strip())) + + try: + # Define the global namespace available to the function. + GLOBALS = {"__builtins__": __builtins__, "__isolated__": True} + # Reconstruct the function. + function = types.FunctionType(code, GLOBALS) + function.__defaults__ = _defaults + function.__kwdefaults__ = _kwdefaults + + # Run it. + output = function(*args, **kwargs) + + # Verify that the output is serialise-able (i.e. no custom types or module or function references) here so that + # it's caught if it fails. + marshalled = dumps((True, output)) + + except BaseException as ex: + # An exception happened whilst either running the function or serialising its output. Send back a string + # version of the traceback (unfortunately raw traceback objects are not marshal-able) and a boolean to say + # that it failed. + tb_lines = format_exception(type(ex), ex, ex.__traceback__) + if tb_lines[0] == "Traceback (most recent call last):\n": + # This particular line is distracting. Get rid of it. + tb_lines = tb_lines[1:] + marshalled = dumps((False, "".join(tb_lines).rstrip())) + + # Send the output (return value or traceback) back to the parent. + write_fh.write(b64encode(marshalled)) + write_fh.write(b"\n") + write_fh.flush() + + # Signal that an instruction was ran (successfully or otherwise). + return True + + +if __name__ == '__main__': + # Mark this process as PyInstaller's isolated subprocess; this makes attempts at spawning further isolated + # subprocesses via `PyInstaller.isolated` from this process no-op. + sys._pyi_isolated_subprocess = True + + read_from_parent, write_to_parent = map(int, sys.argv[1:]) + + with _open(read_from_parent, "rb") as read_fh: + with _open(write_to_parent, "wb") as write_fh: + sys.path = loads(b64decode(read_fh.readline())) + + # Keep receiving and running instructions until the parent sends the signal to stop. + while run_next_command(read_fh, write_fh): + pass diff --git a/venv/Lib/site-packages/PyInstaller/isolated/_parent.py b/venv/Lib/site-packages/PyInstaller/isolated/_parent.py new file mode 100644 index 0000000..0998e93 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/isolated/_parent.py @@ -0,0 +1,437 @@ +# ----------------------------------------------------------------------------- +# Copyright (c) 2021-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) or, at the user's discretion, the MIT License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception OR MIT) +# ----------------------------------------------------------------------------- + +import os +from pathlib import Path +from marshal import loads, dumps +from base64 import b64encode, b64decode +import functools +import subprocess +import sys + +from PyInstaller import compat +from PyInstaller import log as logging + +logger = logging.getLogger(__name__) + +# WinAPI bindings for Windows-specific codepath +if os.name == "nt": + import msvcrt + import ctypes + import ctypes.wintypes + + # CreatePipe + class SECURITY_ATTRIBUTES(ctypes.Structure): + _fields_ = [ + ("nLength", ctypes.wintypes.DWORD), + ("lpSecurityDescriptor", ctypes.wintypes.LPVOID), + ("bInheritHandle", ctypes.wintypes.BOOL), + ] + + HANDLE_FLAG_INHERIT = 0x0001 + + LPSECURITY_ATTRIBUTES = ctypes.POINTER(SECURITY_ATTRIBUTES) + + CreatePipe = ctypes.windll.kernel32.CreatePipe + CreatePipe.argtypes = [ + ctypes.POINTER(ctypes.wintypes.HANDLE), + ctypes.POINTER(ctypes.wintypes.HANDLE), + LPSECURITY_ATTRIBUTES, + ctypes.wintypes.DWORD, + ] + CreatePipe.restype = ctypes.wintypes.BOOL + + # CloseHandle + CloseHandle = ctypes.windll.kernel32.CloseHandle + CloseHandle.argtypes = [ctypes.wintypes.HANDLE] + CloseHandle.restype = ctypes.wintypes.BOOL + +CHILD_PY = Path(__file__).with_name("_child.py") + + +def create_pipe(read_handle_inheritable, write_handle_inheritable): + """ + Create a one-way pipe for sending data to child processes. + + Args: + read_handle_inheritable: + A boolean flag indicating whether the handle corresponding to the read end-point of the pipe should be + marked as inheritable by subprocesses. + write_handle_inheritable: + A boolean flag indicating whether the handle corresponding to the write end-point of the pipe should be + marked as inheritable by subprocesses. + + Returns: + A read/write pair of file descriptors (which are just integers) on posix or system file handles on Windows. + + The pipe may be used either by this process or subprocesses of this process but not globally. + """ + return _create_pipe_impl(read_handle_inheritable, write_handle_inheritable) + + +def close_pipe_endpoint(pipe_handle): + """ + Close the file descriptor (posix) or handle (Windows) belonging to a pipe. + """ + return _close_pipe_endpoint_impl(pipe_handle) + + +if os.name == "nt": + + def _create_pipe_impl(read_handle_inheritable, write_handle_inheritable): + # Use WinAPI CreatePipe function to create the pipe. Python's os.pipe() does the same, but wraps the resulting + # handles into inheritable file descriptors (https://github.com/python/cpython/issues/77046). Instead, we want + # just handles, and will set the inheritable flag on corresponding handle ourselves. + read_handle = ctypes.wintypes.HANDLE() + write_handle = ctypes.wintypes.HANDLE() + + # SECURITY_ATTRIBUTES with inherit handle set to True + security_attributes = SECURITY_ATTRIBUTES() + security_attributes.nLength = ctypes.sizeof(security_attributes) + security_attributes.bInheritHandle = True + security_attributes.lpSecurityDescriptor = None + + # CreatePipe() + succeeded = CreatePipe( + ctypes.byref(read_handle), # hReadPipe + ctypes.byref(write_handle), # hWritePipe + ctypes.byref(security_attributes), # lpPipeAttributes + 0, # nSize + ) + if not succeeded: + raise ctypes.WinError() + + # Set inheritable flags. Instead of binding and using SetHandleInformation WinAPI function, we can use + # os.set_handle_inheritable(). + os.set_handle_inheritable(read_handle.value, read_handle_inheritable) + os.set_handle_inheritable(write_handle.value, write_handle_inheritable) + + return read_handle.value, write_handle.value + + def _close_pipe_endpoint_impl(pipe_handle): + succeeded = CloseHandle(pipe_handle) + if not succeeded: + raise ctypes.WinError() +else: + + def _create_pipe_impl(read_fd_inheritable, write_fd_inheritable): + # Create pipe, using os.pipe() + read_fd, write_fd = os.pipe() + + # The default behaviour of pipes is that they are process specific. I.e., they can only be used by this + # process to talk to itself. Setting inheritable flags means that child processes may also use these pipes. + os.set_inheritable(read_fd, read_fd_inheritable) + os.set_inheritable(write_fd, write_fd_inheritable) + + return read_fd, write_fd + + def _close_pipe_endpoint_impl(pipe_fd): + os.close(pipe_fd) + + +def child(read_from_parent: int, write_to_parent: int): + """ + Spawn a Python subprocess sending it the two file descriptors it needs to talk back to this parent process. + """ + if os.name != 'nt': + # Explicitly disabling close_fds is a requirement for making file descriptors inheritable by child processes. + extra_kwargs = { + "env": _subprocess_env(), + "close_fds": False, + } + else: + # On Windows, we can use subprocess.STARTUPINFO to explicitly pass the list of file handles to be inherited, + # so we can avoid disabling close_fds + extra_kwargs = { + "env": _subprocess_env(), + "close_fds": True, + "startupinfo": subprocess.STARTUPINFO(lpAttributeList={"handle_list": [read_from_parent, write_to_parent]}) + } + + # Run the _child.py script directly passing it the two file descriptors it needs to talk back to the parent. + cmd, options = compat.__wrap_python([str(CHILD_PY), str(read_from_parent), str(write_to_parent)], extra_kwargs) + + # I'm intentionally leaving stdout and stderr alone so that print() can still be used for emergency debugging and + # unhandled errors in the child are still visible. + return subprocess.Popen(cmd, **options) + + +def _subprocess_env(): + """ + Define the environment variables to be readable in a child process. + """ + from PyInstaller.config import CONF + python_path = CONF["pathex"] + if "PYTHONPATH" in os.environ: + python_path = python_path + [os.environ["PYTHONPATH"]] + env = os.environ.copy() + env["PYTHONPATH"] = os.pathsep.join(python_path) + return env + + +class SubprocessDiedError(RuntimeError): + pass + + +class Python: + """ + Start and connect to a separate Python subprocess. + + This is the lowest level of public API provided by this module. The advantage of using this class directly is + that it allows multiple functions to be evaluated in a single subprocess, making it faster than multiple calls to + :func:`call`. + + The ``strict_mode`` argument controls behavior when the child process fails to shut down; if strict mode is enabled, + an error is raised, otherwise only warning is logged. If the value of ``strict_mode`` is ``None``, the value of + ``PyInstaller.compat.strict_collect_mode`` is used (which in turn is controlled by the + ``PYINSTALLER_STRICT_COLLECT_MODE`` environment variable. + + Examples: + To call some predefined functions ``x = foo()``, ``y = bar("numpy")`` and ``z = bazz(some_flag=True)`` all using + the same isolated subprocess use:: + + with isolated.Python() as child: + x = child.call(foo) + y = child.call(bar, "numpy") + z = child.call(bazz, some_flag=True) + + """ + def __init__(self, strict_mode=None): + self._child = None + + # Re-use the compat.strict_collect_mode and its PYINSTALLER_STRICT_COLLECT_MODE environment variable for + # default strict-mode setting. + self._strict_mode = strict_mode if strict_mode is not None else compat.strict_collect_mode + + # Check if we are already running in PyInstaller's isolated subprocess, to prevent further nesting. + self._already_isolated = getattr(sys, '_pyi_isolated_subprocess', False) + + def __enter__(self): + # No-op if already running in an isolated subprocess. + if self._already_isolated: + return self + + # We need two pipes. One for the child to send data to the parent. The (write) end-point passed to the + # child needs to be marked as inheritable. + read_from_child, write_to_parent = create_pipe(False, True) + # And one for the parent to send data to the child. The (read) end-point passed to the child needs to be + # marked as inheritable. + read_from_parent, write_to_child = create_pipe(True, False) + + # Spawn a Python subprocess sending it the two file descriptors it needs to talk back to this parent process. + self._child = child(read_from_parent, write_to_parent) + + # Close the end-points that were inherited by the child. + close_pipe_endpoint(read_from_parent) + close_pipe_endpoint(write_to_parent) + del read_from_parent + del write_to_parent + + # Open file handles to talk to the child. This should fully transfer ownership of the underlying file + # descriptor to the opened handle; so when we close the latter, the former should be closed as well. + if os.name == 'nt': + # On Windows, we must first open file descriptor on top of the handle using _open_osfhandle (which + # python wraps in msvcrt.open_osfhandle). According to MSDN, this transfers the ownership of the + # underlying file handle to the file descriptors; i.e., they are both closed when the file descriptor + # is closed). + self._write_handle = os.fdopen(msvcrt.open_osfhandle(write_to_child, 0), "wb") + self._read_handle = os.fdopen(msvcrt.open_osfhandle(read_from_child, 0), "rb") + else: + self._write_handle = os.fdopen(write_to_child, "wb") + self._read_handle = os.fdopen(read_from_child, "rb") + + self._send(sys.path) + + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # No-op if already running in an isolated subprocess. + if self._already_isolated: + return + + if exc_type and issubclass(exc_type, SubprocessDiedError): + self._write_handle.close() + self._read_handle.close() + del self._read_handle, self._write_handle + self._child = None + return + # Send the signal (a blank line) to the child to tell it that it's time to stop. + self._write_handle.write(b"\n") + self._write_handle.flush() + + # Wait for the child process to exit. The timeout is necessary for corner cases when the sub-process fails to + # exit (such as due to dangling non-daemon threads; see #7290). At this point, the subprocess already did all + # its work, so it should be safe to terminate. And as we expect it to shut down quickly (or not at all), the + # timeout is relatively short. + # + # In strict build mode, we raise an error when the subprocess fails to exit on its own, but do so only after + # we attempt to kill the subprocess, to avoid leaving zombie processes. + shutdown_error = False + + try: + self._child.wait(timeout=5) + except subprocess.TimeoutExpired: + logger.warning("Timed out while waiting for the child process to exit!") + shutdown_error = True + self._child.kill() + try: + self._child.wait(timeout=15) + except subprocess.TimeoutExpired: + logger.warning("Timed out while waiting for the child process to be killed!") + # Give up and fall through + + # Close the handles. This should also close the underlying file descriptors. + self._write_handle.close() + self._read_handle.close() + del self._read_handle, self._write_handle + + self._child = None + + # Raise an error in strict mode, after all clean-up has been performed. + if shutdown_error and self._strict_mode: + raise RuntimeError("Timed out while waiting for the child process to exit!") + + def call(self, function, *args, **kwargs): + """ + Call a function in the child Python. Retrieve its return value. Usage of this method is identical to that + of the :func:`call` function. + """ + # If already running in an isolated subprocess, directly execute the function. + if self._already_isolated: + return function(*args, **kwargs) + + if self._child is None: + raise RuntimeError("An isolated.Python object must be used in a 'with' clause.") + + self._send(function.__code__, function.__defaults__, function.__kwdefaults__, args, kwargs) + + # Read a single line of output back from the child. This contains if the function worked and either its return + # value or a traceback. This will block indefinitely until it receives a '\n' byte. + try: + ok, output = loads(b64decode(self._read_handle.readline())) + except (EOFError, BrokenPipeError): + # Subprocess appears to have died in an unhandleable way (e.g. SIGSEV). Raise an error. + raise SubprocessDiedError( + f"Child process died calling {function.__name__}() with args={args} and " + f"kwargs={kwargs}. Its exit code was {self._child.wait()}." + ) from None + + # If all went well, then ``output`` is the return value. + if ok: + return output + + # Otherwise an error happened and ``output`` is a string-ified stacktrace. Raise an error appending the + # stacktrace. Having the output in this order gives a nice fluent transition from parent to child in the stack + # trace. + raise RuntimeError(f"Child process call to {function.__name__}() failed with:\n" + output) + + def _send(self, *objects): + for object in objects: + self._write_handle.write(b64encode(dumps(object))) + self._write_handle.write(b"\n") + # Flushing is very important. Without it, the data is not sent but forever sits in a buffer so that the child is + # forever waiting for its data and the parent in turn is forever waiting for the child's response. + self._write_handle.flush() + + +def call(function, *args, **kwargs): + r""" + Call a function with arguments in a separate child Python. Retrieve its return value. + + Args: + function: + The function to send and invoke. + *args: + **kwargs: + Positional and keyword arguments to send to the function. These must be simple builtin types - not custom + classes. + Returns: + The return value of the function. Again, these must be basic types serialisable by :func:`marshal.dumps`. + Raises: + RuntimeError: + Any exception which happens inside an isolated process is caught and reraised in the parent process. + + To use, define a function which returns the information you're looking for. Any imports it requires must happen in + the body of the function. For example, to safely check the output of ``matplotlib.get_data_path()`` use:: + + # Define a function to be ran in isolation. + def get_matplotlib_data_path(): + import matplotlib + return matplotlib.get_data_path() + + # Call it with isolated.call(). + get_matplotlib_data_path = isolated.call(matplotlib_data_path) + + For single use functions taking no arguments like the above you can abuse the decorator syntax slightly to define + and execute a function in one go. :: + + >>> @isolated.call + ... def matplotlib_data_dir(): + ... import matplotlib + ... return matplotlib.get_data_path() + >>> matplotlib_data_dir + '/home/brenainn/.pyenv/versions/3.9.6/lib/python3.9/site-packages/matplotlib/mpl-data' + + Functions may take positional and keyword arguments and return most generic Python data types. :: + + >>> def echo_parameters(*args, **kwargs): + ... return args, kwargs + >>> isolated.call(echo_parameters, 1, 2, 3) + (1, 2, 3), {} + >>> isolated.call(echo_parameters, foo=["bar"]) + (), {'foo': ['bar']} + + Notes: + To make a function behave differently if it's isolated, check for the ``__isolated__`` global. :: + + if globals().get("__isolated__", False): + # We're inside a child process. + ... + else: + # This is the master process. + ... + + """ + with Python() as isolated: + return isolated.call(function, *args, **kwargs) + + +def decorate(function): + """ + Decorate a function so that it is always called in an isolated subprocess. + + Examples: + + To use, write a function then prepend ``@isolated.decorate``. :: + + @isolated.decorate + def add_1(x): + '''Add 1 to ``x``, displaying the current process ID.''' + import os + print(f"Process {os.getpid()}: Adding 1 to {x}.") + return x + 1 + + The resultant ``add_1()`` function can now be called as you would a + normal function and it'll automatically use a subprocess. + + >>> add_1(4) + Process 4920: Adding 1 to 4. + 5 + >>> add_1(13.2) + Process 4928: Adding 1 to 13.2. + 14.2 + + """ + @functools.wraps(function) + def wrapped(*args, **kwargs): + return call(function, *args, **kwargs) + + return wrapped diff --git a/venv/Lib/site-packages/PyInstaller/lib/README.rst b/venv/Lib/site-packages/PyInstaller/lib/README.rst new file mode 100644 index 0000000..a09f6d5 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/lib/README.rst @@ -0,0 +1,49 @@ +Custom modifications of 3rd party libraries +=========================================== + +NOTE: PyInstaller does not extend PYTHONPATH (sys.path) with this directory +that contains bundled 3rd party libraries. + +Some users complained that PyInstaller failed because their apps were using +too old versions of some libraries that PyInstaller uses too and that's why +extending sys.path was dropped. + +All libraries are tweaked to be importable as:: + + from PyInstaller.lib.LIB_NAME import xyz + +In libraries replace imports like:: + + from altgraph import y + from modulegraph import z + +with relative prefix:: + + from ..altgraph import y + from ..modulegraph import z + + +altgraph +---------- + +- add fixed version string to ./altgraph/__init__.py:: + + # For PyInstaller/lib/ define the version here, since there is no + # package-resource. + __version__ = '0.13' + + +modulegraph +----------- + +https://bitbucket.org/ronaldoussoren/modulegraph/downloads + +- TODO Use official modulegraph version when following issue is resolved and pull request merged + https://bitbucket.org/ronaldoussoren/modulegraph/issues/28/__main__-module-being-analyzed-for-wheel + +- add fixed version string to ./modulegraph/__init__.py:: + + # For PyInstaller/lib/ define the version here, since there is no + # package-resource. + __version__ = '0.13' + diff --git a/venv/Lib/site-packages/PyInstaller/lib/__init__.py b/venv/Lib/site-packages/PyInstaller/lib/__init__.py new file mode 100644 index 0000000..792d600 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/lib/__init__.py @@ -0,0 +1 @@ +# diff --git a/venv/Lib/site-packages/PyInstaller/lib/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/lib/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76b78fbc79028c3a2fabda516688584f23775eb9 GIT binary patch literal 186 zcmZ3^%ge<81gF(}(wTttV-N=h7@>^MY(U0zh7^Wi22Do4l?+87m7hV9zkJ=TV)7Dm zV@irjD^v3d3w3i+Q 1: + print("path:", file=sys.stderr) + for item in path: + print(" ", repr(item), file=sys.stderr) + + # Create the module finder and turn its crank + mf = ModuleGraph(path, excludes=excludes, debug=debuglevel) + for arg in scripts: + if domods: + if arg[-2:] == '.*': + mf.import_hook(arg[:-2], None, ["*"]) + else: + mf.import_hook(arg) + else: + mf.add_script(arg) + return mf + + +def output_graph(output_format, mf): + if output_format == 'dot': + mf.graphreport() + elif output_format == 'html': + mf.create_xref() + else: + mf.report() + + +def main(): + opts = parse_arguments() + mf = create_graph( + opts.scripts, opts.domods, opts.debug, + opts.excludes, opts.addpath) + output_graph(opts.output, mf) + + +if __name__ == '__main__': # pragma: no cover + try: + main() + except KeyboardInterrupt: + print("\n[interrupt]") diff --git a/venv/Lib/site-packages/PyInstaller/lib/modulegraph/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/lib/modulegraph/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bdcee39e5106936a60bd68cb89f94a50583b77f8 GIT binary patch literal 217 zcmZ3^%ge<81gF(}(nW#vV-N=h7@>^MASKfoQW&BbQW%37G?}Vc4D<}m{WKYGamUA( zr4|)u=I6!7uVnZP((o(N-6|$8F*l~9sI)RQudq-zCp9%WL$@S9KPRRvHLonjCo?Ig zII|>Gw;(Y&J25@AI3}RdGq1QLF()UrNIxetNk2C~r8Flsy(qCDLq9$~GcU6wK3=b& l@)w5X&4QLa{eZ_o0;sY}yBjXJ|kp^xMEMfr)0RV`OJWBuo literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/lib/modulegraph/__pycache__/__main__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/lib/modulegraph/__pycache__/__main__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53db78298d84361177b9528118d4314fd4f925a8 GIT binary patch literal 4347 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 Z9n`%U{C+{NHV;oftV?Mhy$k|<{{V+LgTMd) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/lib/modulegraph/__pycache__/modulegraph.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/lib/modulegraph/__pycache__/modulegraph.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca73aee6dd968c52ed19a30735bd88b30b33f91c GIT binary patch literal 116271 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�k=pI6Vs!vNTEv=%Z0jCT`uf$S`?v$zjAhx9? z#0R(BYITF7m6I%Og-){74YO7Ck*m-Op0JkGlv)w?G&f0IOkETkdeY@bMD~U4X~i+J zJwzP;8d-$p_API47sqx&x-lImsf*#NChdM|A~O0OZ^xdFmeB{YZaQ zT4?=|}g;#7?6B7xuL9-~a#s literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/lib/modulegraph/__pycache__/util.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/lib/modulegraph/__pycache__/util.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd0adf3f83223071576288852d8b52ce7d8042a2 GIT binary patch literal 1216 zcmZuw%}X0W6o0evBOh8nP(0YffY2J$D2N_P2nrGVA)(*2F=95mW8Apz#+`{YHi8E! zJ$Ud?u$NwKi--14@X$k{7gKVO1)JmBMAF`OV@-(P9x-}0cRi1<9!tO zfXEDF6T}6d+?ig2UDWr^)^XUys6CuDngU&U>3a%0%Bu!~I%=3qKT=?kzkM_JvW%CbDGu-9=UTKm5$KK1;HH3RBaK1bvBeSZEcD6 zr!{+CuG8T`noigjOH+e;sfscc)2XoOvg#~(keH=Yd!dHTi&t?29SjSTJB7UPOk8+? zB%Vv{!sf#$&f^gjwRV+Yu4A2)NbamwIxI;)_|#e=wH9o3dJjNxTc(~po=U{0;`5Ua zrxRh~HraVgU1nj$RU#uUF}Q3Mr6*6OZ>7+X!lD(KwX!l~GNvsK3EMVPtIS$W%@~;! zH?X{URa;WCjHm7wWw}(-WX`Z@WQLb*y`_mrGwmn*EIyp-DX6PXPR)E3@#h#c3lMxOB9mUc{`Jn&VGDAcwI}Jmdpv@ zflfzVG@`=aps2yFwnKZ0Ao6#kmEPgcp>l7u(i_Efxox(BfE%vhAHi!Icjc)1p_^8^ z!c|Zj$35}de-!H6ioNYGhx#g^zABKw_)*Wmhuh_zu}aU_LCY2Vr`lK#cjS*1_BkyQ zZJQJl_eb#dy^EaqqqY9UoNhG9U!Kc1SM?D>4k5VVjYGJ$;f-ojJ3(as3oqkegsDV2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/lib/modulegraph/find_modules.py b/venv/Lib/site-packages/PyInstaller/lib/modulegraph/find_modules.py new file mode 100644 index 0000000..b383b28 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/lib/modulegraph/find_modules.py @@ -0,0 +1,61 @@ +""" +modulegraph.find_modules - High-level module dependency finding interface +========================================================================= + +History +........ + +Originally (loosely) based on code in py2exe's build_exe.py by Thomas Heller. +""" +import os +import pkgutil + +from .modulegraph import Alias + +def get_implies(): + def _xml_etree_modules(): + import xml.etree + return [ + f"xml.etree.{module_name}" + for _, module_name, is_package in pkgutil.iter_modules(xml.etree.__path__) + if not is_package + ] + + result = { + # imports done from C code in built-in and/or extension modules + # (untrackable by modulegraph). + "_curses": ["curses"], + "posix": ["resource"], + "gc": ["time"], + "time": ["_strptime"], + "datetime": ["time"], + "parser": ["copyreg"], + "codecs": ["encodings"], + "_sre": ["copy", "re"], + "zipimport": ["zlib"], + + # _frozen_importlib is part of the interpreter itself + "_frozen_importlib": None, + + # os.path is an alias for a platform specific module, + # ensure that the graph shows this. + "os.path": Alias(os.path.__name__), + + # Python >= 3.2: + "_datetime": ["time", "_strptime"], + "_json": ["json.decoder"], + "_pickle": ["codecs", "copyreg", "_compat_pickle"], + "_posixsubprocess": ["gc"], + "_ssl": ["socket"], + + # Python >= 3.3: + "_elementtree": ["pyexpat"] + _xml_etree_modules(), + + # This is not C extension, but it uses __import__ + "anydbm": ["dbhash", "gdbm", "dbm", "dumbdbm", "whichdb"], + + # Known package aliases + "wxPython.wx": Alias('wx'), + } + + return result diff --git a/venv/Lib/site-packages/PyInstaller/lib/modulegraph/modulegraph.py b/venv/Lib/site-packages/PyInstaller/lib/modulegraph/modulegraph.py new file mode 100644 index 0000000..f5ee148 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/lib/modulegraph/modulegraph.py @@ -0,0 +1,3061 @@ +""" +Find modules used by a script, using bytecode analysis. + +Based on the stdlib modulefinder by Thomas Heller and Just van Rossum, +but uses a graph data structure and 2.3 features + +XXX: Verify all calls to _import_hook (and variants) to ensure that +imports are done in the right way. +""" +#FIXME: To decrease the likelihood of ModuleGraph exceeding the recursion limit +#and hence unpredictably raising fatal exceptions, increase the recursion +#limit at PyInstaller startup (i.e., in the +#PyInstaller.building.build_main.build() function). For details, see: +# https://github.com/pyinstaller/pyinstaller/issues/1919#issuecomment-216016176 + +import ast +import os +import pkgutil +import sys +import re +from collections import deque, namedtuple, defaultdict +import urllib.request +import warnings +import importlib.util +import importlib.machinery + +# The logic in PyInstaller.compat ensures that these are available and +# of correct version. +if sys.version_info >= (3, 10): + import importlib.metadata as importlib_metadata +else: + import importlib_metadata + +from altgraph.ObjectGraph import ObjectGraph +from altgraph import GraphError + +from . import util + + +class BUILTIN_MODULE: + def is_package(fqname): + return False + + +class NAMESPACE_PACKAGE: + def __init__(self, namespace_dirs): + self.namespace_dirs = namespace_dirs + + def is_package(self, fqname): + return True + + +#FIXME: Leverage this rather than magic numbers below. +ABSOLUTE_OR_RELATIVE_IMPORT_LEVEL = -1 +""" +Constant instructing the builtin `__import__()` function to attempt both +absolute and relative imports. +""" + + +#FIXME: Leverage this rather than magic numbers below. +ABSOLUTE_IMPORT_LEVEL = 0 +""" +Constant instructing the builtin `__import__()` function to attempt only +absolute imports. +""" + + +#FIXME: Leverage this rather than magic numbers below. +DEFAULT_IMPORT_LEVEL = ABSOLUTE_IMPORT_LEVEL +""" +Constant instructing the builtin `__import__()` function to attempt the default +import style specific to the active Python interpreter. + +Specifically, under: + +* Python 2, this defaults to attempting both absolute and relative imports. +* Python 3, this defaults to attempting only absolute imports. +""" + + +class InvalidRelativeImportError (ImportError): + pass + + +def _path_from_importerror(exc, default): + # This is a hack, but sadly enough the necessary information + # isn't available otherwise. + m = re.match(r'^No module named (\S+)$', str(exc)) + if m is not None: + return m.group(1) + + return default + + +#FIXME: What is this? Do we actually need this? This appears to provide +#significantly more fine-grained metadata than PyInstaller will ever require. +#It consumes a great deal of space (slots or no slots), since we store an +#instance of this class for each edge of the graph. +class DependencyInfo (namedtuple("DependencyInfo", + ["conditional", "function", "tryexcept", "fromlist"])): + __slots__ = () + + def _merged(self, other): + if (not self.conditional and not self.function and not self.tryexcept) \ + or (not other.conditional and not other.function and not other.tryexcept): + return DependencyInfo( + conditional=False, + function=False, + tryexcept=False, + fromlist=self.fromlist and other.fromlist) + + else: + return DependencyInfo( + conditional=self.conditional or other.conditional, + function=self.function or other.function, + tryexcept=self.tryexcept or other.tryexcept, + fromlist=self.fromlist and other.fromlist) + + +#FIXME: Shift the following Node class hierarchy into a new +#"PyInstaller.lib.modulegraph.node" module. This module is much too long. +#FIXME: Refactor "_deferred_imports" from a tuple into a proper lightweight +#class leveraging "__slots__". If not for backward compatibility, we'd just +#leverage a named tuple -- but this should do just as well. +#FIXME: Move the "packagepath" attribute into the "Package" class. Only +#packages define the "__path__" special attribute. The codebase currently +#erroneously tests whether "module.packagepath is not None" to determine +#whether a node is a package or not. However, "isinstance(module, Package)" is +#a significantly more reliable test. Refactor the former into the latter. +class Node: + """ + Abstract base class (ABC) of all objects added to a `ModuleGraph`. + + Attributes + ---------- + code : codeobject + Code object of the pure-Python module corresponding to this graph node + if any _or_ `None` otherwise. + graphident : str + Synonym of `identifier` required by the `ObjectGraph` superclass of the + `ModuleGraph` class. For readability, the `identifier` attribute should + typically be used instead. + filename : str + Absolute path of this graph node's corresponding module, package, or C + extension if any _or_ `None` otherwise. + identifier : str + Fully-qualified name of this graph node's corresponding module, + package, or C extension. + packagepath : str + List of the absolute paths of all directories comprising this graph + node's corresponding package. If this is a: + * Non-namespace package, this list contains exactly one path. + * Namespace package, this list contains one or more paths. + _deferred_imports : list + List of all target modules imported by the source module corresponding + to this graph node whole importations have been deferred for subsequent + processing in between calls to the `_ModuleGraph._scan_code()` and + `_ModuleGraph._process_imports()` methods for this source module _or_ + `None` otherwise. Each element of this list is a 3-tuple + `(have_star, _safe_import_hook_args, _safe_import_hook_kwargs)` + collecting the importation of a target module from this source module + for subsequent processing, where: + * `have_star` is a boolean `True` only if this is a `from`-style star + import (e.g., resembling `from {target_module_name} import *`). + * `_safe_import_hook_args` is a (typically non-empty) sequence of all + positional arguments to be passed to the `_safe_import_hook()` method + to add this importation to the graph. + * `_safe_import_hook_kwargs` is a (typically empty) dictionary of all + keyword arguments to be passed to the `_safe_import_hook()` method + to add this importation to the graph. + Unlike functional languages, Python imposes a maximum depth on the + interpreter stack (and hence recursion). On breaching this depth, + Python raises a fatal `RuntimeError` exception. Since `ModuleGraph` + parses imports recursively rather than iteratively, this depth _was_ + commonly breached before the introduction of this list. Python + environments installing a large number of modules (e.g., Anaconda) were + particularly susceptible. Why? Because `ModuleGraph` concurrently + descended through both the abstract syntax trees (ASTs) of all source + modules being parsed _and_ the graph of all target modules imported by + these source modules being built. The stack thus consisted of + alternating layers of AST and graph traversal. To unwind such + alternation and effectively halve the stack depth, `ModuleGraph` now + descends through the abstract syntax tree (AST) of each source module + being parsed and adds all importations originating within this module + to this list _before_ descending into the graph of these importations. + See pyinstaller/pyinstaller/#1289 for further details. + _global_attr_names : set + Set of the unqualified names of all global attributes (e.g., classes, + variables) defined in the pure-Python module corresponding to this + graph node if any _or_ the empty set otherwise. This includes the names + of all attributes imported via `from`-style star imports from other + existing modules (e.g., `from {target_module_name} import *`). This + set is principally used to differentiate the non-ignorable importation + of non-existent submodules in a package from the ignorable importation + of existing global attributes defined in that package's pure-Python + `__init__` submodule in `from`-style imports (e.g., `bar` in + `from foo import bar`, which may be either a submodule or attribute of + `foo`), as such imports ambiguously allow both. This set is _not_ used + to differentiate submodules from attributes in `import`-style imports + (e.g., `bar` in `import foo.bar`, which _must_ be a submodule of + `foo`), as such imports unambiguously allow only submodules. + _starimported_ignored_module_names : set + Set of the fully-qualified names of all existing unparsable modules + that the existing parsable module corresponding to this graph node + attempted to perform one or more "star imports" from. If this module + either does _not_ exist or does but is unparsable, this is the empty + set. Equivalently, this set contains each fully-qualified name + `{trg_module_name}` for which: + * This module contains an import statement of the form + `from {trg_module_name} import *`. + * The module whose name is `{trg_module_name}` exists but is _not_ + parsable by `ModuleGraph` (e.g., due to _not_ being pure-Python). + **This set is currently defined but otherwise ignored.** + _submodule_basename_to_node : dict + Dictionary mapping from the unqualified name of each submodule + contained by the parent module corresponding to this graph node to that + submodule's graph node. If this dictionary is non-empty, this parent + module is typically but _not_ always a package (e.g., the non-package + `os` module containing the `os.path` submodule). + """ + + __slots__ = [ + 'code', + 'filename', + 'graphident', + 'identifier', + 'packagepath', + '_deferred_imports', + '_global_attr_names', + '_starimported_ignored_module_names', + '_submodule_basename_to_node', + ] + + def __init__(self, identifier): + """ + Initialize this graph node. + + Parameters + ---------- + identifier : str + Fully-qualified name of this graph node's corresponding module, + package, or C extension. + """ + + self.code = None + self.filename = None + self.graphident = identifier + self.identifier = identifier + self.packagepath = None + self._deferred_imports = None + self._global_attr_names = set() + self._starimported_ignored_module_names = set() + self._submodule_basename_to_node = dict() + + + def is_global_attr(self, attr_name): + """ + `True` only if the pure-Python module corresponding to this graph node + defines a global attribute (e.g., class, variable) with the passed + name. + + If this module is actually a package, this method instead returns + `True` only if this package's pure-Python `__init__` submodule defines + such a global attribute. In this case, note that this package may still + contain an importable submodule of the same name. Callers should + attempt to import this attribute as a submodule of this package + _before_ assuming this attribute to be an ignorable global. See + "Examples" below for further details. + + Parameters + ---------- + attr_name : str + Unqualified name of the attribute to be tested. + + Returns + ---------- + bool + `True` only if this module defines this global attribute. + + Examples + ---------- + Consider a hypothetical module `foo` containing submodules `bar` and + `__init__` where the latter assigns `bar` to be a global variable + (possibly star-exported via the special `__all__` global variable): + + >>> # In "foo.__init__": + >>> bar = 3.1415 + + Python 2 and 3 both permissively permit this. This method returns + `True` in this case (i.e., when called on the `foo` package's graph + node, passed the attribute name `bar`) despite the importability of the + `foo.bar` submodule. + """ + + return attr_name in self._global_attr_names + + + def is_submodule(self, submodule_basename): + """ + `True` only if the parent module corresponding to this graph node + contains the submodule with the passed name. + + If `True`, this parent module is typically but _not_ always a package + (e.g., the non-package `os` module containing the `os.path` submodule). + + Parameters + ---------- + submodule_basename : str + Unqualified name of the submodule to be tested. + + Returns + ---------- + bool + `True` only if this parent module contains this submodule. + """ + + return submodule_basename in self._submodule_basename_to_node + + + def add_global_attr(self, attr_name): + """ + Record the global attribute (e.g., class, variable) with the passed + name to be defined by the pure-Python module corresponding to this + graph node. + + If this module is actually a package, this method instead records this + attribute to be defined by this package's pure-Python `__init__` + submodule. + + Parameters + ---------- + attr_name : str + Unqualified name of the attribute to be added. + """ + + self._global_attr_names.add(attr_name) + + + def add_global_attrs_from_module(self, target_module): + """ + Record all global attributes (e.g., classes, variables) defined by the + target module corresponding to the passed graph node to also be defined + by the source module corresponding to this graph node. + + If the source module is actually a package, this method instead records + these attributes to be defined by this package's pure-Python `__init__` + submodule. + + Parameters + ---------- + target_module : Node + Graph node of the target module to import attributes from. + """ + + self._global_attr_names.update(target_module._global_attr_names) + + + def add_submodule(self, submodule_basename, submodule_node): + """ + Add the submodule with the passed name and previously imported graph + node to the parent module corresponding to this graph node. + + This parent module is typically but _not_ always a package (e.g., the + non-package `os` module containing the `os.path` submodule). + + Parameters + ---------- + submodule_basename : str + Unqualified name of the submodule to add to this parent module. + submodule_node : Node + Graph node of this submodule. + """ + + self._submodule_basename_to_node[submodule_basename] = submodule_node + + + def get_submodule(self, submodule_basename): + """ + Graph node of the submodule with the passed name in the parent module + corresponding to this graph node. + + If this parent module does _not_ contain this submodule, an exception + is raised. Else, this parent module is typically but _not_ always a + package (e.g., the non-package `os` module containing the `os.path` + submodule). + + Parameters + ---------- + module_basename : str + Unqualified name of the submodule to retrieve. + + Returns + ---------- + Node + Graph node of this submodule. + """ + + return self._submodule_basename_to_node[submodule_basename] + + + def get_submodule_or_none(self, submodule_basename): + """ + Graph node of the submodule with the passed unqualified name in the + parent module corresponding to this graph node if this module contains + this submodule _or_ `None`. + + This parent module is typically but _not_ always a package (e.g., the + non-package `os` module containing the `os.path` submodule). + + Parameters + ---------- + submodule_basename : str + Unqualified name of the submodule to retrieve. + + Returns + ---------- + Node + Graph node of this submodule if this parent module contains this + submodule _or_ `None`. + """ + + return self._submodule_basename_to_node.get(submodule_basename) + + + def remove_global_attr_if_found(self, attr_name): + """ + Record the global attribute (e.g., class, variable) with the passed + name if previously recorded as defined by the pure-Python module + corresponding to this graph node to be subsequently undefined by the + same module. + + If this module is actually a package, this method instead records this + attribute to be undefined by this package's pure-Python `__init__` + submodule. + + This method is intended to be called on globals previously defined by + this module that are subsequently undefined via the `del` built-in by + this module, thus "forgetting" or "undoing" these globals. + + For safety, there exists no corresponding `remove_global_attr()` + method. While defining this method is trivial, doing so would invite + `KeyError` exceptions on scanning valid Python that lexically deletes a + global in a scope under this module's top level (e.g., in a function) + _before_ defining this global at this top level. Since `ModuleGraph` + cannot and should not (re)implement a full-blown Python interpreter, + ignoring out-of-order deletions is the only sane policy. + + Parameters + ---------- + attr_name : str + Unqualified name of the attribute to be removed. + """ + + if self.is_global_attr(attr_name): + self._global_attr_names.remove(attr_name) + + def __eq__(self, other): + try: + otherIdent = getattr(other, 'graphident') + except AttributeError: + return False + + return self.graphident == otherIdent + + def __ne__(self, other): + try: + otherIdent = getattr(other, 'graphident') + except AttributeError: + return True + + return self.graphident != otherIdent + + def __lt__(self, other): + try: + otherIdent = getattr(other, 'graphident') + except AttributeError: + return NotImplemented + + return self.graphident < otherIdent + + def __le__(self, other): + try: + otherIdent = getattr(other, 'graphident') + except AttributeError: + return NotImplemented + + return self.graphident <= otherIdent + + def __gt__(self, other): + try: + otherIdent = getattr(other, 'graphident') + except AttributeError: + return NotImplemented + + return self.graphident > otherIdent + + def __ge__(self, other): + try: + otherIdent = getattr(other, 'graphident') + except AttributeError: + return NotImplemented + + return self.graphident >= otherIdent + + def __hash__(self): + return hash(self.graphident) + + def infoTuple(self): + return (self.identifier,) + + def __repr__(self): + return '%s%r' % (type(self).__name__, self.infoTuple()) + + +class Alias(str): + """ + Placeholder aliasing an existing source module to a non-existent target + module (i.e., the desired alias). + + For obscure reasons, this class subclasses `str`. Each instance of this + class is the fully-qualified name of the existing source module being + aliased. Unlike the related `AliasNode` class, instances of this class are + _not_ actual nodes and hence _not_ added to the graph; they only facilitate + communication between the `ModuleGraph.alias_module()` and + `ModuleGraph.find_node()` methods. + """ + + +class AliasNode(Node): + """ + Graph node representing the aliasing of an existing source module under a + non-existent target module name (i.e., the desired alias). + """ + + def __init__(self, name, node=None): + """ + Initialize this alias. + + Parameters + ---------- + name : str + Fully-qualified name of the non-existent target module to be + created (as an alias of the existing source module). + node : Node + Graph node of the existing source module being aliased. Optional; + if not provided here, the attributes from referred node should + be copied later using `copyAttributesFromReferredNode` method. + """ + super(AliasNode, self).__init__(name) + + # Copy attributes from referred node, if provided + self.copyAttributesFromReferredNode(node) + + def copyAttributesFromReferredNode(self, node): + """ + Copy a subset of attributes from referred node (source module) into this target alias. + """ + # FIXME: Why only some? Why not *EVERYTHING* except "graphident", which + # must remain equal to "name" for lookup purposes? This is, after all, + # an alias. The idea is for the two nodes to effectively be the same. + for attr_name in ( + 'identifier', 'packagepath', + '_global_attr_names', '_starimported_ignored_module_names', + '_submodule_basename_to_node'): + if hasattr(node, attr_name): + setattr(self, attr_name, getattr(node, attr_name)) + + def infoTuple(self): + return (self.graphident, self.identifier) + + +class BadModule(Node): + pass + + +class ExcludedModule(BadModule): + pass + + +class MissingModule(BadModule): + pass + + +class InvalidRelativeImport (BadModule): + def __init__(self, relative_path, from_name): + identifier = relative_path + if relative_path.endswith('.'): + identifier += from_name + else: + identifier += '.' + from_name + super(InvalidRelativeImport, self).__init__(identifier) + self.relative_path = relative_path + self.from_name = from_name + + def infoTuple(self): + return (self.relative_path, self.from_name) + + +class Script(Node): + def __init__(self, filename): + super(Script, self).__init__(filename) + self.filename = filename + + def infoTuple(self): + return (self.filename,) + + +class BaseModule(Node): + def __init__(self, name, filename=None, path=None): + super(BaseModule, self).__init__(name) + self.filename = filename + self.packagepath = path + + def infoTuple(self): + return tuple(filter(None, (self.identifier, self.filename, self.packagepath))) + + +class BuiltinModule(BaseModule): + pass + + +class SourceModule(BaseModule): + pass + + +class InvalidSourceModule(SourceModule): + pass + + +class CompiledModule(BaseModule): + pass + + +class InvalidCompiledModule(BaseModule): + pass + + +class Extension(BaseModule): + pass + + +class Package(BaseModule): + """ + Graph node representing a non-namespace package. + """ + pass + + +class ExtensionPackage(Extension, Package): + """ + Graph node representing a package where the __init__ module is an extension + module. + """ + pass + + +class NamespacePackage(Package): + """ + Graph node representing a namespace package. + """ + pass + + +class RuntimeModule(BaseModule): + """ + Graph node representing a non-package Python module dynamically defined at + runtime. + + Most modules are statically defined on-disk as standard Python files. + Some modules, however, are dynamically defined in-memory at runtime + (e.g., `gi.repository.Gst`, dynamically defined by the statically + defined `gi.repository.__init__` module). + + This node represents such a runtime module. Since this is _not_ a package, + all attempts to import submodules from this module in `from`-style import + statements (e.g., the `queue` submodule in `from six.moves import queue`) + will be silently ignored. + + To ensure that the parent package of this module if any is also imported + and added to the graph, this node is typically added to the graph by + calling the `ModuleGraph.add_module()` method. + """ + pass + + +class RuntimePackage(Package): + """ + Graph node representing a non-namespace Python package dynamically defined + at runtime. + + Most packages are statically defined on-disk as standard subdirectories + containing `__init__.py` files. Some packages, however, are dynamically + defined in-memory at runtime (e.g., `six.moves`, dynamically defined by + the statically defined `six` module). + + This node represents such a runtime package. All attributes imported from + this package in `from`-style import statements that are submodules of this + package (e.g., the `queue` submodule in `from six.moves import queue`) will + be imported rather than ignored. + + To ensure that the parent package of this package if any is also imported + and added to the graph, this node is typically added to the graph by + calling the `ModuleGraph.add_module()` method. + """ + pass + + +#FIXME: Safely removable. We don't actually use this anywhere. After removing +#this class, remove the corresponding entry from "compat". +class FlatPackage(BaseModule): + def __init__(self, *args, **kwds): + warnings.warn( + "This class will be removed in a future version of modulegraph", + DeprecationWarning) + super(FlatPackage, *args, **kwds) + + +#FIXME: Safely removable. We don't actually use this anywhere. After removing +#this class, remove the corresponding entry from "compat". +class ArchiveModule(BaseModule): + def __init__(self, *args, **kwds): + warnings.warn( + "This class will be removed in a future version of modulegraph", + DeprecationWarning) + super(FlatPackage, *args, **kwds) + + +# HTML templates for ModuleGraph generator +header = """\ + + + + + %(TITLE)s + + + +

%(TITLE)s

""" +entry = """ +
+ + %(CONTENT)s +
""" +contpl = """%(NAME)s %(TYPE)s""" +contpl_linked = """\ +%(NAME)s +%(TYPE)s""" +imports = """\ +
+%(HEAD)s: + %(LINKS)s +
+""" +footer = """ + +""" + + +def _ast_names(names): + result = [] + for nm in names: + if isinstance(nm, ast.alias): + result.append(nm.name) + else: + result.append(nm) + + result = [r for r in result if r != '__main__'] + return result + + +def uniq(seq): + """Remove duplicates from a list, preserving order""" + # Taken from https://stackoverflow.com/questions/480214 + seen = set() + seen_add = seen.add + return [x for x in seq if not (x in seen or seen_add(x))] + + +DEFAULT_IMPORT_LEVEL = 0 + + +class _Visitor(ast.NodeVisitor): + def __init__(self, graph, module): + self._graph = graph + self._module = module + self._level = DEFAULT_IMPORT_LEVEL + self._in_if = [False] + self._in_def = [False] + self._in_tryexcept = [False] + + @property + def in_if(self): + return self._in_if[-1] + + @property + def in_def(self): + return self._in_def[-1] + + @property + def in_tryexcept(self): + return self._in_tryexcept[-1] + + + def _collect_import(self, name, fromlist, level): + have_star = False + if fromlist is not None: + fromlist = uniq(fromlist) + if '*' in fromlist: + fromlist.remove('*') + have_star = True + + # Record this import as originating from this module for subsequent + # handling by the _process_imports() method. + self._module._deferred_imports.append( + (have_star, + (name, self._module, fromlist, level), + {'edge_attr': DependencyInfo( + conditional=self.in_if, + tryexcept=self.in_tryexcept, + function=self.in_def, + fromlist=False)})) + + + def visit_Import(self, node): + for nm in _ast_names(node.names): + self._collect_import(nm, None, self._level) + + def visit_ImportFrom(self, node): + level = node.level if node.level != 0 else self._level + self._collect_import(node.module or '', _ast_names(node.names), level) + + def visit_If(self, node): + self._in_if.append(True) + self.generic_visit(node) + self._in_if.pop() + + def visit_FunctionDef(self, node): + self._in_def.append(True) + self.generic_visit(node) + self._in_def.pop() + + visit_AsyncFunctionDef = visit_FunctionDef + + def visit_Try(self, node): + self._in_tryexcept.append(True) + self.generic_visit(node) + self._in_tryexcept.pop() + + def visit_TryExcept(self, node): + self._in_tryexcept.append(True) + self.generic_visit(node) + self._in_tryexcept.pop() + + def visit_Expression(self, node): + # Expression node's cannot contain import statements or + # other nodes that are relevant for us. + pass + + # Expression isn't actually used as such in AST trees, + # therefore define visitors for all kinds of expression nodes. + visit_BoolOp = visit_Expression + visit_BinOp = visit_Expression + visit_UnaryOp = visit_Expression + visit_Lambda = visit_Expression + visit_IfExp = visit_Expression + visit_Dict = visit_Expression + visit_Set = visit_Expression + visit_ListComp = visit_Expression + visit_SetComp = visit_Expression + visit_ListComp = visit_Expression + visit_GeneratorExp = visit_Expression + visit_Compare = visit_Expression + visit_Yield = visit_Expression + visit_YieldFrom = visit_Expression + visit_Await = visit_Expression + visit_Call = visit_Expression + visit_Await = visit_Expression + + +class ModuleGraph(ObjectGraph): + """ + Directed graph whose nodes represent modules and edges represent + dependencies between these modules. + """ + + + def createNode(self, cls, name, *args, **kw): + m = self.find_node(name) + + if m is None: + #assert m is None, m + m = super(ModuleGraph, self).createNode(cls, name, *args, **kw) + + return m + + + def __init__(self, path=None, excludes=(), replace_paths=(), implies=(), graph=None, debug=0): + super(ModuleGraph, self).__init__(graph=graph, debug=debug) + if path is None: + path = sys.path + self.path = path + self.lazynodes = {} + # excludes is stronger than implies + self.lazynodes.update(dict(implies)) + for m in excludes: + self.lazynodes[m] = None + self.replace_paths = replace_paths + + # Maintain own list of package path mappings in the scope of Modulegraph + # object. + self._package_path_map = {} + + # Legacy namespace-package paths. Initialized by scan_legacy_namespace_packages. + self._legacy_ns_packages = {} + + def scan_legacy_namespace_packages(self): + """ + Resolve extra package `__path__` entries for legacy setuptools-based + namespace packages, by reading `namespace_packages.txt` from dist + metadata. + """ + legacy_ns_packages = defaultdict(lambda: set()) + + for dist in importlib_metadata.distributions(): + ns_packages = dist.read_text("namespace_packages.txt") + if ns_packages is None: + continue + ns_packages = ns_packages.splitlines() + # Obtain path to dist metadata directory + dist_path = getattr(dist, '_path') + if dist_path is None: + continue + for package_name in ns_packages: + path = os.path.join( + str(dist_path.parent), # might be zipfile.Path if in zipped .egg + *package_name.split('.'), + ) + legacy_ns_packages[package_name].add(path) + + # Convert into dictionary of lists + self._legacy_ns_packages = { + package_name: list(paths) + for package_name, paths in legacy_ns_packages.items() + } + + def implyNodeReference(self, node, other, edge_data=None): + """ + Create a reference from the passed source node to the passed other node, + implying the former to depend upon the latter. + + While the source node _must_ be an existing graph node, the target node + may be either an existing graph node _or_ a fully-qualified module name. + In the latter case, the module with that name and all parent packages of + that module will be imported _without_ raising exceptions and for each + newly imported module or package: + + * A new graph node will be created for that module or package. + * A reference from the passed source node to that module or package will + be created. + + This method allows dependencies between Python objects _not_ importable + with standard techniques (e.g., module aliases, C extensions). + + Parameters + ---------- + node : str + Graph node for this reference's source module or package. + other : {Node, str} + Either a graph node _or_ fully-qualified name for this reference's + target module or package. + """ + + if isinstance(other, Node): + self._updateReference(node, other, edge_data) + else: + if isinstance(other, tuple): + raise ValueError(other) + others = self._safe_import_hook(other, node, None) + for other in others: + self._updateReference(node, other, edge_data) + + def outgoing(self, fromnode): + """ + Yield all nodes that `fromnode` dependes on (that is, + all modules that `fromnode` imports. + """ + + node = self.find_node(fromnode) + out_edges, _ = self.get_edges(node) + return out_edges + + getReferences = outgoing + + def incoming(self, tonode, collapse_missing_modules=True): + node = self.find_node(tonode) + _, in_edges = self.get_edges(node) + + if collapse_missing_modules: + for n in in_edges: + if isinstance(n, MissingModule): + for n in self.incoming(n, False): + yield n + + else: + yield n + + else: + for n in in_edges: + yield n + + getReferers = incoming + + def hasEdge(self, fromnode, tonode): + """ Return True iff there is an edge from 'fromnode' to 'tonode' """ + fromnode = self.find_node(fromnode) + tonode = self.find_node(tonode) + + return self.graph.edge_by_node(fromnode, tonode) is not None + + def foldReferences(self, packagenode): + """ + Create edges to/from `packagenode` based on the edges to/from all + submodules of that package _and_ then hide the graph nodes + corresponding to those submodules. + """ + + pkg = self.find_node(packagenode) + + for n in self.nodes(): + if not n.identifier.startswith(pkg.identifier + '.'): + continue + + iter_out, iter_inc = self.get_edges(n) + for other in iter_out: + if other.identifier.startswith(pkg.identifier + '.'): + continue + + if not self.hasEdge(pkg, other): + # Ignore circular dependencies + self._updateReference(pkg, other, 'pkg-internal-import') + + for other in iter_inc: + if other.identifier.startswith(pkg.identifier + '.'): + # Ignore circular dependencies + continue + + if not self.hasEdge(other, pkg): + self._updateReference(other, pkg, 'pkg-import') + + self.graph.hide_node(n) + + # TODO: unfoldReferences(pkg) that restore the submodule nodes and + # removes 'pkg-import' and 'pkg-internal-import' edges. Care should + # be taken to ensure that references are correct if multiple packages + # are folded and then one of them in unfolded + + def _updateReference(self, fromnode, tonode, edge_data): + try: + ed = self.edgeData(fromnode, tonode) + except (KeyError, GraphError): # XXX: Why 'GraphError' + return self.add_edge(fromnode, tonode, edge_data) + + if not (isinstance(ed, DependencyInfo) and isinstance(edge_data, DependencyInfo)): + self.updateEdgeData(fromnode, tonode, edge_data) + else: + self.updateEdgeData(fromnode, tonode, ed._merged(edge_data)) + + def add_edge(self, fromnode, tonode, edge_data='direct'): + """ + Create a reference from fromnode to tonode + """ + return super(ModuleGraph, self).createReference(fromnode, tonode, edge_data=edge_data) + + createReference = add_edge + + def find_node(self, name, create_nspkg=True): + """ + Graph node uniquely identified by the passed fully-qualified module + name if this module has been added to the graph _or_ `None` otherwise. + + If (in order): + + . A namespace package with this identifier exists _and_ the passed + `create_nspkg` parameter is `True`, this package will be + instantiated and returned. + . A lazy node with this identifier and: + * No dependencies exists, this node will be instantiated and + returned. + * Dependencies exists, this node and all transitive dependencies of + this node be instantiated and this node returned. + . A non-lazy node with this identifier exists, this node will be + returned as is. + + Parameters + ---------- + name : str + Fully-qualified name of the module whose graph node is to be found. + create_nspkg : bool + Ignored. + + Returns + ---------- + Node + Graph node of this module if added to the graph _or_ `None` + otherwise. + """ + + data = super(ModuleGraph, self).findNode(name) + + if data is not None: + return data + + if name in self.lazynodes: + deps = self.lazynodes.pop(name) + + if deps is None: + # excluded module + m = self.createNode(ExcludedModule, name) + elif isinstance(deps, Alias): + # NOTE: the AliasNode must be created and added to graph + # before trying to create the referred node; that might + # (due to recursive import analysis) lead to another + # attempt to resolve the aliased node (and if there is + # a real node that we are trying to shadow with the alias, + # that will end up added to the graph and prevent the + # alias node from being added). + m = self.createNode(AliasNode, name) + + # Create the referred node. + other = self._safe_import_hook(deps, None, None).pop() + + # Copy attributes; this used to be done by AliasNode + # constructor, back when referred node was created before + # the AliasNode (and could thus be passed to its constructor). + m.copyAttributesFromReferredNode(other) + + self.implyNodeReference(m, other) + else: + m = self._safe_import_hook(name, None, None).pop() + for dep in deps: + self.implyNodeReference(m, dep) + + return m + + return None + + findNode = find_node + iter_graph = ObjectGraph.flatten + + def add_script(self, pathname, caller=None): + """ + Create a node by path (not module name). It is expected to be a Python + source file, and will be scanned for dependencies. + """ + self.msg(2, "run_script", pathname) + + pathname = os.path.realpath(pathname) + m = self.find_node(pathname) + if m is not None: + return m + + with open(pathname, 'rb') as fp: + contents = fp.read() + contents = importlib.util.decode_source(contents) + + co_ast = compile(contents, pathname, 'exec', ast.PyCF_ONLY_AST, True) + co = compile(co_ast, pathname, 'exec', 0, True) + m = self.createNode(Script, pathname) + self._updateReference(caller, m, None) + n = self._scan_code(m, co, co_ast) + self._process_imports(n) + m.code = co + if self.replace_paths: + m.code = self._replace_paths_in_code(m.code) + return m + + + #FIXME: For safety, the "source_module" parameter should default to the + #root node of the current graph if unpassed. This parameter currently + #defaults to None, thus disconnected modules imported in this manner (e.g., + #hidden imports imported by depend.analysis.initialize_modgraph()). + def import_hook( + self, + target_module_partname, + source_module=None, + target_attr_names=None, + level=DEFAULT_IMPORT_LEVEL, + edge_attr=None, + ): + """ + Import the module with the passed name, all parent packages of this + module, _and_ all submodules and attributes in this module with the + passed names from the previously imported caller module signified by + the passed graph node. + + Unlike most import methods (e.g., `_safe_import_hook()`), this method + is designed to be publicly called by both external and internal + callers and hence is public. + + Parameters + ---------- + target_module_partname : str + Partially-qualified name of the target module to be imported. See + `_safe_import_hook()` for further details. + source_module : Node + Graph node for the previously imported **source module** (i.e., + module containing the `import` statement triggering the call to + this method) _or_ `None` if this module is to be imported in a + "disconnected" manner. **Passing `None` is _not_ recommended.** + Doing so produces a disconnected graph in which the graph node + created for the module to be imported will be disconnected and + hence unreachable from all other nodes -- which frequently causes + subtle issues in external callers (namely PyInstaller, which + silently ignores unreachable nodes). + target_attr_names : list + List of the unqualified names of all submodules and attributes to + be imported from the module to be imported if this is a "from"- + style import (e.g., `[encode_base64, encode_noop]` for the import + `from email.encoders import encode_base64, encode_noop`) _or_ + `None` otherwise. + level : int + Whether to perform an absolute or relative import. See + `_safe_import_hook()` for further details. + + Returns + ---------- + list + List of the graph nodes created for all modules explicitly imported + by this call, including the passed module and all submodules listed + in `target_attr_names` _but_ excluding all parent packages + implicitly imported by this call. If `target_attr_names` is `None` + or the empty list, this is guaranteed to be a list of one element: + the graph node created for the passed module. + + Raises + ---------- + ImportError + If the target module to be imported is unimportable. + """ + self.msg(3, "_import_hook", target_module_partname, source_module, source_module, level) + + source_package = self._determine_parent(source_module) + target_package, target_module_partname = self._find_head_package( + source_package, target_module_partname, level) + + self.msgin(4, "load_tail", target_package, target_module_partname) + + submodule = target_package + while target_module_partname: + i = target_module_partname.find('.') + if i < 0: + i = len(target_module_partname) + head, target_module_partname = target_module_partname[ + :i], target_module_partname[i+1:] + mname = "%s.%s" % (submodule.identifier, head) + submodule = self._safe_import_module(head, mname, submodule) + + if submodule is None: + # FIXME: Why do we no longer return a MissingModule instance? + # result = self.createNode(MissingModule, mname) + self.msgout(4, "raise ImportError: No module named", mname) + raise ImportError("No module named " + repr(mname)) + + self.msgout(4, "load_tail ->", submodule) + + target_module = submodule + target_modules = [target_module] + + # If this is a "from"-style import *AND* this target module is + # actually a package, import all submodules of this package specified + # by the "import" half of this import (e.g., the submodules "bar" and + # "car" of the target package "foo" in "from foo import bar, car"). + # + # If this target module is a non-package, it could still contain + # importable submodules (e.g., the non-package `os` module containing + # the `os.path` submodule). In this case, these submodules are already + # imported by this target module's pure-Python code. Since our import + # scanner already detects such imports, these submodules need *NOT* be + # reimported here. + if target_attr_names and isinstance(target_module, + (Package, AliasNode)): + for target_submodule in self._import_importable_package_submodules( + target_module, target_attr_names): + if target_submodule not in target_modules: + target_modules.append(target_submodule) + + # Add an edge from this source module to each target module. + for target_module in target_modules: + self._updateReference( + source_module, target_module, edge_data=edge_attr) + + return target_modules + + + def _determine_parent(self, caller): + """ + Determine the package containing a node. + """ + self.msgin(4, "determine_parent", caller) + + parent = None + if caller: + pname = caller.identifier + + if isinstance(caller, Package): + parent = caller + + elif '.' in pname: + pname = pname[:pname.rfind('.')] + parent = self.find_node(pname) + + elif caller.packagepath: + # XXX: I have no idea why this line + # is necessary. + parent = self.find_node(pname) + + self.msgout(4, "determine_parent ->", parent) + return parent + + + def _find_head_package( + self, + source_package, + target_module_partname, + level=DEFAULT_IMPORT_LEVEL): + """ + Import the target package providing the target module with the passed + name to be subsequently imported from the previously imported source + package corresponding to the passed graph node. + + Parameters + ---------- + source_package : Package + Graph node for the previously imported **source package** (i.e., + package containing the module containing the `import` statement + triggering the call to this method) _or_ `None` if this module is + to be imported in a "disconnected" manner. **Passing `None` is + _not_ recommended.** See the `_import_hook()` method for further + details. + target_module_partname : str + Partially-qualified name of the target module to be imported. See + `_safe_import_hook()` for further details. + level : int + Whether to perform absolute or relative imports. See the + `_safe_import_hook()` method for further details. + + Returns + ---------- + (target_package, target_module_tailname) + 2-tuple describing the imported target package, where: + * `target_package` is the graph node created for this package. + * `target_module_tailname` is the unqualified name of the target + module to be subsequently imported (e.g., `text` when passed a + `target_module_partname` of `email.mime.text`). + + Raises + ---------- + ImportError + If the package to be imported is unimportable. + """ + self.msgin(4, "find_head_package", source_package, target_module_partname, level) + + #FIXME: Rename all local variable names to something sensible. No, + #"p_fqdn" is not a sensible name. + + # If this target module is a submodule... + if '.' in target_module_partname: + target_module_headname, target_module_tailname = ( + target_module_partname.split('.', 1)) + # Else, this target module is a top-level module. + else: + target_module_headname = target_module_partname + target_module_tailname = '' + + # If attempting both absolute and relative imports... + if level == ABSOLUTE_OR_RELATIVE_IMPORT_LEVEL: + if source_package: + target_package_name = source_package.identifier + '.' + target_module_headname + else: + target_package_name = target_module_headname + # Else if attempting only absolute imports... + elif level == ABSOLUTE_IMPORT_LEVEL: + target_package_name = target_module_headname + + # Absolute import, ignore the parent + source_package = None + # Else if attempting only relative imports... + else: + if source_package is None: + self.msg(2, "Relative import outside of package") + raise InvalidRelativeImportError( + "Relative import outside of package (name=%r, parent=%r, level=%r)" % ( + target_module_partname, source_package, level)) + + for i in range(level - 1): + if '.' not in source_package.identifier: + self.msg(2, "Relative import outside of package") + raise InvalidRelativeImportError( + "Relative import outside of package (name=%r, parent=%r, level=%r)" % ( + target_module_partname, source_package, level)) + + p_fqdn = source_package.identifier.rsplit('.', 1)[0] + new_parent = self.find_node(p_fqdn) + if new_parent is None: + #FIXME: Repetition detected. Exterminate. Exterminate. + self.msg(2, "Relative import outside of package") + raise InvalidRelativeImportError( + "Relative import outside of package (name=%r, parent=%r, level=%r)" % ( + target_module_partname, source_package, level)) + + assert new_parent is not source_package, ( + new_parent, source_package) + source_package = new_parent + + if target_module_headname: + target_package_name = ( + source_package.identifier + '.' + target_module_headname) + else: + target_package_name = source_package.identifier + + # Graph node of this target package. + target_package = self._safe_import_module( + target_module_headname, target_package_name, source_package) + + # If this target package is *NOT* importable and a source package was + # passed, attempt to import this target package as an absolute import. + # + # ADDENDUM: but do this only if the passed "level" is either + # ABSOLUTE_IMPORT_LEVEL (0) or ABSOLUTE_OR_RELATIVE_IMPORT_LEVEL (-1). + # Otherwise, an attempt at relative import of a missing sub-module + # (from .module import something) might pull in an unrelated + # but eponymous top-level module, which should not happen. + if target_package is None and source_package is not None and level <= ABSOLUTE_IMPORT_LEVEL: + target_package_name = target_module_headname + source_package = None + + # Graph node for the target package, again. + target_package = self._safe_import_module( + target_module_headname, target_package_name, source_package) + + # If this target package is importable, return this package. + if target_package is not None: + self.msgout(4, "find_head_package ->", (target_package, target_module_tailname)) + return target_package, target_module_tailname + + # Else, raise an exception. + self.msgout(4, "raise ImportError: No module named", target_package_name) + raise ImportError("No module named " + target_package_name) + + + + + #FIXME: Refactor from a generator yielding graph nodes into a non-generator + #returning a list or tuple of all yielded graph nodes. This method is only + #called once above and the return value of that call is only iterated over + #as a list or tuple. There's no demonstrable reason for this to be a + #generator. Generators are great for their intended purposes (e.g., as + #continuations). This isn't one of those purposes. + def _import_importable_package_submodules(self, package, attr_names): + """ + Generator importing and yielding each importable submodule (of the + previously imported package corresponding to the passed graph node) + whose unqualified name is in the passed list. + + Elements of this list that are _not_ importable submodules of this + package are either: + + * Ignorable attributes (e.g., classes, globals) defined at the top + level of this package's `__init__` submodule, which will be ignored. + * Else, unignorable unimportable submodules, in which case an + exception is raised. + + Parameters + ---------- + package : Package + Graph node of the previously imported package containing the + modules to be imported and yielded. + + attr_names : list + List of the unqualified names of all attributes of this package to + attempt to import as submodules. This list will be internally + converted into a set, safely ignoring any duplicates in this list + (e.g., reducing the "from"-style import + `from foo import bar, car, far, bar, car, far` to merely + `from foo import bar, car, far`). + + Yields + ---------- + Node + Graph node created for the currently imported submodule. + + Raises + ---------- + ImportError + If any attribute whose name is in `attr_names` is neither: + * An importable submodule of this package. + * An ignorable global attribute (e.g., class, variable) defined at + the top level of this package's `__init__` submodule. + In this case, this attribute _must_ be an unimportable submodule of + this package. + """ + + # Ignore duplicate submodule names in the passed list. + attr_names = set(attr_names) + self.msgin(4, "_import_importable_package_submodules", package, attr_names) + + #FIXME: This test *SHOULD* be superfluous and hence safely removable. + #The higher-level _scan_bytecode() and _collect_import() methods + #already guarantee "*" characters to be removed from fromlists. + if '*' in attr_names: + attr_names.update(self._find_all_submodules(package)) + attr_names.remove('*') + + # self.msg(4, '_import_importable_package_submodules (global attrs)', package.identifier, package._global_attr_names) + + # For the name of each attribute to be imported from this package... + for attr_name in attr_names: + # self.msg(4, '_import_importable_package_submodules (fromlist attr)', package.identifier, attr_name) + + # Graph node of this attribute if this attribute is a previously + # imported module or None otherwise. + submodule = package.get_submodule_or_none(attr_name) + + # If this attribute is *NOT* a previously imported module, attempt + # to import this attribute as a submodule of this package. + if submodule is None: + # Fully-qualified name of this submodule. + submodule_name = package.identifier + '.' + attr_name + + # Graph node of this submodule if importable or None otherwise. + submodule = self._safe_import_module( + attr_name, submodule_name, package) + + # If this submodule is unimportable... + if submodule is None: + # If this attribute is a global (e.g., class, variable) + # defined at the top level of this package's "__init__" + # submodule, this importation is safely ignorable. Do so + # and skip to the next attribute. + # + # This behaviour is non-conformant with Python behaviour, + # which is bad, but is required to sanely handle all + # possible edge cases, which is good. In Python, a global + # attribute defined at the top level of a package's + # "__init__" submodule shadows a submodule of the same name + # in that package. Attempting to import that submodule + # instead imports that attribute; thus, that submodule is + # effectively unimportable. In this method and elsewhere, + # that submodule is tested for first and hence shadows that + # attribute -- the opposite logic. Attempts to import that + # attribute are mistakenly seen as attempts to import that + # submodule! Why? + # + # Edge cases. PyInstaller (and by extension ModuleGraph) + # only cares about module imports. Global attribute imports + # are parsed only as the means to this ends and are + # otherwise ignorable. The cost of erroneously shadowing: + # + # * Submodules by attributes is significant. Doing so + # prevents such submodules from being frozen and hence + # imported at application runtime. + # * Attributes by submodules is insignificant. Doing so + # could erroneously freeze such submodules despite their + # never being imported at application runtime. However, + # ModuleGraph is incapable of determining with certainty + # that Python logic in another module other than the + # "__init__" submodule containing these attributes does + # *NOT* delete these attributes and hence unshadow these + # submodules, which would then become importable at + # runtime and require freezing. Hence, ModuleGraph *MUST* + # permissively assume submodules of the same name as + # attributes to be unshadowed elsewhere and require + # freezing -- even if they do not. + # + # It is practically difficult (albeit technically feasible) + # for ModuleGraph to determine whether or not the target + # attribute names of "from"-style import statements (e.g., + # "bar" and "car" in "from foo import bar, car") refer to + # non-ignorable submodules or ignorable non-module globals + # during opcode scanning. Distinguishing these two cases + # during opcode scanning would require a costly call to the + # _find_module() method, which would subsequently be + # repeated during import-graph construction. This could be + # ameliorated with caching, which itself would require + # costly space consumption and developer time. + # + # Since opcode scanning fails to distinguish these two + # cases, this and other methods subsequently called at + # import-graph construction time (e.g., + # _safe_import_hook()) must do so. Since submodules of the + # same name as attributes must assume to be unshadowed + # elsewhere and require freezing, the only solution is to + # attempt to import an attribute as a non-ignorable module + # *BEFORE* assuming an attribute to be an ignorable + # non-module. Which is what this and other methods do. + # + # See Package.is_global_attr() for similar discussion. + if package.is_global_attr(attr_name): + self.msg(4, '_import_importable_package_submodules: ignoring from-imported global', package.identifier, attr_name) + continue + # Else, this attribute is an unimportable submodule. Since + # this is *NOT* safely ignorable, raise an exception. + else: + raise ImportError("No module named " + submodule_name) + + # Yield this submodule's graph node to the caller. + yield submodule + + self.msgin(4, "_import_importable_package_submodules ->") + + + def _find_all_submodules(self, m): + if not m.packagepath: + return + # 'suffixes' used to be a list hardcoded to [".py", ".pyc", ".pyo"]. + # But we must also collect Python extension modules - although + # we cannot separate normal dlls from Python extensions. + for path in m.packagepath: + try: + names = os.listdir(path) + except (os.error, IOError): + self.msg(2, "can't list directory", path) + continue + for name in names: + for suffix in importlib.machinery.all_suffixes(): + if path.endswith(suffix): + name = os.path.basename(path)[:-len(suffix)] + break + else: + continue + if name != '__init__': + yield name + + + def alias_module(self, src_module_name, trg_module_name): + """ + Alias the source module to the target module with the passed names. + + This method ensures that the next call to findNode() given the target + module name will resolve this alias. This includes importing and adding + a graph node for the source module if needed as well as adding a + reference from the target to source module. + + Parameters + ---------- + src_module_name : str + Fully-qualified name of the existing **source module** (i.e., the + module being aliased). + trg_module_name : str + Fully-qualified name of the non-existent **target module** (i.e., + the alias to be created). + """ + self.msg(3, 'alias_module "%s" -> "%s"' % (src_module_name, trg_module_name)) + # print('alias_module "%s" -> "%s"' % (src_module_name, trg_module_name)) + assert isinstance(src_module_name, str), '"%s" not a module name.' % str(src_module_name) + assert isinstance(trg_module_name, str), '"%s" not a module name.' % str(trg_module_name) + + # If the target module has already been added to the graph as either a + # non-alias or as a different alias, raise an exception. + trg_module = self.find_node(trg_module_name) + if trg_module is not None and not ( + isinstance(trg_module, AliasNode) and + trg_module.identifier == src_module_name): + raise ValueError( + 'Target module "%s" already imported as "%s".' % ( + trg_module_name, trg_module)) + + # See findNode() for details. + self.lazynodes[trg_module_name] = Alias(src_module_name) + + + def add_module(self, module): + """ + Add the passed module node to the graph if not already added. + + If that module has a parent module or package with a previously added + node, this method also adds a reference from this module node to its + parent node and adds this module node to its parent node's namespace. + + This high-level method wraps the low-level `addNode()` method, but is + typically _only_ called by graph hooks adding runtime module nodes. For + all other node types, the `import_module()` method should be called. + + Parameters + ---------- + module : BaseModule + Graph node of the module to be added. + """ + self.msg(3, 'add_module', module) + + # If no node exists for this module, add such a node. + module_added = self.find_node(module.identifier) + if module_added is None: + self.addNode(module) + else: + assert module == module_added, 'New module %r != previous %r.' % (module, module_added) + + # If this module has a previously added parent, reference this module to + # its parent and add this module to its parent's namespace. + parent_name, _, module_basename = module.identifier.rpartition('.') + if parent_name: + parent = self.find_node(parent_name) + if parent is None: + self.msg(4, 'add_module parent not found:', parent_name) + else: + self.add_edge(module, parent) + parent.add_submodule(module_basename, module) + + + def append_package_path(self, package_name, directory): + """ + Modulegraph does a good job at simulating Python's, but it can not + handle packagepath '__path__' modifications packages make at runtime. + + Therefore there is a mechanism whereby you can register extra paths + in this map for a package, and it will be honored. + + NOTE: This method has to be called before a package is resolved by + modulegraph. + + Parameters + ---------- + module : str + Fully-qualified module name. + directory : str + Absolute or relative path of the directory to append to the + '__path__' attribute. + """ + + paths = self._package_path_map.setdefault(package_name, []) + paths.append(directory) + + + def _safe_import_module( + self, module_partname, module_name, parent_module): + """ + Create a new graph node for the module with the passed name under the + parent package signified by the passed graph node _without_ raising + `ImportError` exceptions. + + If this module has already been imported, this module's existing graph + node will be returned; else if this module is importable, a new graph + node will be added for this module and returned; else this module is + unimportable, in which case `None` will be returned. Like the + `_safe_import_hook()` method, this method does _not_ raise + `ImportError` exceptions when this module is unimportable. + + Parameters + ---------- + module_partname : str + Unqualified name of the module to be imported (e.g., `text`). + module_name : str + Fully-qualified name of this module (e.g., `email.mime.text`). + parent_module : Package + Graph node of the previously imported parent module containing this + submodule _or_ `None` if this is a top-level module (i.e., + `module_name` contains no `.` delimiters). This parent module is + typically but _not_ always a package (e.g., the `os.path` submodule + contained by the `os` module). + + Returns + ---------- + Node + Graph node created for this module _or_ `None` if this module is + unimportable. + """ + self.msgin(3, "safe_import_module", module_partname, module_name, parent_module) + + # If this module has *NOT* already been imported, do so. + module = self.find_node(module_name) + if module is None: + # List of the absolute paths of all directories to be searched for + # this module. This effectively defaults to "sys.path". + search_dirs = None + + # If this module has a parent package... + if parent_module is not None: + # ...with a list of the absolute paths of all directories + # comprising this package, prefer that to "sys.path". + if parent_module.packagepath is not None: + search_dirs = parent_module.packagepath + # Else, something is horribly wrong. Return emptiness. + else: + self.msgout(3, "safe_import_module -> None (parent_parent.packagepath is None)") + return None + + try: + pathname, loader = self._find_module( + module_partname, search_dirs, parent_module) + except ImportError as exc: + self.msgout(3, "safe_import_module -> None (%r)" % exc) + return None + + (module, co) = self._load_module(module_name, pathname, loader) + if co is not None: + try: + if isinstance(co, ast.AST): + co_ast = co + co = compile(co_ast, pathname, 'exec', 0, True) + else: + co_ast = None + n = self._scan_code(module, co, co_ast) + self._process_imports(n) + + if self.replace_paths: + co = self._replace_paths_in_code(co) + module.code = co + except SyntaxError: + self.msg( + 1, "safe_import_module: SyntaxError in ", pathname, + ) + cls = InvalidSourceModule + module = self.createNode(cls, module_name) + + # If this is a submodule rather than top-level module... + if parent_module is not None: + self.msg(4, "safe_import_module create reference", module, "->", parent_module) + + # Add an edge from this submodule to its parent module. + self._updateReference( + module, parent_module, edge_data=DependencyInfo( + conditional=False, + fromlist=False, + function=False, + tryexcept=False, + )) + + # Add this submodule to its parent module. + parent_module.add_submodule(module_partname, module) + + # Return this module. + self.msgout(3, "safe_import_module ->", module) + return module + + def _load_module(self, fqname, pathname, loader): + from importlib._bootstrap_external import ExtensionFileLoader + self.msgin(2, "load_module", fqname, pathname, + loader.__class__.__name__) + partname = fqname.rpartition(".")[-1] + + if loader.is_package(partname): + if isinstance(loader, NAMESPACE_PACKAGE): + # This is a PEP-420 namespace package. + m = self.createNode(NamespacePackage, fqname) + m.filename = '-' + m.packagepath = loader.namespace_dirs[:] # copy for safety + else: + # Regular package. + # + # NOTE: this might be a legacy setuptools (pkg_resources) + # based namespace package (with __init__.py, but calling + # `pkg_resources.declare_namespace(__name__)`). To properly + # handle the case when such a package is split across + # multiple locations, we need to resolve the package + # paths via metadata. + ns_pkgpaths = self._legacy_ns_packages.get(fqname, []) + + if isinstance(loader, ExtensionFileLoader): + m = self.createNode(ExtensionPackage, fqname) + else: + m = self.createNode(Package, fqname) + m.filename = pathname + # PEP-302-compliant loaders return the pathname of the + # `__init__`-file, not the package directory. + assert os.path.basename(pathname).startswith('__init__.') + m.packagepath = [os.path.dirname(pathname)] + ns_pkgpaths + + # As per comment at top of file, simulate runtime packagepath + # additions + m.packagepath = m.packagepath + self._package_path_map.get( + fqname, []) + + if isinstance(m, NamespacePackage): + return (m, None) + + co = None + if loader is BUILTIN_MODULE: + cls = BuiltinModule + elif isinstance(loader, ExtensionFileLoader): + cls = Extension + else: + try: + src = loader.get_source(partname) + except (UnicodeDecodeError, SyntaxError) as e: + # The `UnicodeDecodeError` is typically raised here when the + # source file contains non-ASCII characters in some local + # encoding that is different from UTF-8, but fails to + # declare it via PEP361 encoding header. Python seems to + # be able to load and run such module, but we cannot retrieve + # the source for it via the `loader.get_source()`. + # + # The `UnicodeDecoreError` in turn triggers a `SyntaxError` + # when such invalid character appears on the first line of + # the source file (and interrupts the scan for PEP361 + # encoding header). + # + # In such cases, we try to fall back to reading the source + # as raw data file. + + # If `SyntaxError` was not raised during handling of + # a `UnicodeDecodeError`, it was likely a genuine syntax + # error, so re-raise it. + if isinstance(e, SyntaxError): + if not isinstance(e.__context__, UnicodeDecodeError): + raise + + self.msg(2, "load_module: failed to obtain source for " + f"{partname}: {e}! Falling back to reading as " + "raw data!") + + path = loader.get_filename(partname) + src = loader.get_data(path) + + if src is not None: + try: + co = compile(src, pathname, 'exec', ast.PyCF_ONLY_AST, True) + cls = SourceModule + except SyntaxError: + co = None + cls = InvalidSourceModule + except Exception as exc: # FIXME: more specific? + cls = InvalidSourceModule + self.msg(2, "load_module: InvalidSourceModule", pathname, + exc) + else: + # no src available + try: + co = loader.get_code(partname) + cls = (CompiledModule if co is not None + else InvalidCompiledModule) + except Exception as exc: # FIXME: more specific? + self.msg(2, "load_module: InvalidCompiledModule, " + "Cannot load code", pathname, exc) + cls = InvalidCompiledModule + + m = self.createNode(cls, fqname) + m.filename = pathname + + self.msgout(2, "load_module ->", m) + return (m, co) + + def _safe_import_hook( + self, target_module_partname, source_module, target_attr_names, + level=DEFAULT_IMPORT_LEVEL, edge_attr=None): + """ + Import the module with the passed name and all parent packages of this + module from the previously imported caller module signified by the + passed graph node _without_ raising `ImportError` exceptions. + + This method wraps the lowel-level `_import_hook()` method. On catching + an `ImportError` exception raised by that method, this method creates + and adds a `MissingNode` instance describing the unimportable module to + the graph instead. + + Parameters + ---------- + target_module_partname : str + Partially-qualified name of the module to be imported. If `level` + is: + * `ABSOLUTE_OR_RELATIVE_IMPORT_LEVEL` (e.g., the Python 2 default) + or a positive integer (e.g., an explicit relative import), the + fully-qualified name of this module is the concatenation of the + fully-qualified name of the caller module's package and this + parameter. + * `ABSOLUTE_IMPORT_LEVEL` (e.g., the Python 3 default), this name + is already fully-qualified. + * A non-negative integer (e.g., `1`), this name is typically the + empty string. In this case, this is a "from"-style relative + import (e.g., "from . import bar") and the fully-qualified name + of this module is dynamically resolved by import machinery. + source_module : Node + Graph node for the previously imported **caller module** (i.e., + module containing the `import` statement triggering the call to + this method) _or_ `None` if this module is to be imported in a + "disconnected" manner. **Passing `None` is _not_ recommended.** + Doing so produces a disconnected graph in which the graph node + created for the module to be imported will be disconnected and + hence unreachable from all other nodes -- which frequently causes + subtle issues in external callers (e.g., PyInstaller, which + silently ignores unreachable nodes). + target_attr_names : list + List of the unqualified names of all submodules and attributes to + be imported via a `from`-style import statement from this target + module if any (e.g., the list `[encode_base64, encode_noop]` for + the import `from email.encoders import encode_base64, encode_noop`) + _or_ `None` otherwise. Ignored unless `source_module` is the graph + node of a package (i.e., is an instance of the `Package` class). + Why? Because: + * Consistency. The `_import_importable_package_submodules()` + method accepts a similar list applicable only to packages. + * Efficiency. Unlike packages, modules cannot physically contain + submodules. Hence, any target module imported via a `from`-style + import statement as an attribute from another target parent + module must itself have been imported in that target parent + module. The import statement responsible for that import must + already have been previously parsed by `ModuleGraph`, in which + case that target module will already be frozen by PyInstaller. + These imports are safely ignorable here. + level : int + Whether to perform an absolute or relative import. This parameter + corresponds exactly to the parameter of the same name accepted by + the `__import__()` built-in: "The default is -1 which indicates + both absolute and relative imports will be attempted. 0 means only + perform absolute imports. Positive values for level indicate the + number of parent directories to search relative to the directory of + the module calling `__import__()`." Defaults to -1 under Python 2 + and 0 under Python 3. Since this default depends on the major + version of the current Python interpreter, depending on this + default can result in unpredictable and non-portable behaviour. + Callers are strongly recommended to explicitly pass this parameter + rather than implicitly accept this default. + + Returns + ---------- + list + List of the graph nodes created for all modules explicitly imported + by this call, including the passed module and all submodules listed + in `target_attr_names` _but_ excluding all parent packages + implicitly imported by this call. If `target_attr_names` is either + `None` or the empty list, this is guaranteed to be a list of one + element: the graph node created for the passed module. As above, + `MissingNode` instances are created for all unimportable modules. + """ + self.msg(3, "_safe_import_hook", target_module_partname, source_module, target_attr_names, level) + + def is_swig_candidate(): + return (source_module is not None and + target_attr_names is None and + level == ABSOLUTE_IMPORT_LEVEL and + type(source_module) is SourceModule and + target_module_partname == + '_' + source_module.identifier.rpartition('.')[2]) + + def is_swig_wrapper(source_module): + with open(source_module.filename, 'rb') as fp: + contents = fp.read() + contents = importlib.util.decode_source(contents) + first_line = contents.splitlines()[0] if contents else '' + self.msg(5, 'SWIG wrapper candidate first line: %r' % (first_line)) + return "automatically generated by SWIG" in first_line + + + # List of the graph nodes created for all target modules both + # imported by and returned from this call, whose: + # + # * First element is the graph node for the core target module + # specified by the "target_module_partname" parameter. + # * Remaining elements are the graph nodes for all target submodules + # specified by the "target_attr_names" parameter. + target_modules = None + + # True if this is a Python 2-style implicit relative import of a + # SWIG-generated C extension. False if we checked and it is not SWIG. + # None if we haven't checked yet. + is_swig_import = None + + # Attempt to import this target module in the customary way. + try: + target_modules = self.import_hook( + target_module_partname, source_module, + target_attr_names=None, level=level, edge_attr=edge_attr) + # Failing that, defer to custom module importers handling non-standard + # import schemes (namely, SWIG). + except InvalidRelativeImportError: + self.msgout(2, "Invalid relative import", level, + target_module_partname, target_attr_names) + result = [] + for sub in target_attr_names or '*': + m = self.createNode(InvalidRelativeImport, + '.' * level + target_module_partname, sub) + self._updateReference(source_module, m, edge_data=edge_attr) + result.append(m) + return result + except ImportError as msg: + # If this is an absolute top-level import under Python 3 and if the + # name to be imported is the caller's name prefixed by "_", this + # could be a SWIG-generated Python 2-style implicit relative import. + # SWIG-generated files contain functions named swig_import_helper() + # importing dynamic libraries residing in the same directory. For + # example, a SWIG-generated caller module "csr.py" might resemble: + # + # # This file was automatically generated by SWIG (http://www.swig.org). + # ... + # def swig_import_helper(): + # ... + # try: + # fp, pathname, description = imp.find_module('_csr', + # [dirname(__file__)]) + # except ImportError: + # import _csr + # return _csr + # + # While there exists no reasonable means for modulegraph to parse + # the call to imp.find_module(), the subsequent implicit relative + # import is trivially parsable. This import is prohibited under + # Python 3, however, and thus parsed only if the caller's file is + # parsable plaintext (as indicated by a filetype of ".py") and the + # first line of this file is the above SWIG header comment. + # + # The constraint that this library's name be the caller's name + # prefixed by '_' is explicitly mandated by SWIG and thus a + # reliable indicator of "SWIG-ness". The SWIG documentation states: + # "When linking the module, the name of the output file has to match + # the name of the module prefixed by an underscore." + # + # Only source modules (e.g., ".py"-suffixed files) are SWIG import + # candidates. All other node types are safely ignorable. + if is_swig_candidate(): + self.msg( + 4, + 'SWIG import candidate (name=%r, caller=%r, level=%r)' % ( + target_module_partname, source_module, level)) + is_swig_import = is_swig_wrapper(source_module) + if is_swig_import: + # Convert this Python 2-compliant implicit relative + # import prohibited by Python 3 into a Python + # 3-compliant explicit relative "from"-style import for + # the duration of this function call by overwriting the + # original parameters passed to this call. + target_attr_names = [target_module_partname] + target_module_partname = '' + level = 1 + self.msg(2, + 'SWIG import (caller=%r, fromlist=%r, level=%r)' + % (source_module, target_attr_names, level)) + # Import this target SWIG C extension's package. + try: + target_modules = self.import_hook( + target_module_partname, source_module, + target_attr_names=None, + level=level, + edge_attr=edge_attr) + except ImportError as msg: + self.msg(2, "SWIG ImportError:", str(msg)) + + # If this module remains unimportable... + if target_modules is None: + self.msg(2, "ImportError:", str(msg)) + + # Add this module as a MissingModule node. + target_module = self.createNode( + MissingModule, + _path_from_importerror(msg, target_module_partname)) + self._updateReference( + source_module, target_module, edge_data=edge_attr) + + # Initialize this list to this node. + target_modules = [target_module] + + # Ensure that the above logic imported exactly one target module. + assert len(target_modules) == 1, ( + 'Expected import_hook() to' + 'return only one module but received: {}'.format(target_modules)) + + # Target module imported above. + target_module = target_modules[0] + + if isinstance(target_module, MissingModule) \ + and is_swig_import is None and is_swig_candidate() \ + and is_swig_wrapper(source_module): + # if this possible swig C module was previously imported from + # a python module other than its corresponding swig python + # module, then it may have been considered a MissingModule. + # Try to reimport it now. For details see pull-request #2578 + # and issue #1522. + # + # If this module was takes as a SWIG candidate above, but failed + # to import, this would be a MissingModule, too. Thus check if + # this was the case (is_swig_import would be not None) to avoid + # recursion error. If `is_swig_import` is None and we are still a + # swig candidate then that means we haven't properly imported this + # swig module yet so do that below. + # + # Remove the MissingModule node from the graph so that we can + # attempt a reimport and avoid collisions. This node should be + # fine to remove because the proper module will be imported and + # added to the graph in the next line (call to _safe_import_hook). + self.removeNode(target_module) + # Reimport the SWIG C module relative to the wrapper + target_modules = self._safe_import_hook( + target_module_partname, source_module, + target_attr_names=None, level=1, edge_attr=edge_attr) + # return the output regardless because it would just be + # duplicating the processing below + return target_modules + + if isinstance(edge_attr, DependencyInfo): + edge_attr = edge_attr._replace(fromlist=True) + + # If this is a "from"-style import *AND* this target module is a + # package, import all attributes listed by the "import" clause of this + # import that are submodules of this package. If this target module is + # *NOT* a package, these attributes are always ignorable globals (e.g., + # classes, variables) defined at the top level of this module. + # + # If this target module is a non-package, it could still contain + # importable submodules (e.g., the non-package `os` module containing + # the `os.path` submodule). In this case, these submodules are already + # imported by this target module's pure-Python code. Since our import + # scanner already detects these imports, these submodules need *NOT* be + # reimported here. (Doing so would be harmless but inefficient.) + if target_attr_names and isinstance(target_module, + (Package, AliasNode)): + # For the name of each attribute imported from this target package + # into this source module... + for target_submodule_partname in target_attr_names: + #FIXME: Is this optimization *REALLY* an optimization or at all + #necessary? The findNode() method called below should already + #be heavily optimized, in which case this optimization here is + #premature, senseless, and should be eliminated. + + # If this attribute is a previously imported submodule of this + # target module, optimize this edge case. + if target_module.is_submodule(target_submodule_partname): + # Graph node for this submodule. + target_submodule = target_module.get_submodule( + target_submodule_partname) + + #FIXME: What? Shouldn't "target_submodule" *ALWAYS* be + #non-None here? Assert this to be non-None instead. + if target_submodule is not None: + #FIXME: Why does duplication matter? List searches are + #mildly expensive. + + # If this submodule has not already been added to the + # list of submodules to be returned, do so. + if target_submodule not in target_modules: + self._updateReference( + source_module, + target_submodule, + edge_data=edge_attr) + target_modules.append(target_submodule) + continue + + # Fully-qualified name of this submodule. + target_submodule_name = ( + target_module.identifier + '.' + target_submodule_partname) + + # Graph node of this submodule if previously imported or None. + target_submodule = self.find_node(target_submodule_name) + + # If this submodule has not been imported, do so as if this + # submodule were the only attribute listed by the "import" + # clause of this import (e.g., as "from foo import bar" rather + # than "from foo import car, far, bar"). + if target_submodule is None: + # Attempt to import this submodule. + try: + # Ignore the list of graph nodes returned by this + # method. If both this submodule's package and this + # submodule are importable, this method returns a + # 2-element list whose second element is this + # submodule's graph node. However, if this submodule's + # package is importable but this submodule is not, + # this submodule is either: + # + # * An ignorable global attribute defined at the top + # level of this package's "__init__" submodule. In + # this case, this method returns a 1-element list + # without raising an exception. + # * A non-ignorable unimportable submodule. In this + # case, this method raises an "ImportError". + # + # While the first two cases are disambiguatable by the + # length of this list, doing so would render this code + # dependent on import_hook() details subject to change. + # Instead, call findNode() to decide the truthiness. + self.import_hook( + target_module_partname, source_module, + target_attr_names=[target_submodule_partname], + level=level, + edge_attr=edge_attr) + + # Graph node of this submodule imported by the prior + # call if importable or None otherwise. + target_submodule = self.find_node(target_submodule_name) + + # If this submodule does not exist, this *MUST* be an + # ignorable global attribute defined at the top level + # of this package's "__init__" submodule. + if target_submodule is None: + # Assert this to actually be the case. + assert target_module.is_global_attr( + target_submodule_partname), ( + 'No global named {} in {}.__init__'.format( + target_submodule_partname, + target_module.identifier)) + + # Skip this safely ignorable importation to the + # next attribute. See similar logic in the body of + # _import_importable_package_submodules(). + self.msg(4, '_safe_import_hook', 'ignoring imported non-module global', target_module.identifier, target_submodule_partname) + continue + + # If this is a SWIG C extension, instruct PyInstaller + # to freeze this extension under its unqualified rather + # than qualified name (e.g., as "_csr" rather than + # "scipy.sparse.sparsetools._csr"), permitting the + # implicit relative import in its parent SWIG module to + # successfully find this extension. + if is_swig_import: + # If a graph node with this name already exists, + # avoid collisions by emitting an error instead. + if self.find_node(target_submodule_partname): + self.msg( + 2, + 'SWIG import error: %r basename %r ' + 'already exists' % ( + target_submodule_name, + target_submodule_partname)) + else: + self.msg( + 4, + 'SWIG import renamed from %r to %r' % ( + target_submodule_name, + target_submodule_partname)) + target_submodule.identifier = ( + target_submodule_partname) + # If this submodule is unimportable, add a MissingModule. + except ImportError as msg: + self.msg(2, "ImportError:", str(msg)) + target_submodule = self.createNode( + MissingModule, target_submodule_name) + + # Add this submodule to its package. + target_module.add_submodule( + target_submodule_partname, target_submodule) + if target_submodule is not None: + self._updateReference( + target_module, target_submodule, edge_data=edge_attr) + self._updateReference( + source_module, target_submodule, edge_data=edge_attr) + + if target_submodule not in target_modules: + target_modules.append(target_submodule) + + # Return the list of all target modules imported by this call. + return target_modules + + + def _scan_code( + self, + module, + module_code_object, + module_code_object_ast=None): + """ + Parse and add all import statements from the passed code object of the + passed source module to this graph, recursively. + + **This method is at the root of all `ModuleGraph` recursion.** + Recursion begins here and ends when all import statements in all code + objects of all modules transitively imported by the source module + passed to the first call to this method have been added to the graph. + Specifically, this method: + + 1. If the passed `module_code_object_ast` parameter is non-`None`, + parses all import statements from this object. + 2. Else, parses all import statements from the passed + `module_code_object` parameter. + 1. For each such import statement: + 1. Adds to this `ModuleGraph` instance: + 1. Nodes for all target modules of these imports. + 1. Directed edges from this source module to these target + modules. + 2. Recursively calls this method with these target modules. + + Parameters + ---------- + module : Node + Graph node of the module to be parsed. + module_code_object : PyCodeObject + Code object providing this module's disassembled Python bytecode. + Ignored unless `module_code_object_ast` is `None`. + module_code_object_ast : optional[ast.AST] + Optional abstract syntax tree (AST) of this module if any or `None` + otherwise. Defaults to `None`, in which case the passed + `module_code_object` is parsed instead. + Returns + ---------- + module : Node + Graph node of the module to be parsed. + """ + + # For safety, guard against multiple scans of the same module by + # resetting this module's list of deferred target imports. + module._deferred_imports = [] + + # Parse all imports from this module *BEFORE* adding these imports to + # the graph. If an AST is provided, parse that rather than this + # module's code object. + if module_code_object_ast is not None: + # Parse this module's AST for imports. + self._scan_ast(module, module_code_object_ast) + + # Parse this module's code object for all relevant non-imports + # (e.g., global variable declarations and undeclarations). + self._scan_bytecode( + module, module_code_object, is_scanning_imports=False) + # Else, parse this module's code object for imports. + else: + self._scan_bytecode( + module, module_code_object, is_scanning_imports=True) + + return module + + def _scan_ast(self, module, module_code_object_ast): + """ + Parse and add all import statements from the passed abstract syntax + tree (AST) of the passed source module to this graph, non-recursively. + + Parameters + ---------- + module : Node + Graph node of the module to be parsed. + module_code_object_ast : ast.AST + Abstract syntax tree (AST) of this module to be parsed. + """ + + visitor = _Visitor(self, module) + visitor.visit(module_code_object_ast) + + #FIXME: Optimize. Global attributes added by this method are tested by + #other methods *ONLY* for packages, implying this method should scan and + #handle opcodes pertaining to global attributes (e.g., + #"STORE_NAME", "DELETE_GLOBAL") only if the passed "module" + #object is an instance of the "Package" class. For all other module types, + #these opcodes should simply be ignored. + # + #After doing so, the "Node._global_attr_names" attribute and all methods + #using this attribute (e.g., Node.is_global()) should be moved from the + #"Node" superclass to the "Package" subclass. + def _scan_bytecode( + self, module, module_code_object, is_scanning_imports): + """ + Parse and add all import statements from the passed code object of the + passed source module to this graph, non-recursively. + + This method parses all reasonably parsable operations (i.e., operations + that are both syntactically and semantically parsable _without_ + requiring Turing-complete interpretation) directly or indirectly + involving module importation from this code object. This includes: + + * `IMPORT_NAME`, denoting an import statement. Ignored unless + the passed `is_scanning_imports` parameter is `True`. + * `STORE_NAME` and `STORE_GLOBAL`, denoting the + declaration of a global attribute (e.g., class, variable) in this + module. This method stores each such declaration for subsequent + lookup. While global attributes are usually irrelevant to import + parsing, they remain the only means of distinguishing erroneous + non-ignorable attempts to import non-existent submodules of a package + from successful ignorable attempts to import existing global + attributes of a package's `__init__` submodule (e.g., the `bar` in + `from foo import bar`, which is either a non-ignorable submodule of + `foo` or an ignorable global attribute of `foo.__init__`). + * `DELETE_NAME` and `DELETE_GLOBAL`, denoting the + undeclaration of a previously declared global attribute in this + module. + + Since `ModuleGraph` is _not_ intended to replicate the behaviour of a + full-featured Turing-complete Python interpreter, this method ignores + operations that are _not_ reasonably parsable from this code object -- + even those directly or indirectly involving module importation. This + includes: + + * `STORE_ATTR(namei)`, implementing `TOS.name = TOS1`. If `TOS` is the + name of a target module currently imported into the namespace of the + passed source module, this opcode would ideally be parsed to add that + global attribute to that target module. Since this addition only + conditionally occurs on the importation of this source module and + execution of the code branch in this module performing this addition, + however, that global _cannot_ be unconditionally added to that target + module. In short, only Turing-complete behaviour suffices. + * `DELETE_ATTR(namei)`, implementing `del TOS.name`. If `TOS` is the + name of a target module currently imported into the namespace of the + passed source module, this opcode would ideally be parsed to remove + that global attribute from that target module. Again, however, only + Turing-complete behaviour suffices. + + Parameters + ---------- + module : Node + Graph node of the module to be parsed. + module_code_object : PyCodeObject + Code object of the module to be parsed. + is_scanning_imports : bool + `True` only if this method is parsing import statements from + `IMPORT_NAME` opcodes. If `False`, no import statements will be + parsed. This parameter is typically: + * `True` when parsing this module's code object for such imports. + * `False` when parsing this module's abstract syntax tree (AST) + (rather than code object) for such imports. In this case, that + parsing will have already parsed import statements, which this + parsing must avoid repeating. + """ + level = None + fromlist = None + + # 'deque' is a list-like container with fast appends, pops on + # either end, and automatically discarding elements too much. + prev_insts = deque(maxlen=2) + for inst in util.iterate_instructions(module_code_object): + if not inst: + continue + # If this is an import statement originating from this module, + # parse this import. + # + # Note that the related "IMPORT_FROM" opcode need *NOT* be parsed. + # "IMPORT_NAME" suffices. For further details, see + # http://probablyprogramming.com/2008/04/14/python-import_name + if inst.opname == 'IMPORT_NAME': + # If this method is ignoring import statements, skip to the + # next opcode. + if not is_scanning_imports: + continue + + assert prev_insts[-2].opname == 'LOAD_CONST' + assert prev_insts[-1].opname == 'LOAD_CONST' + + # Python >=2.5: LOAD_CONST flags, LOAD_CONST names, IMPORT_NAME name + level = prev_insts[-2].argval + fromlist = prev_insts[-1].argval + + assert fromlist is None or type(fromlist) is tuple + target_module_partname = inst.argval + + #FIXME: The exact same logic appears in _collect_import(), + #which isn't particularly helpful. Instead, defer this logic + #until later by: + # + #* Refactor the "_deferred_imports" list to contain 2-tuples + # "(_safe_import_hook_args, _safe_import_hook_kwargs)" rather + # than 3-tuples "(have_star, _safe_import_hook_args, + # _safe_import_hook_kwargs)". + #* Stop prepending these tuples by a "have_star" boolean both + # here, in _collect_import(), and in _process_imports(). + #* Shift the logic below to _process_imports(). + #* Remove the same logic from _collect_import(). + have_star = False + if fromlist is not None: + fromlist = uniq(fromlist) + if '*' in fromlist: + fromlist.remove('*') + have_star = True + + # Record this import as originating from this module for + # subsequent handling by the _process_imports() method. + module._deferred_imports.append(( + have_star, + (target_module_partname, module, fromlist, level), + {} + )) + + elif inst.opname in ('STORE_NAME', 'STORE_GLOBAL'): + # If this is the declaration of a global attribute (e.g., + # class, variable) in this module, store this declaration for + # subsequent lookup. See method docstring for further details. + # + # Global attributes are usually irrelevant to import parsing, but + # remain the only means of distinguishing erroneous non-ignorable + # attempts to import non-existent submodules of a package from + # successful ignorable attempts to import existing global + # attributes of a package's "__init__" submodule (e.g., the "bar" + # in "from foo import bar", which is either a non-ignorable + # submodule of "foo" or an ignorable global attribute of + # "foo.__init__"). + name = inst.argval + module.add_global_attr(name) + + elif inst.opname in ('DELETE_NAME', 'DELETE_GLOBAL'): + # If this is the undeclaration of a previously declared global + # attribute (e.g., class, variable) in this module, remove that + # declaration to prevent subsequent lookup. See method docstring + # for further details. + name = inst.argval + module.remove_global_attr_if_found(name) + + prev_insts.append(inst) + + + def _process_imports(self, source_module): + """ + Graph all target modules whose importations were previously parsed from + the passed source module by a prior call to the `_scan_code()` method + and methods call by that method (e.g., `_scan_ast()`, + `_scan_bytecode()`, `_scan_bytecode_stores()`). + + Parameters + ---------- + source_module : Node + Graph node of the source module to graph target imports for. + """ + + # If this source module imported no target modules, noop. + if not source_module._deferred_imports: + return + + # For each target module imported by this source module... + for have_star, import_info, kwargs in source_module._deferred_imports: + # Graph node of the target module specified by the "from" portion + # of this "from"-style star import (e.g., an import resembling + # "from {target_module_name} import *") or ignored otherwise. + target_modules = self._safe_import_hook(*import_info, **kwargs) + if not target_modules: + # If _safe_import_hook suppressed the module, quietly drop it. + # Do not create an ExcludedModule instance, because that might + # completely suppress the module whereas it might need to be + # included due to reference from another module (that does + # not exclude it via hook). + continue + target_module = target_modules[0] + + # If this is a "from"-style star import, process this import. + if have_star: + #FIXME: Sadly, the current approach to importing attributes + #from "from"-style star imports is... simplistic. This should + #be revised as follows. If this target module is: + # + #* A package: + # * Whose "__init__" submodule defines the "__all__" global + # attribute, only attributes listed by this attribute should + # be imported. + # * Else, *NO* attributes should be imported. + #* A non-package: + # * Defining the "__all__" global attribute, only attributes + # listed by this attribute should be imported. + # * Else, only public attributes whose names are *NOT* + # prefixed by "_" should be imported. + source_module.add_global_attrs_from_module(target_module) + + source_module._starimported_ignored_module_names.update( + target_module._starimported_ignored_module_names) + + # If this target module has no code object and hence is + # unparsable, record its name for posterity. + if target_module.code is None: + target_module_name = import_info[0] + source_module._starimported_ignored_module_names.add( + target_module_name) + + # For safety, prevent these imports from being reprocessed. + source_module._deferred_imports = None + + + def _find_module(self, name, path, parent=None): + """ + 3-tuple describing the physical location of the module with the passed + name if this module is physically findable _or_ raise `ImportError`. + + This high-level method wraps the low-level `modulegraph.find_module()` + function with additional support for graph-based module caching. + + Parameters + ---------- + name : str + Fully-qualified name of the Python module to be found. + path : list + List of the absolute paths of all directories to search for this + module _or_ `None` if the default path list `self.path` is to be + searched. + parent : Node + Package containing this module if this module is a submodule of a + package _or_ `None` if this is a top-level module. + + Returns + ---------- + (filename, loader) + See `modulegraph._find_module()` for details. + + Raises + ---------- + ImportError + If this module is _not_ found. + """ + + if parent is not None: + # assert path is not None + fullname = parent.identifier + '.' + name + else: + fullname = name + + node = self.find_node(fullname) + if node is not None: + self.msg(3, "find_module: already included?", node) + raise ImportError(name) + + if path is None: + if name in sys.builtin_module_names: + return (None, BUILTIN_MODULE) + + path = self.path + + return self._find_module_path(fullname, name, path) + + + def _find_module_path(self, fullname, module_name, search_dirs): + """ + 3-tuple describing the physical location of the module with the passed + name if this module is physically findable _or_ raise `ImportError`. + + This low-level function is a variant on the standard `imp.find_module()` + function with additional support for: + + * Multiple search paths. The passed list of absolute paths will be + iteratively searched for the first directory containing a file + corresponding to this module. + * Compressed (e.g., zipped) packages. + + For efficiency, the higher level `ModuleGraph._find_module()` method + wraps this function with support for module caching. + + Parameters + ---------- + module_name : str + Fully-qualified name of the module to be found. + search_dirs : list + List of the absolute paths of all directories to search for this + module (in order). Searching will halt at the first directory + containing this module. + + Returns + ---------- + (filename, loader) + 2-tuple describing the physical location of this module, where: + * `filename` is the absolute path of this file. + * `loader` is the import loader. + In case of a namespace package, this is a NAMESPACE_PACKAGE + instance + + Raises + ---------- + ImportError + If this module is _not_ found. + """ + self.msgin(4, "_find_module_path <-", fullname, search_dirs) + + # Top-level 2-tuple to be returned. + path_data = None + + # List of the absolute paths of all directories comprising the + # namespace package to which this module belongs if any. + namespace_dirs = [] + + try: + for search_dir in search_dirs: + # PEP 302-compliant importer making loaders for this directory. + importer = pkgutil.get_importer(search_dir) + + # If this directory is not importable, continue. + if importer is None: + # self.msg(4, "_find_module_path importer not found", search_dir) + continue + + # Get the PEP 302-compliant loader object loading this module. + # + # If this importer defines the PEP 451-compliant find_spec() + # method, use that, and obtain loader from spec. This should + # be available on python >= 3.4. + if hasattr(importer, 'find_spec'): + loader = None + spec = importer.find_spec(module_name) + if spec is not None: + loader = spec.loader + namespace_dirs.extend(spec.submodule_search_locations or []) + # Else if this importer defines the PEP 302-compliant find_loader() + # method, use that. + elif hasattr(importer, 'find_loader'): + loader, loader_namespace_dirs = importer.find_loader( + module_name) + namespace_dirs.extend(loader_namespace_dirs) + # Else if this importer defines the Python 2-specific + # find_module() method, fall back to that. Despite the method + # name, this method returns a loader rather than a module. + elif hasattr(importer, 'find_module'): + loader = importer.find_module(module_name) + # Else, raise an exception. + else: + raise ImportError( + "Module %r importer %r loader unobtainable" % (module_name, importer)) + + # If this module is not loadable from this directory, continue. + if loader is None: + # self.msg(4, "_find_module_path loader not found", search_dir) + continue + + # Absolute path of this module. If this module resides in a + # compressed archive, this is the absolute path of this module + # after extracting this module from that archive and hence + # should not exist; else, this path should typically exist. + pathname = None + + # If this loader defines the PEP 302-compliant get_filename() + # method, preferably call that method first. Most if not all + # loaders (including zipimporter objects) define this method. + if hasattr(loader, 'get_filename'): + pathname = loader.get_filename(module_name) + # Else if this loader provides a "path" attribute, defer to that. + elif hasattr(loader, 'path'): + pathname = loader.path + # Else, raise an exception. + else: + raise ImportError( + "Module %r loader %r path unobtainable" % (module_name, loader)) + + # If no path was found, this is probably a namespace package. In + # such case, continue collecting namespace directories. + if pathname is None: + self.msg(4, "_find_module_path path not found", pathname) + continue + + # Return such metadata. + path_data = (pathname, loader) + break + # Else if this is a namespace package, return such metadata. + else: + if namespace_dirs: + path_data = (namespace_dirs[0], + NAMESPACE_PACKAGE(namespace_dirs)) + except UnicodeDecodeError as exc: + self.msgout(1, "_find_module_path -> unicode error", exc) + # Ensure that exceptions are logged, as this function is typically + # called by the import_module() method which squelches ImportErrors. + except Exception as exc: + self.msgout(4, "_find_module_path -> exception", exc) + raise + + # If this module was not found, raise an exception. + self.msgout(4, "_find_module_path ->", path_data) + if path_data is None: + raise ImportError("No module named " + repr(module_name)) + + return path_data + + + def create_xref(self, out=None): + global header, footer, entry, contpl, contpl_linked, imports + if out is None: + out = sys.stdout + scripts = [] + mods = [] + for mod in self.iter_graph(): + name = os.path.basename(mod.graphident) + if isinstance(mod, Script): + scripts.append((name, mod)) + else: + mods.append((name, mod)) + scripts.sort() + mods.sort() + scriptnames = [sn for sn, m in scripts] + scripts.extend(mods) + mods = scripts + + title = "modulegraph cross reference for " + ', '.join(scriptnames) + print(header % {"TITLE": title}, file=out) + + def sorted_namelist(mods): + lst = [os.path.basename(mod.graphident) for mod in mods if mod] + lst.sort() + return lst + for name, m in mods: + content = "" + if isinstance(m, BuiltinModule): + content = contpl % {"NAME": name, + "TYPE": "(builtin module)"} + elif isinstance(m, Extension): + content = contpl % {"NAME": name, + "TYPE": "%s" % m.filename} + else: + url = urllib.request.pathname2url(m.filename or "") + content = contpl_linked % {"NAME": name, "URL": url, + 'TYPE': m.__class__.__name__} + oute, ince = map(sorted_namelist, self.get_edges(m)) + if oute: + links = [] + for n in oute: + links.append(""" %s\n""" % (n, n)) + # #8226 = bullet-point; can't use html-entities since the + # test-suite uses xml.etree.ElementTree.XMLParser, which + # does't supprot them. + links = " • ".join(links) + content += imports % {"HEAD": "imports", "LINKS": links} + if ince: + links = [] + for n in ince: + links.append(""" %s\n""" % (n, n)) + # #8226 = bullet-point; can't use html-entities since the + # test-suite uses xml.etree.ElementTree.XMLParser, which + # does't supprot them. + links = " • ".join(links) + content += imports % {"HEAD": "imported by", "LINKS": links} + print(entry % {"NAME": name, "CONTENT": content}, file=out) + print(footer, file=out) + + def itergraphreport(self, name='G', flatpackages=()): + # XXX: Can this be implemented using Dot()? + nodes = list(map(self.graph.describe_node, self.graph.iterdfs(self))) + describe_edge = self.graph.describe_edge + edges = deque() + packagenodes = set() + packageidents = {} + nodetoident = {} + inpackages = {} + mainedges = set() + + # XXX - implement + flatpackages = dict(flatpackages) + + def nodevisitor(node, data, outgoing, incoming): + if not isinstance(data, Node): + return {'label': str(node)} + #if isinstance(d, (ExcludedModule, MissingModule, BadModule)): + # return None + s = ' ' + type(data).__name__ + for i, v in enumerate(data.infoTuple()[:1], 1): + s += '| %s' % (i, v) + return {'label': s, 'shape': 'record'} + + + def edgevisitor(edge, data, head, tail): + # XXX: This method nonsense, the edge + # data is never initialized. + if data == 'orphan': + return {'style': 'dashed'} + elif data == 'pkgref': + return {'style': 'dotted'} + return {} + + yield 'digraph %s {\ncharset="UTF-8";\n' % (name,) + attr = dict(rankdir='LR', concentrate='true') + cpatt = '%s="%s"' + for item in attr.items(): + yield '\t%s;\n' % (cpatt % item,) + + # find all packages (subgraphs) + for (node, data, outgoing, incoming) in nodes: + nodetoident[node] = getattr(data, 'graphident', None) + if isinstance(data, Package): + packageidents[data.graphident] = node + inpackages[node] = set([node]) + packagenodes.add(node) + + # create sets for subgraph, write out descriptions + for (node, data, outgoing, incoming) in nodes: + # update edges + for edge in (describe_edge(e) for e in outgoing): + edges.append(edge) + + # describe node + yield '\t"%s" [%s];\n' % ( + node, + ','.join([ + (cpatt % item) for item in + nodevisitor(node, data, outgoing, incoming).items() + ]), + ) + + inside = inpackages.get(node) + if inside is None: + inside = inpackages[node] = set() + ident = nodetoident[node] + if ident is None: + continue + pkgnode = packageidents.get(ident[:ident.rfind('.')]) + if pkgnode is not None: + inside.add(pkgnode) + + graph = [] + subgraphs = {} + for key in packagenodes: + subgraphs[key] = [] + + while edges: + edge, data, head, tail = edges.popleft() + if ((head, tail)) in mainedges: + continue + mainedges.add((head, tail)) + tailpkgs = inpackages[tail] + common = inpackages[head] & tailpkgs + if not common and tailpkgs: + usepkgs = sorted(tailpkgs) + if len(usepkgs) != 1 or usepkgs[0] != tail: + edges.append((edge, data, head, usepkgs[0])) + edges.append((edge, 'pkgref', usepkgs[-1], tail)) + continue + if common: + common = common.pop() + if tail == common: + edges.append((edge, data, tail, head)) + elif head == common: + subgraphs[common].append((edge, 'pkgref', head, tail)) + else: + edges.append((edge, data, common, head)) + edges.append((edge, data, common, tail)) + + else: + graph.append((edge, data, head, tail)) + + def do_graph(edges, tabs): + edgestr = tabs + '"%s" -> "%s" [%s];\n' + # describe edge + for (edge, data, head, tail) in edges: + attribs = edgevisitor(edge, data, head, tail) + yield edgestr % ( + head, + tail, + ','.join([(cpatt % item) for item in attribs.items()]), + ) + + for g, edges in subgraphs.items(): + yield '\tsubgraph "cluster_%s" {\n' % (g,) + yield '\t\tlabel="%s";\n' % (nodetoident[g],) + for s in do_graph(edges, '\t\t'): + yield s + yield '\t}\n' + + for s in do_graph(graph, '\t'): + yield s + + yield '}\n' + + def graphreport(self, fileobj=None, flatpackages=()): + if fileobj is None: + fileobj = sys.stdout + fileobj.writelines(self.itergraphreport(flatpackages=flatpackages)) + + def report(self): + """Print a report to stdout, listing the found modules with their + paths, as well as modules that are missing, or seem to be missing. + """ + print() + print("%-15s %-25s %s" % ("Class", "Name", "File")) + print("%-15s %-25s %s" % ("-----", "----", "----")) + for m in sorted(self.iter_graph(), key=lambda n: n.graphident): + if isinstance(m, AliasNode): + print("%-15s %-25s %s" % (type(m).__name__, m.graphident, m.identifier)) + else: + print("%-15s %-25s %s" % (type(m).__name__, m.graphident, m.filename or "")) + + def _replace_paths_in_code(self, co): + new_filename = original_filename = os.path.normpath(co.co_filename) + for f, r in self.replace_paths: + f = os.path.join(f, '') + r = os.path.join(r, '') + if original_filename.startswith(f): + new_filename = r + original_filename[len(f):] + break + + else: + return co + + consts = list(co.co_consts) + for i in range(len(consts)): + if isinstance(consts[i], type(co)): + consts[i] = self._replace_paths_in_code(consts[i]) + + return co.replace(co_consts=tuple(consts), co_filename=new_filename) diff --git a/venv/Lib/site-packages/PyInstaller/lib/modulegraph/util.py b/venv/Lib/site-packages/PyInstaller/lib/modulegraph/util.py new file mode 100644 index 0000000..dab8c06 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/lib/modulegraph/util.py @@ -0,0 +1,21 @@ +import dis +import inspect + + +def iterate_instructions(code_object): + """Delivers the byte-code instructions as a continuous stream. + + Yields `dis.Instruction`. After each code-block (`co_code`), `None` is + yielded to mark the end of the block and to interrupt the steam. + """ + # The arg extension the EXTENDED_ARG opcode represents is automatically handled by get_instructions() but the + # instruction is left in. Get rid of it to make subsequent parsing easier/safer. + yield from (i for i in dis.get_instructions(code_object) if i.opname != "EXTENDED_ARG") + + yield None + + # For each constant in this code object that is itself a code object, + # parse this constant in the same manner. + for constant in code_object.co_consts: + if inspect.iscode(constant): + yield from iterate_instructions(constant) diff --git a/venv/Lib/site-packages/PyInstaller/loader/__init__.py b/venv/Lib/site-packages/PyInstaller/loader/__init__.py new file mode 100644 index 0000000..792d600 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/loader/__init__.py @@ -0,0 +1 @@ +# diff --git a/venv/Lib/site-packages/PyInstaller/loader/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/loader/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a2d1e28b541e8582caa7f8c7c0d2af0fa3f7d1b GIT binary patch literal 189 zcmZ3^%ge<81gF(}(wTttV-N=h7@>^MY(U0zh7^Wi22Do4l?+87m7hV9zXIH?V)7Dm zV@irjD^v3d3w3i+QW5Q>9f^B&rFC9ys&_n)olqahC*H!tx1er`;lPsW|P~sXGU$&oA%$>+}8bzF#{p zQmF*6_4g->Yt{h3Kb{b**dg=oA_wpkWROuE$~}t8C;|l4A_4e0V_pUVpdN}Va}0$E z$dTs^`SJ*D@G?iB8Vwu>)Piil^n6Gk;;X_j`glkm!c_gcc{UlBMIsWemJE>hfM(=q zSVP1aX6)C@!WxuQtUA`4-ntCGd|ghH)c#pCi@@_Uo;F2?1f* zsz)(e7vjB6X37~={0PYK$3Qs*cRq_AHK>|rYN{aBi3*^g#&%;Z0akD#?7qa`>c{Og6j?#5QB_JF9j zT=Dk8&09ZRTCC1rzwLs{H5By$K10^lPEER;(KOtQ-c&X;`Ruu>vY~6#B-C(uMKw&R zUUwrJ6V@d|GEGX^cL}ag{b7FL#-*htH>Ojvs@!))a-XbJ17TS*NFWUQLfFiE)p(Wg zM7^g_O?5@RX|8K(RhP_l7yBotGd3paI#FepmzE7*8z<_DCM)Wi;ff1>rSp_()D;^N zRW;pIG}UkgPw+A6!)u+du9!`oFq2-F%vFtUxCwSQY8nlNr5QYgeOc9;tTpG)xqMwQ zOj)6Bl&B_cy11q(svA`dPbaXFe8)fGo!991KVSK#qDmVTlWsPNdiU;hosgCFX;ahc zm3!=tl|^N_Vkjn=)}@tSr8QzyZZsEq-6iz%x+cktup*W<%{==>)gy*UCH;)vd@szf z!EDyaxAaq%%ln9p4Es~-atNVr36N+dyyq>9w}ah{0V=d1V?(|JMH`B3D0UNo5?0)M zm{~|$jcsH1YKNb&`H3zdly!zit+}mh-6RYQwJH|3m2fhnPd;NznmG(-d#sboKY3(v zHjH!y5XUUu;S$@+ty-HKW19gB6V~@z*R~rSoO6UkE3tc_Efg3wJ!FZFIMBM-g$OG6 zhc)Nm^c$RgjkCM-N#p6GKOXHHo!n_Vce;b8Y&_M*Q%*Y1s=8`j?T&CL?%F;ZE4x39sBq2N&AGc5smuV&h^5muy^W<5G732FA8;w#s|lvt%cA(oUW1 zLKIEXHZ+4Q?c5<4j#Z>FUYZlK%;8i3#m*8H-5j+0_ DF3Grt literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/loader/__pycache__/pyimod01_archive.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/loader/__pycache__/pyimod01_archive.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e19ddd3f03f296d572be0da67413d2820fb456dd GIT binary patch literal 5354 zcma)AX>1$E6`tiTPw}Qi9llnQV~eqlx^d#zab(CAbtJZ|SV~YcYS$EZB~d1K<=K^F z31mP73BVdDA{YWJAaTK>fa^95&=x5gpy&@LZBd|q$bdnK1%w*yFaM)q2N3+HeKRXw zK7h<}-_FdN_h#nJ%$x7=S1y+WLHg&RbMyacM(Dq!P)X+9%)^f$a}$Y3WD+Q1e3=MC z%ch8le%T01zg&cqxW$SjTC`M@MXVx<*hEvrF0v7a$VHk=XcUR&50Ge)oVQtoK7-dt z5f|lIfoHpI0uH>p9Jk0!p^*JPDNfvHfZiv}`$RSdZ#5AXNe|sXZXyYh0mER4xJma8 z;n+faMY`QUqX^%3w@fRBxY75d1dBYe0D~SYf|4*GmVZId;Jv;^M`uW1bm?E5L z15+~*vt$u1AE4XN<}-MW1WRKVt-!U3ELg{(`yz?>Y@LN9y#5;p4~dvd!u*_q`MT*G zR{6#4E`DIlSc}?L}O~Dc$Q@|cE4XS3>z*sRQxfD-8X>v_l zP-NPtu@Gu6A65CdEXG&jA}mK@jW))TO7uyxhU1djPX$yCrUe5+6C*K_tt4VuvP~Wa zf!;(ZCWV9w52Z{{s_YpQM^LI*6nL4g6v`3Vr&5Z!4N{*~C1*gYL2sQ_&0Z5vp~Y%J zWEwa5%P7sIxLoxRRU1MEZc zIc2VIdxhErd$iV?F45E|^FH%^MxeFTG&IULmeQ6Ki#t-5`u5Kp1=}e1KBMia^{_~s z0!<>Z^fT=vnj1AV+Vv+)+M2d~pH)g(*P*BHw^rJL-C+@l&RTxaSIMWiCq~t<`|5Ws zxMO%4N6kRZ6zWDtk;<)_uCbTUD#M^lh=GT2LY4{LglE_Hkn^03&c|c?QdH9MjACAJznAZcddnoz;|>zDHP!VpZC$ z6XvjztO;<+k|gV#DoIy#lcMUjsc`sBVJbYWa~Rx^&VpjyFThBJ^FyQKXNAe3>FMyr z3FoEh_lyn5J8nW#X1~PK-mznuI|tL=!qk+;YfH`b^B} zw(8KG4I_8O7Npn}VQG!pM>owa>1HEqt<*VSa+QfPf=Z4(@t!nc7nI0V6PM$fAgp)P zc}>H;_E&iQ&{F+5EN}*u+B>t{NAA+TP?js&I_?EpplB;wkh3k{bf9$f<$oQ0>zku* zySAnzI24j#%M9xepK#b7w^4a0a^+i%X_n7{#T0oUnvBS7lX&Mqb1MY zGGbigOs@6Y-qYW7p3ZlkrsAW8;8-y@miLZ*XF>Z9e){7($A0JkQ|ljEzx4gSdhU+Du(!9kx3|#R zS8VMAJB*cIfEm+iQ}Tcq;1MCUy65J0c6Of2qYRZe(z~AFuJ9oHw?S^iWc|CD0UE11 zYTy%RPA{J?Ap=;7NyGJ%gZ$I!Ne7xXrA#7wg2eOuX?%>Drb$M&5;O;ECJF{%5$-U8a{Y3UeDX?ejoqV7>@9ZvfX1i~@ zrERM%*L{ci#o=5}uBX_3q|nk^Z0XI8lv)quxLhE|ZN8Ts%Z}}Ad)mv$WcSs`J*PK2 zTsA`;*={!EZQBawJqPl(11fR-zdSf(Lw9YCp%(UTGXpeMxAur&Y*K#sBG?arO&zqz z)$c)QVx%WQOPWow848V4>Qzd| zR-Mx)NMvt41zjp90BlhQmug@sWqWdrDNZB%Za3A#6s@CDi_jdq0{b&%Qk%7Xwc14j z_i1`suY3q*!|$@;1G8yQ+qLdm4L}*@6O(AZ^#t@u+24n?P21nIuQHYSq-^A}U;lUY zG>5NgI2zMdk~H(qQon+ix3y|^V15CB?9hOq-w7? zx=P0hzD3gb%TT<`&n2Ssq~~e83KP$mxlFACi z4lqPfN=PIIQR8xqxHK3Z2qfaMs1{dbeib5*M08n(i(l;L&nmJOmz8CMN1Yv&0Fajpun;S?yonKN6+E4Gf|>YZ^Hj_Iu29hWxk%2CTF5FlU0P zG1+yPU}Fr?Il=_P>b?$b7lz+H7uKECipe)eb$7KiF$HDZMLIE)1p?F+zA!@Ft==>a^TL|pdmZ>7X~a=z z$HEHeW;zMormZbO$D*V=X+;GF?Un$u&1(y|hX}K<#yTUZB=VrEMTvortdg-G*V~_V z-@B|Bh^arL=&0;PzLrhfP3H~g)^x$!RrGdc&7~%9_VrSrb>moR;8?-do3(B9=A31V z%kJLxwQPu+a!xGxjud@Izzw^4@8FWxf75!yO5n|lcV-H0Ckoz^MeoVH_hc#9Mo`UG zq7Xb%3?A8F!Be|>sTd^>h=NCi)assPwTAe6P*1o0`||t8zSMvizk+|f=pX;b)x2{O zdfX|qM1o{s3W2Oc9ff7N-Ezi){`}I=N%n5P6S8+tazlgGyMrv`zhW53e`TV1OV^nm z_N(3@bhZzD-RBtgvR@x>9&Td)+GK`&$TTq$Vn#xCOae4aU^FJ1MYjrq2nbui#CPI8 zQbjPj7LO$*_}@UJH$Q%pFq;UW|CmrnKpZS4h~1MUaDf7YHmd!<4%a_Q$nr`eM-okp-%}l zW#|KjW7_km&G_959xeu7BiJ4VV0#3bGoF&in{k%BzKpBn^Jm;;3&Yr9yFEoVQV&S& XqZ-S0nPI@T&!!J({iEk_sp0<*G( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/loader/__pycache__/pyimod02_importers.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/loader/__pycache__/pyimod02_importers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b19a03a5ac43efd79e056a564687aa16ea2f7a43 GIT binary patch literal 32093 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/loader/__pycache__/pyimod03_ctypes.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/loader/__pycache__/pyimod03_ctypes.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a240a6151cc6ed8cc1e7b18e3020232389eb24b9 GIT binary patch literal 6962 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 BBY6M- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/loader/__pycache__/pyimod04_pywin32.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/loader/__pycache__/pyimod04_pywin32.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7640fbf4032c9b3899c20e422dd060fe9e797cb2 GIT binary patch literal 2008 zcmb7FO=ufO6rNp;ek|FQ?Zk~mopefF1-Z7ACV{l6{si2@qGBw6jx=2;RvWB9YL8Zt{D#?yM$eOyuC>2emKuKQH z?zNCC9{h{Pb2H1SJ1{If@a`fA7D5!NNETO71trlIu(w?t0zQQLGQQcyAhaO3n@u-) zF2k8CXbTYAZIpma-vQu|Huvk;=&=A^oWTvN}~=- zZErXI2YLsqqhElS4&fF8F7hR~Lmn-3xwuWIA>Exj%U&5BiBqhI%u^AnVzIx{88b9; zb1cJD5jm{_x+5=bd$M;N(+X(<1cliXoyYoOEqa3uv z$D@#P*tz3S8QVp1Wqj^%qg`l7Pe&QQ5ZA}j=xY@7+M>p6%+HgJ7c`}4dsvy-fy{@K zQ#04nX>eJLpR;>g=PW}Xm>CXc+&CfoA6>sZSCk5Krco->;{E$@erPs7W@?%`w@8bN zb17whjwvP`)1~Y^DM#7dOnC~9m87cFNHh;!LN6aAyb_RIcfr#6P34!y`eS8ErOR%EgsnQQ}g z0gpOT&pX~p{R}KxsekkTrT%CSe)mR2fJ6_ck->X5<}rA?8oW1bufk--h>1pz%W7rR z2y;d+kpGN&5CH6LAUx`H^VuB!$@p>U=jspDU+!2}Z`ZHh2L6+iZMo40_=8fiGF)zj z3+HV-bM4NJShv9&yXl<|%1n!L(_emKjBZYNer%tl>malHBw5bLs+xf~Xx7w>vh9b0 zD~1L=l%uBYclw0tF^}DMtbObOm*u+Qw3TC?@jH_c;-td%w`y;k0d7CM>~A0|s1ZPs zL=6w@G>iU;2F0}o^*U@h)5*!m`w+Y}n6ASX5B!Gxt2aKs_35qJ$+s*Vt>b77NB4Z_ z^y|;AZ={~4zCH2HQ0>x`H8foxny%rz5x*Je+tE-5j<;XX~M}E6JTu zxPd(0_jba=Yj_R+9v*&SJYTlL?|h%M!tbu(oyh6WK3JVzTeR@2HRo|E7{j(dlaaM- zCetjCQ#YO+r_CIUle+!Dc=I1?!XO~!7Y*aLQNtq$LZja!U@#9Ph=kxu7ys>`;EMBW O_@cs@20Bihum1x{0KTsP literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py b/venv/Lib/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py new file mode 100644 index 0000000..b0da1dd --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py @@ -0,0 +1,95 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +#-- Start bootstrap process +# Only python built-in modules can be used. + +import sys + +import pyimod02_importers + +# Extend Python import machinery by adding PEP302 importers to sys.meta_path. +pyimod02_importers.install() + +#-- Bootstrap process is complete. +# We can use other python modules (e.g. os) + +import os # noqa: E402 + +# Let other python modules know that the code is running in frozen mode. +if not hasattr(sys, 'frozen'): + sys.frozen = True + +# sys._MEIPASS is now set in the bootloader. Hooray. + +# Python 3 C-API function Py_SetPath() resets sys.prefix to empty string. Python 2 was using PYTHONHOME for sys.prefix. +# Let's do the same for Python 3. +sys.prefix = sys._MEIPASS +sys.exec_prefix = sys.prefix + +# Python 3.3+ defines also sys.base_prefix. Let's set them too. +sys.base_prefix = sys.prefix +sys.base_exec_prefix = sys.exec_prefix + +# Some packages behave differently when running inside virtual environment. E.g., IPython tries to append path +# VIRTUAL_ENV to sys.path. For the frozen app we want to prevent this behavior. +VIRTENV = 'VIRTUAL_ENV' +if VIRTENV in os.environ: + # On some platforms (e.g., AIX) 'os.unsetenv()' is unavailable and deleting the var from os.environ does not + # delete it from the environment. + os.environ[VIRTENV] = '' + del os.environ[VIRTENV] + +# Ensure sys.path contains absolute paths. Otherwise, import of other python modules will fail when current working +# directory is changed by the frozen application. +python_path = [] +for pth in sys.path: + python_path.append(os.path.abspath(pth)) + sys.path = python_path + +# At least on Windows, Python seems to hook up the codecs on this import, so it is not enough to just package up all +# the encodings. +# +# It was also reported that without 'encodings' module, the frozen executable fails to load in some configurations: +# http://www.pyinstaller.org/ticket/651 +# +# Importing 'encodings' module in a run-time hook is not enough, since some run-time hooks require this module, and the +# order of running the code from the run-time hooks is not defined. +try: + import encodings # noqa: F401 +except ImportError: + pass + +# In the Python interpreter 'warnings' module is imported when 'sys.warnoptions' is not empty. Mimic this behavior. +if sys.warnoptions: + import warnings # noqa: F401 + +# Install the hooks for ctypes +import pyimod03_ctypes # noqa: E402 + +pyimod03_ctypes.install() + +# Install the hooks for pywin32 (Windows only) +if sys.platform.startswith('win'): + import pyimod04_pywin32 + pyimod04_pywin32.install() + +# Apply a hack for metadata that was collected from (unzipped) python eggs; the EGG-INFO directories are collected into +# their parent directories (my_package-version.egg/EGG-INFO), and for metadata to be discoverable by +# `importlib.metadata`, the .egg directory needs to be in `sys.path`. The deprecated `pkg_resources` does not have this +# limitation, and seems to work as long as the .egg directory's parent directory (in our case `sys._MEIPASS` is in +# `sys.path`. +for entry in os.listdir(sys._MEIPASS): + entry = os.path.join(sys._MEIPASS, entry) + if not os.path.isdir(entry): + continue + if entry.endswith('.egg'): + sys.path.append(entry) diff --git a/venv/Lib/site-packages/PyInstaller/loader/pyimod01_archive.py b/venv/Lib/site-packages/PyInstaller/loader/pyimod01_archive.py new file mode 100644 index 0000000..f74d468 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/loader/pyimod01_archive.py @@ -0,0 +1,135 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +# **NOTE** This module is used during bootstrap. +# Import *ONLY* builtin modules or modules that are collected into the base_library.zip archive. +# List of built-in modules: sys.builtin_module_names +# List of modules collected into base_library.zip: PyInstaller.compat.PY3_BASE_MODULES + +import os +import struct +import marshal +import zlib + +# In Python3, the MAGIC_NUMBER value is available in the importlib module. However, in the bootstrap phase we cannot use +# importlib directly, but rather its frozen variant. +import _frozen_importlib + +PYTHON_MAGIC_NUMBER = _frozen_importlib._bootstrap_external.MAGIC_NUMBER + +# Type codes for PYZ PYZ entries +PYZ_ITEM_MODULE = 0 +PYZ_ITEM_PKG = 1 +PYZ_ITEM_DATA = 2 # deprecated; PYZ does not contain any data entries anymore +PYZ_ITEM_NSPKG = 3 # PEP-420 namespace package + + +class ArchiveReadError(RuntimeError): + pass + + +class ZlibArchiveReader: + """ + Reader for PyInstaller's PYZ (ZlibArchive) archive. The archive is used to store collected byte-compiled Python + modules, as individually-compressed entries. + """ + _PYZ_MAGIC_PATTERN = b'PYZ\0' + + def __init__(self, filename, start_offset=None, check_pymagic=False): + self._filename = filename + self._start_offset = start_offset + + self.toc = {} + + # If no offset is given, try inferring it from filename + if start_offset is None: + self._filename, self._start_offset = self._parse_offset_from_filename(filename) + + # Parse header and load TOC. Standard header contains 12 bytes: PYZ magic pattern, python bytecode magic + # pattern, and offset to TOC (32-bit integer). It might be followed by additional fields, depending on + # implementation version. + with open(self._filename, "rb") as fp: + # Read PYZ magic pattern, located at the start of the file + fp.seek(self._start_offset, os.SEEK_SET) + + magic = fp.read(len(self._PYZ_MAGIC_PATTERN)) + if magic != self._PYZ_MAGIC_PATTERN: + raise ArchiveReadError("PYZ magic pattern mismatch!") + + # Read python magic/version number + pymagic = fp.read(len(PYTHON_MAGIC_NUMBER)) + if check_pymagic and pymagic != PYTHON_MAGIC_NUMBER: + raise ArchiveReadError("Python magic pattern mismatch!") + + # Read TOC offset + toc_offset, *_ = struct.unpack('!i', fp.read(4)) + + # Load TOC + fp.seek(self._start_offset + toc_offset, os.SEEK_SET) + self.toc = dict(marshal.load(fp)) + + @staticmethod + def _parse_offset_from_filename(filename): + """ + Parse the numeric offset from filename, stored as: `/path/to/file?offset`. + """ + offset = 0 + + idx = filename.rfind('?') + if idx == -1: + return filename, offset + + try: + offset = int(filename[idx + 1:]) + filename = filename[:idx] # Remove the offset from filename + except ValueError: + # Ignore spurious "?" in the path (for example, like in Windows UNC \\?\). + pass + + return filename, offset + + def extract(self, name, raw=False): + """ + Extract data from entry with the given name. + + If the entry belongs to a module or a package, the data is loaded (unmarshaled) into code object. To retrieve + raw data, set `raw` flag to True. + """ + # Look up entry + entry = self.toc.get(name) + if entry is None: + return None + typecode, entry_offset, entry_length = entry + + # Read data blob + try: + with open(self._filename, "rb") as fp: + fp.seek(self._start_offset + entry_offset) + obj = fp.read(entry_length) + except FileNotFoundError: + # We open the archive file each time we need to read from it, to avoid locking the file by keeping it open. + # This allows executable to be deleted or moved (renamed) while it is running, which is useful in certain + # scenarios (e.g., automatic update that replaces the executable). The caveat is that once the executable is + # renamed, we cannot read from its embedded PYZ archive anymore. In such case, exit with informative + # message. + raise SystemExit( + f"{self._filename} appears to have been moved or deleted since this application was launched. " + "Continouation from this state is impossible. Exiting now." + ) + + try: + obj = zlib.decompress(obj) + if typecode in (PYZ_ITEM_MODULE, PYZ_ITEM_PKG, PYZ_ITEM_NSPKG) and not raw: + obj = marshal.loads(obj) + except EOFError as e: + raise ImportError(f"Failed to unmarshal PYZ entry {name!r}!") from e + + return obj diff --git a/venv/Lib/site-packages/PyInstaller/loader/pyimod02_importers.py b/venv/Lib/site-packages/PyInstaller/loader/pyimod02_importers.py new file mode 100644 index 0000000..a3844ab --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/loader/pyimod02_importers.py @@ -0,0 +1,702 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +PEP-302 and PEP-451 importers for frozen applications. +""" + +# **NOTE** This module is used during bootstrap. +# Import *ONLY* builtin modules or modules that are collected into the base_library.zip archive. +# List of built-in modules: sys.builtin_module_names +# List of modules collected into base_library.zip: PyInstaller.compat.PY3_BASE_MODULES + +import sys +import os +import io + +import _frozen_importlib +import _thread + +import pyimod01_archive + +if sys.flags.verbose and sys.stderr: + + def trace(msg, *a): + sys.stderr.write(msg % a) + sys.stderr.write("\n") +else: + + def trace(msg, *a): + pass + + +def _decode_source(source_bytes): + """ + Decode bytes representing source code and return the string. Universal newline support is used in the decoding. + Based on CPython's implementation of the same functionality: + https://github.com/python/cpython/blob/3.9/Lib/importlib/_bootstrap_external.py#L679-L688 + """ + # Local import to avoid including `tokenize` and its dependencies in `base_library.zip` + from tokenize import detect_encoding + source_bytes_readline = io.BytesIO(source_bytes).readline + encoding = detect_encoding(source_bytes_readline) + newline_decoder = io.IncrementalNewlineDecoder(decoder=None, translate=True) + return newline_decoder.decode(source_bytes.decode(encoding[0])) + + +# Global instance of PYZ archive reader. Initialized by install(). +pyz_archive = None + +# Some runtime hooks might need to traverse available frozen package/module hierarchy to simulate filesystem. +# Such traversals can be efficiently implemented using a prefix tree (trie), whose computation we defer until first +# access. +_pyz_tree_lock = _thread.RLock() +_pyz_tree = None + + +def get_pyz_toc_tree(): + global _pyz_tree + + with _pyz_tree_lock: + if _pyz_tree is None: + _pyz_tree = _build_pyz_prefix_tree(pyz_archive) + return _pyz_tree + + +# Fully resolve sys._MEIPASS, so we can compare fully-resolved paths to it. +_RESOLVED_TOP_LEVEL_DIRECTORY = os.path.realpath(sys._MEIPASS) + +# If we are running as macOS .app bundle, compute the alternative top-level directory path as well. +_is_macos_app_bundle = False +if sys.platform == 'darwin' and _RESOLVED_TOP_LEVEL_DIRECTORY.endswith("Contents/Frameworks"): + _is_macos_app_bundle = True + _ALTERNATIVE_TOP_LEVEL_DIRECTORY = os.path.join( + os.path.dirname(_RESOLVED_TOP_LEVEL_DIRECTORY), + 'Resources', + ) + + +# Helper for computing PYZ prefix tree +def _build_pyz_prefix_tree(pyz_archive): + tree = dict() + for entry_name, entry_data in pyz_archive.toc.items(): + name_components = entry_name.split('.') + typecode = entry_data[0] + current = tree + if typecode in {pyimod01_archive.PYZ_ITEM_PKG, pyimod01_archive.PYZ_ITEM_NSPKG}: + # Package; create new dictionary node for its modules + for name_component in name_components: + current = current.setdefault(name_component, {}) + else: + # Module; create the leaf node (empty string) + for name_component in name_components[:-1]: + current = current.setdefault(name_component, {}) + current[name_components[-1]] = '' + return tree + + +class PyiFrozenImporter: + """ + PyInstaller's frozen module importer (finder + loader) for specific search path. + + Per-path instances allow us to properly translate the given module name ("fullname") into full PYZ entry name. + For example, with search path being `sys._MEIPASS`, the module "mypackage.mod" would translate to "mypackage.mod" + in the PYZ archive. However, if search path was `sys._MEIPASS/myotherpackage/_vendored` (for example, if + `myotherpacakge` added this path to `sys.path`), then "mypackage.mod" would need to translate to + "myotherpackage._vendored.mypackage.mod" in the PYZ archive. + """ + def __repr__(self): + return f"{self.__class__.__name__}({self._path})" + + @classmethod + def path_hook(cls, path): + trace(f"PyInstaller: running path finder hook for path: {path!r}") + try: + finder = cls(path) + trace("PyInstaller: hook succeeded") + return finder + except Exception as e: + trace(f"PyInstaller: hook failed: {e}") + raise + + @staticmethod + def _compute_relative_path(path, top_level): + try: + relative_path = os.path.relpath(path, top_level) + except ValueError as e: + raise ImportError("Path outside of top-level application directory") from e + + if relative_path.startswith('..'): + raise ImportError("Path outside of top-level application directory") + + return relative_path + + def __init__(self, path): + self._path = path # Store original path, as given. + self._pyz_archive = pyz_archive + + # Resolve path for comparison + resolved_path = os.path.realpath(path) + + # Compare resolved path to resolved top-level application directory. + try: + relative_path = self._compute_relative_path(resolved_path, _RESOLVED_TOP_LEVEL_DIRECTORY) + except Exception: + if _is_macos_app_bundle: + relative_path = self._compute_relative_path(resolved_path, _ALTERNATIVE_TOP_LEVEL_DIRECTORY) + else: + raise + + # Ensure that path does not point to a file on filesystem. Strictly speaking, we should be checking that the + # given path is a valid directory, but that would need to check both PYZ and filesystem. So for now, limit the + # check to catch paths pointing to file, because that breaks `runpy.run_path()`, as per #8767. + if os.path.isfile(path): + raise ImportError("only directories are supported") + + if relative_path == '.': + self._pyz_entry_prefix = '' + else: + self._pyz_entry_prefix = '.'.join(relative_path.split(os.path.sep)) + + def _compute_pyz_entry_name(self, fullname): + """ + Convert module fullname into PYZ entry name, subject to the prefix implied by this finder's search path. + """ + tail_module = fullname.rpartition('.')[2] + + if self._pyz_entry_prefix: + return self._pyz_entry_prefix + "." + tail_module + else: + return tail_module + + @property + def fallback_finder(self): + """ + Opportunistically create a *fallback finder* using `sys.path_hooks` entries that are located *after* our hook. + The main goal of this exercise is to obtain an instance of python's FileFinder, but in theory any other hook + that comes after ours is eligible to be a fallback. + + Having this fallback allows our finder to "cooperate" with python's FileFinder, as if the two were a single + finder, which allows us to work around the python's PathFinder permitting only one finder instance per path + without subclassing FileFinder. + """ + if hasattr(self, '_fallback_finder'): + return self._fallback_finder + + # Try to instantiate fallback finder + our_hook_found = False + + self._fallback_finder = None + for idx, hook in enumerate(sys.path_hooks): + if hook == self.path_hook: + our_hook_found = True + continue # Our hook + + if not our_hook_found: + continue # Skip hooks before our hook + + try: + self._fallback_finder = hook(self._path) + break + except ImportError: + pass + + return self._fallback_finder + + def _find_fallback_spec(self, fullname, target): + """ + Attempt to find the spec using fallback finder, which is opportunistically created here. Typically, this would + be python's FileFinder, which can discover specs for on-filesystem modules, such as extension modules and + modules that are collected only as source .py files. + + Having this fallback allows our finder to "cooperate" with python's FileFinder, as if the two were a single + finder, which allows us to work around the python's PathFinder permitting only one finder instance per path + without subclassing FileFinder. + """ + if not hasattr(self, '_fallback_finder'): + self._fallback_finder = self._get_fallback_finder() + + if self._fallback_finder is None: + return None + + return self._fallback_finder.find_spec(fullname, target) + + #-- Core PEP451 finder functionality, modeled after importlib.abc.PathEntryFinder + # https://docs.python.org/3/library/importlib.html#importlib.abc.PathEntryFinder + def invalidate_caches(self): + """ + A method which, when called, should invalidate any internal cache used by the finder. Used by + importlib.invalidate_caches() when invalidating the caches of all finders on sys.meta_path. + + https://docs.python.org/3/library/importlib.html#importlib.abc.MetaPathFinder.invalidate_caches + """ + # We do not use any caches, but if we have created a fallback finder, propagate the function call. + # NOTE: use getattr() with _fallback_finder attribute, in order to avoid unnecessary creation of the + # fallback finder in case when it does not exist yet. + fallback_finder = getattr(self, '_fallback_finder', None) + if fallback_finder is not None: + if hasattr(fallback_finder, 'invalidate_caches'): + fallback_finder.invalidate_caches() + + def find_spec(self, fullname, target=None): + """ + A method for finding a spec for the specified module. The finder will search for the module only within the + path entry to which it is assigned. If a spec cannot be found, None is returned. When passed in, target is a + module object that the finder may use to make a more educated guess about what spec to return. + + https://docs.python.org/3/library/importlib.html#importlib.abc.PathEntryFinder.find_spec + """ + trace(f"{self}: find_spec: called with fullname={fullname!r}, target={fullname!r}") + + # Convert fullname to PYZ entry name. + pyz_entry_name = self._compute_pyz_entry_name(fullname) + + # Try looking up the entry in the PYZ archive + entry_data = self._pyz_archive.toc.get(pyz_entry_name) + if entry_data is None: + # Entry not found - try using fallback finder (for example, python's own FileFinder) to resolve on-disk + # resources, such as extension modules and modules that are collected only as source .py files. + trace(f"{self}: find_spec: {fullname!r} not found in PYZ...") + + if self.fallback_finder is not None: + trace(f"{self}: find_spec: attempting resolve using fallback finder {self.fallback_finder!r}.") + fallback_spec = self.fallback_finder.find_spec(fullname, target) + trace(f"{self}: find_spec: fallback finder returned spec: {fallback_spec!r}.") + return fallback_spec + else: + trace(f"{self}: find_spec: fallback finder is not available.") + + return None + + # Entry found + typecode = entry_data[0] + trace(f"{self}: find_spec: found {fullname!r} in PYZ as {pyz_entry_name!r}, typecode={typecode}") + + if typecode == pyimod01_archive.PYZ_ITEM_NSPKG: + # PEP420 namespace package + # We can use regular list for submodule_search_locations; the caller (i.e., python's PathFinder) takes care + # of constructing _NamespacePath from it. + spec = _frozen_importlib.ModuleSpec(fullname, None) + spec.submodule_search_locations = [ + # NOTE: since we are using sys._MEIPASS as prefix, we need to construct path from resolved PYZ entry + # name (equivalently, we could combine `self._path` and last part of `fullname`). + os.path.join(sys._MEIPASS, pyz_entry_name.replace('.', os.path.sep)), + ] + return spec + + # Resolve full filename, as if the module/package was located on filesystem. + origin = self.get_filename(fullname) + is_package = typecode == pyimod01_archive.PYZ_ITEM_PKG + + spec = _frozen_importlib.ModuleSpec( + fullname, + self, # loader + is_package=is_package, + origin=origin, + ) + + # Make the import machinery set __file__. + # PEP 451 says: "has_location" is true if the module is locatable. In that case the spec's origin is used + # as the location and __file__ is set to spec.origin. If additional location information is required + # (e.g., zipimport), that information may be stored in spec.loader_state. + spec.has_location = True + + # Set submodule_search_locations for packages. Seems to be required for importlib_resources from 3.2.0; + # see issue #5395. + if is_package: + spec.submodule_search_locations = [os.path.dirname(origin)] + + return spec + + # The following methods are part of legacy PEP302 finder interface. They have been deprecated since python 3.4, + # and removed in python 3.12. Provide compatibility shims to accommodate code that might still be using them. + if sys.version_info[:2] < (3, 12): + + def find_loader(self, fullname): + """ + A legacy method for finding a loader for the specified module. Returns a 2-tuple of (loader, portion) where + portion is a sequence of file system locations contributing to part of a namespace package. The loader may + be None while specifying portion to signify the contribution of the file system locations to a namespace + package. An empty list can be used for portion to signify the loader is not part of a namespace package. If + loader is None and portion is the empty list then no loader or location for a namespace package were found + (i.e. failure to find anything for the module). + + Deprecated since python 3.4, removed in 3.12. + """ + # Based on: + # https://github.com/python/cpython/blob/v3.11.9/Lib/importlib/_bootstrap_external.py#L1587-L1600 + spec = self.find_spec(fullname) + if spec is None: + return None, [] + return spec.loader, spec.submodule_search_locations or [] + + def find_module(self, fullname): + """ + A concrete implementation of Finder.find_module() which is equivalent to self.find_loader(fullname)[0]. + + Deprecated since python 3.4, removed in 3.12. + """ + # Based on: + # https://github.com/python/cpython/blob/v3.11.9/Lib/importlib/_bootstrap_external.py#L1585 + # https://github.com/python/cpython/blob/v3.11.9/Lib/importlib/_bootstrap_external.py#L622-L639 + # + loader, portions = self.find_loader(fullname) + return loader + + #-- Core PEP451 loader functionality as defined by importlib.abc.Loader + # https://docs.python.org/3/library/importlib.html#importlib.abc.Loader + def create_module(self, spec): + """ + A method that returns the module object to use when importing a module. This method may return None, indicating + that default module creation semantics should take place. + + https://docs.python.org/3/library/importlib.html#importlib.abc.Loader.create_module + """ + return None + + def exec_module(self, module): + """ + A method that executes the module in its own namespace when a module is imported or reloaded. The module + should already be initialized when exec_module() is called. When this method exists, create_module() + must be defined. + + https://docs.python.org/3/library/importlib.html#importlib.abc.Loader.exec_module + """ + spec = module.__spec__ + bytecode = self.get_code(spec.name) + if bytecode is None: + raise RuntimeError(f"Failed to retrieve bytecode for {spec.name!r}!") + + # Set by the import machinery + assert hasattr(module, '__file__') + + # If `submodule_search_locations` is not None, this is a package; set __path__. + if spec.submodule_search_locations is not None: + module.__path__ = spec.submodule_search_locations + + exec(bytecode, module.__dict__) + + # The following method is part of legacy PEP302 loader interface. It has been deprecated since python 3.4, and + # slated for removal in python 3.12, although that has not happened yet. Provide compatibility shim to accommodate + # code that might still be using it. + if True: + + def load_module(self, fullname): + """ + A legacy method for loading a module. If the module cannot be loaded, ImportError is raised, otherwise the + loaded module is returned. + + Deprecated since python 3.4, slated for removal in 3.12 (but still present in python's own FileLoader in + both v3.12.4 and v3.13.0rc1). + """ + # Based on: + # https://github.com/python/cpython/blob/v3.11.9/Lib/importlib/_bootstrap_external.py#L942-L945 + import importlib._bootstrap as _bootstrap + return _bootstrap._load_module_shim(self, fullname) + + #-- PEP302 protocol extensions as defined by importlib.abc.ExecutionLoader + # https://docs.python.org/3/library/importlib.html#importlib.abc.ExecutionLoader + def get_filename(self, fullname): + """ + A method that is to return the value of __file__ for the specified module. If no path is available, ImportError + is raised. + + If source code is available, then the method should return the path to the source file, regardless of whether a + bytecode was used to load the module. + + https://docs.python.org/3/library/importlib.html#importlib.abc.ExecutionLoader.get_filename + """ + # Resolve fullname -> PYZ entry name (in case custom search path is in effect) + pyz_entry_name = self._compute_pyz_entry_name(fullname) + + # Look up the PYZ entry + entry_data = self._pyz_archive.toc.get(pyz_entry_name) + if entry_data is None: + raise ImportError(f'Module {fullname!r} not found in PYZ archive (entry {pyz_entry_name!r}).') + typecode = entry_data[0] + + # NOTE: since we are using sys._MEIPASS as prefix, we need to construct path from resolved PYZ entry name + # (equivalently, we could combine `self._path` and last part of `fullname`). + if typecode == pyimod01_archive.PYZ_ITEM_PKG: + return os.path.join(sys._MEIPASS, pyz_entry_name.replace('.', os.path.sep), '__init__.pyc') + elif typecode == pyimod01_archive.PYZ_ITEM_MODULE: + return os.path.join(sys._MEIPASS, pyz_entry_name.replace('.', os.path.sep) + '.pyc') + + # Unsupported entry type + return None + + #-- PEP302 protocol extensions as defined by importlib.abc.InspectLoader + # https://docs.python.org/3/library/importlib.html#importlib.abc.InspectLoader + def get_code(self, fullname): + """ + Return the code object for a module, or None if the module does not have a code object (as would be the case, + for example, for a built-in module). Raise an ImportError if loader cannot find the requested module. + + https://docs.python.org/3/library/importlib.html#importlib.abc.InspectLoader.get_code + """ + # Resolve fullname -> PYZ entry name (in case custom search path is in effect) + pyz_entry_name = self._compute_pyz_entry_name(fullname) + + # Look up the PYZ entry - so we can raise ImportError for non-existing modules. + entry_data = self._pyz_archive.toc.get(pyz_entry_name) + if entry_data is None: + raise ImportError(f'Module {fullname!r} not found in PYZ archive (entry {pyz_entry_name!r}).') + + return self._pyz_archive.extract(pyz_entry_name) + + def get_source(self, fullname): + """ + A method to return the source of a module. It is returned as a text string using universal newlines, translating + all recognized line separators into '\n' characters. Returns None if no source is available (e.g. a built-in + module). Raises ImportError if the loader cannot find the module specified. + + https://docs.python.org/3/library/importlib.html#importlib.abc.InspectLoader.get_source + """ + # Use getfilename() to obtain path to file if it were located on filesystem. This implicitly checks that the + # fullname is valid. + filename = self.get_filename(fullname) + + # FIXME: according to python docs "if source code is available, then the [getfilename()] method should return + # the path to the source file, regardless of whether a bytecode was used to load the module.". At the moment, + # our implementation always returns pyc suffix. + filename = filename[:-1] + + try: + # Read in binary mode, then decode + with open(filename, 'rb') as fp: + source_bytes = fp.read() + return _decode_source(source_bytes) + except FileNotFoundError: + pass + + # Source code is unavailable. + return None + + def is_package(self, fullname): + """ + A method to return a true value if the module is a package, a false value otherwise. ImportError is raised if + the loader cannot find the module. + + https://docs.python.org/3/library/importlib.html#importlib.abc.InspectLoader.is_package + """ + # Resolve fullname -> PYZ entry name (in case custom search path is in effect) + pyz_entry_name = self._compute_pyz_entry_name(fullname) + + # Look up the PYZ entry - so we can raise ImportError for non-existing modules. + entry_data = self._pyz_archive.toc.get(pyz_entry_name) + if entry_data is None: + raise ImportError(f'Module {fullname!r} not found in PYZ archive (entry {pyz_entry_name!r}).') + typecode = entry_data[0] + + # We do not need to worry about PEP420 namespace package entries (pyimod01_archive.PYZ_ITEM_NSPKG) here, because + # namespace packages do not use the loader part of this importer. + return typecode == pyimod01_archive.PYZ_ITEM_PKG + + #-- PEP302 protocol extensions as dfined by importlib.abc.ResourceLoader + # https://docs.python.org/3/library/importlib.html#importlib.abc.ResourceLoader + def get_data(self, path): + """ + A method to return the bytes for the data located at path. Loaders that have a file-like storage back-end that + allows storing arbitrary data can implement this abstract method to give direct access to the data stored. + OSError is to be raised if the path cannot be found. The path is expected to be constructed using a module’s + __file__ attribute or an item from a package’s __path__. + + https://docs.python.org/3/library/importlib.html#importlib.abc.ResourceLoader.get_data + """ + # Try to fetch the data from the filesystem. Since __file__ attribute works properly, just try to open the file + # and read it. + with open(path, 'rb') as fp: + return fp.read() + + #-- Support for `importlib.resources`. + def get_resource_reader(self, fullname): + """ + Return resource reader compatible with `importlib.resources`. + """ + # Resolve fullname -> PYZ entry name (in case custom search path is in effect) + pyz_entry_name = self._compute_pyz_entry_name(fullname) + + return PyiFrozenResourceReader(self, pyz_entry_name) + + +class PyiFrozenResourceReader: + """ + Resource reader for importlib.resources / importlib_resources support. + + Supports only on-disk resources, which should cover the typical use cases, i.e., the access to data files; + PyInstaller collects data files onto filesystem, and as of v6.0.0, the embedded PYZ archive is guaranteed + to contain only .pyc modules. + + When listing resources, source .py files will not be listed as they are not collected by default. Similarly, + sub-directories that contained only .py files are not reconstructed on filesystem, so they will not be listed, + either. If access to .py files is required for whatever reason, they need to be explicitly collected as data files + anyway, which will place them on filesystem and make them appear as resources. + + For on-disk resources, we *must* return path compatible with pathlib.Path() in order to avoid copy to a temporary + file, which might break under some circumstances, e.g., metpy with importlib_resources back-port, due to: + https://github.com/Unidata/MetPy/blob/a3424de66a44bf3a92b0dcacf4dff82ad7b86712/src/metpy/plots/wx_symbols.py#L24-L25 + (importlib_resources tries to use 'fonts/wx_symbols.ttf' as a temporary filename suffix, which fails as it contains + a separator). + + Furthermore, some packages expect files() to return either pathlib.Path or zipfile.Path, e.g., + https://github.com/tensorflow/datasets/blob/master/tensorflow_datasets/core/utils/resource_utils.py#L81-L97 + This makes implementation of mixed support for on-disk and embedded resources using importlib.abc.Traversable + protocol rather difficult. + + So in order to maximize compatibility with unfrozen behavior, the below implementation is basically equivalent of + importlib.readers.FileReader from python 3.10: + https://github.com/python/cpython/blob/839d7893943782ee803536a47f1d4de160314f85/Lib/importlib/readers.py#L11 + and its underlying classes, importlib.abc.TraversableResources and importlib.abc.ResourceReader: + https://github.com/python/cpython/blob/839d7893943782ee803536a47f1d4de160314f85/Lib/importlib/abc.py#L422 + https://github.com/python/cpython/blob/839d7893943782ee803536a47f1d4de160314f85/Lib/importlib/abc.py#L312 + """ + def __init__(self, importer, name): + # Local import to avoid including `pathlib` and its dependencies in `base_library.zip` + from pathlib import Path + self.importer = importer + if self.importer.is_package(name): # covers both normal packages and PEP-420 namespace packages + self.path = Path(sys._MEIPASS).joinpath(*name.split('.')) + else: + # For modules, we should return the path to their parent (package) directory. + self.path = Path(sys._MEIPASS).joinpath(*name.split('.')[:-1]) + + def open_resource(self, resource): + return self.files().joinpath(resource).open('rb') + + def resource_path(self, resource): + return str(self.path.joinpath(resource)) + + def is_resource(self, path): + return self.files().joinpath(path).is_file() + + def contents(self): + return (item.name for item in self.files().iterdir()) + + def files(self): + return self.path + + +class PyiFrozenEntryPointLoader: + """ + A special loader that enables retrieval of the code-object for the __main__ module. + """ + def __repr__(self): + return self.__class__.__name__ + + def get_code(self, fullname): + if fullname == '__main__': + # Special handling for __main__ module; the bootloader should store code object to _pyi_main_co + # attribute of the module. + return sys.modules['__main__']._pyi_main_co + + raise ImportError(f'{self} cannot handle module {fullname!r}') + + +def install(): + """ + Install PyInstaller's frozen finders/loaders/importers into python's import machinery. + """ + # Setup PYZ archive reader. + # + # The bootloader should store the path to PYZ archive (the path to the PKG archive and the offset within it; for + # executable-embedded archive, this is for example /path/executable_name?117568) into _pyinstaller_pyz + # attribute of the sys module. + global pyz_archive + + if not hasattr(sys, '_pyinstaller_pyz'): + raise RuntimeError("Bootloader did not set sys._pyinstaller_pyz!") + + try: + pyz_archive = pyimod01_archive.ZlibArchiveReader(sys._pyinstaller_pyz, check_pymagic=True) + except Exception as e: + raise RuntimeError("Failed to setup PYZ archive reader!") from e + + delattr(sys, '_pyinstaller_pyz') + + # On Windows, there is finder called `_frozen_importlib.WindowsRegistryFinder`, which looks for Python module + # locations in Windows registry. The frozen application should not look for those, so remove this finder + # from `sys.meta_path`. + for entry in sys.meta_path: + if getattr(entry, '__name__', None) == 'WindowsRegistryFinder': + sys.meta_path.remove(entry) + break + + # Insert our hook for `PyiFrozenImporter` into `sys.path_hooks`. Place it after `zipimporter`, if available. + for idx, entry in enumerate(sys.path_hooks): + if getattr(entry, '__name__', None) == 'zipimporter': + trace(f"PyInstaller: inserting our finder hook at index {idx + 1} in sys.path_hooks.") + sys.path_hooks.insert(idx + 1, PyiFrozenImporter.path_hook) + break + else: + trace("PyInstaller: zipimporter hook not found in sys.path_hooks! Prepending our finder hook to the list.") + sys.path_hooks.insert(0, PyiFrozenImporter.path_hook) + + # Python might have already created a `FileFinder` for `sys._MEIPASS`. Remove the entry from path importer cache, + # so that next loading attempt creates `PyiFrozenImporter` instead. This could probably be avoided altogether if + # we refrained from adding `sys._MEIPASS` to `sys.path` until our importer hooks is in place. + sys.path_importer_cache.pop(sys._MEIPASS, None) + + # Set the PyiFrozenEntryPointLoader as loader for __main__, in order for python to treat __main__ as a module + # instead of a built-in, and to allow its code object to be retrieved. + try: + sys.modules['__main__'].__loader__ = PyiFrozenEntryPointLoader() + except Exception: + pass + + # Apply hack for python >= 3.11 and its frozen stdlib modules. + if sys.version_info >= (3, 11): + _fixup_frozen_stdlib() + + +# A hack for python >= 3.11 and its frozen stdlib modules. Unless `sys._stdlib_dir` is set, these modules end up +# missing __file__ attribute, which causes problems with 3rd party code. At the time of writing, python interpreter +# configuration API does not allow us to influence `sys._stdlib_dir` - it always resets it to `None`. Therefore, +# we manually set the path, and fix __file__ attribute on modules. +def _fixup_frozen_stdlib(): + import _imp # built-in + + # If sys._stdlib_dir is None or empty, override it with sys._MEIPASS + if not sys._stdlib_dir: + try: + sys._stdlib_dir = sys._MEIPASS + except AttributeError: + pass + + # The sys._stdlib_dir set above should affect newly-imported python-frozen modules. However, most of them have + # been already imported during python initialization and our bootstrap, so we need to retroactively fix their + # __file__ attribute. + for module_name, module in sys.modules.items(): + if not _imp.is_frozen(module_name): + continue + + is_pkg = _imp.is_frozen_package(module_name) + + # Determine "real" name from __spec__.loader_state. + loader_state = module.__spec__.loader_state + + orig_name = loader_state.origname + if is_pkg: + orig_name += '.__init__' + + # We set suffix to .pyc to be consistent with our PyiFrozenImporter. + filename = os.path.join(sys._MEIPASS, *orig_name.split('.')) + '.pyc' + + # Fixup the __file__ attribute + if not hasattr(module, '__file__'): + try: + module.__file__ = filename + except AttributeError: + pass + + # Fixup the loader_state.filename + # Except for _frozen_importlib (importlib._bootstrap), whose loader_state.filename appears to be left at + # None in python. + if loader_state.filename is None and orig_name != 'importlib._bootstrap': + loader_state.filename = filename diff --git a/venv/Lib/site-packages/PyInstaller/loader/pyimod03_ctypes.py b/venv/Lib/site-packages/PyInstaller/loader/pyimod03_ctypes.py new file mode 100644 index 0000000..3ade7dd --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/loader/pyimod03_ctypes.py @@ -0,0 +1,131 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License with exception +# for distributing bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +#----------------------------------------------------------------------------- +""" +Hooks to make ctypes.CDLL, .PyDLL, etc. look in sys._MEIPASS first. +""" + +import sys + + +def install(): + """ + Install the hooks. + + This must be done from a function as opposed to at module-level, because when the module is imported/executed, + the import machinery is not completely set up yet. + """ + + import os + + try: + import ctypes + except ImportError: + # ctypes is not included in the frozen application + return + + def _frozen_name(name): + # If the given (file)name does not exist, fall back to searching for its basename in sys._MEIPASS, where + # PyInstaller usually collects shared libraries. + if name and not os.path.isfile(name): + frozen_name = os.path.join(sys._MEIPASS, os.path.basename(name)) + if os.path.isfile(frozen_name): + name = frozen_name + return name + + class PyInstallerImportError(OSError): + def __init__(self, name): + self.msg = ( + "Failed to load dynlib/dll %r. Most likely this dynlib/dll was not found when the application " + "was frozen." % name + ) + self.args = (self.msg,) + + class PyInstallerCDLL(ctypes.CDLL): + def __init__(self, name, *args, **kwargs): + name = _frozen_name(name) + try: + super().__init__(name, *args, **kwargs) + except Exception as base_error: + raise PyInstallerImportError(name) from base_error + + ctypes.CDLL = PyInstallerCDLL + ctypes.cdll = ctypes.LibraryLoader(PyInstallerCDLL) + + class PyInstallerPyDLL(ctypes.PyDLL): + def __init__(self, name, *args, **kwargs): + name = _frozen_name(name) + try: + super().__init__(name, *args, **kwargs) + except Exception as base_error: + raise PyInstallerImportError(name) from base_error + + ctypes.PyDLL = PyInstallerPyDLL + ctypes.pydll = ctypes.LibraryLoader(PyInstallerPyDLL) + + if sys.platform.startswith('win'): + + class PyInstallerWinDLL(ctypes.WinDLL): + def __init__(self, name, *args, **kwargs): + name = _frozen_name(name) + try: + super().__init__(name, *args, **kwargs) + except Exception as base_error: + raise PyInstallerImportError(name) from base_error + + ctypes.WinDLL = PyInstallerWinDLL + ctypes.windll = ctypes.LibraryLoader(PyInstallerWinDLL) + + class PyInstallerOleDLL(ctypes.OleDLL): + def __init__(self, name, *args, **kwargs): + name = _frozen_name(name) + try: + super().__init__(name, *args, **kwargs) + except Exception as base_error: + raise PyInstallerImportError(name) from base_error + + ctypes.OleDLL = PyInstallerOleDLL + ctypes.oledll = ctypes.LibraryLoader(PyInstallerOleDLL) + + try: + import ctypes.util + except ImportError: + # ctypes.util is not included in the frozen application + return + + # Same implementation as ctypes.util.find_library, except it prepends sys._MEIPASS to the search directories. + def pyinstaller_find_library(name): + if name in ('c', 'm'): + return ctypes.util.find_msvcrt() + # See MSDN for the REAL search order. + search_dirs = [sys._MEIPASS] + os.environ['PATH'].split(os.pathsep) + for directory in search_dirs: + fname = os.path.join(directory, name) + if os.path.isfile(fname): + return fname + if fname.lower().endswith(".dll"): + continue + fname = fname + ".dll" + if os.path.isfile(fname): + return fname + return None + + ctypes.util.find_library = pyinstaller_find_library + + +# On Mac OS insert sys._MEIPASS in the first position of the list of paths that ctypes uses to search for libraries. +# +# Note: 'ctypes' module will NOT be bundled with every app because code in this module is not scanned for module +# dependencies. It is safe to wrap 'ctypes' module into 'try/except ImportError' block. +if sys.platform.startswith('darwin'): + try: + from ctypes.macholib import dyld + dyld.DEFAULT_LIBRARY_FALLBACK.insert(0, sys._MEIPASS) + except ImportError: + # Do nothing when module 'ctypes' is not available. + pass diff --git a/venv/Lib/site-packages/PyInstaller/loader/pyimod04_pywin32.py b/venv/Lib/site-packages/PyInstaller/loader/pyimod04_pywin32.py new file mode 100644 index 0000000..b635d75 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/loader/pyimod04_pywin32.py @@ -0,0 +1,56 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License with exception +# for distributing bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +#----------------------------------------------------------------------------- +""" +Set search path for pywin32 DLLs. Due to the large number of pywin32 modules, we use a single loader-level script +instead of per-module runtime hook scripts. +""" + +import os +import sys + + +def install(): + # Sub-directories containing extensions. In original python environment, these are added to `sys.path` by the + # `pywin32.pth` so the extensions end up treated as top-level modules. We attempt to preserve the directory + # layout, so we need to add these directories to `sys.path` ourselves. + pywin32_ext_paths = ('win32', 'pythonwin') + pywin32_ext_paths = [os.path.join(sys._MEIPASS, pywin32_ext_path) for pywin32_ext_path in pywin32_ext_paths] + pywin32_ext_paths = [path for path in pywin32_ext_paths if os.path.isdir(path)] + sys.path.extend(pywin32_ext_paths) + + # Additional handling of `pywin32_system32` DLL directory + pywin32_system32_path = os.path.join(sys._MEIPASS, 'pywin32_system32') + + if not os.path.isdir(pywin32_system32_path): + # Either pywin32 is not collected, or we are dealing with version that does not use the pywin32_system32 + # sub-directory. In the latter case, the pywin32 DLLs should be in `sys._MEIPASS`, and nothing + # else needs to be done here. + return + + # Add the DLL directory to `sys.path`. + # This is necessary because `__import_pywin32_system_module__` from `pywintypes` module assumes that in a frozen + # application, the pywin32 DLLs (`pythoncom3X.dll` and `pywintypes3X.dll`) that are normally found in + # `pywin32_system32` sub-directory in `sys.path` (site-packages, really) are located directly in `sys.path`. + # This obviously runs afoul of our attempts at preserving the directory layout and placing them in the + # `pywin32_system32` sub-directory instead of the top-level application directory. + sys.path.append(pywin32_system32_path) + + # Add the DLL directory to DLL search path using os.add_dll_directory(). + # This allows extensions from win32 directory (e.g., win32api, win32crypt) to be loaded on their own without + # importing pywintypes first. The extensions are linked against pywintypes3X.dll. + os.add_dll_directory(pywin32_system32_path) + + # Add the DLL directory to PATH. This is necessary under certain versions of + # Anaconda python, where `os.add_dll_directory` does not work. + path = os.environ.get('PATH', None) + if not path: + path = pywin32_system32_path + else: + path = pywin32_system32_path + os.pathsep + path + os.environ['PATH'] = path diff --git a/venv/Lib/site-packages/PyInstaller/log.py b/venv/Lib/site-packages/PyInstaller/log.py new file mode 100644 index 0000000..7eb8f8e --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/log.py @@ -0,0 +1,64 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Logging module for PyInstaller. +""" + +__all__ = ['getLogger', 'INFO', 'WARN', 'DEBUG', 'TRACE', 'ERROR', 'FATAL', 'DEPRECATION'] + +import os +import logging +from logging import DEBUG, ERROR, FATAL, INFO, WARN, getLogger + +TRACE = DEBUG - 5 +logging.addLevelName(TRACE, 'TRACE') +DEPRECATION = WARN + 5 +logging.addLevelName(DEPRECATION, 'DEPRECATION') +LEVELS = { + 'TRACE': TRACE, + 'DEBUG': DEBUG, + 'INFO': INFO, + 'WARN': WARN, + 'DEPRECATION': DEPRECATION, + 'ERROR': ERROR, + 'FATAL': FATAL, +} + +FORMAT = '%(relativeCreated)d %(levelname)s: %(message)s' +_env_level = os.environ.get("PYI_LOG_LEVEL", "INFO") +try: + level = LEVELS[_env_level.upper()] +except KeyError: + raise SystemExit(f"Invalid PYI_LOG_LEVEL value '{_env_level}'. Should be one of {list(LEVELS)}.") +logging.basicConfig(format=FORMAT, level=level) +logger = getLogger('PyInstaller') + + +def __add_options(parser): + parser.add_argument( + '--log-level', + choices=LEVELS, + metavar="LEVEL", + dest='loglevel', + help='Amount of detail in build-time console messages. LEVEL may be one of %s (default: INFO). ' + 'Also settable via and overrides the PYI_LOG_LEVEL environment variable.' % ', '.join(LEVELS), + ) + + +def __process_options(parser, opts): + if opts.loglevel: + try: + level = opts.loglevel.upper() + _level = LEVELS[level] + except KeyError: + parser.error('Unknown log level `%s`' % opts.loglevel) + logger.setLevel(_level) + os.environ["PYI_LOG_LEVEL"] = level diff --git a/venv/Lib/site-packages/PyInstaller/utils/__init__.py b/venv/Lib/site-packages/PyInstaller/utils/__init__.py new file mode 100644 index 0000000..792d600 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/__init__.py @@ -0,0 +1 @@ +# diff --git a/venv/Lib/site-packages/PyInstaller/utils/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5350cfa15d64eb8249abdd28919218fece1c8637 GIT binary patch literal 188 zcmZ3^%ge<81gF(}(wTttV-N=h7@>^MY(U0zh7^Wi22Do4l?+87m7hV9zx>^;V)7Dm zV@irjD^v3d3w3i+Q#EpxuBRINPJ*sWMurn03(W+ GfnorhkuZh; literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/utils/__pycache__/conftest.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/__pycache__/conftest.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8413928dc7b6ecf36a16d05b96763fad3641525d GIT binary patch literal 26970 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/utils/__pycache__/misc.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/__pycache__/misc.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4aa9cc9728c2372ded11e3debb2c9d6d786035c GIT binary patch literal 9773 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 Nb*%_%hfGWQzX3||@T>p; literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/utils/__pycache__/run_tests.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/__pycache__/run_tests.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..169187a9ee27c0be0c83255f2ac490ebab6714f6 GIT binary patch literal 2888 zcmZ`*O>7&-6`ox#e??NVB$xU@+>NN%rfktlZCR2n8!e*5a^fmNqyz@7fL?P))XL=U zdUh#=EM2gGi!y~#_)^#?P=qyHM}c+Fp#^fxy_co1fQ1DN2*@SAF;xv1KK0G4D3EIN zcJ~cu=FOY;H{bBjIed1c`qO8Kx~_TJ{H7Lw%=Myr9QYT38xe+pWk!RJych=Vm|OLL^z z$^khjhc-K&dO#jNmpBCSVDbMF=2pYa(e^!-z?M`b6$M+k)y}32^n5s~AZWXAq8e?urCpLNma}xIHz05>l!h0%B^%Bo02SYAdOMpFFPT)|{rG4TF!T_O@B1rxSmzF?T*Ei6i+VG>2niW(6Oe5Zib z3>LNJ{ZUYJRdsjINC%plhKTD5?CKgLj!>&dT1{#-hwZt(q8S+c%xiKXhtn#U18&~J zSp|GqSIiaI35z<>))X1b`zD+;5=pk&iReWTG{I9$&W$-<6C0+H;2m$4Xa(I7sJ^yp z6Ce?1;oG|g?9bdsP;?Jb8GU~2F83wB3S%zST57O4hEVxXy?=%tavZwgdT6FgZZC!(?QEr6f1A$uUuFHJC{sSC}Q=_ozWb|nUzsf z({f8|SY2DXrrcUG6cdl?Qs%al#m3Tn@oLlSGX+!08D~gAO*7|{dhtzgI*V2Og-$M) z+~B88jm;*fb6N)K=W_Bu;vKNUI0x+Y59kL}L00!Xyx*RCaMA90=XuZAcF)*WZ@uTd z-E-cZYUO*d4ki3fNHJI%pimqS6c3@kIpJ1s9gn0I9U-R}CU8xXAui$8>UN^k{xq%M zG?gMz&|$bi`X!-=1lgv=-E@Wwz*sL8qG#=O1-*)*K=*^wfA`e=!?u68fjIB+oxb4* zzpaKFKJ>G`%G`@s!j7H)Hf=4Wtk{iu?1mk?(LjFh6l2v65Igc#!{ZH3z4D>1o>o`C zn}%M!d)@}#Id6B)H~b*h2%*T}Uu7#kUc2}_es(*4wjLk1Lm)A@Jk=e;ER-9fHD5z8$9S@@3w5s}&SwkJ$oK ztMnK!+7#O15g^>VfZA62WPhy%UYjcs0B@Op%#{&bLg@E=|G~uLL&u~9Gwt?q$OO=9 z(ki_I82z-yWln+PN3R?J$>1F61Nj8Un$qC=glOb~sA?iR0-~%K8Ep*{EGOXt5|))5 zen~wj`Sl`|5Z`d(OM1c+0aiqgN7r=6s{`nnP`^dP@foI!32}r~Ku*W!E^~yuq^MB0 zf<&?)b9>+P+ft)b29(5Vkh*aH*w=tMm*X$K~)z~qb0qxXMf4JIFb3aqxc z@%F~h#?X`N(6KtF;N3dzwpL(@6{!VQ?bV>ZApo%S!1DHZ_h~5w`Mm~o7K!nij=ZW1?6yFUUXOv|H0Dd3hk`zlNcC|Ue3eM?- z{{2ZDaRLx>xU~#ShG2kD^m4jeY)fXeJmiA`5X&tKKXry)1?jXC{T0a;@_Xmy zTrF*T`YliYZe+N6-Hr@f?=D!8#d>7Xjx1I_*bzd{h1j+b+X?jTbjEffQw=}z_Wg(i zukSyUH5dz_ql3?TPi^;}+IVksw%$8#_m2PW*Oi&-iCrOFdGFqAHC0VLidm5}wVB$? eM(^J~eDWc5;H?W|wlHQj-^NiS41hH(CjSL+0PB|k literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/utils/__pycache__/tests.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/__pycache__/tests.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d357cb8aa4d8095675fd33ad5a658e974139431 GIT binary patch literal 6302 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/utils/cliutils/__pycache__/bindepend.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/cliutils/__pycache__/bindepend.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2c413dd84f23e3fbcef53e1ab6f4001c989f49b GIT binary patch literal 2578 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 1: + print("") + self._show_archive_contents(archive_name, archive) + + if not self.recursive_mode: + continue + + # Scan for embedded archives + if isinstance(archive, CArchiveReader): + for name, (*_, typecode) in archive.toc.items(): + if typecode == 'z': + try: + embedded_archive = archive.open_embedded_archive(name) + except Exception as e: + print(f"Could not open embedded archive {name!r}: {e}", file=sys.stderr) + self.stack.append((name, embedded_archive)) + + def _print_usage(self): + print("U: go up one level", file=sys.stderr) + print("O : open embedded archive with given name", file=sys.stderr) + print("X : extract file with given name", file=sys.stderr) + print("S: list the contents of current archive again", file=sys.stderr) + print("Q: quit", file=sys.stderr) + + def _move_up_the_stack(self): + if len(self.stack) > 1: + self.stack.pop() + archive_name, archive = self.stack[-1] + self._show_archive_contents(archive_name, archive) + else: + print("Already in the top archive!", file=sys.stderr) + + def _open_toplevel_archive(self, filename): + if not os.path.isfile(filename): + print(f"Archive {filename} does not exist!", file=sys.stderr) + sys.exit(1) + + if filename[-4:].lower() == '.pyz': + return ZlibArchiveReader(filename) + return CArchiveReader(filename) + + def _open_embedded_archive(self, archive_name=None): + # Ask for name if not provided + if not archive_name: + archive_name = input('Open name? ') + archive_name = archive_name.strip() + + # No name given; abort + if not archive_name: + return + + # Open the embedded archive + _, parent_archive = self.stack[-1] + + if not hasattr(parent_archive, 'open_embedded_archive'): + print("Archive does not support embedded archives!", file=sys.stderr) + return + + try: + archive = parent_archive.open_embedded_archive(archive_name) + except Exception as e: + print(f"Could not open embedded archive {archive_name!r}: {e}", file=sys.stderr) + return + + # Add to stack and display contents + self.stack.append((archive_name, archive)) + self._show_archive_contents(archive_name, archive) + + def _extract_file(self, name=None): + # Ask for name if not provided + if not name: + name = input('Extract name? ') + name = name.strip() + + # Archive + archive_name, archive = self.stack[-1] + + # Retrieve data + try: + if isinstance(archive, CArchiveReader): + data = archive.extract(name) + elif isinstance(archive, ZlibArchiveReader): + data = archive.extract(name, raw=True) + else: + raise NotImplementedError(f"Extraction from archive type {type(archive)} not implemented!") + except Exception as e: + print(f"Failed to extract data for entry {name!r} from {archive_name!r}: {e}", file=sys.stderr) + + # Write to file + filename = input('Output filename? ') + if not filename: + print(repr(data)) + else: + with open(filename, 'wb') as fp: + fp.write(data) + + def _show_archive_contents(self, archive_name, archive): + if isinstance(archive, CArchiveReader): + if archive.options: + print(f"Options in {archive_name!r} (PKG/CArchive):") + for option in archive.options: + print(f" {option}") + print(f"Contents of {archive_name!r} (PKG/CArchive):") + if self.brief_mode: + for name in archive.toc.keys(): + print(f" {name}") + else: + print(" position, length, uncompressed_length, is_compressed, typecode, name") + for name, (position, length, uncompressed_length, is_compressed, typecode) in archive.toc.items(): + print(f" {position}, {length}, {uncompressed_length}, {is_compressed}, {typecode!r}, {name!r}") + elif isinstance(archive, ZlibArchiveReader): + print(f"Contents of {archive_name!r} (PYZ):") + if self.brief_mode: + for name in archive.toc.keys(): + print(f" {name}") + else: + print(" typecode, position, length, name") + for name, (typecode, position, length) in archive.toc.items(): + print(f" {typecode}, {position}, {length}, {name!r}") + else: + print(f"Contents of {name} (unknown)") + print(f"FIXME: implement content listing for archive type {type(archive)}!") + + +def run(): + parser = argparse.ArgumentParser() + parser.add_argument( + '-l', + '--list', + default=False, + action='store_true', + dest='listing_mode', + help='List the archive contents and exit (default: %(default)s).', + ) + parser.add_argument( + '-r', + '--recursive', + default=False, + action='store_true', + dest='recursive', + help='Recursively print an archive log (default: %(default)s). Implies --list.', + ) + parser.add_argument( + '-b', + '--brief', + default=False, + action='store_true', + dest='brief', + help='When displaying archive contents, show only file names. (default: %(default)s).', + ) + PyInstaller.log.__add_options(parser) + parser.add_argument( + 'filename', + metavar='pyi_archive', + help="PyInstaller archive to process.", + ) + + autocomplete(parser) + args = parser.parse_args() + PyInstaller.log.__process_options(parser, args) + + try: + viewer = ArchiveViewer( + filename=args.filename, + interactive_mode=not args.listing_mode, + recursive_mode=args.recursive, + brief_mode=args.brief, + ) + viewer.main() + except KeyboardInterrupt: + raise SystemExit("Aborted by user.") + + +if __name__ == '__main__': + run() diff --git a/venv/Lib/site-packages/PyInstaller/utils/cliutils/bindepend.py b/venv/Lib/site-packages/PyInstaller/utils/cliutils/bindepend.py new file mode 100644 index 0000000..ebd5fdf --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/cliutils/bindepend.py @@ -0,0 +1,58 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Show dll dependencies of executable files or other dynamic libraries. +""" + +import argparse +import glob + +import PyInstaller.depend.bindepend +import PyInstaller.log + +try: + from argcomplete import autocomplete +except ImportError: + + def autocomplete(parser): + return None + + +def run(): + parser = argparse.ArgumentParser() + PyInstaller.log.__add_options(parser) + parser.add_argument( + 'filenames', + nargs='+', + metavar='executable-or-dynamic-library', + help="executables or dynamic libraries for which the dependencies should be shown", + ) + + autocomplete(parser) + args = parser.parse_args() + PyInstaller.log.__process_options(parser, args) + + # Suppress all informative messages from the dependency code. + PyInstaller.log.getLogger('PyInstaller.build.bindepend').setLevel(PyInstaller.log.WARN) + + try: + for input_filename_or_pattern in args.filenames: + for filename in glob.glob(input_filename_or_pattern): + print(f"{filename}:") + for lib_name, lib_path in sorted(PyInstaller.depend.bindepend.get_imports(filename)): + print(f" {lib_name} => {lib_path}") + print("") + except KeyboardInterrupt: + raise SystemExit("Aborted by user request.") + + +if __name__ == '__main__': + run() diff --git a/venv/Lib/site-packages/PyInstaller/utils/cliutils/grab_version.py b/venv/Lib/site-packages/PyInstaller/utils/cliutils/grab_version.py new file mode 100644 index 0000000..284cdd1 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/cliutils/grab_version.py @@ -0,0 +1,59 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import argparse +import codecs + +try: + from argcomplete import autocomplete +except ImportError: + + def autocomplete(parser): + return None + + +def run(): + parser = argparse.ArgumentParser( + epilog=( + 'The printed output may be saved to a file, edited and used as the input for a version resource on any of ' + 'the executable targets in a PyInstaller .spec file.' + ) + ) + parser.add_argument( + 'exe_file', + metavar='exe-file', + help="full pathname of a Windows executable", + ) + parser.add_argument( + 'out_filename', + metavar='out-filename', + nargs='?', + default='file_version_info.txt', + help="filename where the grabbed version info will be saved", + ) + + autocomplete(parser) + args = parser.parse_args() + + try: + from PyInstaller.utils.win32 import versioninfo + info = versioninfo.read_version_info_from_executable(args.exe_file) + if not info: + raise SystemExit("Error: VersionInfo resource not found in exe") + with codecs.open(args.out_filename, 'w', 'utf-8') as fp: + fp.write(str(info)) + print(f"Version info written to: {args.out_filename!r}") + except KeyboardInterrupt: + raise SystemExit("Aborted by user request.") + + +if __name__ == '__main__': + run() diff --git a/venv/Lib/site-packages/PyInstaller/utils/cliutils/makespec.py b/venv/Lib/site-packages/PyInstaller/utils/cliutils/makespec.py new file mode 100644 index 0000000..6225759 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/cliutils/makespec.py @@ -0,0 +1,61 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Automatically build a spec file containing the description of the project. +""" + +import argparse +import os + +import PyInstaller.building.makespec +import PyInstaller.log + +try: + from argcomplete import autocomplete +except ImportError: + + def autocomplete(parser): + return None + + +def generate_parser(): + p = argparse.ArgumentParser() + PyInstaller.building.makespec.__add_options(p) + PyInstaller.log.__add_options(p) + p.add_argument( + 'scriptname', + nargs='+', + ) + return p + + +def run(): + p = generate_parser() + autocomplete(p) + args = p.parse_args() + PyInstaller.log.__process_options(p, args) + + # Split pathex by using the path separator. + temppaths = args.pathex[:] + args.pathex = [] + for p in temppaths: + args.pathex.extend(p.split(os.pathsep)) + + try: + name = PyInstaller.building.makespec.main(args.scriptname, **vars(args)) + print('Wrote %s.' % name) + print('Now run pyinstaller.py to build the executable.') + except KeyboardInterrupt: + raise SystemExit("Aborted by user request.") + + +if __name__ == '__main__': + run() diff --git a/venv/Lib/site-packages/PyInstaller/utils/cliutils/set_version.py b/venv/Lib/site-packages/PyInstaller/utils/cliutils/set_version.py new file mode 100644 index 0000000..b936692 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/cliutils/set_version.py @@ -0,0 +1,51 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import argparse +import os + +try: + from argcomplete import autocomplete +except ImportError: + + def autocomplete(parser): + return None + + +def run(): + parser = argparse.ArgumentParser() + parser.add_argument( + 'info_file', + metavar='info-file', + help="text file containing version info", + ) + parser.add_argument( + 'exe_file', + metavar='exe-file', + help="full pathname of a Windows executable", + ) + autocomplete(parser) + args = parser.parse_args() + + info_file = os.path.abspath(args.info_file) + exe_file = os.path.abspath(args.exe_file) + + try: + from PyInstaller.utils.win32 import versioninfo + info = versioninfo.load_version_info_from_text_file(info_file) + versioninfo.write_version_info_to_executable(exe_file, info) + print(f"Version info written to: {exe_file!r}") + except KeyboardInterrupt: + raise SystemExit("Aborted by user request.") + + +if __name__ == '__main__': + run() diff --git a/venv/Lib/site-packages/PyInstaller/utils/conftest.py b/venv/Lib/site-packages/PyInstaller/utils/conftest.py new file mode 100644 index 0000000..f1c7387 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/conftest.py @@ -0,0 +1,587 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import copy +import glob +import logging +import os +import platform +import re +import shutil +import subprocess +from contextlib import suppress + +# Set a handler for the root-logger to inhibit 'basicConfig()' (called in PyInstaller.log) is setting up a stream +# handler writing to stderr. This avoids log messages to be written (and captured) twice: once on stderr and +# once by pytests's caplog. +logging.getLogger().addHandler(logging.NullHandler()) + +# Manages subprocess timeout. +import psutil # noqa: E402 +import py # noqa: E402 +import pytest # noqa: E402 +import sys # noqa: E402 + +# Expand sys.path with PyInstaller source. +_ROOT_DIR = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', '..')) +sys.path.append(_ROOT_DIR) + +from PyInstaller import __main__ as pyi_main # noqa: E402 +from PyInstaller import configure # noqa: E402 +from PyInstaller.compat import architecture, is_darwin, is_win # noqa: E402 +from PyInstaller.depend.analysis import initialize_modgraph # noqa: E402 +from PyInstaller.archive.readers import pkg_archive_contents # noqa: E402 +from PyInstaller.utils.tests import gen_sourcefile # noqa: E402 +from PyInstaller.utils.win32 import winutils # noqa: E402 + +# Timeout for running the executable. If executable does not exit in this time, it is interpreted as a test failure. +_EXE_TIMEOUT = 3 * 60 # In sec. +# All currently supported platforms +SUPPORTED_OSES = {"darwin", "linux", "win32"} +# Have pyi_builder fixure clean-up the temporary directories of successful tests. Controlled by environment variable. +_PYI_BUILDER_CLEANUP = os.environ.get("PYI_BUILDER_CLEANUP", "1") == "1" + +# Fixtures +# -------- + + +@pytest.fixture +def SPEC_DIR(request): + """ + Return the directory where the test spec-files reside. + """ + return py.path.local(_get_spec_dir(request)) + + +@pytest.fixture +def SCRIPT_DIR(request): + """ + Return the directory where the test scripts reside. + """ + return py.path.local(_get_script_dir(request)) + + +def pytest_runtest_setup(item): + """ + Markers to skip tests based on the current platform. + https://pytest.org/en/stable/example/markers.html#marking-platform-specific-tests-with-pytest + + Available markers: see setup.cfg [tool:pytest] markers + - @pytest.mark.darwin (macOS) + - @pytest.mark.linux (GNU/Linux) + - @pytest.mark.win32 (Windows) + """ + supported_platforms = SUPPORTED_OSES.intersection(mark.name for mark in item.iter_markers()) + plat = sys.platform + if supported_platforms and plat not in supported_platforms: + pytest.skip("does not run on %s" % plat) + + +@pytest.hookimpl(tryfirst=True, hookwrapper=True) +def pytest_runtest_makereport(item, call): + # Execute all other hooks to obtain the report object. + outcome = yield + rep = outcome.get_result() + + # Set a report attribute for each phase of a call, which can be "setup", "call", "teardown". + setattr(item, "rep_" + rep.when, rep) + + +# Return the base directory which contains the current test module. +def _get_base_dir(request): + return os.path.dirname(os.path.abspath(request.fspath.strpath)) + + +# Directory with Python scripts for functional tests. +def _get_script_dir(request): + return os.path.join(_get_base_dir(request), 'scripts') + + +# Directory with testing modules used in some tests. +def _get_modules_dir(request): + return os.path.join(_get_base_dir(request), 'modules') + + +# Directory with .toc log files. +def _get_logs_dir(request): + return os.path.join(_get_base_dir(request), 'logs') + + +# Return the directory where data for tests is located. +def _get_data_dir(request): + return os.path.join(_get_base_dir(request), 'data') + + +# Directory with .spec files used in some tests. +def _get_spec_dir(request): + return os.path.join(_get_base_dir(request), 'specs') + + +@pytest.fixture +def script_dir(request): + return py.path.local(_get_script_dir(request)) + + +# A helper function to copy from data/dir to tmpdir/data. +def _data_dir_copy( + # The pytest request object. + request, + # The name of the subdirectory located in data/name to copy. + subdir_name, + # The tmpdir object for this test. See: https://pytest.org/latest/tmpdir.html. + tmpdir +): + + # Form the source and tmp paths. + source_data_dir = py.path.local(_get_data_dir(request)).join(subdir_name) + tmp_data_dir = tmpdir.join('data', subdir_name) + # Copy the data. + shutil.copytree(source_data_dir.strpath, tmp_data_dir.strpath) + # Return the temporary data directory, so that the copied data can now be used. + return tmp_data_dir + + +# Define a fixure for the DataDir object. +@pytest.fixture +def data_dir( + # The request object for this test. See + # https://pytest.org/latest/builtin.html#_pytest.python.FixtureRequest + # and + # https://pytest.org/latest/fixture.html#fixtures-can-introspect-the-requesting-test-context. + request, + # The tmpdir object for this test. See https://pytest.org/latest/tmpdir.html. + tmpdir +): + + # Strip the leading 'test_' from the test's name. + name = request.function.__name__[5:] + # Copy to tmpdir and return the path. + return _data_dir_copy(request, name, tmpdir) + + +class AppBuilder: + def __init__(self, tmpdir, request, bundle_mode): + self._tmpdir = tmpdir + self._request = request + self._mode = bundle_mode + self._specdir = str(tmpdir) + self._distdir = str(tmpdir / 'dist') + self._builddir = str(tmpdir / 'build') + self._is_spec = False + + def test_spec(self, specfile, *args, **kwargs): + """ + Test a Python script that is referenced in the supplied .spec file. + """ + __tracebackhide__ = True + specfile = os.path.join(_get_spec_dir(self._request), specfile) + # 'test_script' should handle .spec properly as script. + self._is_spec = True + return self.test_script(specfile, *args, **kwargs) + + def test_source(self, source, *args, **kwargs): + """ + Test a Python script given as source code. + + The source will be written into a file named like the test-function. This file will then be passed to + `test_script`. If you need other related file, e.g., as `.toc`-file for testing the content, put it at at the + normal place. Just mind to take the basnename from the test-function's name. + + :param script: Source code to create executable from. This will be saved into a temporary file which is then + passed on to `test_script`. + + :param test_id: Test-id for parametrized tests. If given, it will be appended to the script filename, separated + by two underscores. + + All other arguments are passed straight on to `test_script`. + + Ensure that the caller of `test_source` is in a UTF-8 encoded file with the correct '# -*- coding: utf-8 -*-' + marker. + + """ + __tracebackhide__ = True + # For parametrized test append the test-id. + scriptfile = gen_sourcefile(self._tmpdir, source, kwargs.setdefault('test_id')) + del kwargs['test_id'] + return self.test_script(str(scriptfile), *args, **kwargs) + + def test_script( + self, script, pyi_args=None, app_name=None, app_args=None, runtime=None, run_from_path=False, **kwargs + ): + """ + Main method to wrap all phases of testing a Python script. + + :param script: Name of script to create executable from. + :param pyi_args: Additional arguments to pass to PyInstaller when creating executable. + :param app_name: Name of the executable. This is equivalent to argument --name=APPNAME. + :param app_args: Additional arguments to pass to + :param runtime: Time in seconds how long to keep executable running. + :param toc_log: List of modules that are expected to be bundled with the executable. + """ + __tracebackhide__ = True + + def marker(line): + # Print some marker to stdout and stderr to make it easier to distinguish the phases in the CI test output. + print('-------', line, '-------') + print('-------', line, '-------', file=sys.stderr) + + if pyi_args is None: + pyi_args = [] + if app_args is None: + app_args = [] + + if app_name: + if not self._is_spec: + pyi_args.extend(['--name', app_name]) + else: + # Derive name from script name. + app_name = os.path.splitext(os.path.basename(script))[0] + + # Relative path means that a script from _script_dir is referenced. + if not os.path.isabs(script): + script = os.path.join(_get_script_dir(self._request), script) + self.script = script + assert os.path.exists(self.script), 'Script %s not found.' % script + + marker('Starting build.') + if not self._test_building(args=pyi_args): + pytest.fail('Building of %s failed.' % script) + + marker('Build finished, now running executable.') + self._test_executables(app_name, args=app_args, runtime=runtime, run_from_path=run_from_path, **kwargs) + marker('Running executable finished.') + + def _test_executables(self, name, args, runtime, run_from_path, **kwargs): + """ + Run created executable to make sure it works. + + Multipackage-tests generate more than one exe-file and all of them have to be run. + + :param args: CLI options to pass to the created executable. + :param runtime: Time in seconds how long to keep the executable running. + + :return: Exit code of the executable. + """ + __tracebackhide__ = True + exes = self._find_executables(name) + # Empty list means that PyInstaller probably failed to create any executable. + assert exes != [], 'No executable file was found.' + for exe in exes: + # Try to find .toc log file. .toc log file has the same basename as exe file. + toc_log = os.path.join(_get_logs_dir(self._request), os.path.splitext(os.path.basename(exe))[0] + '.toc') + if os.path.exists(toc_log): + if not self._examine_executable(exe, toc_log): + pytest.fail('Matching .toc of %s failed.' % exe) + retcode = self._run_executable(exe, args, run_from_path, runtime) + if retcode != kwargs.get('retcode', 0): + pytest.fail('Running exe %s failed with return-code %s.' % (exe, retcode)) + + def _find_executables(self, name): + """ + Search for all executables generated by the testcase. + + If the test-case is called e.g. 'test_multipackage1', this is searching for each of 'test_multipackage1.exe' + and 'multipackage1_?.exe' in both one-file- and one-dir-mode. + + :param name: Name of the executable to look for. + + :return: List of executables + """ + exes = [] + onedir_pt = os.path.join(self._distdir, name, name) + onefile_pt = os.path.join(self._distdir, name) + patterns = [ + onedir_pt, + onefile_pt, + # Multipackage one-dir + onedir_pt + '_?', + # Multipackage one-file + onefile_pt + '_?' + ] + # For Windows append .exe extension to patterns. + if is_win: + patterns = [pt + '.exe' for pt in patterns] + # For Mac OS append pattern for .app bundles. + if is_darwin: + # e.g: ./dist/name.app/Contents/MacOS/name + pt = os.path.join(self._distdir, name + '.app', 'Contents', 'MacOS', name) + patterns.append(pt) + # Apply file patterns. + for pattern in patterns: + for prog in glob.glob(pattern): + if os.path.isfile(prog): + exes.append(prog) + return exes + + def _run_executable(self, prog, args, run_from_path, runtime): + """ + Run executable created by PyInstaller. + + :param args: CLI options to pass to the created executable. + """ + # Run the test in a clean environment to make sure they're really self-contained. + prog_env = copy.deepcopy(os.environ) + prog_env['PATH'] = '' + del prog_env['PATH'] + # For Windows we need to keep minimal PATH for successful running of some tests. + if is_win: + # Minimum Windows PATH is in most cases: C:\Windows\system32;C:\Windows + prog_env['PATH'] = os.pathsep.join(winutils.get_system_path()) + # On macOS, we similarly set up minimal PATH with system directories, in case utilities from there are used by + # tested python code (for example, matplotlib >= 3.9.0 uses `system_profiler` that is found in /usr/sbin). + if is_darwin: + # The following paths are registered when application is launched via Finder, and are a subset of what is + # typically available in the shell. + prog_env['PATH'] = os.pathsep.join(['/usr/bin', '/bin', '/usr/sbin', '/sbin']) + + exe_path = prog + if run_from_path: + # Run executable in the temp directory. Add the directory containing the executable to $PATH. Basically, + # pretend we are a shell executing the program from $PATH. + prog_cwd = str(self._tmpdir) + prog_name = os.path.basename(prog) + prog_env['PATH'] = os.pathsep.join([prog_env.get('PATH', ''), os.path.dirname(prog)]) + + else: + # Run executable in the directory where it is. + prog_cwd = os.path.dirname(prog) + # The executable will be called with argv[0] as relative not absolute path. + prog_name = os.path.join(os.curdir, os.path.basename(prog)) + + args = [prog_name] + args + # Using sys.stdout/sys.stderr for subprocess fixes printing messages in Windows command prompt. Py.test is then + # able to collect stdout/sterr messages and display them if a test fails. + return self._run_executable_(args, exe_path, prog_env, prog_cwd, runtime) + + def _run_executable_(self, args, exe_path, prog_env, prog_cwd, runtime): + process = psutil.Popen( + args, executable=exe_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=prog_env, cwd=prog_cwd + ) + + def _msg(*text): + print('[' + str(process.pid) + '] ', *text) + + # Run executable. stderr is redirected to stdout. + _msg('RUNNING: ', repr(exe_path), ', args: ', repr(args)) + # 'psutil' allows to use timeout in waiting for a subprocess. If not timeout was specified then it is 'None' - + # no timeout, just waiting. Runtime is useful mostly for interactive tests. + try: + timeout = runtime if runtime else _EXE_TIMEOUT + stdout, stderr = process.communicate(timeout=timeout) + retcode = process.returncode + except (psutil.TimeoutExpired, subprocess.TimeoutExpired): + if runtime: + # When 'runtime' is set, the expired timeout is a good sign that the executable was running successfully + # for a specified time. + # TODO: is there a better way return success than 'retcode = 0'? + retcode = 0 + else: + # Exe is running and it is not interactive. Fail the test. + retcode = 1 + _msg(f'TIMED OUT while running executable (timeout: {timeout} sec)!') + # Kill the subprocess and its child processes. + for p in list(process.children(recursive=True)) + [process]: + with suppress(psutil.NoSuchProcess): + p.kill() + stdout, stderr = process.communicate() + + sys.stdout.buffer.write(stdout) + sys.stderr.buffer.write(stderr) + + return retcode + + def _test_building(self, args): + """ + Run building of test script. + + :param args: additional CLI options for PyInstaller. + + Return True if build succeeded False otherwise. + """ + if self._is_spec: + default_args = [ + '--distpath', self._distdir, + '--workpath', self._builddir, + '--log-level=INFO', + ] # yapf: disable + else: + default_args = [ + '--debug=bootloader', + '--noupx', + '--specpath', self._specdir, + '--distpath', self._distdir, + '--workpath', self._builddir, + '--path', _get_modules_dir(self._request), + '--log-level=INFO', + ] # yapf: disable + + # Choose bundle mode. + if self._mode == 'onedir': + default_args.append('--onedir') + elif self._mode == 'onefile': + default_args.append('--onefile') + # if self._mode is None then just the spec file was supplied. + + pyi_args = [self.script] + default_args + args + # TODO: fix return code in running PyInstaller programmatically. + PYI_CONFIG = configure.get_config() + # Override CACHEDIR for PyInstaller and put it into self.tmpdir + PYI_CONFIG['cachedir'] = str(self._tmpdir) + + pyi_main.run(pyi_args, PYI_CONFIG) + retcode = 0 + + return retcode == 0 + + def _examine_executable(self, exe, toc_log): + """ + Compare log files (now used mostly by multipackage test_name). + + :return: True if .toc files match + """ + print('EXECUTING MATCHING:', toc_log) + fname_list = pkg_archive_contents(exe) + with open(toc_log, 'r', encoding='utf-8') as f: + pattern_list = eval(f.read()) + # Alphabetical order of patterns. + pattern_list.sort() + missing = [] + for pattern in pattern_list: + for fname in fname_list: + if re.match(pattern, fname): + print('MATCH:', pattern, '-->', fname) + break + else: + # No matching entry found + missing.append(pattern) + print('MISSING:', pattern) + + # Not all modules matched. Stop comparing other .toc files and fail the test. + if missing: + for m in missing: + print('Missing', m, 'in', exe) + return False + # All patterns matched. + return True + + +# Scope 'session' should keep the object unchanged for whole tests. This fixture caches basic module graph dependencies +# that are same for every executable. +@pytest.fixture(scope='session') +def pyi_modgraph(): + # Explicitly set the log level since the plugin `pytest-catchlog` (un-) sets the root logger's level to NOTSET for + # the setup phase, which will lead to TRACE messages been written out. + import PyInstaller.log as logging + logging.logger.setLevel(logging.DEBUG) + initialize_modgraph() + + +# Run by default test as onedir and onefile. +@pytest.fixture(params=['onedir', 'onefile']) +def pyi_builder(tmpdir, monkeypatch, request, pyi_modgraph): + # Save/restore environment variable PATH. + monkeypatch.setenv('PATH', os.environ['PATH']) + # PyInstaller or a test case might manipulate 'sys.path'. Reset it for every test. + monkeypatch.syspath_prepend(None) + # Set current working directory to + monkeypatch.chdir(tmpdir) + # Clean up configuration and force PyInstaller to do a clean configuration for another app/test. The value is same + # as the original value. + monkeypatch.setattr('PyInstaller.config.CONF', {'pathex': []}) + + yield AppBuilder(tmpdir, request, request.param) + + # Clean up the temporary directory of a successful test + if _PYI_BUILDER_CLEANUP and request.node.rep_setup.passed and request.node.rep_call.passed: + if tmpdir.exists(): + tmpdir.remove(rec=1, ignore_errors=True) + + +# Fixture for .spec based tests. With .spec it does not make sense to differentiate onefile/onedir mode. +@pytest.fixture +def pyi_builder_spec(tmpdir, request, monkeypatch, pyi_modgraph): + # Save/restore environment variable PATH. + monkeypatch.setenv('PATH', os.environ['PATH']) + # Set current working directory to + monkeypatch.chdir(tmpdir) + # PyInstaller or a test case might manipulate 'sys.path'. Reset it for every test. + monkeypatch.syspath_prepend(None) + # Clean up configuration and force PyInstaller to do a clean configuration for another app/test. The value is same + # as the original value. + monkeypatch.setattr('PyInstaller.config.CONF', {'pathex': []}) + + yield AppBuilder(tmpdir, request, None) + + # Clean up the temporary directory of a successful test + if _PYI_BUILDER_CLEANUP and request.node.rep_setup.passed and request.node.rep_call.passed: + if tmpdir.exists(): + tmpdir.remove(rec=1, ignore_errors=True) + + +# Define a fixture which compiles the data/load_dll_using_ctypes/ctypes_dylib.c program in the tmpdir, returning the +# tmpdir object. +@pytest.fixture() +def compiled_dylib(tmpdir, request): + tmp_data_dir = _data_dir_copy(request, 'ctypes_dylib', tmpdir) + + # Compile the ctypes_dylib in the tmpdir: Make tmpdir/data the CWD. Do NOT use monkeypatch.chdir() to change and + # monkeypatch.undo() to restore the CWD, since this will undo ALL monkeypatches (such as the pyi_builder's additions + # to sys.path), breaking the test. + old_wd = tmp_data_dir.chdir() + try: + if is_win: + tmp_data_dir = tmp_data_dir.join('ctypes_dylib.dll') + # For Mingw-x64 we must pass '-m32' to build 32-bit binaries + march = '-m32' if architecture == '32bit' else '-m64' + ret = subprocess.call('gcc -shared ' + march + ' ctypes_dylib.c -o ctypes_dylib.dll', shell=True) + if ret != 0: + # Find path to cl.exe file. + from distutils.msvccompiler import MSVCCompiler + comp = MSVCCompiler() + comp.initialize() + cl_path = comp.cc + # Fallback to msvc. + ret = subprocess.call([cl_path, '/LD', 'ctypes_dylib.c'], shell=False) + elif is_darwin: + tmp_data_dir = tmp_data_dir.join('ctypes_dylib.dylib') + # On Mac OS X we need to detect architecture - 32 bit or 64 bit. + arch = 'arm64' if platform.machine() == 'arm64' else 'i386' if architecture == '32bit' else 'x86_64' + cmd = ( + 'gcc -arch ' + arch + ' -Wall -dynamiclib ' + 'ctypes_dylib.c -o ctypes_dylib.dylib -headerpad_max_install_names' + ) + ret = subprocess.call(cmd, shell=True) + id_dylib = os.path.abspath('ctypes_dylib.dylib') + ret = subprocess.call('install_name_tool -id %s ctypes_dylib.dylib' % (id_dylib,), shell=True) + else: + tmp_data_dir = tmp_data_dir.join('ctypes_dylib.so') + ret = subprocess.call('gcc -fPIC -shared ctypes_dylib.c -o ctypes_dylib.so', shell=True) + assert ret == 0, 'Compile ctypes_dylib failed.' + finally: + # Reset the CWD directory. + old_wd.chdir() + + return tmp_data_dir + + +@pytest.fixture +def pyi_windowed_builder(pyi_builder: AppBuilder): + """A pyi_builder equivalent for testing --windowed applications.""" + + # psutil.Popen() somehow bypasses an application's windowed/console mode so that any application built in + # --windowed mode but invoked with psutil still receives valid std{in,out,err} handles and behaves exactly like + # a console application. In short, testing windowed mode with psutil is a null test. We must instead use subprocess. + + def _run_executable_(args, exe_path, prog_env, prog_cwd, runtime): + return subprocess.run([exe_path, *args], env=prog_env, cwd=prog_cwd, timeout=runtime).returncode + + pyi_builder._run_executable_ = _run_executable_ + yield pyi_builder diff --git a/venv/Lib/site-packages/PyInstaller/utils/hooks/__init__.py b/venv/Lib/site-packages/PyInstaller/utils/hooks/__init__.py new file mode 100644 index 0000000..231f4e2 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/hooks/__init__.py @@ -0,0 +1,1339 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +from __future__ import annotations + +import copy +import os +import subprocess +import textwrap +import fnmatch +from pathlib import Path +from collections import deque +from typing import Callable + +import packaging.requirements + +from PyInstaller import HOMEPATH, compat +from PyInstaller import log as logging +from PyInstaller.depend.imphookapi import PostGraphAPI +from PyInstaller import isolated +from PyInstaller.compat import importlib_metadata + +logger = logging.getLogger(__name__) + +# These extensions represent Python executables and should therefore be ignored when collecting data files. +# NOTE: .dylib files are not Python executable and should not be in this list. +PY_IGNORE_EXTENSIONS = set(compat.ALL_SUFFIXES) + +# Some hooks need to save some values. This is the dict that can be used for that. +# +# When running tests this variable should be reset before every test. +# +# For example the 'wx' module needs variable 'wxpubsub'. This tells PyInstaller which protocol of the wx module +# should be bundled. +hook_variables = {} + + +def __exec_python_cmd(cmd, env=None, capture_stdout=True): + """ + Executes an externally spawned Python interpreter. If capture_stdout is set to True, returns anything that was + emitted in the standard output as a single string. Otherwise, returns the exit code. + """ + # 'PyInstaller.config' cannot be imported as other top-level modules. + from PyInstaller.config import CONF + if env is None: + env = {} + # Update environment. Defaults to 'os.environ' + pp_env = copy.deepcopy(os.environ) + pp_env.update(env) + # Prepend PYTHONPATH with pathex. + # Some functions use some PyInstaller code in subprocess, so add PyInstaller HOMEPATH to sys.path as well. + pp = os.pathsep.join(CONF['pathex'] + [HOMEPATH]) + + # PYTHONPATH might be already defined in the 'env' argument or in the original 'os.environ'. Prepend it. + if 'PYTHONPATH' in pp_env: + pp = os.pathsep.join([pp_env.get('PYTHONPATH'), pp]) + pp_env['PYTHONPATH'] = pp + + if capture_stdout: + txt = compat.exec_python(*cmd, env=pp_env) + return txt.strip() + else: + return compat.exec_python_rc(*cmd, env=pp_env) + + +def __exec_statement(statement, capture_stdout=True): + statement = textwrap.dedent(statement) + cmd = ['-c', statement] + return __exec_python_cmd(cmd, capture_stdout=capture_stdout) + + +def exec_statement(statement: str): + """ + Execute a single Python statement in an externally-spawned interpreter, and return the resulting standard output + as a string. + + Examples:: + + tk_version = exec_statement("from _tkinter import TK_VERSION; print(TK_VERSION)") + + mpl_data_dir = exec_statement("import matplotlib; print(matplotlib.get_data_path())") + datas = [ (mpl_data_dir, "") ] + + Notes: + As of v5.0, usage of this function is discouraged in favour of the + new :mod:`PyInstaller.isolated` module. + + """ + return __exec_statement(statement, capture_stdout=True) + + +def exec_statement_rc(statement: str): + """ + Executes a Python statement in an externally spawned interpreter, and returns the exit code. + """ + return __exec_statement(statement, capture_stdout=False) + + +def eval_statement(statement: str): + """ + Execute a single Python statement in an externally-spawned interpreter, and :func:`eval` its output (if any). + + Example:: + + databases = eval_statement(''' + import sqlalchemy.databases + print(sqlalchemy.databases.__all__) + ''') + for db in databases: + hiddenimports.append("sqlalchemy.databases." + db) + + Notes: + As of v5.0, usage of this function is discouraged in favour of the + new :mod:`PyInstaller.isolated` module. + + """ + txt = exec_statement(statement).strip() + if not txt: + # Return an empty string, which is "not true" but is iterable. + return '' + return eval(txt) + + +@isolated.decorate +def get_pyextension_imports(module_name: str): + """ + Return list of modules required by binary (C/C++) Python extension. + + Python extension files ends with .so (Unix) or .pyd (Windows). It is almost impossible to analyze binary extension + and its dependencies. + + Module cannot be imported directly. + + Let's at least try import it in a subprocess and observe the difference in module list from sys.modules. + + This function could be used for 'hiddenimports' in PyInstaller hooks files. + """ + import sys + import importlib + + original = set(sys.modules.keys()) + + # When importing this module - sys.modules gets updated. + importlib.import_module(module_name) + + # Find and return which new modules have been loaded. + return list(set(sys.modules.keys()) - original - {module_name}) + + +def get_homebrew_path(formula: str = ''): + """ + Return the homebrew path to the requested formula, or the global prefix when called with no argument. + + Returns the path as a string or None if not found. + """ + import subprocess + brewcmd = ['brew', '--prefix'] + path = None + if formula: + brewcmd.append(formula) + dbgstr = 'homebrew formula "%s"' % formula + else: + dbgstr = 'homebrew prefix' + try: + path = subprocess.check_output(brewcmd).strip() + logger.debug('Found %s at "%s"' % (dbgstr, path)) + except OSError: + logger.debug('Detected homebrew not installed') + except subprocess.CalledProcessError: + logger.debug('homebrew formula "%s" not installed' % formula) + if path: + return path.decode('utf8') # Mac OS filenames are UTF-8 + else: + return None + + +def remove_prefix(string: str, prefix: str): + """ + This function removes the given prefix from a string, if the string does indeed begin with the prefix; otherwise, + it returns the original string. + """ + if string.startswith(prefix): + return string[len(prefix):] + else: + return string + + +def remove_suffix(string: str, suffix: str): + """ + This function removes the given suffix from a string, if the string does indeed end with the suffix; otherwise, + it returns the original string. + """ + # Special case: if suffix is empty, string[:0] returns ''. So, test for a non-empty suffix. + if suffix and string.endswith(suffix): + return string[:-len(suffix)] + else: + return string + + +# TODO: Do we really need a helper for this? This is pretty trivially obvious. +def remove_file_extension(filename: str): + """ + This function returns filename without its extension. + + For Python C modules it removes even whole '.cpython-34m.so' etc. + """ + for suff in compat.EXTENSION_SUFFIXES: + if filename.endswith(suff): + return filename[0:filename.rfind(suff)] + # Fallback to ordinary 'splitext'. + return os.path.splitext(filename)[0] + + +def can_import_module(module_name: str): + """ + Check if the specified module can be imported. + + Intended as a silent module availability check, as it does not print ModuleNotFoundError traceback to stderr when + the module is unavailable. + + Parameters + ---------- + module_name : str + Fully-qualified name of the module. + + Returns + ---------- + bool + Boolean indicating whether the module can be imported or not. + """ + + # Run the check in isolated sub-process, so we can gracefully handle cases when importing the module ends up + # crashing python interpreter. + @isolated.decorate + def _can_import_module(module_name): + try: + __import__(module_name) + return True + except Exception: + return False + + try: + return _can_import_module(module_name) + except isolated.SubprocessDiedError: + return False + + +# TODO: Replace most calls to exec_statement() with calls to this function. +def get_module_attribute(module_name: str, attr_name: str): + """ + Get the string value of the passed attribute from the passed module if this attribute is defined by this module + _or_ raise `AttributeError` otherwise. + + Since modules cannot be directly imported during analysis, this function spawns a subprocess importing this module + and returning the string value of this attribute in this module. + + Parameters + ---------- + module_name : str + Fully-qualified name of this module. + attr_name : str + Name of the attribute in this module to be retrieved. + + Returns + ---------- + str + String value of this attribute. + + Raises + ---------- + AttributeError + If this attribute is undefined. + """ + @isolated.decorate + def _get_module_attribute(module_name, attr_name): + import importlib + module = importlib.import_module(module_name) + return getattr(module, attr_name) + + # Return AttributeError on any kind of errors, to preserve old behavior. + try: + return _get_module_attribute(module_name, attr_name) + except Exception as e: + raise AttributeError(f"Failed to retrieve attribute {attr_name} from module {module_name}") from e + + +def get_module_file_attribute(package: str): + """ + Get the absolute path to the specified module or package. + + Modules and packages *must not* be directly imported in the main process during the analysis. Therefore, to + avoid leaking the imports, this function uses an isolated subprocess when it needs to import the module and + obtain its ``__file__`` attribute. + + Parameters + ---------- + package : str + Fully-qualified name of module or package. + + Returns + ---------- + str + Absolute path of this module. + """ + # First, try to use 'importlib.util.find_spec' and obtain loader from the spec (and filename from the loader). + # It is the fastest way, but does not work on certain modules in pywin32 that replace all module attributes with + # those of the .dll. In addition, we need to avoid it for submodules/subpackages, because it ends up importing + # their parent package, which would cause an import leak during the analysis. + filename: str | None = None + if '.' not in package: + try: + import importlib.util + loader = importlib.util.find_spec(package).loader + filename = loader.get_filename(package) + # Apparently in the past, ``None`` could be returned for built-in ``datetime`` module. Just in case this + # is still possible, return only if filename is valid. + if filename: + return filename + except (ImportError, AttributeError, TypeError, ValueError): + pass + + # Second attempt: try to obtain module/package's __file__ attribute in an isolated subprocess. + @isolated.decorate + def _get_module_file_attribute(package): + # First, try to use 'importlib.util.find_spec' and obtain loader from the spec (and filename from the loader). + # This should return the filename even if the module or package cannot be imported (e.g., a C-extension module + # with missing dependencies). + try: + import importlib.util + loader = importlib.util.find_spec(package).loader + filename = loader.get_filename(package) + # Safe-guard against ``None`` being returned (see comment in the non-isolated codepath). + if filename: + return filename + except (ImportError, AttributeError, TypeError, ValueError): + pass + + # Fall back to import attempt + import importlib + p = importlib.import_module(package) + return p.__file__ + + # The old behavior was to return ImportError (and that is what the test are also expecting...). + try: + filename = _get_module_file_attribute(package) + except Exception as e: + raise ImportError(f"Failed to obtain the __file__ attribute of package/module {package}!") from e + + return filename + + +def get_pywin32_module_file_attribute(module_name): + """ + Get the absolute path of the PyWin32 DLL specific to the PyWin32 module with the passed name (`pythoncom` + or `pywintypes`). + + On import, each PyWin32 module: + + * Imports a DLL specific to that module. + * Overwrites the values of all module attributes with values specific to that DLL. This includes that module's + `__file__` attribute, which then provides the absolute path of that DLL. + + This function imports the module in isolated subprocess and retrieves its `__file__` attribute. + """ + + # NOTE: we cannot use `get_module_file_attribute` as it does not account for the __file__ rewriting magic + # done by the module. Use `get_module_attribute` instead. + return get_module_attribute(module_name, '__file__') + + +def check_requirement(requirement: str): + """ + Check if a :pep:`0508` requirement is satisfied. Usually used to check if a package distribution is installed, + or if it is installed and satisfies the specified version requirement. + + Parameters + ---------- + requirement : str + Requirement string in :pep:`0508` format. + + Returns + ---------- + bool + Boolean indicating whether the requirement is satisfied or not. + + Examples + -------- + + :: + + # Assume Pillow 10.0.0 is installed. + >>> from PyInstaller.utils.hooks import check_requirement + >>> check_requirement('Pillow') + True + >>> check_requirement('Pillow < 9.0') + False + >>> check_requirement('Pillow >= 9.0, < 11.0') + True + """ + parsed_requirement = packaging.requirements.Requirement(requirement) + + # Fetch the actual version of the specified dist + try: + version = importlib_metadata.version(parsed_requirement.name) + except importlib_metadata.PackageNotFoundError: + return False # Not available at all + + # If specifier is not given, the only requirement is that dist is available + if not parsed_requirement.specifier: + return True + + # Parse specifier, and compare version. Enable pre-release matching, + # because we need "package >= 2.0.0" to match "2.5.0b1". + return parsed_requirement.specifier.contains(version, prereleases=True) + + +# Keep the `is_module_satisfies` as an alias for backwards compatibility with existing hooks. The old fallback +# to module version check does not work any more, though. +def is_module_satisfies( + requirements: str, + version: None = None, + version_attr: None = None, +): + """ + A compatibility wrapper for :func:`check_requirement`, intended for backwards compatibility with existing hooks. + + In contrast to original implementation from PyInstaller < 6, this implementation only checks the specified + :pep:`0508` requirement string; i.e., it tries to retrieve the distribution metadata, and compare its version + against optional version specifier(s). It does not attempt to fall back to checking the module's version attribute, + nor does it support ``version`` and ``version_attr`` arguments. + + Parameters + ---------- + requirements : str + Requirements string passed to the :func:`check_requirement`. + version : None + Deprecated and unsupported. Must be ``None``. + version_attr : None + Deprecated and unsupported. Must be ``None``. + + Returns + ---------- + bool + Boolean indicating whether the requirement is satisfied or not. + + Raises + ---------- + ValueError + If either ``version`` or ``version_attr`` are specified and are not None. + """ + if version is not None: + raise ValueError("Calling is_module_satisfies with version argument is not supported anymore.") + if version_attr is not None: + raise ValueError("Calling is_module_satisfies with version argument_attr is not supported anymore.") + return check_requirement(requirements) + + +def is_package(module_name: str): + """ + Check if a Python module is really a module or is a package containing other modules, without importing anything + in the main process. + + :param module_name: Module name to check. + :return: True if module is a package else otherwise. + """ + def _is_package(module_name: str): + """ + Determines whether the given name represents a package or not. If the name represents a top-level module or + a package, it is not imported. If the name represents a sub-module or a sub-package, its parent is imported. + In such cases, this function should be called from an isolated suprocess. + + NOTE: the fallback check for `__init__.py` is there because `_distutils_hack.DistutilsMetaFinder` from + `setuptools` does not set spec.submodule_search_locations for `distutils` / `setuptools._distutils` even though + it is a package. The alternative would be to always perform full import, and check for the `__path__` attribute, + but that would also always require full isolation. + """ + try: + import importlib.util + spec = importlib.util.find_spec(module_name) + return bool(spec.submodule_search_locations) or spec.origin.endswith('__init__.py') + except Exception: + return False + + # For top-level packages/modules, we can perform check in the main process; otherwise, we need to isolate the + # call to prevent import leaks in the main process. + if '.' not in module_name: + return _is_package(module_name) + else: + return isolated.call(_is_package, module_name) + + +def get_all_package_paths(package: str): + """ + Given a package name, return all paths associated with the package. Typically, packages have a single location + path, but PEP 420 namespace packages may be split across multiple locations. Returns an empty list if the specified + package is not found or is not a package. + """ + def _get_package_paths(package: str): + """ + Retrieve package path(s), as advertised by submodule_search_paths attribute of the spec obtained via + importlib.util.find_spec(package). If the name represents a top-level package, the package is not imported. + If the name represents a sub-module or a sub-package, its parent is imported. In such cases, this function + should be called from an isolated suprocess. Returns an empty list if specified package is not found or is not + a package. + """ + try: + import importlib.util + spec = importlib.util.find_spec(package) + if not spec or not spec.submodule_search_locations: + return [] + return [str(path) for path in spec.submodule_search_locations] + except Exception: + return [] + + # For top-level packages/modules, we can perform check in the main process; otherwise, we need to isolate the + # call to prevent import leaks in the main process. + if '.' not in package: + pkg_paths = _get_package_paths(package) + else: + pkg_paths = isolated.call(_get_package_paths, package) + + return pkg_paths + + +def package_base_path(package_path: str, package: str): + """ + Given a package location path and package name, return the package base path, i.e., the directory in which the + top-level package is located. For example, given the path ``/abs/path/to/python/libs/pkg/subpkg`` and + package name ``pkg.subpkg``, the function returns ``/abs/path/to/python/libs``. + """ + return remove_suffix(package_path, package.replace('.', os.sep)) # Base directory + + +def get_package_paths(package: str): + """ + Given a package, return the path to packages stored on this machine and also returns the path to this particular + package. For example, if pkg.subpkg lives in /abs/path/to/python/libs, then this function returns + ``(/abs/path/to/python/libs, /abs/path/to/python/libs/pkg/subpkg)``. + + NOTE: due to backwards compatibility, this function returns only one package path along with its base directory. + In case of PEP 420 namespace package with multiple location, only first location is returned. To obtain all + package paths, use the ``get_all_package_paths`` function and obtain corresponding base directories using the + ``package_base_path`` helper. + """ + pkg_paths = get_all_package_paths(package) + if not pkg_paths: + raise ValueError(f"Package '{package}' does not exist or is not a package!") + + if len(pkg_paths) > 1: + logger.warning( + "get_package_paths - package %s has multiple paths (%r); returning only first one!", package, pkg_paths + ) + + pkg_dir = pkg_paths[0] + pkg_base = package_base_path(pkg_dir, package) + + return pkg_base, pkg_dir + + +def collect_submodules( + package: str, + filter: Callable[[str], bool] = lambda name: True, + on_error: str = "warn once", +): + """ + List all submodules of a given package. + + Arguments: + package: + An ``import``-able package. + filter: + Filter the submodules found: A callable that takes a submodule name and returns True if it should be + included. + on_error: + The action to take when a submodule fails to import. May be any of: + + - raise: Errors are reraised and terminate the build. + - warn: Errors are downgraded to warnings. + - warn once: The first error issues a warning but all + subsequent errors are ignored to minimise *stderr pollution*. This + is the default. + - ignore: Skip all errors. Don't warn about anything. + Returns: + All submodules to be assigned to ``hiddenimports`` in a hook. + + This function is intended to be used by hook scripts, not by main PyInstaller code. + + Examples:: + + # Collect all submodules of Sphinx don't contain the word ``test``. + hiddenimports = collect_submodules( + "Sphinx", ``filter=lambda name: 'test' not in name) + + .. versionchanged:: 4.5 + Add the **on_error** parameter. + + """ + # Accept only strings as packages. + if not isinstance(package, str): + raise TypeError('package must be a str') + if on_error not in ("ignore", "warn once", "warn", "raise"): + raise ValueError( + f"Invalid on-error action '{on_error}': Must be one of ('ignore', 'warn once', 'warn', 'raise')" + ) + + logger.debug('Collecting submodules for %s', package) + + # Skip a module which is not a package. + if not is_package(package): + logger.debug('collect_submodules - %s is not a package.', package) + # If module is importable, return its name in the list, in order to keep behavior consistent with the + # one we have for packages (i.e., we include the package in the list of returned names) + if can_import_module(package): + return [package] + return [] + + # Determine the filesystem path(s) to the specified package. + package_submodules = [] + + todo = deque() + todo.append(package) + + with isolated.Python() as isolated_python: + while todo: + # Scan the given (sub)package + name = todo.pop() + modules, subpackages, on_error = isolated_python.call(_collect_submodules, name, on_error) + + # Add modules to the list of all submodules + package_submodules += [module for module in modules if filter(module)] + + # Add sub-packages to deque for subsequent recursion + for subpackage_name in subpackages: + if filter(subpackage_name): + todo.append(subpackage_name) + + package_submodules = sorted(package_submodules) + + logger.debug("collect_submodules - found submodules: %s", package_submodules) + return package_submodules + + +# This function is called in an isolated sub-process via `isolated.Python.call`. +def _collect_submodules(name, on_error): + import sys + import pkgutil + from traceback import format_exception_only + + from PyInstaller.utils.hooks import logger + + logger.debug("collect_submodules - scanning (sub)package %s", name) + + modules = [] + subpackages = [] + + # Resolve package location(s) + try: + __import__(name) + except Exception as ex: + # Catch all errors and either raise, warn, or ignore them as determined by the *on_error* parameter. + if on_error in ("warn", "warn once"): + from PyInstaller.log import logger + ex = "".join(format_exception_only(type(ex), ex)).strip() + logger.warning(f"Failed to collect submodules for '{name}' because importing '{name}' raised: {ex}") + if on_error == "warn once": + on_error = "ignore" + return modules, subpackages, on_error + elif on_error == "raise": + raise ImportError(f"Unable to load subpackage '{name}'.") from ex + + # Do not attempt to recurse into package if it did not make it into sys.modules. + if name not in sys.modules: + return modules, subpackages, on_error + + # Or if it does not have __path__ attribute. + paths = getattr(sys.modules[name], '__path__', None) or [] + if not paths: + return modules, subpackages, on_error + + # Package was successfully imported - include it in the list of modules. + modules.append(name) + + # Iterate package contents + logger.debug("collect_submodules - scanning (sub)package %s in location(s): %s", name, paths) + for importer, name, ispkg in pkgutil.iter_modules(paths, name + '.'): + if not ispkg: + modules.append(name) + else: + subpackages.append(name) + + return modules, subpackages, on_error + + +def is_module_or_submodule(name: str, mod_or_submod: str): + """ + This helper function is designed for use in the ``filter`` argument of :func:`collect_submodules`, by returning + ``True`` if the given ``name`` is a module or a submodule of ``mod_or_submod``. + + Examples: + + The following excludes ``foo.test`` and ``foo.test.one`` but not ``foo.testifier``. :: + + collect_submodules('foo', lambda name: not is_module_or_submodule(name, 'foo.test'))`` + """ + return name.startswith(mod_or_submod + '.') or name == mod_or_submod + + +# Patterns of dynamic library filenames that might be bundled with some installed Python packages. +PY_DYLIB_PATTERNS = [ + '*.dll', + '*.dylib', + 'lib*.so', +] + + +def collect_dynamic_libs(package: str, destdir: str | None = None, search_patterns: list = PY_DYLIB_PATTERNS): + """ + This function produces a list of (source, dest) of dynamic library files that reside in package. Its output can be + directly assigned to ``binaries`` in a hook script. The package parameter must be a string which names the package. + + :param destdir: Relative path to ./dist/APPNAME where the libraries should be put. + :param search_patterns: List of dynamic library filename patterns to collect. + """ + logger.debug('Collecting dynamic libraries for %s' % package) + + # Accept only strings as packages. + if not isinstance(package, str): + raise TypeError('package must be a str') + + # Skip a module which is not a package. + if not is_package(package): + logger.warning( + "collect_dynamic_libs - skipping library collection for module '%s' as it is not a package.", package + ) + return [] + + pkg_dirs = get_all_package_paths(package) + dylibs = [] + for pkg_dir in pkg_dirs: + pkg_base = package_base_path(pkg_dir, package) + # Recursively glob for all file patterns in the package directory + for pattern in search_patterns: + files = Path(pkg_dir).rglob(pattern) + for source in files: + # Produce the tuple ('/abs/path/to/source/mod/submod/file.pyd', 'mod/submod') + if destdir: + # Put libraries in the specified target directory. + dest = destdir + else: + # Preserve original directory hierarchy. + dest = source.parent.relative_to(pkg_base) + logger.debug(' %s, %s' % (source, dest)) + dylibs.append((str(source), str(dest))) + + return dylibs + + +def collect_data_files( + package: str, + include_py_files: bool = False, + subdir: str | os.PathLike | None = None, + excludes: list | None = None, + includes: list | None = None, +): + r""" + This function produces a list of ``(source, dest)`` entries for data files that reside in ``package``. + Its output can be directly assigned to ``datas`` in a hook script; for example, see ``hook-sphinx.py``. + The data files are all files that are not shared libraries / binary python extensions (based on extension + check) and are not python source (.py) files or byte-compiled modules (.pyc). Collection of the .py and .pyc + files can be toggled via the ``include_py_files`` flag. + Parameters: + + - The ``package`` parameter is a string which names the package. + - By default, python source files and byte-compiled modules (files with ``.py`` and ``.pyc`` suffix) are not + collected; setting the ``include_py_files`` argument to ``True`` collects these files as well. This is typically + used when a package requires source .py files to be available; for example, JIT compilation used in + deep-learning frameworks, code that requires access to .py files (for example, to check their date), or code + that tries to extend `sys.path` with subpackage paths in a way that is incompatible with PyInstaller's frozen + importer.. However, in contemporary PyInstaller versions, the preferred way of collecting source .py files is by + using the **module collection mode** setting (which enables collection of source .py files in addition to or + in lieu of collecting byte-compiled modules into PYZ archive). + - The ``subdir`` argument gives a subdirectory relative to ``package`` to search, which is helpful when submodules + are imported at run-time from a directory lacking ``__init__.py``. + - The ``excludes`` argument contains a sequence of strings or Paths. These provide a list of + `globs `_ + to exclude from the collected data files; if a directory matches the provided glob, all files it contains will + be excluded as well. All elements must be relative paths, which are relative to the provided package's path + (/ ``subdir`` if provided). + + Therefore, ``*.txt`` will exclude only ``.txt`` files in ``package``\ 's path, while ``**/*.txt`` will exclude + all ``.txt`` files in ``package``\ 's path and all its subdirectories. Likewise, ``**/__pycache__`` will exclude + all files contained in any subdirectory named ``__pycache__``. + - The ``includes`` function like ``excludes``, but only include matching paths. ``excludes`` override + ``includes``: a file or directory in both lists will be excluded. + + This function does not work on zipped Python eggs. + + This function is intended to be used by hook scripts, not by main PyInstaller code. + """ + logger.debug('Collecting data files for %s' % package) + + # Accept only strings as packages. + if not isinstance(package, str): + raise TypeError('package must be a str') + + # Skip a module which is not a package. + if not is_package(package): + logger.warning("collect_data_files - skipping data collection for module '%s' as it is not a package.", package) + return [] + + # Make sure the excludes are a list; this also makes a copy, so we don't modify the original. + excludes = list(excludes) if excludes else [] + # These excludes may contain directories which need to be searched. + excludes_len = len(excludes) + # Including py files means don't exclude them. This pattern will search any directories for containing files, so + # do not modify ``excludes_len``. + if not include_py_files: + excludes += ['**/*' + s for s in compat.ALL_SUFFIXES] + else: + # include_py_files should collect only .py and .pyc files, and not the extensions / shared libs. + excludes += ['**/*' + s for s in compat.ALL_SUFFIXES if s not in {'.py', '.pyc'}] + + # Never, ever, collect .pyc files from __pycache__. + excludes.append('**/__pycache__/*.pyc') + + # If not specified, include all files. Follow the same process as the excludes. + includes = list(includes) if includes else ["**/*"] + includes_len = len(includes) + + # A helper function to glob the in/ex "cludes", adding a wildcard to refer to all files under a subdirectory if a + # subdirectory is matched by the first ``clude_len`` patterns. Otherwise, it in/excludes the matched file. + # **This modifies** ``cludes``. + def clude_walker( + # Package directory to scan + pkg_dir, + # A list of paths relative to ``pkg_dir`` to in/exclude. + cludes, + # The number of ``cludes`` for which matching directories should be searched for all files under them. + clude_len, + # True if the list is includes, False for excludes. + is_include + ): + for i, c in enumerate(cludes): + for g in Path(pkg_dir).glob(c): + if g.is_dir(): + # Only files are sources. Subdirectories are not. + if i < clude_len: + # In/exclude all files under a matching subdirectory. + cludes.append(str((g / "**/*").relative_to(pkg_dir))) + else: + # In/exclude a matching file. + sources.add(g) if is_include else sources.discard(g) + + # Obtain all paths for the specified package, and process each path independently. + datas = [] + + pkg_dirs = get_all_package_paths(package) + for pkg_dir in pkg_dirs: + sources = set() # Reset sources set + + pkg_base = package_base_path(pkg_dir, package) + if subdir: + pkg_dir = os.path.join(pkg_dir, subdir) + + # Process the package path with clude walker + clude_walker(pkg_dir, includes, includes_len, True) + clude_walker(pkg_dir, excludes, excludes_len, False) + + # Transform the sources into tuples for ``datas``. + datas += [(str(s), str(s.parent.relative_to(pkg_base))) for s in sources] + + logger.debug("collect_data_files - Found files: %s", datas) + return datas + + +def collect_system_data_files(path: str, destdir: str | os.PathLike | None = None, include_py_files: bool = False): + """ + This function produces a list of (source, dest) non-Python (i.e., data) files that reside somewhere on the system. + Its output can be directly assigned to ``datas`` in a hook script. + + This function is intended to be used by hook scripts, not by main PyInstaller code. + """ + # Accept only strings as paths. + if not isinstance(path, str): + raise TypeError('path must be a str') + + # Walk through all file in the given package, looking for data files. + datas = [] + for dirpath, dirnames, files in os.walk(path): + for f in files: + extension = os.path.splitext(f)[1] + if include_py_files or (extension not in PY_IGNORE_EXTENSIONS): + # Produce the tuple: (/abs/path/to/source/mod/submod/file.dat, mod/submod/destdir) + source = os.path.join(dirpath, f) + dest = str(Path(dirpath).relative_to(path)) + if destdir is not None: + dest = os.path.join(destdir, dest) + datas.append((source, dest)) + + return datas + + +def copy_metadata(package_name: str, recursive: bool = False): + """ + Collect distribution metadata so that ``importlib.metadata.distribution()`` or ``pkg_resources.get_distribution()`` + can find it. + + This function returns a list to be assigned to the ``datas`` global variable. This list instructs PyInstaller to + copy the metadata for the given package to the frozen application's data directory. + + Parameters + ---------- + package_name : str + Specifies the name of the package for which metadata should be copied. + recursive : bool + If true, collect metadata for the package's dependencies too. This enables use of + ``importlib.metadata.requires('package')`` or ``pkg_resources.require('package')`` inside the frozen + application. + + Returns + ------- + list + This should be assigned to ``datas``. + + Examples + -------- + >>> from PyInstaller.utils.hooks import copy_metadata + >>> copy_metadata('sphinx') + [('c:\\python27\\lib\\site-packages\\Sphinx-1.3.2.dist-info', + 'Sphinx-1.3.2.dist-info')] + + + Some packages rely on metadata files accessed through the ``importlib.metadata`` (or the now-deprecated + ``pkg_resources``) module. PyInstaller does not collect these metadata files by default. + If a package fails without the metadata (either its own, or of another package that it depends on), you can use this + function in a hook to collect the corresponding metadata files into the frozen application. The tuples in the + returned list contain two strings. The first is the full path to the package's metadata directory on the system. The + second is the destination name, which typically corresponds to the basename of the metadata directory. Adding these + tuples the the ``datas`` hook global variable, the metadata is collected into top-level application directory (where + it is usually searched for). + + .. versionchanged:: 4.3.1 + + Prevent ``dist-info`` metadata folders being renamed to ``egg-info`` which broke ``pkg_resources.require`` with + *extras* (see :issue:`#3033`). + + .. versionchanged:: 4.4.0 + + Add the **recursive** option. + """ + from collections import deque + + todo = deque([package_name]) + done = set() + out = [] + + while todo: + package_name = todo.pop() + if package_name in done: + continue + + dist = importlib_metadata.distribution(package_name) + + # We support only `importlib_metadata.PathDistribution`, since we need to rely on its private `_path` attribute + # to obtain the path to metadata file/directory. But we need to account for possible sub-classes and vendored + # variants (`setuptools._vendor.importlib_metadata.PathDistribution˙), so just check that `_path` is available. + if not hasattr(dist, '_path'): + raise RuntimeError( + f"Unsupported distribution type {type(dist)} for {package_name} - does not have _path attribute" + ) + src_path = dist._path + + # We expect the `_path` attribute to be an instance of `pathlib.Path`. This assumption is violated when the + # package happens to be installed as a zipped egg. In such case, `_path` is an instance of either `zipp.Path` + # (when using `importlib.metadata` from `importlib-metadata`, which in turn uses 3rd party `zipp` package) or + # `zipfile.Path` (when using stdlib's `importlib.metadata`). While we could attempt to read the metadata + # from the zip, we dropped geberal support for zipped eggs from PyInstaller in 6.0, so raise an error. + if not isinstance(src_path, Path): + # NOTE: `src_path.parent` is also an instance of `zipfile.Path` or `zipp.Path`, and calling its `is_file()` + # method returns False, because the root of zip file is (rightfully) considered a directory. Therefore, we + # convert the path to `pathlib.Path˙ by taking the parent of `src_path.parent` (which turns out to be a + # `pathlib.Path`) and add to it the name of the `src_path.parent` (the name of .egg file). + try: + src_parent = src_path.parent.parent / src_path.parent.name + except Exception: + src_parent = src_path.parent + + if src_parent.is_file() and src_parent.name.endswith('.egg'): + raise RuntimeError( + f"Cannot collect metadata from path {str(src_path)!r}, which appears to be inside a zipped egg. " + f"PyInstaller >= 6.0 does not support zipped eggs anymore. Please reinstall {package_name!r} " + "using modern package installation method instead of deprecated 'python setup.py install'. " + "For example, if you are using pip package manager:\n" + "1. uninstall the zipped egg:\n" + f" pip uninstall {package_name}\n" + "2. make sure pip and its dependencies are up-to-date:\n" + " python -m pip install --upgrade pip wheel setuptools\n" + "3. install the package:\n" + f" pip install {package_name}\n" + "To install a package from source, pass the path to the source directory to 'pip install' command." + ) + else: + # Generic message for unforeseen cases. + raise RuntimeError( + f"Cannot collect metadata from path {src_path!r}, which is of unsupported type {type(src_path)}." + ) + + if src_path.is_dir(): + # The metadata is stored in a directory (.egg-info, .dist-info), so collect the whole directory. If the + # package is installed as an egg, the metadata directory is ([...]/package_name-version.egg/EGG-INFO), + # and requires special handling (as of PyInstaller v6, we support only non-zipped eggs). + if src_path.name == 'EGG-INFO' and src_path.parent.name.endswith('.egg'): + dest_path = os.path.join(*src_path.parts[-2:]) + else: + dest_path = src_path.name + elif src_path.is_file(): + # The metadata is stored in a single file. Collect it into top-level application directory. + # The .egg-info file is commonly used by Debian/Ubuntu when packaging python packages. + dest_path = '.' + else: + raise RuntimeError( + f"Distribution metadata path {src_path!r} for {package_name} is neither file nor directory!" + ) + + # Hack for metadata from packages vendored by setuptools >= 71. If source path is rooted in setuptools/_vendor, + # prepend the same to the destination path and avoid collecting into top-level directory. + if src_path.parent.name == '_vendor' and src_path.parent.parent.name == 'setuptools': + dest_path = os.path.join('setuptools', '_vendor', dest_path) + + out.append((str(src_path), str(dest_path))) + + if not recursive: + return out + done.add(package_name) + + # Process requirements; `importlib.metadata` has no API for parsing requirements, so we need to use + # `packaging.requirements`. This is necessary to discard requirements with markers that do not match the + # environment (e.g., `python_version`, `sys_platform`). + requirements = [packaging.requirements.Requirement(req) for req in dist.requires or []] + requirements = [req.name for req in requirements if req.marker is None or req.marker.evaluate()] + + todo += requirements + + return out + + +def get_installer(module: str): + """ + Try to find which package manager installed a module. + + :param module: Module to check + :return: Package manager or None + """ + # Resolve distribution for given module/package name (e.g., enchant -> pyenchant). + pkg_to_dist = importlib_metadata.packages_distributions() + dist_names = pkg_to_dist.get(module) + if dist_names is not None: + # A namespace package might result in multiple dists; take the first one... + try: + dist = importlib_metadata.distribution(dist_names[0]) + installer_text = dist.read_text('INSTALLER') + if installer_text is not None: + return installer_text.strip() + except importlib_metadata.PackageNotFoundError: + # This might happen with eggs if the egg directory name does not match the dist name declared in the + # metadata. + pass + + if compat.is_darwin: + try: + file_name = get_module_file_attribute(module) + except ImportError: + return None + + # Attempt to resolve the module file via macports' port command + try: + output = subprocess.run(['port', 'provides', file_name], + check=True, + stdout=subprocess.PIPE, + encoding='utf-8').stdout + if 'is provided by' in output: + return 'macports' + except Exception: + pass + + # Check if the file is located in homebrew's Cellar directory + file_name = os.path.realpath(file_name) + if 'Cellar' in file_name: + return 'homebrew' + + return None + + +def collect_all( + package_name: str, + include_py_files: bool = True, + filter_submodules: Callable = lambda name: True, + exclude_datas: list | None = None, + include_datas: list | None = None, + on_error: str = "warn once", +): + """ + Collect everything for a given package name. + + Arguments: + package_name: + An ``import``-able package name. + include_py_files: + Forwarded to :func:`collect_data_files`. + filter_submodules: + Forwarded to :func:`collect_submodules`. + exclude_datas: + Forwarded to :func:`collect_data_files`. + include_datas: + Forwarded to :func:`collect_data_files`. + on_error: + Forwarded onto :func:`collect_submodules`. + + Returns: + tuple: A ``(datas, binaries, hiddenimports)`` triplet containing: + + - All data files, raw Python files (if **include_py_files**), and distribution metadata directories (if + applicable). + - All dynamic libraries as returned by :func:`collect_dynamic_libs`. + - All submodules of **package_name**. + + Typical use:: + + datas, binaries, hiddenimports = collect_all('my_package_name') + """ + datas = collect_data_files(package_name, include_py_files, excludes=exclude_datas, includes=include_datas) + binaries = collect_dynamic_libs(package_name) + hiddenimports = collect_submodules(package_name, on_error=on_error, filter=filter_submodules) + + # `copy_metadata` requires a dist name instead of importable/package name. + # A namespace package might belong to multiple distributions, so process all of them. + pkg_to_dist = importlib_metadata.packages_distributions() + dist_names = set(pkg_to_dist.get(package_name, [])) + for dist_name in dist_names: + # Copy metadata + try: + datas += copy_metadata(dist_name) + except Exception: + pass + + return datas, binaries, hiddenimports + + +def collect_entry_point(name: str): + """ + Collect modules and metadata for all exporters of a given entry point. + + Args: + name: + The name of the entry point. Check the documentation for the library that uses the entry point to find + its name. + Returns: + A ``(datas, hiddenimports)`` pair that should be assigned to the ``datas`` and ``hiddenimports``, respectively. + + For libraries, such as ``pytest`` or ``keyring``, that rely on plugins to extend their behaviour. + + Examples: + Pytest uses an entry point called ``'pytest11'`` for its extensions. + To collect all those extensions use:: + + datas, hiddenimports = collect_entry_point("pytest11") + + These values may be used in a hook or added to the ``datas`` and ``hiddenimports`` arguments in the ``.spec`` + file. See :ref:`using spec files`. + + .. versionadded:: 4.3 + """ + datas = [] + imports = [] + for entry_point in importlib_metadata.entry_points(group=name): + datas += copy_metadata(entry_point.dist.name) + imports.append(entry_point.module) + return datas, imports + + +def get_hook_config(hook_api: PostGraphAPI, module_name: str, key: str): + """ + Get user settings for hooks. + + Args: + module_name: + The module/package for which the key setting belong to. + key: + A key for the config. + Returns: + The value for the config. ``None`` if not set. + + The ``get_hook_config`` function will lookup settings in the ``Analysis.hooksconfig`` dict. + + The hook settings can be added to ``.spec`` file in the form of:: + + a = Analysis(["my-app.py"], + ... + hooksconfig = { + "gi": { + "icons": ["Adwaita"], + "themes": ["Adwaita"], + "languages": ["en_GB", "zh_CN"], + }, + }, + ... + ) + """ + config = hook_api.analysis.hooksconfig + value = None + if module_name in config and key in config[module_name]: + value = config[module_name][key] + return value + + +def include_or_exclude_file( + filename: str, + include_list: list | None = None, + exclude_list: list | None = None, +): + """ + Generic inclusion/exclusion decision function based on filename and list of include and exclude patterns. + + Args: + filename: + Filename considered for inclusion. + include_list: + List of inclusion file patterns. + exclude_list: + List of exclusion file patterns. + + Returns: + A boolean indicating whether the file should be included or not. + + If ``include_list`` is provided, True is returned only if the filename matches one of include patterns (and does not + match any patterns in ``exclude_list``, if provided). If ``include_list`` is not provided, True is returned if + filename does not match any patterns in ``exclude list``, if provided. If neither list is provided, True is + returned for any filename. + """ + if include_list is not None: + for pattern in include_list: + if fnmatch.fnmatch(filename, pattern): + break + else: + return False # Not explicitly included; exclude + + if exclude_list is not None: + for pattern in exclude_list: + if fnmatch.fnmatch(filename, pattern): + return False # Explicitly excluded + + return True + + +def collect_delvewheel_libs_directory(package_name, libdir_name=None, datas=None, binaries=None): + """ + Collect data files and binaries from the .libs directory of a delvewheel-enabled python wheel. Such wheels ship + their shared libraries in a .libs directory that is located next to the package directory, and therefore falls + outside the purview of the collect_dynamic_libs() utility function. + + Args: + package_name: + Name of the package (e.g., scipy). + libdir_name: + Optional name of the .libs directory (e.g., scipy.libs). If not provided, ".libs" is added to + ``package_name``. + datas: + Optional list of datas to which collected data file entries are added. The combined result is retuned + as part of the output tuple. + binaries: + Optional list of binaries to which collected binaries entries are added. The combined result is retuned + as part of the output tuple. + + Returns: + tuple: A ``(datas, binaries)`` pair that should be assigned to the ``datas`` and ``binaries``, respectively. + + Examples: + Collect the ``scipy.libs`` delvewheel directory belonging to the Windows ``scipy`` wheel:: + + datas, binaries = collect_delvewheel_libs_directory("scipy") + + When the collected entries should be added to existing ``datas`` and ``binaries`` listst, the following form + can be used to avoid using intermediate temporary variables and merging those into existing lists:: + + datas, binaries = collect_delvewheel_libs_directory("scipy", datas=datas, binaries=binaries) + + .. versionadded:: 5.6 + """ + + datas = datas or [] + binaries = binaries or [] + + if libdir_name is None: + libdir_name = package_name + '.libs' + + # delvewheel is applicable only to Windows wheels + if not compat.is_win: + return datas, binaries + + # Get package's parent path + pkg_base, pkg_dir = get_package_paths(package_name) + pkg_base = Path(pkg_base) + libs_dir = pkg_base / libdir_name + + if not libs_dir.is_dir(): + return datas, binaries + + # Collect all dynamic libs - collect them as binaries in order to facilitate proper binary dependency analysis + # (for example, to ensure that system-installed VC runtime DLLs are collected, if needed). + # As of PyInstaller 5.4, this should be safe (should not result in duplication), because binary dependency + # analysis attempts to preserve the DLL directory structure. + binaries += [(str(dll_file), str(dll_file.parent.relative_to(pkg_base))) for dll_file in libs_dir.glob('*.dll')] + + # Collect the .load-order file; strictly speaking, this should be necessary only under python < 3.8, but let us + # collect it for completeness sake. Differently named variants have been observed: `.load_order`, `.load-order`, + # and `.load-order-Name`. + datas += [(str(load_order_file), str(load_order_file.parent.relative_to(pkg_base))) + for load_order_file in libs_dir.glob('.load[-_]order*')] + + return datas, binaries + + +if compat.is_pure_conda: + from PyInstaller.utils.hooks import conda as conda_support # noqa: F401 +elif compat.is_conda: + from PyInstaller.utils.hooks.conda import CONDA_META_DIR as _tmp + logger.warning( + "Assuming this is not an Anaconda environment or an additional venv/pipenv/... environment manager is being " + "used on top, because the conda-meta folder %s does not exist.", _tmp + ) + del _tmp diff --git a/venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2135e673a48619e8c2b5b79787cc849d517d885e GIT binary patch literal 55794 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 Mkz@DO7^^SgAHK0kGynhq literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/conda.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/conda.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..142fca35b9cd02efd8801bd7682f2a816ac5fb0c GIT binary patch literal 16293 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 IP7&$914{}+v;Y7A literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/django.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/django.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c6ea7d89e42c3335ac20f5fae3262bd3b726cbb GIT binary patch literal 6217 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 q_AyGR&Y*aeUc#Gl@XC%`a}cfL)_Heb`{MKf literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/gi.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/gi.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b542facf0cbabc1ac4bbbe14ff0b268202dd633 GIT binary patch literal 19647 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 AhyVZp literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/setuptools.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/setuptools.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0347a8fda6914e09e7bdf1c13e0c2e2c825bf99 GIT binary patch literal 9301 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/tcl_tk.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/hooks/__pycache__/tcl_tk.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98ff87bad0e63128580c1ec04895c437207fe94b GIT binary patch literal 13359 zcmc&)Yit`=cAnu&Bt?moNIgu+(pZ)y%a*9fc{ufYZOgC3kt6w`W;cpAT#7T2C{d(# zW@OnawG|dA%D4ui8Y!$z97Ma_%_>cbri=c_zb3nAYoJ9z8UvUZz*qx?f$l$glK@8g zr{B4w8IqEmP1-Ix9NxLlbMHC#-gD3W?)^ngjhDmouU%&+FCOB!|Db^RI5s?={X0B2 zIgu0jBsXS!`7s`0ThcabAG7lmXNTW0=3ssY{LV2K^E;DOv+glB&q?-ak4ai~p@b{x zovj}8@tlp5T+=mXnpFE9&v75%Z#-ju$uS);Lt@oy+a9nM8-}|hJap%;4X3t+!g!F z+yd|6GTa(b+4592e91=CGTgL9Z#!xk+nRF=Aw-DwN}(>_B5xG)+|_K(g8iPS_|o{g!Abm|ZzB=iaD zOd_R9a#XsaN+|^?(TPM-628q!Uydc`B_TZ_L|JS!D#TO}AD>rQEL9NQARu4>#N?}j zMMv0+!7@b+B7!{;tHO9PD#p}UR7}XI#>_;t&`cqj7?(k(pRx$ZBE{9Te6^zVWl5%n zqA(TM2wCK3qGjnbTar;bs)~t{i1OpGU*!Kj+V%^ z6ePu@(4?XfVmHOsl z@tN49q+B|8^-M}pW67i>_s^?|q|!f?PR}U)jM!QGVg8^1^QsvC=(%^4~=_x-`FnpKNV#6EiTsOYkzXl=tAGuLKb zpS?btwP)>*3f1*mbxV=ssi5f;HVWDiK?U7hsOjdjH=bP`&Ik8v!Trl;i*AQ=XTe?l zhWDB`7u=tB_iFCmoV&Ns)ROgOePv{K5?RA3G__J<)>j1Kod)5?aG_(L*70Pasa`8ka#wSI;oV_h<#*WM2_4{m=^fPKNdAJoC+SIF`WkKa8CvmiFjoCzg%r4r-9HRX-ZpyCv3#*y=5@HDVQXUXAX-ARV1KgDItZShv$CXTzE)k+`+^ zq1ohTs|+b?T81xj@AJd&!_ggzl$=l~gCNsjp+TNVCDdqivEHg7V#b|A4uy2{GFNc> zvX0N-<-W2iS}ASA@=oNFJIL7$XH$K$G$(Ja&xpH7nK$b5hqHeocOfEftp39uQ#_2~>yxU*DzGcjbItMHlC(x$ADb<8I5l1Ke- zH=fF=3sdYVm||^aDl^5pmuwXhv24szF4XA2h_Sr~jz6%tW+oiBWc#6wCZouF3%qFp zW%%Wt6?E&$>6v~QO57GngIb1Pt2gtMe=GSp$$hW!68dDxzT{B5OZm`Nd&aT3wbz@} zo>CrCaph*@T0<$Vf17k1n8GCx@+5yB5#Hht3UK@?wNAaS&fv)OgEc; z`53fZN$h4czTm)`7nK~K#n${mF3YckL5tRjEe~>8bF-2bxZA#6KSdc!F7n&z!4lEw zR?}aer;;wUrBr^cZ04F}G52aJ%g9se;Zo{!yXjvOOker8oPH&pCFf)4>?$vB`X7_G z!%Q##W}KBZiM67?vd_^smflOnA4B_p-;T%jrx<`-tob3aoLE(nR$rd>j-ygr zmGklcz(o)(wKPm67w_1%wA5N#P|BJOa;28uemx9rucaTu@$T}mVER$#W9F9pWQM!K zmyi$4&Q7yb`L~<`{Cmu_Nlt9|DgR+(ew_Yh)PfE@M6~<Rv8SZ<*C0;F?{+l-%FL5_{p1U3*c4bn{ z*m>CjFTHQmZILH*{z|#Y|E1^fq?D4b%*jUqMlCH{o1PIJZ9d^WfU~pEUlg5rIuF<8AR$9XA5b027^-fT#%IXybP34ueunQ6LYGf+te8b zcm0+|gG|fc;z?@3yh4L|HWnYbC@5DIRhl&itVI%-BaOUx8YoYkL2eA{Bal#u^w@Q$ zD9xsoFP-}$Xy_v0Tqn}0iNs_?nd-6Wt~ptnNL*pvf>DDay-WLneKhpfufc>PlRiqk*AUEyUy$I+Xfkd>$Wwb+Z@+im_AI zo$CA?z)PnxmrSVoPQZpKYu{f{O+r#+s6-G)d&QW%kVqjrG+%t?an0|DQsvRaM3jxG zXbfZJvP3+k<)|vf=F+O}#yJCn3H2t>wOEgi&!@zsL|kK>q(p_VTiupcbO)i$x*PCq zlKC9dX|$vYk|aO^{3#?AD-@AMVq_eLzq>UCep?h3tuy zhI_u?%E{H;tMhr^9?iEW$KEeoTfWc>Z=Uf8a&!z>BxXZ~x%- zxOU(?a^!bi(BQUQ)LJeQzs>i;?S|6*DD)5QcLz@2894okk{=k-28M1QzkUApacy7( z8S=t84Q}|n7Cz79<8pb@JUXGS;cno-oxp*Qp3G4#i%(Vpg-Q3u#xx{RCIPXhozEsY90T!bOME8Y{^BG{Z(=)^u`UdXyjoj%Q z$(`BeH5Aq8&Yrz53QiFVf(A~hnJAs2AJG5ud(*BqMgOp$}{K}~~J)3+{ak(2qFQ(Dcbq7$*;v9?~T*?rg7cgNS4iyY1Sj%mJQ zMGw-x2yyMZZcW~8i`;38tgBl8seIdMt?hJn3v&NWS;1 z)_eB$Ozssi-!5tG5;eFr=WDg{-V4;fS#{HY!%uA*$OjH+fdhrWk(JRmqig52hVES8 z2;TM15BopfrR_Ux1Rpx>Lha`q97gYpTGpg@lW!&O`D(8}_r}Pzk=2u0YhT_M(R`7D zuY09atM6DF(CRUGy77WQyB7r7y=-C>A?bit-BaY+JPDq9Xz1EduKCs6_r<(V(tJ|R ze7|sWf%@wUZ!BF~S{>DPM)LlC&EF5yzGjvrzv6$>zxLGK-KXyCK2<=cg!W*HYAwBm zokw%*Emm=zr}>ARqqF{Va^S10r&23^ba!3T&DtBax%LaWQ5qfE*i1f<)B?#|Ao;*w zSE{xz?~iEy2vs|?ZMB`O+Wm!{M{?}_dexrKUHne&r7s)MAPM73V!ZVE>i3^?0xSSG`X7|LI%Zr+0Jzyu16k z8vDQac(}uHTAj>?^e}}#yASK;&)u+mZFBr2z)KkU{Df_iU$P^FlUeyU8T*=9s^a?| zLZyRu20%JtJD1fmO@<nY2%}R8MOcWT?8ZU3vE~cRHa6;-mnCc$Q?zHBS767JRg<1qg{jzOGP=uJ z+O5F6CYzZ)Do*4DSZu=l+{P(77_Ha?5y-{%ddK1UE8g1e?Wo-COzAPCEbt;4oThstc7uQI{5*%E#Z zVoE=pM;m*>rgOQbb00tVPSq{{x^sOY-+WMOK8UDIFWWuoj+292@?`zAxuc`bMzMnv7tLa6lt>G5|Dzjb)s`_ZX< z%OS1h(2Be8t-)OD*>{fLdhXq`Z=GFl{HP({dQfXUm}@=w$^44vL9pS?gEzl@*l?eCQc1^h}Puuv{8iZoYWq#kD_LpZeI9>o}SZ z9n(U`a_lX(bADK!#A3073p8eHSnpPhb;326ZvQuU=pc0onia=e5TE%>TYf;A@PA;1 zp_!jI50f&EW&XOm{LWJ8m}HG=+4A7Hse;;)GvnM|FITP}OVD5$7Y=!GV70_wKaPVw z3fT~{T|blIGqwrblIn3RCM=zD8XGaTC*E%7kIk46n*^4m;8qJ$RHSk&aHw>FXJao5 z#gt5>W`Gb`^oQA&Up@*RvC|=)u2<7QH?SmyO(A2_h?M4p9+c#sDm_qk&4q2Qa8m_4 zI@+kYjNOpVM|C&tij18a`PkO1*7RW$1X}F0d}GcSQ)UzuRZN+$+Kk%J5egwKm@!^1 z*p#g*)HP&X4_Z34mM3xpgZY-@TFY@v0Z#{WULVR1X0H_dO_)uEKr@WG=J1;fcbmHJ zG6T2wL+Dww&m)&@fLRM zT5&zP?{8dnW&bqiZreIiX$@v0l}>1u3b{;hqJ4ODQ8>GCTk5n4*eLzb z8YTROT}FT|X1GCVOI~&}L4Iko;J#{G9wx!Hnu7C%bJe>F!KRg`Ffp;cc{S&!ZRb{A zXoN6cY~ZTIOF6JwnswV>Rlu>}rsE2%P9SSOW#y@+Ezf4GQZb}yU$TkzCA&&Wc;m_N zqC<3k=&FRepC*gX@pa}aw8S|!x3{%*D(Ck0R!e0bM#}==%~sNP^U*WxzayeM<0S1M zdcc|2^4l{unJiX}{1kuvJnmoOS84kprFu6vz$uOen{nfkj_-N=P__eQJJhlR_ciNy zsG>#H8UAgX=zC|2#l^-hjbFMdQxkJwAXw_;1OY)pVuGnG(o3+M7&IwB_r!!zhW7M{ zSdopphoX6_k1Vu71`J`;_X?!#fUKcNDxK<^fR&bnO~oKAm{l>AY%8l$SyJdWA1o)} zJBw0Ez@naHw*Yaqa3PUQ3VV}@87X-c)*V22vfdluN2lUxYSNedZd{Z!!M{vNa;u)lHE& z#P9%=Z3?x#qo!htS4>PyB;ptiSB=gB9a!XaarFulSugD9*;!bv0@>TtkpQ7#wnOyH zw(mCD)D3BS7teV~Wd9?n2)HCF%%)-IGhEoXsT=93E?ZB@2-RH)g#cUKkw(Ai9=eT+ z6&m=wlV-@AoS{r!Oe0xk*r$975%Mq`+&Xnb)KM~9agCd9z#*vD6LZ+UC?%Lx_girW zce-t2PIs_+NU<4<$k+rbe=l^qht`oBaIgS}IbSGO-NK+fzz3m5*o22~ z9A0y;@5=|D)`CxG-S-%n@xyCBT%F4MyET6|0c1f|;{HzD=n5BrbNaC?*VeD>T|Keh zm8%)Z*9>SiKpwoF@JAO4&Ea=_Z~1;)d#kpH`(a_`tT=ER^XB4>#lOtFnYr84bEl~% z-?SgMERhgwx_R`*(X}V@!EP-`)iEQt5NuoP%musf7JB+}p{_!(WmU}ucjE=dx-wD- z?xDQlby(5(6hb>zPCY6%pbe}c%y~#n`kb6n+;%ebuiUc)0Qa zjh|Y&_(v8QF8+C==21jc_eG;Wn2#lm6nPw36fu?;W|_->OxfznQ`wn`OaP1gT}t%8c0bEbq~ukKBz2*?MJbNe2Iq)$EX1z1 zVnZ8GZk%Rp>Z32+hmGyR5&5r?9W$F#eg_BOG|v~CIo`YMp` +which is designed to mimic (albeit loosely) the `importlib.metadata`_ package. These functions find and parse the +distribution metadata from json files located in the ``conda-meta`` directory. + +.. versionadded:: 4.2.0 + +This module is available only if run inside a Conda environment. Usage of this module should therefore be wrapped in +a conditional clause:: + + from PyInstaller.compat import is_pure_conda + + if is_pure_conda: + from PyInstaller.utils.hooks import conda_support + + # Code goes here. e.g. + binaries = conda_support.collect_dynamic_libs("numpy") + ... + +Packages are all referenced by the *distribution name* you use to install it, rather than the *package name* you import +it with. I.e., use ``distribution("pillow")`` instead of ``distribution("PIL")`` or use ``package_distribution("PIL")``. +""" +from __future__ import annotations + +import fnmatch +import json +import sys +from pathlib import Path +from typing import Iterable, List +from importlib.metadata import PackagePath as _PackagePath + +from PyInstaller import compat +from PyInstaller.log import logger + +# Conda virtual environments each get their own copy of `conda-meta` so the use of `sys.prefix` instead of +# `sys.base_prefix`, `sys.real_prefix` or anything from our `compat` module is intentional. +CONDA_ROOT = Path(sys.prefix) +CONDA_META_DIR = CONDA_ROOT / "conda-meta" + +# Find all paths in `sys.path` that are inside Conda root. +PYTHONPATH_PREFIXES = [] +for _path in sys.path: + _path = Path(_path) + try: + PYTHONPATH_PREFIXES.append(_path.relative_to(sys.prefix)) + except ValueError: + pass + +PYTHONPATH_PREFIXES.sort(key=lambda p: len(p.parts), reverse=True) + + +class Distribution: + """ + A bucket class representation of a Conda distribution. + + This bucket exports the following attributes: + + :ivar name: The distribution's name. + :ivar version: Its version. + :ivar files: All filenames as :meth:`PackagePath`\\ s included with this distribution. + :ivar dependencies: Names of other distributions that this distribution depends on (with version constraints + removed). + :ivar packages: Names of importable packages included in this distribution. + + This class is not intended to be constructed directly by users. Rather use :meth:`distribution` or + :meth:`package_distribution` to provide one for you. + """ + def __init__(self, json_path: str): + try: + self._json_path = Path(json_path) + assert self._json_path.exists() + except (TypeError, AssertionError): + raise TypeError( + "Distribution requires a path to a conda-meta json. Perhaps you want " + "`distribution({})` instead?".format(repr(json_path)) + ) + + # Everything we need (including this distribution's name) is kept in the metadata json. + self.raw: dict = json.loads(self._json_path.read_text()) + + # Unpack the more useful contents of the json. + self.name: str = self.raw["name"] + self.version: str = self.raw["version"] + self.files = [PackagePath(i) for i in self.raw["files"]] + self.dependencies = self._init_dependencies() + self.packages = self._init_package_names() + + def __repr__(self): + return "{}(name=\"{}\", packages={})".format(type(self).__name__, self.name, self.packages) + + def _init_dependencies(self): + """ + Read dependencies from ``self.raw["depends"]``. + + :return: Dependent distribution names. + :rtype: list + + The names in ``self.raw["depends"]`` come with extra version constraint information which must be stripped. + """ + dependencies = [] + # For each dependency: + for dependency in self.raw["depends"]: + # ``dependency`` is a string of the form: "[name] [version constraints]" + name, *version_constraints = dependency.split(maxsplit=1) + dependencies.append(name) + return dependencies + + def _init_package_names(self): + """ + Search ``self.files`` for package names shipped by this distribution. + + :return: Package names. + :rtype: list + + These are names you would ``import`` rather than names you would install. + """ + packages = [] + for file in self.files: + package = _get_package_name(file) + if package is not None: + packages.append(package) + return packages + + @classmethod + def from_name(cls, name: str): + """ + Get distribution information for a given distribution **name** (i.e., something you would ``conda install``). + + :rtype: :class:`Distribution` + """ + if name in distributions: + return distributions[name] + raise ModuleNotFoundError( + "Distribution {} is either not installed or was not installed using Conda.".format(name) + ) + + @classmethod + def from_package_name(cls, name: str): + """ + Get distribution information for a **package** (i.e., something you would import). + + :rtype: :class:`Distribution` + + For example, the package ``pkg_resources`` belongs to the distribution ``setuptools``, which contains three + packages. + + >>> package_distribution("pkg_resources") + Distribution(name="setuptools", + packages=['easy_install', 'pkg_resources', 'setuptools']) + """ + if name in distributions_by_package: + return distributions_by_package[name] + raise ModuleNotFoundError("Package {} is either not installed or was not installed using Conda.".format(name)) + + +distribution = Distribution.from_name +package_distribution = Distribution.from_package_name + + +class PackagePath(_PackagePath): + """ + A filename relative to Conda's root (``sys.prefix``). + + This class inherits from :class:`pathlib.PurePosixPath` even on non-Posix OSs. To convert to a :class:`pathlib.Path` + pointing to the real file, use the :meth:`locate` method. + """ + def locate(self): + """ + Return a path-like object for this path pointing to the file's true location. + """ + return Path(sys.prefix) / self + + +def walk_dependency_tree(initial: str, excludes: Iterable[str] | None = None): + """ + Collect a :class:`Distribution` and all direct and indirect dependencies of that distribution. + + Arguments: + initial: + Distribution name to collect from. + excludes: + Distributions to exclude. + Returns: + A ``{name: distribution}`` mapping where ``distribution`` is the output of + :func:`conda_support.distribution(name) `. + """ + if excludes is not None: + excludes = set(excludes) + + # Rather than use true recursion, mimic it with a to-do queue. + from collections import deque + done = {} + names_to_do = deque([initial]) + + while names_to_do: + # Grab a distribution name from the to-do list. + name = names_to_do.pop() + try: + # Collect and save it's metadata. + done[name] = distribution = Distribution.from_name(name) + logger.debug("Collected Conda distribution '%s', a dependency of '%s'.", name, initial) + except ModuleNotFoundError: + logger.warning( + "Conda distribution '%s', dependency of '%s', was not found. " + "If you installed this distribution with pip then you may ignore this warning.", name, initial + ) + continue + # For each dependency: + for _name in distribution.dependencies: + if _name in done: + # Skip anything already done. + continue + if _name == name: + # Avoid infinite recursion if a distribution depends on itself. This will probably never happen but I + # certainly would not chance it. + continue + if excludes is not None and _name in excludes: + # Do not recurse to excluded dependencies. + continue + names_to_do.append(_name) + return done + + +def _iter_distributions(name, dependencies, excludes): + if dependencies: + return walk_dependency_tree(name, excludes).values() + else: + return [Distribution.from_name(name)] + + +def requires(name: str, strip_versions: bool = False) -> List[str]: + """ + List requirements of a distribution. + + Arguments: + name: + The name of the distribution. + strip_versions: + List only their names, not their version constraints. + Returns: + A list of distribution names. + """ + if strip_versions: + return distribution(name).dependencies + return distribution(name).raw["depends"] + + +def files(name: str, dependencies: bool = False, excludes: list | None = None) -> List[PackagePath]: + """ + List all files belonging to a distribution. + + Arguments: + name: + The name of the distribution. + dependencies: + Recursively collect files of dependencies too. + excludes: + Distributions to ignore if **dependencies** is true. + Returns: + All filenames belonging to the given distribution. + + With ``dependencies=False``, this is just a shortcut for:: + + conda_support.distribution(name).files + """ + return [file for dist in _iter_distributions(name, dependencies, excludes) for file in dist.files] + + +if compat.is_win: + lib_dir = PackagePath("Library", "bin") +else: + lib_dir = PackagePath("lib") + + +def collect_dynamic_libs(name: str, dest: str = ".", dependencies: bool = True, excludes: Iterable[str] | None = None): + """ + Collect DLLs for distribution **name**. + + Arguments: + name: + The distribution's project-name. + dest: + Target destination, defaults to ``'.'``. + dependencies: + Recursively collect libs for dependent distributions (recommended). + excludes: + Dependent distributions to skip, defaults to ``None``. + Returns: + List of DLLs in PyInstaller's ``(source, dest)`` format. + + This collects libraries only from Conda's shared ``lib`` (Unix) or ``Library/bin`` (Windows) folders. To collect + from inside a distribution's installation use the regular :func:`PyInstaller.utils.hooks.collect_dynamic_libs`. + """ + DLL_SUFFIXES = ("*.dll", "*.dylib", "*.so", "*.so.*") + _files = [] + for file in files(name, dependencies, excludes): + # A file is classified as a dynamic library if: + # 1) it lives inside the dedicated ``lib_dir`` DLL folder + if file.parent != lib_dir: + continue + # 2) it is a file (and not a directory or a symbolic link pointing to a directory) + resolved_file = file.locate() + if not resolved_file.is_file(): + continue + # 3) has a correct suffix + if not any([resolved_file.match(suffix) for suffix in DLL_SUFFIXES]): + continue + + _files.append((str(resolved_file), dest)) + return _files + + +# --- Map packages to distributions and vice-versa --- + + +def _get_package_name(file: PackagePath): + """ + Determine the package name of a Python file in :data:`sys.path`. + + Arguments: + file: + A Python filename relative to Conda root (sys.prefix). + Returns: + Package name or None. + + This function only considers single file packages e.g. ``foo.py`` or top level ``foo/__init__.py``\\ s. + Anything else is ignored (returning ``None``). + """ + file = Path(file) + # TODO: Handle PEP 420 namespace packages (which are missing `__init__` module). No such Conda PEP 420 namespace + # packages are known. + + # Get top-level folders by finding parents of `__init__.xyz`s + if file.stem == "__init__" and file.suffix in compat.ALL_SUFFIXES: + file = file.parent + elif file.suffix not in compat.ALL_SUFFIXES: + # Keep single-file packages but skip DLLs, data and junk files. + return + + # Check if this file/folder's parent is in ``sys.path`` i.e. it's directly importable. This intentionally excludes + # submodules which would cause confusion because ``sys.prefix`` is in ``sys.path``, meaning that every file in an + # Conda installation is a submodule. + for prefix in PYTHONPATH_PREFIXES: + if len(file.parts) != len(prefix.parts) + 1: + # This check is redundant but speeds it up quite a bit. + continue + # There are no wildcards involved here. The use of ``fnmatch`` is simply to handle the `if case-insensitive + # file system: use case-insensitive string matching.` + if fnmatch.fnmatch(str(file.parent), str(prefix)): + return file.stem + + +# All the information we want is organised the wrong way. + +# We want to look up distribution based on package names, but we can only search for packages using distribution names. +# And we would like to search for a distribution's json file, but, due to the noisy filenames of the jsons, we can only +# find a json's distribution rather than a distribution's json. + +# So we have to read everything, then regroup distributions in the ways we want them grouped. This will likely be a +# spectacular bottleneck on full-blown Conda (non miniconda) with 250+ packages by default at several GiBs. I suppose we +# could cache this on a per-json basis if it gets too much. + + +def _init_distributions(): + distributions = {} + for path in CONDA_META_DIR.glob("*.json"): + dist = Distribution(path) + distributions[dist.name] = dist + return distributions + + +distributions = _init_distributions() + + +def _init_packages(): + distributions_by_package = {} + for distribution in distributions.values(): + for package in distribution.packages: + distributions_by_package[package] = distribution + return distributions_by_package + + +distributions_by_package = _init_packages() diff --git a/venv/Lib/site-packages/PyInstaller/utils/hooks/django.py b/venv/Lib/site-packages/PyInstaller/utils/hooks/django.py new file mode 100644 index 0000000..5b8bdae --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/hooks/django.py @@ -0,0 +1,152 @@ +# ---------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +# ---------------------------------------------------------------------------- +import os + +from PyInstaller import isolated + + +@isolated.decorate +def django_dottedstring_imports(django_root_dir): + """ + An isolated helper that returns list of all Django dependencies, parsed from the `mysite.settings` module. + + NOTE: With newer version of Django this is most likely the part of PyInstaller that will be broken. + + Tested with Django 2.2 + """ + + import sys + import os + + import PyInstaller.utils.misc + from PyInstaller.utils import hooks as hookutils + + # Extra search paths to add to sys.path: + # - parent directory of the django_root_dir + # - django_root_dir itself; often, Django users do not specify absolute imports in the settings module. + search_paths = [ + PyInstaller.utils.misc.get_path_to_toplevel_modules(django_root_dir), + django_root_dir, + ] + sys.path += search_paths + + # Set the path to project's settings module + default_settings_module = os.path.basename(django_root_dir) + '.settings' + settings_module = os.environ.get('DJANGO_SETTINGS_MODULE', default_settings_module) + os.environ['DJANGO_SETTINGS_MODULE'] = settings_module + + # Calling django.setup() avoids the exception AppRegistryNotReady() and also reads the user settings + # from DJANGO_SETTINGS_MODULE. + # https://stackoverflow.com/questions/24793351/django-appregistrynotready + import django # noqa: E402 + + django.setup() + + # This allows to access all django settings even from the settings.py module. + from django.conf import settings # noqa: E402 + + hiddenimports = list(settings.INSTALLED_APPS) + + # Do not fail script when settings does not have such attributes. + if hasattr(settings, 'TEMPLATE_CONTEXT_PROCESSORS'): + hiddenimports += list(settings.TEMPLATE_CONTEXT_PROCESSORS) + + if hasattr(settings, 'TEMPLATE_LOADERS'): + hiddenimports += list(settings.TEMPLATE_LOADERS) + + hiddenimports += [settings.ROOT_URLCONF] + + def _remove_class(class_name): + return '.'.join(class_name.split('.')[0:-1]) + + #-- Changes in Django 1.7. + + # Remove class names and keep just modules. + if hasattr(settings, 'AUTHENTICATION_BACKENDS'): + for cl in settings.AUTHENTICATION_BACKENDS: + cl = _remove_class(cl) + hiddenimports.append(cl) + # Deprecated since 4.2, may be None until it is removed + cl = getattr(settings, 'DEFAULT_FILE_STORAGE', None) + if cl: + hiddenimports.append(_remove_class(cl)) + if hasattr(settings, 'FILE_UPLOAD_HANDLERS'): + for cl in settings.FILE_UPLOAD_HANDLERS: + cl = _remove_class(cl) + hiddenimports.append(cl) + if hasattr(settings, 'MIDDLEWARE_CLASSES'): + for cl in settings.MIDDLEWARE_CLASSES: + cl = _remove_class(cl) + hiddenimports.append(cl) + # Templates is a dict: + if hasattr(settings, 'TEMPLATES'): + for templ in settings.TEMPLATES: + backend = _remove_class(templ['BACKEND']) + hiddenimports.append(backend) + # Include context_processors. + if hasattr(templ, 'OPTIONS'): + if hasattr(templ['OPTIONS'], 'context_processors'): + # Context processors are functions - strip last word. + mods = templ['OPTIONS']['context_processors'] + mods = [_remove_class(x) for x in mods] + hiddenimports += mods + # Include database backends - it is a dict. + for v in settings.DATABASES.values(): + hiddenimports.append(v['ENGINE']) + + # Add templatetags and context processors for each installed app. + for app in settings.INSTALLED_APPS: + app_templatetag_module = app + '.templatetags' + app_ctx_proc_module = app + '.context_processors' + hiddenimports.append(app_templatetag_module) + hiddenimports += hookutils.collect_submodules(app_templatetag_module) + hiddenimports.append(app_ctx_proc_module) + + # Deduplicate imports. + hiddenimports = list(set(hiddenimports)) + + # Return the hidden imports + return hiddenimports + + +def django_find_root_dir(): + """ + Return path to directory (top-level Python package) that contains main django files. Return None if no directory + was detected. + + Main Django project directory contain files like '__init__.py', 'settings.py' and 'url.py'. + + In Django 1.4+ the script 'manage.py' is not in the directory with 'settings.py' but usually one level up. We + need to detect this special case too. + """ + # 'PyInstaller.config' cannot be imported as other top-level modules. + from PyInstaller.config import CONF + + # Get the directory with manage.py. Manage.py is supplied to PyInstaller as the first main executable script. + manage_py = CONF['main_script'] + manage_dir = os.path.dirname(os.path.abspath(manage_py)) + + # Get the Django root directory. The directory that contains settings.py and url.py. It could be the directory + # containing manage.py or any of its subdirectories. + settings_dir = None + files = set(os.listdir(manage_dir)) + if ('settings.py' in files or 'settings' in files) and 'urls.py' in files: + settings_dir = manage_dir + else: + for f in files: + if os.path.isdir(os.path.join(manage_dir, f)): + subfiles = os.listdir(os.path.join(manage_dir, f)) + # Subdirectory contains critical files. + if ('settings.py' in subfiles or 'settings' in subfiles) and 'urls.py' in subfiles: + settings_dir = os.path.join(manage_dir, f) + break # Find the first directory. + + return settings_dir diff --git a/venv/Lib/site-packages/PyInstaller/utils/hooks/gi.py b/venv/Lib/site-packages/PyInstaller/utils/hooks/gi.py new file mode 100644 index 0000000..0ac8236 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/hooks/gi.py @@ -0,0 +1,426 @@ +# ---------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +# ---------------------------------------------------------------------------- +import os +import pathlib +import shutil +import subprocess +import hashlib +import re + +from PyInstaller.depend.utils import _resolveCtypesImports +from PyInstaller.utils.hooks import collect_submodules, collect_system_data_files, get_hook_config +from PyInstaller import isolated +from PyInstaller import log as logging +from PyInstaller import compat +from PyInstaller.depend.bindepend import findSystemLibrary + +logger = logging.getLogger(__name__) + + +class GiModuleInfo: + def __init__(self, module, version, hook_api=None): + self.name = module + self.version = version + self.available = False + self.sharedlibs = [] + self.typelib = None + self.dependencies = [] + + # If hook API is available, use it to override the version from hookconfig. + if hook_api is not None: + module_versions = get_hook_config(hook_api, 'gi', 'module-versions') + if module_versions: + self.version = module_versions.get(module, version) + + logger.debug("Gathering GI module info for %s %s", module, self.version) + + @isolated.decorate + def _get_module_info(module, version): + import gi + gi.require_version("GIRepository", "2.0") + from gi.repository import GIRepository + + repo = GIRepository.Repository.get_default() + repo.require(module, version, GIRepository.RepositoryLoadFlags.IREPOSITORY_LOAD_FLAG_LAZY) + + # Shared library/libraries + # Comma-separated list of paths to shared libraries, or None if none are associated. Convert to list. + sharedlibs = repo.get_shared_library(module) + sharedlibs = [lib.strip() for lib in sharedlibs.split(",")] if sharedlibs else [] + + # Path to .typelib file + typelib = repo.get_typelib_path(module) + + # Dependencies + # GIRepository.Repository.get_immediate_dependencies is available from gobject-introspection v1.44 on + if hasattr(repo, 'get_immediate_dependencies'): + dependencies = repo.get_immediate_dependencies(module) + else: + dependencies = repo.get_dependencies(module) + + return { + 'sharedlibs': sharedlibs, + 'typelib': typelib, + 'dependencies': dependencies, + } + + # Try to query information; if this fails, mark module as unavailable. + try: + info = _get_module_info(module, self.version) + self.sharedlibs = info['sharedlibs'] + self.typelib = info['typelib'] + self.dependencies = info['dependencies'] + self.available = True + except Exception as e: + logger.debug("Failed to query GI module %s %s: %s", module, self.version, e) + self.available = False + + def get_libdir(self): + """ + Return the path to shared library used by the module. If no libraries are associated with the typelib, None is + returned. If multiple library names are associated with the typelib, the path to the first resolved shared + library is returned. Raises exception if module is unavailable or none of the shared libraries could be + resolved. + """ + # Module unavailable + if not self.available: + raise ValueError(f"Module {self.name} {self.version} is unavailable!") + # Module has no associated shared libraries + if not self.sharedlibs: + return None + for lib in self.sharedlibs: + path = findSystemLibrary(lib) + if path: + return os.path.normpath(os.path.dirname(path)) + raise ValueError(f"Could not resolve any shared library of {self.name} {self.version}: {self.sharedlibs}!") + + def collect_typelib_data(self): + """ + Return a tuple of (binaries, datas, hiddenimports) to be used by PyGObject related hooks. + """ + datas = [] + binaries = [] + hiddenimports = [] + + logger.debug("Collecting module data for %s %s", self.name, self.version) + + # Module unavailable + if not self.available: + raise ValueError(f"Module {self.name} {self.version} is unavailable!") + + # Find shared libraries + resolved_libs = _resolveCtypesImports(self.sharedlibs) + for resolved_lib in resolved_libs: + logger.debug("Collecting shared library %s at %s", resolved_lib[0], resolved_lib[1]) + binaries.append((resolved_lib[1], ".")) + + # Find and collect .typelib file. Run it through the `gir_library_path_fix` to fix the library path, if + # necessary. + typelib_entry = gir_library_path_fix(self.typelib) + if typelib_entry: + logger.debug('Collecting gir typelib at %s', typelib_entry[0]) + datas.append(typelib_entry) + + # Overrides for the module + hiddenimports += collect_submodules('gi.overrides', lambda name: name.endswith('.' + self.name)) + + # Module dependencies + for dep in self.dependencies: + dep_module, _ = dep.rsplit('-', 1) + hiddenimports += [f'gi.repository.{dep_module}'] + + return binaries, datas, hiddenimports + + +# The old function, provided for backwards compatibility in 3rd party hooks. +def get_gi_libdir(module, version): + module_info = GiModuleInfo(module, version) + return module_info.get_libdir() + + +# The old function, provided for backwards compatibility in 3rd party hooks. +def get_gi_typelibs(module, version): + """ + Return a tuple of (binaries, datas, hiddenimports) to be used by PyGObject related hooks. Searches for and adds + dependencies recursively. + + :param module: GI module name, as passed to 'gi.require_version()' + :param version: GI module version, as passed to 'gi.require_version()' + """ + module_info = GiModuleInfo(module, version) + return module_info.collect_typelib_data() + + +def gir_library_path_fix(path): + import subprocess + + # 'PyInstaller.config' cannot be imported as other top-level modules. + from PyInstaller.config import CONF + + path = os.path.abspath(path) + + # On Mac OS we need to recompile the GIR files to reference the loader path, + # but this is not necessary on other platforms. + if compat.is_darwin: + + # If using a virtualenv, the base prefix and the path of the typelib + # have really nothing to do with each other, so try to detect that. + common_path = os.path.commonprefix([compat.base_prefix, path]) + if common_path == '/': + logger.debug("virtualenv detected? fixing the gir path...") + common_path = os.path.abspath(os.path.join(path, '..', '..', '..')) + + gir_path = os.path.join(common_path, 'share', 'gir-1.0') + + typelib_name = os.path.basename(path) + gir_name = os.path.splitext(typelib_name)[0] + '.gir' + + gir_file = os.path.join(gir_path, gir_name) + + if not os.path.exists(gir_path): + logger.error( + "Unable to find gir directory: %s.\nTry installing your platform's gobject-introspection package.", + gir_path + ) + return None + if not os.path.exists(gir_file): + logger.error( + "Unable to find gir file: %s.\nTry installing your platform's gobject-introspection package.", gir_file + ) + return None + + with open(gir_file, 'r', encoding='utf-8') as f: + lines = f.readlines() + # GIR files are `XML encoded `_, + # which means they are by definition encoded using UTF-8. + with open(os.path.join(CONF['workpath'], gir_name), 'w', encoding='utf-8') as f: + for line in lines: + if 'shared-library' in line: + split = re.split('(=)', line) + files = re.split('(["|,])', split[2]) + for count, item in enumerate(files): + if 'lib' in item: + files[count] = '@loader_path/' + os.path.basename(item) + line = ''.join(split[0:2]) + ''.join(files) + f.write(line) + + # g-ir-compiler expects a file so we cannot just pipe the fixed file to it. + command = subprocess.Popen(( + 'g-ir-compiler', os.path.join(CONF['workpath'], gir_name), + '-o', os.path.join(CONF['workpath'], typelib_name) + )) # yapf: disable + command.wait() + + return os.path.join(CONF['workpath'], typelib_name), 'gi_typelibs' + else: + return path, 'gi_typelibs' + + +@isolated.decorate +def get_glib_system_data_dirs(): + import gi + gi.require_version('GLib', '2.0') + from gi.repository import GLib + return GLib.get_system_data_dirs() + + +def get_glib_sysconf_dirs(): + """ + Try to return the sysconf directories (e.g., /etc). + """ + if compat.is_win: + # On Windows, if you look at gtkwin32.c, sysconfdir is actually relative to the location of the GTK DLL. Since + # that is what we are actually interested in (not the user path), we have to do that the hard way... + return [os.path.join(get_gi_libdir('GLib', '2.0'), 'etc')] + + @isolated.call + def data_dirs(): + import gi + gi.require_version('GLib', '2.0') + from gi.repository import GLib + return GLib.get_system_config_dirs() + + return data_dirs + + +def collect_glib_share_files(*path): + """ + Path is relative to the system data directory (e.g., /usr/share). + """ + glib_data_dirs = get_glib_system_data_dirs() + if glib_data_dirs is None: + return [] + + destdir = os.path.join('share', *path) + + # TODO: will this return too much? + collected = [] + for data_dir in glib_data_dirs: + p = os.path.join(data_dir, *path) + collected += collect_system_data_files(p, destdir=destdir, include_py_files=False) + + return collected + + +def collect_glib_etc_files(*path): + """ + Path is relative to the system config directory (e.g., /etc). + """ + glib_config_dirs = get_glib_sysconf_dirs() + if glib_config_dirs is None: + return [] + + destdir = os.path.join('etc', *path) + + # TODO: will this return too much? + collected = [] + for config_dir in glib_config_dirs: + p = os.path.join(config_dir, *path) + collected += collect_system_data_files(p, destdir=destdir, include_py_files=False) + + return collected + + +_glib_translations = None + + +def collect_glib_translations(prog, lang_list=None): + """ + Return a list of translations in the system locale directory whose names equal prog.mo. + """ + global _glib_translations + if _glib_translations is None: + if lang_list is not None: + trans = [] + for lang in lang_list: + trans += collect_glib_share_files(os.path.join("locale", lang)) + _glib_translations = trans + else: + _glib_translations = collect_glib_share_files('locale') + + names = [os.sep + prog + '.mo', os.sep + prog + '.po'] + namelen = len(names[0]) + + return [(src, dst) for src, dst in _glib_translations if src[-namelen:] in names] + + +# Not a hook utility function per-se (used by main Analysis class), but kept here to have all GLib/GObject functions +# in one place... +def compile_glib_schema_files(datas_toc, workdir, collect_source_files=False): + """ + Compile collected GLib schema files. Extracts the list of GLib schema files from the given input datas TOC, copies + them to temporary working directory, and compiles them. The resulting `gschemas.compiled` file is added to the + output TOC, replacing any existing entry with that name. If `collect_source_files` flag is set, the source XML + schema files are also (re)added to the output TOC; by default, they are not. This function is no-op (returns the + original TOC) if no GLib schemas are found in TOC or if `glib-compile-schemas` executable is not found in `PATH`. + """ + SCHEMA_DEST_DIR = pathlib.PurePath("share/glib-2.0/schemas") + workdir = pathlib.Path(workdir) + + schema_files = [] + output_toc = [] + for toc_entry in datas_toc: + dest_name, src_name, typecode = toc_entry + dest_name = pathlib.PurePath(dest_name) + src_name = pathlib.PurePath(src_name) + + # Pass-through for non-schema files, identified based on the destination directory. + if dest_name.parent != SCHEMA_DEST_DIR: + output_toc.append(toc_entry) + continue + + # It seems schemas directory contains different files with different suffices: + # - .gschema.xml + # - .schema.override + # - .enums.xml + # To avoid omitting anything, simply collect everything into temporary directory. + # Exemptions are gschema.dtd (which should be unnecessary) and gschemas.compiled (which we will generate + # ourselves in this function). + if src_name.name in {"gschema.dtd", "gschemas.compiled"}: + continue + + schema_files.append(src_name) + + # If there are no schema files available, simply return the input datas TOC. + if not schema_files: + return datas_toc + + # Ensure that `glib-compile-schemas` executable is in PATH, just in case... + schema_compiler_exe = shutil.which('glib-compile-schemas') + if not schema_compiler_exe: + logger.warning("GLib schema compiler (glib-compile-schemas) not found! Skipping GLib schema recompilation...") + return datas_toc + + # If `gschemas.compiled` file already exists in the temporary working directory, record its modification time and + # hash. This will allow us to restore the modification time on the newly-compiled copy, if the latter turns out + # to be identical to the existing old one. Just in case, if the file becomes subject to timestamp-based caching + # mechanism. + compiled_file = workdir / "gschemas.compiled" + old_compiled_file_hash = None + old_compiled_file_stat = None + + if compiled_file.is_file(): + # Record creation/modification time + old_compiled_file_stat = compiled_file.stat() + # Compute SHA1 hash; since compiled schema files are relatively small, do it in single step. + old_compiled_file_hash = hashlib.sha1(compiled_file.read_bytes()).digest() + + # Ensure that temporary working directory exists, and is empty. + if workdir.exists(): + shutil.rmtree(workdir) + workdir.mkdir(exist_ok=True) + + # Copy schema (source) files to temporary working directory + for schema_file in schema_files: + shutil.copy(schema_file, workdir) + + # Compile. The glib-compile-schema might produce warnings on its own (e.g., schemas using deprecated paths, or + # overrides for non-existent keys). Since these are non-actionable, capture and display them only as a DEBUG + # message, or as a WARNING one if the command fails. + logger.info("Compiling collected GLib schema files in %r...", str(workdir)) + try: + cmd_args = [schema_compiler_exe, str(workdir), '--targetdir', str(workdir)] + p = subprocess.run( + cmd_args, + stdin=subprocess.DEVNULL, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + check=True, + errors='ignore', + encoding='utf-8', + ) + logger.debug("Output from glib-compile-schemas:\n%s", p.stdout) + except subprocess.CalledProcessError as e: + # The called glib-compile-schema returned error. Display stdout/stderr, and return original datas TOC to + # minimize damage. + logger.warning("Failed to recompile GLib schemas! Returning collected files as-is!", exc_info=True) + logger.warning("Output from glib-compile-schemas:\n%s", e.stdout) + return datas_toc + except Exception: + # Compilation failed for whatever reason. Return original datas TOC to minimize damage. + logger.warning("Failed to recompile GLib schemas! Returning collected files as-is!", exc_info=True) + return datas_toc + + # Compute the checksum of the new compiled file, and if it matches the old checksum, restore the modification time. + if old_compiled_file_hash is not None: + new_compiled_file_hash = hashlib.sha1(compiled_file.read_bytes()).digest() + if new_compiled_file_hash == old_compiled_file_hash: + os.utime(compiled_file, ns=(old_compiled_file_stat.st_atime_ns, old_compiled_file_stat.st_mtime_ns)) + + # Add the resulting gschemas.compiled file to the output TOC + output_toc.append((str(SCHEMA_DEST_DIR / compiled_file.name), str(compiled_file), "DATA")) + + # Include source schema files in the output TOC (optional) + if collect_source_files: + for schema_file in schema_files: + output_toc.append((str(SCHEMA_DEST_DIR / schema_file.name), str(schema_file), "DATA")) + + return output_toc diff --git a/venv/Lib/site-packages/PyInstaller/utils/hooks/qt/__init__.py b/venv/Lib/site-packages/PyInstaller/utils/hooks/qt/__init__.py new file mode 100644 index 0000000..416cbb4 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/hooks/qt/__init__.py @@ -0,0 +1,1424 @@ +# ---------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import glob +import os +import pathlib +import re + +from PyInstaller import compat +from PyInstaller import isolated +from PyInstaller import log as logging +from PyInstaller.depend import bindepend +from PyInstaller.utils import hooks, misc +from PyInstaller.utils.hooks.qt import _modules_info + +logger = logging.getLogger(__name__) + +# Qt deployment approach +# ---------------------- +# This is the core of PyInstaller's approach to Qt deployment. It is based on: +# +# - Discovering the location of Qt libraries by introspection, using QtLibraryInfo_. This provides compatibility with +# many variants of Qt5/6 (conda, self-compiled, provided by a Linux distro, etc.) and many versions of Qt5/6, all of +# which vary in the location of Qt files. +# +# - Placing all frozen PyQt5/6 or PySide2/6 Qt files in a standard subdirectory layout, which matches the layout of the +# corresponding wheel on PyPI. This is necessary to support Qt installs which are not in a subdirectory of the PyQt5/6 +# or PySide2/6 wrappers. See ``hooks/rthooks/pyi_rth_qt5.py`` for the use of environment variables to establish this +# layout. +# +# - Emitting warnings on missing QML and translation files which some installations do not have. +# +# - Determining additional files needed for deployment based on the information in the centralized Qt module information +# list in the ``_modules_info`` module. This includes plugins and translation files associated with each Qt python +# extension module, as well as additional python Qt extension modules. +# +# - Collecting additional files that are specific to each module and are handled separately, for example: +# +# - For dynamic OpenGL applications, the ``libEGL.dll``, ``libGLESv2.dll``, ``d3dcompiler_XX.dll`` (the XX is a +# version number), and ``opengl32sw.dll`` libraries need to be collected on Windows. This is handled by the +# "base" bindings hook, for example ``hook-PyQt5.py``. +# +# - If Qt was configured to use ICU, the ``icudtXX.dll``, ``icuinXX.dll``, and ``icuucXX.dll`` libraries need to +# be collected on Windows. This is handled by the "base" bindings hook, for example ``hook-PyQt5.py``. +# +# - Per the `Deploying QML Applications `_ page, QML-based +# applications need the ``qml/`` directory available. This is handled by ``QtQuick`` hook, for example +# ``hook-PyQt5.QtQuick.py``. +# +# - For ``QtWebEngine``-based applications, we follow the `deployWebEngineCore +# `_ +# function copies the following files from ``resources/``, and also copies the web engine process executable. +# - ``icudtl.dat`` +# - ``qtwebengine_devtools_resources.pak`` +# - ``qtwebengine_resources.pak`` +# - ``qtwebengine_resources_100p.pak`` +# - ``qtwebengine_resources_200p.pak`` +# +# This is handled by the ``QtWebEngineCore`` hook, for example ``hook-PyQt5.QtWebEngineCore.py``. +# +# For details and references, see the `original write-up +# `_ +# and the documentation in the ``_modules_info`` module. + + +# QtModuleInfo +# ------------ +# This class contains information about python module (extension), its corresponding Qt module (shared library), and +# associated plugins and translations. It is used within QtLibraryInfo_ to establish name-based mappings for file +# collection. +class QtModuleInfo: + def __init__(self, module, shared_lib=None, translations=None, plugins=None): + # Python module (extension) name without package namespace. For example, `QtCore`. + # Can be None if python bindings do not bind the module, but we still need to establish relationship between + # the Qt module (shared library) and its plugins and translations. + self.module = module + # Associated Qt module (shared library), if any. Used during recursive dependency analysis, where a python + # module (extension) is analyzed for linked Qt modules (shared libraries), and then their corresponding + # python modules (extensions) are added to hidden imports. For example, the Qt module name is `Qt5Core` or + # `Qt6Core`, depending on the Qt version. Can be None for python modules that are not tied to a particular + # Qt shared library (for example, the corresponding Qt module is headers-only) and hence they cannot be + # inferred from recursive link-time dependency analysis. + self.shared_lib = shared_lib + # List of base names of translation files (if any) associated with the Qt module. Multiple base names may be + # associated with a single module. + # For example, `['qt', 'qtbase']` for `QtCore` or `['qtmultimedia']` for `QtMultimedia`. + self.translations = translations or [] + # List of plugins associated with the Qt module. + self.plugins = plugins or [] + + def __repr__(self): + return f"(module={self.module!r}, shared_lib={self.shared_lib!r}, " \ + f"translations={self.translations!r}, plugins={self.plugins!r}" + + +# QtLibraryInfo +# -------------- +# This class uses introspection to determine the location of Qt files. This is essential to deal with the many variants +# of the PyQt5/6 and PySide2/6 package, each of which places files in a different location. Therefore, this class +# provides all location-related members of `QLibraryInfo `_. +class QtLibraryInfo: + def __init__(self, namespace): + if namespace not in ['PyQt5', 'PyQt6', 'PySide2', 'PySide6']: + raise Exception('Invalid namespace: {0}'.format(namespace)) + self.namespace = namespace + # Distinction between PyQt5/6 and PySide2/6 + self.is_pyqt = namespace in {'PyQt5', 'PyQt6'} + # Distinction between Qt5 and Qt6 + self.qt_major = 6 if namespace in {'PyQt6', 'PySide6'} else 5 + # Determine relative path where Qt libraries and data need to be collected in the frozen application. This + # varies between PyQt5/PyQt6/PySide2/PySide6, their versions, and platforms. NOTE: it is tempting to consider + # deriving this path as simply the value of QLibraryInfo.PrefixPath, taken relative to the package's root + # directory. However, we also need to support non-wheel deployments (e.g., with Qt installed in custom path on + # Windows, or with Qt and PyQt5 installed on linux using native package manager), and in those, the Qt + # PrefixPath does not reflect the required relative target path for the frozen application. + if namespace == 'PyQt5': + if self._use_new_layout("PyQt5", "5.15.4", False): + self.qt_rel_dir = os.path.join('PyQt5', 'Qt5') + else: + self.qt_rel_dir = os.path.join('PyQt5', 'Qt') + elif namespace == 'PyQt6': + if self._use_new_layout("PyQt6", "6.0.3", True): + self.qt_rel_dir = os.path.join('PyQt6', 'Qt6') + else: + self.qt_rel_dir = os.path.join('PyQt6', 'Qt') + elif namespace == 'PySide2': + # PySide2 uses PySide2/Qt on linux and macOS, and PySide2 on Windows + if compat.is_win: + self.qt_rel_dir = 'PySide2' + else: + self.qt_rel_dir = os.path.join('PySide2', 'Qt') + else: + # PySide6 follows the same logic as PySide2 + if compat.is_win: + self.qt_rel_dir = 'PySide6' + else: + self.qt_rel_dir = os.path.join('PySide6', 'Qt') + + # Process module information list to construct python-module-name -> info and shared-lib-name -> info mappings. + self._load_module_info() + + def __repr__(self): + return f"QtLibraryInfo({self.namespace})" + + # Delay initialization of the Qt library information until the corresponding attributes are first requested. + def __getattr__(self, name): + if 'version' in self.__dict__: + # Initialization was already done, but requested attribute is not available. + raise AttributeError(name) + + # Load Qt library info... + self._load_qt_info() + # ... and return the requested attribute + return getattr(self, name) + + # Check whether we must use the new layout (e.g. PyQt5/Qt5, PyQt6/Qt6) instead of the old layout (PyQt5/Qt, + # PyQt6/Qt). + @staticmethod + def _use_new_layout(package_basename: str, version: str, fallback_value: bool) -> bool: + # The PyQt wheels come in both non-commercial and commercial variants. So we need to check if a particular + # variant is installed before testing its version. + if hooks.check_requirement(package_basename): + return hooks.check_requirement(f"{package_basename} >= {version}") + if hooks.check_requirement(f"{package_basename}_commercial"): + return hooks.check_requirement(f"{package_basename}_commercial >= {version}") + return fallback_value + + # Load Qt information (called on first access to related fields) + def _load_qt_info(self): + """ + Load and process Qt library information. Called on the first access to the related attributes of the class + (e.g., `version` or `location`). + """ + + # Ensure self.version exists, even if PyQt{5,6}/PySide{2,6} cannot be imported. Hooks and util functions use + # `if .version` to check whether package was imported and other attributes are expected to be available. + # This also serves as a marker that initialization was already done. + self.version = None + + # Get library path information from Qt. See QLibraryInfo_. + @isolated.decorate + def _read_qt_library_info(package): + import os + import sys + import importlib + + # Import the Qt-based package + # equivalent to: from package.QtCore import QLibraryInfo, QCoreApplication + try: + QtCore = importlib.import_module('.QtCore', package) + except ModuleNotFoundError: + return None # Signal that package is unavailable + QLibraryInfo = QtCore.QLibraryInfo + QCoreApplication = QtCore.QCoreApplication + + # QLibraryInfo is not always valid until a QCoreApplication is instantiated. + app = QCoreApplication(sys.argv) # noqa: F841 + + # Qt6 deprecated QLibraryInfo.location() in favor of QLibraryInfo.path(), and + # QLibraryInfo.LibraryLocation enum was replaced by QLibraryInfo.LibraryPath. + if hasattr(QLibraryInfo, 'path'): + # Qt6; enumerate path enum values directly from the QLibraryInfo.LibraryPath enum. + path_names = [x for x in dir(QLibraryInfo.LibraryPath) if x.endswith('Path')] + location = {x: QLibraryInfo.path(getattr(QLibraryInfo.LibraryPath, x)) for x in path_names} + else: + # Qt5; in recent versions, location enum values can be enumeratd from QLibraryInfo.LibraryLocation. + # However, in older versions of Qt5 and its python bindings, that is unavailable. Hence the + # enumeration of "*Path"-named members of QLibraryInfo. + path_names = [x for x in dir(QLibraryInfo) if x.endswith('Path')] + location = {x: QLibraryInfo.location(getattr(QLibraryInfo, x)) for x in path_names} + + # Determine the python-based package location, by looking where the QtCore module is located. + package_location = os.path.dirname(QtCore.__file__) + + # Determine Qt version. Works for Qt 5.8 and later, where QLibraryInfo.version() was introduced. + try: + version = QLibraryInfo.version().segments() + except AttributeError: + version = [] + + return { + 'is_debug_build': QLibraryInfo.isDebugBuild(), + 'version': version, + 'location': location, + 'package_location': package_location, + } + + try: + qt_info = _read_qt_library_info(self.namespace) + except Exception as e: + logger.warning("%s: failed to obtain Qt library info: %s", self, e) + return + + # If package could not be imported, `_read_qt_library_info` returns None. In such cases, emit a debug message + # instead of a warning, because this initialization might be triggered by a helper function that is trying to + # determine availability of bindings by inspecting the `version` attribute of `QtLibraryInfo` for all bindings. + if qt_info is None: + logger.debug("%s: failed to obtain Qt library info: %s.QtCore could not be imported.", self, self.namespace) + return + + for k, v in qt_info.items(): + setattr(self, k, v) + + # Turn package_location into pathlib.Path(), and fully resolve it. + self.package_location = pathlib.Path(self.package_location).resolve() + + # Determine if the Qt is bundled with python package itself; this usually means we are dealing with with PyPI + # wheels. + resolved_qt_prefix_path = pathlib.Path(self.location['PrefixPath']).resolve() + self.qt_inside_package = ( + self.package_location == resolved_qt_prefix_path or # PySide2 and PySide6 Windows PyPI wheels + self.package_location in resolved_qt_prefix_path.parents + ) + + # Determine directory that contains Qt shared libraries. On non-Windows, this is typically location given by + # `LibrariesPath`. On Windows, it is usually `BinariesPath`, except for PySide PyPI wheels, where DLLs are + # placed in top-level `PrefixPath`. + if compat.is_win: + if self.qt_inside_package and not self.is_pyqt: + # Windows PyPI wheel + qt_lib_dir = self.location['PrefixPath'] + else: + qt_lib_dir = self.location['BinariesPath'] + else: + qt_lib_dir = self.location['LibrariesPath'] + self.qt_lib_dir = pathlib.Path(qt_lib_dir).resolve() + + # Module information list loading/processing + def _load_module_info(self): + """ + Process the Qt modules info definition list and construct two dictionaries: + - dictionary that maps Qt python module names to Qt module info entries + - dictionary that maps shared library names to Qt module info entries + """ + + self.python_modules = dict() + self.shared_libraries = dict() + + for entry in _modules_info.QT_MODULES_INFO: + # If entry specifies applicable bindings, check them + if entry.bindings: + applicable_bindings = _modules_info.process_namespace_strings(entry.bindings) + if self.namespace not in applicable_bindings: + continue + + # Create a QtModuleInfo entry + info_entry = QtModuleInfo( + module=entry.module, + shared_lib=f"Qt{self.qt_major}{entry.shared_lib}" if entry.shared_lib else None, + translations=entry.translations, + plugins=entry.plugins + ) + + # If we have python module (extension) name, create python-module-name -> info mapping. + if info_entry.module is not None: + self.python_modules[info_entry.module] = info_entry + + # If we have Qt module (shared library) name, create shared-lib-name -> info mapping. + if info_entry.shared_lib is not None: + self.shared_libraries[info_entry.shared_lib.lower()] = info_entry + + def _normalize_shared_library_name(self, filename): + """ + Normalize a shared library name into common form that we can use for look-ups and comparisons. + Primarily intended for Qt shared library names. + """ + + # Take base name, remove suffix, and lower case it. + lib_name = os.path.splitext(os.path.basename(filename))[0].lower() + # Linux libraries sometimes have a dotted version number -- ``libfoo.so.3``. It is now ''libfoo.so``, + # but the ``.so`` must also be removed. + if compat.is_linux and os.path.splitext(lib_name)[1] == '.so': + lib_name = os.path.splitext(lib_name)[0] + # Remove the "lib" prefix (Linux, macOS). + if lib_name.startswith('lib'): + lib_name = lib_name[3:] + # macOS: handle different naming schemes. PyPI wheels ship framework-enabled Qt builds, where shared + # libraries are part of .framework bundles (e.g., ``PyQt5/Qt5/lib/QtCore.framework/Versions/5/QtCore``). + # In Anaconda (Py)Qt installations, the shared libraries are installed in environment's library directory, + # and contain versioned extensions, e.g., ``libQt5Core.5.dylib``. + if compat.is_darwin: + if lib_name.startswith('qt') and not lib_name.startswith('qt' + str(self.qt_major)): + # Qt library from a framework bundle (e.g., ``QtCore``); change prefix from ``qt`` to ``qt5`` or + # ``qt6`` to match names in Windows/Linux. + lib_name = 'qt' + str(self.qt_major) + lib_name[2:] + if lib_name.endswith('.' + str(self.qt_major)): + # Qt library from Anaconda, which originally had versioned extension, e.g., ``libfoo.5.dynlib``. + # The above processing turned it into ``foo.5``, so we need to remove the last two characters. + lib_name = lib_name[:-2] + + # Handle cases with QT_LIBINFIX set to '_conda', i.e. conda-forge builds. + if lib_name.endswith('_conda'): + lib_name = lib_name[:-6] + + return lib_name + + # Collection + def collect_module(self, module_name): + """ + Collect all dependencies (hiddenimports, binaries, datas) for the given Qt python module. + + This function performs recursive analysis of extension module's link-time dependencies, and uses dictionaries + built by `_load_module_info` to discover associated plugin types, translation file base names, and hidden + imports that need to be collected. + """ + + # Accumulate all dependencies in a set to avoid duplicates. + hiddenimports = set() + translation_base_names = set() + plugin_types = set() + + # Exit if the requested library cannot be imported. + # NOTE: self..version can be empty list on older Qt5 versions (#5381). + if self.version is None: + return [], [], [] + + logger.debug('%s: processing module %s...', self, module_name) + + # Look up the associated Qt module information by python module name. + # This allows us to collect associated module data directly, even if there is no associated shared library + # (e.g., header-only Qt module, or statically-built one). + short_module_name = module_name.split('.', 1)[-1] # PySide2.QtModule -> QtModule + if short_module_name in self.python_modules: + qt_module_info = self.python_modules[short_module_name] + + # NOTE: no need to add a hiddenimport here, because this is the module under consideration. + + # Add plugins + plugin_types.update(qt_module_info.plugins) + + # Add translation base name(s) + translation_base_names.update(qt_module_info.translations) + + # Find the actual module extension file. + module_file = hooks.get_module_file_attribute(module_name) + + # Additional search path for shared library resolution. This is mostly required for library resolution on + # Windows (Linux and macOS binaries use run paths to find Qt libs). + qtlib_search_paths = [ + # For PyQt5 and PyQt6 wheels, shared libraries should be in BinariesPath, while for PySide2 and PySide6, + # they should be in PrefixPath. + self.location['BinariesPath' if self.is_pyqt else 'PrefixPath'], + ] + + # Walk through all the link-time dependencies of a dynamically-linked library (``.so``/``.dll``/``.dylib``). + imported_libraries = bindepend.get_imports(module_file, qtlib_search_paths) + while imported_libraries: + imported_lib_name, imported_lib_path = imported_libraries.pop() # (name, fullpath) tuple + + # Skip unresolved libraries + if imported_lib_path is None: + logger.debug("%s: ignoring unresolved library import %r", self, imported_lib_name) + continue + + # Normalize the shared library name + lib_name = self._normalize_shared_library_name(imported_lib_path) + logger.debug( + '%s: imported library %r, full path %r -> parsed name %r.', self, imported_lib_name, imported_lib_path, + lib_name + ) + + # PySide2 and PySide6 on linux seem to link all extension modules against libQt5Core, libQt5Network, and + # libQt5Qml (or their libQt6* equivalents). While the first two are reasonable, the libQt5Qml dependency + # pulls in whole QtQml module, along with its data and plugins, which in turn pull in several other Qt + # libraries, greatly inflating the bundle size (see #6447). + # + # Similarly, some extension modules (QtWebChannel, QtWebEngine*) seem to be also linked against libQt5Qml, + # even when the module can be used without having the whole QtQml module collected. + # + # Therefore, we explicitly prevent inclusion of QtQml based on the dynamic library dependency, except for + # QtQml* and QtQuick* modules, whose use directly implies the use of QtQml. + if lib_name in ("qt5qml", "qt6qml"): + if not short_module_name.startswith(('QtQml', 'QtQuick')): + logger.debug('%s: ignoring imported library %r.', self, lib_name) + continue + + # Use the parsed library name to look up associated Qt module information. + if lib_name in self.shared_libraries: + logger.debug('%s: collecting Qt module associated with %r.', self, lib_name) + + # Look up associated module info + qt_module_info = self.shared_libraries[lib_name] + + # If there is a python extension module associated with Qt module, add it to hiddenimports. Since this + # means that we (most likely) have a hook available for that module, we can avoid analyzing the shared + # library itself (i.e., stop the recursive analysis), because this will be done by the corresponding + # hook. + if qt_module_info.module: + if qt_module_info.module == short_module_name: + # The one exception is if we are analyzing shared library associated with the input module; in + # that case, avoid adding a hidden import and analyze the library's link-time dependencies. We + # do not need to worry about plugins and translations for this particular module, because those + # have been handled at the beginning of this function. + imported_libraries.update(bindepend.get_imports(imported_lib_path, qtlib_search_paths)) + else: + hiddenimports.add(self.namespace + "." + qt_module_info.module) + continue + + # Add plugins + plugin_types.update(qt_module_info.plugins) + + # Add translation base name(s) + translation_base_names.update(qt_module_info.translations) + + # Analyze the linked shared libraries for its dependencies (recursive analysis). + imported_libraries.update(bindepend.get_imports(imported_lib_path, qtlib_search_paths)) + + # Collect plugin files. + binaries = [] + for plugin_type in plugin_types: + binaries += self.collect_plugins(plugin_type) + + # Collect translation files. + datas = [] + translation_src = self.location['TranslationsPath'] + translation_dst = os.path.join(self.qt_rel_dir, 'translations') + + for translation_base_name in translation_base_names: + # Not all PyQt5 installations include translations. See + # https://github.com/pyinstaller/pyinstaller/pull/3229#issuecomment-359479893 + # and + # https://github.com/pyinstaller/pyinstaller/issues/2857#issuecomment-368744341. + translation_pattern = os.path.join(translation_src, translation_base_name + '_*.qm') + translation_files = glob.glob(translation_pattern) + if translation_files: + datas += [(translation_file, translation_dst) for translation_file in translation_files] + else: + logger.warning( + '%s: could not find translations with base name %r! These translations will not be collected.', + self, translation_base_name + ) + + # Convert hiddenimports to a list. + hiddenimports = list(hiddenimports) + + logger.debug( + '%s: dependencies for %s:\n' + ' hiddenimports = %r\n' + ' binaries = %r\n' + ' datas = %r', self, module_name, hiddenimports, binaries, datas + ) + + return hiddenimports, binaries, datas + + @staticmethod + def _filter_release_plugins(plugin_files): + """ + Filter the provided list of Qt plugin files and remove the debug variants, under the assumption that both the + release version of a plugin (qtplugin.dll) and its debug variant (qtplugind.dll) appear in the list. + """ + # All basenames for lookup + plugin_basenames = {os.path.normcase(os.path.basename(f)) for f in plugin_files} + # Process all given filenames + release_plugin_files = [] + for plugin_filename in plugin_files: + plugin_basename = os.path.normcase(os.path.basename(plugin_filename)) + if plugin_basename.endswith('d.dll'): + # If we can find a variant without trailing 'd' in the plugin list, then the DLL we are dealing with is + # a debug variant and needs to be excluded. + release_name = os.path.splitext(plugin_basename)[0][:-1] + '.dll' + if release_name in plugin_basenames: + continue + release_plugin_files.append(plugin_filename) + return release_plugin_files + + def collect_plugins(self, plugin_type): + """ + Collect all plugins of the specified type from the Qt plugin directory. + + Returns list of (src, dst) tuples. + """ + # Ensure plugin directory exists + plugin_src_dir = self.location['PluginsPath'] + if not os.path.isdir(plugin_src_dir): + raise Exception(f"Qt plugin directory '{plugin_src_dir}' does not exist!") + + # Collect all shared lib files in plugin type (sub)directory + plugin_files = misc.dlls_in_dir(os.path.join(plugin_src_dir, plugin_type)) + + # Windows: + # + # dlls_in_dir() grabs all files ending with ``*.dll``, ``*.so`` and ``*.dylib`` in a certain directory. On + # Windows this would grab debug copies of Qt plugins, which then causes PyInstaller to add a dependency on the + # Debug CRT *in addition* to the release CRT. + if compat.is_win: + plugin_files = self._filter_release_plugins(plugin_files) + + logger.debug("%s: found plugin files for plugin type %r: %r", self, plugin_type, plugin_files) + + plugin_dst_dir = os.path.join(self.qt_rel_dir, 'plugins', plugin_type) + + # Exclude plugins with invalid Qt dependencies. + binaries = [] + for plugin_file in plugin_files: + valid, reason = self._validate_plugin_dependencies(plugin_file) + if valid: + binaries.append((plugin_file, plugin_dst_dir)) + else: + logger.debug("%s: excluding plugin %r (%r)! Reason: %s", self, plugin_file, plugin_type, reason) + return binaries + + def _validate_plugin_dependencies(self, plugin_file): + """ + Validate Qt dependencies of the given Qt plugin file. For the plugin to pass validation, all its Qt dependencies + must be available (resolvable), and must be resolvable from the default Qt shared library directory (to avoid + pulling in libraries from unrelated Qt installations that happen to be in search path). + """ + + imported_libraries = bindepend.get_imports(plugin_file, search_paths=[self.qt_lib_dir]) + for imported_lib_name, imported_lib_path in imported_libraries: + # Parse/normalize the (unresolved) library name, to determine if dependency is a Qt shared library. If not, + # skip the validation. + lib_name = self._normalize_shared_library_name(imported_lib_name) + if not lib_name.startswith(f"qt{self.qt_major}"): + continue + + if imported_lib_path is None: + return False, f"Missing Qt dependency {imported_lib_name!r}." + + imported_lib_path = pathlib.Path(imported_lib_path).resolve() + if self.qt_lib_dir not in imported_lib_path.parents: + return ( + False, + f"Qt dependency {imported_lib_name!r} ({str(imported_lib_path)!r}) has been resolved outside of " + f"the Qt shared library directory ({str(self.qt_lib_dir)!r})." + ) + + return True, None + + def _collect_all_or_none(self, mandatory_dll_patterns, optional_dll_patterns=None): + """ + Try to find Qt DLLs from the specified mandatory pattern list. If all mandatory patterns resolve to DLLs, + collect them all, as well as any DLLs from the optional pattern list. If a mandatory pattern fails to resolve + to a DLL, return an empty list. + + This allows all-or-none collection of particular groups of Qt DLLs that may or may not be available. + """ + optional_dll_patterns = optional_dll_patterns or [] + + # Package parent path; used to preserve the directory structure when DLLs are collected from the python + # package (e.g., PyPI wheels). + package_parent_path = self.package_location.parent + + # On Windows, DLLs are typically placed in `location['BinariesPath']`, except for PySide PyPI wheels, where + # `location['PrefixPath']` is used. This difference is already handled by `qt_lib_dir`, which is also fully + # resolved. + dll_path = self.qt_lib_dir + + # Helper for processing single DLL pattern + def _process_dll_pattern(dll_pattern): + discovered_dlls = [] + + dll_files = dll_path.glob(dll_pattern) + for dll_file in dll_files: + if package_parent_path in dll_file.parents: + # The DLL is located within python package; preserve the layout + dst_dll_dir = dll_file.parent.relative_to(package_parent_path) + else: + # The DLL is not located within python package; collect into top-level directory + dst_dll_dir = '.' + discovered_dlls.append((str(dll_file), str(dst_dll_dir))) + + return discovered_dlls + + # Process mandatory patterns + collected_dlls = [] + for pattern in mandatory_dll_patterns: + discovered_dlls = _process_dll_pattern(pattern) + if not discovered_dlls: + return [] # Mandatory pattern resulted in no DLLs; abort + collected_dlls += discovered_dlls + + # Process optional patterns + for pattern in optional_dll_patterns: + collected_dlls += _process_dll_pattern(pattern) + + return collected_dlls + + # Collect required Qt binaries, but only if all binaries in a group exist. + def collect_extra_binaries(self): + """ + Collect extra binaries/DLLs required by Qt. These include ANGLE DLLs, OpenGL software renderer DLL, and ICU + DLLs. Applicable only on Windows (on other OSes, empty list is returned). + """ + + binaries = [] + + # Applicable only to Windows. + if not compat.is_win: + return [] + + # OpenGL: EGL/GLES via ANGLE, software OpenGL renderer. + binaries += self._collect_all_or_none(['libEGL.dll', 'libGLESv2.dll'], ['d3dcompiler_??.dll']) + binaries += self._collect_all_or_none(['opengl32sw.dll']) + + # Include ICU files, if they exist. + # See the "Deployment approach" section at the top of this file. + binaries += self._collect_all_or_none(['icudt??.dll', 'icuin??.dll', 'icuuc??.dll']) + + return binaries + + # Collect additional shared libraries required for SSL support in QtNetwork, if they are available. + # Primarily applicable to Windows (see issue #3520, #4048). + def collect_qtnetwork_files(self): + """ + Collect extra binaries/shared libraries required by the QtNetwork module, such as OpenSSL shared libraries. + """ + + # No-op if requested Qt-based package is not available. + if self.version is None: + return [] + + # Check if QtNetwork supports SSL and has OpenSSL backend available (Qt >= 6.1). + # Also query the run-time OpenSSL version, so we know what dynamic libraries we need to search for. + @isolated.decorate + def _check_if_openssl_enabled(package): + import sys + import importlib + + # Import the Qt-based package + # equivalent to: from package.QtCore import QCoreApplication + QtCore = importlib.import_module('.QtCore', package) + QCoreApplication = QtCore.QCoreApplication + QLibraryInfo = QtCore.QLibraryInfo + # equivalent to: from package.QtNetwork import QSslSocket + QtNetwork = importlib.import_module('.QtNetwork', package) + QSslSocket = QtNetwork.QSslSocket + + # Instantiate QCoreApplication to suppress warnings + app = QCoreApplication(sys.argv) # noqa: F841 + + if not QSslSocket.supportsSsl(): + return False, None + + # Query the run-time OpenSSL version + openssl_version = QSslSocket.sslLibraryVersionNumber() + + # For Qt >= 6.1, check if `openssl` TLS backend is available + try: + qt_version = QLibraryInfo.version().segments() + except AttributeError: + qt_version = [] # Qt <= 5.8 + + if qt_version < [6, 1]: + return True, openssl_version # TLS backends not implemented yet + + return ('openssl' in QSslSocket.availableBackends(), openssl_version) + + openssl_enabled, openssl_version = _check_if_openssl_enabled(self.namespace) + if not openssl_enabled or openssl_version == 0: + logger.debug("%s: QtNetwork: does not support SSL or does not use OpenSSL.", self) + return [] + + # The actual search is handled in OS-specific ways. + if compat.is_win: + return self._collect_qtnetwork_openssl_windows(openssl_version) + elif compat.is_darwin: + return self._collect_qtnetwork_openssl_macos(openssl_version) + elif compat.is_linux: + return self._collect_qtnetwork_openssl_linux(openssl_version) + else: + logger.warning("%s: QtNetwork: collection of OpenSSL not implemented for this platform!") + return [] + + def _collect_qtnetwork_openssl_windows(self, openssl_version): + """ + Windows-specific collection of OpenSSL DLLs required by QtNetwork module. + """ + + # Package parent path; used to preserve the directory structure when DLLs are collected from the python + # package (e.g., PyPI wheels). + package_parent_path = self.package_location.parent + + # The OpenSSL DLLs might be shipped with PyPI wheel (PyQt5), might be available in the environment (msys2, + # anaconda), or might be expected to be available in the environment (PySide2, PySide6, PyQt6 PyPI wheels). + # + # The OpenSSL DLL naming scheme depends on the version: + # - OpenSSL 1.0.x: libeay32.dll, ssleay32.dll + # - OpenSSL 1.1.x 32-bit: libssl-1_1.dll, libcrypto-1_1.dll + # - OpenSSL 1.1.x 64-bit: libssl-1_1-x64.dll, libcrypto-1_1-x64.dll + # - OpenSSL 3.0.x 32-bit: libssl-1.dll, libcrypto-3.dll + # - OpenSSL 3.0.x 64-bit: libssl-3-x64.dll, libcrypto-3-x64.dll + # + # The official Qt builds (which are used by PySide and PyQt PyPI wheels) seem to be build against: + # - OpenSSL 1.1.x starting with Qt5 5.14.2: + # https://www.qt.io/blog/2019/06/17/qt-5-12-4-released-support-openssl-1-1-1 + # - OpenSSL 3.x starting with Qt6 6.5.0: + # https://www.qt.io/blog/moving-to-openssl-3-in-binary-builds-starting-from-qt-6.5-beta-2 + # + # However, a package can build Qt against OpenSSL version of their own choice. For example, at the time of + # writing, both mingw-w64-x86_64-qt5-base 5.15.11+kde+r138-1 and mingw-w64-x86_64-qt6-base 6.6.0-2 packages + # depend on mingw-w64-x86_64-openssl 3.1.4-1 (so OpenSSL 3). + # + # Luckily, we can query the run-time version of OpenSSL by calling `QSslSocket.sslLibraryVersionNumber()`, + # and narrow down the search for specific version. + if openssl_version >= 0x10000000 and openssl_version < 0x10100000: + # OpenSSL 1.0.x - used by old Qt5 builds + dll_names = ( + 'libeay32.dll', + 'ssleay32.dll', + ) + logger.debug("%s: QtNetwork: looking for OpenSSL 1.0.x DLLs: %r", self, dll_names) + elif openssl_version >= 0x10100000 and openssl_version < 0x30000000: + # OpenSSL 1.1.x + dll_names = ( + 'libssl-1_1-x64.dll' if compat.is_64bits else 'libssl-1_1.dll', + 'libcrypto-1_1-x64.dll' if compat.is_64bits else 'libcrypto-1_1.dll', + ) + logger.debug("%s: QtNetwork: looking for OpenSSL 1.1.x DLLs: %r", self, dll_names) + elif openssl_version >= 0x30000000 and openssl_version < 0x40000000: + # OpenSSL 3.0.x + dll_names = ( + 'libssl-3-x64.dll' if compat.is_64bits else 'libssl-3.dll', + 'libcrypto-3-x64.dll' if compat.is_64bits else 'libcrypto-3.dll', + ) + logger.debug("%s: QtNetwork: looking for OpenSSL 3.0.x DLLs: %r", self, dll_names) + else: + dll_names = [] # Nothing to search for + logger.warning("%s: QtNetwork: unsupported OpenSSL version: %X", self, openssl_version) + + binaries = [] + found_in_package = False + for dll in dll_names: + # Attempt to resolve the DLL path + dll_file_path = bindepend.resolve_library_path(dll, search_paths=[self.qt_lib_dir]) + if dll_file_path is None: + continue + dll_file_path = pathlib.Path(dll_file_path).resolve() + if package_parent_path in dll_file_path.parents: + # The DLL is located within python package; preserve the layout + dst_dll_path = dll_file_path.parent.relative_to(package_parent_path) + found_in_package = True + else: + # The DLL is not located within python package; collect into top-level directory + dst_dll_path = '.' + binaries.append((str(dll_file_path), str(dst_dll_path))) + + # If we found at least one OpenSSL DLL in the bindings' python package directory, discard all external + # OpenSSL DLLs. + if found_in_package: + binaries = [(dll_src_path, dll_dest_path) for dll_src_path, dll_dest_path in binaries + if package_parent_path in pathlib.Path(dll_src_path).parents] + + return binaries + + def _collect_qtnetwork_openssl_macos(self, openssl_version): + """ + macOS-specific collection of OpenSSL dylibs required by QtNetwork module. + """ + + # The official Qt5 builds on macOS (shipped by PyPI wheels) appear to be built with Apple's SecureTransport API + # instead of OpenSSL; for example, `QSslSocket.sslLibraryVersionNumber` returns 0, while + # `sslLibraryVersionString()` returns "Secure Transport, macOS 12.6". So with PySide2 and PyQt5, we do not need + # to worry about collection of OpenSSL shared libraries. + # + # Support for OpenSSL was introduced in Qt 6.1 with `openssl` TLS backend; the official Qt6 builds prior to 6.5 + # seem to be built with OpenSSL 1.1.x, and later versions with 3.0.x. However, PySide6 and PyQt6 PyPI wheels do + # not ship OpenSSL dynamic libraries at all , so whether `openssl` TLS backend is used or not depends on the + # presence of externally provided OpenSSL dynamic libraries (for example, provided by Homebrew). It is worth + # noting that python.org python installers *do* provide OpenSSL shared libraries (1.1.x for python <= 3.10, + # 3.0.x for python >= 3.12, and both for python 3.11) for its `_ssl` extension - however, these are NOT visible + # to Qt and its QtNetwork module. + # + # When the frozen application is built and we collect python's `_ssl` extension, we also collect the OpenSSL + # shared libraries shipped by python. So at least in theory, those should be available to QtNetwork module as + # well (assuming they are of compatible version). However, this is not exactly the case - QtNetwork looks for + # the libraries in locations given by `DYLD_LIBRARY_PATH` environment variable and in .app/Contents/Frameworks + # (if the program is an .app bundle): + # + # https://github.com/qt/qtbase/blob/6.6.0/src/plugins/tls/openssl/qsslsocket_openssl_symbols.cpp#L590-L599 + # + # So it works out-of-the box for our .app bundles, because starting with PyInstaller 6.0, `sys._MEIPASS` is in + # .app/Contents/Frameworks. But it does not with POSIX builds, because bootloader does not modify the + # `DYLD_LIBRARY_PATH` environment variable to include `sys._MEIPASS` (since we usually do not need that; + # regular linked library resolution in our macOS builds is done via path rewriting and rpaths). So either we + # need a run-time hook to add `sys._MEIPASS` to `DYLD_LIBRARY_PATH`, or modify the bootloader to always do that. + # + # Collecting the OpenSSL library and making it discoverable by adding `sys._MEIPASS` to `DYLD_LIBRARY_PATH` + # should also prevent QtNetwork from "accidentally" pulling in Homebrew version at run-time (if Homebrew is + # installed on the target system and provides compatible OpenSSL version). + # + # Therefore, try to resolve OpenSSL library via the version indicated by `QSslSocket.sslLibraryVersionNumber`; + # however, we first explicitly search only {sys.base_prefix}/lib (which is where python.org builds put their + # dynamic libs), and only if that fails, perform regular dylib path resolution. This way we ensure that if the + # OpenSSL dylibs are provided by python itself, we always prefer those over the Homebrew version (since we are + # very likely going to collect them for python's `_ssl` extension anyway). + + # As per above text, we need to worry only about Qt6, and thus OpenSSL 1.1.x or 3.0.x + if openssl_version >= 0x10100000 and openssl_version < 0x30000000: + # OpenSSL 1.1.x + dylib_names = ( + 'libcrypto.1.1.dylib', + 'libssl.1.1.dylib', + ) + logger.debug("%s: QtNetwork: looking for OpenSSL 1.1.x dylibs: %r", self, dylib_names) + elif openssl_version >= 0x30000000 and openssl_version < 0x40000000: + # OpenSSL 3.0.x + dylib_names = ( + 'libcrypto.3.dylib', + 'libssl.3.dylib', + ) + logger.debug("%s: QtNetwork: looking for OpenSSL 3.0.x dylibs: %r", self, dylib_names) + else: + dylib_names = [] # Nothing to search for + logger.warning("%s: QtNetwork: unsupported OpenSSL version: %X", self, openssl_version) + + # Compared to Windows, we do not have to worry about dylib's path preservation, as these are never part of + # the package, and are therefore always collected to the top-level application directory. + binaries = [] + base_prefix_lib_dir = os.path.join(compat.base_prefix, 'lib') + for dylib in dylib_names: + # First, attempt to resolve using only {sys.base_prefix}/lib - `bindepend.resolve_library_path` uses + # standard dyld search semantics and uses the given search paths as fallback (and would therefore + # favor Homebrew-provided version of the library). + dylib_path = bindepend._resolve_library_path_in_search_paths(dylib, search_paths=[base_prefix_lib_dir]) + if dylib_path is None: + dylib_path = bindepend.resolve_library_path(dylib, search_paths=[base_prefix_lib_dir, self.qt_lib_dir]) + if dylib_path is None: + continue + binaries.append((str(dylib_path), '.')) + + return binaries + + def _collect_qtnetwork_openssl_linux(self, openssl_version): + """ + Linux-specific collection of OpenSSL dylibs required by QtNetwork module. + """ + + # Out of the supported OSes, Linux is by far the most straight-forward, because OpenSSL shared libraries are + # expected to be provided by the system. So we can just use standard library path resolution with library names + # inferred from the run-time OpenSSL version. At run-time, QtNetwork searches paths from `LD_LIBRARY_PATH`, and + # on Linux, our bootloader already adds `sys._MEIPASS` to that environment variable. + + if openssl_version >= 0x10000000 and openssl_version < 0x10100000: + # OpenSSL 1.0.x - used by old Qt5 builds + shlib_names = ( + 'libcrypto.so.10', + 'libssl.so.10', + ) + logger.debug("%s: QtNetwork: looking for OpenSSL 1.0.x shared libraries: %r", self, shlib_names) + elif openssl_version >= 0x10100000 and openssl_version < 0x30000000: + # OpenSSL 1.1.x + shlib_names = ( + 'libcrypto.so.1.1', + 'libssl.so.1.1', + ) + logger.debug("%s: QtNetwork: looking for OpenSSL 1.1.x shared libraries: %r", self, shlib_names) + elif openssl_version >= 0x30000000 and openssl_version < 0x40000000: + # OpenSSL 3.0.x + shlib_names = ( + 'libcrypto.so.3', + 'libssl.so.3', + ) + logger.debug("%s: QtNetwork: looking for OpenSSL 3.0.x shared libraries: %r", self, shlib_names) + else: + shlib_names = [] # Nothing to search for + logger.warning("%s: QtNetwork: unsupported OpenSSL version: %X", self, openssl_version) + + binaries = [] + for shlib in shlib_names: + shlib_path = bindepend.resolve_library_path(shlib) + if shlib_path is None: + continue + binaries.append((str(shlib_path), '.')) + + return binaries + + def collect_qtqml_files(self): + """ + Collect additional binaries and data for QtQml module. + """ + + # No-op if requested Qt-based package is not available. + if self.version is None: + return [], [] + + # Not all PyQt5/PySide2 installs have QML files. In this case, location['Qml2ImportsPath'] is empty. + # Furthermore, even if location path is provided, the directory itself may not exist. + # + # https://github.com/pyinstaller/pyinstaller/pull/3229#issuecomment-359735031 + # https://github.com/pyinstaller/pyinstaller/issues/3864 + # + # In Qt 6, Qml2ImportsPath was deprecated in favor of QmlImportsPath. The former is not available in PySide6 + # 6.4.0 anymore (but is in PyQt6 6.4.0). Use the new QmlImportsPath if available. + if 'QmlImportsPath' in self.location: + qml_src_dir = self.location['QmlImportsPath'] + else: + qml_src_dir = self.location['Qml2ImportsPath'] + if not qml_src_dir or not os.path.isdir(qml_src_dir): + logger.warning('%s: QML directory %r does not exist. QML files not packaged.', self, qml_src_dir) + return [], [] + + qml_src_path = pathlib.Path(qml_src_dir).resolve() + qml_dest_path = pathlib.PurePath(self.qt_rel_dir) / 'qml' + + binaries = [] + datas = [] + + # Helper that computes the destination directory for the given file or directory from a QML plugin directory. + def _compute_dest_dir(src_filename): + if src_filename.is_dir(): + rel_path = src_filename.relative_to(qml_src_path) + else: + rel_path = src_filename.relative_to(qml_src_path).parent + return qml_dest_path / rel_path + + # Discover all QML plugin sub-directories by searching for `qmldir` files. + qmldir_files = qml_src_path.rglob('**/qmldir') + for qmldir_file in sorted(qmldir_files): + plugin_dir = qmldir_file.parent + logger.debug("%s: processing QML plugin directory %s", self, plugin_dir) + + try: + # Obtain lists of source files (separated into binaries and data files). + plugin_binaries, plugin_datas = self._process_qml_plugin(qmldir_file) + # Convert into (src, dest) tuples. + binaries += [(str(src_file), str(_compute_dest_dir(src_file))) for src_file in plugin_binaries] + datas += [(str(src_file), str(_compute_dest_dir(src_file))) for src_file in plugin_datas] + except Exception: + logger.warning("%s: failed to process QML plugin directory %s", self, plugin_dir, exc_info=True) + + return binaries, datas + + # https://doc.qt.io/qt-6/qtqml-modules-qmldir.html#plugin-declaration + # [optional] plugin [ + _qml_plugin_def = re.compile(r"^(?:(?:optional)\s+)?(?:plugin)\s+(?P\w+)(?:\s+(?P\.+))?$") + + def _process_qml_plugin(self, qmldir_file): + """ + Processes the QML directory corresponding to the given `qmldir` file. + + Returns lists of binaries and data files, but only the source file names. It is up to caller to turn these into + lists of (src, dest) tuples. + """ + plugin_dir = qmldir_file.parent + + plugin_binaries = set() + + # Read the `qmldir` file to determine the names of plugin binaries, if any. + contents = qmldir_file.read_text(encoding="utf-8") + for line in contents.splitlines(): + m = self._qml_plugin_def.match(line) + if m is None: + continue + + plugin_name = m.group("name") + plugin_path = m.group("path") + + # We currently do not support custom plugin path - neither relative nor absolute (the latter will never + # be supported, because to make it relocatable, we would need to modify the `qmpldir file`). + if plugin_path is not None: + raise Exception(f"Non-empty plugin path ({plugin_path!r} is not supported yet!") + + # Turn the plugin base name into actual shared lib name. + if compat.is_linux: + plugin_file = plugin_dir / f"lib{plugin_name}.so" + elif compat.is_win: + plugin_file = plugin_dir / f"{plugin_name}.dll" + elif compat.is_darwin: + plugin_file = plugin_dir / f"lib{plugin_name}.dylib" + else: + continue # This implicitly disables subsequent validation on unhandled platforms. + + # Warn if plugin file does not exist + if not plugin_file.is_file(): + logger.warn("%s: QML plugin binary %r does not exist!", str(plugin_file)) + continue + + plugin_binaries.add(plugin_file) + + # Exclude plugins with invalid Qt dependencies. + invalid_binaries = False + for plugin_binary in plugin_binaries: + valid, reason = self._validate_plugin_dependencies(plugin_binary) + if not valid: + logger.debug("%s: excluding QML plugin binary %r! Reason: %s", self, str(plugin_binary), reason) + invalid_binaries = True + + # If there was an invalid binary, discard the plugin. + if invalid_binaries: + logger.debug("%s: excluding QML plugin directory %r due to invalid plugin binaries!", self, str(plugin_dir)) + return [], [] + + # Generate binaries list. + binaries = sorted(plugin_binaries) + + # Generate list of data files - all content of this directory, except for the plugin binaries. Sub-directories + # are included if they do not contain a `qmldir` file (we do not recurse into the directory, but instead pass + # only its name, leaving the recursion to PyInstaller's built-in expansion of paths returned by hooks). + datas = [] + for entry in plugin_dir.iterdir(): + if entry.is_file(): + if entry in plugin_binaries: + continue + else: + if (entry / "qmldir").is_file(): + continue + datas.append(entry) + + return binaries, datas + + def collect_qtwebengine_files(self): + """ + Collect QtWebEngine helper process executable, translations, and resources. + """ + + binaries = [] + datas = [] + + # Output directory (varies between PyQt and PySide and among OSes; the difference is abstracted by + # QtLibraryInfo.qt_rel_dir) + rel_data_path = self.qt_rel_dir + + is_macos_framework = False + if compat.is_darwin: + # Determine if we are dealing with a framework-based Qt build (e.g., PyPI wheels) or a dylib-based one + # (e.g., Anaconda). The former requires special handling, while the latter is handled in the same way as + # Windows and Linux builds. + is_macos_framework = os.path.exists( + os.path.join(self.location['LibrariesPath'], 'QtWebEngineCore.framework') + ) + + if is_macos_framework: + # macOS .framework bundle + src_framework_path = os.path.join(self.location['LibrariesPath'], 'QtWebEngineCore.framework') + + # If Qt libraries are bundled with the package, collect the .framework bundle into corresponding package's + # subdirectory, because binary dependency analysis will also try to preserve the directory structure. + # However, if we are collecting from system-wide Qt installation (e.g., Homebrew-installed Qt), the binary + # depndency analysis will attempt to re-create .framework bundle in top-level directory, so we need to + # collect the extra files there. + bundled_qt_libs = pathlib.Path(self.package_location) in pathlib.Path(src_framework_path).parents + if bundled_qt_libs: + dst_framework_path = os.path.join(rel_data_path, 'lib/QtWebEngineCore.framework') + else: + dst_framework_path = 'QtWebEngineCore.framework' # In top-level directory + + # Determine the version directory - for now, we assume we are dealing with single-version framework; + # i.e., the Versions directory contains only a single directory, and Current symlink to it. + versions = sorted([ + version for version in os.listdir(os.path.join(src_framework_path, 'Versions')) if version != 'Current' + ]) + if len(versions) == 0: + raise RuntimeError("Could not determine version of the QtWebEngineCore.framework!") + elif len(versions) > 1: + logger.warning( + "Found multiple versions in QtWebEngineCore.framework (%r) - using the last one!", versions + ) + version = versions[-1] + + # Collect the Helpers directory. In well-formed .framework bundles (such as the ones provided by Homebrew), + # the Helpers directory is located in the versioned directory, and symlinked to the top-level directory. + src_helpers_path = os.path.join(src_framework_path, 'Versions', version, 'Helpers') + dst_helpers_path = os.path.join(dst_framework_path, 'Versions', version, 'Helpers') + if not os.path.exists(src_helpers_path): + # Alas, the .framework bundles shipped with contemporary PyPI PyQt/PySide wheels are not well-formed + # (presumably because .whl cannot preserve symlinks?). The Helpers in the top-level directory is in fact + # the hard copy, and there is either no Helpers in versioned directory, or there is a duplicate. + # So fall back to collecting from the top-level, but collect into versioned directory in order to + # be compliant with codesign's expectations. + src_helpers_path = os.path.join(src_framework_path, 'Helpers') + + helper_datas = hooks.collect_system_data_files(src_helpers_path, dst_helpers_path) + + # Filter out the actual helper executable from datas, and add it to binaries instead. This ensures that it + # undergoes additional binary processing that rewrites the paths to linked libraries. + HELPER_EXE = 'QtWebEngineProcess.app/Contents/MacOS/QtWebEngineProcess' + for src_name, dest_name in helper_datas: + if src_name.endswith(HELPER_EXE): + binaries.append((src_name, dest_name)) + else: + datas.append((src_name, dest_name)) + + # Collect the Resources directory; same logic is used as with Helpers directory. + src_resources_path = os.path.join(src_framework_path, 'Versions', version, 'Resources') + dst_resources_path = os.path.join(dst_framework_path, 'Versions', version, 'Resources') + if not os.path.exists(src_resources_path): + src_resources_path = os.path.join(src_framework_path, 'Resources') + + datas += hooks.collect_system_data_files(src_resources_path, dst_resources_path) + + # NOTE: the QtWebEngineProcess helper is actually sought within the `QtWebEngineCore.framework/Helpers`, + # which ought to be a symlink to `QtWebEngineCore.framework/Versions/Current/Helpers`, where `Current` + # is also a symlink to the actual version directory, `A`. + # + # These symlinks are created automatically when the TOC list of collected resources is post-processed + # using `PyInstaller.utils.osx.collect_files_from_framework_bundles` helper, so we do not have to + # worry about them here... + else: + # Windows and linux (or Anaconda on macOS) + locales = 'qtwebengine_locales' + resources = 'resources' + + # Translations + datas.append(( + os.path.join(self.location['TranslationsPath'], locales), + os.path.join(rel_data_path, 'translations', locales), + )) + + # Resources; ``DataPath`` is the base directory for ``resources``, as per the + # `docs `_. + datas.append((os.path.join(self.location['DataPath'], resources), os.path.join(rel_data_path, resources)),) + + # Helper process executable (QtWebEngineProcess), located in ``LibraryExecutablesPath``. + # The target directory is determined as `LibraryExecutablesPath` relative to `PrefixPath`. On Windows, + # this should handle the differences between PySide2/PySide6 and PyQt5/PyQt6 PyPI wheel layout. + rel_helper_path = os.path.relpath(self.location['LibraryExecutablesPath'], self.location['PrefixPath']) + + # However, on Linux, we need to account for distribution-packaged Qt, where `LibraryExecutablesPath` might + # be nested deeper under `PrefixPath` than anticipated (w.r.t. PyPI wheel layout). For example, in Fedora, + # the helper is located under `/usr/lib64/qt5/libexec/QtWebEngineProcess`, with `PrefixPath` being `/usr` + # and `LibraryExecutablesPath` being `/usr/lib64/qt5/libexec/`, so the relative path ends up being + # `lib64/qt5/libexec` instead of just `libexec`. So on linux, we explicitly force the PyPI-compliant + # layout, by overriding relative helper path to just `libexec`. + if compat.is_linux and rel_helper_path != "libexec": + logger.info( + "%s: overriding relative destination path of QtWebEngineProcess helper from %r to %r!", self, + rel_helper_path, "libexec" + ) + rel_helper_path = "libexec" + + # Similarly, force the relative helper path for PySide2/PySide6 on Windows to `.`. This is already the case + # with PyPI PySide Windows wheels. But it is not the case with conda-installed PySide2, where the Qt's + # `PrefixPath` is for example `C:/Users//miniconda3/envs//Library`, while the corresponding + # `LibraryExecutablesPath` is `C:/Users//miniconda3/envs//Library/bin`. + if compat.is_win and not self.is_pyqt and rel_helper_path != ".": + logger.info( + "%s: overriding relative destination path of QtWebEngineProcess helper from %r to %r!", self, + rel_helper_path, "." + ) + rel_helper_path = "." + + dest = os.path.normpath(os.path.join(rel_data_path, rel_helper_path)) + binaries.append((os.path.join(self.location['LibraryExecutablesPath'], 'QtWebEngineProcess*'), dest)) + + # The helper QtWebEngineProcess executable should have an accompanying qt.conf file that helps it locate the + # Qt shared libraries. Try collecting it as well + qt_conf_file = os.path.join(self.location['LibraryExecutablesPath'], 'qt.conf') + if not os.path.isfile(qt_conf_file): + # The file seems to have been dropped from Qt 6.3 (and corresponding PySide6 and PyQt6) due to + # redundancy; however, we still need it in the frozen application - so generate our own. + from PyInstaller.config import CONF # workpath + # Relative path to root prefix of bundled Qt - this corresponds to the "inverse" of `rel_helper_path` + # variable that we computed earlier. + if rel_helper_path == '.': + rel_prefix = '.' + else: + # Replace each directory component in `rel_helper_path` with `..`. + rel_prefix = os.path.join(*['..' for _ in range(len(rel_helper_path.split(os.pathsep)))]) + # We expect the relative path to be either . or .. depending on PySide/PyQt layout; if that is not the + # case, warn about irregular path. + if rel_prefix not in ('.', '..'): + logger.warning( + "%s: unexpected relative Qt prefix path for QtWebEngineProcess qt.conf: %s", self, rel_prefix + ) + # The Qt docs on qt.conf (https://doc.qt.io/qt-5/qt-conf.html) recommend using forward slashes on + # Windows as well, due to backslash having to be escaped. This should not matter as we expect the + # relative path to be . or .., but you never know... + if os.sep == '\\': + rel_prefix = rel_prefix.replace(os.sep, '/') + # Create temporary file in workpath + qt_conf_file = os.path.join(CONF['workpath'], "qt.conf") + with open(qt_conf_file, 'w', encoding='utf-8') as fp: + print("[Paths]", file=fp) + print("Prefix = {}".format(rel_prefix), file=fp) + datas.append((qt_conf_file, dest)) + + # Add Linux-specific libraries. + if compat.is_linux: + # The automatic library detection fails for `NSS `_, + # which is used by QtWebEngine. In some distributions, the ``libnss`` supporting libraries are stored in a + # subdirectory ``nss``. Since ``libnss`` is not linked against them but loads them dynamically at run-time, + # we need to search for and add them. + # + # Specifically, the files we are looking for are + # - libfreebl3.so + # - libfreeblpriv3.so + # - libnssckbi.so + # - libnssdbm3.so + # - libsoftokn3.so + # and they might be in the same directory as ``libnss3.so`` (instead of ``nss`` subdirectory); this is + # the case even with contemporary Debian releases. See + # https://packages.debian.org/bullseye/amd64/libnss3/filelist + # vs. + # https://packages.debian.org/bookworm/amd64/libnss3/filelist + + # Analyze imports of ``QtWebEngineCore`` extension module, and look for ``libnss3.so`` to determine its + # parent directory. + libnss_dir = None + module_file = hooks.get_module_file_attribute(self.namespace + '.QtWebEngineCore') + for lib_name, lib_path in bindepend.get_imports(module_file): # (name, fullpath) tuples + if lib_path is None: + continue # Skip unresolved libraries + # Look for ``libnss3.so``. + if os.path.basename(lib_path).startswith('libnss3.so'): + libnss_dir = os.path.dirname(lib_path) + break + + # Search for NSS libraries + logger.debug("%s: QtWebEngineCore is linked against libnss3.so; collecting NSS libraries...", self) + if libnss_dir is not None: + # Libraries to search for + NSS_LIBS = [ + 'libfreebl3.so', + 'libfreeblpriv3.so', + 'libnssckbi.so', + 'libnssdbm3.so', + 'libsoftokn3.so', + ] + # Directories (relative to `libnss_dir`) to search in. Also serve as relative destination paths. + NSS_LIB_SUBDIRS = [ + 'nss', + '.', + ] + + for subdir in NSS_LIB_SUBDIRS: + for lib_name in NSS_LIBS: + lib_file = os.path.normpath(os.path.join(libnss_dir, subdir, lib_name)) + if os.path.isfile(lib_file): + logger.debug("%s: collecting NSS library: %r", self, lib_file) + binaries.append((lib_file, subdir)) + + return binaries, datas + + +# Provide single instances of this class to avoid each hook constructing its own. +pyqt5_library_info = QtLibraryInfo('PyQt5') +pyqt6_library_info = QtLibraryInfo('PyQt6') +pyside2_library_info = QtLibraryInfo('PySide2') +pyside6_library_info = QtLibraryInfo('PySide6') + + +def get_qt_library_info(namespace): + """ + Return QtLibraryInfo instance for the given namespace. + """ + if namespace == 'PyQt5': + return pyqt5_library_info + if namespace == 'PyQt6': + return pyqt6_library_info + elif namespace == 'PySide2': + return pyside2_library_info + elif namespace == 'PySide6': + return pyside6_library_info + + raise ValueError(f'Invalid namespace: {namespace}!') + + +# add_qt_dependencies +# -------------------- +# Generic implemnentation that finds the Qt 5/6 dependencies based on the hook name of a PyQt5/PyQt6/PySide2/PySide6 +# hook. Returns (hiddenimports, binaries, datas). Typical usage: +# ``hiddenimports, binaries, datas = add_qt5_dependencies(__file__)``. +def add_qt_dependencies(hook_file): + # Find the module underlying this Qt hook: change ``/path/to/hook-PyQt5.blah.py`` to ``PyQt5.blah``. + hook_name, hook_ext = os.path.splitext(os.path.basename(hook_file)) + assert hook_ext.startswith('.py') + assert hook_name.startswith('hook-') + module_name = hook_name[5:] + namespace = module_name.split('.')[0] + + # Retrieve Qt library info structure.... + qt_info = get_qt_library_info(namespace) + # ... and use it to collect module dependencies + return qt_info.collect_module(module_name) + + +# add_qt5_dependencies +# -------------------- +# Find the Qt5 dependencies based on the hook name of a PySide2/PyQt5 hook. Returns (hiddenimports, binaries, datas). +# Typical usage: ``hiddenimports, binaries, datas = add_qt5_dependencies(__file__)``. +add_qt5_dependencies = add_qt_dependencies # Use generic implementation + +# add_qt6_dependencies +# -------------------- +# Find the Qt6 dependencies based on the hook name of a PySide6/PyQt6 hook. Returns (hiddenimports, binaries, datas). +# Typical usage: ``hiddenimports, binaries, datas = add_qt6_dependencies(__file__)``. +add_qt6_dependencies = add_qt_dependencies # Use generic implementation + + +# A helper for ensuring that only one Qt bindings package is collected into frozen application. Intended to be called +# from hooks for top-level bindings packages. +def ensure_single_qt_bindings_package(qt_bindings): + # For the lack of better alternative, use CONF structure. Note that this enforces single bindings for the whole + # spec file instead of individual Analysis instances! + from PyInstaller.config import CONF + + seen_qt_bindings = CONF.get("_seen_qt_bindings") + if seen_qt_bindings is None: + CONF["_seen_qt_bindings"] = qt_bindings + elif qt_bindings != seen_qt_bindings: + # Raise SystemExit to abort build process + raise SystemExit( + "Aborting build process due to attempt to collect multiple Qt bindings packages: attempting to run hook " + f"for {qt_bindings!r}, while hook for {seen_qt_bindings!r} has already been run! PyInstaller does not " + "support multiple Qt bindings packages in a frozen application - either ensure that the build environment " + "has only one Qt bindings package installed, or exclude the extraneous bindings packages via the module " + "exclusion mechanism (--exclude command-line option, or excludes list in the spec file)." + ) + + +# A helper for generating exclude rules for extraneous Qt bindings. Intended for use in hooks for packages that pull in +# multiple Qt bindings packages due to conditional imports (for example, `matplotlib.backends.qt_compat`, `qtpy`). +def exclude_extraneous_qt_bindings(hook_name, qt_bindings_order=None): + _QT_BINDINGS = ['PyQt5', 'PySide2', 'PyQt6', 'PySide6'] # Known bindings, and also their preferred order + _QT_API_ENV = 'QT_API' + + def _create_excludes(selected_bindings): + return [bindings for bindings in _QT_BINDINGS if bindings != selected_bindings] + + logger.debug("%s: selecting Qt bindings package...", hook_name) + + if not qt_bindings_order: + qt_bindings_order = _QT_BINDINGS # Use default preference order + + env_qt_bindings = os.environ.get(_QT_API_ENV) + if env_qt_bindings is not None and env_qt_bindings not in _QT_BINDINGS: + logger.warning( + "%s: ignoring unsupported Qt bindings specified via %s environment variable (supported values: %r)!", + hook_name, _QT_API_ENV, _QT_BINDINGS + ) + env_qt_bindings = None + + # First choice: see if a hook for top-level Qt bindings package has already been run; if it has, use that bindings + # package. Due to check in the `ensure_single_qt_bindings_package` that these hooks use, only one such hook could + # have been run. This should cover cases when the entry-point script explicitly imports one of Qt bindings before + # importing a package that supports multiple bindings. + from PyInstaller.config import CONF + seen_qt_bindings = CONF.get("_seen_qt_bindings") + if seen_qt_bindings is not None: + # If bindings are also specified via environment variable and they differ, display a warning. + if env_qt_bindings is not None and env_qt_bindings != seen_qt_bindings: + logger.warning( + "%s: ignoring %s environment variable (%r) because hook for %r has been run!", hook_name, _QT_API_ENV, + env_qt_bindings, seen_qt_bindings + ) + + logger.info( + "%s: selected %r as Qt bindings because hook for %r has been run before.", hook_name, seen_qt_bindings, + seen_qt_bindings + ) + return _create_excludes(seen_qt_bindings) + + # Second choice: honor the QT_API environment variable, if it specified a valid Qt bindings package. + if env_qt_bindings is not None: + logger.info( + "%s: selected %r as Qt bindings as specified by the %s environment variable.", hook_name, env_qt_bindings, + _QT_API_ENV + ) + return _create_excludes(env_qt_bindings) + + # Third choice: select first available bindings (sorted by the given preference order), and display a warning if + # multiple bindings are available. + available_qt_bindings = [] + for bindings_name in qt_bindings_order: + # Check if bindings are available + info = get_qt_library_info(bindings_name) + if info.version is None: + continue + available_qt_bindings.append(bindings_name) + + if not available_qt_bindings: + logger.warning("%s: no Qt bindings are available!", hook_name) + return [] # No need to generate any excludes... + + selected_qt_bindings = available_qt_bindings[0] + if len(available_qt_bindings) == 1: + logger.info("%s: selected %r as the only available Qt bindings.", hook_name, selected_qt_bindings) + else: + # Warn on multiple bindings, and tell user to use QT_API environment variable + logger.warning( + "%s: selected %r as Qt bindings, but multiple bindings are available: %r. Use the %s environment variable " + "to select different bindings and suppress this warning.", hook_name, selected_qt_bindings, + available_qt_bindings, _QT_API_ENV + ) + return _create_excludes(selected_qt_bindings) diff --git a/venv/Lib/site-packages/PyInstaller/utils/hooks/qt/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/hooks/qt/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2921aa24b67e4d6a20c1df84e77c143d0ed82db GIT binary patch literal 51221 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%0A2964ieAj!B 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 Bsj~n8 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/utils/hooks/qt/__pycache__/_modules_info.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/hooks/qt/__pycache__/_modules_info.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0de76612649216db1cfbee1a61277add0df7c9e7 GIT binary patch literal 10398 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 dGX$z0T<&F0iKD?3GDS_LW58hw`AhcB_˙_. +# +# In the current approach, the relations stored in the `QT_MODULES_INFO`_ list were determined directly, by inspecting +# the Qt source code. This requires some prior knowledge of how the Qt code is organized (repositories and individual Qt +# modules within them), as well as some searching based on guesswork. The procedure can be outlined as follows: +# * check out the `main Qt repository `_. This repository contains references to all other +# Qt repositories in the form of git submodules. +# * for Qt5: +# * check out the latest release tag, e.g., v5.15.2, then check out the submodules. +# * search the Qt modules' qmake .pro files; for example, ``qtbase/src/network/network.pro`` for QtNetwork module. +# The plugin types associated with the module are listed in the ``MODULE_PLUGIN_TYPES`` variable (in this case, +# ``bearer``). +# * all translations are gathered in ``qttranslations`` sub-module/repository, and their association with +# individual repositories can be seen in ``qttranslations/translations/translations.pro``. +# * for Qt6: +# * check out the latest release tag, e.g., v6.3.1, then check out the submodules. +# * search the Qt modules' CMake files; for example, ``qtbase/src/network/CMakeLists.txt`` for QtNetwork module. +# The plugin types associated with the module are listed under ``PLUGIN_TYPES`` argument of the +# ``qt_internal_add_module()`` function that defines the Qt module. +# +# The idea is to make a list of all extension modules found in a Qt bindings package, as well as all available plugin +# directories (which correspond to plugin types) and translation files. For each extension, identify the corresponding +# Qt module (shared library name) and its associated plugins and translation files. Once this is done, most of available +# plugins and translations in the python bindings package should have a corresponding python Qt extension module +# available; this gives us associations based on the python extension module names as well as based on the Qt shared +# library names. For any plugins and translation files remaining unassociated, identify the corresponding Qt module; +# this gives us associations based only on Qt shared library names. While this second group of associations are never +# processed directly (due to lack of corresponding python extension), they may end up being processed during the +# recursive dependency analysis, if the corresponding Qt shared library is linked against by some Qt python extension +# or another Qt shared library. + + +# This structure is used to define Qt module information, such as python module/extension name, Qt module (shared +# library) name, translation files' base names, plugins, as well as associated python bindings (which implicitly +# also encode major Qt version). +class _QtModuleDef: + def __init__(self, module, shared_lib=None, translations=None, plugins=None, bindings=None): + # Python module (extension) name without package namespace. For example, `QtCore`. + # Can be None if python bindings do not bind the module, but we still need to establish relationship between + # the Qt module (shared library) and its plugins and translations. + self.module = module + # Associated Qt module (shared library), if any. Used during recursive dependency analysis, where a python + # module (extension) is analyzed for linked Qt modules (shared libraries), and then their corresponding + # python modules (extensions) are added to hidden imports. For example, the Qt module name is `Qt5Core` or + # `Qt6Core`, depending on the Qt version. Can be None for python modules that are not tied to a particular + # Qt shared library (for example, the corresponding Qt module is headers-only) and hence they cannot be + # inferred from recursive link-time dependency analysis. + self.shared_lib = shared_lib + # List of base names of translation files (if any) associated with the Qt module. Multiple base names may be + # associated with a single module. + # For example, `['qt', 'qtbase']` for `QtCore` or `['qtmultimedia']` for `QtMultimedia`. + self.translations = translations or [] + # List of plugins associated with the Qt module. + self.plugins = plugins or [] + # List of bindings (PySide2, PyQt5, PySide6, PyQt6) that provide the python module. This allows association of + # plugins and translations with shared libraries even for bindings that do not provide python module binding + # for the Qt module. + self.bindings = set(bindings or []) + + +# All Qt-based bindings. +ALL_QT_BINDINGS = {"PySide2", "PyQt5", "PySide6", "PyQt6"} + +# Qt modules information - the core of our Qt collection approach. +# +# For every python module/extension (i.e., entry in the list below that has valid `module`), we need a corresponding +# hook, ensuring that the extension file is analyzed, so that we collect the associated plugins and translation +# files, as well as perform recursive analysis of link-time binary dependencies (so that plugins and translation files +# belonging to those dependencies are collected as well). +QT_MODULES_INFO = ( + # *** qt/qt3d *** + _QtModuleDef("Qt3DAnimation", shared_lib="3DAnimation"), + _QtModuleDef("Qt3DCore", shared_lib="3DCore"), + _QtModuleDef("Qt3DExtras", shared_lib="3DExtras"), + _QtModuleDef("Qt3DInput", shared_lib="3DInput", plugins=["3dinputdevices"]), + _QtModuleDef("Qt3DLogic", shared_lib="3DLogic"), + _QtModuleDef( + "Qt3DRender", shared_lib="3DRender", plugins=["geometryloaders", "renderplugins", "renderers", "sceneparsers"] + ), + + # *** qt/qtactiveqt *** + # The python module is called QAxContainer in PyQt bindings, but QtAxContainer in PySide. The associated Qt module + # is header-only, so there is no shared library. + _QtModuleDef("QAxContainer", bindings=["PyQt*"]), + _QtModuleDef("QtAxContainer", bindings=["PySide*"]), + + # *** qt/qtcharts *** + # The python module is called QtChart in PyQt5, and QtCharts in PySide2, PySide6, and PyQt6 (which corresponds to + # the associated Qt module name, QtCharts). + _QtModuleDef("QtChart", shared_lib="Charts", bindings=["PyQt5"]), + _QtModuleDef("QtCharts", shared_lib="Charts", bindings=["!PyQt5"]), + + # *** qt/qtbase *** + # QtConcurrent python module is available only in PySide bindings. + _QtModuleDef(None, shared_lib="Concurrent", bindings=["PyQt*"]), + _QtModuleDef("QtConcurrent", shared_lib="Concurrent", bindings=["PySide*"]), + _QtModuleDef("QtCore", shared_lib="Core", translations=["qt", "qtbase"]), + # QtDBus python module is available in all bindings but PySide2. + _QtModuleDef(None, shared_lib="DBus", bindings=["PySide2"]), + _QtModuleDef("QtDBus", shared_lib="DBus", bindings=["!PySide2"]), + # QtNetwork uses different plugins in Qt5 and Qt6. + _QtModuleDef("QtNetwork", shared_lib="Network", plugins=["bearer"], bindings=["PySide2", "PyQt5"]), + _QtModuleDef( + "QtNetwork", + shared_lib="Network", + plugins=["networkaccess", "networkinformation", "tls"], + bindings=["PySide6", "PyQt6"] + ), + _QtModuleDef( + "QtGui", + shared_lib="Gui", + plugins=[ + "accessiblebridge", + "egldeviceintegrations", + "generic", + "iconengines", + "imageformats", + "platforms", + "platforms/darwin", + "platforminputcontexts", + "platformthemes", + "xcbglintegrations", + # The ``wayland-*`` plugins are part of QtWaylandClient Qt module, whose shared library + # (e.g., libQt5WaylandClient.so) is linked by the wayland-related ``platforms`` plugins. Ideally, we would + # collect these plugins based on the QtWaylandClient shared library entry, but as our Qt hook utilities do + # not scan the plugins for dependencies, that would not work. So instead we list these plugins under QtGui + # to achieve pretty much the same end result. + "wayland-decoration-client", + "wayland-graphics-integration-client", + "wayland-shell-integration" + ] + ), + _QtModuleDef("QtOpenGL", shared_lib="OpenGL"), + # This python module is specific to PySide2 and has no associated Qt module. + _QtModuleDef("QtOpenGLFunctions", bindings=["PySide2"]), + # This Qt module was introduced with Qt6. + _QtModuleDef("QtOpenGLWidgets", shared_lib="OpenGLWidgets", bindings=["PySide6", "PyQt6"]), + _QtModuleDef("QtPrintSupport", shared_lib="PrintSupport", plugins=["printsupport"]), + _QtModuleDef("QtSql", shared_lib="Sql", plugins=["sqldrivers"]), + _QtModuleDef("QtTest", shared_lib="Test"), + _QtModuleDef("QtWidgets", shared_lib="Widgets", plugins=["styles"]), + _QtModuleDef("QtXml", shared_lib="Xml"), + + # *** qt/qtconnectivity *** + _QtModuleDef("QtBluetooth", shared_lib="QtBluetooth", translations=["qtconnectivity"]), + _QtModuleDef("QtNfc", shared_lib="Nfc", translations=["qtconnectivity"]), + + # *** qt/qtdatavis3d *** + _QtModuleDef("QtDataVisualization", shared_lib="DataVisualization"), + + # *** qt/qtdeclarative *** + _QtModuleDef("QtQml", shared_lib="Qml", translations=["qtdeclarative"], plugins=["qmltooling"]), + # Have the Qt5 variant collect translations for qtquickcontrols (qt/qtquickcontrols provides only QtQuick plugins). + _QtModuleDef( + "QtQuick", + shared_lib="Quick", + translations=["qtquickcontrols"], + plugins=["scenegraph"], + bindings=["PySide2", "PyQt5"] + ), + _QtModuleDef("QtQuick", shared_lib="Quick", plugins=["scenegraph"], bindings=["PySide6", "PyQt6"]), + # Qt6-only; in Qt5, this module is part of qt/qtquickcontrols2. Python module is available only in PySide6. + _QtModuleDef(None, shared_lib="QuickControls2", bindings=["PyQt6"]), + _QtModuleDef("QtQuickControls2", shared_lib="QuickControls2", bindings=["PySide6"]), + _QtModuleDef("QtQuickWidgets", shared_lib="QuickWidgets"), + + # *** qt/qtgamepad *** + # No python module; shared library -> plugins association entry. + _QtModuleDef(None, shared_lib="Gamepad", plugins=["gamepads"]), + + # *** qt/qtgraphs *** + # Qt6 >= 6.6.0; python module is available only in PySide6. + _QtModuleDef("QtGraphs", shared_lib="Graphs", bindings=["PySide6"]), + + # *** qt/qthttpserver *** + # Qt6 >= 6.4.0; python module is available only in PySide6. + _QtModuleDef("QtHttpServer", shared_lib="HttpServer", bindings=["PySide6"]), + + # *** qt/qtlocation *** + # QtLocation was reintroduced in Qt6 v6.5.0. + _QtModuleDef( + "QtLocation", + shared_lib="Location", + translations=["qtlocation"], + plugins=["geoservices"], + bindings=["PySide2", "PyQt5", "PySide6"] + ), + _QtModuleDef( + "QtPositioning", + shared_lib="Positioning", + translations=["qtlocation"], + plugins=["position"], + ), + + # *** qt/qtmacextras *** + # Qt5-only Qt module. + _QtModuleDef("QtMacExtras", shared_lib="MacExtras", bindings=["PySide2", "PyQt5"]), + + # *** qt/qtmultimedia *** + # QtMultimedia on Qt6 currently uses only a subset of plugin names from Qt5 counterpart. + _QtModuleDef( + "QtMultimedia", + shared_lib="Multimedia", + translations=["qtmultimedia"], + plugins=[ + "mediaservice", "audio", "video/bufferpool", "video/gstvideorenderer", "video/videonode", "playlistformats", + "resourcepolicy" + ], + bindings=["PySide2", "PyQt5"] + ), + _QtModuleDef( + "QtMultimedia", + shared_lib="Multimedia", + translations=["qtmultimedia"], + # `multimedia` plugins are available as of Qt6 >= 6.4.0; earlier versions had `video/gstvideorenderer` and + # `video/videonode` plugins. + plugins=["multimedia", "video/gstvideorenderer", "video/videonode"], + bindings=["PySide6", "PyQt6"] + ), + _QtModuleDef("QtMultimediaWidgets", shared_lib="MultimediaWidgets"), + # Qt6-only Qt module; python module is available in PySide6 >= 6.4.0 and PyQt6 >= 6.5.0 + _QtModuleDef("QtSpatialAudio", shared_lib="SpatialAudio", bindings=["PySide6", "PyQt6"]), + + # *** qt/qtnetworkauth *** + # QtNetworkAuth python module is available in all bindings but PySide2. + _QtModuleDef(None, shared_lib="NetworkAuth", bindings=["PySide2"]), + _QtModuleDef("QtNetworkAuth", shared_lib="NetworkAuth", bindings=["!PySide2"]), + + # *** qt/qtpurchasing *** + # Qt5-only Qt module, python module is available only in PyQt5. + _QtModuleDef("QtPurchasing", shared_lib="Purchasing", bindings=["PyQt5"]), + + # *** qt/qtquick1 *** + # This is an old, Qt 5.3-era module... + _QtModuleDef( + "QtDeclarative", + shared_lib="Declarative", + translations=["qtquick1"], + plugins=["qml1tooling"], + bindings=["PySide2", "PyQt5"] + ), + + # *** qt/qtquick3d *** + # QtQuick3D python module is available in all bindings but PySide2. + _QtModuleDef(None, shared_lib="Quick3D", bindings=["PySide2"]), + _QtModuleDef("QtQuick3D", shared_lib="Quick3D", bindings=["!PySide2"]), + # No python module; shared library -> plugins association entry. + _QtModuleDef(None, shared_lib="Quick3DAssetImport", plugins=["assetimporters"]), + + # *** qt/qtquickcontrols2 *** + # Qt5-only module; in Qt6, this module is part of qt/declarative. Python module is available only in PySide2. + _QtModuleDef(None, translations=["qtquickcontrols2"], shared_lib="QuickControls2", bindings=["PyQt5"]), + _QtModuleDef( + "QtQuickControls2", translations=["qtquickcontrols2"], shared_lib="QuickControls2", bindings=["PySide2"] + ), + + # *** qt/qtremoteobjects *** + _QtModuleDef("QtRemoteObjects", shared_lib="RemoteObjects"), + + # *** qt/qtscxml *** + # Python module is available only in PySide bindings. Plugins are available only in Qt6. + # PyQt wheels do not seem to ship the corresponding Qt modules (shared libs) at all. + _QtModuleDef("QtScxml", shared_lib="Scxml", bindings=["PySide2"]), + _QtModuleDef("QtScxml", shared_lib="Scxml", plugins=["scxmldatamodel"], bindings=["PySide6"]), + # Qt6-only Qt module, python module is available only in PySide6. + _QtModuleDef("QtStateMachine", shared_lib="StateMachine", bindings=["PySide6"]), + + # *** qt/qtsensors *** + _QtModuleDef("QtSensors", shared_lib="Sensors", plugins=["sensors", "sensorgestures"]), + + # *** qt/qtserialport *** + _QtModuleDef("QtSerialPort", shared_lib="SerialPort", translations=["qtserialport"]), + + # *** qt/qtscript *** + # Qt5-only Qt module, python module is available only in PySide2. PyQt5 wheels do not seem to ship the corresponding + # Qt modules (shared libs) at all. + _QtModuleDef("QtScript", shared_lib="Script", translations=["qtscript"], plugins=["script"], bindings=["PySide2"]), + _QtModuleDef("QtScriptTools", shared_lib="ScriptTools", bindings=["PySide2"]), + + # *** qt/qtserialbus *** + # No python module; shared library -> plugins association entry. + # PySide6 6.5.0 introduced python module. + _QtModuleDef(None, shared_lib="SerialBus", plugins=["canbus"], bindings=["!PySide6"]), + _QtModuleDef("QtSerialBus", shared_lib="SerialBus", plugins=["canbus"], bindings=["PySide6"]), + + # *** qt/qtsvg *** + _QtModuleDef("QtSvg", shared_lib="Svg"), + # Qt6-only Qt module. + _QtModuleDef("QtSvgWidgets", shared_lib="SvgWidgets", bindings=["PySide6", "PyQt6"]), + + # *** qt/qtspeech *** + _QtModuleDef("QtTextToSpeech", shared_lib="TextToSpeech", plugins=["texttospeech"]), + + # *** qt/qttools *** + # QtDesigner python module is available in all bindings but PySide2. + _QtModuleDef(None, shared_lib="Designer", plugins=["designer"], bindings=["PySide2"]), + _QtModuleDef( + "QtDesigner", shared_lib="Designer", translations=["designer"], plugins=["designer"], bindings=["!PySide2"] + ), + _QtModuleDef("QtHelp", shared_lib="Help", translations=["qt_help"]), + # Python module is available only in PySide bindings. + _QtModuleDef("QtUiTools", shared_lib="UiTools", bindings=["PySide*"]), + + # *** qt/qtvirtualkeyboard *** + # No python module; shared library -> plugins association entry. + _QtModuleDef(None, shared_lib="VirtualKeyboard", plugins=["virtualkeyboard"]), + + # *** qt/qtwebchannel *** + _QtModuleDef("QtWebChannel", shared_lib="WebChannel"), + + # *** qt/qtwebengine *** + # QtWebEngine is Qt5-only module (replaced by QtWebEngineQuick in Qt6). + _QtModuleDef("QtWebEngine", shared_lib="WebEngine", bindings=["PySide2", "PyQt5"]), + _QtModuleDef("QtWebEngineCore", shared_lib="WebEngineCore", translations=["qtwebengine"]), + # QtWebEngineQuick is Qt6-only module (replacement for QtWebEngine in Qt5). + _QtModuleDef("QtWebEngineQuick", shared_lib="WebEngineQuick", bindings=["PySide6", "PyQt6"]), + _QtModuleDef("QtWebEngineWidgets", shared_lib="WebEngineWidgets"), + # QtPdf and QtPdfWidgets have python module available in PySide6 and PyQt6 >= 6.4.0. + _QtModuleDef("QtPdf", shared_lib="Pdf", bindings=["PySide6", "PyQt6"]), + _QtModuleDef("QtPdfWidgets", shared_lib="PdfWidgets", bindings=["PySide6", "PyQt6"]), + + # *** qt/qtwebsockets *** + _QtModuleDef("QtWebSockets", shared_lib="WebSockets", translations=["qtwebsockets"]), + + # *** qt/qtwebview *** + # No python module; shared library -> plugins association entry. + _QtModuleDef(None, shared_lib="WebView", plugins=["webview"]), + + # *** qt/qtwinextras *** + # Qt5-only Qt module. + _QtModuleDef("QtWinExtras", shared_lib="WinExtras", bindings=["PySide2", "PyQt5"]), + + # *** qt/qtx11extras *** + # Qt5-only Qt module. + _QtModuleDef("QtX11Extras", shared_lib="X11Extras", bindings=["PySide2", "PyQt5"]), + + # *** qt/qtxmlpatterns *** + # Qt5-only Qt module. + _QtModuleDef( + "QtXmlPatterns", shared_lib="XmlPatterns", translations=["qtxmlpatterns"], bindings=["PySide2", "PyQt5"] + ), + + # *** qscintilla *** + # Python module is available only in PyQt bindings. No associated shared library. + _QtModuleDef("Qsci", translations=["qscintilla"], bindings=["PyQt*"]), +) + + +# Helpers for turning Qt namespace specifiers, such as "!PySide2" or "PyQt*", into set of applicable +# namespaces. +def process_namespace_strings(namespaces): + """"Process list of Qt namespace specifier strings into set of namespaces.""" + bindings = set() + for namespace in namespaces: + bindings |= _process_namespace_string(namespace) + return bindings + + +def _process_namespace_string(namespace): + """Expand a Qt namespace specifier string into set of namespaces.""" + if namespace.startswith("!"): + bindings = _process_namespace_string(namespace[1:]) + return ALL_QT_BINDINGS - bindings + else: + if namespace == "PySide*": + return {"PySide2", "PySide6"} + elif namespace == "PyQt*": + return {"PyQt5", "PyQt6"} + elif namespace in ALL_QT_BINDINGS: + return {namespace} + else: + raise ValueError(f"Invalid Qt namespace specifier: {namespace}!") diff --git a/venv/Lib/site-packages/PyInstaller/utils/hooks/setuptools.py b/venv/Lib/site-packages/PyInstaller/utils/hooks/setuptools.py new file mode 100644 index 0000000..c57b262 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/hooks/setuptools.py @@ -0,0 +1,247 @@ +# ---------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +from PyInstaller import log as logging +from PyInstaller import isolated + +logger = logging.getLogger(__name__) + + +# Import setuptools and analyze its properties in an isolated subprocess. This function is called by `SetuptoolsInfo` +# to initialize its properties. +@isolated.decorate +def _retrieve_setuptools_info(): + import importlib + + try: + setuptools = importlib.import_module("setuptools") # noqa: F841 + except ModuleNotFoundError: + return None + + # Delay these imports until after we have confirmed that setuptools is importable. + import pathlib + + import packaging.version + + from PyInstaller.compat import importlib_metadata + from PyInstaller.utils.hooks import ( + collect_data_files, + collect_submodules, + ) + + # Try to retrieve the version. At this point, failure is consider an error. + version_string = importlib_metadata.version("setuptools") + version = packaging.version.Version(version_string).release # Use the version tuple + + # setuptools >= 60.0 its vendored copy of distutils (mainly due to its removal from stdlib in python >= 3.12). + distutils_vendored = False + distutils_modules = [] + if version >= (60, 0): + distutils_vendored = True + distutils_modules += ["_distutils_hack"] + distutils_modules += collect_submodules( + "setuptools._distutils", + # setuptools 71.0.1 ~ 71.0.4 include `setuptools._distutils.tests`; avoid explicitly collecting it + # (t was not included in earlier setuptools releases). + filter=lambda name: name != 'setuptools._distutils.tests', + ) + + # Check for exposed packages/modules that are vendored by setuptools. If stand-alone version is not provided in the + # environment, setuptools-vendored version is exposed (due to location of `setuptools._vendor` being appended to + # `sys.path`. Applicable to v71.0.0 and later. + vendored_status = dict() + if version >= (71, 0): + VENDORED_CANDIDATES = ( + "autocommand", + "backports.tarfile", + "importlib_metadata", + "importlib_resources", + "inflect", + "jaraco.context", + "jaraco.functools", + "jaraco.text", + "more_itertools", + "ordered_set", + "packaging", + "platformdirs", + "tomli", + "typeguard", + "typing_extensions", + "wheel", + "zipp", + ) + + # Resolve path(s) of `setuptools_vendor` package + setuptools_vendor = importlib.import_module("setuptools._vendor") + setuptools_vendor_paths = [pathlib.Path(path).resolve() for path in setuptools_vendor.__path__] + + # Process each candidate + for candidate_name in VENDORED_CANDIDATES: + try: + candidate = importlib.import_module(candidate_name) + except ImportError: + continue + + # Check the __file__ attribute (modules and regular packages). Will not work with namespace packages, but + # at the moment, there are none. + candidate_file_attr = getattr(candidate, '__file__', None) + if candidate_file_attr is not None: + candidate_path = pathlib.Path(candidate_file_attr).parent.resolve() + is_vendored = any([ + setuptools_vendor_path in candidate_path.parents + for setuptools_vendor_path in setuptools_vendor_paths + ]) + vendored_status[candidate_name] = is_vendored + + # Collect submodules from `setuptools._vendor`, regardless of whether the vendored package is exposed or + # not (because setuptools might need/use it either way). + EXCLUDED_VENDORED_MODULES = ( + # Prevent recursing into setuptools._vendor.pyparsing.diagram, which typically fails to be imported due + # to missing dependencies (railroad, pyparsing (?), jinja2) and generates a warning... As the module is + # usually unimportable, it is likely not to be used by setuptools. NOTE: pyparsing was removed from + # vendored packages in setuptools v67.0.0; keep this exclude around for earlier versions. + 'setuptools._vendor.pyparsing.diagram', + # Setuptools >= 71 started shipping vendored dependencies that include tests; avoid collecting those via + # hidden imports. (Note that this also prevents creation of aliases for these module, but that should + # not be an issue, as they should not be referenced from anywhere). + 'setuptools._vendor.importlib_resources.tests', + # These appear to be utility scripts bundled with the jaraco.text package - exclude them. + 'setuptools._vendor.jaraco.text.show-newlines', + 'setuptools._vendor.jaraco.text.strip-prefix', + 'setuptools._vendor.jaraco.text.to-dvorak', + 'setuptools._vendor.jaraco.text.to-qwerty', + ) + vendored_modules = collect_submodules( + 'setuptools._vendor', + filter=lambda name: name not in EXCLUDED_VENDORED_MODULES, + ) + + # `collect_submodules` (and its underlying `pkgutil.iter_modules` do not discover namespace sub-packages, in + # this case `setuptools._vendor.jaraco`. So force a manual scan of modules/packages inside it. + vendored_modules += collect_submodules( + 'setuptools._vendor.jaraco', + filter=lambda name: name not in EXCLUDED_VENDORED_MODULES, + ) + + # *** Data files for vendored packages *** + vendored_data = [] + + if version >= (71, 0): + # Since the vendored dependencies from `setuptools/_vendor` are now visible to the outside world, make + # sure we collect their metadata. (We cannot use copy_metadata here, because we need to collect data + # files to their original locations). + vendored_data += collect_data_files('setuptools._vendor', includes=['**/*.dist-info']) + # Similarly, ensure that `Lorem ipsum.txt` from vendored jaraco.text is collected + vendored_data += collect_data_files('setuptools._vendor.jaraco.text', includes=['**/Lorem ipsum.txt']) + + # Return dictionary with collected information + return { + "available": True, + "version": version, + "distutils_vendored": distutils_vendored, + "distutils_modules": distutils_modules, + "vendored_status": vendored_status, + "vendored_modules": vendored_modules, + "vendored_data": vendored_data, + } + + +class SetuptoolsInfo: + def __init__(self): + pass + + def __repr__(self): + return "SetuptoolsInfo" + + # Delay initialization of setuptools information until until the corresponding attributes are first requested. + def __getattr__(self, name): + if 'available' in self.__dict__: + # Initialization was already done, but requested attribute is not available. + raise AttributeError(name) + + # Load setuptools info... + self._load_setuptools_info() + # ... and return the requested attribute + return getattr(self, name) + + def _load_setuptools_info(self): + logger.info("%s: initializing cached setuptools info...", self) + + # Initialize variables so that they might be accessed even if setuptools is unavailable or if initialization + # fails for some reason. + self.available = False + self.version = None + self.distutils_vendored = False + self.distutils_modules = [] + self.vendored_status = dict() + self.vendored_modules = [] + self.vendored_data = [] + + try: + setuptools_info = _retrieve_setuptools_info() + except Exception as e: + logger.warning("%s: failed to obtain setuptools info: %s", self, e) + return + + # If package could not be imported, `_retrieve_setuptools_info` returns None. In such cases, emit a debug + # message instead of a warning, because this initialization might be triggered by a helper function that is + # trying to determine availability of `setuptools` by inspecting the `available` attribute. + if setuptools_info is None: + logger.debug("%s: failed to obtain setuptools info: setuptools could not be imported.", self) + return + + # Copy properties + for key, value in setuptools_info.items(): + setattr(self, key, value) + + def is_vendored(self, module_name): + return self.vendored_status.get(module_name, False) + + @staticmethod + def _create_vendored_aliases(vendored_name, module_name, modules_list): + # Create aliases for all submodules + prefix_len = len(vendored_name) # Length of target-name prefix to remove + return ((module_name + vendored_module[prefix_len:], vendored_module) for vendored_module in modules_list + if vendored_module.startswith(vendored_name)) + + def get_vendored_aliases(self, module_name): + vendored_name = f"setuptools._vendor.{module_name}" + return self._create_vendored_aliases(vendored_name, module_name, self.vendored_modules) + + def get_distutils_aliases(self): + vendored_name = "setuptools._distutils" + return self._create_vendored_aliases(vendored_name, "distutils", self.distutils_modules) + + +setuptools_info = SetuptoolsInfo() + + +def pre_safe_import_module(api): + """ + A common implementation of pre_safe_import_module hook function. + + This function can be either called from the `pre_safe_import_module` function in a pre-safe-import-module hook, or + just imported into the hook. + """ + module_name = api.module_name + + # Check if the package/module is a vendored copy. This also returns False is setuptools is unavailable, because + # vendored module status dictionary will be empty. + if not setuptools_info.is_vendored(module_name): + return + + vendored_name = f"setuptools._vendor.{module_name}" + logger.info( + "Setuptools: %r appears to be a setuptools-vendored copy - creating alias to %r!", module_name, vendored_name + ) + + # Create aliases for all (sub)modules + for aliased_name, real_vendored_name in setuptools_info.get_vendored_aliases(module_name): + api.add_alias_module(real_vendored_name, aliased_name) diff --git a/venv/Lib/site-packages/PyInstaller/utils/hooks/tcl_tk.py b/venv/Lib/site-packages/PyInstaller/utils/hooks/tcl_tk.py new file mode 100644 index 0000000..869356c --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/hooks/tcl_tk.py @@ -0,0 +1,340 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import os +import fnmatch + +from PyInstaller import compat +from PyInstaller import isolated +from PyInstaller import log as logging +from PyInstaller.depend import bindepend + +if compat.is_darwin: + from PyInstaller.utils import osx as osxutils + +logger = logging.getLogger(__name__) + + +@isolated.decorate +def _get_tcl_tk_info(): + """ + Isolated-subprocess helper to retrieve the basic Tcl/Tk information: + - tkinter_extension_file = the value of __file__ attribute of the _tkinter binary extension (path to file). + - tcl_data_dir = path to the Tcl library/data directory. + - tcl_version = Tcl version + - tk_version = Tk version + - tcl_theaded = boolean indicating whether Tcl/Tk is built with multi-threading support. + """ + try: + import tkinter + import _tkinter + except ImportError: + # tkinter unavailable + return None + try: + tcl = tkinter.Tcl() + except tkinter.TclError: # e.g. "Can't find a usable init.tcl in the following directories: ..." + return None + + # Query the location of Tcl library/data directory. + tcl_data_dir = tcl.eval("info library") + + # Check if Tcl/Tk is built with multi-threaded support (built with --enable-threads), as indicated by the presence + # of optional `threaded` member in `tcl_platform` array. + try: + tcl.getvar("tcl_platform(threaded)") # Ignore the actual value. + tcl_threaded = True + except tkinter.TclError: + tcl_threaded = False + + return { + "available": True, + "tkinter_extension_file": _tkinter.__file__, + "tcl_version": _tkinter.TCL_VERSION, + "tk_version": _tkinter.TK_VERSION, + "tcl_threaded": tcl_threaded, + "tcl_data_dir": tcl_data_dir, + } + + +class TclTkInfo: + # Root directory names of Tcl and Tk library/data directories in the frozen application. These directories are + # originally fully versioned (e.g., tcl8.6 and tk8.6); we want to remap them to unversioned variants, so that our + # run-time hook (pyi_rthook__tkinter.py) does not have to determine version numbers when setting `TCL_LIBRARY` + # and `TK_LIBRARY` environment variables. + # + # We also cannot use plain "tk" and "tcl", because on macOS, the Tcl and Tk shared libraries might come from + # framework bundles, and would therefore end up being collected as "Tcl" and "Tk" in the top-level application + # directory, causing clash due to filesystem being case-insensitive by default. + TCL_ROOTNAME = '_tcl_data' + TK_ROOTNAME = '_tk_data' + + def __init__(self): + pass + + def __repr__(self): + return "TclTkInfo" + + # Delay initialization of Tcl/Tk information until until the corresponding attributes are first requested. + def __getattr__(self, name): + if 'available' in self.__dict__: + # Initialization was already done, but requested attribute is not available. + raise AttributeError(name) + + # Load Qt library info... + self._load_tcl_tk_info() + # ... and return the requested attribute + return getattr(self, name) + + def _load_tcl_tk_info(self): + logger.info("%s: initializing cached Tcl/Tk info...", self) + + # Initialize variables so that they might be accessed even if tkinter/Tcl/Tk is unavailable or if initialization + # fails for some reason. + self.available = False + self.tkinter_extension_file = None + self.tcl_version = None + self.tk_version = None + self.tcl_threaded = False + self.tcl_data_dir = None + + self.tk_data_dir = None + self.tcl_module_dir = None + + self.is_macos_system_framework = False + self.tcl_shared_library = (None, None) + self.tk_shared_library = (None, None) + + self.data_files = [] + + try: + tcl_tk_info = _get_tcl_tk_info() + except Exception as e: + logger.warning("%s: failed to obtain Tcl/Tk info: %s", self, e) + return + + # If tkinter could not be imported, `_get_tcl_tk_info` returns None. In such cases, emit a debug message instead + # of a warning, because this initialization might be triggered by a helper function that is trying to determine + # availability of `tkinter` by inspecting the `available` attribute. + if tcl_tk_info is None: + logger.debug("%s: failed to obtain Tcl/Tk info: tkinter/_tkinter could not be imported.", self) + return + + # Copy properties + for key, value in tcl_tk_info.items(): + setattr(self, key, value) + + # Parse Tcl/Tk version into (major, minor) tuple. + self.tcl_version = tuple((int(x) for x in self.tcl_version.split(".")[:2])) + self.tk_version = tuple((int(x) for x in self.tk_version.split(".")[:2])) + + # Determine full path to Tcl and Tk shared libraries against which the _tkinter extension module is linked. + try: + ( + self.tcl_shared_library, + self.tk_shared_library, + ) = self._find_tcl_tk_shared_libraries(self.tkinter_extension_file) + except Exception: + logger.warning("%s: failed to determine Tcl and Tk shared library location!", self, exc_info=True) + + # macOS: check if _tkinter is linked against system-provided Tcl.framework and Tk.framework. This is the case + # with python3 from XCode tools (and was the case with very old homebrew python builds). In such cases, we + # should not be collecting Tcl/Tk files. + if compat.is_darwin: + self.is_macos_system_framework = self._check_macos_system_framework(self.tcl_shared_library) + + # Emit a warning in the unlikely event that we are dealing with Teapot-distributed version of ActiveTcl. + if not self.is_macos_system_framework: + self._warn_if_using_activetcl_or_teapot(self.tcl_data_dir) + + # Infer location of Tk library/data directory. Ideally, we could infer this by running + # + # import tkinter + # root = tkinter.Tk() + # tk_data_dir = root.tk.exprstring('$tk_library') + # + # in the isolated subprocess as part of `_get_tcl_tk_info`. However, that is impractical, as it shows the empty + # window, and on some platforms (e.g., linux) requires display server. Therefore, try to guess the location, + # based on the following heuristic: + # - if Tk is built as macOS framework bundle, look for Scripts sub-directory in Resources directory next to + # the shared library. + # - otherwise, look for: $tcl_root/../tkX.Y, where X and Y are Tk major and minor version. + if compat.is_darwin and self.tk_shared_library and ( + # is_framework_bundle_lib handles only fully-versioned framework library paths... + (osxutils.is_framework_bundle_lib(self.tk_shared_library)) or + # ... so manually handle top-level-symlinked variant for now. + (self.tk_shared_library).endswith("Tk.framework/Tk") + ): + # Fully resolve the library path, in case it is a top-level symlink; for example, resolve + # /Library/Frameworks/Python.framework/Versions/3.13/Frameworks/Tk.framework/Tk + # into + # /Library/Frameworks/Python.framework/Versions/3.13/Frameworks/Tk.framework/Versions/8.6/Tk + tk_lib_realpath = os.path.realpath(self.tk_shared_library) + # Resources/Scripts directory next to the shared library + self.tk_data_dir = os.path.join(os.path.dirname(tk_lib_realpath), "Resources", "Scripts") + else: + self.tk_data_dir = os.path.join( + os.path.dirname(self.tcl_data_dir), + f"tk{self.tk_version[0]}.{self.tk_version[1]}", + ) + + # Infer location of Tcl module directory. The modules directory is separate from the library/data one, and + # is located at $tcl_root/../tclX, where X is the major Tcl version. + self.tcl_module_dir = os.path.join( + os.path.dirname(self.tcl_data_dir), + f"tcl{self.tcl_version[0]}", + ) + + # Find all data files + if self.is_macos_system_framework: + logger.info("%s: using macOS system Tcl/Tk framework - not collecting data files.", self) + else: + # Collect Tcl and Tk scripts from their corresponding library/data directories. See comment at the + # definition of TK_ROOTNAME and TK_ROOTNAME variables. + if os.path.isdir(self.tcl_data_dir): + self.data_files += self._collect_files_from_directory( + self.tcl_data_dir, + prefix=self.TCL_ROOTNAME, + excludes=['demos', '*.lib', 'tclConfig.sh'], + ) + else: + logger.warning("%s: Tcl library/data directory %r does not exist!", self, self.tcl_data_dir) + + if os.path.isdir(self.tk_data_dir): + self.data_files += self._collect_files_from_directory( + self.tk_data_dir, + prefix=self.TK_ROOTNAME, + excludes=['demos', '*.lib', 'tkConfig.sh'], + ) + else: + logger.warning("%s: Tk library/data directory %r does not exist!", self, self.tk_data_dir) + + # Collect Tcl modules from modules directory + if os.path.isdir(self.tcl_module_dir): + self.data_files += self._collect_files_from_directory( + self.tcl_module_dir, + prefix=os.path.basename(self.tcl_module_dir), + ) + else: + logger.warning("%s: Tcl module directory %r does not exist!", self, self.tcl_module_dir) + + @staticmethod + def _collect_files_from_directory(root, prefix=None, excludes=None): + """ + A minimal port of PyInstaller.building.datastruct.Tree() functionality, which allows us to avoid using Tree + here. This way, the TclTkInfo data structure can be used without having PyInstaller's config context set up. + """ + excludes = excludes or [] + + todo = [(root, prefix)] + output = [] + while todo: + target_dir, prefix = todo.pop() + + for entry in os.listdir(target_dir): + # Basic name-based exclusion + if any((fnmatch.fnmatch(entry, exclude) for exclude in excludes)): + continue + + src_path = os.path.join(target_dir, entry) + dest_path = os.path.join(prefix, entry) if prefix else entry + + if os.path.isdir(src_path): + todo.append((src_path, dest_path)) + else: + # Return 3-element tuples with fully-resolved dest path, since other parts of code depend on that. + output.append((dest_path, src_path, 'DATA')) + + return output + + @staticmethod + def _find_tcl_tk_shared_libraries(tkinter_ext_file): + """ + Find Tcl and Tk shared libraries against which the _tkinter extension module is linked. + """ + tcl_lib = None + tk_lib = None + + for _, lib_path in bindepend.get_imports(tkinter_ext_file): # (name, fullpath) tuple + if lib_path is None: + continue # Skip unresolved entries + + # For comparison, take basename of lib_path. On macOS, lib_name returned by get_imports is in fact + # referenced name, which is not necessarily just a basename. + lib_name = os.path.basename(lib_path) + lib_name_lower = lib_name.lower() # lower-case for comparisons + + if 'tcl' in lib_name_lower: + tcl_lib = lib_path + elif 'tk' in lib_name_lower: + tk_lib = lib_path + + return tcl_lib, tk_lib + + @staticmethod + def _check_macos_system_framework(tcl_shared_lib): + # Starting with macOS 11, system libraries are hidden (unless both Python and PyInstaller's bootloader are built + # against MacOS 11.x SDK). Therefore, Tcl shared library might end up unresolved (None); but that implicitly + # indicates that the system framework is used. + if tcl_shared_lib is None: + return True + + # Check if the path corresponds to the system framework, i.e., [/System]/Library/Frameworks/Tcl.framework/Tcl + return 'Library/Frameworks/Tcl.framework' in tcl_shared_lib + + @staticmethod + def _warn_if_using_activetcl_or_teapot(tcl_root): + """ + Check if Tcl installation is a Teapot-distributed version of ActiveTcl, and log a non-fatal warning that the + resulting frozen application will (likely) fail to run on other systems. + + PyInstaller does *not* freeze all ActiveTcl dependencies -- including Teapot, which is typically ignorable. + Since Teapot is *not* ignorable in this case, this function warns of impending failure. + + See Also + ------- + https://github.com/pyinstaller/pyinstaller/issues/621 + """ + if tcl_root is None: + return + + # Read the "init.tcl" script and look for mentions of "activetcl" and "teapot" + init_tcl = os.path.join(tcl_root, 'init.tcl') + if not os.path.isfile(init_tcl): + return + + mentions_activetcl = False + mentions_teapot = False + + # Tcl/Tk reads files using the system encoding (https://www.tcl.tk/doc/howto/i18n.html#system_encoding); + # on macOS, this is UTF-8. + with open(init_tcl, 'r', encoding='utf8') as fp: + for line in fp.readlines(): + line = line.strip().lower() + if line.startswith('#'): + continue + if 'activetcl' in line: + mentions_activetcl = True + if 'teapot' in line: + mentions_teapot = True + if mentions_activetcl and mentions_teapot: + break + + if mentions_activetcl and mentions_teapot: + logger.warning( + "You appear to be using an ActiveTcl build of Tcl/Tk, which PyInstaller has\n" + "difficulty freezing. To fix this, comment out all references to 'teapot' in\n" + f"{init_tcl!r}\n" + "See https://github.com/pyinstaller/pyinstaller/issues/621 for more information." + ) + + +tcltk_info = TclTkInfo() diff --git a/venv/Lib/site-packages/PyInstaller/utils/misc.py b/venv/Lib/site-packages/PyInstaller/utils/misc.py new file mode 100644 index 0000000..77a3e8e --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/misc.py @@ -0,0 +1,229 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +This module contains miscellaneous functions that do not fit anywhere else. +""" + +import glob +import os +import pprint +import codecs +import re +import tokenize +import io +import pathlib + +from PyInstaller import log as logging +from PyInstaller.compat import is_win + +logger = logging.getLogger(__name__) + + +def dlls_in_subdirs(directory): + """ + Returns a list *.dll, *.so, *.dylib in the given directory and its subdirectories. + """ + filelist = [] + for root, dirs, files in os.walk(directory): + filelist.extend(dlls_in_dir(root)) + return filelist + + +def dlls_in_dir(directory): + """ + Returns a list of *.dll, *.so, *.dylib in the given directory. + """ + return files_in_dir(directory, ["*.so", "*.dll", "*.dylib"]) + + +def files_in_dir(directory, file_patterns=None): + """ + Returns a list of files in the given directory that match the given pattern. + """ + + file_patterns = file_patterns or [] + + files = [] + for file_pattern in file_patterns: + files.extend(glob.glob(os.path.join(directory, file_pattern))) + return files + + +def get_path_to_toplevel_modules(filename): + """ + Return the path to top-level directory that contains Python modules. + + It will look in parent directories for __init__.py files. The first parent directory without __init__.py is the + top-level directory. + + Returned directory might be used to extend the PYTHONPATH. + """ + curr_dir = os.path.dirname(os.path.abspath(filename)) + pattern = '__init__.py' + + # Try max. 10 levels up. + try: + for i in range(10): + files = set(os.listdir(curr_dir)) + # 'curr_dir' is still not top-level; go to parent dir. + if pattern in files: + curr_dir = os.path.dirname(curr_dir) + # Top-level dir found; return it. + else: + return curr_dir + except IOError: + pass + # No top-level directory found, or error was encountered. + return None + + +def mtime(fnm): + try: + # TODO: explain why this does not use os.path.getmtime() ? + # - It is probably not used because it returns float and not int. + return os.stat(fnm)[8] + except Exception: + return 0 + + +def save_py_data_struct(filename, data): + """ + Save data into text file as Python data structure. + :param filename: + :param data: + :return: + """ + dirname = os.path.dirname(filename) + if not os.path.exists(dirname): + os.makedirs(dirname) + with open(filename, 'w', encoding='utf-8') as f: + pprint.pprint(data, f) + + +def load_py_data_struct(filename): + """ + Load data saved as python code and interpret that code. + :param filename: + :return: + """ + with open(filename, 'r', encoding='utf-8') as f: + if is_win: + # import versioninfo so that VSVersionInfo can parse correctly. + from PyInstaller.utils.win32 import versioninfo # noqa: F401 + + return eval(f.read()) + + +def absnormpath(apath): + return os.path.abspath(os.path.normpath(apath)) + + +def module_parent_packages(full_modname): + """ + Return list of parent package names. + 'aaa.bb.c.dddd' -> ['aaa', 'aaa.bb', 'aaa.bb.c'] + :param full_modname: Full name of a module. + :return: List of parent module names. + """ + prefix = '' + parents = [] + # Ignore the last component in module name and get really just parent, grandparent, great grandparent, etc. + for pkg in full_modname.split('.')[0:-1]: + # Ensure that first item does not start with dot '.' + prefix += '.' + pkg if prefix else pkg + parents.append(prefix) + return parents + + +def is_file_qt_plugin(filename): + """ + Check if the given file is a Qt plugin file. + :param filename: Full path to file to check. + :return: True if given file is a Qt plugin file, False if not. + """ + + # Check the file contents; scan for QTMETADATA string. The scan is based on the brute-force Windows codepath of + # findPatternUnloaded() from qtbase/src/corelib/plugin/qlibrary.cpp in Qt5. + with open(filename, 'rb') as fp: + fp.seek(0, os.SEEK_END) + end_pos = fp.tell() + + SEARCH_CHUNK_SIZE = 8192 + QTMETADATA_MAGIC = b'QTMETADATA ' + + magic_offset = -1 + while end_pos >= len(QTMETADATA_MAGIC): + start_pos = max(end_pos - SEARCH_CHUNK_SIZE, 0) + chunk_size = end_pos - start_pos + # Is the remaining chunk large enough to hold the pattern? + if chunk_size < len(QTMETADATA_MAGIC): + break + # Read and scan the chunk + fp.seek(start_pos, os.SEEK_SET) + buf = fp.read(chunk_size) + pos = buf.rfind(QTMETADATA_MAGIC) + if pos != -1: + magic_offset = start_pos + pos + break + # Adjust search location for next chunk; ensure proper overlap. + end_pos = start_pos + len(QTMETADATA_MAGIC) - 1 + if magic_offset == -1: + return False + + return True + + +BOM_MARKERS_TO_DECODERS = { + codecs.BOM_UTF32_LE: codecs.utf_32_le_decode, + codecs.BOM_UTF32_BE: codecs.utf_32_be_decode, + codecs.BOM_UTF32: codecs.utf_32_decode, + codecs.BOM_UTF16_LE: codecs.utf_16_le_decode, + codecs.BOM_UTF16_BE: codecs.utf_16_be_decode, + codecs.BOM_UTF16: codecs.utf_16_decode, + codecs.BOM_UTF8: codecs.utf_8_decode, +} +BOM_RE = re.compile(rb"\A(%s)?(.*)" % b"|".join(map(re.escape, BOM_MARKERS_TO_DECODERS)), re.DOTALL) + + +def decode(raw: bytes): + """ + Decode bytes to string, respecting and removing any byte-order marks if present, or respecting but not removing any + PEP263 encoding comments (# encoding: cp1252). + """ + bom, raw = BOM_RE.match(raw).groups() + if bom: + return BOM_MARKERS_TO_DECODERS[bom](raw)[0] + + encoding, _ = tokenize.detect_encoding(io.BytesIO(raw).readline) + return raw.decode(encoding) + + +def is_iterable(arg): + """ + Check if the passed argument is an iterable." + """ + try: + iter(arg) + except TypeError: + return False + return True + + +def path_to_parent_archive(filename): + """ + Check if the given file path points to a file inside an existing archive file. Returns first path from the set of + parent paths that points to an existing file, or `None` if no such path exists (i.e., file is an actual stand-alone + file). + """ + for parent in pathlib.Path(filename).parents: + if parent.is_file(): + return parent + return None diff --git a/venv/Lib/site-packages/PyInstaller/utils/osx.py b/venv/Lib/site-packages/PyInstaller/utils/osx.py new file mode 100644 index 0000000..d8d770e --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/osx.py @@ -0,0 +1,692 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2014-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Utils for Mac OS platform. +""" + +import math +import os +import pathlib +import subprocess +import shutil +import tempfile + +from macholib.mach_o import ( + LC_BUILD_VERSION, + LC_CODE_SIGNATURE, + LC_ID_DYLIB, + LC_LOAD_DYLIB, + LC_LOAD_UPWARD_DYLIB, + LC_LOAD_WEAK_DYLIB, + LC_PREBOUND_DYLIB, + LC_REEXPORT_DYLIB, + LC_RPATH, + LC_SEGMENT_64, + LC_SYMTAB, + LC_VERSION_MIN_MACOSX, +) +from macholib.MachO import MachO +import macholib.util + +import PyInstaller.log as logging +from PyInstaller import compat + +logger = logging.getLogger(__name__) + + +def is_homebrew_env(): + """ + Check if Python interpreter was installed via Homebrew command 'brew'. + + :return: True if Homebrew else otherwise. + """ + # Python path prefix should start with Homebrew prefix. + env_prefix = get_homebrew_prefix() + if env_prefix and compat.base_prefix.startswith(env_prefix): + return True + return False + + +def is_macports_env(): + """ + Check if Python interpreter was installed via Macports command 'port'. + + :return: True if Macports else otherwise. + """ + # Python path prefix should start with Macports prefix. + env_prefix = get_macports_prefix() + if env_prefix and compat.base_prefix.startswith(env_prefix): + return True + return False + + +def get_homebrew_prefix(): + """ + :return: Root path of the Homebrew environment. + """ + prefix = shutil.which('brew') + # Conversion: /usr/local/bin/brew -> /usr/local + prefix = os.path.dirname(os.path.dirname(prefix)) + return prefix + + +def get_macports_prefix(): + """ + :return: Root path of the Macports environment. + """ + prefix = shutil.which('port') + # Conversion: /usr/local/bin/port -> /usr/local + prefix = os.path.dirname(os.path.dirname(prefix)) + return prefix + + +def _find_version_cmd(header): + """ + Helper that finds the version command in the given MachO header. + """ + # The SDK version is stored in LC_BUILD_VERSION command (used when targeting the latest versions of macOS) or in + # older LC_VERSION_MIN_MACOSX command. Check for presence of either. + version_cmd = [cmd for cmd in header.commands if cmd[0].cmd in {LC_BUILD_VERSION, LC_VERSION_MIN_MACOSX}] + assert len(version_cmd) == 1, \ + f"Expected exactly one LC_BUILD_VERSION or LC_VERSION_MIN_MACOSX command, found {len(version_cmd)}!" + return version_cmd[0] + + +def get_macos_sdk_version(filename): + """ + Obtain the version of macOS SDK against which the given binary was built. + + NOTE: currently, version is retrieved only from the first arch slice in the binary. + + :return: (major, minor, revision) tuple + """ + binary = MachO(filename) + header = binary.headers[0] + # Find version command using helper + version_cmd = _find_version_cmd(header) + return _hex_triplet(version_cmd[1].sdk) + + +def _hex_triplet(version): + # Parse SDK version number + major = (version & 0xFF0000) >> 16 + minor = (version & 0xFF00) >> 8 + revision = (version & 0xFF) + return major, minor, revision + + +def macosx_version_min(filename: str) -> tuple: + """ + Get the -macosx-version-min used to compile a macOS binary. + + For fat binaries, the minimum version is selected. + """ + versions = [] + for header in MachO(filename).headers: + cmd = _find_version_cmd(header) + if cmd[0].cmd == LC_VERSION_MIN_MACOSX: + versions.append(cmd[1].version) + else: + # macOS >= 10.14 uses LC_BUILD_VERSION instead. + versions.append(cmd[1].minos) + + return min(map(_hex_triplet, versions)) + + +def set_macos_sdk_version(filename, major, minor, revision): + """ + Overwrite the macOS SDK version declared in the given binary with the specified version. + + NOTE: currently, only version in the first arch slice is modified. + """ + # Validate values + assert 0 <= major <= 255, "Invalid major version value!" + assert 0 <= minor <= 255, "Invalid minor version value!" + assert 0 <= revision <= 255, "Invalid revision value!" + # Open binary + binary = MachO(filename) + header = binary.headers[0] + # Find version command using helper + version_cmd = _find_version_cmd(header) + # Write new SDK version number + version_cmd[1].sdk = major << 16 | minor << 8 | revision + # Write changes back. + with open(binary.filename, 'rb+') as fp: + binary.write(fp) + + +def fix_exe_for_code_signing(filename): + """ + Fixes the Mach-O headers to make code signing possible. + + Code signing on Mac OS does not work out of the box with embedding .pkg archive into the executable. + + The fix is done this way: + - Make the embedded .pkg archive part of the Mach-O 'String Table'. 'String Table' is at end of the Mac OS exe file, + so just change the size of the table to cover the end of the file. + - Fix the size of the __LINKEDIT segment. + + Note: the above fix works only if the single-arch thin executable or the last arch slice in a multi-arch fat + executable is not signed, because LC_CODE_SIGNATURE comes after LC_SYMTAB, and because modification of headers + invalidates the code signature. On modern arm64 macOS, code signature is mandatory, and therefore compilers + create a dummy signature when executable is built. In such cases, that signature needs to be removed before this + function is called. + + Mach-O format specification: http://developer.apple.com/documentation/Darwin/Reference/ManPages/man5/Mach-O.5.html + """ + # Estimate the file size after data was appended + file_size = os.path.getsize(filename) + + # Take the last available header. A single-arch thin binary contains a single slice, while a multi-arch fat binary + # contains multiple, and we need to modify the last one, which is adjacent to the appended data. + executable = MachO(filename) + header = executable.headers[-1] + + # Sanity check: ensure the executable slice is not signed (otherwise signature's section comes last in the + # __LINKEDIT segment). + sign_sec = [cmd for cmd in header.commands if cmd[0].cmd == LC_CODE_SIGNATURE] + assert len(sign_sec) == 0, "Executable contains code signature!" + + # Find __LINKEDIT segment by name (16-byte zero padded string) + __LINKEDIT_NAME = b'__LINKEDIT\x00\x00\x00\x00\x00\x00' + linkedit_seg = [cmd for cmd in header.commands if cmd[0].cmd == LC_SEGMENT_64 and cmd[1].segname == __LINKEDIT_NAME] + assert len(linkedit_seg) == 1, "Expected exactly one __LINKEDIT segment!" + linkedit_seg = linkedit_seg[0][1] # Take the segment command entry + # Find SYMTAB section + symtab_sec = [cmd for cmd in header.commands if cmd[0].cmd == LC_SYMTAB] + assert len(symtab_sec) == 1, "Expected exactly one SYMTAB section!" + symtab_sec = symtab_sec[0][1] # Take the symtab command entry + + # The string table is located at the end of the SYMTAB section, which in turn is the last section in the __LINKEDIT + # segment. Therefore, the end of SYMTAB section should be aligned with the end of __LINKEDIT segment, and in turn + # both should be aligned with the end of the file (as we are in the last or the only arch slice). + # + # However, when removing the signature from the executable using codesign under Mac OS 10.13, the codesign utility + # may produce an invalid file, with the declared length of the __LINKEDIT segment (linkedit_seg.filesize) pointing + # beyond the end of file, as reported in issue #6167. + # + # We can compensate for that by not using the declared sizes anywhere, and simply recompute them. In the final + # binary, the __LINKEDIT segment and the SYMTAB section MUST end at the end of the file (otherwise, we have bigger + # issues...). So simply recompute the declared sizes as difference between the final file length and the + # corresponding start offset (NOTE: the offset is relative to start of the slice, which is stored in header.offset. + # In thin binaries, header.offset is zero and start offset is relative to the start of file, but with fat binaries, + # header.offset is non-zero) + symtab_sec.strsize = file_size - (header.offset + symtab_sec.stroff) + linkedit_seg.filesize = file_size - (header.offset + linkedit_seg.fileoff) + + # Compute new vmsize by rounding filesize up to full page size. + page_size = (0x4000 if _get_arch_string(header.header).startswith('arm64') else 0x1000) + linkedit_seg.vmsize = math.ceil(linkedit_seg.filesize / page_size) * page_size + + # NOTE: according to spec, segments need to be aligned to page boundaries: 0x4000 (16 kB) for arm64, 0x1000 (4 kB) + # for other arches. But it seems we can get away without rounding and padding the segment file size - perhaps + # because it is the last one? + + # Write changes + with open(filename, 'rb+') as fp: + executable.write(fp) + + # In fat binaries, we also need to adjust the fat header. macholib as of version 1.14 does not support this, so we + # need to do it ourselves... + if executable.fat: + from macholib.mach_o import (FAT_MAGIC, FAT_MAGIC_64, fat_arch, fat_arch64, fat_header) + with open(filename, 'rb+') as fp: + # Taken from MachO.load_fat() implementation. The fat header's signature has already been validated when we + # loaded the file for the first time. + fat = fat_header.from_fileobj(fp) + if fat.magic == FAT_MAGIC: + archs = [fat_arch.from_fileobj(fp) for i in range(fat.nfat_arch)] + elif fat.magic == FAT_MAGIC_64: + archs = [fat_arch64.from_fileobj(fp) for i in range(fat.nfat_arch)] + # Adjust the size in the fat header for the last slice. + arch = archs[-1] + arch.size = file_size - arch.offset + # Now write the fat headers back to the file. + fp.seek(0) + fat.to_fileobj(fp) + for arch in archs: + arch.to_fileobj(fp) + + +def _get_arch_string(header): + """ + Converts cputype and cpusubtype from mach_o.mach_header_64 into arch string comparible with lipo/codesign. + The list of supported architectures can be found in man(1) arch. + """ + # NOTE: the constants below are taken from macholib.mach_o + cputype = header.cputype + cpusubtype = header.cpusubtype & 0x0FFFFFFF + if cputype == 0x01000000 | 7: + if cpusubtype == 8: + return 'x86_64h' # 64-bit intel (haswell) + else: + return 'x86_64' # 64-bit intel + elif cputype == 0x01000000 | 12: + if cpusubtype == 2: + return 'arm64e' + else: + return 'arm64' + elif cputype == 7: + return 'i386' # 32-bit intel + assert False, 'Unhandled architecture!' + + +class InvalidBinaryError(Exception): + """ + Exception raised by ˙get_binary_architectures˙ when it is passed an invalid binary. + """ + pass + + +class IncompatibleBinaryArchError(Exception): + """ + Exception raised by `binary_to_target_arch` when the passed binary fails the strict architecture check. + """ + def __init__(self, message): + url = "https://pyinstaller.org/en/stable/feature-notes.html#macos-multi-arch-support" + super().__init__(f"{message} For details about this error message, see: {url}") + + +def get_binary_architectures(filename): + """ + Inspects the given binary and returns tuple (is_fat, archs), where is_fat is boolean indicating fat/thin binary, + and arch is list of architectures with lipo/codesign compatible names. + """ + try: + executable = MachO(filename) + except ValueError as e: + raise InvalidBinaryError("Invalid Mach-O binary!") from e + return bool(executable.fat), [_get_arch_string(hdr.header) for hdr in executable.headers] + + +def convert_binary_to_thin_arch(filename, thin_arch, output_filename=None): + """ + Convert the given fat binary into thin one with the specified target architecture. + """ + output_filename = output_filename or filename + cmd_args = ['lipo', '-thin', thin_arch, filename, '-output', output_filename] + p = subprocess.run(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf-8') + if p.returncode: + raise SystemError(f"lipo command ({cmd_args}) failed with error code {p.returncode}!\noutput: {p.stdout}") + + +def merge_into_fat_binary(output_filename, *slice_filenames): + """ + Merge the given single-arch thin binary files into a fat binary. + """ + cmd_args = ['lipo', '-create', '-output', output_filename, *slice_filenames] + p = subprocess.run(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf-8') + if p.returncode: + raise SystemError(f"lipo command ({cmd_args}) failed with error code {p.returncode}!\noutput: {p.stdout}") + + +def binary_to_target_arch(filename, target_arch, display_name=None): + """ + Check that the given binary contains required architecture slice(s) and convert the fat binary into thin one, + if necessary. + """ + if not display_name: + display_name = filename # Same as input file + # Check the binary + is_fat, archs = get_binary_architectures(filename) + if target_arch == 'universal2': + if not is_fat: + raise IncompatibleBinaryArchError(f"{display_name} is not a fat binary!") + # Assume fat binary is universal2; nothing to do + else: + if is_fat: + if target_arch not in archs: + raise IncompatibleBinaryArchError(f"{display_name} does not contain slice for {target_arch}!") + # Convert to thin arch + logger.debug("Converting fat binary %s (%s) to thin binary (%s)", filename, display_name, target_arch) + convert_binary_to_thin_arch(filename, target_arch) + else: + if target_arch not in archs: + raise IncompatibleBinaryArchError( + f"{display_name} is incompatible with target arch {target_arch} (has arch: {archs[0]})!" + ) + # Binary has correct arch; nothing to do + + +def remove_signature_from_binary(filename): + """ + Remove the signature from all architecture slices of the given binary file using the codesign utility. + """ + logger.debug("Removing signature from file %r", filename) + cmd_args = ['/usr/bin/codesign', '--remove', '--all-architectures', filename] + p = subprocess.run(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf-8') + if p.returncode: + raise SystemError(f"codesign command ({cmd_args}) failed with error code {p.returncode}!\noutput: {p.stdout}") + + +def sign_binary(filename, identity=None, entitlements_file=None, deep=False): + """ + Sign the binary using codesign utility. If no identity is provided, ad-hoc signing is performed. + """ + extra_args = [] + if not identity: + identity = '-' # ad-hoc signing + else: + extra_args.append('--options=runtime') # hardened runtime + if entitlements_file: + extra_args.append('--entitlements') + extra_args.append(entitlements_file) + if deep: + extra_args.append('--deep') + + logger.debug("Signing file %r", filename) + cmd_args = [ + '/usr/bin/codesign', '-s', identity, '--force', '--all-architectures', '--timestamp', *extra_args, filename + ] + p = subprocess.run(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf-8') + if p.returncode: + raise SystemError(f"codesign command ({cmd_args}) failed with error code {p.returncode}!\noutput: {p.stdout}") + + +def set_dylib_dependency_paths(filename, target_rpath): + """ + Modify the given dylib's identity (in LC_ID_DYLIB command) and the paths to dependent dylibs (in LC_LOAD_DYLIB) + commands into `@rpath/` format, remove any existing rpaths (LC_RPATH commands), and add a new rpath + (LC_RPATH command) with the specified path. + + Uses `install-tool-name` utility to make the changes. + + The system libraries (e.g., the ones found in /usr/lib) are exempted from path rewrite. + + For multi-arch fat binaries, this function extracts each slice into temporary file, processes it separately, + and then merges all processed slices back into fat binary. This is necessary because `install-tool-name` cannot + modify rpaths in cases when an existing rpath is present only in one slice. + """ + + # Check if we are dealing with a fat binary; the `install-name-tool` seems to be unable to remove an rpath that is + # present only in one slice, so we need to extract each slice, process it separately, and then stich processed + # slices back into a fat binary. + is_fat, archs = get_binary_architectures(filename) + + if is_fat: + with tempfile.TemporaryDirectory() as tmpdir: + slice_filenames = [] + for arch in archs: + slice_filename = os.path.join(tmpdir, arch) + convert_binary_to_thin_arch(filename, arch, output_filename=slice_filename) + _set_dylib_dependency_paths(slice_filename, target_rpath) + slice_filenames.append(slice_filename) + merge_into_fat_binary(filename, *slice_filenames) + else: + # Thin binary - we can process it directly + _set_dylib_dependency_paths(filename, target_rpath) + + +def _set_dylib_dependency_paths(filename, target_rpath): + """ + The actual implementation of set_dylib_dependency_paths functionality. + + Implicitly assumes that a single-arch thin binary is given. + """ + + # Relocatable commands that we should overwrite - same list as used by `macholib`. + _RELOCATABLE = { + LC_LOAD_DYLIB, + LC_LOAD_UPWARD_DYLIB, + LC_LOAD_WEAK_DYLIB, + LC_PREBOUND_DYLIB, + LC_REEXPORT_DYLIB, + } + + # Parse dylib's header to extract the following commands: + # - LC_LOAD_DYLIB (or any member of _RELOCATABLE list): dylib load commands (dependent libraries) + # - LC_RPATH: rpath definitions + # - LC_ID_DYLIB: dylib's identity + binary = MachO(filename) + + dylib_id = None + rpaths = set() + linked_libs = set() + + for header in binary.headers: + for cmd in header.commands: + lc_type = cmd[0].cmd + if lc_type not in _RELOCATABLE and lc_type not in {LC_RPATH, LC_ID_DYLIB}: + continue + + # Decode path, strip trailing NULL characters + path = cmd[2].decode('utf-8').rstrip('\x00') + + if lc_type in _RELOCATABLE: + linked_libs.add(path) + elif lc_type == LC_RPATH: + rpaths.add(path) + elif lc_type == LC_ID_DYLIB: + dylib_id = path + + del binary + + # If dylib has identifier set, compute the normalized version, in form of `@rpath/basename`. + normalized_dylib_id = None + if dylib_id: + normalized_dylib_id = str(pathlib.PurePath('@rpath') / pathlib.PurePath(dylib_id).name) + + # Find dependent libraries that should have their prefix path changed to `@rpath`. If any dependent libraries + # end up using `@rpath` (originally or due to rewrite), set the `rpath_required` boolean to True, so we know + # that we need to add our rpath. + changed_lib_paths = [] + rpath_required = False + for linked_lib in linked_libs: + # Leave system dynamic libraries unchanged. + if macholib.util.in_system_path(linked_lib): + continue + + # The older python.org builds that use system Tcl/Tk framework have their _tkinter.cpython-*-darwin.so + # library linked against /Library/Frameworks/Tcl.framework/Versions/8.5/Tcl and + # /Library/Frameworks/Tk.framework/Versions/8.5/Tk, although the actual frameworks are located in + # /System/Library/Frameworks. Therefore, they slip through the above in_system_path() check, and we need to + # exempt them manually. + _exemptions = [ + '/Library/Frameworks/Tcl.framework/', + '/Library/Frameworks/Tk.framework/', + ] + if any([x in linked_lib for x in _exemptions]): + continue + + # This linked library will end up using `@rpath`, whether modified or not... + rpath_required = True + + new_path = str(pathlib.PurePath('@rpath') / pathlib.PurePath(linked_lib).name) + if linked_lib == new_path: + continue + + changed_lib_paths.append((linked_lib, new_path)) + + # Gather arguments for `install-name-tool` + install_name_tool_args = [] + + # Modify the dylib identifier if necessary + if normalized_dylib_id and normalized_dylib_id != dylib_id: + install_name_tool_args += ["-id", normalized_dylib_id] + + # Changed libs + for original_path, new_path in changed_lib_paths: + install_name_tool_args += ["-change", original_path, new_path] + + # Remove all existing rpaths except for the target rpath (if it already exists). `install_name_tool` disallows using + # `-delete_rpath` and `-add_rpath` with the same argument. + for rpath in rpaths: + if rpath == target_rpath: + continue + install_name_tool_args += [ + "-delete_rpath", + rpath, + ] + + # If any of linked libraries use @rpath now and our target rpath is not already added, add it. + # NOTE: @rpath in the dylib identifier does not actually require the rpath to be set on the binary... + if rpath_required and target_rpath not in rpaths: + install_name_tool_args += [ + "-add_rpath", + target_rpath, + ] + + # If we have no arguments, finish immediately. + if not install_name_tool_args: + return + + # Run `install_name_tool` + cmd_args = ["install_name_tool", *install_name_tool_args, filename] + p = subprocess.run(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding='utf-8') + if p.returncode: + raise SystemError( + f"install_name_tool command ({cmd_args}) failed with error code {p.returncode}!\noutput: {p.stdout}" + ) + + +def is_framework_bundle_lib(lib_path): + """ + Check if the given shared library is part of a .framework bundle. + """ + + lib_path = pathlib.PurePath(lib_path) + + # For now, focus only on versioned layout, such as `QtCore.framework/Versions/5/QtCore` + if lib_path.parent.parent.name != "Versions": + return False + if lib_path.parent.parent.parent.name != lib_path.name + ".framework": + return False + + return True + + +def collect_files_from_framework_bundles(collected_files): + """ + Scan the given TOC list of collected files for shared libraries that are collected from macOS .framework bundles, + and collect the bundles' Info.plist files. Additionally, the following symbolic links: + - `Versions/Current` pointing to the `Versions/` directory containing the binary + - `` in the top-level .framework directory, pointing to `Versions/Current/` + - `Resources` in the top-level .framework directory, pointing to `Versions/Current/Resources` + - additional directories in top-level .framework directory, pointing to their counterparts in `Versions/Current` + directory. + + Returns TOC list for the discovered Info.plist files and generated symbolic links. The list does not contain + duplicated entries. + """ + invalid_framework_found = False + + framework_files = set() # Additional entries for collected files. Use set for de-duplication. + framework_paths = set() # Registered framework paths for 2nd pass. + + # 1st pass: discover binaries from .framework bundles, and for each such binary: + # - collect `Info.plist` + # - create `Current` -> `` symlink in `.framework/Versions` directory. + # - create `.framework/` -> `.framework/Versions/Current/` symlink. + # - create `.framework/Resources` -> `.framework/Versions/Current/Resources` symlink. + for dest_name, src_name, typecode in collected_files: + if typecode != 'BINARY': + continue + + src_path = pathlib.Path(src_name) # /src/path/to/.framework/Versions// + dest_path = pathlib.PurePath(dest_name) # /dest/path/to/.framework/Versions// + + # Check whether binary originates from a .framework bundle + if not is_framework_bundle_lib(src_path): + continue + + # Check whether binary is also collected into a .framework bundle (i.e., the original layout is preserved) + if not is_framework_bundle_lib(dest_path): + continue + + # Assuming versioned layout, Info.plist should exist in Resources directory located next to the binary. + info_plist_src = src_path.parent / "Resources" / "Info.plist" + if not info_plist_src.is_file(): + # Alas, the .framework bundles shipped with PySide/PyQt might have Info.plist available only in the + # top-level Resources directory. So accommodate this scenario as well, but collect the file into + # versioned directory to appease the code-signing gods... + info_plist_src_top = src_path.parent.parent.parent / "Resources" / "Info.plist" + if not info_plist_src_top.is_file(): + # Strictly speaking, a .framework bundle without Info.plist is invalid. However, that did not prevent + # PyQt from shipping such Qt .framework bundles up until v5.14.1. So by default, we just complain via + # a warning message; if such binaries work in unfrozen python, they should also work in frozen + # application. The codesign will refuse to sign the .app bundle (if we are generating one), but there + # is nothing we can do about that. + invalid_framework_found = True + framework_dir = src_path.parent.parent.parent + if compat.strict_collect_mode: + raise SystemError(f"Could not find Info.plist in {framework_dir}!") + else: + logger.warning("Could not find Info.plist in %s!", framework_dir) + continue + info_plist_src = info_plist_src_top + info_plist_dest = dest_path.parent / "Resources" / "Info.plist" + framework_files.add((str(info_plist_dest), str(info_plist_src), "DATA")) + + # Reconstruct the symlink Versions/Current -> Versions/. + # This one seems to be necessary for code signing, but might be absent from .framework bundles shipped with + # python packages. So we always create it ourselves. + framework_files.add((str(dest_path.parent.parent / "Current"), str(dest_path.parent.name), "SYMLINK")) + + dest_framework_path = dest_path.parent.parent.parent # Top-level .framework directory path. + + # Symlink the binary in the `Current` directory to the top-level .framework directory. + framework_files.add(( + str(dest_framework_path / dest_path.name), + str(pathlib.PurePath("Versions/Current") / dest_path.name), + "SYMLINK", + )) + + # Ditto for the `Resources` directory. + framework_files.add(( + str(dest_framework_path / "Resources"), + "Versions/Current/Resources", + "SYMLINK", + )) + + # Register the framework parent path to use in additional directories scan in subsequent pass. + framework_paths.add(dest_framework_path) + + # 2nd pass: scan for additional collected directories from .framework bundles, and create symlinks to the top-level + # application directory. Make the outer loop go over the registered framework paths, so it becomes no-op if no + # framework paths are registered. + VALID_SUBDIRS = {'Helpers', 'Resources'} + + for dest_framework_path in framework_paths: + for dest_name, src_name, typecode in collected_files: + dest_path = pathlib.PurePath(dest_name) + + # Try matching against framework path + try: + remaining_path = dest_path.relative_to(dest_framework_path) + except ValueError: # dest_path is not subpath of dest_framework_path + continue + + remaining_path_parts = remaining_path.parts + + # We are interested only in entries under Versions directory. + if remaining_path_parts[0] != 'Versions': + continue + + # If the entry name is among valid sub-directory names, create symlink. + dir_name = remaining_path_parts[2] + if dir_name not in VALID_SUBDIRS: + continue + + framework_files.add(( + str(dest_framework_path / dir_name), + str(pathlib.PurePath("Versions/Current") / dir_name), + "SYMLINK", + )) + + # If we encountered an invalid .framework bundle without Info.plist, warn the user that code-signing will most + # likely fail. + if invalid_framework_found: + logger.warning( + "One or more collected .framework bundles have missing Info.plist file. If you are building an .app " + "bundle, you will most likely not be able to code-sign it." + ) + + return sorted(framework_files) diff --git a/venv/Lib/site-packages/PyInstaller/utils/run_tests.py b/venv/Lib/site-packages/PyInstaller/utils/run_tests.py new file mode 100644 index 0000000..c655c7a --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/run_tests.py @@ -0,0 +1,70 @@ +# ----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +# ----------------------------------------------------------------------------- + +import argparse +import sys + +import pytest + +from PyInstaller.compat import importlib_metadata + + +def paths_to_test(include_only=None): + """ + If ``include_only`` is falsey, this functions returns paths from all entry points. Otherwise, this parameter + must be a string or sequence of strings. In this case, this function will return *only* paths from entry points + whose ``module_name`` begins with the provided string(s). + """ + # Convert a string to a list. + if isinstance(include_only, str): + include_only = [include_only] + + # Walk through all entry points. + test_path_list = [] + for entry_point in importlib_metadata.entry_points(group="pyinstaller40", name="tests"): + # Implement ``include_only``. + if ( + not include_only # If falsey, include everything, + # Otherwise, include only the specified modules. + or any(entry_point.module.startswith(name) for name in include_only) + ): + test_path_list += list(entry_point.load()()) + return test_path_list + + +# Run pytest on all tests registered by the PyInstaller setuptools testing entry point. If provided, +# the ``include_only`` argument is passed to ``path_to_test``. +def run_pytest(*args, **kwargs): + paths = paths_to_test(include_only=kwargs.pop("include_only", None)) + # Return an error code if no tests were discovered. + if not paths: + print("Error: no tests discovered.", file=sys.stderr) + # This indicates no tests were discovered; see + # https://docs.pytest.org/en/latest/usage.html#possible-exit-codes. + return 5 + else: + # See https://docs.pytest.org/en/latest/usage.html#calling-pytest-from-python-code. + # Omit ``args[0]``, which is the name of this script. + print("pytest " + " ".join([*paths, *args[1:]])) + return pytest.main([*paths, *args[1:]], **kwargs) + + +if __name__ == "__main__": + # Look only for the ``--include_only`` argument. + parser = argparse.ArgumentParser(description='Run PyInstaller packaging tests.') + parser.add_argument( + "--include_only", + action="append", + help="Only run tests from the specified package.", + ) + args, unknown = parser.parse_known_args(sys.argv) + # Convert the parsed args into a dict using ``vars(args)``. + sys.exit(run_pytest(*unknown, **vars(args))) diff --git a/venv/Lib/site-packages/PyInstaller/utils/tests.py b/venv/Lib/site-packages/PyInstaller/utils/tests.py new file mode 100644 index 0000000..ae5ee36 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/tests.py @@ -0,0 +1,152 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Decorators for skipping PyInstaller tests when specific requirements are not met. +""" + +import distutils.ccompiler +import inspect +import os +import shutil +import textwrap + +import pytest +import sys + +from PyInstaller.compat import is_win +from PyInstaller.utils.hooks import check_requirement + +# Wrap some pytest decorators to be consistent in tests. +parametrize = pytest.mark.parametrize +skipif = pytest.mark.skipif +xfail = pytest.mark.xfail + + +def _check_for_compiler(): + import tempfile + + # Change to some tempdir since cc.has_function() would compile into the current directory, leaving garbage. + old_wd = os.getcwd() + tmp = tempfile.mkdtemp() + os.chdir(tmp) + cc = distutils.ccompiler.new_compiler() # NOTE: Mingw32CCompiler on Windows does not have `initialize` method. + if is_win and hasattr(cc, 'initialize'): + try: + cc.initialize() + has_compiler = True + # This error is raised on Windows if a compiler can't be found. + except distutils.errors.DistutilsPlatformError: + has_compiler = False + else: + # The C standard library contains the ``clock`` function. Use that to determine if a compiler is installed. This + # does not work on Windows:: + # + # Users\bjones\AppData\Local\Temp\a.out.exe.manifest : general error + # c1010070: Failed to load and parse the manifest. The system cannot + # find the file specified. + has_compiler = cc.has_function('clock', includes=['time.h']) + os.chdir(old_wd) + # TODO: Find a way to remove the generated clockXXXX.c file, too + shutil.rmtree(tmp) + return has_compiler + + +# A decorator to skip tests if a C compiler is not detected. +has_compiler = _check_for_compiler() +skipif_no_compiler = skipif(not has_compiler, reason="Requires a C compiler") + +skip = pytest.mark.skip + + +def importorskip(package: str): + """ + Skip a decorated test if **package** is not importable. + + Arguments: + package: + The name of the module. May be anything that is allowed after the ``import`` keyword. e.g. 'numpy' or + 'PIL.Image'. + Returns: + A pytest marker which either skips the test or does nothing. + + This function intentionally does not import the module. Doing so can lead to `sys.path` and `PATH` being + polluted, which then breaks later builds. + """ + if not importable(package): + return pytest.mark.skip(f"Can't import '{package}'.") + return pytest.mark.skipif(False, reason=f"Don't skip: '{package}' is importable.") + + +def importable(package: str): + from importlib.util import find_spec + + # The find_spec() function is used by the importlib machinery to locate a module to import. Using it finds the + # module but does not run it. Unfortunately, it does import parent modules to check submodules. + if "." in package: + # Using subprocesses is slow. If the top level module doesn't exist then we can skip it. + if not importable(package.split(".")[0]): + return False + # This is a submodule, import it in isolation. + from subprocess import DEVNULL, run + return run([sys.executable, "-c", "import " + package], stdout=DEVNULL, stderr=DEVNULL).returncode == 0 + + return find_spec(package) is not None + + +def requires(requirement: str): + """ + Mark a test to be skipped if **requirement** is not satisfied. + + Args: + requirement: + A distribution name and optional version specifier(s). See :func:`PyInstaller.utils.hooks.check_requirement` + which this argument is forwarded to. + Returns: + Either a skip marker or a dummy marker. + + This function operates on distribution metadata, and does not import any modules. + """ + if check_requirement(requirement): + return pytest.mark.skipif(False, reason=f"Don't skip: '{requirement}' is satisfied.") + else: + return pytest.mark.skip(f"Requires {requirement}.") + + +def gen_sourcefile(tmpdir, source, test_id=None): + """ + Generate a source file for testing. + + The source will be written into a file named like the test-function. This file will then be passed to + `test_script`. If you need other related file, e.g. as `.toc`-file for testing the content, put it at at the + normal place. Just mind to take the basnename from the test-function's name. + + :param script: Source code to create executable from. This will be saved into a temporary file which is then + passed on to `test_script`. + + :param test_id: Test-id for parametrized tests. If given, it will be appended to the script filename, + separated by two underscores. + + Ensure that the caller of `test_source` is in a UTF-8 encoded file with the correct '# -*- coding: utf-8 -*-' + marker. + """ + testname = inspect.stack()[1][3] + if test_id: + # For parametrized test append the test-id. + testname = testname + '__' + test_id + + # Periods are not allowed in Python module names. + testname = testname.replace('.', '_') + scriptfile = tmpdir / (testname + '.py') + source = textwrap.dedent(source) + with scriptfile.open('w', encoding='utf-8') as ofh: + print('# -*- coding: utf-8 -*-', file=ofh) + print(source, file=ofh) + return scriptfile diff --git a/venv/Lib/site-packages/PyInstaller/utils/win32/__init__.py b/venv/Lib/site-packages/PyInstaller/utils/win32/__init__.py new file mode 100644 index 0000000..a7501ae --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/win32/__init__.py @@ -0,0 +1 @@ +__author__ = 'martin' diff --git a/venv/Lib/site-packages/PyInstaller/utils/win32/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/win32/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..460b634fef97e0341354512b4d5e9c2de3a08867 GIT binary patch literal 214 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/utils/win32/__pycache__/versioninfo.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/win32/__pycache__/versioninfo.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eedd90b4e67ecdb466bdedf0e4ca66e24778d513 GIT binary patch literal 32534 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%0AuDr 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 MMa<)3z}TMu4fgxxx&QzG literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/utils/win32/__pycache__/winmanifest.cpython-311.pyc b/venv/Lib/site-packages/PyInstaller/utils/win32/__pycache__/winmanifest.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b515071f5a06d077ec1dcb8145d26287e105de5b GIT binary patch literal 10407 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/utils/win32/icon.py b/venv/Lib/site-packages/PyInstaller/utils/win32/icon.py new file mode 100644 index 0000000..e596464 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/win32/icon.py @@ -0,0 +1,251 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +The code in this module supports the --icon parameter on Windows. +(For --icon support under Mac OS, see building/osx.py.) + +The only entry point, called from api.py, is CopyIcons(), below. All the elaborate structure of classes that follows +is used to support the operation of CopyIcons_FromIco(). None of these classes and globals are referenced outside +this module. +""" + +import os +import os.path +import struct + +import PyInstaller.log as logging +from PyInstaller import config +from PyInstaller.compat import pywintypes, win32api +from PyInstaller.building.icon import normalize_icon_type + +logger = logging.getLogger(__name__) + +RT_ICON = 3 +RT_GROUP_ICON = 14 +LOAD_LIBRARY_AS_DATAFILE = 2 + + +class Structure: + def __init__(self): + size = self._sizeInBytes = struct.calcsize(self._format_) + self._fields_ = list(struct.unpack(self._format_, b'\000' * size)) + indexes = self._indexes_ = {} + for i, nm in enumerate(self._names_): + indexes[nm] = i + + def dump(self): + logger.info("DUMP of %s", self) + for name in self._names_: + if not name.startswith('_'): + logger.info("%20s = %s", name, getattr(self, name)) + logger.info("") + + def __getattr__(self, name): + if name in self._names_: + index = self._indexes_[name] + return self._fields_[index] + try: + return self.__dict__[name] + except KeyError as e: + raise AttributeError(name) from e + + def __setattr__(self, name, value): + if name in self._names_: + index = self._indexes_[name] + self._fields_[index] = value + else: + self.__dict__[name] = value + + def tostring(self): + return struct.pack(self._format_, *self._fields_) + + def fromfile(self, file): + data = file.read(self._sizeInBytes) + self._fields_ = list(struct.unpack(self._format_, data)) + + +class ICONDIRHEADER(Structure): + _names_ = "idReserved", "idType", "idCount" + _format_ = "hhh" + + +class ICONDIRENTRY(Structure): + _names_ = ("bWidth", "bHeight", "bColorCount", "bReserved", "wPlanes", "wBitCount", "dwBytesInRes", "dwImageOffset") + _format_ = "bbbbhhii" + + +class GRPICONDIR(Structure): + _names_ = "idReserved", "idType", "idCount" + _format_ = "hhh" + + +class GRPICONDIRENTRY(Structure): + _names_ = ("bWidth", "bHeight", "bColorCount", "bReserved", "wPlanes", "wBitCount", "dwBytesInRes", "nID") + _format_ = "bbbbhhih" + + +# An IconFile instance is created for each .ico file given. +class IconFile: + def __init__(self, path): + self.path = path + try: + # The path is from the user parameter, don't trust it. + file = open(self.path, "rb") + except OSError: + # The icon file can't be opened for some reason. Stop the + # program with an informative message. + raise SystemExit(f'Unable to open icon file {self.path}!') + with file: + self.entries = [] + self.images = [] + header = self.header = ICONDIRHEADER() + header.fromfile(file) + for i in range(header.idCount): + entry = ICONDIRENTRY() + entry.fromfile(file) + self.entries.append(entry) + for e in self.entries: + file.seek(e.dwImageOffset, 0) + self.images.append(file.read(e.dwBytesInRes)) + + def grp_icon_dir(self): + return self.header.tostring() + + def grp_icondir_entries(self, id=1): + data = b'' + for entry in self.entries: + e = GRPICONDIRENTRY() + for n in e._names_[:-1]: + setattr(e, n, getattr(entry, n)) + e.nID = id + id = id + 1 + data = data + e.tostring() + return data + + +def CopyIcons_FromIco(dstpath, srcpath, id=1): + """ + Use the Win API UpdateResource facility to apply the icon resource(s) to the .exe file. + + :param str dstpath: absolute path of the .exe file being built. + :param str srcpath: list of 1 or more .ico file paths + """ + icons = map(IconFile, srcpath) + logger.debug("Copying icons from %s", srcpath) + + hdst = win32api.BeginUpdateResource(dstpath, 0) + + iconid = 1 + # Each step in the following enumerate() will instantiate an IconFile object, as a result of deferred execution + # of the map() above. + for i, f in enumerate(icons): + data = f.grp_icon_dir() + data = data + f.grp_icondir_entries(iconid) + win32api.UpdateResource(hdst, RT_GROUP_ICON, i + 1, data) + logger.debug("Writing RT_GROUP_ICON %d resource with %d bytes", i + 1, len(data)) + for data in f.images: + win32api.UpdateResource(hdst, RT_ICON, iconid, data) + logger.debug("Writing RT_ICON %d resource with %d bytes", iconid, len(data)) + iconid = iconid + 1 + + win32api.EndUpdateResource(hdst, 0) + + +def CopyIcons(dstpath, srcpath): + """ + Called from building/api.py to handle icons. If the input was by --icon on the command line, srcpath is a single + string. However, it is possible to modify the spec file adding icon=['foo.ico','bar.ico'] to the EXE() statement. + In that case, srcpath is a list of strings. + + The string format is either path-to-.ico or path-to-.exe,n for n an integer resource index in the .exe. In either + case, the path can be relative or absolute. + """ + + if isinstance(srcpath, (str, os.PathLike)): + # Just a single string, make it a one-element list. + srcpath = [srcpath] + # Convert possible PathLike elements to strings to allow the splitter function to work. + srcpath = [str(path) for path in srcpath] + + def splitter(s): + """ + Convert "pathname" to tuple ("pathname", None) + Convert "pathname,n" to tuple ("pathname", n) + """ + try: + srcpath, index = s.split(',') + return srcpath.strip(), int(index) + except ValueError: + return s, None + + # split all the items in the list into tuples as above. + srcpath = list(map(splitter, srcpath)) + + if len(srcpath) > 1: + # More than one icon source given. We currently handle multiple icons by calling CopyIcons_FromIco(), which only + # allows .ico, but will convert to that format if needed. + # + # Note that a ",index" on a .ico is just ignored in the single or multiple case. + srcs = [] + for s in srcpath: + srcs.append(normalize_icon_type(s[0], ("ico",), "ico", config.CONF["workpath"])) + return CopyIcons_FromIco(dstpath, srcs) + + # Just one source given. + srcpath, index = srcpath[0] + + # Makes sure the icon exists and attempts to convert to the proper format if applicable + srcpath = normalize_icon_type(srcpath, ("exe", "ico"), "ico", config.CONF["workpath"]) + + srcext = os.path.splitext(srcpath)[1] + + # Handle the simple case of foo.ico, ignoring any index. + if srcext.lower() == '.ico': + return CopyIcons_FromIco(dstpath, [srcpath]) + + # Single source is not .ico, presumably it is .exe (and if not, some error will occur). + if index is not None: + logger.debug("Copying icon from %s, %d", srcpath, index) + else: + logger.debug("Copying icons from %s", srcpath) + + try: + # Attempt to load the .ico or .exe containing the icon into memory using the same mechanism as if it were a DLL. + # If this fails for any reason (for example if the file does not exist or is not a .ico/.exe) then LoadLibraryEx + # returns a null handle and win32api raises a unique exception with a win error code and a string. + hsrc = win32api.LoadLibraryEx(srcpath, 0, LOAD_LIBRARY_AS_DATAFILE) + except pywintypes.error as W32E: + # We could continue with no icon (i.e., just return), but it seems best to terminate the build with a message. + raise SystemExit( + "Unable to load icon file {}\n {} (Error code {})".format(srcpath, W32E.strerror, W32E.winerror) + ) + hdst = win32api.BeginUpdateResource(dstpath, 0) + if index is None: + grpname = win32api.EnumResourceNames(hsrc, RT_GROUP_ICON)[0] + elif index >= 0: + grpname = win32api.EnumResourceNames(hsrc, RT_GROUP_ICON)[index] + else: + grpname = -index + data = win32api.LoadResource(hsrc, RT_GROUP_ICON, grpname) + win32api.UpdateResource(hdst, RT_GROUP_ICON, grpname, data) + for iconname in win32api.EnumResourceNames(hsrc, RT_ICON): + data = win32api.LoadResource(hsrc, RT_ICON, iconname) + win32api.UpdateResource(hdst, RT_ICON, iconname, data) + win32api.FreeLibrary(hsrc) + win32api.EndUpdateResource(hdst, 0) + + +if __name__ == "__main__": + import sys + + dstpath = sys.argv[1] + srcpath = sys.argv[2:] + CopyIcons(dstpath, srcpath) diff --git a/venv/Lib/site-packages/PyInstaller/utils/win32/versioninfo.py b/venv/Lib/site-packages/PyInstaller/utils/win32/versioninfo.py new file mode 100644 index 0000000..4a56425 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/win32/versioninfo.py @@ -0,0 +1,605 @@ +# -*- coding: utf-8 -*- +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- + +import struct + +import pefile + +from PyInstaller.compat import win32api + + +def pefile_check_control_flow_guard(filename): + """ + Checks if the specified PE file has CFG (Control Flow Guard) enabled. + + Parameters + ---------- + filename : str + Path to the PE file to inspect. + + Returns + ---------- + bool + True if file is a PE file with CFG enabled. False if CFG is not enabled or if file could not be processed using + the pefile library. + """ + try: + pe = pefile.PE(filename, fast_load=True) + # https://docs.microsoft.com/en-us/windows/win32/debug/pe-format + # IMAGE_DLLCHARACTERISTICS_GUARD_CF = 0x4000 + return bool(pe.OPTIONAL_HEADER.DllCharacteristics & 0x4000) + except Exception: + return False + + +# Ensures no code from the executable is executed. +LOAD_LIBRARY_AS_DATAFILE = 2 + + +def getRaw(text): + """ + Encodes text as UTF-16LE (Microsoft 'Unicode') for use in structs. + """ + return text.encode('UTF-16LE') + + +def read_version_info_from_executable(exe_filename): + """ + Read the version information structure from the given executable's resources, and return it as an instance of + `VSVersionInfo` structure. + """ + h = win32api.LoadLibraryEx(exe_filename, 0, LOAD_LIBRARY_AS_DATAFILE) + res = win32api.EnumResourceNames(h, pefile.RESOURCE_TYPE['RT_VERSION']) + if not len(res): + return None + data = win32api.LoadResource(h, pefile.RESOURCE_TYPE['RT_VERSION'], res[0]) + info = VSVersionInfo() + info.fromRaw(data) + win32api.FreeLibrary(h) + return info + + +def nextDWord(offset): + """ + Align `offset` to the next 4-byte boundary. + """ + return ((offset + 3) >> 2) << 2 + + +class VSVersionInfo: + """ + WORD wLength; // length of the VS_VERSION_INFO structure + WORD wValueLength; // length of the Value member + WORD wType; // 1 means text, 0 means binary + WCHAR szKey[]; // Contains the Unicode string "VS_VERSION_INFO". + WORD Padding1[]; + VS_FIXEDFILEINFO Value; + WORD Padding2[]; + WORD Children[]; // zero or more StringFileInfo or VarFileInfo + // structures (or both) that are children of the + // current version structure. + """ + def __init__(self, ffi=None, kids=None): + self.ffi = ffi + self.kids = kids or [] + + def fromRaw(self, data): + i, (sublen, vallen, wType, nm) = parseCommon(data) + #vallen is length of the ffi, typ is 0, nm is 'VS_VERSION_INFO'. + i = nextDWord(i) + # Now a VS_FIXEDFILEINFO + self.ffi = FixedFileInfo() + j = self.ffi.fromRaw(data, i) + i = j + while i < sublen: + j = i + i, (csublen, cvallen, ctyp, nm) = parseCommon(data, i) + if nm.strip() == 'StringFileInfo': + sfi = StringFileInfo() + k = sfi.fromRaw(csublen, cvallen, nm, data, i, j + csublen) + self.kids.append(sfi) + i = k + else: + vfi = VarFileInfo() + k = vfi.fromRaw(csublen, cvallen, nm, data, i, j + csublen) + self.kids.append(vfi) + i = k + i = j + csublen + i = nextDWord(i) + return i + + def toRaw(self): + raw_name = getRaw('VS_VERSION_INFO') + rawffi = self.ffi.toRaw() + vallen = len(rawffi) + typ = 0 + sublen = 6 + len(raw_name) + 2 + pad = b'' + if sublen % 4: + pad = b'\000\000' + sublen = sublen + len(pad) + vallen + pad2 = b'' + if sublen % 4: + pad2 = b'\000\000' + tmp = b''.join([kid.toRaw() for kid in self.kids]) + sublen = sublen + len(pad2) + len(tmp) + return struct.pack('hhh', sublen, vallen, typ) + raw_name + b'\000\000' + pad + rawffi + pad2 + tmp + + def __eq__(self, other): + return self.toRaw() == other + + def __str__(self, indent=''): + indent = indent + ' ' + tmp = [kid.__str__(indent + ' ') for kid in self.kids] + tmp = ', \n'.join(tmp) + return '\n'.join([ + "# UTF-8", + "#", + "# For more details about fixed file info 'ffi' see:", + "# http://msdn.microsoft.com/en-us/library/ms646997.aspx", + "VSVersionInfo(", + indent + f"ffi={self.ffi.__str__(indent)},", + indent + "kids=[", + tmp, + indent + "]", + ")", + ]) + + def __repr__(self): + return "versioninfo.VSVersionInfo(ffi=%r, kids=%r)" % (self.ffi, self.kids) + + +def parseCommon(data, start=0): + i = start + 6 + (wLength, wValueLength, wType) = struct.unpack('3h', data[start:i]) + i, text = parseUString(data, i, i + wLength) + return i, (wLength, wValueLength, wType, text) + + +def parseUString(data, start, limit): + i = start + while i < limit: + if data[i:i + 2] == b'\000\000': + break + i += 2 + text = data[start:i].decode('UTF-16LE') + i += 2 + return i, text + + +class FixedFileInfo: + """ + DWORD dwSignature; //Contains the value 0xFEEFO4BD + DWORD dwStrucVersion; // binary version number of this structure. + // The high-order word of this member contains + // the major version number, and the low-order + // word contains the minor version number. + DWORD dwFileVersionMS; // most significant 32 bits of the file's binary + // version number + DWORD dwFileVersionLS; // + DWORD dwProductVersionMS; // most significant 32 bits of the binary version + // number of the product with which this file was + // distributed + DWORD dwProductVersionLS; // + DWORD dwFileFlagsMask; // bitmask that specifies the valid bits in + // dwFileFlags. A bit is valid only if it was + // defined when the file was created. + DWORD dwFileFlags; // VS_FF_DEBUG, VS_FF_PATCHED etc. + DWORD dwFileOS; // VOS_NT, VOS_WINDOWS32 etc. + DWORD dwFileType; // VFT_APP etc. + DWORD dwFileSubtype; // 0 unless VFT_DRV or VFT_FONT or VFT_VXD + DWORD dwFileDateMS; + DWORD dwFileDateLS; + """ + def __init__( + self, + filevers=(0, 0, 0, 0), + prodvers=(0, 0, 0, 0), + mask=0x3f, + flags=0x0, + OS=0x40004, + fileType=0x1, + subtype=0x0, + date=(0, 0) + ): + self.sig = 0xfeef04bd + self.strucVersion = 0x10000 + self.fileVersionMS = (filevers[0] << 16) | (filevers[1] & 0xffff) + self.fileVersionLS = (filevers[2] << 16) | (filevers[3] & 0xffff) + self.productVersionMS = (prodvers[0] << 16) | (prodvers[1] & 0xffff) + self.productVersionLS = (prodvers[2] << 16) | (prodvers[3] & 0xffff) + self.fileFlagsMask = mask + self.fileFlags = flags + self.fileOS = OS + self.fileType = fileType + self.fileSubtype = subtype + self.fileDateMS = date[0] + self.fileDateLS = date[1] + + def fromRaw(self, data, i): + ( + self.sig, + self.strucVersion, + self.fileVersionMS, + self.fileVersionLS, + self.productVersionMS, + self.productVersionLS, + self.fileFlagsMask, + self.fileFlags, + self.fileOS, + self.fileType, + self.fileSubtype, + self.fileDateMS, + self.fileDateLS, + ) = struct.unpack('13L', data[i:i + 52]) + return i + 52 + + def toRaw(self): + return struct.pack( + '13L', + self.sig, + self.strucVersion, + self.fileVersionMS, + self.fileVersionLS, + self.productVersionMS, + self.productVersionLS, + self.fileFlagsMask, + self.fileFlags, + self.fileOS, + self.fileType, + self.fileSubtype, + self.fileDateMS, + self.fileDateLS, + ) + + def __eq__(self, other): + return self.toRaw() == other + + def __str__(self, indent=''): + fv = ( + self.fileVersionMS >> 16, self.fileVersionMS & 0xffff, + self.fileVersionLS >> 16, self.fileVersionLS & 0xffff, + ) # yapf: disable + pv = ( + self.productVersionMS >> 16, self.productVersionMS & 0xffff, + self.productVersionLS >> 16, self.productVersionLS & 0xffff, + ) # yapf: disable + fd = (self.fileDateMS, self.fileDateLS) + tmp = [ + 'FixedFileInfo(', + '# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)', + '# Set not needed items to zero 0.', + 'filevers=%s,' % (fv,), + 'prodvers=%s,' % (pv,), + "# Contains a bitmask that specifies the valid bits 'flags'r", + 'mask=%s,' % hex(self.fileFlagsMask), + '# Contains a bitmask that specifies the Boolean attributes of the file.', + 'flags=%s,' % hex(self.fileFlags), + '# The operating system for which this file was designed.', + '# 0x4 - NT and there is no need to change it.', + 'OS=%s,' % hex(self.fileOS), + '# The general type of file.', + '# 0x1 - the file is an application.', + 'fileType=%s,' % hex(self.fileType), + '# The function of the file.', + '# 0x0 - the function is not defined for this fileType', + 'subtype=%s,' % hex(self.fileSubtype), + '# Creation date and time stamp.', + 'date=%s' % (fd,), + ')', + ] + return f'\n{indent} '.join(tmp) + + def __repr__(self): + fv = ( + self.fileVersionMS >> 16, self.fileVersionMS & 0xffff, + self.fileVersionLS >> 16, self.fileVersionLS & 0xffff, + ) # yapf: disable + pv = ( + self.productVersionMS >> 16, self.productVersionMS & 0xffff, + self.productVersionLS >> 16, self.productVersionLS & 0xffff, + ) # yapf: disable + fd = (self.fileDateMS, self.fileDateLS) + return ( + 'versioninfo.FixedFileInfo(filevers=%r, prodvers=%r, ' + 'mask=0x%x, flags=0x%x, OS=0x%x, ' + 'fileType=%r, subtype=0x%x, date=%r)' % + (fv, pv, self.fileFlagsMask, self.fileFlags, self.fileOS, self.fileType, self.fileSubtype, fd) + ) + + +class StringFileInfo: + """ + WORD wLength; // length of the version resource + WORD wValueLength; // length of the Value member in the current + // VS_VERSION_INFO structure + WORD wType; // 1 means text, 0 means binary + WCHAR szKey[]; // Contains the Unicode string 'StringFileInfo'. + WORD Padding[]; + StringTable Children[]; // list of zero or more String structures + """ + def __init__(self, kids=None): + self.name = 'StringFileInfo' + self.kids = kids or [] + + def fromRaw(self, sublen, vallen, name, data, i, limit): + self.name = name + while i < limit: + st = StringTable() + j = st.fromRaw(data, i, limit) + self.kids.append(st) + i = j + return i + + def toRaw(self): + raw_name = getRaw(self.name) + vallen = 0 + typ = 1 + sublen = 6 + len(raw_name) + 2 + pad = b'' + if sublen % 4: + pad = b'\000\000' + tmp = b''.join([kid.toRaw() for kid in self.kids]) + sublen = sublen + len(pad) + len(tmp) + return struct.pack('hhh', sublen, vallen, typ) + raw_name + b'\000\000' + pad + tmp + + def __eq__(self, other): + return self.toRaw() == other + + def __str__(self, indent=''): + new_indent = indent + ' ' + tmp = ', \n'.join(kid.__str__(new_indent) for kid in self.kids) + return f'{indent}StringFileInfo(\n{new_indent}[\n{tmp}\n{new_indent}])' + + def __repr__(self): + return 'versioninfo.StringFileInfo(%r)' % self.kids + + +class StringTable: + """ + WORD wLength; + WORD wValueLength; + WORD wType; + WCHAR szKey[]; + String Children[]; // list of zero or more String structures. + """ + def __init__(self, name=None, kids=None): + self.name = name or '' + self.kids = kids or [] + + def fromRaw(self, data, i, limit): + i, (cpsublen, cpwValueLength, cpwType, self.name) = parseCodePage(data, i, limit) # should be code page junk + i = nextDWord(i) + while i < limit: + ss = StringStruct() + j = ss.fromRaw(data, i, limit) + i = j + self.kids.append(ss) + i = nextDWord(i) + return i + + def toRaw(self): + raw_name = getRaw(self.name) + vallen = 0 + typ = 1 + sublen = 6 + len(raw_name) + 2 + tmp = [] + for kid in self.kids: + raw = kid.toRaw() + if len(raw) % 4: + raw = raw + b'\000\000' + tmp.append(raw) + tmp = b''.join(tmp) + sublen += len(tmp) + return struct.pack('hhh', sublen, vallen, typ) + raw_name + b'\000\000' + tmp + + def __eq__(self, other): + return self.toRaw() == other + + def __str__(self, indent=''): + new_indent = indent + ' ' + tmp = (',\n' + new_indent).join(str(kid) for kid in self.kids) + return f"{indent}StringTable(\n{new_indent}'{self.name}',\n{new_indent}[{tmp}])" + + def __repr__(self): + return 'versioninfo.StringTable(%r, %r)' % (self.name, self.kids) + + +class StringStruct: + """ + WORD wLength; + WORD wValueLength; + WORD wType; + WCHAR szKey[]; + WORD Padding[]; + String Value[]; + """ + def __init__(self, name=None, val=None): + self.name = name or '' + self.val = val or '' + + def fromRaw(self, data, i, limit): + i, (sublen, vallen, typ, self.name) = parseCommon(data, i) + limit = i + sublen + i = nextDWord(i) + i, self.val = parseUString(data, i, limit) + return i + + def toRaw(self): + raw_name = getRaw(self.name) + raw_val = getRaw(self.val) + # TODO: document the size of vallen and sublen. + vallen = len(self.val) + 1 # Number of (wide-)characters, not bytes! + typ = 1 + sublen = 6 + len(raw_name) + 2 + pad = b'' + if sublen % 4: + pad = b'\000\000' + sublen = sublen + len(pad) + (vallen * 2) + return struct.pack('hhh', sublen, vallen, typ) + raw_name + b'\000\000' + pad + raw_val + b'\000\000' + + def __eq__(self, other): + return self.toRaw() == other + + def __str__(self, indent=''): + return "StringStruct(%r, %r)" % (self.name, self.val) + + def __repr__(self): + return 'versioninfo.StringStruct(%r, %r)' % (self.name, self.val) + + +def parseCodePage(data, i, limit): + i, (sublen, wValueLength, wType, nm) = parseCommon(data, i) + return i, (sublen, wValueLength, wType, nm) + + +class VarFileInfo: + """ + WORD wLength; // length of the version resource + WORD wValueLength; // length of the Value member in the current + // VS_VERSION_INFO structure + WORD wType; // 1 means text, 0 means binary + WCHAR szKey[]; // Contains the Unicode string 'VarFileInfo'. + WORD Padding[]; + Var Children[]; // list of zero or more Var structures + """ + def __init__(self, kids=None): + self.kids = kids or [] + + def fromRaw(self, sublen, vallen, name, data, i, limit): + self.sublen = sublen + self.vallen = vallen + self.name = name + i = nextDWord(i) + while i < limit: + vs = VarStruct() + j = vs.fromRaw(data, i, limit) + self.kids.append(vs) + i = j + return i + + def toRaw(self): + self.vallen = 0 + self.wType = 1 + self.name = 'VarFileInfo' + raw_name = getRaw(self.name) + sublen = 6 + len(raw_name) + 2 + pad = b'' + if sublen % 4: + pad = b'\000\000' + tmp = b''.join([kid.toRaw() for kid in self.kids]) + self.sublen = sublen + len(pad) + len(tmp) + return struct.pack('hhh', self.sublen, self.vallen, self.wType) + raw_name + b'\000\000' + pad + tmp + + def __eq__(self, other): + return self.toRaw() == other + + def __str__(self, indent=''): + return indent + "VarFileInfo([%s])" % ', '.join(str(kid) for kid in self.kids) + + def __repr__(self): + return 'versioninfo.VarFileInfo(%r)' % self.kids + + +class VarStruct: + """ + WORD wLength; // length of the version resource + WORD wValueLength; // length of the Value member in the current + // VS_VERSION_INFO structure + WORD wType; // 1 means text, 0 means binary + WCHAR szKey[]; // Contains the Unicode string 'Translation' + // or a user-defined key string value + WORD Padding[]; // + WORD Value[]; // list of one or more values that are language + // and code-page identifiers + """ + def __init__(self, name=None, kids=None): + self.name = name or '' + self.kids = kids or [] + + def fromRaw(self, data, i, limit): + i, (self.sublen, self.wValueLength, self.wType, self.name) = parseCommon(data, i) + i = nextDWord(i) + for j in range(0, self.wValueLength, 2): + kid = struct.unpack('h', data[i:i + 2])[0] + self.kids.append(kid) + i += 2 + return i + + def toRaw(self): + self.wValueLength = len(self.kids) * 2 + self.wType = 0 + raw_name = getRaw(self.name) + sublen = 6 + len(raw_name) + 2 + pad = b'' + if sublen % 4: + pad = b'\000\000' + self.sublen = sublen + len(pad) + self.wValueLength + tmp = b''.join([struct.pack('h', kid) for kid in self.kids]) + return struct.pack('hhh', self.sublen, self.wValueLength, self.wType) + raw_name + b'\000\000' + pad + tmp + + def __eq__(self, other): + return self.toRaw() == other + + def __str__(self, indent=''): + return "VarStruct('%s', %r)" % (self.name, self.kids) + + def __repr__(self): + return 'versioninfo.VarStruct(%r, %r)' % (self.name, self.kids) + + +def load_version_info_from_text_file(filename): + """ + Load the `VSVersionInfo` structure from its string-based (`VSVersionInfo.__str__`) serialization by reading the + text from the file and running it through `eval()`. + """ + + # Read and parse the version file. It may have a byte order marker or encoding cookie - respect it if it does. + import PyInstaller.utils.misc as miscutils + with open(filename, 'rb') as fp: + text = miscutils.decode(fp.read()) + + # Deserialize via eval() + try: + info = eval(text) + except Exception as e: + raise ValueError("Failed to deserialize VSVersionInfo from text-based representation!") from e + + # Sanity check + assert isinstance(info, VSVersionInfo), \ + f"Loaded incompatible structure type! Expected VSVersionInfo, got: {type(info)!r}" + + return info + + +def write_version_info_to_executable(exe_filename, info): + assert isinstance(info, VSVersionInfo) + + # Remember overlay + pe = pefile.PE(exe_filename, fast_load=True) + overlay_before = pe.get_overlay() + pe.close() + + hdst = win32api.BeginUpdateResource(exe_filename, 0) + win32api.UpdateResource(hdst, pefile.RESOURCE_TYPE['RT_VERSION'], 1, info.toRaw()) + win32api.EndUpdateResource(hdst, 0) + + if overlay_before: + # Check if the overlay is still present + pe = pefile.PE(exe_filename, fast_load=True) + overlay_after = pe.get_overlay() + pe.close() + + # If the update removed the overlay data, re-append it + if not overlay_after: + with open(exe_filename, 'ab') as exef: + exef.write(overlay_before) diff --git a/venv/Lib/site-packages/PyInstaller/utils/win32/winmanifest.py b/venv/Lib/site-packages/PyInstaller/utils/win32/winmanifest.py new file mode 100644 index 0000000..1d338df --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/win32/winmanifest.py @@ -0,0 +1,244 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +import xml.dom +import xml.dom.minidom + +#- Relevant constants from Windows headers +# Manifest resource code +RT_MANIFEST = 24 + +# Resource IDs (names) for manifest. +# See: https://www.gamedev.net/blogs/entry/2154553-manifest-embedding-and-activation +CREATEPROCESS_MANIFEST_RESOURCE_ID = 1 +ISOLATIONAWARE_MANIFEST_RESOURCE_ID = 2 + +LANG_NEUTRAL = 0 + +#- Default application manifest template, based on the one found in python executable. + +_DEFAULT_MANIFEST_XML = \ +b""" + + + + + + + + + + + + + + + + + + + + true + + + + + + + + +""" # noqa: E122,E501 + +#- DOM navigation helpers + + +def _find_elements_by_tag(root, tag): + """ + Find all elements with given tag under the given root element. + """ + return [node for node in root.childNodes if node.nodeType == xml.dom.Node.ELEMENT_NODE and node.tagName == tag] + + +def _find_element_by_tag(root, tag): + """ + Attempt to find a single element with given tag under the given root element, and return None if no such element + is found. Raises an error if multiple elements are found. + """ + elements = _find_elements_by_tag(root, tag) + if len(elements) > 1: + raise ValueError(f"Expected a single {tag!r} element, found {len(elements)} element(s)!") + if not elements: + return None + return elements[0] + + +#- Application manifest modification helpers + + +def _set_execution_level(manifest_dom, root_element, uac_admin=False, uac_uiaccess=False): + """ + Find -> -> element, and set its `level` and `uiAccess` + attributes based on supplied arguments. Create the XML elements if necessary, as they are optional. + """ + + # + trust_info_element = _find_element_by_tag(root_element, "trustInfo") + if not trust_info_element: + trust_info_element = manifest_dom.createElement("trustInfo") + trust_info_element.setAttribute("xmlns", "urn:schemas-microsoft-com:asm.v3") + root_element.appendChild(trust_info_element) + + # + security_element = _find_element_by_tag(trust_info_element, "security") + if not security_element: + security_element = manifest_dom.createElement("security") + trust_info_element.appendChild(security_element) + + # + requested_privileges_element = _find_element_by_tag(security_element, "requestedPrivileges") + if not requested_privileges_element: + requested_privileges_element = manifest_dom.createElement("requestedPrivileges") + security_element.appendChild(requested_privileges_element) + + # + requested_execution_level_element = _find_element_by_tag(requested_privileges_element, "requestedExecutionLevel") + if not requested_execution_level_element: + requested_execution_level_element = manifest_dom.createElement("requestedExecutionLevel") + requested_privileges_element.appendChild(requested_execution_level_element) + + requested_execution_level_element.setAttribute("level", "requireAdministrator" if uac_admin else "asInvoker") + requested_execution_level_element.setAttribute("uiAccess", "true" if uac_uiaccess else "false") + + +def _ensure_common_controls_dependency(manifest_dom, root_element): + """ + Scan elements for the one whose < -> corresponds to the + `Microsoft.Windows.Common-Controls`. If found, overwrite its properties. If not, create new + element with corresponding sub-elements and attributes. + """ + + # + dependency_elements = _find_elements_by_tag(root_element, "dependency") + for dependency_element in dependency_elements: + # + dependent_assembly_element = _find_element_by_tag(dependency_element, "dependentAssembly") + # + assembly_identity_element = _find_element_by_tag(dependent_assembly_element, "assemblyIdentity") + # Check the name attribute + if assembly_identity_element.attributes["name"].value == "Microsoft.Windows.Common-Controls": + common_controls_element = assembly_identity_element + break + else: + # Create + dependency_element = manifest_dom.createElement("dependency") + root_element.appendChild(dependency_element) + # Create + dependent_assembly_element = manifest_dom.createElement("dependentAssembly") + dependency_element.appendChild(dependent_assembly_element) + # Create + common_controls_element = manifest_dom.createElement("assemblyIdentity") + dependent_assembly_element.appendChild(common_controls_element) + + common_controls_element.setAttribute("type", "win32") + common_controls_element.setAttribute("name", "Microsoft.Windows.Common-Controls") + common_controls_element.setAttribute("version", "6.0.0.0") + common_controls_element.setAttribute("processorArchitecture", "*") + common_controls_element.setAttribute("publicKeyToken", "6595b64144ccf1df") + common_controls_element.setAttribute("language", "*") + + +def create_application_manifest(manifest_xml=None, uac_admin=False, uac_uiaccess=False): + """ + Create application manifest, from built-in or custom manifest XML template. If provided, `manifest_xml` must be + a string or byte string containing XML source. The returned manifest is a byte string, encoded in UTF-8. + + This function sets the attributes of `requestedExecutionLevel` based on provided `uac_admin` and `auc_uiacces` + arguments (creating the parent elements in the XML, if necessary). It also scans `dependency` elements for the + entry corresponding to `Microsoft.Windows.Common-Controls` and creates or modifies it as necessary. + """ + + if manifest_xml is None: + manifest_xml = _DEFAULT_MANIFEST_XML + + with xml.dom.minidom.parseString(manifest_xml) as manifest_dom: + root_element = manifest_dom.documentElement + + # Validate root element - must be + assert root_element.tagName == "assembly" + assert root_element.namespaceURI == "urn:schemas-microsoft-com:asm.v1" + assert root_element.attributes["manifestVersion"].value == "1.0" + + # Modify the manifest + _set_execution_level(manifest_dom, root_element, uac_admin, uac_uiaccess) + _ensure_common_controls_dependency(manifest_dom, root_element) + + # Create output XML + output = manifest_dom.toprettyxml(indent=" ", encoding="UTF-8") + + # Strip extra newlines + output = [line for line in output.splitlines() if line.strip()] + + # Replace: `` with ``. + # Support for `standalone` was added to `toprettyxml` in python 3.9, so do a manual work around. + output[0] = b"""""" + + output = b"\n".join(output) + + return output + + +def write_manifest_to_executable(filename, manifest_xml): + """ + Write the given manifest XML to the given executable's RT_MANIFEST resource. + """ + from PyInstaller.utils.win32 import winresource + + # CREATEPROCESS_MANIFEST_RESOURCE_ID is used for manifest resource in executables. + # ISOLATIONAWARE_MANIFEST_RESOURCE_ID is used for manifest resources in DLLs. + names = [CREATEPROCESS_MANIFEST_RESOURCE_ID] + + # Ensure LANG_NEUTRAL is updated, and also update any other present languages. + languages = [LANG_NEUTRAL, "*"] + + winresource.add_or_update_resource(filename, manifest_xml, RT_MANIFEST, names, languages) + + +def read_manifest_from_executable(filename): + """ + Read manifest from the given executable." + """ + from PyInstaller.utils.win32 import winresource + + resources = winresource.get_resources(filename, [RT_MANIFEST]) + + # `resources` is a three-level dictionary: + # - level 1: resource type (RT_MANIFEST) + # - level 2: resource name (CREATEPROCESS_MANIFEST_RESOURCE_ID) + # - level 3: resource language (LANG_NEUTRAL) + + # Level 1 + if RT_MANIFEST not in resources: + raise ValueError(f"No RT_MANIFEST resources found in {filename!r}.") + resources = resources[RT_MANIFEST] + + # Level 2 + if CREATEPROCESS_MANIFEST_RESOURCE_ID not in resources: + raise ValueError(f"No RT_MANIFEST resource named CREATEPROCESS_MANIFEST_RESOURCE_ID found in {filename!r}.") + resources = resources[CREATEPROCESS_MANIFEST_RESOURCE_ID] + + # Level 3 + # We prefer LANG_NEUTRAL, but allow fall back to the first available entry. + if LANG_NEUTRAL in resources: + resources = resources[LANG_NEUTRAL] + else: + resources = next(iter(resources.items())) + + manifest_xml = resources + return manifest_xml diff --git a/venv/Lib/site-packages/PyInstaller/utils/win32/winresource.py b/venv/Lib/site-packages/PyInstaller/utils/win32/winresource.py new file mode 100644 index 0000000..f21d66c --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/win32/winresource.py @@ -0,0 +1,189 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Read and write resources from/to Win32 PE files. +""" + +import PyInstaller.log as logging +from PyInstaller.compat import pywintypes, win32api + +logger = logging.getLogger(__name__) + +LOAD_LIBRARY_AS_DATAFILE = 2 +ERROR_BAD_EXE_FORMAT = 193 +ERROR_RESOURCE_DATA_NOT_FOUND = 1812 +ERROR_RESOURCE_TYPE_NOT_FOUND = 1813 +ERROR_RESOURCE_NAME_NOT_FOUND = 1814 +ERROR_RESOURCE_LANG_NOT_FOUND = 1815 + + +def get_resources(filename, types=None, names=None, languages=None): + """ + Retrieve resources from the given PE file. + + filename: path to the PE file. + types: a list of resource types (integers or strings) to search for (None = all). + names: a list of resource names (integers or strings) to search for (None = all). + languages: a list of resource languages (integers) to search for (None = all). + + Returns a dictionary of the form {type: {name: {language: data}}}, which might also be empty if no matching + resources were found. + """ + types = set(types) if types is not None else {"*"} + names = set(names) if names is not None else {"*"} + languages = set(languages) if languages is not None else {"*"} + + output = {} + + # Errors codes for which we swallow exceptions + _IGNORE_EXCEPTIONS = { + ERROR_RESOURCE_DATA_NOT_FOUND, + ERROR_RESOURCE_TYPE_NOT_FOUND, + ERROR_RESOURCE_NAME_NOT_FOUND, + ERROR_RESOURCE_LANG_NOT_FOUND, + } + + # Open file + module_handle = win32api.LoadLibraryEx(filename, 0, LOAD_LIBRARY_AS_DATAFILE) + + # Enumerate available resource types + try: + available_types = win32api.EnumResourceTypes(module_handle) + except pywintypes.error as e: + if e.args[0] not in _IGNORE_EXCEPTIONS: + raise + available_types = [] + + if "*" not in types: + available_types = [res_type for res_type in available_types if res_type in types] + + for res_type in available_types: + # Enumerate available names for the resource type. + try: + available_names = win32api.EnumResourceNames(module_handle, res_type) + except pywintypes.error as e: + if e.args[0] not in _IGNORE_EXCEPTIONS: + raise + continue + + if "*" not in names: + available_names = [res_name for res_name in available_names if res_name in names] + + for res_name in available_names: + # Enumerate available languages for the resource type and name combination. + try: + available_languages = win32api.EnumResourceLanguages(module_handle, res_type, res_name) + except pywintypes.error as e: + if e.args[0] not in _IGNORE_EXCEPTIONS: + raise + continue + + if "*" not in languages: + available_languages = [res_lang for res_lang in available_languages if res_lang in languages] + + for res_lang in available_languages: + # Read data + try: + data = win32api.LoadResource(module_handle, res_type, res_name, res_lang) + except pywintypes.error as e: + if e.args[0] not in _IGNORE_EXCEPTIONS: + raise + continue + + if res_type not in output: + output[res_type] = {} + if res_name not in output[res_type]: + output[res_type][res_name] = {} + output[res_type][res_name][res_lang] = data + + # Close file + win32api.FreeLibrary(module_handle) + + return output + + +def add_or_update_resource(filename, data, res_type, names=None, languages=None): + """ + Update or add a single resource in the PE file with the given binary data. + + filename: path to the PE file. + data: binary data to write to the resource. + res_type: resource type to add/update (integer or string). + names: a list of resource names (integers or strings) to update (None = all). + languages: a list of resource languages (integers) to update (None = all). + """ + if res_type == "*": + raise ValueError("res_type cannot be a wildcard (*)!") + + names = set(names) if names is not None else {"*"} + languages = set(languages) if languages is not None else {"*"} + + # Retrieve existing resources, filtered by the given resource type and given resource names and languages. + resources = get_resources(filename, [res_type], names, languages) + + # Add res_type, name, language combinations that are not already present + resources = resources.get(res_type, {}) # This is now a {name: {language: data}} dictionary + + for res_name in names: + if res_name == "*": + continue + if res_name not in resources: + resources[res_name] = {} + + for res_lang in languages: + if res_lang == "*": + continue + if res_lang not in resources[res_name]: + resources[res_name][res_lang] = None # Just an indicator + + # Add resource to the target file, overwriting the existing resources with same type, name, language combinations. + module_handle = win32api.BeginUpdateResource(filename, 0) + for res_name in resources.keys(): + for res_lang in resources[res_name].keys(): + win32api.UpdateResource(module_handle, res_type, res_name, data, res_lang) + win32api.EndUpdateResource(module_handle, 0) + + +def copy_resources_from_pe_file(filename, src_filename, types=None, names=None, languages=None): + """ + Update or add resources in the given PE file by copying them over from the specified source PE file. + + filename: path to the PE file. + src_filename: path to the source PE file. + types: a list of resource types (integers or strings) to add/update via copy for (None = all). + names: a list of resource names (integers or strings) to add/update via copy (None = all). + languages: a list of resource languages (integers) to add/update via copy (None = all). + """ + types = set(types) if types is not None else {"*"} + names = set(names) if names is not None else {"*"} + languages = set(languages) if languages is not None else {"*"} + + # Retrieve existing resources, filtered by the given resource type and given resource names and languages. + resources = get_resources(src_filename, types, names, languages) + + for res_type, resources_for_type in resources.items(): + if "*" not in types and res_type not in types: + continue + for res_name, resources_for_type_name in resources_for_type.items(): + if "*" not in names and res_name not in names: + continue + for res_lang, data in resources_for_type_name.items(): + if "*" not in languages and res_lang not in languages: + continue + add_or_update_resource(filename, data, res_type, [res_name], [res_lang]) + + +def remove_all_resources(filename): + """ + Remove all resources from the given PE file: + """ + module_handle = win32api.BeginUpdateResource(filename, True) # bDeleteExistingResources=True + win32api.EndUpdateResource(module_handle, False) diff --git a/venv/Lib/site-packages/PyInstaller/utils/win32/winutils.py b/venv/Lib/site-packages/PyInstaller/utils/win32/winutils.py new file mode 100644 index 0000000..d8716c3 --- /dev/null +++ b/venv/Lib/site-packages/PyInstaller/utils/win32/winutils.py @@ -0,0 +1,257 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2023, PyInstaller Development Team. +# +# Distributed under the terms of the GNU General Public License (version 2 +# or later) with exception for distributing the bootloader. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) +#----------------------------------------------------------------------------- +""" +Utilities for Windows platform. +""" + +from PyInstaller import compat + + +def get_windows_dir(): + """ + Return the Windows directory, e.g., C:\\Windows. + """ + windir = compat.win32api.GetWindowsDirectory() + if not windir: + raise SystemExit("Error: Cannot determine Windows directory!") + return windir + + +def get_system_path(): + """ + Return the required Windows system paths. + """ + sys_dir = compat.win32api.GetSystemDirectory() + # Ensure C:\Windows\system32 and C:\Windows directories are always present in PATH variable. + # C:\Windows\system32 is valid even for 64-bit Windows. Access do DLLs are transparently redirected to + # C:\Windows\syswow64 for 64bit applactions. + # See http://msdn.microsoft.com/en-us/library/aa384187(v=vs.85).aspx + return [sys_dir, get_windows_dir()] + + +def get_pe_file_machine_type(filename): + """ + Return the machine type code from the header of the given PE file. + """ + import pefile + + with pefile.PE(filename, fast_load=True) as pe: + return pe.FILE_HEADER.Machine + + +def set_exe_build_timestamp(exe_path, timestamp): + """ + Modifies the executable's build timestamp by updating values in the corresponding PE headers. + """ + import pefile + + with pefile.PE(exe_path, fast_load=True) as pe: + # Manually perform a full load. We need it to load all headers, but specifying it in the constructor triggers + # byte statistics gathering that takes forever with large files. So we try to go around that... + pe.full_load() + + # Set build timestamp. + # See: https://0xc0decafe.com/malware-analyst-guide-to-pe-timestamps + timestamp = int(timestamp) + # Set timestamp field in FILE_HEADER + pe.FILE_HEADER.TimeDateStamp = timestamp + # MSVC-compiled executables contain (at least?) one DIRECTORY_ENTRY_DEBUG entry that also contains timestamp + # with same value as set in FILE_HEADER. So modify that as well, as long as it is set. + debug_entries = getattr(pe, 'DIRECTORY_ENTRY_DEBUG', []) + for debug_entry in debug_entries: + if debug_entry.struct.TimeDateStamp: + debug_entry.struct.TimeDateStamp = timestamp + + # Generate updated EXE data + data = pe.write() + + # Rewrite the exe + with open(exe_path, 'wb') as fp: + fp.write(data) + + +def update_exe_pe_checksum(exe_path): + """ + Compute the executable's PE checksum, and write it to PE headers. + + This optional checksum is supposed to protect the executable against corruption but some anti-viral software have + taken to flagging anything without it set correctly as malware. See issue #5579. + """ + import pefile + + # Compute checksum using our equivalent of the MapFileAndCheckSumW - for large files, it is significantly faster + # than pure-pyton pefile.PE.generate_checksum(). However, it requires the file to be on disk (i.e., cannot operate + # on a memory buffer). + try: + checksum = compute_exe_pe_checksum(exe_path) + except Exception as e: + raise RuntimeError("Failed to compute PE checksum!") from e + + # Update the checksum + with pefile.PE(exe_path, fast_load=True) as pe: + pe.OPTIONAL_HEADER.CheckSum = checksum + + # Generate updated EXE data + data = pe.write() + + # Rewrite the exe + with open(exe_path, 'wb') as fp: + fp.write(data) + + +def compute_exe_pe_checksum(exe_path): + """ + This is a replacement for the MapFileAndCheckSumW function. As noted in MSDN documentation, the Microsoft's + implementation of MapFileAndCheckSumW internally calls its ASCII variant (MapFileAndCheckSumA), and therefore + cannot handle paths that contain characters that are not representable in the current code page. + See: https://docs.microsoft.com/en-us/windows/win32/api/imagehlp/nf-imagehlp-mapfileandchecksumw + + This function is based on Wine's implementation of MapFileAndCheckSumW, and due to being based entirely on + the pure widechar-API functions, it is not limited by the current code page. + """ + # ctypes bindings for relevant win32 API functions + import ctypes + from ctypes import windll, wintypes + + INVALID_HANDLE = wintypes.HANDLE(-1).value + + GetLastError = ctypes.windll.kernel32.GetLastError + GetLastError.argtypes = () + GetLastError.restype = wintypes.DWORD + + CloseHandle = windll.kernel32.CloseHandle + CloseHandle.argtypes = ( + wintypes.HANDLE, # hObject + ) + CloseHandle.restype = wintypes.BOOL + + CreateFileW = windll.kernel32.CreateFileW + CreateFileW.argtypes = ( + wintypes.LPCWSTR, # lpFileName + wintypes.DWORD, # dwDesiredAccess + wintypes.DWORD, # dwShareMode + wintypes.LPVOID, # lpSecurityAttributes + wintypes.DWORD, # dwCreationDisposition + wintypes.DWORD, # dwFlagsAndAttributes + wintypes.HANDLE, # hTemplateFile + ) + CreateFileW.restype = wintypes.HANDLE + + CreateFileMappingW = windll.kernel32.CreateFileMappingW + CreateFileMappingW.argtypes = ( + wintypes.HANDLE, # hFile + wintypes.LPVOID, # lpSecurityAttributes + wintypes.DWORD, # flProtect + wintypes.DWORD, # dwMaximumSizeHigh + wintypes.DWORD, # dwMaximumSizeLow + wintypes.LPCWSTR, # lpName + ) + CreateFileMappingW.restype = wintypes.HANDLE + + MapViewOfFile = windll.kernel32.MapViewOfFile + MapViewOfFile.argtypes = ( + wintypes.HANDLE, # hFileMappingObject + wintypes.DWORD, # dwDesiredAccess + wintypes.DWORD, # dwFileOffsetHigh + wintypes.DWORD, # dwFileOffsetLow + wintypes.DWORD, # dwNumberOfBytesToMap + ) + MapViewOfFile.restype = wintypes.LPVOID + + UnmapViewOfFile = windll.kernel32.UnmapViewOfFile + UnmapViewOfFile.argtypes = ( + wintypes.LPCVOID, # lpBaseAddress + ) + UnmapViewOfFile.restype = wintypes.BOOL + + GetFileSizeEx = windll.kernel32.GetFileSizeEx + GetFileSizeEx.argtypes = ( + wintypes.HANDLE, # hFile + wintypes.PLARGE_INTEGER, # lpFileSize + ) + + CheckSumMappedFile = windll.imagehlp.CheckSumMappedFile + CheckSumMappedFile.argtypes = ( + wintypes.LPVOID, # BaseAddress + wintypes.DWORD, # FileLength + wintypes.PDWORD, # HeaderSum + wintypes.PDWORD, # CheckSum + ) + CheckSumMappedFile.restype = wintypes.LPVOID + + # Open file + hFile = CreateFileW( + ctypes.c_wchar_p(exe_path), + 0x80000000, # dwDesiredAccess = GENERIC_READ + 0x00000001 | 0x00000002, # dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE, + None, # lpSecurityAttributes = NULL + 3, # dwCreationDisposition = OPEN_EXISTING + 0x80, # dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL + None # hTemplateFile = NULL + ) + if hFile == INVALID_HANDLE: + err = GetLastError() + raise RuntimeError(f"Failed to open file {exe_path}! Error code: {err}") + + # Query file size + fileLength = wintypes.LARGE_INTEGER(0) + if GetFileSizeEx(hFile, fileLength) == 0: + err = GetLastError() + CloseHandle(hFile) + raise RuntimeError(f"Failed to query file size file! Error code: {err}") + fileLength = fileLength.value + if fileLength > (2**32 - 1): + raise RuntimeError("Executable size exceeds maximum allowed executable size on Windows (4 GiB)!") + + # Map the file + hMapping = CreateFileMappingW( + hFile, + None, # lpFileMappingAttributes = NULL + 0x02, # flProtect = PAGE_READONLY + 0, # dwMaximumSizeHigh = 0 + 0, # dwMaximumSizeLow = 0 + None # lpName = NULL + ) + if not hMapping: + err = GetLastError() + CloseHandle(hFile) + raise RuntimeError(f"Failed to map file! Error code: {err}") + + # Create map view + baseAddress = MapViewOfFile( + hMapping, + 4, # dwDesiredAccess = FILE_MAP_READ + 0, # dwFileOffsetHigh = 0 + 0, # dwFileOffsetLow = 0 + 0 # dwNumberOfBytesToMap = 0 + ) + if baseAddress == 0: + err = GetLastError() + CloseHandle(hMapping) + CloseHandle(hFile) + raise RuntimeError(f"Failed to create map view! Error code: {err}") + + # Finally, compute the checksum + headerSum = wintypes.DWORD(0) + checkSum = wintypes.DWORD(0) + ret = CheckSumMappedFile(baseAddress, fileLength, ctypes.byref(headerSum), ctypes.byref(checkSum)) + if ret is None: + err = GetLastError() + + # Cleanup + UnmapViewOfFile(baseAddress) + CloseHandle(hMapping) + CloseHandle(hFile) + + if ret is None: + raise RuntimeError(f"CheckSumMappedFile failed! Error code: {err}") + + return checkSum.value diff --git a/venv/Lib/site-packages/__pycache__/pefile.cpython-311.pyc b/venv/Lib/site-packages/__pycache__/pefile.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ad0d8a646d60d0f27d28f78891f69ab8db2cddf GIT binary patch literal 286103 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%0Apc^0R2~c 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/__pycache__/peutils.cpython-311.pyc b/venv/Lib/site-packages/__pycache__/peutils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fc0666c31be66610cc3adaf5ef54cb553c9cd7b GIT binary patch literal 16483 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/__init__.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/__init__.py new file mode 100644 index 0000000..4dca97c --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/__init__.py @@ -0,0 +1,26 @@ +# ------------------------------------------------------------------ +# Copyright (c) 2020 PyInstaller Development Team. +# +# This file is distributed under the terms of the GNU General Public +# License (version 2.0 or later). +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: GPL-2.0-or-later +# ------------------------------------------------------------------ + +__version__ = '2024.10' +__maintainer__ = 'Legorooj, bwoodsend' +__uri__ = 'https://github.com/pyinstaller/pyinstaller-hooks-contrib' + + +def get_hook_dirs(): + import os + hooks_dir = os.path.dirname(__file__) + return [ + # Required because standard hooks are in sub-directory instead of the top-level hooks directory. + os.path.join(hooks_dir, 'stdhooks'), + # pre_* and run-time hooks + hooks_dir, + ] diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1015abdceac6b0ca3bb81c3ed575c0a6dbe949ef GIT binary patch literal 714 zcmZWmziZn-6h6t4CI5<@bP1h21w?8)4IN4-r9+_vOqLF9jo^^2t9*{EQ|`_#HV%l= zsT5jDA#0YVl>8a}3j!I8rb4G~0&ki6q{eBA-|@bCr+e>v-#dM)REh}f$5z{WkwfTL zdRUrr9V|8>I6*GzAXn)quG&%E+&k3Cx!QAN=~H8OXZJz#{?7DHn|O>fHn>;szG2K2 zBygt>`%;EtuhsIX?2o$59vim82@QmFe4p^!aih=Jp=k72AUW;!mO9d10|$L*@fHBI zC@%8RF`A*lQYAW7;cCTX{@mpI5)4@)C9c=6UOwBip~9AY zG$Fy!QNt&s*KbJ1e0xlSvE8O!TTn?Fq0>8bJR)p->lN`|!t0l7VN3%mF>Z#FxZ)9+ zU1#lh8TxI2izfgPnroG4KV9?M#uwwH`nmemyr@~1H7nXr@~BYyV0M=)ltA62@b~1!Vz@x`y%4p@9S^9L@&DBTg~SdVfc}0!6$8 waAiIkGI!*Y$2^sk{u$8%NOFpzBzIADGb+v3x1zOq@o8ivc~gP5tB?`?0RfV)8Z!qB-u*gaI7M1<3bauzY}asP=# z9mG E0l(LVt51A&@(CyoeEchAd=Z2kCqk99$E00V4qs!4h|2|2e!d(F|xv zj#!g)34_f7Xw4%_euAtNk#|MVg*PTWMbM*kB3bFxj?WGPb}}_3K~Q4vfas1)Ad>w6 z(TlnY-c!3^{5%0bM13q+SXaMSH}D496u(0oxD&Ug=Sc3+K%%&FA^GZ^0Z%&9u`>O6 z^-KSaW-0v^s~uM~`*zfiF|X2O_K0gdn8e{bHZy9T)o_TxOy6cpHep-&ubX#W=9`W~ zXkqqt;a2H7sOIfj-J`x^FB&!Co0jRD)&87f>G)lke}Xm=q(ez`;VD`Iw@)&<_!Mno zU4j6F@Y3A`?fxm)9ZEe~?KT%cc=Pys{1vcY@iXN2?Dn@~r)LM0Pszglg@HqYxc3KJ zKh~Rel45bi^Hy20>bX9(7YmfEHEc>)p_^|h$+xgXy;`B(^jAEW7v|&Ajq3>TqjN zN6!qp1&R&2K*cT)7=Kc_1$B^FqfTg;F$~+aeZznyi4kWhR1Bl)n2Z?)6CjV*0lelYZMTd~;O40W`r?O7m^~ybavBGSh6zgVn)m$d5V)UeGbka0V)4W#o zYIV~u)tgiS_^tQO??)+#YXp?oHDD*(=!G`;^ZYOK2ijOm8;b-y_$7WNin)Q;2w2q5 zj==;?$~-}coft-#HIfr&gqmTjHB2Yo=>!tyPV=r3$ANNSs&db~y?}; zN+D@D5HAJ8SN6rLZSiV^M(~xF(#_z!5v61q8u2#U8GXf9U!QFapp4p15C1mPN{D|32w`RVj2-4L2l>nU`Kfk(>Q5YKH%@>cJ7t>BDWtp~ zWD4;BNgHabV+ZPZOC1j;ZU+-L+rVeP*`HWwPb}=K58LX)p!`F-ymC->TV*%!{QYvH sU2e40MxZu&eFfT7BqD7c!#d-)We-VnGTM{nxlwU1tIiFHdqe#DUj*>kg8%>k literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/compat.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/compat.py new file mode 100644 index 0000000..4acba2f --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/compat.py @@ -0,0 +1,42 @@ +# ------------------------------------------------------------------ +# Copyright (c) 2023 PyInstaller Development Team. +# +# This file is distributed under the terms of the GNU General Public +# License (version 2.0 or later). +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: GPL-2.0-or-later +# ------------------------------------------------------------------ + +import sys + +from PyInstaller.utils.hooks import is_module_satisfies + + +if is_module_satisfies("PyInstaller >= 6.0"): + # PyInstaller >= 6.0 imports importlib_metadata in its compat module + from PyInstaller.compat import importlib_metadata +else: + # Older PyInstaller version - duplicate logic from PyInstaller 6.0 + class ImportlibMetadataError(SystemExit): + def __init__(self): + super().__init__( + "pyinstaller-hooks-contrib requires importlib.metadata from python >= 3.10 stdlib or " + "importlib_metadata from importlib-metadata >= 4.6" + ) + + if sys.version_info >= (3, 10): + import importlib.metadata as importlib_metadata + else: + try: + import importlib_metadata + except ImportError as e: + raise ImportlibMetadataError() from e + + import packaging.version # For importlib_metadata version check + + # Validate the version + if packaging.version.parse(importlib_metadata.version("importlib-metadata")) < packaging.version.parse("4.6"): + raise ImportlibMetadataError() diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_find_module_path/__init__.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_find_module_path/__init__.py new file mode 100644 index 0000000..89c0c0f --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_find_module_path/__init__.py @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------ +# Copyright (c) 2020 PyInstaller Development Team. +# +# This file is distributed under the terms of the GNU General Public +# License (version 2.0 or later). +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: GPL-2.0-or-later +# ------------------------------------------------------------------ diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_find_module_path/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_find_module_path/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..093385be4c093edb2ccda66335712f9228482d99 GIT binary patch literal 218 zcmXwzK?=e!5JeM*6F44EJRU hAe8U`3)6natADe$!*IR(&rL(TB1-9t^kJj0`vTx0J-7e> literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__init__.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__init__.py new file mode 100644 index 0000000..89c0c0f --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__init__.py @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------ +# Copyright (c) 2020 PyInstaller Development Team. +# +# This file is distributed under the terms of the GNU General Public +# License (version 2.0 or later). +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: GPL-2.0-or-later +# ------------------------------------------------------------------ diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b93c18b433615042d02a73778a29e0d0d449bbb4 GIT binary patch literal 220 zcmXwzK?=e!5JeMu5vMBu&ynPvQjx@f;q-3kdF9nJT`; zAKstE%r%ZDBygXlrwb+I(aWFUUtXgy&g4M$WKMTCVh6!r{pzi^E2enGylpyEb)87W zyhyy(lC`K>mWqry;W05hFZl@_1JeoRJeLwJ6k3-Ka;>}-+0s}9$Bzi2GTM5m^r4Zs i1Q1GifQ9MaLUnvJ#)jMZW*Rr7Sy;B&Njqe-yPcV&BzW*3 z_!D{+4;AUp@DFSxpaeX5@)ihQdh$&+o3xOF!@O_bd;85dZ{Ez8rKJaeI0mlTGSPdNCS4;o5T4uhQQY?x@a1kJH|$Lxk0%j3|rRi*c)RvKO-A)rZCII%lB|~AztHz%&^;L z%q*q2>dYYTxUTJZ%t=~_ebtaDR4H?cGzLQkdEh3Zl4E1L)f*zmz1QEpKnInZ+d#AuUDdE4mHJznIqg2j!N3#>Dx{GkwbG>2E^_NUlzuod!4Qf;RX9$%wRFzi?PYJ} zSVjgv1o}aqLW)aish`{w|A9R9rGG#wf`$V@pig~MaiNf>&PuwI?AWW*?0oIa?Ci|^ zGCHatSiir$US5tO^cN?BCH9fi4*)qt2FfEtFhonp3$RO;XiIs?mh-Z}`LY$Uqxq;E z%g2C@JVg1pA>KimsJ1C{@A8@in?6it^8Fma$HCftIHOz2uC12F{9*T^c$>gsA3 zSvCk=`Eqc%chvO9xxz+`Rfuzaxv*{)3!cgFVm}RDVd!4zyNdER&-v|)=tnJ5E@SGC z;ayzP;A#xp*kN2^dK#Sa6R?+RWk5@i;BZ9%li+{)6u5_og#v`U1Pk62xSnXBJBV@p z{xXDPICBzOJK}a;S;xRR3Ay`1UGQdDB4nWL(4rxpwFh;UP#3njTh{&TI0VWFois zzEafwVzibE3C`Q1#189BHEowr2A#5HT3FN0Xu8yN*g_!6gfhHa!Y)%k>24-*&f0f% z&kI%e=7XBd_1mV`PCL43@t*QW0y(t8-aR?EIfJYVJmz>mQxN4K#rZxbl?l8 zLg*&MPlhCz@D&&_5T^#X$G!4&zGR=}3ShjzXtjo&`}Y?uj7yb8Mu=6|!OqSFeX6-N zGng=1g^+vDe8k}+>Z(hz=IL8l>phIt8z@(~(qa%x)~)$77c0_f2x|`h-fsX7P&+x< zK|*BwJF~kzkB@yFZBM<~5u=IZKT>RZ^j`$vzcDnH`u2-&HXm(v#!+Ol^BPLN(LrKl zyd58Vlx$4D-;6J{;!BPAQqMwa`pNR)jmI~RK5C|}wNlp(*4q=QCsz*V9?$(${IUEq z`GGvOn)55I`ITpPn-jNM6Sod-wq@nvdShbc*>-c{^QOGklGhsY+6y`Mr#$= 2.8.0 to avoid accidentally breaking something else. + # + # Starting with tensorflow 2.16.0, the alias points to `keras._tf_keras.keras`. + if is_module_satisfies("tensorflow >= 2.16.0"): + api.add_alias_module('keras._tf_keras.keras', 'tensorflow.keras') + elif is_module_satisfies("tensorflow >= 2.8.0"): + api.add_alias_module('keras.api._v2.keras', 'tensorflow.keras') diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/hook-win32com.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/hook-win32com.py new file mode 100644 index 0000000..afb61f7 --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/pre_safe_import_module/hook-win32com.py @@ -0,0 +1,46 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2020, PyInstaller Development Team. +# +# This file is distributed under the terms of the GNU General Public +# License (version 2.0 or later). +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: GPL-2.0-or-later +#----------------------------------------------------------------------------- +""" +PyWin32 package 'win32com' extends it's __path__ attribute with win32comext +directory and thus PyInstaller is not able to find modules in it. For example +module 'win32com.shell' is in reality 'win32comext.shell'. + +>>> win32com.__path__ +['win32com', 'C:\\Python27\\Lib\\site-packages\\win32comext'] + +""" + +import os + +from PyInstaller.utils.hooks import logger, exec_statement +from PyInstaller.compat import is_win, is_cygwin + + +def pre_safe_import_module(api): + if not (is_win or is_cygwin): + return + win32com_file = exec_statement( + """ + try: + from win32com import __file__ + print(__file__) + except Exception: + pass + """).strip() + if not win32com_file: + logger.debug('win32com: module not available') + return # win32com unavailable + win32com_dir = os.path.dirname(win32com_file) + comext_dir = os.path.join(os.path.dirname(win32com_dir), 'win32comext') + logger.debug('win32com: extending __path__ with dir %r' % comext_dir) + # Append the __path__ where PyInstaller will look for 'win32com' modules.' + api.append_package_path(comext_dir) diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks.dat b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks.dat new file mode 100644 index 0000000..f868f56 --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks.dat @@ -0,0 +1,16 @@ +{ + 'cryptography': ['pyi_rth_cryptography_openssl.py'], + 'enchant': ['pyi_rth_enchant.py'], + 'findlibs': ['pyi_rth_findlibs.py'], + 'ffpyplayer': ['pyi_rth_ffpyplayer.py'], + 'osgeo': ['pyi_rth_osgeo.py'], + 'traitlets': ['pyi_rth_traitlets.py'], + 'usb': ['pyi_rth_usb.py'], + 'nltk': ['pyi_rth_nltk.py'], + 'pyproj': ['pyi_rth_pyproj.py'], + 'pygraphviz': ['pyi_rth_pygraphviz.py'], + 'pythoncom': ['pyi_rth_pythoncom.py'], + 'pyqtgraph': ['pyi_rth_pyqtgraph_multiprocess.py'], + 'pywintypes': ['pyi_rth_pywintypes.py'], + 'tensorflow': ['pyi_rth_tensorflow.py'], +} diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__init__.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__init__.py new file mode 100644 index 0000000..30d22ed --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__init__.py @@ -0,0 +1,10 @@ +# ------------------------------------------------------------------ +# Copyright (c) 2020 PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +# ------------------------------------------------------------------ diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..110855a646d8cf0f4766df9dae02a95924d2150b GIT binary patch literal 205 zcmZ3^%ge<81c%jp(rXwQ7#@Q-FaYF(!DlugHJu@aA(%mv(QhR~5fhOA86@>9!QCn* zFEKZ!q^PtqHLtKxHzzeUIYYN3KR+j?EH$qz#wRl=rZ}@CRkt89IXf{uwKyiepfWSB zxFj(rC$%U(BR@a8I6gT)ucRn5Nx!HB%-4^P&&D|+zY3&BJ6q=M9fVi6@iAb6>PH8x9|8nfx{wh#|eMDQ+x z*B-3m!_Yp1c)$^W>&AqTlT9d^5~9Gwf3$5eEWq^J=LV0pKGDLdZX)*A(O) zn81WKC=5I-KnyBEF+fua* zxk4<*kDq z<6=3(39AsPsdc(Uc|Tqf6-aPY zq@K%3i5hO%L&U|7*lN-BzGB(IYB`z|O9X$zPQ=rdAcWls0OO6}z&aq_=vy}i#>Vfq z@6}tiIr=d9eA!Ot-qX1jNOdITdi7@gYQ2@3X-l*3(rgz%xYC(hZfsufwvtnAdAcKy Kwfcu9#E@^3(vorj literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_enchant.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_enchant.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c1a686822d5925743fc9373270207042154fa3d GIT binary patch literal 551 zcmZWlPfG$p6rXX|G(oIR(KSg7%xi=MWmd*2k{v=8merkfZQa>s#zgSoLFgmYDI}r@ zFCF>-L0=#vDE8W^o8Zk;v+73Bd-MLyd++yS<~|q<04^^pQu#sv;L9mo5vR%UnkSb) z0~$0yVG>~hB3Sjfqg}rHUo_7h1fa)lB4ibTs*4J`UibcQtGIuzE0vpSb7td zuGafP_+1DO0E8L%8HwID?prsl$K;dr9PLM>_lVTq?i{>^miuD(b$lG)44f>G5NG-U DRO^m| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_ffpyplayer.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_ffpyplayer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47491d6369cd53085141ae379678078eb98b9782 GIT binary patch literal 304 zcmZ3^%ge<81c%jp(({=a7#@Q-Fu(+5eAWXprZc24q%h_%L@}f?WHG{&G;pRcr830B z`6-OSKvlsEn#?ajO8jmyXfoYmDb6fOy~P>3pBiC-RZL!DZcIs0 zX=Q3&VWDnLYHD(ZZb^QAPE1*9URjJ!W>O4DuWmtNa&}^RYH>__L1kuMaYi9kzfiH|xI*Twk*a_^-_%Lpv?6ev0LCh#TXQ2J&asd0Vko1M4s^EYqa z%={XO3?rc5r;R#aEF8T&>NJaagANHdVM&BX@izvZm2R0D= zFbT|43s@c3xjL!ybsykh1?i~i^ZvNWdw;IUd4JL*RuB?iQ-dg+g7yLDkYRb$#0u|V zhjWO-JHDJxA-lmEs-gyweEk>&K|Q|oUrcxToK{k@{oODV>=X$wPw!xaeukQ=xQwf) zh8sgg=J%)tzKhfd76(WQ-Us<`px3xYpg5?r#b3-u2=f1}l54RpU7#wea_5oHYc+Ci z9k!bbR3-aR|KVT{l&caEHT=auKeY8mpZhiheLSC6uwsHpDaQU)q6MtYG$NzMJt(>tm`V33Wl+6N?D_1 zQElxewLJYML`Wce#jxd*<%%0*d7fo^(i6{ulXJR}m31?f9QZFoi6(n_FKyHnE*}Zk z_qLosH#X6UT|bH4IF8*o`10xUvk%*``A%%!3HJOb7XRtiler(~TI84Tfp(Hi9Vb)I zw*I)(PKuqR*cMhh!YV+7B9Cu}-;oTo@?-dRLZDF<}%pQejpN|NRb;|Bm0;dyx zdI=;t4$KXm9Yd0xE`6I>hTwL{mPILhH4w|TO2-(BGsa@PR1d^t&*sWJBl-@AZs?7^ z(f7de7EJRyU@sX#xA>^N#738o*o$m*`S?-)d(I2?3L7s*$M?otpB{YD9-Zlo&e%&m zUhu_w=>M>f(b%MYXZM~BgHAvR=>+y_`VD!iSMjUB+=iiS>S~H!g%I{k%>=L>!5H^G en8cGkG+>q~9&h zyquEk_>{zwL`{xc%*B<(x0v#aZ?S+xZ?S-cZ?P04mSo&w%gifIEh@Ril9ivCcZ(z5 z*VQw?F*tZ7!)K5=zf#<-V)7DmV@irjD^v3d3w3i+Q5`*Z3#2G?!#OKS*l39?vBxi&7MM;M%k`5Oc9Ir4qUVxz@UZBwcjFEYd literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_osgeo.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_osgeo.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e721840d9cc91b2644c5d3d094655734b2c9f8e8 GIT binary patch literal 1182 zcmbtT-Amh06u;M`ZPE{{Q@64eaUiRGP~Q|kC|3NS(v3m)R01J3*ESlHnj7o7fs`Rk zL~w|ph+rSYIr>ue$7Bbf(GEH9W=%L*SQ#P0bmb^K!h?#H!Ms;1Q$rYA!VxRUAJP(2?U@*v>|C4(b{JO z7F^9txrxzCIF@wwG!r5v(kG;QJr@qmoQQx+K_+3 zz58s8=s6+0Rj#g-XvF1nin{mD;n=z3Yvv-(sG|K+6lP@f4 zRZ=Wk6m-F&v!Wndo}@IV30l!|;hdnMH=b+;_h)dyVrM4fNq#c^DjxM&Eh@GsT*MZW zmj!)Z)s`$T)&)(+tCF6x+!E%U#(9B6^nyx282^2uqxU(KTsqK+~OgfK>3r=T)3VYJa|X$&4+j;);x7+9QH${~5TA>~#u4 zSPuc{EwT2h0dL7!bq06?Tj3vU_jk6t+-a~8lZ}+zHHxhR9~?UmKG^l_`FH&LsYC8` zusUc2N6g?zDN*wUwuZK2o3Z_<;p;JdJ$2x6O~dn!hr2U-$(>}m{WyGDJd1o8G&*L@ zj@b?NytQp>b$e}dZGY}Cdn6yor^8jr=o&Y>#*Nmv*&43{$WFsr=<%WF$baB3r;fSm z@Y%c(nleLE8;Rd_H)w0WHqB6V+6a!C!O>FUoN}!Xy^p<%eTW)V*rdXw7woNdMM@Lv Vvm0*>`pGxvvT5jb?rEKbnm-=G|LFh# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pygraphviz.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pygraphviz.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4f487ff5f0a78be8c47982e679a4a00cc3368e3 GIT binary patch literal 1108 zcmZWo&ubGw6rRogXxgNNq?Xh+%Bo-qTD=HL5lfL;lq$uFiUgKzcGBH+v$LJuwkB*! z5f7mV1raQWkb_jji~ocFKq5JW0ioc@TcF^fC*N#L+Txp;_vXF%=FRtJXFm@Q4_sBqoV51i(g0O&5G4gK}8IgUMf9?A;X^5}U3lWPaQCcq> zWLXMFR{G6TJYtHrX*sr>^z+({cK`vS0l(G_pR zPxj^r8NmMoGUSiqY1AtrP?k_uc|j&tf-Y+szZFWK-L{Y zwH(zqvAS5k?|8m$+n7!jD5+pa)m_)N^15#kM_mS}jW1*eS%i2@^vWKKy0-2Y2rV%M zTpyR1P{2bS=T#L3*MVZ^uSi;wV9r2rDtGQBKc->cWY;B&u%8Jv=Uc3 zNEpPz&s3&yE?<8Fs@t0>qm?omapNE{(TGkQ0wt7{+0b!0Y{1k#-S;U|X6Jc{VF8r? z2VW2!1w%(b9Yt@Kh_PJaD mak7Jw!gNO(mNOmHSLcyBz5SpijkcsrBkY|^9LBNX$$tSj78{lT literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pyproj.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pyproj.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4d5a47eea0294d7257de7c872c585310f19b7be GIT binary patch literal 770 zcmb7BO=}ZD7@o;~WH%-dKM{#g6&iAgJr->USTK?jwU}F2Shm?|vgu}bJ2OppO|4JCDFXMQwMzVklPF`8Oit-0zDbOI$PQq20h`P_eeXdA7_!6ieF6h*=j}X zuo+t^{Yw-dF=^NFSi0eCU<(hKLb?`4Ob)Q$W7_(Y$7^PzzFIoRQa)i484{)iu0=O} z+-Dg=ElkO-L%U3Mh$)EVz~Y(Q^Leb95AWC4?=_oD7j&j=QH!bQsY57XY2*zY?0cWV ziO_Mn`QWbMS$%`zogwnJx63X#G$AhSnVyVgNR`UL&xJ9To+-p z>-$^8Z2KO?&c+g^alXVmOdj)2q2P8fJk=_F-`;Ui6<^`kil0qB@GX)cgwa(1Godcl z6lB79MHe2L5a16qu`M*si- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pyqtgraph_multiprocess.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pyqtgraph_multiprocess.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2df878a2c770980eada8740309c35195879322a6 GIT binary patch literal 2008 zcmbtV-%lJ>6ux(6_7^+56w(HkU6-LtNGL)h##jx(*ov(I8(U%&TsmEL1{hdohC6qG zCA$flKCA{KKD99z(NwCUv44OjT5aOvF4@G*Bs`fu@U{k1D%7@^5-V|%V+(AzZF@U{b`O%A8AKbae$uEu-V9FTS$9Rh z2^l`xj@U42a|F@TRc0q54h(tEFk?vNme4XghL&)eArabAWu=+=wK1YrrVraJUqO=V z2+!UxWZvHA|IJf|Jt6{O^=>hpwlF#&zSstGC>ucXmQyvR`^LxqXq>{pPpI~Y+7F}tIsA8%cY6Q$}5+& zWI_^DjS5qWDxF{`*oHz}lVm|7f)OW*PCL4rOg15_CTpY&lZ%n*MU&A0=`lKEaZ za3DL99XZ%-Y%L+|5vrmXY_~MokrE5@2L}fwC*py`cv^S)Q|qBTA1?6W93S508`rL^ zU;A))Z8$sp*ooRg8!caiJ_~&vzni!}{7X1@P0R;w76Lc3{#~zc?Zr<9KN`H#m-luT zyxk?lfxD(N>*{7a-*m3fbPfXW^?Wl~?1*QA0qJeloe(1w?+BK64klm zkQMVWtVa-iIL`|OUdZu6UG$IqZMk4H@1H36CvxtIQV(*s%n8gHD!LWcC z#zLl38M0tzFr+Xo1FBvP*Ac~vqMr>}AB>&Kx{ML12Z$k{NI8`iXeQi@GR7h)Wc~tn zm`Y?C-4sTKXx0?QU*^Wc7#w^{6kSU^SQ%?(aY|;Y-D=gH_Nli`8&@IW&&xt8Z%`1!X$xMnV&MZmQEl5nxPE1cNj)^a*%*-n; zNzBPfEsD>`&(AK7PtMOPDauUJFDe1^^?@qlfoz~kpg>-7ey(0Y|n;hkZWJES?3yOJXhM&g1_AQ0VPVQ=wh_iysQAfkDZ WMe7QS)&&-=8!VC+z^I59XfXh*f|hgu literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pywintypes.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pywintypes.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3784fa82759f964962e1d64de5b78055227b2708 GIT binary patch literal 609 zcmZ8dO-sW-5Z!GOTR)157OGc8X>AqSgCHt+@C*E;w;BksS=!VzNq5&uZXyMLf*^uD zh$8+BFCILk(nHBf@FZRe-aNTUO{txk-8Td8y;=4l93B8Ho@aLQUpxRG?%)TTz4(4( za0L{gKn-Nu2(u8uV&IPfYMkG7BLYR=11N!e#(wH3vcf-oU$@Thk#G;0hMjicDI_q@ zjzjJ@%puh}>ai1=2&lxeTGgVKgBw`VYO6gQAF!n zFB+=ugrwc|?Sr*U#)KE{VEa5-C2lkX|k)HH317 zBsC08tRTH2?x@EiQ7KBAa_&UVBO*$srRs#rnuf4cFpLu-_hOZ(d*wiS>-h z9#1V3k$Kbl2`!fladx$&#Iiy_ zBVLQw(u1Y=5A@!DV1*pQo`jxyTL=a5)Hkb1TWR0S{N}xx_ul;8%zRFz;(+q)enu~% z_MI7R;VzZd04j%|LJeL62O1oqecbi}0&hSiS&+FxXAKn*2alsg5q7y<9y1UX4A|$x znQTK9O6@biji_7|l#cC0FziyQpz6$5 zc|Y!Grfty`!+I+dKdQW(nO%66&B~mAOR;ECSFW7z^LE9yS*5OfUV8pGXXe*)4&AJ1 z=Elabp=pKHVaKwJ+?Hl;^g6CEZ=1c{8PaPCk~_y*kOZ;YeZksk zBvE_sMf#e(xA%kt>E|8jyZ3S08+!6}=_EbXNKbh}Zy<;w^8Fu3kREfV8$yp4cACQD z=4BF|{{=!bWOp7NU$@jvLz|%Na}h>OMhJL9NYFDt#scWT0s)eA6FaF|%1t$eF2*%X F^$Sw_=tuwn literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_traitlets.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_traitlets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..674b223d6462ad800802b9875539c67a914f7b45 GIT binary patch literal 495 zcmYLFJxc>I7*6g=?OBRoaZwNlDO9Z897LQ19ZDCsauCu>xW?u_nxvI(9sCde1o3zH z2Rb;&txj$S-8%WE*PbuQljnJP@`N| zrV-EFNQc^{oI$O{!;KGZ->B)F$CF7%avqF2CP}0}P;waNVhJNt#u literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_usb.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_usb.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2cb34af59db99f485058185348a1385586cfc785 GIT binary patch literal 2970 zcmcIl%}*Og6rb5$d;N*|3g*kiK)wvIW0E$B0FkCZfrzA$P?Ug39phcViP?2_mk=W( zxmBc4i36&rg49;xkfv#qO7w=*Q=5NajeM|HLPDx?=&5c|C6rU&tk)(GNZLbZ)^BIt z`@N5O^WOS9r_+XDyf`*E@dvDaBb<jK$UpM(7dZ5Qk%EB>%=ESl?44l>VkiXlq`= zOqn7SMpNbyGe$yXGve7JNOIu3)M7}jL^_NFW(M7-htUi+v~7mmK4RZT+hItZMEbh6 z9z%&Cb&a^d8}$HMc z_aH2sbq~U|gW&K`-VVdr_MqPMWZ#4M&z^ja-$~$CBE|E-jy8T<)v$Po9%8sfY97y{ zaf-tataDV78bUt$N(3&rI9OO!z;8+WpsWWtD9s{5SfYju5n{iL~e(HH;Rn6`ImOmoEIJkcuz{XW#Ar zGYm01jGP`;4i#_+B`MCiyRc=~+b!t@S#m`)#YH)KUo&%IX(lSX!lz~}EdeeOi;lHu zCg7Yot(hZ<30*ciYXVs;MqaYmqFDenEsq7;W*e>zedvXq6qXX+h&UbNyn?8B$9V6! zI4y7mWLr?P=XF9+A*%T78Z9Se%@VrYJ8<>l(2z!nvc?GEDPFV0V_{`nl%_OhA|{SO z5K1D>%bNLmROlHT)R=BU*^h^MB}tStb}}r76-Dw{G{<;U;6g?)nw7uLM?&$iGO4je zUL-7VQ7)|T8Us98m*`$?MG3^AJ0w@^)kiAzD$>_J3b;{4nojV--Mju6&qpTxiYUfL z@A1OD(ZT50s2o*ze>@zy6Q1DZ(NH`Q6=WqGi}6xuQWWpVp@=9bQgrN;r0DxofC#}l z1gQ+f6Phy=6T`&=%pRHGl{{yBT8IQXV`3y6le+@DPz?~JoP?I$PN9uT_tN0Jb+f!` zp3T-Y=aAdlsgwDEm#(sfndRf_u13|>_-*8IY;|(|SeJUNYr|c)lvo`gb1gxp+BlGQ zU&^>IEi#MDMp@-j{fc|N?1Wl&;>YgigKPckCwtVBJ$W_XD$KQEGS$Yuw7Wm!?k8$5 zb)z+_FxLjiR2x4^yZbWkzC|WmcQ}XaPKXZ3BAcUZWzBz^QFYx?a%E=S9Z=nY)%Vug z*U$8-XL>i9PCWLnvgxMtnWpp0>@xcj7_Cny(oJVGO=p+cth+&Vw`8k5%cdNSs#~{T zx*Ku`mx1*H$u=}C_K}&RfwjH8z3Hk_T}|22LyJVGlsK=bRcqVR;CGyh`asF z3%{eglYP;Ff%@>3@8RPwc|j~4CZq|7Og=rgZh56fcx%pGw=5k2UOfQ?fo#L2<`}QZ zokMRWJs3G^RHk|hbdY2v!~w*IXKm2IP+k7EKu{vze;?M^JS(WNVw@L1=)=-+BBEzm z13GJi<}lV8O(0BO77VmWCjhJW4e*1SIgj*JNR_~sNFtI%2+kSx=pzV#syv_c{O&*nGLQT2c)XFh^!a;QkIV#KfyIv3Bc({(Cc zm-VzP-+bDxp6g3{`ZJ#XRDXu4HJGb&X-{v))0^kj`<5?1^{w7a*LP>?yHkA`2FjQ` zn*|fs)1Dg{&yCkjsOLUOdqNpc=p8oXI=Hhhto7*Y5 DPKN0Z literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_cryptography_openssl.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_cryptography_openssl.py new file mode 100644 index 0000000..dbabe69 --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_cryptography_openssl.py @@ -0,0 +1,20 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +import os +import sys + +# If we collected OpenSSL modules into `ossl-modules` directory, override the OpenSSL search path by setting the +# `OPENSSL_MODULES` environment variable. +_ossl_modules_dir = os.path.join(sys._MEIPASS, 'ossl-modules') +if os.path.isdir(_ossl_modules_dir): + os.environ['OPENSSL_MODULES'] = _ossl_modules_dir +del _ossl_modules_dir diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_enchant.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_enchant.py new file mode 100644 index 0000000..36c185d --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_enchant.py @@ -0,0 +1,22 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2020, PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +import os +import sys + +# On Mac OS X tell enchant library where to look for enchant backends (aspell, myspell, ...). +# Enchant is looking for backends in directory 'PREFIX/lib/enchant' +# Note: env. var. ENCHANT_PREFIX_DIR is implemented only in the development version: +# https://github.com/AbiWord/enchant +# https://github.com/AbiWord/enchant/pull/2 +# TODO Test this rthook. +if sys.platform.startswith('darwin'): + os.environ['ENCHANT_PREFIX_DIR'] = os.path.join(sys._MEIPASS, 'enchant') diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_ffpyplayer.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_ffpyplayer.py new file mode 100644 index 0000000..6a024de --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_ffpyplayer.py @@ -0,0 +1,19 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2023, PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +# Starting with v4.3.5, the `ffpyplayer` package attempts to use `site.USER_BASE` in path manipulation functions. +# As frozen application runs with disabled `site`, the value of this variable is `None`, and causes path manipulation +# functions to raise an error. As a work-around, we set `site.USER_BASE` to an empty string, which is also what the +# fake `site` module available in PyInstaller prior to v5.5 did. +import site + +if site.USER_BASE is None: + site.USER_BASE = '' diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_findlibs.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_findlibs.py new file mode 100644 index 0000000..43d3db1 --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_findlibs.py @@ -0,0 +1,52 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2024, PyInstaller Development Team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +# Override the findlibs.find() function to give precedence to sys._MEIPASS, followed by `ctypes.util.find_library`, +# and only then the hard-coded paths from the original implementation. The main aim here is to avoid loading libraries +# from Homebrew environment on macOS when it happens to be present at run-time and we have a bundled copy collected from +# the build system. This happens because we (try not to) modify `DYLD_LIBRARY_PATH`, and the original `findlibs.find()` +# implementation gives precedence to environment variables and several fixed/hard-coded locations, and uses +# `ctypes.util.find_library` as the final fallback... +def _pyi_rthook(): + import sys + import os + import ctypes.util + + import findlibs + + _orig_find = getattr(findlibs, 'find', None) + + def _pyi_find(lib_name, pkg_name=None): + pkg_name = pkg_name or lib_name + extension = findlibs.EXTENSIONS.get(sys.platform, ".so") + + # First check sys._MEIPASS + fullname = os.path.join(sys._MEIPASS, "lib{}{}".format(lib_name, extension)) + if os.path.isfile(fullname): + return fullname + + # Fall back to `ctypes.util.find_library` (to give it precedence over hard-coded paths from original + # implementation). + lib = ctypes.util.find_library(lib_name) + if lib is not None: + return lib + + # Finally, fall back to original implementation + if _orig_find is not None: + return _orig_find(lib_name, pkg_name) + + return None + + findlibs.find = _pyi_find + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_nltk.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_nltk.py new file mode 100644 index 0000000..feb9eb7 --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_nltk.py @@ -0,0 +1,17 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2020, PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +import sys +import os +import nltk + +#add the path to nltk_data +nltk.data.path.insert(0, os.path.join(sys._MEIPASS, "nltk_data")) diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_osgeo.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_osgeo.py new file mode 100644 index 0000000..7b31027 --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_osgeo.py @@ -0,0 +1,32 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2015-2020, PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +import os +import sys + +# Installing `osgeo` Conda packages requires to set `GDAL_DATA` + +is_win = sys.platform.startswith('win') +if is_win: + + gdal_data = os.path.join(sys._MEIPASS, 'data', 'gdal') + if not os.path.exists(gdal_data): + + gdal_data = os.path.join(sys._MEIPASS, 'Library', 'share', 'gdal') + # last attempt, check if one of the required file is in the generic folder Library/data + if not os.path.exists(os.path.join(gdal_data, 'gcs.csv')): + gdal_data = os.path.join(sys._MEIPASS, 'Library', 'data') + +else: + gdal_data = os.path.join(sys._MEIPASS, 'share', 'gdal') + +if os.path.exists(gdal_data): + os.environ['GDAL_DATA'] = gdal_data diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pygraphviz.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pygraphviz.py new file mode 100644 index 0000000..cfae2b3 --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pygraphviz.py @@ -0,0 +1,32 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2021, PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +import pygraphviz + +# Override pygraphviz.AGraph._which method to search for graphviz executables inside sys._MEIPASS +if hasattr(pygraphviz.AGraph, '_which'): + + def _pygraphviz_override_which(self, name): + import os + import sys + import platform + + program_name = name + if platform.system() == "Windows": + program_name += ".exe" + + program_path = os.path.join(sys._MEIPASS, program_name) + if not os.path.isfile(program_path): + raise ValueError(f"Prog {name} not found in the PyInstaller-frozen application bundle!") + + return program_path + + pygraphviz.AGraph._which = _pygraphviz_override_which diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyproj.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyproj.py new file mode 100644 index 0000000..b78b70b --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyproj.py @@ -0,0 +1,26 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2015-2020, PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +import os +import sys + +# Installing `pyproj` Conda packages requires to set `PROJ_LIB` + +is_win = sys.platform.startswith('win') +if is_win: + + proj_data = os.path.join(sys._MEIPASS, 'Library', 'share', 'proj') + +else: + proj_data = os.path.join(sys._MEIPASS, 'share', 'proj') + +if os.path.exists(proj_data): + os.environ['PROJ_LIB'] = proj_data diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyqtgraph_multiprocess.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyqtgraph_multiprocess.py new file mode 100644 index 0000000..e3168dc --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyqtgraph_multiprocess.py @@ -0,0 +1,51 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2022, PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +import sys +import os + + +def _setup_pyqtgraph_multiprocess_hook(): + # NOTE: pyqtgraph.multiprocess spawns the sub-process using subprocess.Popen (or equivalent). This means that in + # onefile builds, the executable in subprocess will unpack itself again, into different sys._MEIPASS, because + # the _MEIPASS2 environment variable is not set (bootloader / bootstrap script cleans it up). This will make the + # argv[1] check below fail, due to different sys._MEIPASS value in the subprocess. + # + # To work around this, at the time of writing (PyInstaller 5.5), the user needs to set _MEIPASS2 environment + # variable to sys._MEIPASS before using `pyqtgraph.multiprocess` in onefile builds. And stlib's + # `multiprocessing.freeze_support` needs to be called in the entry-point program, due to `pyqtgraph.multiprocess` + # internally using stdlib's `multiprocessing` primitives. + if len(sys.argv) == 2 and sys.argv[1] == os.path.join(sys._MEIPASS, 'pyqtgraph', 'multiprocess', 'bootstrap.py'): + # Load as module; this requires --hiddenimport pyqtgraph.multiprocess.bootstrap + try: + mod_name = 'pyqtgraph.multiprocess.bootstrap' + mod = __import__(mod_name) + bootstrap_co = mod.__loader__.get_code(mod_name) + except Exception: + bootstrap_co = None + + if bootstrap_co: + exec(bootstrap_co) + sys.exit(0) + + # Load from file; requires pyqtgraph/multiprocess/bootstrap.py collected as data file + bootstrap_file = os.path.join(sys._MEIPASS, 'pyqtgraph', 'multiprocess', 'bootstrap.py') + if os.path.isfile(bootstrap_file): + with open(bootstrap_file, 'r') as fp: + bootstrap_code = fp.read() + exec(bootstrap_code) + sys.exit(0) + + raise RuntimeError("Could not find pyqtgraph.multiprocess bootstrap code or script!") + + +_setup_pyqtgraph_multiprocess_hook() +del _setup_pyqtgraph_multiprocess_hook diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pythoncom.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pythoncom.py new file mode 100644 index 0000000..4f11fb8 --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pythoncom.py @@ -0,0 +1,24 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2022, PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +# Unfortunately, __import_pywin32_system_module__ from pywintypes module assumes that in a frozen application, the +# pythoncom3X.dll and pywintypes3X.dll that are normally found in site-packages/pywin32_system32, are located +# directly in the sys.path, without bothering to check first if they are actually available in the standard location. +# This obviously runs afoul of our attempts at preserving the directory layout and placing them in the pywin32_system32 +# sub-directory instead of the top-level application directory. So as a work-around, add the sub-directory to sys.path +# to keep pywintypes happy... +import sys +import os + +pywin32_system32_path = os.path.join(sys._MEIPASS, 'pywin32_system32') +if os.path.isdir(pywin32_system32_path) and pywin32_system32_path not in sys.path: + sys.path.append(pywin32_system32_path) +del pywin32_system32_path diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pywintypes.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pywintypes.py new file mode 100644 index 0000000..4f11fb8 --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_pywintypes.py @@ -0,0 +1,24 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2022, PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +# Unfortunately, __import_pywin32_system_module__ from pywintypes module assumes that in a frozen application, the +# pythoncom3X.dll and pywintypes3X.dll that are normally found in site-packages/pywin32_system32, are located +# directly in the sys.path, without bothering to check first if they are actually available in the standard location. +# This obviously runs afoul of our attempts at preserving the directory layout and placing them in the pywin32_system32 +# sub-directory instead of the top-level application directory. So as a work-around, add the sub-directory to sys.path +# to keep pywintypes happy... +import sys +import os + +pywin32_system32_path = os.path.join(sys._MEIPASS, 'pywin32_system32') +if os.path.isdir(pywin32_system32_path) and pywin32_system32_path not in sys.path: + sys.path.append(pywin32_system32_path) +del pywin32_system32_path diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_tensorflow.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_tensorflow.py new file mode 100644 index 0000000..747ea45 --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_tensorflow.py @@ -0,0 +1,53 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2023, PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +def _pyi_rthook(): + import sys + + # `tensorflow` versions prior to 2.3.0 attempt to use `site.USER_SITE` in path/string manipulation functions. + # As frozen application runs with disabled `site`, the value of this variable is `None`, and causes path/string + # manipulation functions to raise an error. As a work-around, we set `site.USER_SITE` to an empty string, which is + # also what the fake `site` module available in PyInstaller prior to v5.5 did. + import site + + if site.USER_SITE is None: + site.USER_SITE = '' + + # The issue described about with site.USER_SITE being None has largely been resolved in contemporary `tensorflow` + # versions, which now check that `site.ENABLE_USER_SITE` is set and that `site.USER_SITE` is not None before + # trying to use it. + # + # However, `tensorflow` will attempt to search and load its plugins only if it believes that it is running from + # "a pip-based installation" - if the package's location is rooted in one of the "site-packages" directories. See + # https://github.com/tensorflow/tensorflow/blob/6887368d6d46223f460358323c4b76d61d1558a8/tensorflow/api_template.__init__.py#L110C76-L156 + # Unfortunately, they "cleverly" infer the module's location via `inspect.getfile(inspect.currentframe())`, which + # in the frozen application returns anonymized relative source file name (`tensorflow/__init__.py`) - so we need one + # of the "site directories" to be just "tensorflow" (to fool the `_running_from_pip_package()` check), and we also + # need `sys._MEIPASS` to be among them (to load the plugins from the actual `sys._MEIPASS/tensorflow-plugins`). + # Therefore, we monkey-patch `site.getsitepackages` to add those two entries to the list of "site directories". + + _orig_getsitepackages = getattr(site, 'getsitepackages', None) + + def _pyi_getsitepackages(): + return [ + sys._MEIPASS, + "tensorflow", + *(_orig_getsitepackages() if _orig_getsitepackages is not None else []), + ] + + site.getsitepackages = _pyi_getsitepackages + + # NOTE: instead of the above override, we could also set TF_PLUGGABLE_DEVICE_LIBRARY_PATH, but that works only + # for tensorflow >= 2.12. + + +_pyi_rthook() +del _pyi_rthook diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_traitlets.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_traitlets.py new file mode 100644 index 0000000..5ec3a9f --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_traitlets.py @@ -0,0 +1,25 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2005-2020, PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +# 'traitlets' uses module 'inspect' from default Python library to inspect +# source code of modules. However, frozen app does not contain source code +# of Python modules. +# +# hook-IPython depends on module 'traitlets'. + +import traitlets.traitlets + + +def _disabled_deprecation_warnings(method, cls, method_name, msg): + pass + + +traitlets.traitlets._deprecated_method = _disabled_deprecation_warnings diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_usb.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_usb.py new file mode 100644 index 0000000..2a455a6 --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/rthooks/pyi_rth_usb.py @@ -0,0 +1,75 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2013-2020, PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +#----------------------------------------------------------------------------- + +import ctypes +import glob +import os +import sys +# Pyusb changed these libusb module names in commit 2082e7. +try: + import usb.backend.libusb10 as libusb10 +except ImportError: + import usb.backend.libusb1 as libusb10 +try: + import usb.backend.libusb01 as libusb01 +except ImportError: + import usb.backend.libusb0 as libusb01 +import usb.backend.openusb as openusb + + +def get_load_func(type, candidates): + + def _load_library(find_library=None): + exec_path = sys._MEIPASS + + library = None + for candidate in candidates: + # Do linker's path lookup work to force load bundled copy. + if os.name == 'posix' and sys.platform == 'darwin': + libs = glob.glob("%s/%s*.dylib*" % (exec_path, candidate)) + elif sys.platform == 'win32' or sys.platform == 'cygwin': + libs = glob.glob("%s\\%s*.dll" % (exec_path, candidate)) + else: + libs = glob.glob("%s/%s*.so*" % (exec_path, candidate)) + for libname in libs: + try: + # NOTE: libusb01 is using CDLL under win32. + # (see usb.backends.libusb01) + if sys.platform == 'win32' and type != 'libusb01': + library = ctypes.WinDLL(libname) + else: + library = ctypes.CDLL(libname) + if library is not None: + break + except OSError: + library = None + if library is not None: + break + else: + raise OSError('USB library could not be found') + + if type == 'libusb10': + if not hasattr(library, 'libusb_init'): + raise OSError('USB library could not be found') + return library + + return _load_library + + +# NOTE: Need to keep in sync with future PyUSB updates. +if sys.platform == 'cygwin': + libusb10._load_library = get_load_func('libusb10', ('cygusb-1.0', )) + libusb01._load_library = get_load_func('libusb01', ('cygusb0', )) + openusb._load_library = get_load_func('openusb', ('openusb', )) +else: + libusb10._load_library = get_load_func('libusb10', ('usb-1.0', 'libusb-1.0', 'usb')) + libusb01._load_library = get_load_func('libusb01', ('usb-0.1', 'usb', 'libusb0', 'libusb')) + openusb._load_library = get_load_func('openusb', ('openusb', )) diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__init__.py b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__init__.py new file mode 100644 index 0000000..89c0c0f --- /dev/null +++ b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__init__.py @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------ +# Copyright (c) 2020 PyInstaller Development Team. +# +# This file is distributed under the terms of the GNU General Public +# License (version 2.0 or later). +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: GPL-2.0-or-later +# ------------------------------------------------------------------ diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a20b9131faecfac2845e33d5cf8b8e1c6e336323 GIT binary patch literal 206 zcmZ3^%ge<81c%jp(w8tYFgylvU;xMmgU@V0YC1y-LokCTqu)w~A|@dJGf3)JqPta0 zUSe)cNl|HKYF=TXZcb`ya)xe6etu3&S!!Ncj8A4#OmSvOs%}AIa&}^RYH>__L1kuM zaY literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-CTkMessagebox.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-CTkMessagebox.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa10b6085d3f566db7a5a56f0c5c1429469ea3f5 GIT binary patch literal 356 zcmZ3^%ge<81c%jp(x)>qFgylvV1OCQ_^bhBOlL@8NMX!j$YqRTWMp7sNM%f6TE@u0 zuo{RVAc`r4Iha9{SHMt}{C9xziJ}omRwfGjVb4a#tYH@L5dTLUB zg`Xz#E%AU#&%EN2M4-|lz0#7*oMOF<{QT_VB9QI3SV4M=S2BDCnfWW*-6|$8F*l~9 zsI)RQudq-zCp9%WL$@S9KPRRvHLonjCo?IgII|>Gw;(Y&8)!#yOngCQCd~MFu)*=k z`FSNpnMwM^B`IJ5eGsXO;xN5}%3mBdx%nxjIjMF*V>Hq*HHfYHJ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Crypto.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Crypto.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..776c537b3d5d4d7a1876365e3affc8764092eca5 GIT binary patch literal 2147 zcmZ8i&2JM&6rc4+{E;t{fFM$(jv!D%lZ^-}Q4#Hd*a;~#jT&gdN@cCR6Ys$8&N4F_ zvr!K@MrsaKRf!&|Dnb>g;zDm6dZ_3>kW`Us?Fp%;-Yjv6IQ7liYi!oLZ}!c+`Mvjk z@6Gz@@Ngc%_1C$Z^+FDzf0Ytn(F!Q9rH0TWWTG-MH8WvrWi1*LvUo3q0^7GnqrMO{?7C!4+&t>4__|vtHm)-3z3}T%GZHq=Tq+x8(DE090VZ z#fI%LA+gDsH$z>_iDw%%;t*FxE~Q1V%Np2s9fP_O9%6Q3;uv&%3(RDLVS^Lw_|i9Q zJHX^&&GrS|B-jubfC8`w#dl4@^9ooPkcVf~?i+Q2&!285cX~>HCs30L$!XP>L|`*; z4Tsh`o+->2u8FHYwav(fqkPegwz~%51cFtJ-~|Xr5?4^>3Vfby5*KWkU$@$(DsY#{ zUZa_A*fqobK;kONQ^#Xm5^xwmF%<5Uj+Z5NXx)-nFh~s>xJo5%5X#MI2uuP#Fl~|= zRlYI2bH)H84{Want3i|il>&(1k{WiT3mZ5WzNg$pb?6OW$Jbc{GT_r~Y{M1|&^8U5 znua1ts6{|x5f6|P5J=rRb_j$FJozF{Vc8WDYDGAfEQ-;DI$9*pql7l74QR09`L>Oz z3xz555eLawsyShFhyg7FwidBH+@R9xZ&&8p!8BIPP{0B%p``UX6bKlD_;JI6ip2e? z0BI*QU=fyKqvJ!LRv|tjR0$#%RVFQn>Q>KGj1e7@OZrFp#p$=WbNc1B9`(eWK9A4g zOZw$$yhu#O4bZ-(uE`oA|DQU?D^prHR=RVmw6eDR#Y$!E_Tu95ozfc2PSlC4IL!2I zQc*Nj4B6??se!G*b|>qf8`9bu?kEe?vk335-ImnuD%TBRZH;yeS2>fc#_X*^JmFVu zTDw7ltyJa0S@A~Gr%r^KO2uTgN+nD%5vJ-ktA=B%LARcIjX9nnIeb4*c(QlF2ggEJ zWfMH5RxpZY6FxMsb1L8h-Fk=%^vt}e? z_B!<3=K4)qT^Cf6na&48tXI4sZW3OJ5~|dgtI9Adq!~@jDml~P(F@*WueRg+l)nc~ z)qjjAf@~!3PR(^4&@#CfFUw{z;(M1$MW?-jbZ-+wpJC;R<(YXl9AY-d}E%*jLx z#bO_gx5jc>u6go83#HRbT3hZ6HVb1vW*&|HFuIRFhWo{b2YB%iFCG+@4hu^=>E`&^ z7E0!ny^=c%&56@L9shY^Z|>Lmr&k|eeV%^4`DgO?Zx7BC56=`2CQ64BrJc{3C*E%% zZCLG6@_VgWIHi2-9oxI{&*c2ylk+cHgZizFZJ}b`Q*#X8p!_vXNHeU literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Cryptodome.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Cryptodome.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2f559d14813a10c7f68913a0f5106fedd94877f GIT binary patch literal 1306 zcmZ8g&1>976ra&*KP}s_*Cq`%je2N;OIAzcrUerxcD9?uB()vv&{S+Iw9z5Ln+klA#KUUz2)A2U^gse(J7EqZ-U%>>WmyE+K!&yoA>p5A3}eO zjurqt|D3zs_$>{bYU; zEp8Ycf&=M5IrvuRHo#oI{dM6c#yjE`cEyV8I|S>viNq$>TNYXn4MH4mpZG!Riv8dA1Q3n?lgu32vpG?!^lylq;l zn2v$m_ISc{mzdU&;il>t?P4Ng-NgiJcsS}al^E@*WK^qenc6Mnw|V7*_q}5%9mDcm zF~};4jx|LIIP3*{!@~7oa@}9CJ)&9`awQEn9hJB#I$&@*>1ff$JjtM|_gtQNb9K{J zT@!ghF}nHj$hO*~#*xj0rb4el3hj}A-^QjL6kbPDqyTOO8P#!+ ztp`~bIhLxSzrZWD@?+!1LX9HSh}-g!egA&RLP#@81Y@iA0ND>}x6OLZGYKj=sFBHhVn24Aq?N)As+(9 z1ON-2JbMOUq!T?az=z#o8i2*_Fok1480+LhE_<2_LCm_K7*2wz^C3vXC3wO+w+6!4 z!Hw_NzFX_gUZQlg)0@54pS{)-Dt)2SsSd{93qdN);u+sh4W{4yVe`i?9=X5l{`&Ce zhksU&K7LyH`*QE>Qvd8yZ+f{uy}Vx-Ow5D;=2;fw`^y7iiq&{@=Wyh?IR8wXKdL+} i_Qb`$xY(V&(i5)sg{$3&=n7a~I;xp|+o^koF6lo^`EaBF literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-HtmlTestRunner.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-HtmlTestRunner.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01d02e5e622beca859f48351b5b5072daf3753f2 GIT binary patch literal 359 zcmZ3^%ge<81c%jp(!-b-7#@Q-Fu)9DeAWOmrZc24q%h_%#VZ*;gADzZ<8Bp`mzWz< zQdC-*npaq;o0FQFoS|EipPv&`mYP=<bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jv zd~$wXNl|8!esM_(SU?{{>Y}<#ub}c5hfQvNN@-52T@fgZK>jS&0}>yY85tQr$T2XQ fUtlmpMh`foE&!3V_C*ezD;zovtRPs#0n`EjZntU* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-IPython.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-IPython.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d45364639a8c3965c8375d51431bdc213aa2a67c GIT binary patch literal 750 zcmZWm&ubGw6n?YWpTST`k!logDddo}N)0ID)f7sJ)QihP*zAnSkp0!2N$vKOqh~Mb zO*~XY{|LcgnM5GA=mv=92#>6L=jQv~out_2V% zKvb-)s;)MuS>6irxCT!dI7$K?+(4dN)_Oz3VLlMoB77?6F23;7jXlBbWH&_Uz8kCL$FA8}=hg*!}QrIeT zdpT*GUYd`C2v2?TB)KJBi~D5nWy&iEq5LkOdl_v1ALr1`RwKV=tt&Y!(`+rj32HS5 zgf?HlD9gFJ{!?xIP#fYZ7= Pxy;a;X~mOl$nO3EJn!5n literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-OpenGL.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-OpenGL.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b931dc13af886644c3fdac9129355dfe1d605fd5 GIT binary patch literal 1960 zcmZ`4O=}xRbXMBcm*q|DI7(WAJ+vj3l4#}HkVDh76q+WX`J#nFRflD@JCZhD?I<%N z+Y&P9&_gJOhEkdyTJR}N$tC}xe?SU?h=o9)r``nVDW|?!eb`Q#*_k(Q-g`6eW8S>| zV|F%$p#63FTE$Hu^tW70T6B!O`~{E)$U#NqC{DyvYLQ~37A-~UXmnp-ynm6mjzkCg^8QXZ1Fz!;H<1(W)psW}x zrSrH^H}EY+HeK4_`yy3qlVB@V_Zk(~$Gph}so|2viG!(+>l+o55l$P-CLC{7UAu~1 zj_Zt;JW{iSYhyui)$$#WV4E^VY~eLi4c{RQ*PE`-h2?pKUBIgc?P|#5VIyn!xa|4_ zZ@HpM8v<9sAASyVibWOlP@kkYFg(X!24;f^BlV9AL@pAUfje>TawoKf3>zfpY z_7xEg=3~$00@E_K7_*wVMx6%STA0-1lpc|ca1Svm23{U9jBp1xHcNClWVW(ytxlQ1 zBmM=*Q`Z;Sv9xK{Em1Yi?^bT-g4k$pODmi)>P;qH3KFL2`mQj|mVQ`4F2Q8vf(Ye- zDh~L!rZr&rruI2@$-ufo-H`lMZrF9Ml zjRYRgx>(obi!{Kn^%qv z(G(a+O$|{@IX5_duDg)$T<=^TX!;PTl9KN(7?LuKq0HIt!r2g0^zPhg=)JjYe=gfY k+0HB&CQnh6+#tQ!O)vhs-AiZt>1^kc{G=DTkQ;jZALvjQ5dZ)H literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-OpenGL_accelerate.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-OpenGL_accelerate.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3063968e7d896121078e9474878f7803df6b385 GIT binary patch literal 575 zcmZWm&1xGl5Z1135*7??Pt7SqAb}k0+)Kzc6iiZRPGMn@rLk8;t5GDa&HB{0=p&Ro zM_(f3+81!hDLzH(#398a^bMo=`$qGp-_KZ-zel6#bIRDi*4Rk2*Yflws^3hqYbFz! zPSfi|c7C$s?&2}Kv}n#p1s4J}Ivx-NnZT8Yie# zmf$U-gxZ3q3Sm+k5fm8@6Gs)iHhHVqrpE}^y!QB3@&oTIQW8{IrDIYcFg&Ok#@v?jW|(2N*xQqX4&Ni#v)7L$nxt-WQiPs-Q hSay;mS$^#$-6d<`6YIf!_i)+kd`^G$+v9pM>;>B-!0-S7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-PyTaskbar.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-PyTaskbar.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..117541b4efddd1a96d9d72d8ec14e8be9ea8061c GIT binary patch literal 348 zcmZ3^%ge<81c%jp(pi`o7#@Q-Fu)9DeAWOmrZc24q%h_%W}4R9cyu zS6HZbQ=D0ns#}nloSm4SS{xH!P?-s{CLU}- zd~$wXNl|8!esM_(SU?{{>Vn**S5Wzj!v^A1yCP7yfc#dh3nV@;Gcq!MkYZpozrbLI cj2;LmT@X-OV0KYJ>xzI@11|^`aR7Ay0AqY*6951J literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-_mssql.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-_mssql.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b69647148eb8b7b31862790095241fd193c3fa3 GIT binary patch literal 236 zcmZ3^%ge<81c%jp()TekFgylvU;xMmgU>ubYC1y-Lpoy=LkeRsgC^50meSJ96hBSI zTf7;WDJiLWnYjh|MJ2^689sxw{7P}RipfjNjVUQAtxU};EY!_OO-;_wEy>T%i789X zD~s{TOo}PaEJ@WZNKDR7OiwM2i7%+k%quQQ%*jbDiqFW;&n}Kn&d)0;%1qKPE=d6k z=z~bz_}t>+!W_MV%3mBdx%nxjIjMF<>_AIF&Mg)K5+9fu85uuFF$hUa;Ar3l!6H_m FFaT#9MXLY+ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-_mysql.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-_mysql.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c85e13fcadcf96916bbe41ebd65cf0ccde8d9b4d GIT binary patch literal 353 zcmXv~!AiqG5Zz5hOCeA_c@g$fpr>1KDcy9vgVf8i&H-{BAR zoU1<&=&dI=M&H0=W_ZlJnU64>Adj!>Wkv#ozWd@I_%At3ee#YNS|f%tyv8heM)T3@ zYVxGij%<}7v}kN8Zis=h;szMuTaxoE2NMaXK@eRTAi8n6lB7_q5< zHOM+%@=a{HgGeXoF3G^gR5x5&mk0rd=KcgrQzf0@n}v1kx3TCs8vNYq<~Y6|Oh1^h hU)n#$UU}+97~}3Tz$YE*X^bvr`|0d0?8BUT#Shg_ZmR$Q literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-accessible_output2.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-accessible_output2.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fb4726dee89e6a6d461d538eac873b52a500f77 GIT binary patch literal 463 zcmZWlK}*9h6i(WSb!8V3^yW^&z_uU`<`55FL>MA?8^zEjVGT>0u1SS@@?ZE56!B;H z2PSyxN$})tu-i^1(}A!rFCQ-<-}m0jbF0+^8gB=K(X9o*mpQCp|0VN7ojd{phJZj~ zahO^|3jzyJi`Y*PfLFbLF|78A8Pkd6=g-U$;9K7;>1%z@bHdicj17=p=64B zd4$K&h{_P<6d_!GfVq?^zy)%L=>I%}OYZ;k1)O!a;hwHyh zU}!b>(ozVP>WIcVj;35N)!gSQ%1c@a7O7ZsHRVWpF-G2e}a@>8UEA zTs9srQc+Qi-0fa(?Z4Q1=A-bQG_Gk) zHT@Z*aBU{InZDc&i#QLptQM>|J{}9k(%D#-r3g=0aS{eR2^H6DJde|( zIAbb|<_q4HjF!csv@Epb$&S)=N$eOq?q=}kiyLomwUK>!2g{npstiqQ6GGYzAOWf2 z_5Y{s!TM(HZG7JS^5Np(;(6@_mtJt?1*dL%8=OIHKdJ|#OMCmu-fn@A(a(oZ>IcKq OH%3hI(UO&Ytn~*spsF+g literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adios.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adios.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4cce1e62bbdbbe95dcdc131ef5e0f3beea59d73 GIT binary patch literal 322 zcmXv}v1-FG6qKBn1cM=z4qXbFN;25mL+RQMp-Z=55RRo zoiCK)mWoi)(Gs+`az&hH{epCy{#G*0d30X`+baHGhat23+}#Fh2N>h_Cc+mj>S%QB!#$l`g literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-afmformats.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-afmformats.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67f3341fa66c1f643a2910b1a9c9ef69759ad994 GIT binary patch literal 350 zcmZ3^%ge<81c%jp(%qOC7#@Q-Fu)9DeAWOmrZc24q%h_%bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wX zNl|8!esM_(SU?{{>LOgFS5Wzj!zMRBr8Fnit_T!1ApaHX0*MdIjEsyQKfk%;Y%;cA>@V;b4qCfKQif;r|A!qc(T|1`J8a(GVf< zfFtHTA%J;%e=zize+%KxmrFy`?4?Rdp4x;_OOrbxxoH9_MO_t!WvSBqI`o_UoBFCS zmbOoITv;JaJW(n$+I4R_j%!|EPOPqKUQDNvKn^8g}(FAzro_NUgNV|u}boD?S9B@X`bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wXNl|8! zesM_(SU?{{>Ox$kS5Wzj!zMRBr8Fnit_Tz+Ab%C>0*MdIjEsyQq!<{@FEE%PqX!&P X7dWJ5SX|^#xx%5+zzTvz96%iaV-{lP literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-amazonproduct.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-amazonproduct.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..086a1236c7ca26283ed56e3fd71115280c2f1796 GIT binary patch literal 719 zcmaJI(s8G=!vgsKiq&-0;gjV8)B3X_-B*vSzu?Lbti+8IPS`C1k&fl@c;4vE*fW0y1D`m#{eF_}tr2qHTvpOs8V{eHaZLm{ zCn*u$jd$*e-WeJ8>$!id^)$H9CYV&1X%!?=38_-s`o;yTwc4}6#Aq?&7>van3`*-F zg7M_%$j=Z&fFo_vC}9?5RJM#EYe~ZLnIdGR^oM@E^Xy)FNABcctu}T< zsZXf9u3`@(Vc1i>lu3jDZ{qP>2TLKbfG#gHD#h)hcxHmVs-9MkX(B z*?i5g!Z|ZoZ*^fjbN^g_eIGWiwCZ%&yIZGJXin+fAd^CXl0~Tv+P~zXY5(K&Xg^l0 zh|$a{P?wis4#2Yzwa()?sCj%Mlh{gxuw;D7Qm`>CE2%89JO@KFHz1ZS3yv&`))6&& z+1h_StR6oe6mC#*I5g`nx97Iqb!yS~Ja6%(@2xFJqx_9eKNe)At_ICAA6(!Qw_p8- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-anyio.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-anyio.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f869dab0614daa61bd5c40099d1abe5e21102f0d GIT binary patch literal 498 zcmYk3%}N6?5XY0|mG$HUc=rty z@iBY>1y4N*p1c*jc{1rLI7x=dB$?lz$wR#!0Bg^y-Ttiyz=zxXng1Jnt=ZrX5YPhz z5|6{&>v<4(fO^EghX6d;Raws`wNucXxmLk}C_Bd}lfooSXp|sPo5(I4=>)hf*0zP%cTqsg8oP0n=z8!MaF)>s-$#qGU3{j_klk&DwYtVk3K)eO<6cu4f4jzOsFm$GCXPWKqnsnFhI=6g+ zH$OrA4*z0LfU!-0$End*$@@^%RAoM5D>+b!V=7&$@&t+)nvRSl$@WFlbT!-pORRT7@wAzlUiKGkyubrsaKGn65^-H zd`mo_(lf8PBoU~rNUyXcGpATDBR@a8xQH2O!Yx*izT%Y(pF!sRN^`f0$xF_9yL$oys* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-apscheduler.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-apscheduler.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe6d3fac0090b229b3f606ef14a2eae1f70b4831 GIT binary patch literal 862 zcmb7C&ubGw6rRoQCT(i!QiBymm{T#(Y%2Y6D6!y4geryh6avd+XH3TK?rdi!)h!6# z?9r2Y^i&Z={0qGJ4tlLCAXI+2zg%}rweX0&WT3v}iZTBNhPDA!u~=vDdt&aU5Mv>z~u`-&;dA}tdf z3m$2OwZJrqNXUH>1PKlVp_n~qeqRfzmhn^3DJyUxjYJe{$-7-9m0RBHafN$A?Bizy zsxYM)#iUDkq%@vxx$17Xt8V#MK1t0?7km)}%-5dkcS4b~Qfb8(apHwc6G}8muW{u~ zLY^X;t0$bPqpKuVf5&LzwWEbN$$J57m}~1EUUS#dxv9o`H6xvsFo;zAkfn1|`HyR* zwB&hI_@0+8?j#Q{>bQN)1LfvpDGB>VGGDT^!K8N14Y>9=r7YrMETmQ+(HX?hIe)O( zhD&T~*-uz>a8M5z^LuqIM9@BD(P4X=ciM_;R*#9lPr6LCy(#|QxTEI_*bMJ9l%`{# zk=yzdaW_uRXPT3{*^&-)&VMQO1x#idhLPQ{3@byqxndZb8TubnMAqWKygpdGGc;=> zvzDQvv2j|uIe_<8V^~@ll~yuj+VxZC_Up>K@T(p;&7spAIn87H*#0p=htBfIS%zbE cX;58y|6*8OA63_1KFXi00u{$)ubYC1y-Lpoy=LkeRsgC^50-uUFSw9NRV z#N_PMyc9o8##_7@nJFo$d6~Hd`9&qgD;Yk6^!`e5w~EP2%#A52Dy>Y-D=gH_Nli`8 z&@IW&&xt8Z%`1!X$xMnV&MZmQEdUyon4Vf36JJo7nO9trn3I!Q6rYiwpIscEoS#=x zl$oSoT#^D7&W}4R9cyuS6HZ< zlbV{Gp<9xlpA%D-npYO%lbIA#oLQ2pTacKXotU0l91~wqnF%vK9&B)Ya(-S(QD%~U zaY+hTKp#Zvf*qt+Q2C3)CO1E&G$+-r2oxe9Ulr>Di4V+-jEo!D2Z8 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astroid.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astroid.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b39c4561103b38d44baafeb481376dc6482b12a6 GIT binary patch literal 758 zcmb7B&1(}u6o0duO}3I1tYD$JcoL!}kx&X+X)cyjC`C{UE(^;bprg(_p zAK_eho(&W>IHy zfQN0+%44XTKUAo$XN!IkhRl~P^`z%M4?-sX#Kfo*8<_rY&YTV??hJdgycy; zpJYaldqJG(B6#7GS-}EJh>GB}jc^F^uiQ&)?O%#jNXi)11_kLVAXR<)z`7{XluSsG zEvUmC$snu~uBKHdSt<4+Ce+*4&sq1LgRUd_Xw2fhy++8G-*3ny37vfw?>k#T&k=!S zjiKicyj><7cQ_7WAw8T0cl${)5U!uZk_Ww(khBQ26gK8ehU0Vde&|I#>aBAN%eGL( zO@s-2?L19)?9>^Ybi&h4n68C6khL!P)?WQ|>q~nhZEoZ`5HiKvuw5@_OOM76=hd64 zFVQSYay2)u23WM28S0ZnX7vL~SsX;egiG-O_+@pYih!JEpR~@eqN~OsULoWd=<#Tz+Y!R zv8ObNA$uTOVDDCmykt?1L9yNEHL{IPox51aOF^MMHnRSGLJ`I)msnBY?QO_G;YcD? zB8IHaU&?n4MmTes`5rf$4{j7QV zXk2ks50Mn*qT4u%D<*t7yiW`x7dIa+-Yu?$oL#qw%WVHBnntq@oG&$k>38i#U@%)C^sRwqd!Bhfx@F%^|mt zbyZvod8~R>h(i(DI(lJ5i0ZoJ@d2EXG~gUQx?i$YtAxFJ1KI}%1rtK8R=|#9mJXqP zSlTtpC1hY&a8+$ztwK~H|2IZFl|Dm7b8PGx zH<|U5*>>aex}V$$k~^K`P7lyjzOP>GHn&>Yt}yoI`1P?rb0-kiJHk34#pS!=pS3D^8uJ5HF?0Md}h{9EeA}l!{nlzOIhrKH%(gf8~$G*H~;_u literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astropy_iers_data.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astropy_iers_data.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..635fb802021630ecab6d0b1d4e925573dda7bc63 GIT binary patch literal 365 zcmZWl!Ab)$5S{E=ScD$*A}Dwi_prM+1rcu|LJ`4R350YL+tBQ0o1}%k`4|3yBK-`1 zpn?b4t0!-T-g+`wEeO6$hM7s`@n)X8-EDAqJ?afF1AtGTY!Lnit78{D0t1F56sV67 z1i%pso)Ey?-5>M=7T!U;_2ttTHM_ZzlINB%YALxFlAC6S8mm=R6T!7^;gJI{xU$wR{73QEc1* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-av.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-av.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0275702c98bebde8eae83d06c774d758a1f64136 GIT binary patch literal 1418 zcmZ`&&1)M+6rcT)RXyr`|R=z4+8O`fx2l-_Cn)X5Me!ypP%6 z6eW#-{#?Ife;_0D7h6n8oJ>yZ973;OWsUo?FN&@yo zo8u7{E$I->9RrVPA53>zG*ls4GCjw^W}wqn)%C2FgK2aLtmC;( zjeyV^fz6za1HEaOJBE!x2Xz{yYQA9x#B0!qH`@CPM!T?etMF-Yv$%PdG}=XnRH=F1 zB)B>OEC8QsAYLIGJwcDu11^Bol(x_Dz4LNUZA=Hu$Aq46vu&|ZjsKZ{aSc-C{1kvx zG2%TMi7ebm-1bN#Nuk^-f%EB z>l=aRIa(Vx+S(mb)hG$@#-tWh)0=ywK?4Ko=<9XQ+o8JYH3FYhOEj=X8zm+;pd`(` zv-C}e(7^QE=9a$%m%a~7Z-MBb7zw%bf8t~@|BryOi!biK)Shdg9+N-@1)+60r>Y7t9a^x1=tmcHHlYMMZi1!e?3 zYg2UPqM;QKhZaZa`0W4nB_>!qBBf3&3pa?{^!$KEa&yPls|LkUlFgvneuiP$f8w*p zA4!D5E^7u<2qqGXl>UzVOAL|&aVFm!Kfx`Z6^OkGS_Byj9LL3Z#HBka_MM=${_Gf{ z@B05gPIAj#rC<06#vh-Ah4P?K4j0QEC6BFk2dAOP$-pWa{bePX|99bnl1Bl|gbPMrkP> zXQ!dD3T^x*@d)v!KOrNT5&p zkP{kMFhEx6;J#H2VG}>2VZ%0m#U<}&r07NsbGJ!R$H#7!2n9J0Nu|Saq(Z^hUpabE zI^2D-Z}aE8f90{@Vs+TSCEV^{#%bY(tQx;u2=my+}Q#B#1NwIb>hKd0hBK<~eV6>EWQ=&iWX8^(?29gZQjD#?dU0 zi*+_WwcYAnqzdzExf`yDl<`ktpM;t!k|a&9%aS?;u}T5S9HirR3W}rUer8^Jv+*|f zIyYL+i#~ifUf-Fl?~KjD#4HR9fz?wlpT2TlIPW$-6vtX-qGi5pkJQaG%}C;-o10@T kKhg5Tqmf!TU0leIwXKP^HLQ-*;&eq%%L6TL;bl?gZ{vH}ng9R* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-azurerm.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-azurerm.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c49258347a2db47db45fc8ff6cf6981873a5288 GIT binary patch literal 505 zcmZWm%}N6?5KcDrmo0*V#hZu0MsDHEd=0ENdZ2iSV#~lJ&oNO%A=$}1CjA#ouj;ea|(|&@vZ|cBQN`L zl6fJOm|%(XIVQX?CTT!Dfh7}XjEe4TlCelg90Zgv*0vX&s*_LPZptYSPb`>Eaq6dB zuns-6N_pid+Z#n!Q^^8RZO8Gs;A&#P^_cmXt|cD8hi>AN?rypf4qeI9j7Aq1c0j4$ zwq+a#Zihx4cb_#~!6da4?4RQn6|VQIBk%im&yOR?S#v{3@=a`LZU1yxO|s9)tzxhm zH&s>rh{989h#-W+B>;C}57htfS2W*KyRz0t>jSht1PHFYm>c? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-backports.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-backports.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83279eb472c74555262e1c74bb05073aed82e508 GIT binary patch literal 242 zcmZ3^%ge<81c%jp(mRLB z(`3BGn~|B4lA4#9TaaH=QoNGkGf3aBba$(myu{p?lA_Ye)V#t%-JI0am!& z6tI9kh}2C2>Hu4&S5Wzj!zMRBr8Fniu819IFUZlwLO|jJGb1D82Mq=x=?UBoydYS_ H3KRwaGJQxD literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-backports.zoneinfo.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-backports.zoneinfo.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8f9859a6ae9b73fc7000b1a48cf102e70eb0c2a GIT binary patch literal 348 zcmYjNy-EW?5T41!a0IRqYy^poffRRXMZ{K=C_=h$aBObZWXav`Wp@*~R6c@T9zlE# zU%*nXwX!=%m&)CPfZzNvAK%Qtyaz!SEI#|A*|-JplF=+of@c^q1*U1YPRmW^7G30UJRmV@|ozRA48BGjUTKw? zwSt5VIvA>^DNUipJ%%1!2VZi`z5jp|bPx-LKu@^|dK`dJZ?;O{sW7Lb8ABfe|ky|{dR0N#&a_6G@V37n$|A{B8i26hsWjPLZkd#R?0hcyJnOhJ({r$L*JNjY}?9LjdC@=W)||ybc~rn>sVf`)XXw- zG|Mumx?$T}Ox5kOL(Rf0bBHIH<#eW?fn2H7PNGYe$sFA-RkHOd-3CM5QOlZRRt=S> z#grw>)-{V|f$@=7Aw#ABdDlR#*mD1UnfdXnr{DaPf0F<0#`8>Dp6bX`haa^@lp*4n z_lgFAq(vyVzu#`q3*&})`2~#`bPNED-@jBUb%(}*aVO5pj9v!S6%L*S0;&9!OdsB8 zC+9oK`L=ke@p-e@^^=1fUM&D=$Cf)F6PM{Y*rcU;YB&Pz^|^YJgCll%aIbR>Xn-}=l)$$e-*Flx=k%G7)ajodg^2Sw!@((_G5Ny z{yo8Brasz7^lt_LVuSQ*;OeXrz_O=Y%qWDb(=z416*r_iwTi*q@h@v%_-8@kb!iUe zM~m`Q+$*QG+m2~5#XBC9-vzI;bi(t-%(`K(yJ20e+9pveuDoFqVwBBN#ikB(gG6&Q z_5yhg^>*tdyi~Huwq;~#3S97O!e0vO|73gKuY!k;dZ8{YE<&9%;ZyJ(?x_U(lP zd>8l7DH=s$w1+O^Y)=Tu*Luh&jg{Ug3SVke_jaE>{6%d`lO1XDF!5TNZb{SKtJAII zCr!BiSgPki`ntQqv9EWF%q b$8UGyxBVzSD%FZ#yAak(KqxPs*W!NwJ(QYFSLMV>*P`b85=+Z3+ge}Ro8e38%CE!l|i+)1sck~B3 zd(96RGBs1Bl)i&^yyLj{?jubT;PG{{tbQN>`yl?|^$CZuZ|{JC6=1M}E6Ac}FdMzz zCXY(3C#5oz+Bt0(2B zdDC!1YM;##s-!cbK-RI-00qweQq6UDjPF{-whg~Gu{RAL+iOq52tqhqMeu9@fnsnu O{T@%>(op8yZ~OvnabOex literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bitsandbytes.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bitsandbytes.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7a48a3e3a78c90ed1e5a6ed221ae5de5b67bca3 GIT binary patch literal 407 zcmYjNJxc>Y5S`7%5WOUoL`b7p2thB`8VR-{1QG1Q$#HkPBx^Rim)lKXQ~57!trYQR z_y;0bU2A1`kS>*b`G7oThM5O5?=kPy>H!#hopt+Cb^Zg98w-6l*qI`5_rOhzqw8Y_YFfnV3F%C zpKh)^Bj>4Pq6r_59Y#nraFh_tn-V_tx-|48Rm6#dXc+W~^!!-Ut+Kz;G{?D0Xy{6X zSA?5aXV-cw*2{8d?d3YLjdcDD*)}D!5JFi4Pc`Fk?fo8e{l7CeEs*0+wDpg|Hqk{Ikikcu&E7 zY=UEe0fr0|FouN_JJ9A1a|H2fWAC?67z zRf2`)MB5HE&M=if+Rb|DXZf8gjm&h}8EeW^XJ3e+lCD`S?K|tm*DbjyMo3HF7JN%a z)e9NrNK&HC!M%aOL*DtI)<^R_W2#z HGAkbe^Kzxv literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-blspy.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-blspy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4125e5b31873c45e0dc47e3e4233cb9f314f1857 GIT binary patch literal 908 zcmZ8e&1(}u6o0e3`P#N5^q_4K35u3TlM0@UwJoh+3q^$9mdLWnPSa^8yXnrR5~-Mj zM-NpBEh5-cReI^syZ=A}IfOk4g5WLCTTZ^&n9%s_ax23#S-o-E@>5<$w$S8r5yC1|uAcPUJg><@CdYUgd zR;A#3wK{e7_OhJP(stH&U0&Fy&VFHo6$^s-G+VVwyH=Tsf?2IINB9=!)HAnTcUPDt z*O9f)3*QbM^HOKS+H=)$$Xzr*AAyn9vmizj!TR~ zW;{?_5ol%Z7K7{0>+6HWxth9NOuN^-bl#Rfw4xo ze!}DCD0kpabCkO`LDRdSl1H7?HZ$#p&5vy+yRv(b z9((j=@einop8N|0|A7Q@C^-q9yk+UFCub5@sNzfBy@cu5uoAOkFVQadt<6J%Wd(^nE?PxpC+j3TaF?s5<$l?M+Z4@~!)A~U$ zU?HCd2(ehi95PwRWFNs5-+*iT$wR}pJR=H66Y8IwbX-d9ekTe7*BDcOZ0tKdgEk`*uTzmT_!J8@GoFS-eeJ`N6e(&o+jJpZ$rnozk zCFL2+7l2$B<*yUGp5pb{B2pTsa=rv`Jw~;-zLlU>ids2E%Xy8;>Yj{ zRB*aUaB?ej>tu3L@b~_NU&#Btm-o`|AA!UB$#gyl0KPpr!0{HlQ+GT91BN8zXoe7U zfFsskEbDO2APtQXEtHf(&S!9ZkleYthxz<=J>Y0E{vt_g^nvL zq=^?wEsgd~o1QN*udwq{`}FFZ6f`GRS2ZtIt4MO5Eh4LwBx_!*$yB7o2+O0AW=lHf zh9qSz4)RGWoMfu7TBKuRS$i?|Ir8(wWxdB2xnh;%m)h^c|H(uyZ3BeRHU@OIfysaW V!ov+7K21LG=o60~dfqg46~Dx5VQ>Hd literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-boto3.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-boto3.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4aa9f3091e22461fc96736b5f88710a42bd1acf GIT binary patch literal 560 zcmZXSO-tNB7{{MUW^7hm4?Vb`HzTbJ-4*JgP>NSk7ZJQIfskaTZZMl!XJ&<@mwp6q z`UzUZkKq^Cg*`}4f(P*y@#d*BNkznGUii=Nf#+pr{x+NQpzZoo@95qJxHE?r!~eyT z(Bd2@P?W$B_0iDkTL>&*7PbB$fGfRftC;BrH-s4OHO&j1wkbnH+~hPRE+%iy>EhvrDry&?w9s^_fLqbElSavmlk)ZB&haVJsSS6z7R|%F7l)pV73++G=r}lH((^}I{F2hIlKBx&m59R)sb~c@%-*TX z9c9nXkGi`pv7mFBi=D5F!8Nz&&e`&9rqW}N^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-botocore.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-botocore.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3d5d3698e4067d533efc0dfc40deb325b25eeb9 GIT binary patch literal 507 zcmY*W%}N6?5T5L|x~RQWRPZDsg<`u^6a`VQBGe!7wk#~$P1**tn>9%b?a4>*rca=V zkKqec=t1@*c=A^8=E+1Y*vXgS%gm6OFL@{wWsoq-80lb^T*z7;@d9KMVV8Dn$ zj68%4w=}mr3xNg1!uCA^c+&gVgpG48ohaDFo9bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wXNl|8! zesM_(SU?{{>Ox$kS5Wzj!zMRBr8Fnit_Tz+Ab%C>0*MdIjEsyQq!<{@FEE%PqX!&P X7dWJ5SX|^#xx%5+zzTvz96%iaNfKha literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cairocffi.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cairocffi.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27ac5bd1604f3a2c64cc0a43af1cce23aaca549a GIT binary patch literal 1655 zcmZ`3&u`mQ_`TRkoWx;W(lu%6f~yUtv`aeHiH_2CqGO;*-G=Dcm0}P{5|6BUl4#_fC^No0~va|PxjH>r*jov<{{H@y1x>T1C^j0 ztO&9Ife)a7%0H*RFX`J|a;OaCa2crn-=G``0m_Le@)`JUQH~+)?yY zv=KD&eF}-lw{f;_w-@VEgF6}-_AJ9j6wusHmyn1vv{D|4!xnNJ#c5sd$)hN|cWy9N zpGKo zLU*sh8hFAz0yT)jWaN~8=yW!!531o|DGsO+Rn(w7uEI4MeGR0eZ&>?b)Y-8yb#wM0(>om4x;kss&CCijbnxRUh zPApW(Xa=zqT81j!WWgmG1uM9|AiYl-OG6^bFfFNMZc*QirzS4 zbe5oI;?1c>?8In!N%}DRQT9qB{;w=sG+AoHB8@<`-k7P@(-Ur_==CVOWofz_=rXR) zByRG{`t4q&IIE&6GE~oqV2+;EO$@4;Gs&)-<|e^B)nfLAVfxtt*Uwr_T%n*D3TCb4 z>3NA8r8r+u2r`rk6>^kyd9MbM^(xxOPUDWa;SnT89I8>}hVpaXHodh_nx2C8N^0R0Z$(u%=x`HO`d&6%_CRvj6SA7^xg zit8E6H1*szGPZN8S|LX?3uUTGaZ@QHlFL`=q`PCqd9M$7+H4DJg;`>$o?w>Y%*imS z^B;X~+*jy3N%XW|{e`9Jp14(G&@KhM05O}~mw@6WYj zv+daIPSA`2NH$9D_Q%CA$|SE=lNt(BT@r{?YR*IVNCojXT|!BH0Cnv=}f$;^JG zm0WBm7k8r0WV!=j=$eOiRvmHlr+Yu%+s*AyJlXi@%|EdJ14neRE|RJD57VGS3~%Gx{F| CW#5wk literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cairosvg.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cairosvg.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21cf0a3e31176c2a85aa44bff80590313cd21571 GIT binary patch literal 1482 zcmZuv&2Jh<6rW)icKNE4#lgf)$tGzn;R;;EiIO4`sZP@>l9M#1O_VJaTG#=vz3h^i zwF#W4)B~y_^-`%mK~&kGF5$n|bf|zW5^^ zj{ru0Ev?rVf&l#O8B=1mPw!tr0Dc1+(4YYn=$`>4z|MfdHF$-G-Wz8G8zCjs5EKD| z06-y)_u~F!-i2~eqO83wA_ zWlgo!a!of7p&`Sn*Ab>-Rn@UYcIz3gBlvpuDh>KdCt~Q8$<;e=smCzaxpfy~3(Kud zh9cXzt($e(w&a>_YBFgP8#S`JNoVfy zAM=_nPr9Q5Q#=>SH&uI+!AwGEe6khamC)F%NkeMWE0u=tKChytty?CAhzczgn{2YL z!FyI2IIex2FEQ+rjd$9}eD*ABAXMGV+LmRMc9FSTTGuNjqT49jRIA%+9g$MG$yPJo z11|fmmaCR&W4*FMY|Xz|@nm*7_FS`lEEXD;wqu~%_%ciDt(>%(9B~lBQ3}9>1Eev# zAl&tTham5qWEb3a{*MpEMMqrR%MZk*p}5oy9!BF`aTEgLvLj>|cli+?gHND4pX}au z=Mp2p1wZ#ik8`Eeub;k^mfuLr{ndfAGL%+&f*X~bXxfdP->bZ=zfI@fq;vh&Abn$) zzTtdya}c}PyMJ^j%zF^m+*H;{W&4dmsxV9ydU5wcW&~jPnlF0mZfyRShd)2uEA=nE zEcdIM*wI_r$bx;2X|L&)S literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-capstone.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-capstone.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7994fd0557c728e7eac60840888e9a697dfc0a77 GIT binary patch literal 353 zcmYjN!Ab)$5S{FbEM0pO^rk0qDcgc474a%U5y4vtEW1f;L(^oNq=mit7hXLn;%E2+ z6+G?LledN5dNQdNd@~tlhRl1(ytLabaCkrJ4^IMsFJEjB{w2#}mplRmiUds103ir~ zAsRd*fH!x3F$idQ2g%mAFB4Sn5+wv9HlvlyC!A!07p9I#UK*<;yGg=&@3y*@#^&yx z?#?V1raMw%oaql4QaJ@}IMchOvBDj@m+dLj;qrGwyPC2Da@}gAQnpar+e>aosvsB_DwYsXAoX=yy7@5XaDUmLiT%;qO zr-oY=mzd1(gqbueYrd1oT7irxX*JIiV`+Pl_!$2+H!SN-_hQ@hrS=>0Q<~U?Re%s$ e^#PqO;pD%4MZIOzdpiG!lFul42>sDrSMdvBT4}Wa literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-celpy.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-celpy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7343cfd6aaa97822c6a64f7aa12fef6279220dc6 GIT binary patch literal 342 zcmYjNPfNov6n|;0RACn{f*uEAg|;^bB3?xpB6u5t(j{>VOPj7q2fg_%^bSHMt}{C9xziJ}omRwfGi$a%xdYW?H77Ci5-v zfJ)E2;*vz5q9VQ0lFXc9y^Q?)?BXJjy|-9Fx{6madm!&6tI9kh}4BTNw1*t7l%!5eoARhs$CH%R6sr})&&wDm>C%vKd3PUwW3)um(nk=$xmztm+e4ClfcAD%H(Y3 z3C76CGfIhI&g4Ak@_wMXVcs+%<7miq5KdFRmk)QsAyLxAyx-J@?gq^~d;35AX}ZPd z6GaojF5&}w7TM4(o7OHuXk7zzwu07wUzebKvck2;_VRdHS>etH?tJ3TLov6wY^gt! CWpD}r literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cftime.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cftime.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31d82e54d72efb8028067070b4a9a55a1ca43e25 GIT binary patch literal 297 zcmXv|Jx{|h5VZr80tzZCVn)gkx+BEOQn9chqsWbq#Hzn)J4IpQU$Cs3{&iA6C*!Je-kPND3mo#6GX{!Fqpf#eXq|F4?CzQ=Eqnt- zd<#A=~NhAiBGv10bi6pCoL$`lR->2ivdr|t< z90?hEob{5oyTEqNxavmw|aZaVv)r>1A5TdQ5AwA3m zj1U^JFcwm)Cm0(dllbh&jl9s+vYXJT)3G_Feqd`MxZ9&q&#kkjtC*&C?D=i4MU{)= zgw5CB=>qJFNK4i%DNUw{lJWLGeB)%YbUZt|CYMtJ=BLzY>P8kqXtW9FZ~zCt^~2g2 gq?)h1TGcnJIs$~M@9X8kTIKH2h-sW<|M1(1Vw^1lvlWk#H(>3X!JNYmC2a5PJ z`~wv{$gZBe6?WUnren}Ac`tciNWL%cty0;86rU%(QP}|a)x{QRondvFE-yfUAP!U1 zM+gc)5h=VPfR8jb2uj2lp?-lBpFl^W^rsIRXt~d%JryM6)RvB7a>%G$R9!AY;xl)` zX}x=0Z{rqjEsk?6&h71?Bh^F0Sk@k+J5MTya~j}KF)r~~h=~le+ht|U2%#RE`XW&B z9ah@Gn%!Pno-?&n5JuFS%}h?IJ2sUN+?rEwZuQu}l1x$4cif3HqSCVch;3!;Ou%-9 zrvf%;N<}iFsk52$i2Z0?zS?}W8|L95X2^Rplb3dT9~|C~2V)!neEVdJ@IP3cxZn{ua3mo|Lxdmz zfq3wY0N&jF!!Y3CEp+yNeA+?HAyZNcW>ZcrP46-(Omo1bs<>gAmO@{5!sh6vzAB8R z?xjvDn@N*Ql$sjtn>Q^_HLtMplI#1+b5hWpSY6ekn9X7-1e?TGDM{v{n3F*^A||sU zE-9PRu`nbp>uf8ZZiG{&3ahhG&se@G^t_LE=Ss?YjW2S=D=GTg|Bv6%#Lg{4gwQeq bbhd!g-SdT`1&*HjAGrI8yALgI8au`>^I2#g literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-clr.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-clr.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d92910dd6ea2e3dfd9626b6442d30d69d18f124 GIT binary patch literal 2172 zcmZ`3&2Q6I{Jl6IPV6L2fqtc^ZnL#1ECJN5tyoorN{5&jqJ)8nIz_Ji;<`9?cy?OS zF$ty}a^S#D?65-))5gSMXoqe0{R1zRB`lvR?Zhn;m#U{dCr#QE_WXNazwfW-U!u_n zpyTh!>q?rQ{_!rI;XgRMUGM?$9LPY18Ysa$gx=Yw`ASTlfxrh4l$oC)059omk7p1w zl*h06^8vaCv|uTe4?z(2B>fs&3g;sb=K!^`Xw`=q^Wk^D{C6H8YqdDv_9=~ecAIaESg@o2*SR2_2Q~7mR2oXsUrQsgN%ldw4SjH zLtEWM`sV6&b#2vDEtDyX(tS}u=4zo_Rdv%6H4Wjyx?$Wm3zDH*SY113T5=0<&Ra8* zhO_1Beq=#YO-nLLs}ppZXXx@6kkQ+1s9$&`{;B+~ki}b#*_=I_qv#)2y5zT% z8@%xnw*5&*^+n;`I0acXC1Vp|Bnz9WD3p*T%AzG^x9=W`l`5L0mNg`_qR=H|3P$mL z$~?EJB319|5i)`#>bhYG7@3B)iL%?VUN81xcKhO?tzM#6isLS7ND-x~XJOrtv)iNZ zk?`yljfyV2Y*`bnqJc{;yCq^>)fIF4v^#jSdaYBCY{gPFGwXR^Vy~lI+75?QuL`1t zz31n0l2t7uvnAmM+ZQ)}l$$mx4z_ftrLuu7O@hlA$o0L5rXcl(axy>}#u7IK4S5hLAlS89VoQV)GTk zSE%EBstNpoyUgl6~DY6`Q8ifd*sn|OQ7+()9$_403U`dp?Qw^kxq9ILWmed zsDmP_V1!2bo0v03u=2w+4kC(uM!PaAVJ3XWgOG@`>Poh8o}R{11^T6^V;&`e5@u21=#Xvw z?v4~?vfk%>AVtA+i(MKAf)e=zbIoDVKi>DWl&8cfCGl`rV}#&-O>xe=F^R`sn|3`( z6{#fw9t1riJwHk5Qs2*K`cgN{5+^ z5SncRYEEGHzfECp^4DhT;FM;7Q0w+GPt$T`Qm)*$-^$JRa`WcI95c0*cg30(`2qz( BkFo#& literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cmocean.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cmocean.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1eaf8d827728a2e298eb802b6ca7079317f19d78 GIT binary patch literal 368 zcmZ3^%ge<81c%jp(gm3q7#@Q-Fu($3eAWRnrZc24q%h_%?m%-GapA?8Nlc z;+Xh?%1oH?@nD1Flk@XRiZYY*i%U|#0{S3Q7wSU2g34bUHo5sJr8%i~MLa-T8G*Ri w2uOTjW@KdiAjQCFeu2RZ89m^Ty1*ed!*WIF1rFnj9L85Tj2l=%um}{;0Bd(_rvLx| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-compliance_checker.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-compliance_checker.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcde162a6572bca720bc2303dc22449bbd6d2902 GIT binary patch literal 736 zcmZ`%F>ljQ5WZ)}sRJ094g~=Nq7qV4C1FDXRIx>sN`(XrM3yY)y+>lj_H*BRsYt|- zfq{R}e^7+z59rRq=%7p%8xvckY@N85wjczY?@sUT-rargd>=gT5+HrPx7+__1AI5e z1v%%3Wrl}CV8BQMDe02b>RPGYwFy|j3A32}4vs5F7QiQzGwN0_W-;rCpcm!b>u?AC zHs&~ea$Nm0XW{{L9k%uy>h2GdP`ArOAnReDt9<1pnqVv&x1Uolqr zIyP4@EzOfS$|w)%fYTwD^cM=OY;fXxVR;qRA-u)64UG-h+uEDl_&dF&xzg$*)Ja*% zqLeFB?#^l6c^IG>XgM15Y=6I*a83tJEkqI=@a!PijeCKLHE-q-9Y%ewf-oP)nbHxy zONIj>hAN~Y(=zV0m1ZkP+vw&$K;+|7_i+-XJr-@t%ZR{7QCCn+;meESrTF?(Oks(( z0b0djXf7vfW-{$Y16^*M(PYH9+N)Q~>(9nJ7f4zo9Ve=_YA?+wWW^}61f@5K8RJ=; z=0a*!I;NbGu8Eu0((Dl8I{QD{ave=G9rXs)!X|_)ZUXL20k8hYiz-~(Ed0C0=7Zvi zFzn|uKcD;g)WcY9_6|hGLSdNA1qt^FeaL$tQgwoIaD#3s2k2 zOiOGkuyF;(3XARhNCqy{t8TB3h}EbiL!niBafB8PFxmMNaM7XVn^5DYn;pPYNV}jA zoP!dw(gy7}*$wOM<>OtVm`u>r4XDi~Dgm-0LaobW3u>Dz#VWA^A*xumW;xg-ts0>$ zva$q|7Fw@unrVebtQHpe2o{4!(^_#>3Q!nV&ECJ4n%5;f7~f5&?%Hc-{RySCzwzf@ NPbPa0hGS+f{s)xAb%y`| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-countrycode.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-countrycode.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7a35c74c00fb2e948995771e891aaad7a8436a4 GIT binary patch literal 352 zcmYjN!Ab)$5S{E=3`#Fvg#7?<54*i7h%v&- z8mqLnQkitD^~6+ucH8kx^9oC^xRO_Aq@X#mRo#eUI!%-iY@ArF6`6@*M*4C{jI<&t zDVxxdFeED*xslJ-!Wq+Uz8v<9;6h0Pd9>r86f;1|&u;83x z9oa1EF-}!c!6Hkv%vsVCm-SMybCq8tN+Z)K8<}QYH3mWqm2}NWX|)z*`&~VQg=JZ? z^TRMfaj0dM(_}OXIHh!Era_AE5cR1Fqtwu?Iil6{2n!>Eb(>0) z70|SA@Jm}G&6nO$EJ()bv8)(oyA5S`Hg_R}^IZVX-~^oh_jhmm&cBbRUUlYGC$$6P Uufep|n$=oUuXS6tM{bxwUp8rbI{*Lx literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cryptography.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cryptography.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..162c2e1c465f1d6ad3b145e263230e1dec2dcbd1 GIT binary patch literal 4358 zcmbssOKcm*b(Y^Hx%}uatz>E~QMP4^lwu{0>-ZCYBuADkJCK|@Yc&gsI}(>BcbVO# zWHENjLk>b9AVyIjLJ^=s5jZXqpy{bT3UCiT?ive(*prH$dZUpZjGX$0(mJH9qA9wZ zeKYgs{pY=z<=5eG5W(~G$jtIzI}!Q^nK%!L@r2Z4ANY-ac2dgcB>g!>Xm?W)J0$sKYSL`DpM8)>!{ z_Ako!eu!kxD!S+X5Uo?BEA~#%?r76+8FIJX*Km zm?INxIC_v~9Iv#!X6=EL@_DiAb)vkI6aHG zn`?Sjk-5u_G#5*NQzd;Z75pdJlG$O(_GOepF|EUhmNX@w*0DJ3wOcbvK94iHpp_PP zC2Mv#qZHSK0@l-FT2I?O%UBn7*Muc0kA<|ZtI}dg$99{fIV)OPm$W4bYql@1EH7i# zW*W^d_chK^*>t&()>Dh=%v~&tS~+pxsw9h&ysV{^B9=8RZ-<4<(vl?Xag{^Icjw24 zwBs2k^GHup&kgSnmjJ*8MlLT@pdKI!-A7yX#Ds;Wr#YD)Q1{_ty9?JJLUU-?GpiCN z2%UdVw*=F%VYfYUpxt|3Id(g4s&HK)yK~PQVFjz2q{xC?DlB4k*tNSH-M6d}%^de* z?&_HZIbB%L)zTW4KmItG$2gNs>WY$ISi$nj!i==Iph-GT7D0V_8EXqdaZQpnJq;VI z3Ry@dO~@!R*}G9q7wd>o0+UTn6xZxNA(O?KyFw#g*t2U~Z3TmV0k1}?y@Gb=_l)LN zWe4duBaajmEc*KaY+W^vDmugUYvFQ+tM6N<(gmoUU*p*0EZUWX!E* zF{Jpu0+2MWq(NSAHy|zM=4QC_=eY6ISZZvZdlmx&zBhoLuNqCXgIBAvI5jiRx3w#S5xCDaSevH8$da< zht!nRIHZ1EV!0merm%v4rF@>#O2wk0>aSPziPya0RQz#CQn3aVzTc1XsRIJ&ghR`w zRR|=QqNdd~F0W*uG!^*_H>8#sg*faKx*K9q_KXrYIz~&HN=BoN6y7fI^aw1_i`3TJ4& z8tiaM!`iC~u>%wLGPp>BZu?i$stlpBLrz^2-y2giwVRD9`JS|WaGFUk?YT)p=qo~E$-4dOh;pRHNY3nC1X^7W@q_5|)D3rQy80)il5cC3 ze4PJCpWV%v^Xe6tl79i(hp_uKH$_pkZWraLAp&Sb1uFsatD;b){;Q%$rT*JNaih6a z5oa{Fn#)JIYUuw3ttimB9)2jB^pHglRlGGHY8f}U8;luMMVt2LQ7mT zTc)j+>1V$&W(BiFFp&TRF~meFbhWMHcW-}j;kOrz!L!hwd}I#JSc5ZW+jXn$x`ATV zP>U5x)R3D>)%Zb+N1Fa3XDe$N;~Z+-V*TQlFjW_C|o-P2}d#)`~Tu2#eC zHAH!V3&1*6rDLB*KZ|a*Y|a|pCro<8qRHtC4Pp#b5r$%`-mvBEthwBT3&0CE@^!t! z1X0HuM*EoAe$r|`S-D=h{<7+i)sTl`e*#rcYi07&*(xm&urfYYg(Vyg+YL6BMkrbycRTe%652J8JsJEdN*y^?8F;ddz5UJE4}1 zb2ZcvxJvCL$F1Z!qw9U6YZ%)0`Stgz?CH&6i#`3M+j#$%*83Ubrf9I(WU=cnT_3W6jSTfQp z2D@sqs}{QoVxp`O9jM07Zc0}C?33HZt*kLG8S$JM&sp)@!_Z6cse7o=9+SOfv6mdy zt(C8S4HAH=FY%E6Nst+zwBnP%ze9Jf`!*s~rtre;3IrjPfgpquKoHSwHPr5%fX!_O z8pi0j{_GQzzGKmM4EoLvdt~$Imm^!BnC!Sk8r-`?&56e!nZ55AbT_yiy?Bo_NjvbK4QKf7W374rH4EwrytH|2O8@ z2j;u;*1Pl1lk-M$zS@6cbM?#n#>i!}|BBUr1^9PDz2Aoho`(j^P@G3_o6Hr9 w0l|B%rcm`%+D)iQio|C(O0@*hL}E8VY2=&bX@I?)Ku;4rSCISZ1q$H50a+HG7XSbN literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-customtkinter.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-customtkinter.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..270583765e87861e040f5ab31630f1013cd35ce3 GIT binary patch literal 356 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 L;03`VR-iBdGqp$4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cytoolz.itertoolz.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cytoolz.itertoolz.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43c3b9169b849c4dae310d0a60e9dc3fd66a89ca GIT binary patch literal 283 zcmZ3^%ge<81c%jp($kn27#@Q-FaYF(!Dl`oHJu@aA%!uWDT*P5DVRZ%xr#TrvLru0 zr%JE1Br~VDN*KnCFV0NQODriZN-g%&WW2?jk(rW`nwObdkY7|%yprKF$jD#$?p85* ziMcT)MWvOgd4+|#IjO118M+_?W6DzV%3^#nlVXZ9OHy?U5|gtN(^HFM;tMJ>^NLFn zb8=FP;xqE|vy0=C^YcoIGL!U+OH#lB`XEvl<`AInB8UqMDt~d<tL8 i1ma>bAn}2jk&*F(0)vp^1ts$f0u~LtAXvl#lmYSdti@mYI`Ue2XO|u{gs|llhi-K&5A1 zaY-UjMUh@*}lb4tqQ&Ln~nVMHvsGF0T znw+6qlAoUwQ<{aC~xpUP)1Al74YX z3RplNMCyXvqgPP*i^C>2KczG$)vgE>9w0vz>jH@n%#4hTAEX!<%`Y&RA)^NzQWrR+ UW|&>%P`bjQ)W8aYMI1mK0Ff+VApigX literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_bootstrap_components.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_bootstrap_components.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40604b796c5e5c7fd947d34b03afafcd43aeb477 GIT binary patch literal 381 zcmZ`#%}T>S5S~pe1fdr}#CjKVNP25P#H$EJ1aBpi)xZj$e8IA*G;*l#~WfhUl>(peQoHb(04xicgeVJ*1=gN>5Q{;pzAsLZ@;vvSJ8Q?=v1%^?f=Wa*`$sZ hAwp=;0dzWtlfUs1b>=P(j^Co*d(^vc`J*Ez`344mZyEpq literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_html_components.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_html_components.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c4895eccde590974336b6886b268c991a6a219c GIT binary patch literal 371 zcmZut%}N6?5T5K>ScHOzAk@3KhuvZi3L;)bC?a?(3nAUaZfG{yCTU@BzJ+g~h>zh5 zRPeMX!IQT_Z#|h*3m*LDhna!-=I5#1-Uf%)!~SR|0QmID2H|h8JaWMUP@qUai3SKk z01VOK5dpk7`@tZf;Vr~lUp|ddvzsd+SZ*;Tmf$-sm}&MXF$FGcDR8dJN=YWIxsJnT z|E9i@#uC?|)2Zdcq=iyrqx}+1%Tt(VSbFM}zC6n$DKo35HItJ`A{fhy#407S8I!ZD z&xe`emL(O*$7IAzhO3%y=<%A^&6ig5Vb@r?E_A(5{@X9D>Q!`JDmoSHLi>ODn@#H6 hB18x+I)F~+aPn6_qR!mu!SP$vdyjheEiXE9E#DTGZ!!P? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_renderer.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_renderer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5281a6866bec8fbe88ca2c3c3bf4035702eecd2 GIT binary patch literal 356 zcmY*V!AiqG5S>jdL?IV1LOwtYCFxB;M2{jA5xkW^*k;EjWRp#IH-+5%3;hB``WgN} z1y4B%p1c)$>&a}jpl^1EnPK0XnSFNMJ?QXyIGpTS0G}q=!u}0bM_up$3>e{1kP#tZ z0TO0C5rBDje=xF`eGC51mq~rn?k9qCOmxhsrtw|IQME3kDvc$U3?<5I-);|XnyXT2 z+C7zFtuwB|RES(j)4lB(u6lu$(Ol=3r%_3ZNXxpxaykt-Vv+`02p-L_oJGTI9H~rW zP|+l(6I4-LHQ81^-U!EuD7DPS1EtxfFfcy&H&|FTYv-&Gtmb$w%@3I^RnWPmO$b?f dKu#8L{P%n~-oo)7FW#K~yVJk#8Iw-O_y)mYXu|*i literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_table.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_table.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99c6501c8ab3673e18e28d761458a076847a95f0 GIT binary patch literal 350 zcmZ3^%ge<81c%jp(%G087#@Q-Fu)9DeAWOmrZc24q%h_%bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wX zNl|8!esM_(SU?{{>LOgFS5Wzj!zMRBr8Fnit_T!1ApaHX0*MdIjEsyQq!<{@FEE%P bqX!&P7dWJ5*j(h$xWb{)zzTvz96%ia;b~?Q literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_uploader.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_uploader.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ffa09d97a1e3a1dafbaf3687ebd46bedca88af6 GIT binary patch literal 356 zcmY*V!Ait15S_FxRG}9yLO(z(OS?A(5j~2qh~RB0lx!2Xp=r}i(uLmq3;hB`_A~r} z6+HDMc=EQew>_DxF6f(Nm>Kfk%;eek_rT!wa5&j@06uN9h5H+n(35ajng~Esp@=!Rh~9A7no3a9lG7YO?y=- zjm=XTH=1!3=Ry=p+U{M?a@7m0tmeA7JWVQGCR#Qvt)|n6Q<~+G7J?@;TFsIn8z+is z8r3)}@Pw))ty{L0PdCD8CMqr2c%U@d6b9Bu{|1ZecI};&f;60-OZ!81OBETnbP+!D|*pHy%hzK z&xe%B^J+dVU`&ONak_qyoJCR*eU;c9s(?$kD@0GmIo%+&4OTvbnQ1p~pYC}P2|X1L z6BZ2y4rk2oI!XxcjaW4DnnBx>fnrXd_&w5L(!>2ESmJR8#=eMD9JFgv(JWCj*2&)9 zPv&Sp6m-bhVZ5qaLap*xn`sV0INh*dehQ310Pape{r~(zSHMt}+KQA6AlDd-NGf4NZG5_EPo%|EL`5!3a zpW#2Sfv27XPu>Q*?PRh!*q4`=FArY6FYnE9wm{?asMUS20DjD6g~~sf9c%Ie7%*ax zpf*B)tuC^FAZ))PfDgTw80n*J;mSSKHhxX1hRVH|Ge%++%Dj_soHHWJ%}^?lDVmVc zHjWg@A|Z+JHH~g-cDa97+@w-Px=;AIqD=Zd&ihi>`pMGiQH)7SlZ*=`-(hBi=8xCs zK^i525_v(=!N6mL#63@O&VnIHhe3;W0!bC|vMBCHT_S@pE9golTnL0QPnDpZx>R^k zsGIDqSzNkVx%abTUcFfU>Qb0dno-DxPE#8pG(7}#HipJ}eD5ASJ7f36#Oc+mSr|d=dZv literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dbus_fast.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dbus_fast.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28b72872fe57edceb9752b40835f5493ea36353b GIT binary patch literal 358 zcmYjNu}Z{15S>j#P9YF&1WN@mMUqZI#a4tv1S^j~NV03P+$Njb-5jLzFKn+;#Lw^t zPOwUAWp{AhRqoz-;+vgeW|)~bvoDUb4I1x9{ruhn_%gv7_OCNP*3J`Pz=%PK1_*%# z1YzqL0laBlVPIkV4!n(T6MCrI%{XHuQ?YE)lH-OE*=^ypk?}(!)s1I&d$;X%B~_x! zM9?V8WKeKEl)^A~PC+py6)kHnlzfG`nY+lZ&Y~(QBPE)aRHKp42+0axan7PKsm4*C zrjewI_;r#ElbpyXu3NgMiI)U%#w#Ug8cKziiO^X8Z@Hju7rl$s(wD;gkhxNZ+RSW( h&}<*j=@d@>zu6}298TSX$@zyHe!AhKV?^|H&kt6RY3~34 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dclab.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dclab.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94049ed57aeb112bee8ed4748913e737698f459f GIT binary patch literal 340 zcmZ3^%ge<81c%jp(#@F|7#@Q-Fu)9DeAWOmrZc24q%h_%Y-D=gH_ zNli`8&@IW&&xt8Z%`1!X$xMnV&MZmQEl5nxPE1cNj)^a*%!C;q4>mYHIX|zYC^JdF zxFiKEpbsK-!4A?ZsQkrYlbfGXnv-f*1PT$5uZnen#0O?ZM#c|v42SHMt}+KQA6AlDd-NGf4NZ40o%Tyu{p?lA_Ye)V#t%-JI0a*nk#;++HjUBt9@RGBSRUVUSX~z#s-e IMJzyZ098*)tN;K2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-discid.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-discid.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b70b255f1c7c4a909c4b91a75ca09230ea79db4 GIT binary patch literal 1306 zcmZuvJ#5=X6uu)x@$|#cft1+Q(6IFntU)%qWN?1axN&MDu2H~C%?cnW-I=08k;;*_ zBu^STXvpBHT?G_yQKUo0tZtW%R3V@QrvRO@3CJRN>YaWZC+*|Ackk|f_uhB!_=}>X z0h2#gcC9lBfPeU6CdsMut_%VA31EPs19UzM4y+5hP#1L(^0nwB>XI%&U;#au0shb|_6HU+(4?q(VnH~{vl$xP?V_vh>Y$ozKiYR#JM5G|l>+qJa7)27+9Wq*T>OSpDgd15jM=0QvXLhH6m zG}o*X%{$bt@@sz0qzuJ2s7c$}A@%CoRY~oNIzRL=x6g`dEO>rA|80B6^#jv!2wgi4 zY{y@#dEPUh@}|=SGx5T82qq2U;t7(npB2QYV!I}_i60|I#NaIB)K;rX8iDP(aiU=c zH3l+$G7hQJ+hSvUu01(*$gUeh63b1Kx~wg~f_E%8xWr#?l-aRzK#$wReg3@U5K^s` z0?%{GC&WD|@7k5JZwI8*Fssi@i}+=u!TLJAkukoDQT1H@itB!W#~bV1mZmLfv@g;9 z$!kBP3#=%AD*roXha!YtSL2)xxWEzi@9*xYt#q+~>V72D#;)ImoScQ5TJ(467qB@O2yI=DR3D zx4X#~H^TV`uUmiK?4zdx^fdgBGBTr~#1n7_0mQjWD-oJItM$Y)Bg`-N(K0X9MU1_) zG7dBTQm*slhrKY@>?c}-L@S)Bzr;HHV|EezESJRJU`f1C3XfL7#j3QK5id&l&7}By HlKcMxja+hY literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-distorm3.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-distorm3.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6821ec2d1f1441e9713d63105b4eb5790e2acb21 GIT binary patch literal 376 zcmYjNF-yZh6n>Y~8k%+!9PK0&OgiWgMO++2C?dF(KuB_Dd-RfP@2-Vx{)?_ois;~f z@DD_A$|N|s6}n~eQVsasdyn@X_rCA(9y^^DXuRzYMxO@2S5?$#{3YuHoh$(ZMhp@( zLO=8Tb81vpE?gvJ4*kt{4srQ#wvERm}} zZDS%8rsAq+7Q5HkWhzyur-VCKlu38Y`9um+6BbrP(@;<%pI}`nl(!crz9#mSm}exN z%^XHZJa!c4%wLdn;SXr!OR9)74dY2TBGM108Lbt94R;XpR0$gO^%k2(zlu)1q&v+@ z>onnb&d8Z)YgwdS9_g?$5kjjjpyM38|F&vEyPMm4_pR6S-1gpW@5A=)tm=vC;6FWZ BZ~*`S literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dns.rdata.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dns.rdata.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2c5e037f1af7df28cde2e284104a6f6ff7fef44 GIT binary patch literal 358 zcmYjMy-EW?5T3mg{Nv!Tv9m}arnn1f6hs9p5rPPI;o#W2U6LhxyO-U)z*+egwpNPx z7`{LRtE&VnyFj{B?j{EO=7*VKX1>3?->ESSzDp+5&sU_8$T{>qh>FcoYUN-y2=VkDo*wNE)hCb#MC9#H*LS!zpbx@ zHrO_*xH63EcqrvaE63dgLq-S{tSF^2`W5DG^I~vynh0DZMpZQx<8j0(&4-bZk|z@? zCP|NFiDrgICC*29Ky{LqHCxl9OM*0)!YGz?v?0qv$N6Y=9yT~G>&4dD>g)@(ZF$|F lI5gQ7{?_$Zr!oKq3qP8Y%OE3TQC^MQWH_zawRzEE(5Mx zJE`_5#w4au!nhO@OFI@n!L`2K&GEsm8~c$fc{(KV>1iV*BU5^p#vM8PZbHE5y8j#gfzRrjWP*n|f}PKAXw##@?HE?md64Wc7y>=W3do5W?vS zfQN7lK0Y0P(A%*Z8`~M$$#ETQQ68+ iJ4fx=qUjvKv+C3aORHmh<@;`C*K)gdX6c9PzwSdti@mYI`Ue2XO|Ke@tBllhi-K&5A1 zaY-UjMUh@*}lb4tqQ&Ln~nVMHvsGF0T znw+6qlAoUwQ<{aC~xpUP)1Al74YX z3RplNMCyXvqgPP*i^C>2KczG$)vgE>9w0vz>jH@n%#4hTAEX!<%`Y&RA)^NzQWrR+ UW|&>%P`bjQ)W8aYMI1mK0HLg5Jpcdz literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docx2pdf.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docx2pdf.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87d15dadb064caba8ed6cfd3cd34272d36c12bd6 GIT binary patch literal 426 zcmZWlze~eF6n>X9kSJLMaS((qmJVsbQN+z3l_G*$2!u3uZDTLFGc?~WBnScr7tyF)e1XgY3|2F1UL{uu@y2( zNho~P`R#}jUYMALw+AV1Usg-S&Q;z>xCrD_RvU-X%9?x{Cm#Jk7L%roMuuvAu z_SvDA1hFTwK~9o>-=TzrT}LoRy&*}4UNdTWJQBo7gRmEL2>1LnkJcXkO5G1xBC@De z=K`;Yy2{Rav09oh&7+v%0VT)TrnFUm!5cEob%fA-56~%^z{&skFt_jQ`W}4R9cyuS6HZRF+H_7CcdCDGq1QLF()UrC_W=UKf5>{=;)H7%q0Edk`%CjK8VzXySSk87l%!5 qeoARhs$CHq&{{?yE|vlkAD9^#89zud2^xK1fDsM6AXvl#lm-A9$Z3NB literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-easyocr.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-easyocr.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca58b23cb91f02bc73ffddf7a6c52a7aea07ba23 GIT binary patch literal 1413 zcmbVMO=uHA6rR~^(j+zZPisYxh;1Qi6R%1sXvN|WMeql#(Pg?b-7apjab{9XOd$sk z9y}-rJ&4d#RqDa3w}KassZBeMe0F%^35cv^`{3N-oCtjKeONa=1ra^5^)6U z_3(LTZwR4J>ZQGmma#qv#sZ>#8TUwMzV$HZ76G4~5q&4gNH!a)G&$v!`4)7-1lohJ8j%T zqkf|B09v&E9n=DnTVfSJNsT3lE~^Z^=5Ym!5TM2LSZ;a|T7u|uD+i%@qhiSL=BwHV zx}uT0sDe-ZmiwY($%I;XnyZ}Hranqz|4@$>x1ek9jZno{f)1BAy9DkLupOTaI$BHx zagXF3AeI8r_|WMfX3r8%Y{~d9#3{gi@T?DjT0jn}pz9rqp2x7|6XT(AKMEV;a?Dco zX?a^dN6(GGNFNPiKfj;`BbnS_6UVc8lFLe7EV2BpTO%H0_UwrCeJ?x5@^jhq?sQhT zl8qFIeUms$WUWHU%?n9jIJlk#p@uTGIBeLlR1bf^Ii&dqv6sQfojXqBu=m z9zYE*%#68S!GsYLM#R26;b zNiGgNJND9B?HOO|8LytLckXT=9Nt&&-}~V5z4+(e{)fYlhO6i5X4kvEp+$FPsCMC6 zy~*`e8_r=hL)S925yHD>@K>btH?6@A&*190k6Q|_)SIncx&hs-W~{Z0r3#5IB)U-B zVFHDX2nr|OoBeOi{s(tf&4X*^!CG51Gn1)su;)VQOnctaMd^AXt=bfts3viVS(j3l zcXI`wOQ8v9o||G0WdHyG literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eel.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eel.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2104236094817f2d304c53c06541b46000c91d8e GIT binary patch literal 383 zcmYjN%}T>S5Z+B%2x6dm5qc{Yp@*cWDu{R$p@`tE1i~gewo5nJbaz|Ht#6@Epoov* z3smqRISHP;6?*H*-D<&aewZ1U`DW(H_ji!N>rsE$b`biq$rkQkunJ9Zk0_#;qYMu) zMh*f@okxt&i?Lq}9O@47z@@bt)Tw{lVh30Iso)$^9aEx7e9Jhf$_3z6BN1A2i0>d# zA{~Ri>eQ-(>+&*JnwSKUyp)tX$KMmfnM zEvF^qlS#k<(ovv=;L!~7S=47qq?m@FAnBM4K}B&$Fxtaa&$y+FF?jQ#f=+{-c5~@qkkh_rTb|Wqqjb-D|GxM8 ze((Ed=|LjFA!t9pKC^HrhS2YHX)WC05?65PQ0LqLQj#;;e8dko$4 zeb_we2!sS^vb(r@NRPxWfd>cy`wbGUCp#)#3zCqc^8x>@O&`J%=a;^SE%n|m>dx{x zdsARbx^vjIkYb-Al6oKc@qQ~XBKS(5r&RCvR^2m6_;rMgPiJ2@)?51!d$VTztWx}b z0P+C6)r72%W5APl&pyQ7c4Q%wK3@N=`ccCDOD4PH@`Bt_Vt4L+Hom+UJ^$&&@&Dz; zbKFvLw--|2JnHU+-r5Q7Y^AE{Ccmg@OZ>d1^XFDitL4R#Y8E-}0x?V?@z-T@@gF(= zM)5fOxIbtTKPX@~DjT9y(yz;EA>{Uu6;c)rvt*JAQB5~p))a-5O+c6>ab8x4;r4fA zt7@qtmqkUMGu*@iF-2JgRZ!4fhP2G6CEAOk3Dy|3_c*@Y=5?*Ydxv6s!OJawNC#Hc zW!21+q6l}9LR0Jpt8#S*7i%{=D9YJQ=<&R(YfD7;!yrmkUArbrMCWCdZ$a{fqC||c zF3*vC;e=0ta<{DT)QU6^g>vUz2$2jyr*Ecbv`jbA0=j`diQL3Du!QCVp9gL;=TQOI z`r2-eLCD71>xZZia0A7oE}k>!Kab~k$n=R>aCg?!msg2;_3EfXNO^J8)HG%G8d0y! z&d77KhHR42YN@Jwh-FPR!Jje1l$wGuI*xh~udeQJ6N+q@Wvx=3 z(&=07E$GG&3~R_5IMaHb;H?AJtH-RtH#?$dfIx28SS;zJmhn7lZatrB(YAQ>SS`CJ zV)R&H&}BqX(#oRf1~kJ>pIbfal~0ixRWfxNQ8(Ltux!eTQEd97)0pdFI?(T%&QLHr zC#xl0hB6J)k~Q2USt%>a5|LV!1#$zTQgt~+io z1h%w*jMI?xMi67%7zp7|1JNOlFt-+^zu!>a@;{9L#`y+%xgm|>ycOGDkJ_lIzK>T>ZQ?P_Wry zhaI-qVL0eNxG@FPhw?z(UjXX<0#FZ+eVcih{Vw}c=7-Gp*&pc@(Nu$N)3i(T63q6% z83#so+F_?Hb{Zh*{(ITY{df1*b9QRPNsZi!Z1-jEjc-oeou~)CVICyEPCky<{J6u9 zKgrsCr<}f1x7h7i;`aERsr9L?gI^x`YUGQN`pV-$J9pB_owQ>UPHX}K9{mV!$5VG^ z)@OEutjP=3;D>hnq7%Pp#V_tf_lljHbaIn+Y|4p&$2fX<54twUdgqcg_^}-qoVZ|l YPh+x~jaE+fAxIoV_BG1WVr!P!-;V575dZ)H literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eng_to_ipa.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eng_to_ipa.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..747f9fbc42935c45626aa613fa733ffa1e4e770b GIT binary patch literal 350 zcmZ3^%ge<81c%jp(%G087#@Q-Fu)9DeAWOmrZc24q%h_%bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wX zNl|8!esM_(SU?{{>LOgFS5Wzj!zMRBr8Fnit_T!1ApaHX0*MdIjEsyQq!<{@FEE%P bqX!&P7dWJ5*j(h$xWb{)zzTvz96%ia^0j6! literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ens.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ens.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d8608205dcaae7513140142bd9127038ded5ed1 GIT binary patch literal 336 zcmZ3^%ge<81c%jp(*H9uFgylvV1OCQ_^bhBOlL@8NMX!j$YqRTWMp7sNM%f6S_agy z8i*kviYbLTm_d`}C5WrZcuOcbKPM+OxgHV%6u==pwAxgJSNC9F`3`B?lK@n1gkk~9smgBoRZq7c(cMeTdp$H*Z zGa$j(serohKkyHvs6%xtQ@2RnI&l{#6})%%zVv(de(%1mtvNu-ue;mHZw-JyDp`rO z49-8w;0r*&2M8jKKp#r46D`wy9Rdwt9T|rZfFpTp@eK@j%~f{LSVjMOY#?*vvVa=M zLN;n1%C4i!PT#^7a(1)?`Zm(ufYz1qJqPFGQHDECkMn|cJTFOkuj;xn&Aex6L@VOe z2fVCi{}iAIe%QPM3}6=F&kgaB3@F~kKDbC zj5q2AZwd7j(pvyqO<{#0qH!1sjWV(Rdh{}9JR$^_ZpBl=+#aQUR_bb&h6`aR4#L=_ zX)X*D@kp4;vLE1FQN9?y=mdF`1-z_AI3En!1mn2Z=9H3Pi1T5vopuA3a@<}n#e%RH zrK_RgVq6&0oR?|WV;n6Cp0e$F4R^VQtJaWTS7NsqUD%H^iYkJil(!@e^)+lD&0L2N z&hO~Zm;+@T0G&xw=_z3W7x(Kn(!TYhoe* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_account.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_account.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc335145d23980b569b7dc66e8c081e9900b4536 GIT binary patch literal 346 zcmZ3^%ge<81c%jp(*H6tFgylvV1OCQ_^bhBOlL@8NMX!j$YqRTWMp7sNM%f6S_agy z8i*kviYbLTm_d`}C5WrZc#AhVzo0TcH?<@&C9x#&7I$h%Mtov&a(-!EiJvC(E%AU# z&%EN2#GIVeBE8a*%$#DqjQsrU;v$f>w^%`XidQmx1{wA%)7>g2FEKZ!q^PtqHLtKx zHzzeUIYYN3KR+j?EH$qz#wRl=rZ}@CRkt89IXf{uwKyiepfVF?d_36T_~iV&lA_Ec z{o;}ouz)^@)J1ZZUP0wA4x8Nkl+v73yCP7)fIL^M10+5$Gcq!MkYZpoy1-zFj2>`^ WcJNNfy~v?*g+rx*6$FbofEoabTxGlf literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_hash.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_hash.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b0c6eeed4820b10158020431b688169d42f9989 GIT binary patch literal 564 zcmZ{iK}#Gl6vtmCyNi?^SX*$ZC#krw%8Z^AM7RJG06(!$)n$( z{RB$s$LJTBg*}wH_T+8Bn1L?}hwc!vDRHd)Ivj#{LYB&V3B<&u(7K>>GRh zZk8WFfua;L6rjuroD2sTfddRt=MDkX<@hB5?oHA9ru_($YW13K+N&SJVXr77`(OjKzrmh#6PNIaU#2=CPg5`9M zJd0Ki_E)z2ZGY=}!JKN)w_&I5AD3TprHRp#{#f%=`H2u0O4`!6&~?XsJLccVd^61OodTV z@)zBxQH)}dYsp8OO49~x+UUKuRFqE(d-IkLWY@^r=T@l+GmH?LEdx456$JmAvkok- zR=rQv>h`3!Gwto%xCXWQ6<(_P>l3^&#Tzp~Xz;iD@%HP_^+|Va+FiT(Y=>1CG)ZYc F%QG+-qr3nB literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_keyfile.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_keyfile.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99cf5241ba977c5f097d22913c41a835ec92b67a GIT binary patch literal 346 zcmZ3^%ge<81c%jp(*H6tFgylvV1OCQ_^bhBOlL@8NMX!j$YqRTWMp7sNM%f6S_agy z8i*kviYbLTm_d`}C5WrZc#AhVzo0TcH?<@&C9x#&7I$h%MtpW^Wm;xVs-GtFE%AU# z&%EN2#GIVeBE8a*%$#DqjQsrU;v$f>w^%`XidQmx1{wA%)7>g2FEKZ!q^PtqHLtKx zHzzeUIYYN3KR+j?EH$qz#wRl=rZ}@CRkt89IXf{uwKyiepfVF?d_36T_~iV&lA_Ec z{o;}ouz)^@)J1ZZUP0wA4x8Nkl+v73yCP7)fIL^M10+5$Gcq!MkYZpoy1-zFj2>`^ WcJNNfy~v?*g+rx*6$FbofEoaXYGt$l literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_keys.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_keys.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a86dea3053ea4e9f7f653feaf242940e6fe7a844 GIT binary patch literal 454 zcmZWlziR?96i)8WBE=g@q0&w+3MzNHbSbS{m4Yn=H#s=sC2H_~*dz+))Up3T3*B2v z|BU_v3J&GgPTdaNoSJAIO26biUcQ9yeR;2@xep{hO6|e32Edm(?4bV^tEMa-0R|ZQ zAb?#MXk85g4G;}$FA#ut8Cx(@vJmTk*{+U_4p33fe5;3LEit`l9J>J#2qS@#L(1JC z!V{mk90|(%la=Ok;ZzW7jJy#V5bn6+ znC^PG8+F%Zq?cz>yu5-M#jSyt-)02HW!Qvd(} literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_rlp.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_rlp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37944e5eeb54f2dc0060e8ad38fc8cab7230f65c GIT binary patch literal 451 zcmZWlO-sWt7*5(whpZq74n6I#2_3YXSJBw7@p{Cd?W{(U4K; zn`$DZIVr>5z(O`%qSl!mx`EBiPWD^AP%40B}0t~Yf1h}lk@ z;B60QrS5o9$SLmC82491O=eU0a)eVWPL}!e^}iZaj#iF_bwtWk2w`>%U<=Mb^Z(9v rfL5HThqI#bsaEG|H3JYXjO$%8STnl1{r06K(DoPQ-tpvg~cO*wIcWLfYh?AqEoBu&Y{4@Lq z6r8d;xdpm)@~*Yu_kQr+gYSFqz4(3)4Bn4M>9qs!ZJRCJzhZf8if14|5QiL%5dsG& zBF+K=5@320K5t9iYZfWKqXC)tF$7?|W2dfvyWC(wl+X9NgAdLTSu7EyGGP zuEI>psVeQ(rei7U6_!?Om0g}i0_Tw~tD1`0EZ~$TModZ`&8e72BQ}W?(=;e>GQ}xX zQC!q)D<7|g<3tKwvdK_svK|a=4$M{Y=Blu$SKfIpNyX_!*)@ypYbrFUbrC}CA)wO_ aIQj4GE_C-F{U`qE^}oFSL&sXVXDGiA>0{>r literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_utils.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..398e622b52b2784b00578dd3587076b4e5dcf392 GIT binary patch literal 342 zcmZ3^%ge<81c%jp(tk5DFgylvV1OCQ_^bhBOlL@8NMX!j$YqRTWMp7sNM%f6S_agy z8i*kviYbLTm_d`}C5WrZc#AhVzo0TcH?<@&C9x#&7H4WnMto^WW=^r6Ci5-vfJ)E2 z;*!LioYW#cu&7=}etvdw5y;Y8tRNl5D;Yk6jQW-CZWWW4m>W}4R9cyuS6HZ1E2OOduyc4o7 RawuKlP-S5S~p8M4=ZiLLb1IL(-dqidPYe2;Ry<*k;#e$tIibZYsI?7WxE=_!z!G z1y4B%p1c)$>&a}i;x|9c3^U*C&Qq_q11(1LamG_DL6`Z92vy{r17(1x^a zD(b3HDrKgX-Q0L~PCvuS@~!3hF)m1sjjC!^%x0lrEJ;HnrNDDm%<+g%u;zw^B}pubYC1y-Lpoy=LkeRsgC^50wvwup#F9im zO~zZi8JQ_5sd<^X1^GoK#VZ*;gEalhbhnDhOU#WaDJrc@%_}U_%}Gs7&d@E%&(Db| zOU)~b@ySezDb6fO)h$R&&Q45EEslvVsLaeOE=kPENiB-c$j{F%j!(|dD=ErM(l0Ja z0SoAZNZr(mSHMt}{C9xziJ}omRwfGiWT4GXBX0o3q^DXg! zO3%FFl0=}IBE8a*%$#DqjQsrU;v$f>w^%`%idQmx1{wA%#oa0jM$1ri^a85tQrXfQCEUtlmpMh`fo XE^tWAu(-&fa)m>sffWRcIDk3;Wtn57 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fairscale.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fairscale.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a31d2bac058c3d6794c3b9877ebe2f95dfa6281 GIT binary patch literal 249 zcmZ3^%ge<81c%jp(sh{_7#@Q-Fu(|9dSHMt}+KQA6AlDd-NGf4NZba$(myu{p?lA_Ye)V#t%-JI0aCsnVY@)w5<#36P?Y(RTKPA?V)5+9fu85uvwFi0s~U=V|# IA{L-H00mY`TL1t6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-faker.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-faker.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5f3b5a8a2f4fdc4f9ec3dd539a01dc347d9715f GIT binary patch literal 535 zcmZXQze@u#6vvahoQiT<926WCv>jR(T|}f#;txd7sT>~HB-+rsOHFdcI`zNsKTt&7 z-Tenz=pZ)0m^4=H1=OwqUJBdKg%LnI=7D8{?@FQo`e4avcjTmA$ zL=mpw$f{TvS%_n1-C%_7A&08i;9AW7>kd4Nkq74n826AvUBOWyZ0r~n#@{omV5PHE zh9RfM*GV;!ED5>(^;lp6|4e{)HFFl!xhgf3YzoGePNxmOG=37pL?z=V1)SzYOv8k6 zztI}rIxINp{84K+)+PXoDkVmQx>S?0u9Xc7C;}yQYl1Nzi>M)$(W#SR^&R@mR{Wwn z8(thlo>57Q#}^mHkaJoq8Yx4s$>XMXAgZ1gh8G(Ftq12^d%zbzNPhtHsf>*h)m3fS zz*x;{arCCv*Tm-V?OVzPX7;_BLh0KWN)>u>-NR*3GT=a_epPmCSV@ n=2yBT-y`{#(U^Z)>yUDnlzXK7VPj_-_icp7+D_Y1Q^5HKaSNS? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-falcon.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-falcon.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a80243d92d8a6833da7b932507edaab6075f5947 GIT binary patch literal 817 zcmY*XO>fgc5S@*k;FdaVirNTH6$fZq#c2f+5`x|kLMjLePEn+2lbtwA*B{;8w8W<# z`31n40|@vT{DD;B5c$f9n^A8)vCfy;@$Tr&n;DP2Z@;TLuRa8whMGs=4ZMR5drXx;{_VdsK9z(4%qO z?xToNs$^}(^&)vnB}101%$NWfr^)6ll6X8or5Amb1+U^LWcjPA*C>UH+VVUR4Kxq^ zMd1mCERtTp1B|Iun7FgTX(F`;1J06-_kr+GOGNLPzyL%2*5G7mK_{!zwylGwTMxZG zZ!f*csHR;(l|q%;?^F~f?y2&*#Ga>zF{)R!V!Hl%_##xA3W3t=MnO!q%q2{#R}8N-kVaU`|+4i~uym+blDR!D=EmV+UN$H#Sn*zMPK6p5Dko0HZd z@3a)xSdVGpu;E>(1T^TzYW2c-I vtSHMt}+KQA6AlDd-NGf4NZ6nCqbyu{p?lA_Ye)V#t%-JI0aolXww>l%gV3rHIf&A*_ULcA9Rw$)+=tmOu+Z z3YJo+p4x*#PF3mO;6eNc638L!so+WQuu{F`xE{S_26q8FfzrtTa-P5mhEDx3 zrK|kr)&2dL&|I8xN!!vePA06%@8p9!OQ14LZ$|> zsn&bZIoo2q;FPQL^cq&5L}v3S8sI@-Ec#EJC6a#v5KkN|AL{%1huh6;J2u;i&9>4H zTceM>z)&5(v!H63Y z7UD%CxK72_qvAigs>N_sz=?N6Lp2RtIf+NV@Ine8OAZDqXibg$S&Xo`pSzI~i+ zP2X?Fvz>UhvCs`gcDLT_yxw`c+zw54LX#du)uf@{srko1kV5f literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ffpyplayer.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ffpyplayer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39963045d3f587aba3f98871e64a11eb43b061e6 GIT binary patch literal 558 zcmZXQziZn-6vy95axj(^OqWvAKuDm(gPhDw$kNjMAe2Hkp(146**<(aDR*asGHLA4 z!CTi(Ev0`({s9{@1Wkd`p_?I_r<|;oB;;}Tc=z7D_xaxaaGVBcyL@#v_+tS4E)W0B z`WM{#I`|40Fk%oR55b$#6P1wUs6Tf zG>k^!fJi?`GcBY-2PpATp4lev9*WuGnpp^cTx-&|YG>Go7k U+tcRUdYK>R$0eYuil*k>0Zjj>vj6}9 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fiona.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fiona.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3025dbf4c18cee956939dcbbc9e7e04389ee573e GIT binary patch literal 597 zcmZWmL2KJE6n?VhEZdquH`bJnL7}iDhq&EoY_z?Ou`mX^1%pv7CDv+7j-?cmQ~$+! z96fB5{*3(rX9PBU-Dx*NZ#_+RFs$s8^d8@n9^ZRU-&(B)VDSCw5!drKelp9KUs?u^S zY1v!e3OS`r@HmmFR(XRY2@^DT$|BVj+?2)N25(+_g2bLqXLBZ|(?P^o5Dv7Ik$1+# znK$Gop5mGf5)zz}2~(b*%y}*CSE7C(g--d&zS6V`?3Z@1?k<_%HV@a6I8NI}v-}1% zHKwo;Ld6cCAzF07AWAc=IRT{(-kIo-J{A eg}WK<77e)nG;8i$yj(W-R?WS0r(EfVQT+>=-=`Y@ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flask_compress.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flask_compress.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07e7201d5f40e895ab166a9ee0e9d34834c6bcfd GIT binary patch literal 353 zcmZ3^%ge<81c%jp(ixZ-7#@Q-Fu)9DeAWOmrZc24q%h_%>i!UuFu{b+EIX}0cD7CoQPm}qU zctE9RUU5lcPEKl(UTH~YPO)A_etvdw5y<9StRQX0D;Yk6%=?w&ZWWW4m>W}4R9cyu zS6HZqJ}@&fGJcR^U^KeGV2F$! ZaENyBUJz5e$f16PL%o3&1dBL;Iskc!XLGNoG#5UPgX?c5xBN?pv%Noy98|K7&mBmFaF3lb4tqQ&Ln~ znVMHvsGF0Tnw+6qlAoUwQ<{aC~xp zUP)1Al74YX3RplNMCu|rORu2v7l%!5eoARhs$CH%bU;2V)&&wDm>C%vKS(eznqOcr cLq-ocq%Lqs&9J@5p?QTvvw;-^i#UKf05UFTZ~y=R literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flex.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flex.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b6706f0b87abf22c01b3ca75cb2fbce45115d63 GIT binary patch literal 332 zcmZ3^%ge<81c%jp($$$57#@Q-Fu)9DeAWOmrZc24q%h_%wAjQQi89swd`IY2u6_b~k8>LTA7+xSg4zmnwp%U zTaurj6H}I&R~F-wnG{o;S(2(-keHmEn4Vf36JJo72{S$(Y;b&XeqKpYW|Dq!NeWm% zA4KYc+@n`e`HRCQH$SB`C)KV96cixu6zc$q56p~=j349}7>zD47$Tzw9HJe(6Vfhn Q$X?-)ZD0k#A`YMi08qGJ3;+NC literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flirpy.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flirpy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3d180725af2ea03f1059b82ffed90323f22c02c GIT binary patch literal 496 zcmYjNPiqu06i;S$bvn|E7p12him=d~xmhV9c<@hU6;Zq_10kDaXF@ZRY4Wx*p6s<> zKtF+{_%Zwf6+F#J=*incZ#|jpw$PWnA1^)>+7 z2j7rDQzWp6G_Ip*gi(ZKB;p?!p`YH@HjTyLBN`3A9H+01IUsXm$y_Vjb~}U-t!9?l zj({Pm0cjZr@>xMeUQYHu5U8ZBnI@`crD{sTS?wi`utuyn>9Vu}Xx(0(mp*GT%eblY z$(y&Io;$GS1vlE1UB2#@{tFY0aDU&^T5_O*0i$!JrR(pkHSb1){w}4$a7z0J@4NlR z0rO&;EkJ3PRsIXkhBfrVknPUUWvF^3UhNePs|&D;PBw>!V=X1G#$b#tj%0IGOw_D! z3gozD{D76x6}0WtO?kR1Ou1>ms#)$ptcX0|cs*Lyc2~*M+K7dg&+I+lH0;>zdRWF7 ogyW5&!@I literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fmpy.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fmpy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fc8372808b7a4e6f2e9e28e40f8c53930bee630 GIT binary patch literal 646 zcmYjO&1xGl5Z3yKI$Lt-p$)lo$f4Ab_1+Q)C16tA2I3NMQ;JzwWNGXb)~?o)*08s} zMf(ITrH|1UNTDa63O)5^$StQzt_>YYBW9TS=9`%>`}-kr^8MM>>}ivb-`?1Xvo~^g z?7okLlQH1|Z^$5Tj2i)I5Nz<~=YWuJ?){T-leb2s+olK36~0z#4pXIJFubmhfr1nh zO?3@cff0EnsYMu61+zjGRKifPc~!zqA*_MtgW-+ohMBdcIg8_&uvs zXjB`Exrse?81^|gU^4_xErqF&=uK*YY6OjoN@(QZY+V&rw@NjZJ7#(;`w{vi+7467$ujeU7%5wW(c(4kRj!$w?%j1j%X=dgRV1BQ(zJE>At7% zkDpaHSUqA&N@Ou6QN!Tt9Rr{pQW7Q|o3B1nYynptUAmJto2FEjjuB Z{^}gwb`C$C{OBD0>>Pb)`=j?bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wXNl|8! zesM_(SU?{{>Ox$kS5Wzj!zMRBr8Fnit_Tz+Ab%C>1BnmJjEsyQq!<{@FEE%PqYrEh ZoYEIKq-I!Lj#LThh=;6+bjC~2=M;#Gwrg0~U~Np{*U-DK0_!<5{ z1y8wp@)qc=CwHp_-^>m(!_IrV^U~?Gz~KF4FurjBzHG6D`xSHMt}+KQA6AlDd-NGf4NZba$(myu{p?lA_Ye)V#t%-JI0aubYC1y-Lpoy=LkeRsgC^50_Ts{v_}s)I zKTXD4ycwA(DXDpxxdr(}CB-WlK7(}qN^!S}$xFCPR{kyWW2?nT9KSnnv$B5nOl%wR8qW>;WNm9U&-!PF?or(F(pN%m8p4!g}OPZ zsmU3-AiXhVsd;5FKAA}|#hE3kx&?{J*@@|?#WC>(m6>_PC5bsXsYUS_`T5z!@yYpl zB}JJ@`o$$FU;%v)shgfunv4BO~Jn83qxR P3qmRl{2*Aw3KRzb5mQQN literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gcloud.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gcloud.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bb3c9b73cff1419cdc4658a4f14d08df52619d7 GIT binary patch literal 424 zcmYjMO-lk%6us9O%kcx+MA*WO5xG#QWkicmBCrTtDFZUjd+6XeZ=Co1n4L@iK-8vf z5&ew*KtT(cZL4;I8*$Y+hL`ZRsg#X7N#qFuUcK@OqH>%ET6ttrS6Iw>fw`1ilFL)w zF}k|&`aX4fy}V7S+0F~bY<)nTfnKqiI=2MPyN1~@T9oSz*S9uKjg?2kWRCExW|0fB zY7`~s*UJ@Le;GULGSau{xt9n{<<-0z(o8|b**@UOI~@OySzJMFnoLiwAC5kf+0SHl oT$XP!-QJl2qV`8qH8w7dOHxW(EEYT&>P`~7a2L%ekC;(@05H&at^fc4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-geopandas.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-geopandas.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..777779e4546fd255cfbf53543b984de0e37c2d8d GIT binary patch literal 377 zcmYjN%}N6?5Kea662)G;DEk1yg1ZF|3afY(p@`tEEG+3JZbQ?}Hpv#&lW$?4z#sH2 ze1Qs{_9S@nR_LuKlWN6pGQ-R;-#0@Z+U-qX@VeK{b{zmdZLvn6^M{AIO^_Z+iTAGeglEir!Il+q5R_kADLS<#5RW literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gitlab.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gitlab.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86df68065e740d16c44807fb34a70ac38e908b71 GIT binary patch literal 342 zcmZ3^%ge<81c%jp((f}dFgylvV1OCQ_^bhBOlL@8NMX!j$YqRTWMp7sNM%f6TE@u0 zuo{RVAc`r4Iha9{SHMt}{C9xziJ}omRwfGiWdS*#ZVv?UG^DXg! zO3%FFl0=}IBE8a*%$#DqjQsrU;v$f>w^%`%idQmx1{wA%#oa0jM$1ri^a85tQrXfQCEUtlmpMh`fo XE^tWAu(-&fa)m>sffWRcIDk3;cH?8d literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gmplot.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gmplot.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..489b071a3753dc838558c7241266a33aa148d87c GIT binary patch literal 342 zcmZ3^%ge<81c%jp(%G397#@Q-Fu)9DeAWOmrZc24q%h_%bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wXNl|8! zesM_(SU?{{>Ox$kS5Wzj!zMRBr8Fnit_Tz+Ab%C>0*MdIjEsyQq!<{@FEE%PqX!&P X7dWJ5SX|^#xx%5+zzTvz96%iagWzKr literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gmsh.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gmsh.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a825ca92545bdb20b3303606039e900b14c90065 GIT binary patch literal 889 zcmZuuL1+^}6rI_fWH+I0stuGX;+Bduhoqp;f`~}P+Cr&9dua%SO=hy0b~2mJPMV~r z96U=Ap#?8JRYlL@-GkQzatM2nf(P-o&`apa*`z@${+;>r_y70*`}61B_;?&B`FeNV z`Kbf&Bm5ajlmGC0DM$?C|SgB&jAv- z1H?28G1^Xa6vGi5{bXFlLsdVEwgE?V(9pL*9TFsF3D_}4StsVm`uim46e?b|hawDu zuvyX^n2lk$`7d+qDmrA{1gZG1FnJ@T`BCON4iSFRAu?ZaagC9@Ev2A^nj}7QDqh() z7%fz7Sw6V6VpB%2C0%Q;MnuyJ!{bf;CTSG&l$YEKm^pa<#H}%GaaUR;%JBeg zd1YIu5-Lg9szQ3`ty9L7Zaxrb3K3hMRSdN(q@c^ zOifbeWy-F*>k0LuKp>@jQbBsNJ3b08<437CK$r!}Z9$3m z0i1_ZxhOn)kmGhGCq=DE_}*Tc5mGFtrR%cXKH>Yhby~=IRFZVnF7Db6@pAcUla5-- z51PprT^>$x!IOC4SO|4`FtBR#!hATK^&^o~l;LA~-;@e;2w`voz<4VberMou`+qAi z5lr?HbM3_3$;$h+PGYf}SZuAfR{K3;G5{J({!u-2y|wakqdj%+%T^mLchGVdEi0p! zm7U_}{u@eH{eA!d literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gooey.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gooey.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9b773794dd250e65d4d6b1c15fe7f5b118912ff GIT binary patch literal 434 zcmYjN!Ab)$5KXo%u9aTAC_M!PrC`^a1rcvj3RML0QWio?(ls=j)FdmcC;vjfKoLK~ zAE@AIPl6|J1#g~As)8@c<7Jq6Gs#1%)dU{To5SoV0^mJd{!sfBpW9yC0tQBaK^94v zN23UW2=Iv2?jZnA{`_E6WA#(eXql@7&u zYK7z7DWQ`vW{Rh!__N0gV@$PjMx5_h#}}U$+Y~6_jAn($q&qm?-_o{_B_pN n5W@L-1nYAUC6%f9v-&B}pM literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.api_core.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.api_core.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c68f9c2d0e2d17258783783eba3c028ce80bfc27 GIT binary patch literal 355 zcmYjM%}T>S5S~peMj?1o!3WUvuqk>J@hUzh5 zRPfZ3;K^H|x1QW>E%?n3GsDa`GcRGd3l{Ik-JEy;-!9p}{|gq84W57lCjv^+BLqA^ z!o6n#@Mdj|p2z(=Xm9+4>~{C0rq<1U hLdg6G$k`N5|La$<{}@gWPCkO@Gl(8qPSm!Y_yugOXAJ-V literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.bigquery.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.bigquery.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d90f0774afbb583e960612547926686356bc5f1 GIT binary patch literal 419 zcmY*VK}*9h7){z0*1?WC5WGwfdT5ItMbw)JLj-T5P_ia;WogqT>7YA#^ytlhpol-i zKd`|L(v#rH+hn($Ogabpl6<`HCA>Vo=XSdV6y6Sd@z4O^Q#V^Qe#z=Wkw<_5h7_c* z4vukg<{Arn0Oo?IT{mN`J5xmnT7n(m?W} zB-wcEQbMAkD;cA~gk+PTmka`tNaE%w8ljkoAk52TYaiCeVZ<`YlYuWJt_5FLcN5jC zqk7w@US6)7rzyh)C1+fZQ;$TPtFkm9gv&huk7wZM?|!#;@AqdNZ*Kbw+yBtr!*p(U S7k2mCGFk_BmR`K6JbnPdR(YTR literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.core.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.core.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a8a2bf65019093fb7f665b998fa8b7c990caa03 GIT binary patch literal 359 zcmYjM%}T>S5S~peMj;0eD)<0m3Y(%w5w9W?5xkX!u-#qK&`mbo-4x=x=&dKSsRh6JVP;^y`Q{}IccH=iaXtw^ zl~U-qvY9mTNU5>W?)bdpHq9$69py@0os)v*#OkUR#bkn|5Nw34Qj$zXF(v(MNK9r0 zE-4$+R2Y(!b+(~TTH=JM!s=|;GnTi5p38VGE^fuePF!5ptKcG6yprNl?=<(_qXsu= i;Uk0=M}W>|aQffBg8j#Eb`X68-Or%=&~c`>n~h&dj%cC) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.kms_v1.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.kms_v1.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..483e3b555661845a371141be74854604d0e8eef4 GIT binary patch literal 360 zcmYjMze~eF6n>Xjj6%Rg-5sPEE~Snlt|Al>+)5x^b4MC-$tAfC$~bkPTr*!{N4}Vd+@&Zy%*Qr2aUJWQT%QJe4Azq`>$B_b@2ogDB_TzF+yMg zL)3ak0IxbW7+ci718?WYv>s~RNEA(&F-0g*h;Rh3KzQqgWOFd1*O`JFajYYS&Xzi8IZMJ8y?*=4n-6_`&Y k)@f-YgqA0O&K5BI?_bX0qq{ije>mQ!<303@Rl9oQ7r<0$v;Y7A literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.pubsub_v1.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.pubsub_v1.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9db6845bd4a9ded3eff60aa6b754a0f00ef6ae24 GIT binary patch literal 366 zcmYjM%}T>S5S~p8Mj#dm>AT&19$63w=Qa&NaS^pGDRp+w^2TNPA-ERB>pi66q literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.speech.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.speech.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ab29652592ed44c671b6134b38d3725830190c2 GIT binary patch literal 363 zcmYjM%}T>S5S~p8Mjzh5 zRPdCO;K^H|x1P*47X0RinSuG{n-|a9g%z{7+Tc62Y>6wv_5LQSQK@XF-<7Z)XxYU44@) zO*m&VsC3FzFcxB>q&eR>W>>w!(vYso>x(caS*T@Iv%D-ZH!N5S!NV!br{N$Sg(}qy z7bKpLgsCtp>U2XNt%;*pxYe$(>e#c~;>z jEo_9);t0_B9M1mxm%IPu%@0mL+}@|#dvuJ+?RMiAD%EOC literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.storage.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.storage.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3be5e19b403fb19cfaebb1e5b2cf93c21886fa58 GIT binary patch literal 365 zcmYjM%}T>S5S~q}MjM}y>#0F__56f?z&iZ!V*P{{*`3HDuu kO`5w1q4_bOiy55%_iyju*`FPreR}xI!%rP+a>s1^0XY(DOaK4? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.translate.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.translate.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9fcba5e502a1038800dd314e5dd9479fe2c0184 GIT binary patch literal 369 zcmYk1!AiqG5Qb+Hi&4nY3O<0C!*0-{h*uGc2;NE{Y_m%my2+-yn?gK!^bLFiMfw=N zKm|`Z37)(adh5w-YQ=wNhna!-`R2v<_o3C>@gVgafG^u@<^C3{leTyQ1`G+v(GVeU zfFtHSBY=7PHyS$3y@O!q+qMB}{6v;@oO44NHT1rpN|_3d6Co>xjiQAX)bN|YZ4Phi z>p~kU1XrXonb2e`(DdxOeub6wU7M@(sGxadR8{k0I>mzXWQ>iJBAW4H77emd zq%*^DNs|dpxsKwp&bIb(XB;Q8Fe)2`+OTdA+Ke}Zq$4DMgruz3-bF51CHSS(ZQ?!}PY(~Uwp_M{mxvTldLZMmS$+gZE@~kR&)!2zHxljd`cJW}- zp~i+tWMPD!W8H9(i3u)(USf~z;#RLW;Iwy5a!xuS9tky*Xx?-?%iXul>(bbal z3uTgt)(57h*MYi2X&JbA%vZQ{gI}4KPt!7+rna6nSRNks6{48*t=1}?V>wUvig9WR zi~TAS2U(6LCH3N3gRf8LLYKBK#sg#Jni#m;|Nlx;Em0*^a}_=#I8*qdzDYByI>u&f{e literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-grapheme.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-grapheme.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c64d282fe5d5815bafe209a331e090e266e071c0 GIT binary patch literal 346 zcmZ3^%ge<81c%jp(pi`o7#@Q-Fu)9DeAWOmrZc24q%h_%FmR4d^(MXvRQJyc>4<^$cVxK literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-great_expectations.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-great_expectations.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc076850c569d41eb1eb3ac30d70df281e039e26 GIT binary patch literal 367 zcmZWlPfNov6n|+Q6k#5A5$0X&q3uozB3?xpB6u5xkTtOjOPel9hrRhN{055nG5i7( zJoO}a@;2CQCzI(w@R#=6hxwid@ac*z{NH4CWRnM=K#_m~jSvD4 z7^2=I0(i0hgONx58whv4Tp6Oamq{U5W-uj&;9D-3ZhN_6#9($;*#R+Jmij96+x_e2 zvebsyeHGV+3ms3SoNDDHv>ivFpJC;Q*VV;oT9P6)s%}_0n?-`LY!VqMMLK8YJRS0J zs<~lNMY1W$nND%l@GU*w5aUdiM)7f?4c#;n7o-2`;;LB(XN9D-VCTyHm3yy_ZCLsU fp=BS?$pVi5+DFh|SUX7Gg28(*xbL{50(<2fBvEaK literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gribapi.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gribapi.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfe8a4ea40327bce9dba94c71eb3ae652dc3c07c GIT binary patch literal 2507 zcmZ`)+i%lW7(aF#$GP-EQb-sYk)JB4g79N*>`nqOFayANS*A=>YO7B10gX!pWVqudRK? z{hhcvDQQ4wl`d(Zah6YfIi(v%@xX2Xq6%-b!FeJ(gFe+hQ{E-EQ!mYdn~gWq^O`cx zW*ApcO+%9{tYla>UNAHb7p%M@TXKF$)v)REno%rb;)aSuU6d_KZW)G_TgCcnE~_r)Ox42U6}fO@c+wboL z6pmG|Ik5pJmZ=G&jxhR;_qVneoY+uJ5FJ7EqI`_^5Fg~8?5i-0n(EDCZV}cXllDbT4tszD7at{D8WXc8#yY&)ohX&Ws0?us+p+aZ`KO9LgBcfhceOO z04~=^;h<{Di>BM(ZdSn+tSe3HBu=#ni?WHSYu%of-<3SX77D=?=2r-wr`5n$AQHOe zCJuv5=_Z22A)doc@B<}GLjRv`lwi0~)K#3f40<{fE)6kQInZAJ5u}1v~eh&B--Rb~qUp^+a+rOCK)?0{i>>o`5)zjxcwb zdbI1wxnC~-e0h7I7Cr4mPkSg76zjrQc4x1rChgSZpYgwvucl^RPR%?Yt4+;0Q*-v2 z`C4khNi9@+>d};kxUg7Hk3OAp(&JBMCw-=xt!DRPsp{1yvv&HHeS5JMD>$)&9V^t+ zL)Gj)y+skB(M`YL($W%8_j?%P`OhLgNeOJtoywklKw2uWYED(rDRVE;y4 zxNA#G_HyM-fDQ8hAsE21Fz_hY_0!ysb6dHc^LF1@jT?8kaog`+hT^1P&0~-*e|OCU Q(2KyynW4aoK?cVE0ggeEQ2+n{ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-grpc.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-grpc.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d3f275636f14de56f0b14603d9af23183baf7e4 GIT binary patch literal 338 zcmZ3^%ge<81c%jp(ixZ-7#@Q-Fu)9DeAWOmrZc24q%h_%Sdti@mYI`Ue2XQ$s36%-llhi-K&5A1 zaY-UjMUh@*}lb4tqQ&Ln~nVMHvsGF0T znw+6qlAoUwQ<{aC~xpUP)1Al74YX z3RplNMCyXvqgPP*i^C>2KczG$)vgE>9w0vz>jH@n%#4hTAEX!<%`Y&RA)^NzQWrR+ UW|&>%P`bjQ)W8aYMI1mK0H2IuIRF3v literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gst._gst.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gst._gst.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c41fb7da32fc4676e2cbc9e6fcd70268bdad8a9 GIT binary patch literal 1320 zcma(QO^X~ww5mVmbEo&?vS5_V2xfN{r*|XCL5%@LSOP%>1xYi~^i0?E)}*F;wyGv^ zmK7Qa7-YeCF?-BGS0$JH2l2im11^19@Z_y!)x(~AHIp7Qir}k$uij_%`>6W1QYj&T zA1>VtUN#Z>MF|-gPnoknfq9605d%?vc|NY?&w(QbY}ES#{}N+%|LT#JlXTitsqk8FArFo~0lN=T9T^a&sk&j8+71EQWM?#t8gI?qh7y%|~ zbxB+9eO02pe#B)p5*Zf=S>hz9zEK6v2965Jhi*Wm>ywT*U~;`)>a&6J0IS`hq3bVc)tDf1KY

hX^CkH82B3HsNQ_dXFVvnPIaDnDVWM2&-iMzx zKW#o}e6#ZP>d&>yKh-Wjsf}t^#jjgq~e5w~yWa6z;Yv~~Pf_=^o zU;i#YvbM(7R=gc=r#ZB^JTv4**5=sS1hp}1Y7SYe_dhte_2BNPa&cU_nC8Lsn;O~g Lio^xACT0EwbofuF literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gtk.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gtk.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f61d19cf258ba157ca1adb5e6023bf2676283e64 GIT binary patch literal 385 zcmX|6yH3L}6tx>wEk%KL?ZkwXA?=P3D@(<~h9X67eC3!pc51s7>BL_!u(2S%gTL_F zAE?x=6Lz4SE1!Gr)AnZ^kC4ar^@6?k5ZZ;{1Rr-eTzL0}7^3I{KOu@AQPNAsZpduK z1iV<+XVfd72reWdueJkUp9OK&iO{?q|I1n4jr-Y9aHEDurV7Hfa{W%bh}g;vm|8wV zVgHs0Lc#Ta+aku*_B<@Cpfzo69un;0l2Zzj*NxKFe4#`5!jatHWRldG)$11IYLyCr zqD-w)BHMu6WDCB`47ZRrq^Jl3ljTjzrLjZ^(0Qp;W%5EvtNC(nEbS8Wz-f3u(;kPn iwW4bQcY5M)#QvD6r+tJm-cO^+)gGPbH4dgPefbBcH-51I literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-h3.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-h3.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebcda566f4109fbadeb3b0ddc99e3e9b323558bf GIT binary patch literal 435 zcmZWlJxjwt7`{tVQQJ&{MVDrx{yld?sK6mfKd(YiH@7?>Vs+)l0W53-?Bmlm|Vg>m(nKgOx1RUT% z9|W)i1F0iHAOQ>==>-Dt&SMFpa#eEVziLNzlq(>jlKU11D^j}UQ7ed?p^q(!m`86s zOjFg4;=~FtLk?o-Ht*K8#<6x_)Qnmxx%Kmkk`^zL(~vUc`oKzXsE4U(#fi77 zVJ+M(I|>=`x>d@Yg-{i&yLBT@=Ickxk2FZ07Zkmqmz**gLYVCW*n(rw{6DibpcKdQ m_T$||E>Goh1|ZZv3p)>I&wGs literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-h5py.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-h5py.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..532971a0b6f6f9593286fdb72c2c9e1c4aa7cc94 GIT binary patch literal 353 zcmXv|v1-FG6qKBlq%MZGQ%83x7;1aU5=z%(2wl1bgK#Xx60s#kQbOgaf6={5>38%8 zI%n+<7_w!mY{x*a%T&d&2kG zf~_*m42fl4Z1R%m3`xtlHhEPMg{X_KQ6acdY?W$*`$gJu+((l3G=8cD-c{sTjoeA- gp1ya~4j_c>od<_4=x7XX=J5A==K4M8N?o{L|MKZ;J^%m! literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hdf5plugin.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hdf5plugin.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26851044c1ea5c189b0b5345589fe3221c4d8ac8 GIT binary patch literal 352 zcmYjNK}*9h82!>Z2!q`OFT z{4z?WQOXnv%ZBgb!)GC%q)>m8Wm6Gir z)}3%1**@V2BaZI&hUB&val#6XvqIgho5yiBm9ENKoWG7P0>+W&5o%7j>oIc}h9gGh zj|9n2g@tL*9KX$`t7+REQy9YKi-Axw?{Y{405{@=+K r(DF0&V3x1U)#^g6CIG_HXYTOv^0_k46&JbU{kdGysI)H9ZQ=U^@Hv7p literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-httplib2.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-httplib2.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1d5d8edde9531a58b33b69c80bd98efb0075e4f GIT binary patch literal 346 zcmZ3^%ge<81c%jp(tVg17#@Q-Fu)9DeAWOmrZc24q%h_%&Pm}qU zctE9RUU5kxP*ss$X-Q^Iv0g@ges*yY$l_b9AZ^7f89sxI`<3Qy6_b~k8>LTA7+x zSg4zmnwp%UTaurj6H}I&R~F-wnG{o;S(2(-keHmEn4Vf36JJo72{S$(Y;b&XeqKpY zW|Dq!NeWm%A4KZH+@x1f`HRCQH$SB`C)KV96fPjY73%_t56p~=j349}7|ky*m?5JF Z98woJq-I!M}JUPUNU(9;qKvzgaqy2(sB^JXP`^61f< z|3DFchJQezr&-WGc6$(h}5@g;fTz2W=5_vZUL8b!p#k4MMF-5w!-e6bBzuj6vx z{XP>;ri2GPtb#h6h5-o)guM49AmqFIHZkq-{#!C0usg05y(@*Gwc=oqHY}gB0%)!z zG9e9JFfEidu2I)Y($dyUiX}tg3X7r=D8TH~O3Z9aL)=AF@EmKfygM&k2iJ6znfSHl<1 zOk2TAecQ=;)6H|2R=pqyRu6ZA{)+f?j|9(tlBfT_zlZlfjy|3J8tz^UcRvjLqi;Fr EKmU}=3;+NC literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hydra.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hydra.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7551142b9b56522fae289b7473e475c0dadf2a5 GIT binary patch literal 721 zcmZ`$ON$dh5U!qACSoAF8+^nEivc%*O;!<6WV7I2L|8=dHVzDv>E5K-d2M$mFrM}= zc+!JsMf@55feGZW%t`R%ZD4OX*_~uDd$78usIG77oBC?L)oRy3+Ruka!}k`zZ*{pe zeU)5HWbz3xU=%`x9E4P^g<7OLdSp08WI84S4Tz5QuL$6We3s@|1o65=Ol(|5n2FV~ zzGzNG;s&l<#T^^l@1Rrtqlh}FuqpS_?8)Ot9lh8Lk}xEJ@c4KTC3qYX{;!68;d{qa z)wX2M68E?-C_koz&+m>h%>155V?kK#hrJ+S#7o2RkjDJO=G*Lb%!M!c+4ezy`)Tia zp`}?zV--0^QCl=$zFnA$>zhusSnrdJQR)k(_E+3oBkYX@4S8>rBqy915@n_ea_@?n zVoYKhr3n+fxUrghrIaSIQbGz-$>ZPQLiWHsc=f`K{m2z;oRRqSv>OrIk8-38W62w@)p?j5)5SJjUDCf{b{2= sYxEbjU+vxV+xJRSzi*WwLvA$7>rlOu+s)6T%i789XD~s{TOo}PaEJ@WZ0NRw8o?09e zUr?C|vnC#FL40z4UP)1Al74YX3RplNMCw9ZSWx+k!v^ANyCP1Yogi-(>j8-m%#4hT kAEX!<%`Y&RA)^NZN*91g+4!P>$rS;U23`;>Vh3sg0F*vyyZ`_I literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imageio.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imageio.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a62367a13f08052202a3d57367d5612126faf40f GIT binary patch literal 483 zcmZWlu};G<5Vg~$4TwNtL3CiC5>kh>3k*ew5d>5SiLFG6(%7_ClQ^}VN@eO_z!ww{ z`~^RdN}VzxF|k$Z)(N{UFmU#r?%rAV?)k|ySAn$m{d#LB1Hh*$ek{98rl&G_00OVRHv@`dh2=@$wlJaT3d5Yn%)`74)0}*P2)o}{b}Nw|w@ApZ%6hte-9Hbx zaOHSbi3Ra_rA=vvGpP?SB`VbwDNoHdK?sK=h$s{M1x(d$GkkVrhi+gC7WZ-3?OHy@ zUfU9s`gRY8J-betHYWmGk?VEja@=;Jz9e5zI&(6|qoH7=S>*!FfvSqu@4Ee&alDXt z!qz3L`X^qOVUmFmPIdvjgbBF#e?N?3ViX^1&$o$D8yU5+Q5)zJ18kO(!d_B37!?l3 Ng~NfV4qKB0zX83Vk+lE- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imageio_ffmpeg.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imageio_ffmpeg.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd2ee7b8641c9374c4efb48732b56c81e2cac5af GIT binary patch literal 562 zcmZWlPfH^)6n~lN=pfdEf3~2ocoK?qIv%`;+T-F{7h!K@V3?VtZ7?&LCaKUpdEHO2 z-@s*A5BnYb0#oQg<|OQCZv}6jHfilaeaU;g{9cmZd%vI6>I!JP-)r~2+W>#fVPTb* zn29;sT@sN>FMvBTV)!-UUqaL9=>~_;uDj4>78YOn9?o}TRb-l6BeEqIH!U+PX-yBwWmQboEA;SCjK((7}6C52W5gpr|i zOmniV_9@0BqiN2ClE2`|%<#-U9R*pG21*P^BpVDGjF6inq=2Oo5q2piZt>l zxzaPpAk0T}K^e}-!h~l^(6}iTo&il08?Wc_^3k(+6bZPM?h^< z!1??A=x!H!@9h8iT)3^V+nTto8)xc5rB>JT zMm9L8f)Lc9B1u3HmTnQigP1?D1xG6tnaG_~n;r~SEdOP*X(Dwpe<;I({9_`x((%Y4 z6f*A#qky6*%d>4_@hS^zj)y~=uxOMz)D0;=(}tkP3FBFt*dlJT zsoR8D4V`04-8>J-c>C64r zm$LEGSUJ#yYx2j;5h<1tLh%BiwJxmw9bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wXNl|8! zesM_(SU?{{>Ox$kS5Wzj!zMRBr8Fnit_Tz+Ab%C>1BnmJjEsyQq!<{@FEE%PqYrEh ZoYEIKq-I!LxTLVEHq^a~X6 zGyH)Ho^ldAc?)thuOEhft`8#UM#B)3hzgQv26l;>t+kpZ?HO1*CSxSD1-8oeFlS&$j&V;e4;CiCmnox{MOrwNxDe^|?>HVcB zD^Drp6;?Wb?O&a`u^+jTrx}T7Gbbb@m^hNL(4CWb?hfe46;u)@@q?*9Cc^cSjBew- zO|UYLC8wjVka#0>b#?S7l5AZ&D@QozdY5`1;zE_eLa23{`1Q|SSlX&KJ5Od Y-G8u(I#ioa&B8QV#u6GOc};oz0!i9^N&o-= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jaraco.text.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jaraco.text.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..758ebba4b2d0c49cc2570da56694d9e4c8f30c77 GIT binary patch literal 352 zcmZ3^%ge<81c%jp(!H1%7#@Q-Fu)9DeAWOmrZc24q%h_%2KczG$)vkyWXfw!%#kxS^12ZEd;|DngM)L~{ dX2|FPhtvfQsTsBxIW(_uXg08dU=ce|2LQV>X0`wT literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jedi.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jedi.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f763a6fd88c41bc19c805b798ab276358e9934b4 GIT binary patch literal 338 zcmZ3^%ge<81c%jp(mj|M7#@Q-Fu)9DeAWOmrZc24q%h_%Wt4Pm}qUctE9R zUU5kxP(_hmX-Q^Iv0g@ges*yY$kJP^AT7l!89sxI`jzBv6_b~k8>LTA7+xSg4zm znwp%UTaurj6H}I&R~F-wnG{o;S(2(-keHmEn4Vf36JJo72{S$(Y;b&XeqKpYW|Dq! zNeWm%A4KYc+@n`e`HRCQH$SB`C)KV96doWy73%_t56p~=j349}7|ky*m?5JF98woJ Vq-L01F4I(NB~4mUuv= zXI^nhB2Y<@UTH~YPO)A_etvdw5y;kCtROwbD;Yk6%=(q=ZWWW4m>W}4R9cyuS6HZ< zlbV{Gp<9xlpA%D-npYO%lbIA#oLQ2pTacKXotU0l91~wqnF%vK9&B)Ya(-S(QD%~U zaY+hTKp#Zvf*qt+Q2C3)CO1E&G$+-r2oxe9Ulr>Di4V+-jEo literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jinja2.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jinja2.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be8037198692d44b19e01030b9b46a1fb5269df1 GIT binary patch literal 242 zcmZ3^%ge<81c%jp(vL7QFgylvU;xMmgU>ubYC1y-Lpoy=LkeRsgCJ}s>XD6no7RSUFRA%NCmn7!oq!z_z$0z6Kl@w(r z=@*xzfCcnHq%PF{g34bUHo5sJr8%i~MQlJzL5?mK0umpX85tQrNHGY>P2g+b1;HW~ GpfCWw{YMr6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jinxed.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jinxed.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f746adecf319b3459f0330623a2afe098d4eb1db GIT binary patch literal 288 zcmZ3^%ge<81c%jp(mydWFgylvV1NnA_{;}nOlL@8NMTH8iegA%3TDt`t`g76%&SOE z(JM(U%FWD6%hyZHE6z;L&%=}`D=E*+Gc@qiWW2?jk(rW`nwObdkY7|%yprKF$ckSn z?p85*iMcT)MWvOgd4+|#IjO118M-C;`8hFVsd;5FKAA}|#hE3kx&?{J*@@|?#WC>( zm6>_PC5bsXsYUS_`T5z!@j$yviZYY*i%U|#0{S3Q7wXD_%3mBdx%nxjIjMFrkTR8~VOYBAOE@zSo=hV^B&DBW} z{|x_u7COjHf|FaJTPKs&PW_U6y!Vm3@4dV^P8leC?zVf>0N_U_OPK$`^jHPY0D}&| z5F0T}jE<3*9TNfr5Cfa95P%PL7U)<^x&3H8N01rGhU0N%*4LuWqC$h zSuP`%wixftbMJ=oz$^dinhm3HLYCzyAu_;$42sQ=#W4vb68&z%a6cxZu=ImI@iDtGv~hG#0H$c?+&58ny7 UR_ZT%qe^pJX$~B{_=c+Z2iX{rLI3~& literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonpath_rw_ext.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonpath_rw_ext.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90bbd6c237c3e78c9a321419341dda0639dacb0c GIT binary patch literal 355 zcmZ8d%}T>S5S~pe1R;1*!3WUfkQ6zh5 zRPdCO;K^H|x1P*a3*t9F%nZyoKTlz}2`ygtdqd;_e7a-}|2J4fZSVjL7!pvRK0@FD zN6dRf057fmpzksN3gV3~m&T|GGga24;FdCKX|r{0lq{(o5q(4Wt-Xl-X7{o_m&Q^d zxK1mZ3zLqN8XN6KHyzh!o?+n#m&MsJmbAcDS2dTDNg_DUMu}BQ;3=0=+{*{p0$@ZWWW4m>W}4 zR9cyuS6HZTZlX-=wL5h#Q}zAV-S5+9fu85ut)Fff{5 eU@${Q4>+VQa7fLtzsR9|g+sf66$FbofI0w(Y-ykX literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonschema.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonschema.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4625d63649edb53b51bf6bef9b07f8ec6d8794b0 GIT binary patch literal 429 zcmZWlze~eF6n>X9kXEv|2n81@(hg~NDQ^CPB7$28gllp(v6oz$yA~o29Xq<|U!aJ8 zhW|hd9VCCZ05I}$^ z#K=Lh=4c2sASlot5x|SQ-*9xIOJ4iS-&g>S9_W|QD1EB04XxPr8KuM*UVsJmt|Cf! zVfif0y_g8B$f9!1S;GC0#Q3~XDt0dNvxEyQ+p^|RM3gr}#`-*y&LLBF3q$qsXILtc zRd{mXCOCFQHq1#f7}%5$KePp7)E$vz*=1)5|KsS z78k*qXsK-fT5G2H%529h7*cYWZAoFZ53aVh&=Eq5JwV533P=CXyIGx@)ra=Xtk2E* b*mwhDvOC$myPcJ5^KxwlwXvZhE6ZVD4sCk< literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonschema_specifications.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonschema_specifications.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..245babb85b247c797d3b3659bbdf5f414fd38903 GIT binary patch literal 381 zcmZ`#%}T>S5S~pe1fdrZ#CjKVNP25P#H$EJ1aBn}w!7PA?IxSE`fO%Tkk^6*$usBYeaOHr#So zq2C-_*O#R>*p8`qX1LICF6Bfkw@K4-I{Fz_PJexOahjI6NR67+tej3G!5GOSBc({^ ztemHPK1?+?EUGY>;4#x_R@HnfpKXLQB1@zAu&WK-5M7s}f0vA_dL5hSMGD} kdL7%e^btbK4xnTKy}$kubQac+dT&AU9whfIXDYBG-w`u&Q2+n{ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jupyterlab.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jupyterlab.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7268cd33a77d74a1c871fcee93c332e1d0d20a1 GIT binary patch literal 350 zcmZ3^%ge<81c%jp(%G087#@Q-Fu)9DeAWOmrZc24q%h_%bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wX zNl|8!esM_(SU?{{>LOgFS5Wzj!zMRBr8Fnit_T!1ApaHX0*MdIjEsyQq!<{@FEE%P bqX!&P7dWJ5*j(h$xWb{)zzTvz96%iaD;{Qv literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-kaleido.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-kaleido.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76cf981eacb3270190183639dba2273eeca8b751 GIT binary patch literal 344 zcmZ3^%ge<81c%jp(wUhU7#@Q-Fu)9DeAWOmrZc24q%h_%<{aC~xpUP)1A zl74YX3RplNMCwAFq*qY+i^C>2KczG$)vgE>Dj=T~>jH@n%#4hTAEX!<%`Y&RA)^Nz YQWrR+W>{Y2P`$#T+Q15eMI1mK062wXr2qf` literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-khmernltk.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-khmernltk.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e5cad498e174b11335d35028abdf4a259b64b1a GIT binary patch literal 395 zcmYk3K}*9h6vvZxgDMuL7hzY$F`?Z_1r@I%3=zDILg|{U4Na3SNe8{{Tj(cH#E;<@ znBYNr5NSCDRyDK6LU&&tU?s2C>#-rWxbK5ITnnntZvDS z;z+PC79&{_g|EAfdiSQfVp2uAQTU}IRQf6BnG|NDx@jiK+D!>Un325TLdhqvFu-MU zc^a@N50oe?%*JDnVjQQQ;+zH(%qBsf3XX6 z=$YvKZS5D;(mBsLDk;7YTbgSgK_2Naw;_b{Hh?EHaQy##IPIC!zCU|)I&V&A+I-*M No3-|*t}$W$;2Ry(cd-Bf literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-kinterbasdb.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-kinterbasdb.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67edea788e0b10f31595a89cd916fc23423cb7fb GIT binary patch literal 527 zcmZWl!Ab)$5Y4s-Mcay6Q9-Xl4{JehB3?aMym*s^u$zo+*xe*evdiwxzwquw{0{#j zSAU?;TTfdwJ=tde?9OW8l@&no0;OQw*yDfF(qK&+C=AXxBZ9)lM44d;W}0zr zLQcT8aqON06@{8ccF$F-&p-7&+Zi)TfwNQ!W%L)CRePMXhueUMX<$@V0-sF$1b~cv zBSaG9!1G|pqChhPzI0m(N1y{N%Y|i~T*-3Yx=RJk i61Z1A=j^$wFC0vpp65-^cMgW$6s_^CQyq2aI(`9SSG>vq literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langchain.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langchain.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..517213d425b2e6af343c6ef4ce927725ee5f59a1 GIT binary patch literal 348 zcmZ3^%ge<81c%jp(pi}p7#@Q-Fu)9DeAWOmrZc24q%h_%W}4R9cyu zS6HZW}4R9cyu zS6HZ`Gq1QL5vZ<6ue2mHr&uo|KR>&;2xRpwR*=Txl?Y- zD=gH_Nli`8&@IW&&xt8Z%`1!X$xMnV&MZmQEl5nxPE1cNj)^a*%!C;q4>mYHIX|zY zC^JdFxFiKEpbsK-5w6lJsQkrYlbfGXnv-f*1PU9F|B7{i#0O?ZM#c|P42`IdM< zrDtAoNg_~9kzQ#@W=^qQMt**FaS_PcTdW{W#VZ*;gADtX;%*g_mzWzbQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wXNl|8! zesM_(SU?{{>Ox$kS5Wzj!zMRBr8Fnit_Tz+Ab%C>0*MdIjEsyQq!<{@FEE%PqX!&P X7dWJ5SX|^#xx%5+zzTvz96%iaZRTS6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lark.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lark.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b53ff764406b92336ef0358e2f8c18d66ba077ed GIT binary patch literal 338 zcmZ3^%ge<81c%jp(ixZ-7#@Q-Fu)9DeAWOmrZc24q%h_%Sdti@mYI`Ue2XO~u_)V5llhi-K&5A1 zaY-UjMUh@*}lb4tqQ&Ln~nVMHvsGF0T znw+6qlAoUwQ<{aC~xpUP)1Al74YX z3RplNMCyXvqgPP*i^C>2KczG$)vgE>9w0vz>jH@n%#4hTAEX!<%`Y&RA)^NzQWrR+ UW|&>%P`bjQ)W8aYMI1mK0G$$HH2?qr literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ldfparser.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ldfparser.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48f28fcc454308b81a779676c41234f62f57689c GIT binary patch literal 348 zcmZ3^%ge<81c%jp()pPf7#@Q-Fu)9DeAWOmrZc24q%h_%Qv8Xt;$WN2` zmUuv=XI^nhB2Zb8UTH~YPO)A_etvdw5y<9StRQ{GD;Yk6%=?w@ZWWW4m>W}4R9cyu zS6HZCqyTBH9KC3t_V}O@_|SZf9nzD;{$2 zkpG}n1beDV{|ql46UagKBzW>x$gL;eq)9Pv-|x-u%{<qH>V-8b2Du{Z+bQd^Il^J;dth4?k5Mdl>ndMaM?NvCXQMaO#ga`Xn><1gH9Vn)0 zB@Lt9utQbQN^>TZ4&fJMtD7Xdsud+dOV(ahnoKTMO@vlL?PMa&t7(4bJ>_BCCgGYi zVqXQQTM&BaFg(Ja$(Q(3{O#Frxi(s^_0SkzP_cN?pm0SNr+MK}I5*3s;`WRD`D}-3 zrWse&$zW-uD;&<0E=nM*rm}F2%Bt|Yj1VeVoF-DM??^5}sa${nyTu8~I9-!BAT`3M zmk>^EjPdC`gdYvi!~gxacct(28~w)MX3cng9sK9zVSQ^<-x~VcBY%77HAY^e=l;5O P=Wu1P^q}XPZ!+^A=L4&| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-libaudioverse.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-libaudioverse.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fef2b38ae0a3073af8b576cec19322e156c53068 GIT binary patch literal 449 zcmY*VK}*9h6i(WSb!B)F^fphzz_z=oL-Z)Z5JB)T3ZYHH8rC*7NeA`hzwqiw5r2k% zV1lQf1W(=uyX|B$9c*8ckM|z=-j|n`R;vj#-Vgf2TMK}1lPqEX2eU&RJOTm+fIwoU zFtY|01Qwtcv7aFTZ~FXUV3WoT=xp4dH~TD(O2YV<3Q2qWiBg5^1;LQ1q>O#cvmjl) zv7R-5Our7ScQ8*=iWMSN9%T$8Es}L>O?uU7)SCzqjuEPNudB;ksz|GZUn-VLKjC~N zg_)*yVwOjOQTYmH#$i6X=!Lp*s6<)O{O-<6DaDDWI8Vbd&Bvi0Ba}>0uZZv{8d4de zqGC%2wCIg6&y`?tAQf2@0>j?gBmJV9JEs{ZWlGP4tG&&q$syw8UTE#n4p$ZJp&o9P_ZheY#y1{z?u8erDJ5PA)^$B(no;| z{2M~C_~S%Uj~GfcH&02OGZEY`7mH=zZ+F8WY+~PcU}oXFkR}L=3&+gXF1shOkbxS? zONk^@l$wmS1kWiwuFYhomJ*rWBnaV{L~X{Ucn3qh(Fh;ydT|hWk|$jpcRDV`IBdF- zG3wpo_|`iobx#n9-F6VRf(90zT87Ld{jr!IvRHCbFAIsrL|JEdYN6Ebj;y_jv3+hU zRsB2SN~J*#LO56l@C>Hl^#2{Kf`yILT7RmfI|pg`Ftw^ZtJ=4!59VMFtZb!)&6i5A P;PwmdgRKu=Qd55cv5=1e literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lightgbm.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lightgbm.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f96ff6fb1f16ddf24cb53bf96e9fb9fe05492c85 GIT binary patch literal 467 zcmZuu%SyvQ6upzQ8k%$`h^x91LP)w*5w{`~5nNdUF^@4FI(alREyPv-!fjVd@iY8^ z2D*@}1Xu0~-F4-pTCw1nJC{4>GUv?Wx!G)h!0S;boXP+n)nbF%PqDlc#Ulg|APN!c zA_Nj(6i819;6==DbR{gUd3l?EXafB9YX9|u`VHtipOuV`$~`}!6#Lu>^4N`t?@;2g zQlTX5@z9IPUDl`A&Em4oe3Ir@x?JvG=a(_#uGp7ZLry5OdP&k}nYa>^ibrBMBbZHL zS$VAPFHUVCZS!oH<9IMIDaL-!ad6h!j-SLl zBVL>FU`@2EY;KNerTI!Zi;`eS@p+~R+v=g%tw;+QA+)dnoy_3)Z@jCmncA8(3e}ja k##ng+Wu_g9m>d+EG1rU&w%Gkb)90FAfIe2LkyU^B1wd(o=>Px# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lightning.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lightning.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bac1678e61794637d16ac6c83f93f56be9b01346 GIT binary patch literal 398 zcmYk0!AiqG5Qb-yMw)6Bya-jVLJvuA3L*+#L?|M7D}j(^x9QUDZo9iFq$l6PH&8_1 z!WZbVRY%z;z&nfk20cim(irJIpxW8YeJ-= zg8P*Bg!x{jJZ32->ZWPud$-v&S2{8P>8F}9<@bdcC}}Q*+$o9b85ZTHWpZ^I@Msul znP!BK#~vdj?t5AY7EB1A1Z~<46xGBVMe!g?hzi0{M%Vao1rB4uwWQsa(s=dID&6}# z*B@oe>e*1>l#z3}Y4##h>cUuIBZP_uppzLK|IeZZ?*6RWm{)e@+Xu7yVd2=W^$Etl MO1pQ;kgj2T14vVJUjP6A literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-limits.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-limits.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..451171996a4a92244dfa61820c119e7d27aed2e0 GIT binary patch literal 342 zcmZ3^%ge<81c%jp(wUeT7#@Q-Fu)9DeAWOmrZc24q%h_%bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wXNl|8! zesM_(SU?{{>Ox$kS5Wzj!zMRBr8Fnit_Tz+Ab%C>0*MdIjEsyQq!<{@FEE%PqX!&P X7dWJ5SX|^#xx%5+zzTvz96%iad_H3l literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-linear_operator.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-linear_operator.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d19805f3e977ea8b5180006f2e8c022b324d6fbe GIT binary patch literal 255 zcmZ3^%ge<81c%jp(&d;K7#@Q-Fu(|9dSHMt}+KQA6AlDd-NGf4NZTz9LOyu{p?lA_Ye)V#t%-JI0aE76uX@m>C%vKgcjh ODP3R?gPbQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wXNl|8! zesM_(SU?{{>Ox$kS5Wzj!zMRBr8Fnit_Tz+Ab%C>0*MdIjEsyQq!<{@FEE%PqX!&P X7dWJ5SX|^#xx%5+zzTvz96%iaX98mF literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-litestar.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-litestar.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c91bbe89f36d78d50251fae7d95fb10c127d8dd5 GIT binary patch literal 363 zcmYjMO-sZu5S_GwA5bWI5Iib~J+ynWf{0fU77@HHh0<+eH*A`8lXRh;{1^U%74c{I z2UhSPy?XMtu(v&#?7HI1%rNtq0CF&sr z4iJQ$2?BUExkAsu?i~ah-*ya8yPFHfNUl>=_e+6mM%07Ps3uBhGGd}AC@*dTx81*O zuDK!2wv1{`nTiHN43)G7T5muxCY+X)kXpUK+&;g!zdBENRwi234dJ6v$Oy>?p%#KA zW5UNtm-Z87#KJ1ehgm^Xl2#2}%cM(zG#6Y;+V3chmqf?b@Xuq_EVeFI)-UC@k+pwS kkts75Av8MxbT)XDgobW{W4B@`Nmmtd6`_dWRstcpJKLj|TzYp2Wbkp6)R zPMHKJw?em0-cx48#nlqemmZ{d`yv{k(^g3|cqnqZcP&zgD zWK?O!RWui3p`?{=y^Iy9WK_Mt)^hIdF3(~^6>C{Fv{)`fPAQ&;S_mH3w5a0=%VK4? z!!pH-bVgO2lnv_?l0A2VMWH3j#!8cYV{BvCJu51kop+uKQgM1A?Q-k~RcOM-MF?$% dfKJzN^4~xG!P*}@_TK%`hd;XatVz#I`~avsXUG5m literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-logilab.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-logilab.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0cc645907db54a40e0af256722e62b931ef66e2 GIT binary patch literal 346 zcmYjM%}T>S5T0!;Mj_tRH)zdaQ}rm~RfHmfw-N}O?2?A=X4CAZ5KkU`1K+?ReGFfq zf~TAWPu>c>_2h1};5UDK1M|(y-1GLq;H@`I7Y@LeC0iKYVtr!DGf<$2gFqvMpaTri z&IQtxFE@d zq)dfTQDr(2TIenF|Zl`T^1De#=R7hR-9dxduFTsO<|K(4nk;k3g~SHMu0dxHKs@KczG$wfGiGPDO5xpC;sELZ0A%TA5&!@I literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.etree.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.etree.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92b39228940c0f1ccc29eaa5e899cfdeabfdf583 GIT binary patch literal 279 zcmXv}u}T9$5S>j#Lg2(S7Jh(m#U;H4Tbp2GCkw~j?QpkbZ+Ejh3At4Mg}sgV9sYpz zb>a^M(xq}Y=$qm3W(MZXyeG*R0zPjR^*00fiN!w#f8uZv#4FSw;Eg?lU{8<^(&28R zwym1xsIWy%wxFgzt9R1&)_=7?MMr o+U_`-w??cL-n&sS4qt-53bY?G#`f1RnSWj0g?ve3xbraj1+#}%Y5)KL literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.isoschematron.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.isoschematron.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ead57fa48e3eb6f0e59d9c3795d05d6a87a8487 GIT binary patch literal 498 zcmY*Uze@u#6i%+!dQ~doBGk=6sr1LDAmS=Q6~T5X2j}$?ZEWsxCONT_{V#NM@@GN+ z2N%Z{93-ogTfxoAq*|!&<-L3_;eFqGx4GOj(Dt%iJwCJm_%OxTrvAX!kp`Cl0R$-s zVFN;gEowC^3t)&+*g8p#o38CKn!J&X(l?s_QOB?KGXLvF8d(RRF!gD^3sB7mj8Ys( z5BbvfjtIqKPucW5q$)=Q6G01yzT_-YS&juucz}g&%ZQ|j2rp#R!hUBb64KW!yqriv zMY+XTTW~X~vY1eI?8}z2PZ)_*+Q^7|@MYw`(58!$qtWBPGknN6qm;u?vzLURNyIbn5JQW{`&lj&VgVoyGYOU|o Q2TuLXsdv-H`K)IA0Zl27c>n+a literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.objectify.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.objectify.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c9befb7ba07c22742f44db3d61b037f930c6a99 GIT binary patch literal 250 zcmZ3^%ge<81c%jp(vL7QFgylvU;xMmgU>ubYC1y-Lpoy=LkeRsgC zQEIB6CgUyMjLejj)V$2xg8ZVA;*|`aK^lMMxLd{KCFaJI6qQz{<`ov|=A@=3XXuvX z=jX(frRJ5z_+%!<6la#C>J}s>XD6no7RSUFRA%NCmn7!oq!z_z$0z6Kl@w(r z=@*xzfCcnHq%PS0{G_bZV!Z literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lz4.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lz4.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..129293bd14782b368af52587546eae62f2243cb7 GIT binary patch literal 330 zcmZ3^%ge<81c%jp(lwbF7#@Q-Fu)9DeAWOmrZc24q%h_%<{aC~xpUP)1Al74YX3RplN zMCt;aqgPP*i^C>2KczG$)vgE>5FpPK>i~%l%#4hTA7mI9jV>@4BBKW!q8+>wQZI7I PT;Y&uU=%k20 z!#~hM2f0abaw~M}WKyk5zn6TxeB{0Fk-U`4+rZ%cu-zRw0DRfQ8tz}RI5WuuNI(KP zNMQ%2PRD`30Td?AGX&tx>|bqx5YrHJoCX2+k?dQGzv&?ii=4*!$P= z45y4loW-i}Qru1K|l6Fd2GE{iBohnewGAtQYuV7&f zm*nC&G(AHthdIse?*mRL=>=K{9*$@>3fn9W71J~rVA983s={cHv$b2a@`;GZv}AEh z>0~9eEC;LknuC0aPEwH!IX#s-#?wBCIyW?TA%yb-0I%Q#v^Uo$s!UMj@o0)_GgKRU WAAWV>SD&_~etqWG$H<1XU-Sd02z#Xf literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mako.codegen.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mako.codegen.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21fa6f0e2e1d819dc00de158525b9671523122ba GIT binary patch literal 426 zcmYjNu};G<5VcznC?XOtF?vFDNV+3bMwSX8!Bj;Gu6>P76Faq?LOSsm>@0}y;0Kty z@&lE+b;3!h#Ix_t?|kR;-A5P($m8pLm_2q7`f11xp0`+^dh>=j8lenv{EkPMckWTI zyQl)DIb@)S7ckU;C3m$GT9M|0I6)ne)>|I}FTg4X+%u!AOtg-RUK~6KAM!s<7Ns_> zO(PSX=lWTyj1-zzIoLSxg@b}lb<8LeusCYZrczE8J2sKI17mM{o#jEAa?R3o84Afc zsK3WQ(Yk4F^K^5WC|V@WR5hsCEXo0xh@94WG6ywJhH{)(=^!d8o6-zyl9shp*3mo% zlM1b;Hf35lBgcK~cfVDPi>KYJ)^=Aa|CVc^xCW_av@s}T&08JgQ+=BAr>bEK{YVkJZP7vX~PaN(F z%I_%Qan_4`pLoLI{np}<$7`5)G;sYAF(x4mdJz-+6{c#a896_(LpQJm>kmnIe_!?q z@j7J@MZP^C;lQrbmd&Xk<(}(x-8SL2(;L#ImNQpzSzp?|1H^q?A~MQ!A#b{$dC1%alSawOCNeE0fcIwMrNEl bPll`6n>7AYoJ72snnC0S_+68E*-j11YHqQK}c*-q$n4=7jto(+P*?=IyT1J z_y-`wZ(!mN+(|c}tW0c?x^=?2Q-+RwmOtx#-;>|-^Ec1C4Fj1Z!|V+L+o+h}o2u+ko7f{X^#Ilx7IAK71P3^GcSbfAUE!b_T8 zhG%RTDyHe6h?8+VqAHAvlC^cCb;T$Vxt45rq%>IzM-30!X8oePcAszFe=5yfq4@*# z$xw|ELiK$cSvC9*-GQCMMfbtt@aeL9vg)49yxIl3x4?Ug-jgNnuW-KxgdY92cjkN^ dE$xT1*CylE-e+(Ae(4^p+=H3ZEV*sE_y^?BtVjR= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mecab.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mecab.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af55f1c159dd6f37ca03aefc710e6486aabef7fd GIT binary patch literal 404 zcmY+9K}*9h6vtoM6C*|%*hGr1vWW(ORmp?7)OClCMk=@ zV_z^v2ELY31XC7IgEsF4ifiVNFd5=LQ$aXN`3@fz;E>2zC%o5GnifVg&wlZ)#wgvo z=aHln!7h@0b7%g4b!pPtMhLAdfLaSU{Tm-{W#Lxlt)*LCxz(BT4$i_mHZkukz52?l NFQGnj@{xFk^9{Z_a)kf@ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-metpy.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-metpy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23bcf163358966825e84831c3a623b8de3c124c2 GIT binary patch literal 424 zcmZWlF-yZh6n>X9(p0iIC@6F)LWi`wh?`cSir^Lk;d(jS&`U1OT?=vQ=;)@uKoNh2 zf1rgvr_C`=NE~PShZxWv5c5#4LBc)%v55T-n6jvL-7hrt-m6jBR|2h zFSBt@lhMd!l#+ofIcNTaCKJCK^?VUY>ZX_sai0o5Nb_hjBUq~kgeNkKdTk-YHPP1I zU2oM&^HudY=HZyplWbef)W0Aul`BnzP`MB249(#5zm+wxcki8t{=8aWRO?f#+yb;U Xvk#O#b>?~aF51XBD4S+B8SwsIb=5=X2fdB-M zf)KV~sI@c*G=Q~0dxikKNnL>%(hCFqzqh3axjUe=lK)YO6)iLTI7z(_3lt!MvK_*` zFb)P3dmIVE?+NCk1Ky{I`du8RW=J{=30$t7mmTZq*m6eOo6+k^E-T%nmk}3;Qp~J@ zAe39(IPP(#)?qnGSzfi|uVAibS>VR08==q@Y>?up-#017e%BOnOx+=lhHjIzT}}ix z6Xf?$2Xog;QnK#hEvtKe90^9+HW$ItVJluwZ6)cVaJJg7#?-~t#rUnHnGPYGl>uzP vF{p3Kr@lLuQaYLF)u~>c0SKLs;@;!cc;A{7?P<||xKK~kah6e5kY#@XP-==o literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mimesis.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mimesis.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d130cedb27b56f22a63858f1512d547f3ce64f2 GIT binary patch literal 344 zcmZ3^%ge<81c%jp(leMC7#@Q-Fu)9DeAWOmrZc24q%h_%<{aC~xpUP)1A zl74YX3RplNMCwAFq*qY+i^C>2KczG$)vgE>Dj=T~>jH@n%#4hTALJMq%`Y&RA)^Nz YQWrR+W>{Y2P`$#T+Q15eMI1mK0N_<*N&o-= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-minecraft_launcher_lib.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-minecraft_launcher_lib.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c30baeb7ae7888c55ac7273c5de0cf6cde40c5ff GIT binary patch literal 375 zcmZuty-EW?5T3m=a0n^1P|;pYahJlNAYv;*5Wy}SESud;vSe>J+1(Sa^DTS>MSKij zAcECZf|Xq$T`G5@0SmwRVP@d_n3<<$a}zvX54*#y2;eg`YsA0B;>Z^dzM zF7JwdZiVCNgwQb=a+~8xCD!tIC5)+7&WL{7I<^|LLr(wSFq>4%EYkpM|?^ k=F>bz2+j8ZozCFouYV-_Gw%n-Z%OAp>D)JhnZ#4R0o)C6i2wiq literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mistune.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mistune.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ea2d8d3c0b541269744f674dc3e54a9bfa0b508 GIT binary patch literal 474 zcmZWl%}T>S5Z+Cq6d@>D>`i*Aq>!}W#TM;R5vvH|r36BnUE8JkX?Hh;^yFLk28#F? zzCa5-NUol|1$yg2+-<5LemgVFezQA&&$_+^1l}s`-j@QvhrIkiT|0|2;XDEa5cEL+ zJ1|f>3Iqzk5GhX(fLEb8s4iFqsejpyinLoG)!6uy4-F;VBg_dR6#Lj=E+_1sV3zKB zk?&)VJ1p+zK{nY52;*^x%dOM$kyW?qlkGKQ4gI)BLUwIvY3U}p2pM<9cWT9)_{{1@ z(ST7o1l5E|^*%ueha?zAl(QGGkew{?dD9Nvz~(ega5x&7KE__(e=Rxt<8 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mnemonic.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mnemonic.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9df7ffab396341dc7fabffe08f9bb8b24fbc8d42 GIT binary patch literal 346 zcmZ3^%ge<81c%jp(pi`o7#@Q-Fu)9DeAWOmrZc24q%h_%SHMt}+KQA6AlDd-NGf4NZWOu8Wyu{p?lA_Ye)V#t%-JI0aS5S~p0e;^RNc=Mnj=8)~l3L;)bC?a?(3n9&}?b1y)-Q5)9$+z$g6!kHD zfeM~-5@y+dJO*?q#SDH2sFWfQ_2dSmr@!13^TWWuFg+Lk>F^%W+_1Pzvtin2nj~e-S7(yNfh3cKQM}jEhAs*%=i~nzv1NwKdcJYGeB(@Q oS_S5S~p0e;^RNc=Mnj=8)~l2qIoZC?a?(fskg`X6YuI?rwtdQC3eDmaaTVU{Z&>g%u0ADs)!Tk+phbDLc0t9g=P!Az+ zfFj~NB7j$8OY|J#UPG|Yu+W-In literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mpl_toolkits.basemap.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mpl_toolkits.basemap.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ba34d533b5fc8fc1b3d3197d188ca93edd2a183 GIT binary patch literal 1170 zcma)4O=uHA6rTOxBu%OHr$1Xgw&su&6^y3E(o1cjh|q%=0?Q^lZMNCJ&TQJoLy4sz zc+s06f;~m09*U}dwBEli>9QVca5M*%4&~z);~?Kf@)Sv> zi%i(ri?LzF{#pL7;=i3H`l<~?ef0ieqW^@D0>%AgZ$zZS1dOk;{n7LuxRu|MivJ9P zQw$j{Ii?9qo~mn}rmh+$#3`1D23EHWn}j+j%2YkW#F?_=R4@vzj12dB zOOEAg9tv&*(Z>e}>tG@Tr7+=4XcL~g%Y#kXloD`RJUeC zQ>bD8YRR!ZWE7{dr-z2=U`?NQTp71^CeK=qUNzwZG)7wpo;;qQYnx*jracartPk$? z@-evWpT{R4Ru8|n3}T8ekNe84qe)+$Z_4v6dA=^RMZin-JN4@G++ObWrQNyu91WER z+dveSm}BMoyX^bfx3eE(huNd0rn1md7JPa1k3Dht^sDrJtf{QDlojfsOjAzW=)$B! z>Y8aOGk<}e92rezv860h`-v3W+j_CHyW?M*Y)VrtX{rqvVdhv)z8ZKrK#l&*d;Zn? aO*z++bAH5a1@M?vXZ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-msoffcrypto.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-msoffcrypto.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73dc27c80f6c1e60d357bb2213ab37ebefe3fd6f GIT binary patch literal 429 zcmYk2&r8EF6vtoM4a=b5#UIC>#DeYI7zmE750lb%M6CIOQ9>J|nTeVnSyE|EH!$?Z!d#{#DU7jIZH+(FJdelteL@tC6l1dyMg42c_|5pq|ao4 z)4Vjk!Q(X;>)&L&TbGKi3w5pDj!8ewSJqW5=s03GnQpLdkh~~mVIqVU#|Ek_K#K*a cIfusX{I(9B?D^s8r{#WG?yRauW|epU0I?i@@c;k- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nacl.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nacl.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6733bb8d089f5d4cbb58f00301df3eb9e8a4cd6 GIT binary patch literal 1054 zcmah{&1(}u6rb7bX1C^Jn<(@n=%HXGElCl?g0%LaO=;k(4#>FbE--&{SyTLfh^<@=2Y9fI*_1m8Hu5m(F0{xVxboc=v+A{1CyvC#$9%{w=$d@gS;o%}P*b9Qjc%y`1 z4kY=XUh-NJlKA5Ki^a9v%F{JD_cD`NSzpX084_1bUB{{;BgIkVqNZb;jFqq>mrYdF zvG0);$Fa0R)xm@{6jdjztZRkc(3Gqei<&%j+n!2ZC%kE=D~hv07}F+fNjD25{;alQ z*p5OwSZUQP)3D`@hm2efR2@yX(;KF_Wn1*Y0E_cdIFFD`go0)$mPT2zJ~)pw%TUUg z2p$ueo=5<{bqKp@Y6jscA4;5-A#Bq-(I_mEpi-$|1APU*C@?rHEIr6mh`eJ}YuMP{ zPU#q{8!5*$_52PtcJf)Rkhe7lrz(oNrIfIpmn$``e-YVdDyyd94Q0l5knfoBbjl-@ zuGG$ix%2rwv=X$X_h9YcRP_Q7!rmH2av qa-#n7#@Q-Fu)9DeAWOmrZc24q%h_%bQw%g%w;(Y&J25@AI3~WJG81NeJlNp)TZlX-=wL5hzSR{wmf55+9fu85uvwF)*56U@${Q4>+VQ Wa7fLtxX7V$g+rx*6$FbofI0xKj$TQQzpU5tFq)gyg;||LbzD@7nNscxg_U}= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbdime.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbdime.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5fa92c6884d44ba250361c4f1afe5dc4488781f GIT binary patch literal 342 zcmZ3^%ge<81c%jp(wUeT7#@Q-Fu)9DeAWOmrZc24q%h_%bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wXNl|8! zesM_(SU?{{>Ox$kS5Wzj!zMRBr8Fnit_Tz+Ab%C>0*MdIjEsyQq!<{@FEE%PqX!&P X7dWJ5SX|^#xx%5+zzTvz96%iaQjB8D literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbformat.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbformat.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d86547e60b41180c5fc7539d23073236219a1ef GIT binary patch literal 346 zcmZ3^%ge<81c%jp(pi`o7#@Q-Fu)9DeAWOmrZc24q%h_%Junx2`T2N6!rD9y|E(`3BGn~|B4lA4#9TaaH=QoNGkGsyH` ziSAZ0d5O6(B}Ju`sd4x8Nkl+v73yCOEA jjX+N_6pI6i56p~=j2|Qz1YH;}2si^#11|^`u>j=&Y6w(& literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ncclient.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ncclient.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a99f05e11b2ea33c9a6a10dcd7a93634e28254d1 GIT binary patch literal 616 zcmYjPPm2>V6wgenmVrw3qQ~HZP;h1hwL%du;y+mGf_o~1Lz<+WuxXM_-gKEg`7Qhg ziuf`70u?;_hLUh)#&`~6;$Fa3UkJigyQTzu#t^gB3vc)!KP13!I2 z3{4S>SS+JuJdGn1BObHP=Ln&1e(W&qu*sroNpf6yaaGWMMjZA!fHQn1 zp!%o&VfHwClqG*c$-`)K+ozYDLh0(+QnOlecRtuB%)CB9xtk2Tn;T`xG%d@`oulTh zazK2T&1w+RWr5MzaO0bPB^cvMERD9{zM_l3b2)!KE)-c7VC#mf)6-OPPOB8Omc@#z zRdFb0g%iM2L+A-va95P35qp}lB`B#@V8twVz}k&G*z`)QX)b%ub~QY=;bVk{bz^U~ uohXX7cdtj?Eehr)ik_~~=>NX$p<4&*!M*jtlOKc8&%x+pKQ!C(;eP?oQ^h_2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-netCDF4.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-netCDF4.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..894740a376e78f38301f7fd8e8e814e17d67a7e6 GIT binary patch literal 963 zcmZWnO>fgM7`B^F%F>M?F)18qnV9HAvw^xHv9Swi)1(z4aSPR=H1S$%`RE*PqdoOF zZoTmjK!`uUoj;IBJyba%apD$fx1F&2A+^JK?L6<}Cy!s-`KD=kz}m01qh?nI;15rx zO_+e|lz}h61upb}4^0R;&UrasFa?H%CN#wyK!PiNg#i3uecXtGL|1CUt_FZ91~SX! zX*SX;xAa`0P8A4}XCu{}TdLI&o4>{CtfsrHCdrf_U<%1ym{-(utP0swT zUTzttGLEcE958gBAwP7_J!C~T#nA~yQCABPee-s|YMfK-Mcu_oTHGx@H>$>FnrDRL zo>1(gRCY%1?$T7W_nN7;jcTemh){fj|C@TzU4Gv=3?gcK9wJ5d!IrVjYAHD(BOGeE z$h$z7ErdMF!;Q#tF=2E_I;k>Qy(^#P;hou@ep!a6&i+K{Q?CS z^&{MiQoK~^X$*-gvG5>Xd7232fl$tX0EXfJBCHRD^$b8*;(FZwn21HDSO8+4yBxr{P~!2pniRGM zg{?6;RP>m|!;M7Q94MO^$VmrqsMg~780tH*zVq`i(f0@X{^!Lj>FN`IGKD*jt>(rY M_Zhp9C3YtN02ROvkpKVy literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nltk.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nltk.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a712573f948d691f82daff7d0b0d2f2b353e074 GIT binary patch literal 681 zcmY*V&ubGw6n?Wmvb$*_B_OF*yqOwG(nGZe5kU||C?a@UR+i1qG}&geyWN>o8ZAgKmnp+6>Db-z;`iMW@`iva}_u&Ri;h9(~r8%$maeswAkooLBP7J{G*}#m&M}FOo&BKY(14Lf;`v>#O{n80gCK9l&DwDN zIAUqg+Mx_*#Ey)O>|x2^!hG0^aX%!F(u%lJ{xThluv8I3%Ugg-!!_v(u!fm0U~hVL zEDK<5PR*OAdz1S!vpzTLLtSviYoi;Z+e=W;Ru+bj7l!rW&Bv4XCu47BY|M>~B_Mrk nVU|CaK9$Da>E`tMotasio3*J~`y(VO+tc;!VOe^*E}Hra&H=R? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nnpy.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nnpy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..611a30f36c29592cd40a8f711cc0d1df1ee657f2 GIT binary patch literal 310 zcmXv}v1-FG5S5(L8iOHp>QYFSf(J)?C|%njbmT!Shr;F0m{+?98s`a=Xo2&S{f7rCPk_a*tP{#8x<-Yk#w-xy3~HLRwd} zEjOg`$t8PncZ%&={$OHn8NRi*p2i7;aJ-4&#Rvk$;ClWu Moxi7{%%$J>1Gx2GZ~y=R literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-notebook.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-notebook.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22f525323c412262d57fd3f760f60f905836061b GIT binary patch literal 1547 zcmcgsL2MgE6#cXIZZ>WmxoI%S5;QF$s#Rh`RB?!0gA@z`RTT(Mt|M!`Gl{od@47SN z1V^Frp$85eS_vr}a|%iu6pkDb9JsELrCNKcgaqm>D4cTQ&$^q$kTc&qf9C)BGxOh@ zKmIPAP65g9+0v_e%cvRz zG++sur1}HcGj=q9C)h?(onRB&W^A4A>BJ7fNNgjCcF|~Z+*_Swlhk~mPB3;b@JSpF z@58vgkp_sOC!=V6eD>^UNp>bctUR$dFIZQpg7E$h^hR(-{BnKrKp9C|Hs^jiQh=auk)Gj}aBx-6ON)TCE1P z%KSW@JB>|TMAd_zuK#-D=NrMNxBE-A!BVXUhv){((m+CyvW?vFHiGdr$7Z4+njJ~~ zb#II+9hWJ(4nIe=1*=Hb@*7_giB>Fkj;Y-~uDEzk^_%~qasTorp|GMo(!QQUO36lA zG%e1GFD`C35o*2&lhOSd>*Sf=#@O zss{%^QsomhoSOb#+nd;*dOY=m>|ZSnu9glG81dEhhnIrX<&(f@#IcOwf9K&GlXlDk z&tL|8M&UUHI06}|oSOLn)d*>YsJvsX!1BHI{riva|494Ar9p8?fvpfk`)ZK7bUJo4 zjsWLV`~vP6zWhn|qqr0c9qG8D5Y-=7g}~LnQ#c*JGTY~@psq@ARVv(2v+1ToDf66G z+vie*hShH4LkV^DqQx#mhm9`KERCLXnZJe$RUwH#QDL@(9OMvEZ&Lk+@Nsa~H-z_s zv%UiZF1#LOu52#`@6^) zH!$aVI<6;1R0)w9X0JSSA9>$+QOW$JD(i2ha74;I{Tb+|869TxK{nsdUK?bujc8XZ SDnu=*5VfX4db;{WMEnD@mT=$z literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numba.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numba.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d9802cda808b9bc958b143a67a039cb875b6626 GIT binary patch literal 515 zcmYjN%}(1u5T4CCU{S0H5XqrEAPx~e#Bf3UB<0u&iB?G5B1@LzU7S_cUgKRyIHx=U zxAqB&P#>c&V5A<9Pe?uW7Ks}tya`Cm?u@>fk>;EEZY^sCD*Mwu3+o2JKb^c8eg#io zD)0jc5X2!ueT0D22o7ug8ZkoD$2Fjc)PEs>-<2;cH7O=bA(~hKeN2`wK)Y@J*KHe> z8%%nUAQ`8g^c9nrjLLHP^gLHX5tnrtup}={&c_jFicT7F77hHZlh0dw&i;|JH`$&S zoPdjrBrF(l`W}0izEt0Bqimh$r?FH%=QMRP#kh2aLX2dpk1HGWI^Y?hghh!+l`O3x zBZS7U=^Z@jZJ&d$$8PLLu1d3<##dJzPH8agC?U8zrt#Q4V*^)KYjzSp82KTUu9xKO zjn|tqdVz>l$_Beqk$GWP$Ijx6B!4!03pq~GN-@wnO1BC#j1Zc&0UZ`_@cut;eEJy{ z>+NadVeRA1>eQNk|M4=wM2<=@AHmN5C5wD^Y5xkYavdOM(=w>(F-4t^3FZu_H_!<5{ z1y8wp@)qc=C$rUpzS$jShJ9~l_PO2Og$8ejgVBux@M)6`+}~h%)C6;&KoN%w4G{td z7^2P-0(foi4~7nP@4?^tvZ;@%{X}xk5`!r*1V5yl>1t0DSLaTi>k??#gSS z4Qbx0urMjt;aJLvRJh5!Hn literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numcodecs.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numcodecs.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a211d6d226a407e820cf85c8743df16f373a30cd GIT binary patch literal 256 zcmZ3^%ge<81c%jp(s`H|7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfjoa%GA8V zLfxFy)Z`4^lKlLfn6lKovKXJtq?qE&l2qM-#N_P6^wi>*_=3vJyyB9?oSf96_>BDg z?Be+3{JfH)%q0Edk`%CjK8VysxTK)+7l%!5eoARhs$CHq&|Z)aiiLs12WCb_#t$+K RLK+tYG#Yq8u!sdH4gd@vOw0fP literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cublas.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cublas.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c750b4c9a2b1ca36605f14ecdb5b2d2f7902752c GIT binary patch literal 525 zcmah{%Sr<=6isHT46XivSSSc;!H&2UabXv_Xx#`d%0S3Wt~E?1GbWircm9Qc-~+*L z5d47_x{%qra#wKY%8XSJR6Hbylgs6vlaQ;$#VWFRSnc%h9E6_A!zbJi@v>*d1!9O{ zffC%qiPLj1au8r}FEK*5cF)kO*sAlRI>($N)O4TArlwOYN2w4H86pRqaY~|`Q4(@V z6$f3cL<*<@qKAp#GA26DG6h=mRFaGu14`<{=6tb1vLTn+P&-SJ(=?4WiBf445B=P5 zq5W^;Re2dzu~c}3oNxhz6yBF--6{qdNcNlU4SFe)zsCF9fuu=bR6YcGcGeOA(P_)1 zsR#xj2SJC2f#wEU8I5Av2Oa#KaZ?-i9(uFn)-0!;vqSlT*5skmt0n>CFF3w(mA>H5PB*OpYT7#%eE8eh#`gr zN^ln^Uf09OLx91*zzE&AJwtcSRlOh8dFCCWy8m2Us(blTtb~Br5;^3IQxa#4k{*{- zb1?aGtbtk}W|Rmn`^02vs=*kpBuS~YprtveFXZba9dT(ab-gq>RjO}DtfbYv*UT&z zrunVCE*_)j9OVHa$6Np*dGO^~bBaLA@~JmVNY}QuD|}Pc328Qu0&=bV)k|e8buD#VS|Lq*nCDZYy9qS+Nl}Sank*9} z&6U++a$bBvjt(3}yGcTW$x=8W4gRfh+eM5QT(Q5&Y{Krj<_nxSKAfuOj}k?*#Oku* z>gXtvoTrD8&2yQ|xSAzv^?c;D@PF5b{=K?)_cNaNb{DnR551fQw!g|di literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_nvrtc.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_nvrtc.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1490fe56b5def8c30d41922d129f531e2f7d6a18 GIT binary patch literal 529 zcmah{%Sr<=6isGShSvUoC=3W{!M3;+aiI%cR5yZ)G7!?qwGGWAW0EO!=U?~-J`nr{ z!5^s5h0NBKyFzzenXxK@iihNIatZgGTykBhl#s*YTC;QSA@oulKH-0e$(|FJh#`gr zN^lD&UdzMCLx91*!U)~DJwt2GRlOh8dFGvBuyf#vjNES^O^vNyEUtn zi25M=QIoeL!!6WO8uw@iO!RlghOz8Dbfe(fENlIJ6tb^vTu%qnU?)*56R@inoqsW9 zbLwd9V~od3KK91we=4EHjbVBHCU`1ujmldW!E?Aj4EG-npTeV2cr-*Sv!#ol@CN5z Bp+5is literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_runtime.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_runtime.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4b9fed040ae1204e8fc364ba9f45fb1ddcbfa7f GIT binary patch literal 531 zcmah{%}N6?5KeZhENy)Ov9KVh1zYhd;z193XuSv?%0fstV-3w_w@J3pn{VM8_=Dgx z2);lIJ;+`?c`NkRli5~9Q1K)A_+|(*-we53St%lm=Z!|^(Lv}n4?f|3i0Ppf*N7p8 z1&VMBM^4MZ$U%U?y}<}Q*t=JX%P}P0QA61=fEsTYL&=A?@j8hV(jFL8& zRB_PRdZ>UJAbJo9F1tjhNuoe&9!ru?V?arLT3ybzNiyJ48)|DQav8^6O~P0j#oP7N zaG~qp%By@BRj`zKgj{d|gk;`V&x%zH5|He-w)be7JD>HA_X0_yz^HTpve&B#fbg-@6TtF80Ypvd`gV1w+_=Ni*X1i9LBZe3j zD8d~aIUNTh2LT560wZ)|_Z*!CTXlX^7nyT}s_sjEsp@1aVJrlMhR6|ToRTnQlyteI zii6HpLj}|T(c?&PIUqVs5(QfGSdxSq14`<{>Qc5zk};RsP}@t9ejE=p31ev#@77bp zg|2^Vuky#J1xuMn$O#ufNalTcR;*%>fMmbfUZYu_{PlEyE08n_j7rBKhr^lx2>Ue? z$08Vk90e`j4Kz1UOK3QtJGI_Q1Or)PA->wPC{;0R`ST=X|vvWa1eUQ4xey8#O%5h$Prh#rQ5%O25594pY8N0P+U7*JB5mY35V5)Zl5hT2(*bfc)JNf1e+c&nNi zE_C(Vc$Hm7VeFDufTxv{8jS*U3ER}tNH)4mM ADF6Tf literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.curand.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.curand.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40ac98f6197e5d5ee2718b281ed4ff87e60eccb2 GIT binary patch literal 525 zcmah{%Sr<=6isHT46XivSQrr0f*o-y;=(R;(Yg^_l!1^=t~E?1GbWircm9Qc-~+*L z5d47_x{%qra#wKY%8XSJR6Hbylgs6vlaQ;$#VWFRSZ(+39E6_A!zbJi@v>*d1!9O{ zffC%siPLp3au8r}FEK*5cF)kQ*sAlRI>($N)Nr56riN22N2w4H86pRqaY~|`QPSg* zDh|3>i4;%+L=O|eWlVIQWeT+BsU#US29(r?jrn4OWJ4~sp>~!cr)e5%5~b28-V1WW zg$}-rSLJ0?#ZuuBa>4}=Qg~mUb*mU;AlYxWH|V8I{u=LZhmt0tQTY($*;!KnM5j%Y zrXn1G9E5G&3pF>;%xDzTKIri8jGNl9_t2XqH)mOcC|6XnARE4VJ4woN0lR9!dY3P( zk1b7IjPZ2I#m*G{PgS(AKB}!tDTcu522^x@CpAzyzDq}ju>KC zpageu;&nZYJOmj03yjc>+cR|MT-EzgooC)5s{7AHQ{Bs#V4-~Xshg$AsZxDIVkNESy)d&} znDEJ)<%B>TpF;K5bZ~ zL^K3Bj5@p*8E&DG(zs7gz(jv%Y#PhnLpKX<%(8}YW|SC$4%5+Vu$3s53E0*Z=U%+A zIdU}hF~-v+AA3{uKb25reOz9<3LeU>Nx5|vJl5LdTKjJAp|(G%?T=A)wsi3i-T;gg Bpoahe literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cusparse.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cusparse.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b279bd580fbe781b38cbf27707c92764882321ea GIT binary patch literal 527 zcmah{%Sr<=6isHT41N57C=>*>U|YHsaiI%cv~C0!Wgw)JYa5!$Op{EZJO9Ez@PXhr z2>w6|UC3-*xhr(nl^LrdsCY;YCzs1TCm}bbQXW}6Z8f_O4ni;4;S=tMm>*hkg&1O3 zpb)ol=(HV-90VBLYmCsn-AlA{w(9(-t}y2eRovICsp6#TK_mnOhR7jjoRT16lytbH zii1u!0|nFo(W6js*(W-QV+C6CNRpTu14`=C%4)hx;t`kHP&-SJUKI5;2_k6}@6-~* zg|2-Yud>UioTbzwLH>_e1gJi$i-l2Jxd=Vb+`I3gdQOOA8U{DnRL9c3} zNccmLL%+#8zUBt1F%9~(3)=rXV_h5e9=e`!b(ysmBs!)_LoFUHy!|j@iGTxDwC>p( z>vKyp7h^nIbFni+|5F|ncgBV7TW?ZmObd-m@40+5E+0LfOvg-jD#S+ptL@ zqdus9)DoS@2n&srvK~DH6aAfW(^&oTK!a54-`W_MWf+ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nvjitlink.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nvjitlink.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73e0cea753948ddab9d246df358bb2566a121cdf GIT binary patch literal 528 zcmah{%Sr<=6isGShCY5kEDQ*0!M1cO;zAd?Xx#`d%0Ngb*ETkjnI@S+cm9Qc-~+*L z5d47(E@ZZ@+!eZWWyY!qDjt%<$tB!#ZpdZ1TtF80Ypvd`gV1w+_=Ni*X1i9LBZe3j zD8d~aIUNTh2LT560wZ)|_Z*!CTXlX^7nyT}s_sjEsp@1aVJrlMhR6|ToRTnQlyteI zii6HpLj}|T(c?&PIUqVs5(QfGSdxSq14`<{>Qc5zk};RsP}@t9ejE=p31ev#@77bp zg|2^VukvBkf~CwOnm-NyufnTtF80>#g3cgV1w+_=Ni*W_wngBZe3j zD8d~aIUNTh2LT560wZ)|_Z*!CTXlX^7nyT}D(*|(RB^JEFctzrL*$4vPDz+DO1fN9 z#X)Clp#o}v=y4>t91xu*i2|*8EJ;F*0VVZeWhvVt$(T!RsGX%qKaK~Qgt0V=cWbHP zLf5{HSNUbsf~CwO9UKRDf*uZsI)mLZd`c}#l~Z?appbw&57T+p8OUH z-YcaaqhDYPJ1cEtAaw5!uMxg%9zMIx z72>FmIOc)GMbHm03J?T5{D~3z?bbZ{A#a_aZu{aU{x%$n4AwU{lJEN`r^#_`bFGpu zQh>4~)5y!z zTxXOvE64SrGM2gfWv{YAnx3~|O5dZV?FGy)^x%abM+e)fVnu4pss?p_o=AW!PpsB5 zoq(F8M`Dl~VIg_(W>Pw?T{GtL^jVnt4wYiCW-Na$tofY0x$BMV$7r|Eypph2F1mO9 tADAtdW+BFS_A$h*8S*Jccx#F_-_N^fbsDW+@BEEA|Dw)i+mCX=u}{#&qbC3W literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-onnxruntime.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-onnxruntime.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aca6692a5a51bf9fef4c7b599434721373107d28 GIT binary patch literal 359 zcmYjNF-ycS6n<$%inW^{xacHyXuGP2xQTFx;C2*B+l0GtY0^v5!*2cyS0_dM8UBG2 zoVq%>6>hu9SG3F+EmY?V&L3pMHLb{P=yv;e?G0Bt zH&5TAMI-o_W zs3uXJmy>)%RGQT-T`OcO?yMACOIjpK<5eTEG1_=pT(?W_q7t}a9@Egx*C6 g^#_2?=5V^{{Wk0#&HcmY;M0%4{P@wcCOtFr3%i_ZAOHXW literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-opencc.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-opencc.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6506cfecc94c0c1230322617990f81042faede9 GIT binary patch literal 342 zcmZ3^%ge<81c%jp(wUeT7#@Q-Fu)9DeAWOmrZc24q%h_%`IdM< zrDtAoNg_~9kzQ#@W=^qQMt**FaS_PcTdW{W#VZ*;gADtX;%*g_mzWzbQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wXNl|8! zesM_(SU?{{>Ox$kS5Wzj!zMRBr8Fnit_Tz+Ab%C>0*MdIjEsyQq!<{@FEE%PqX!&P X7dWJ5SX|^#xx%5+zzTvz96%iaU8-W; literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-openpyxl.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-openpyxl.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97aa3b6e74521733d03017bc7f9c70901ed4faa8 GIT binary patch literal 346 zcmZ3^%ge<81c%jp(rcL*7#@Q-Fu)9DeAWOmrZc24q%h_%;Ia_G5TX1&v+nM*?lKw{e~|GXMe=t6Ecx0*{C9wBng?ZQY?l*J`v3Kz8;nEHJAdi7ifFA6c?NX@e@g` z5bs4(V+fUoN(sQ9hx=Ig3qw)8gh2U^GBKz;ekvT3fTMUX$0R5NsA9^SD2M+B<~hlq zFo)CxFKMP%TpQ?WZp6R6USDw-*F_!ZVwGDq zTihjNk5O5a$RB^Xy0!6ETVGpQ-O>shYj4&!eVGCG6;tOr^HaN)X@X-_f>UDtSg4L# znUbpOC&1M%v}rMl%Hvg6P~c7*x`@(1Ok(ny_7J?J7? zx(FVg?94s%M1SlfObch*IP2kT2ao;2nV&f0P32m6 np^X>3UO!EY9^%6{M{I^X>F}BNaS!TBQ3Ab%bI_ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-orjson.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-orjson.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cee2b4ede90211f8bf6994d3791f9c4f6930712 GIT binary patch literal 283 zcmXwzu};G<5Qgm%P@xJED+41^hR_`$R+fr|4OxoZ_()70U+Qxzg^9OdXF)s%Z{d{} zh}5l9ol5;r_nrPb>F$2g^nykG-7czT!r1?4j*9-E?PV-qtYV6N^H-+$3(F?iX-K+G zt1$gQ3);S6NWgYYNZtu;m?`OHX(SQQbH+njYo);IrbXxJmu<(*JN0xgtZamLT@QA> z&J93W=N{3B4cLuX=%pa-A#Y{5k`<6B+Fo1o(im_>jkuzsMC+Yi&dIAoV?HuRH$HOL l_PgmrgQ_#|=w|UKk4e`N!wKhnxH-F;4D5){bPRVM$9pr>R+#_* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-osgeo.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-osgeo.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c5215403e3d229a4378bc6eac6f8af08f02e86a GIT binary patch literal 1985 zcmbVM&1)M+6ra^uXdH0 zwH^6jln|&$3lSxd5CYN3bx03B`dH{cpoKk%JsEoHZ6TN9Q)eZsk=&G+zS-G%AM^Cy z?>9U8B@zh%D!)&p^56FW@P}`-g+Eo^R9OI?0tg_Zg94*4jIRguK!H`*LQn}dZC2+L zj`~@hS9lmygaAMc6HJvR{L>iHhxX(~8oh^Z2v$>uYPBE0kae_Uuzcujy=w(*OQE6h6%i(o8x}GoxLZ zv9`Z+MbU1gB-xeoUtRLu=+E6Fe+FCBI8QyFlkQVGA1D9j@_#UbM_^bHkXRe&T)Dll?+l}|alWd(u>WjkSH*XKEpj(f zEFl?2*8+J)8HDUt^nSJGWb99$ph?D!AZBu298P z{e0QwOp-^Y8}xV5OrC6Ip@!Waj8r{S#Ar>s=L#t;i&b25IkK)|JniUphC|8O@o6 zqH1CPPGQcE22A3zq(oei_MS5hsJfirG4<-maD{c1sFsDXo9qAPa_s_d9_$X26QDK(rku;amB1=s8~bf6?jAIfRo(H zeA-Y8X$xex@&f{ax6#>cYfG= zuvabE!nh-h(~8_&V_>)GRQ$Vm?9L@tcQ>wtT~pZ?qVDn|Sl^x-Bm`@)9NTpQbch pxa0_zJiu@hjlqjGwl0s?2R^EZ{_qBA6U|P%7>zeK;W7Go{0;6<(Cq*K literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pandas_flavor.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pandas_flavor.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa931506535ae3e237f91730a61ea881fc26e823 GIT binary patch literal 289 zcmZ3^%ge<81c%jp(mR+K7#@Q-FaYF(!Dl`oHJu@aA%!uWDT*P5DVRZ%xk{`cF)t;t zI6f^Wu`ItxuP8M=v$!O+s7eG?ydtrvD6!H{lkpaBMrKM%YF=h;L4Hw5@k)lzAj5xU zyIaNNCFaJI6qQz{<`ov|=A@=3XXuvX=jX(frRJ5z_+%!<6la#C>J}s>XD6no7RSUF zRA%NCmn7!oq!z_z$0z6Kl@w(r=@*xzfCcnHBv1#k3kxcLaoFVMrS>5%eYb^5v0y?`R{II2jJ>6yvC0myA(=gp-lqCS6|;iR)IlTwewsluou?Sxf)#hcz=JFkk>}kD)4J9z|x9a2ZDR>vV^1(o+*>_aGuagP3FN=T?bW*g literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-parso.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-parso.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e974861b9fcb2892375f05cda017e02e80313945 GIT binary patch literal 340 zcmZ3^%ge<81c%jp(yN&m7#@Q-Fu)9DeAWOmrZc24q%h_%W}4R9cyuS6HZ< zlbV{Gp<9xlpA%D-npYO%lbIA#oLQ2pTacKXotU0l91~wqnF%vK9&B)Ya(-S(QD%~U zaY+hTKp#W`bpRctS5Wzj!zMRBr8Fnit_Tz&AYT>h0*MdIjEsyQBL{Kvmm~Mzv#-s z7^zz)E=65V+X!f9fhs_z4H&!#n-uW|A{E1~rHd>u~ ziD+~=ZlqNP0rMjmSp zNw>9n^M_gjm70|TEG;ci%z6A1&cp3UF4un zW~!C5T58}G45$oP=#e{Sfw&XQ&ym6vrqtJd5Btzcn)eF5BNB?93d>yY?@BM#z|3eWib^3OpWQReoX6LX75iBz(kZWZl1N8&IL`Ahfe>gts(X`zjo=Zy|ZJVCwZLgbN XYfEbKN#|yL+h1SazXx@gGbj25vA~G; literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-patoolib.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-patoolib.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..869c0da335bf1ba2ae7447acf08f6f58d10dc6c8 GIT binary patch literal 487 zcmYjOPfNov6i?cTV^El0ym$x-%D{EEO+>tkFhuY+3Z-qbHLOj#BpqxgzlHb(6!ByD z1txfqUOjmm?6#9hyTM*w9`6q?zxR82bDRdy@_E)Dy;uPJnqVvT##vox=NVuy02pE` zfvGjHAg}A@F_|UhKfsJdAptUy-8(E+@PiTm8NhG3a#)UFrz%a^Ylt~pN2@wc$ zBH6h@L#hi@mGuCZuHs0=1SM1|#D|Cxf(b?`$9Y0z0~jvi)r+X38M(L}m2=VK`h<-&<6#)MTP%XhFcK}AcV++=nz?eFKy#?s*>QD1zq4l);)$DyYdryuzqOP0& E0ZoXPkN^Mx literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-patsy.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-patsy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55e46a0f2c647817fee021ae8652598059a4f35e GIT binary patch literal 246 zcmZ3^%ge<81c%jp(oZllFgylvU;xMmgU>ubYC1y-Lpoy=LkeRsgCJ}s>XD6no7RSUFR054GNzBPfEsD>`&(AK7PtMOP zDauUJFD^*|3+RJLpbn553Mzkb*yQG?l;)(`6|n*B1i8Cd7)X3zW@KdiAjKf0bU{F= LffodeSb*XHY-~w| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pdfminer.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pdfminer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7399bdea01f73c589a8b05b2e76b0995f8518b1 GIT binary patch literal 346 zcmZ3^%ge<81c%jp(pi`o7#@Q-Fu)9DeAWOmrZc24q%h_%QN>ab9}2-{6T*rD6W9YnlMQKtxc8imp|*%p>IwMhr{v~S@zn23G| z!7tFk4$`Y9Z-d=-GT9$J`10Q4yL%+F-;1Q0-w zf&jK*ptUs!G=L$}P~lAjt6fqFIc<({XAu05rAkwP{MFejp5R&ZDtljLUyPHC8{)JahiuN=7 zfeM~-5Msl5~Ix7XP8By&~RR~UaU1mh8+rVv4?wT8} zbZRPPRBOsqR0uIq(vr7cK`|zrmX(lNy}``7WCfga|Mm>yJCW@rn<|5t@ zZS}g!l$V!l>o{fch?0|HSB_LW;A&G#9U-)=13E)9IQ@S=toqEVKOWAl=E7=D%y%%S WjcMb4Jg+&6nllGyVyaWrq}VrwzID(5 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pinyin.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pinyin.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6070afe3244dadecb964ebc87f5f6c15312e473f GIT binary patch literal 344 zcmZ3^%ge<81c%jp(jPG~FgylvV1OCQ_^bhBOlL@8NMX!j$YqRTWMp7sNM%f6TE@u0 zuo{RVAc`r4Iha9{SHMt}{C9xziJ}omRwfGiWL1tcMW}crW^DXg! zO3%FFl0=}IBE8a*%$#DqjQsrU;v$f>w^%`%idQmx1{wA%#oa0K%HQ2s<8ph+ri3)iaRS|L>t61Qlj$X%Pnbl2Y6PD^sC;J_nr zD9`01Q$SbvVo zZ`OPS3KV6KqaMn=o`-;X1Jv^wQjeJb3IEAmGSvT!0KVJ300I#+??3tYR{q0(z8(CX z%luwI!&lI0{BrF&UUi4-J|*guiz>87XV;31nAcL}lq)@1zv*q~B$aydU@2y6s65q^ zdrQ%g;BUK~uv&jPej&6WS;o|MD)WLE<))_GII2c2=_q5m3Q18gL91xUDP@A^g;Yj= zg-gft>dpRcB1oPXH5xNm(trNh`rnI$JooFoVQFwxwwxFG2f88Dsni!s0M+aF4K zr2DB9M)AWPZRk9(<8-{lx)@)r>@7GwSCMV)K1RQ{s`e2=^#-74B|Nc&~4 z4gp6sG*J5-H$QaWb<6v$DQ?ejyPV5;(5xZ2aod^Vtr^}b=Tfggu(qh$oZ{9Dw@Tc) Nxcm4la!WNWkKarau-O0r literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-plotly.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-plotly.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..508b5596b410164a303198709c45830d03dcfdf5 GIT binary patch literal 555 zcmY*VPixyS6qlU1^9p8JcNpZj!61Ryx2BY_QeT5B{|@n`YqN^ z&{Db&uw$WLz=0l$PlKIyEA-aWo{|*0C%wn}qxXJ4y>s8+L?GAi4ki~4LVs-VDDAa# zAA$1&QADvo8ICZvz5~7!IT$&JVcMeY3I6Gx!Hi4Ll|(J5IdtO;Ll$%;^cnRg&K!cM zO`m^7z0JS2(8JAEDurOFNhmQS`OXE?PqVrlXOfnXZ8i!aji~0Y3X&d?30roA{eIXF z`q1L>JQXEndj4|tFqjd+VX9QNm*kY_#!WL~rk{Im^ZHA*pKC(^Tm_}!LI+bRkF;t5 zFJ;%zxR#P`{3)lDIHz>b?Ow%T?=D;*F|_( zqwS~n_Wuw{zrAklbx(KdaIX$N*4}90jc&ZriF@05Q^S3`z32>YI>TQ(SKsR0!$s%t K#J5NJfb$Q~W~lxE literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pptx.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pptx.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1aa87c1a2a3b1ee056767844bdfd837bb5244c19 GIT binary patch literal 349 zcmYjM%}T>S5S~pe#zH-K5$atGHt9`4#H$EJ1aD;_Y_e;+bdyc9n_@iq7JUOnd<c>_2h1};5R?a3^U)%Ja;;6FnBv0jM@&smrXWs|AN(#3Fbh7A^|BHA_NXF zM4cxD@M`QALx;Mz;BS4~)JOGRB86ayjwsP2y5oYWhuu8a_n~HKE{JC8+IQ>yo9Zf4 znwZ`qEHxJ@97{P-gw^%`XidQmx1{wA%)7>g2FEKZ!q^PtqHLtKx zHzzeUIYYN3KR+j?EH$qz#wRl=rZ}@CRkt89IXf{uwKyiepfVF?d_36T_~iV&lA_Ec z{o;}ouz)^@)J1ZZUP0wA4x8Nkl+v73yCP7)fIL^M10+5$Gcq!MkYZpoy1-zFj2>`^ WcJNNfy~v?*g+rx*6$FbofEoa{6J`Mb literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psutil.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psutil.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a9c3ca055d226d7a246f6159b66827b67d7dac0 GIT binary patch literal 1777 zcma)+&u`O66vxN0J^qn6p@0P9hbX9m1`=`s2_e`OKgz07H(hN&peR!1W`@?(vCWLr z9~YFvo>o0@qsNHDt`L95UiT13mJ-c%PkXb(EvFr)ST)%YWjuNF=H>f&?|CN5pN63W zKK{DCw)GAI@K3x+hWOR_lHuM5fB+I~P(NOUx`4r(Od>^@ov~jRvG7JpqFp)h(kl}G z5CHhhKgXjE=U}7>Mwx?=Cm3}O22L>A9E>u-=vehcta$>~>)APYb%M{$!DthVu?3L+ zQK;uJB5l)!Ja2Czs<-z9RB1XrF)=S+NLOe)8@l^NaSrxMv2L}4nC zn?anKN*FVUg=s|mF2&RT#xGlC8OLX`Z8`0I29ZhjET@=Z%4>r0CPggUvXEnKZTs;? zaXswB4s>uF;6jXoO-ly65th(yGKXHNyw%9 z=`By4&M+>K{+`z$25+9^xnZ!`CKOW=|42xDn`9w2r@1LEung}`qz9Bqj@iOYdAVAB zy8g1pRL?g3*Dh%>o%$y6>7M0pGkI;b`r;Lne}432y~dPhzpku2u03VS`Y$Wh*n!oR z=kY4WMy|c6a+UaK^%X1N{ifYU7+EdP<=Ge{xaIC*22GD28u|pj@P5Du{dB*<8)^8Y zeSn>}Z_75u&F!-9x^`n1JG+fFYqLQuAD2C|xnpi&+Su?8EQj}K+n8)@yY3F%Xu6J1 ztj!Ab(Kt|vZTahYdIux*LCZyL8~;F-dC~a4iT=%PBnpBMod<&6(c)(a^v?K+Ajler zH{L)0z0y&JYW6TUP_OjWD_tc}mqT^ABd3FEpcX^5$b-6ZSQ_Y8`})=1wFiOzFw`G% z{v_Hh26`#fOFXFM4lfO~#lE)KJs)T{L+xe<4x!P5*WRDw=IB{ROx5Tu-U-yZp?a4W zf!c5O0AB9H%SSkXOCen9h>@h6$wVMAokDaLNLmE)LTMsoYEE zP|igl_l@LsAXP%C(vvFu4CJ%NubYC1y-Lpoy=LkeRsgC%TpC;oi-i*wYl+?V;+=Bd~lH!#NpFui*rMX+hgJ@TCTHlD z0$@ZWWW4m>W}4 zR9cyuS6HZTZlX-=wL5h#Q}zAV-S5+9fu85uuFF)*56 eU@${Q4>+VQa7fLtzsR9|g+sf66$FbofI0xMv1p?J literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pubsub.core.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pubsub.core.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a44c775238bd1d2088b93b469d79455b1ae21a29 GIT binary patch literal 429 zcmYjM!AiqG5Zz5ojh2dd5&8i_3Q0l4LQzkGC`AN&DuE^0-L#?GB+YJ0)02OpU!aJ7 zfOjt*BY4V5@Z_z~TTgCU3w^UQ%siO)W}hmRZ6NV}(CVHm0Q?lg3Z?&Mb|{;BKmdUZ z3}6RBpa2SqLR7Lrw65}6dQ<^;k-0=iA)B|r(0_~3fcYK{8KYPr;s^(MKBIh6juMwA zu7$&xwkKN65@RvhsnzNTMJaZ0k0N9!`K}*emJlk*SS({{6G}FCL-TTtLJFSR#ORoO`5`u%i literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-puremagic.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-puremagic.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b054a4e6e5f14e1368ed5151ab320889b24cbd2d GIT binary patch literal 348 zcmZ3^%ge<81c%jp(pi}p7#@Q-Fu)9DeAWOmrZc24q%h_%W}4R9cyu zS6HZv?Md9ST7?#KfAaHWbrNDjLejj)V$2xg8ZVA;*|`aLB{?{aJP!d zOU#WaDJrc@%_}U_%}Gs7&d@E%&(Db|OU)~b@ySezDb6fO)h$R&&Q45EEslvVsLX^} z6A!i^J~=knf6hfy4)9Mn=XDQVfjd f7Z}Wt(E|ac3j#_DtS$=ZT@lc0;03`VcAyRb1U_Z4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyarrow.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyarrow.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ad64e96a026337cdcd2c026f31c2b46e3081f87 GIT binary patch literal 650 zcmZ`$ziZqu6qfAs#i?s>e?TEaQvxYm;4V{#l#q_45R!v#hryLCH78FK@iJ$>-~TL|Rq|%?YHQ2>jK_?0=eD#VFAvdd&@Xe;G&1oMb$SQXZ>jr6`G% z;xzeF6|x#$Ht5W>3%%esXpEtzbMVwFl$4{n#qICO7oy!zE~FOjWkbHZ=PM6 z{-pUd>40hcA*Yn(JS&9Ms&UNVRO7}xCz3NIS52gEjHwA+ZbrQ)?}2N^pb{`wHpcks zA;JXL=+*!Bk6@z?HqLkICx>PS{YlWD2K~yvbk}Nk?fuTg-JH6cm2>H>*WUX1>crcc LdRvui)||v|xQ4f4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycountry.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycountry.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d337458afb1bae4d920ec620f2ed796e6ce1056 GIT binary patch literal 421 zcmZWlF-yZh6n>YqkhWxTP;e|n=#X|4M4VzpC?dF(KuB|E8+ys5cb7t(939>K2Z}hl zxcdiM=#DfDe7xM&+kjd8&B;3>Z;J zP#+~m-#}mhF|hH70AAGo4uzq=*p0gCo7lX9R^?MaYZ>KE#3&_^3~(sJ;5w#6ly=0j zB1nh~HCWcNB4T+ed2!LIlzW%Oc`9V6rg%G-F%|6*V`IThMaZ?&vZ}|#Gpw}6dU$r^ zr(xnto);vYOk7GxG;$?l)Sr@c>i6P-FJejDER4qCkO)7>ig>FLY}kW{DFgAKBP8Ac z9bMgDXYH(5TgM5*IVC5&p>*|6h^{J26Ct$R2h>F~IQ^f?I@EUW?ECTDYA&qi%sEu~ T)|flq!tv&ocU#qq*A&$k#-e%+ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycparser.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycparser.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97ac127bcf350f0f38fe94e46633ab77bdf27ce8 GIT binary patch literal 276 zcmZ3^%ge<81c%jp(zBTv7#@Q-Fu(+5eC7i(rZc24q%fv4MKPo>1v6+eR|ynUCKn_Y z6{i;I<)l`WBqmh}B19?^laql$ewvK8cr!9nQd09Wa|`l|N{Ux9d4RA5erZX00N&>#{d8T literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycrfsuite.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycrfsuite.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6932a4c88367a44c1bb840512d200b9e77041146 GIT binary patch literal 300 zcmYjMJxc>Y5S>jBgK!cH75o9h6_@l9Y;A%HcCv76ZYOt3_A9%4flKATu(uI^hkw92 zZT>(Y*rak#4dl)6c=M)sGw(@q0ui6rn^3PuN0xCNd67N&8N-DuQYN4!g!GFNE&DvFWH&io4 zgR2|V^LZu_iz*AoNV-71pkpziKIUbX6*E?%r@3u}_JK)>F0YK4`MfYXI58Rez<-Tl s%h|zEw%PSY%J5p^tvimv@pJH(kv3gI$mR;p9?4h#A@)nsmOF~O9}=fu0{{R3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydantic.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydantic.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c4c924ecd67bd42e5d3fae0dfd58c85b980a277 GIT binary patch literal 998 zcmZuvK~EDw6rSnswuMqiOQ8W1;RGqTTOdXa(H=DhFc>*CO`7e_(2i_(mzmkd_S7T) zK##@)#(423n0Pnaqz5vmCZ4>l;l|0?){RzudGj*wy>H(4-pstuW@mwvFB^x=Hz@$V zMNTa0ug&#Wxp@r`K+pzlScUCGH31_(A$_H)K#%}fLCPfr;GvBm4mZ%mS`1jQm@F_f8{uv3Cr zFXwfU>2PALS01hJ89T<#W08(yB5k>CkJuPhqRCH$dP03%nu+4JOIeqR3^KWC*(PI{ zi4?*XX`8lCUozJbGsH6yqL|5yXY!U!8bbAbfmAc3vW`o83o&)n z&aQE{mqUbcpA(xI9ZVT;M2>eo;xy~{l`I-T*t1en6py=49mY+06V#YgXu0kg zqlz4bM!$n<(uj<_mUv8&Z4rd9L)xB8Ir{*vB?8=>KH0B1X1m6z-^I@Pxo%@@wRG;f zcC91ls2!34%fos?Zfl z8+}D~BTcA42*XtXk6-`}|J5sSKbY1q4b)>uAoTL1AxL*y|sS)LaNM%gNv72gqp2 z{*i2JZY{{%4%T)CncZP#Hv~{CU!|9VRXtcS25I9WJ4&qvQg7WEr1W7*{}19Kdyx(G QheLMdDE9G>H?pOyjf@PP24}s=U~rUf%m`f3}}LS1JY&_WkjJGbjV_JNqe2 zyK$~Q3g;6*06_{|*oCgtl^}3HR~B870ES39hX8yPJ-4uoMGnblFs=Z>LkdzIsjGUW zSzIgPV!Vp886>oVbX0OAte(Md#t+ou%UypJqy^$!WfEM5;HL~P%!??10UY45f7%u>926Ke^C#C$Ja9a?ON^B+@=Hw)$SL9)z&qB@wDezZjXnf2zw_dEsC){Y;oVG zy;JO+_72FP#|X!*z_O1m2eV#3h)5x(Ka+>%B@pm81K~kwtY%-hDmL^F;S6Uj literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydivert.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydivert.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00b388db5860012230ff642aee7d8d5d6a4300db GIT binary patch literal 361 zcmYjM%}T>S5S~peMxmD;6zW~fA?d-QAmUYoB7(OPSkmmaUAoDpyPHTn`4+x`B0h#M zP{C79f+uf<-gLUaW zP(++31n_ENjlM(NTkyBOZRw-Bl?cvhqA`hejE9UDJWW2?jk(rW`nwObdkY7|%yprKFNb9c*cdMAZ#N3#YqSDILyuw1=oYd6h4Be9a z{G6Dw)V#77pUk9~;>?m%-GapA?8Nlc;+Xh?%FMjtlEj>x)S~!|{QT_V_~iV&lA_Ec z{o;}ouz)^@)P>rwo0+dyQ2C3)CO1E&G$+-rh#hD#$l=98K;i>4BO~Jn1qLCx349H_ KAXvl-6b1khX-Nm!&6tI9kh}4BTKo{r$y@JYL95%W6DWy57c17$!n?X)576K9C%vKPWH=$xq;K L;03`VR-iBd!W&8Q literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-ods3.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-ods3.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90487b69488029987e5d2aad329869cb36e925b9 GIT binary patch literal 251 zcmZ3^%ge<81c%jp(iNE)7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfoa6DX2`XNKVa( z&rc~f_S0m%#ha0tl9HO2nOl%wR8qW>;WJ3{uPk?~n7qW?n3AH>%GA8VLfxFy)Z`4^ zlKlLfn6lKovKXJtq?qE&l2qM-#N_P6^wi>*_=3vJyyB9?oSf96_>BDg?Be+3{JfH) z%q0Edk`%CjK8VzXx;WJ3{uPk?~n7qW?n3AH>%GA8VLfxFy)Z`4^ zlKlLfn6lKovKXJtq?qE&l2qM-#N_P6^wi>*_=3vJyyB9?oSf96_>BDg?Be+3{JfH) z%q0Edk`%CjK8VzXxm!&6tI9kh}4BTKo{r$y@JYL95%W6DWy57c17$!n?X)576K9C%vKPWH=$xq;K L;03`VR-iBd(WXii literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xlsx.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xlsx.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c4324f23b2912cb3cd9f84360aaba3bfd38c0ee GIT binary patch literal 251 zcmZ3^%ge<81c%jp(iNE)7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfoa6DX2`XNKVa( zugEE`@Y7_x#ha0tl9HO2nOl%wR8qW>;WJ3{uPk?~n7qW?n3AH>%GA8VLfxFy)Z`4^ zlKlLfn6lKovKXJtq?qE&l2qM-#N_P6^wi>*_=3vJyyB9?oSf96_>BDg?Be+3{JfH) z%q0Edk`%CjK8VzXx;%1n%3mBdx%nxjIjMF<>_EFg&My`Q5+9fu85ut)FbFAL O5KwI31;HX#pf~`V7))UR literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5c913697e62e4d8c893006ae23e355ddf40e4d7 GIT binary patch literal 907 zcmaiz&1&2*5Xa?hDW%{-b1Z4P{b1V-taA?`*Iq&|y#<5OT2otHS<;TiA=0UD(R(hT z&(XK&wJ)%+&_hnK_oIXab!9Y+H9!9IM;>3N=`+@?U!$|??_b-f@{tVP3z7-_xW#Iva}Ga*X~;~iiRtqq669VkcSe#4G-un46= z;le?T+YCbVg718yH!+QQ3+Nq?`#es5r?nIUv}~+FazEL!ALSePbewD6=? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_io.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_io.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e2b03695b1550c4a9faaad37d64cee0306df676 GIT binary patch literal 619 zcma)2y-ve05Vlh!pi)3AATco@M2ECHLaZzm3mb|Qx$!A6b?nr3)5a5T!OnvE9J~c9 zFHoslCY;i$L240a`P2FSzVH0*`)%axyrFT?uQO6zh(9R8vzk zuIepSs|L3}vX>2slo&D~8oDgYrCO5HXCe}5um7&nBTjgnLRM~{2h;z|+f;4lJ#_G= zpE628{D{&sv~apnmEPZkf@Gml;}XPZ6mWnz4UCjLEI<@tpAACozA(s1JR}L|Fv?3N zv>}{>ic%?uI*O$*iVb?&&}E=kW6;<(FRO#wOwuujJ9X%YvAg=*!Muero?o<2yg6FK Ki(enL@6z9M0@kkp literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_ods.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_ods.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0242294f2fc6a1d78adf40dcdb0e0dc991417f9d GIT binary patch literal 313 zcmZ3^%ge<81c%jp(qoty7#@Q-FaYF(!Dl`oHJu@yA%$TPV-!OQV=#jzlP1e8?t;qH zisaOs`23XODgh*p9#EhNL!`V)2&N`8U$49voN=j;8W^O@#QAzPi zhR+~de`UH`#pEUC#*`G5R;K0^7V74trY2|TmgMK>#FVAxmBsjECdCv34bd$~OwLYB zPc4p#FR0ASD=taQ$w@7W&&bcuE{;#m&nqd)OwundNdXJ!gGgPNJAm%gE2#X%VUwGm qQks)$SHupqnGuMK#eu{JW=2NF4+;!|af}xPVu7fE7X*t~fpP$&oMUkS literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_ods3.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_ods3.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7714d238a3823b3f292d0d381d34ed74612bc028 GIT binary patch literal 297 zcmZ3^%ge<81c%jp(!H4&7#@Q-FaYF(!Dl`oHJu@yA%$TPV-!OQV=#jzlP2>mo`TBM zisaOs`23V&<0?U9o*q!B2vexsPm}Q$Z$@THN@`waZb5!gN%2aC&mc>FWw~3$gJ@TCTHlD< literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_odsr.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_odsr.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a5e0a2e6a9aa2cccc8efaadb53fabd59aa4f73f GIT binary patch literal 275 zcmZ3^%ge<81c%jp(v6rH7#@Q-FaYF(!Dl`oHJu@aA%!uWDT*P5DVRZ%`4&$>Wokuo zYEFE9N^wz@ATm!6B;=>bc#Ah9GbJT8FEh6wzo?{mCBtWsdB3vUtzz;Lb7M-1N-Im?t;qH zisaOs_==q3Dgh*p9#EhNL!{hKlkpaBMrKM%YF=h;L4Hw5@k)lzARB&Vx?9EMCFaJI z6qQz{<`ov|=A@=3XXuvX=jX(frRJ5z_+%!<6la#C>J}s>XD6no7RSUFRA%NCmn7!o zq!z_z$0z6Kl@w(r=@*xzfCcnHq%N|%3Mzkb*yQG?l;)(`6|nmo`TBM zisaOs_==q3iYg&wo*qc32#Z*`pC;oi-i*wYl+?V;+=Bd~lH!#NpF!6A%5t}g$xFL0`rT0zN?0zzc#!tUx&cRZ(7V literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xlsxw.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xlsxw.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..307eccc9830a89533f9c92138459dcb48b6fc449 GIT binary patch literal 279 zcmZ3^%ge<81c%jp(yf^o7#@Q-FaYF(!Dl`oHJu@aA%!uWDT*P5DVRZ%`4(?MWokuo zYEFDbPH{zfl`sld4=m`X$#{!5BQqr>H7_%_Ait=jcqPMUkdeQ#-K}Es5_4lpib^X} z^9l=fb5c{2GjvPx^K)X#QuE4Ud@_?_iZe@6bqf-cvlG)(i(}#oDl_wnOA>Q(Qj6j< z^7FHccd0|fr*JZGc3MO1?u`Bukay3fr=TtZu|AoO?8!N z!|Y2HmL?TC97{RT$~CVWj;iOda+2%f@;u7eG%~8JFe{2cASUC$NGYNjX0xcD4kMi! z404uC*a&qL=T*9uk2k_`A~U1XVOJZzDRi9=cIOK3loe57UajfHRPs__Pq}Y$tLnhI hrB4W1wt$>1;B@zV(bj^to_im(^GQ384QGm4#xEchYS{n) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pygraphviz.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pygraphviz.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87253f3de4f9e45604a7f4d2198fa9af7a09e334 GIT binary patch literal 2302 zcmbVMPi)gx7=KRe#7UDTO=+N6rIre%B+z6VQ!^o2G|FHrVeLTL!E~xzzn8?tv5oDv zBp}ga#E___N<`D7RR}?+U3%DIN2Fai+Q<^oJ5}0gw@BQ2+OyM$1VStA`SbU^_x*dn z?|aXF5e^3d8Gk49#WV}RKhB~({0Eb_PrU#<0T4h+0$fW{9ObS(oQFt{S?nHat$Pe=yz&W~%K%3=mqByqVK&1N!LGRYDk?(W#5 zE7(Ug0yHq&)>ggQbf(H?53;0=ld2_U8G96`(9)_QN;tMq`Bv5qUXqZOaeBZT8u>W_ zjV26_bXp-&kqk4W&elw092b_Xc}+w*0mmCW5h`hrj%i0=pKGmPAFn#Wn09=KjWH>_rXmh1pGeec=tZ!3H;&rY{okG(npY#WZ(``(J*u;VwHfC>;V!fICN8O-tCup32V#AL^4?~-P2qXJvc&S@BJB z>UDBz_x|qMpZ8yWZRO_d+?0szPS0Cs=B>nnomi+vYLUHx zp#zWK&i- Uu-MZ!d)jo#>0!%D%aU989~?140{{R3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pygwalker.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pygwalker.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b47aafddad8d1c19c08344254715cae0e27be04e GIT binary patch literal 348 zcmZ3^%ge<81c%jp(pi}p7#@Q-Fu)9DeAWOmrZc24q%h_%W}4R9cyu zS6HZm2_!jyEiuf45 zKm|{G55WP2m-(YT6=&1JUd-VzeekqpxwBhG%rfQ2N@ah1SLvZ!lgl!Sb~OJFoRkv*(`S< ziio8C>yVEMO)OW^w2@|$f@_zw3KfPSn=+J_HdQiOV&^0olM(AQKRtssthN#*1WPRT z&G4dG)y)6MoVV-M8pc#57+2dD<(V{=xB}fNEElGeDm6CRk6txAf_VaSkNlOM9>tPm zvDHP%F#*#F$N{RT2$*Z`>2eILnML(2GjPue>y@baLVC+|+`JihoT?D$`M*s9W zdHEF{XNnero#+kM*zeXHIy0+52xmJ1tj~ZqA%KTdaIkvc!`*4Pdw={Iw%)?lZNneE H?rOgQ)sL53 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylint.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylint.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49d751acbab77765ee82b625ec8c3fe2c0b4d9da GIT binary patch literal 969 zcmbVK&1=*^6rV{Z>9)=4R;0y)SgMFQY_~0iO5OG(en2ULo zO=41q(v_bAG5>`)2AOyR98*?kM5pHEwax@7y#)5;PxUJsWjFjJ45=?L@q~wWgOKt+ zIo{rh64F+=*?{Arj}wN+Kz6G^#RZ^NV^0Vc?6d{#UT<~6AQp=l2XP=U&dgzA4ERmz z?@`8Ibt|J%Mq3FJGUbnnklRF3b*X1hq&WiOFYL9X^zwifNGew8HePGqoQav|x!#tAD17S^Gk4R2GJJ( A+yDRo literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylsl.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylsl.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee5a36b186382bec5546a9d7f6d8a90164c06576 GIT binary patch literal 1233 zcmZuw-D@0G6hC*qcC$M%-Na^^h&ZjSx{ytw#40L6KwArS5ep4nR>EZG?q-s^Guu0N zyRKwqkv^=D2YqT0!8}Mrs^F6^J{A9gjYM1qgn;)dO(BB@8N3D~vRiiqcdoDgjr$4;4)Ts&0%| z0M&L0z$4_8Dh4&UO$`bgnXzvtJD#1^uIB2y3a&*?sjf6gWx^%50Ba~4$$4eOHJ+|P zpaE%KG4qd1C>NE;U_qlnd6f0SfH{J?H5nO`Jg<7U2p3pKNFRS6>979fv^}r{}cX0#lLYeCz0Q>Xc1+ZSGwrk38~o-c}Ox@iVCs(Xw^I+YuQ5Rq%F~`giY^7^SuKk_ZA;y+{3f)tla0HS`26wVc|f)1YB>wbk|fP&kZH zzPcU+o8f9L@CEnQE{DQR9G9gmC0#AHx{*2V2wUm$DJ)$;4!=avhgiw!)mi_N}EDl!@6y46cu+a7HF)M`zA{p~ouDj*k8|t>5Pseq_V^o0z3r zC*sfSutV7~Z6;Yu6o**&?tz0pC1d%tuNP zM%D-28)GOJ+rnevVuBx+*TdywOwfw78lufjv?HzMi1kR@2s}T^u6cg?I5HiF`<~zU z9u6@H_%kS;WZ!BgujFk$kEZ-3637uRLgINKx&DM4BUl>#-xnJunTg?8*pNRrcxAiv z(A>*i+Rt6;XAaa{37%Q6rNe{+G9ITg7afj5qBeKC70TzO5B!$s-`HQppr&#Ks9dMjd$W~vOmtu zCaxn#3Q`X~Z~zGjjy{E=UO+;KBM6D}y0X;Oo+5Fo#KBT7RZq;UvxyUUJMX=jdGF1> z`QDo!5{VdK^ykI9)!)JZ{LL2uNk@~zf7s+ZpaK=@z<@<)2t@(%wV;O#u_zi+QG!4K zSX4v%5P+wQ`&10$Fuj8zy^RHWOBEl3VkF8vBm2zZY2XHm$h`0-z|pq=nJUJZU0RO^ zMpeSGeSvv1?i2fWxQOm^8T%q;qQ0)fI(QVi59$yjf^ZlkHMA;J;Z6boKab>@b0ep7 z<)?n;a~8eeKgtSTSfk~-W_nSkRfVuA+Z?Z0x{fP$S#6k#p;gMdwnDwIZdI$8c=1}p zz^bNb=BiaWO4wH%&Jg3nznEZfLKWy>x3A$YWNSeejLJ%i5sjie=hFTe(7Q)!(?nWp1Di^0kJSDf>5|4QgYfe2hwPC6Z!EO){q6FtG<* z^ja&*KNp>Ig5jb&&gpTGOn>|K^W>#x$xBb(>m;vtlh<1jH=cCj88UeIpbQiE3BMl|mii0}>|{FSgC;ys~Z>KDLEoGOeLoqtrpHCwYx4`MG;SBS~({39S~ zegH4mEA+l$sara}MW)%3_c$G6vKN97_Rax#)dBDPcevoT^M9ik21BwFKi^Jt;`weo zzlYck8ts7zSonU@SM7Iw)f1x!fdV(>Gd)R^p`_AMXJ{nmQ3K znrwx?8g^1er}UtMmb+-#LCbFX4elR&FB$bD7RNOLXoANV4$$b=M*D#?G2@KScF=4K z9YjW0cR&TYVsh`p$BWKbxg$R8iVvM&a2OQWccSAAoc-8U@Ut{G7W#E;ZaDPEFrWSl DPWjNT literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymorphy3.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymorphy3.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e955dbe6b3a6e700c4e587648547d0ba3fdfa2f GIT binary patch literal 706 zcmZ`$&59F25bmDtSrW0uEJnc<^q>n#%paPIh_^+ARRk|O%reYQx050Bx80qE@ifQ0 zfp4IQ7r{sH1!f?JWljN4-U55ulif*HFk*F8QT-M5Rdw}eLaqQMKlTrOjsW;zGoaOp$|orbI;UXo@`#H34I z=~la55{Ar^j=nkXgOG`8H_f7ir{nCALjz9=hfn{-rju8#o$A)>>_sf3t2lUXDuYn; z#z`^}dZB>pEpk)2%GC6tBIAHk7Oy7~U%hf;**nZ$e1_o$|MQx zQx>1vhrzKe0?E3m>rGsr3EN4t;Igl?>gae$EO~I;7m}`kzV_WePwA!EMeXT&3D5X7 z)mQ(T_^#X%K?s+(0elAw@b-VYs5NJ#xY;gioq4U3n`gi*>U&!649fa&ULTfVn462n zgW~#rPL?|WHw$#5Xtqk!o}=~>VEFJ1*JnqwqhhaLlEIt|N<7F96j+eETJJqB$!JbS dB_8Dm3*1ocie{(8o&2Rf%etai@$jo^?%#DS$YKBh literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymssql.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymssql.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ec78d5203eb9ad29698f6007513a60baab7bd65 GIT binary patch literal 479 zcmYjO%SyvQ6upzgwmza1QNfK}6|+c!f+!;0icm#xBP9^h&X^8P9?eXIbmb>>=O6gM ze{kauq~JobD!6i2aOcXTwdk2UmwOHu&b>1as=5FI@&)8d$whx$t9%yC8p>8Fx4i(z zjM&@}lwVQ8voaN%{x5+)w!JyvVfc8wilufO~&81_WZlsKk1D^1y%CTAPx$%)T} z!x)K-SWw1|ZV+7asMsY_yA)&MQ!fl6!Jpu(nBtopA6mZSSt5!P;`e$wBc#*SMG!FS zhWIyDleR5R1<^yNbM3fU_s)y=`;tvZs|(>yk|hqCr2Yh#d6?Omy+>-EP{x@Ha)^Y*kj SBc(d%4q8KHYs#bIUw;5u>5yLl literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pynput.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pynput.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39a7c00e19ee6f8b580d69ced532b600536c4a1f GIT binary patch literal 350 zcmYjN!AiqG5S>j#N+A%u2p)S715J8U5%DTQ5y4vtge1E(OEGXi*PwZp{0?mYy1KQ;_dbC3(hNNy5cWu?FsBf8m_HJ6pS4czANuD;>gq-~9g zDnpr$3L$1%S=z=cD8_`-QVM1CE3EC%4ZgmJd0NIsRW;%BdB_OKi_i$c;sxQ0cuccc zQ$s?T=CgE4bezbV?r4%NL6Qq@6wOB3;B8`LZP;xV$$Hbf?AE+mSsi-(uad=@}?c!XYPPLZAUi zXyb(dyxX_KxIw)K=pOty+9g#xMH3YzJ{lC7NfEKUkjm)luqY*+BzIk}YTuW)LYtU# zRK2-jT=z05r&>Af%Fh_3DE{h}uy&m{^yV@YaUL2qFHy{90Y^--z(~o%1&T#DVv|ra zgFz7|(>O&P+A-K(CfW)_i4;b$Nnabf{ph?Z3K<)%5zC7pA;R_;J*B5X*&2Mc22Z{-)wDIg-gRk{ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyopencl.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyopencl.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76712c3478129ebfb8b4882cfa0d6d9112b6a964 GIT binary patch literal 426 zcmZWlze~eF6n>X9kSJLMaS((qmJVrm5jTHSiU@8Y5Ypt@#$Iyi-L(*L=;-LCe}N+Y z8U6zebdXGflUt!%C-16V^t*SD_decz-{YQbdjlli_S?N%4d7EXYgB%V#hEM~Ac6=H zNRW#X&D9WSfKjA9A%ItTf8gp^m%R3uzp(*aJ<_kBUing^b*;2Rn&p0iMGyrdD7QjN z2o8m>I=>qe%u6%NX@=8~T+}P&&Sl<8xd`MGYm7upc%x70fHPg{F|}-IsJHwD7RqAT zJw5Q!An^nn5Bwd0P*V}YG42nRtAbI;H6c3*p$@a8+BezWdFB8B literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypemicro.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypemicro.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc3fd232900fb3d017e552022023f9c858aa7750 GIT binary patch literal 1921 zcma)6&1)M+6ra`VV= ztGIIGk3$ZMF{A{8O(|3-*Cjdh4``v#e_*!=D)waPsfU7!FD0kGk+QZnq|niuH}Ac9 z`YQaG1<2pu5>DV&BRw)!-#?2~+DUg9~X^P0aL zkOCdquLa8?Da0Wk!omqaJah4o6b2iw1Wq`x!t4(67a#<+NI5D+IfSEYeeRADdW2p< zhyj965xfX_h)?R5MA(aY{XaqXf0E)ju7t;2P$Uh29_i5sF-rZvcbl=AfxjncGGjdWaeqWrod*;ccyL?jZ}FUn0zz z1(K`fa9J%9V}f_Wm0G2%kT7gJ!=22!mV%}(!=&bfue<371EmZmm3mQHyph-Ca^57> z8rC;9(i+Ca)wF3CTK)mnALMVV%XzArIQ{aXXui;scVX2q)@h+==q6E@v(!{NhAiXh zi=Z-dw9Clv>gaf|adF zZ?q|bH>xVZG}V)+Ti`bxpFy3`TXHVOiB>0zKzMdmIUS8XZBwMT0?wm-3Vt6pk}9j@1-mx4HOu=!+nfA{#S(_6MU z(-dc*9fkN4abG+h{C4!a@o&Z(>py;AkIgs7=6@Nsk_)!5*c28mVX+m3fCAyWTq`kp z_{CBFX}&Rax??Binu)pkLaT$kv%hn^VvARs;#CMf2EOs+k@!?>jGPWP`t5kO8P8fB xI*VWVI(XP`y>-Wq=bG`H70>bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wXNl|8! zesM_(SU?{{>Ox$kS5Wzj!zMRBr8Fnit_Tz+Ab%C>0*MdIjEsyQq!<{@FEE%PqX!&P X7dWJ5SX|^#xx%5+zzTvz96%iae==hg literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyppeteer.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyppeteer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6a8db1b7e653f1a251e6b7be9a62a67c55d202f GIT binary patch literal 344 zcmYjNy-LJD5S~pu$q8u{EUyq#B!_m2*ott7V0Q$}O? zFz1l~yma=1vBTUO2)4d#8j!|Mg{+eT4Q15OrY~zL(IBd;z-{)f>&sFb$~mg2G8xy= zOo&`7JGAN94*d*EOSPI_oW>9iClE zIt^K9(z0pN(1gT}JuxOYaNH4TmmTfN(juQK?X;UEZk+Z#rx{7v#Gc>3?|a|B_xnD- zpCl=Xp#3_#)>uj*^d}_-jX&7DEV2kaLMl=j9m)Nbkr|+4daT9DY>Sh*R$PuV^o-T{ zmLLl)Q5J#b8jPH1AUPRBm{a4A8HAp~=r@bU36*a!yAncjB9ahBB}f`1#DN4BB8|j= z1`SqCj%vs$;ErKNO+Ai*FBttsM9ge~pMI0mh5+>VYZ?n=38Sqe1J2&WU^l#~W2&U4 z9|ImwVf33k`F1^=KG5Vq6UKq&lyTwhx{=3`yZld&Z$>(WMe_NG$IKv>;T2DfVoHwU z)LwR2Vz9?kc(NWFm1dAphB_FB+Q`W{20=b@Tls;8dSvhDU_ZPb_IcQ5R2>teT&ND3 z?fBsui0UZ?8J&-`CJ$-NM%=@9d%qr{tu{+<^b# z^(g25qSyJP%m$O2rmo{nyQV6(Qmbn^wt^|msU&H>*y8KekS^je$Xx^_1Z*0c?xkWLV{nhL=IN24e+0k4~l1}3}5 zKZ1a)V%;RggNO{%26Ed_i;BIJ{Nl?&WX0v>;zDKdb*MDes=@65Rg-i8sW=713d9Y~PzYdIE(9^t3RtUS1^FSf(G{&q z(==~cg#NOG{(U44Q!wnl(g%moH;)MPRBCFfiVdyRHi>N!`Y;gsUIao@ffU+=Bq)_2 zrfJsz*Cqhj$Bv6AZp(yBN_GQI0lO$afn<@*A(F>;As1G_EA2KmR6^gUK-f`;p&5;U z2XtGCP13;q8NGxVy;4_}s)o|4+GM+fjoY{9bc{EfbGB*f)jQa@Q-!=$EzQPrZDsS8 z(!f@=*6wHnlxqON!{h6xLZ zNjeGo^-$7@z8;d@|L#3B@BUj4c@)ovY-}RtNTG20I5?nD3Y*G4t?Ax&it-YIWcEJ-D zeR0u^`o4JH9qm0a*X6%UyZMWMJ*F5pMFJ5=W>tXT@7#Zf>9+&9e z?A`=~q>?X{Jg($i4aXt?SfEpDYSn$$|etMDORflK`QOf2$;jAy54N)u(OmW>E w?Y+W9w{Y>7kAJ)BR#mrvy#n?N_?z)=ynB~^p+JrGO^(blYOimVoPb*V8qFgylvV1OCQ_^bhBOlL@8NMX!j$YqRTWMp7sNM%f6TE@u0 zuo{RVAc`r4Iha9{SHMt}{C9xziJ}omRwfGiCL1jU4YDH?YpCRYhv@$iX zuuwNAH8nXywRF+H_7CcdCD6J~ro*x>l&{JfH) z%q0Edk`%CjK8VzXxk;~}@)w6qZhlH>PO4oIC|p2(E7k=PAD9^#89yj6Fq&UrFhfQU ZIHWFcNX@Xi$f0(HL#=@o1dBL;Ish5#Wpn@l literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypylon.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypylon.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fbeb67fbe2dc26fb4d6242675c1d7527075b3c5 GIT binary patch literal 1119 zcmb_aPiWIn7=QWGHtDjz*}B0Z3I$ZV5kBAUWcMI*NGT(>}a=vUa(<22<@luW~b zC0o%{TUEAo10sL&%Ga!^RlTGbdJ*}&j+CmYH4LaA)z;Crj-iQqv)(k!T5CMt+^8X2 z#mTI>+}s`MR%_()PEsPs*p*#|HNB)(pQZ_aOs|!Uh6XVvs@_UOaH+*AmpCcS`J{>b z>1#ElhOHY&s+i^uvM5Z(3SW>F!^)3^T#!Es_j{=|y;?Ud8~IE~4>N*(JR;)Lb=9u; zOi@LVKZzM&tZkY`VGq{!3Y&VdfOH#X z>uPC7Ekjhm1oZwalwOBQ$*kFyUR*}D)^jX}I@=#ey?MdpqLv<5lelX5u91j!KoJBH z+yq4OfDKnb(*zlSe^FzAz2Pvz$#a)k@R)^zSP%z9++k<&ce3HKqQ{CZ5V4;F^t3~z zoau~9EqT;Z01`w7qh}VK^nE9lJ9u&?NRA-AZ+^e+2zgh?dqO?{R4mg|E;Dn;9E)e% z$kBS26FQu5^33H#j}yDxN{3tdoOZdK$K?V*vY9h}>doCQKi}c!+mBp6>+#txzuMtf szs$P)n#ZpN6h{5v#*g>gDJQk)OyTJC;o9$DG;FHZ8Pl(9P2hR`0VJ{`tpET3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyqtgraph.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyqtgraph.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6afe36ad9ea8952208db14d37d35b25bfcf237aa GIT binary patch literal 1226 zcmZ`%&1)M+6o0e&@UE0qY_*L+DM3w~fL$y#5ML5wNUTzvhP04gB2+J{ovFNdzce#) zEaAc)a_pf!ImaAIN{OMNryLvl53GwRLf4*pQ*jQ)r@oP_I8N#8%-i?g%>3rP-+Moq zW)5)te(hfCN7VjO#$=>Vl*3<9*#!!ec;J&d@wK`}Km$goMpG@amwu)JJjXR2^%U-D zxR-ehd)asP(sb%EuyhTc;o;|#D^Sm{4AontX9DVmdd={%{#1Qx^wJc~(fr=Icd&Gt ze*jm28FRqX1RjF2AHjC&Av_}U=HCi^UKBv!4a`E)}sC%q0d$!-C_6pDA!&h;Mb0}i? zZ7#XH{>Pp57!J`^@nw-C$@rO6RX2=MEupdtEll=n{aZp|hit(w*&XtO_ML%gBUN89 zaXM=N{=9oN)>%P3+jR$gho%KIJ^*BVtD^jJed8$1S|VKg7GLuf(4y zhABeGumt3DlEB^n&S4gei-}%(a_dDkxqc_nSNHYR1AR5l3>V=1M@gal^kTBKu4cj7 zFIWc!E6(>v#d-QMR%m~^b}(Iw&0!8mAt~NSW|sD032ogV*?xL0IXm&#>{4>!M!$Hu zU%E8Rq-L}K0E*X2#9yfIXlQ``-Vg{ePDMYh$F;bovN4X1j)dx#m)YAUyfQPlFQi_5 HKv4b*z+Yfa literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyshark.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyshark.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e105cf3f7db24a3aa5d61e116f151b0084dafae5 GIT binary patch literal 688 zcmZWnPjAyO6t|O>gpDA^)S{IG1!)@ubfwoEGf;I|5;#Nh9(%4O{I&o*aL(Ktt zLL9llCjcQXdbp6zEpzu)_7e{q~8pyQnh^q2p~v744W`Eng#^Oh+xw+05*{M83OQ4tqbC7*hB?XjEvL)V2-);55`g$ z3)z2QAiDfFrddEsuRv}2mv&n-^6Md^6o=ABfeidMp;+XrMEEg7eTsb%NFv$x*<#2BubsRT-~kixDU13^?QNrxRiwfO>b%W1Sg1bjFckm1`!r6NyyxO;jg;C zryM*;OWJ@iS7IKMB%rT3QO9&yU$^>%N|NN(Jm!m9F~9M0aF_@gsO-7hmxKzp!&p~v z-C|x)EO$BtA)Ju7$G8-EQI{ybf-_zEIez-sOM=*wyg$In@o}AE9CqrGG3u$jPrL?c zc|zq-UnKAOy#ZN-^k>0*RgC1MwJju?U2JP!U$m+>IJb8%I=RoUsHplm#XH5OCWLTW z1+W1#@a+FNS-G8EyEAkqW;rv&7x xdGp@L+8SG1Qviz!WtXzb{qK9(+QG;^c<)T?N@iC+JsR2TV|#sA)Pw7f`Wt+~&y4^8 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pysnmp.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pysnmp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..220df2cac43cbe70f80a6d717dbbafdff4782f21 GIT binary patch literal 472 zcmZWm%}N6?5KgkKEaGDEBGj9Lu;8{AdlB(e6m1bfPi0}*Zekmn{pluKSWkTm-=HG( z0lfPHTj)XdBzW>x=&dJ{{@}sM%rNsM%$F~DF^p{>?c=!FVF-Y4)oiS=F6NiAcm^0? z$bb)9&_^u<0RjYKG=cz(Wvr~FNfcp(wYS1Z&Kt{E?-X$H9++D{sx?u*=Y@A zFl6?C1OvNC+cu|ySdr`X+z#Qk??_Z_EO#0F3q*R-hYD42wFK5yZPTobP*C%>?s@I1_wPN+5 EzxaKQ2LJ#7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pystray.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pystray.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..248a037993a5a0f0b5ca30f7c7c4c857cbfda686 GIT binary patch literal 354 zcmYjNy-LJD5S~p$4?kcnQ1AenJ%nUR0&Fq`!?Lvpolm6(*0r;`O2JYIKpLWhO5Fm&{fd&YH z0~8VG6#;y7y28LA?gIo{zcvg|v!4mhX{HlZ4+}wRPF1s08Kq@v?gFQDeki& zR!q~dO0#h~q6#OKVH=ucNswfs)RGNjrO7f8TN|!diz>6|U9A?rmiBk-g(~h$>mr2O gLqO*)BkvXm^6rO5@4gqj_-B?H>Toj>=& z!=PE65kf^qNY$#X>SC$@Hb5B9iWLQ2`8lH$I9o`ejQ&7-w|by=!-S`c#HdvXe7Ot@ zfGiJ<5Jj>EzD`DLl4xcilxa3kXP^@zOUAWHivkqMZCXt-!Hr^*SQ~mA#E!!{iOqg! z-z)@O6>zKE&tZFXWNFvH81Jq;+}t5YZG_LCeOEt0@1?a3df!2R8}#d$YTK26Y^!d9 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pythainlp.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pythainlp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68597acef06fb259ec99480ebc5fc8c7d9a2bd17 GIT binary patch literal 348 zcmZ3^%ge<81c%jp(pi}p7#@Q-Fu)9DeAWOmrZc24q%h_%W}4R9cyu zS6HZx+iDHq8*4hfeCT&_p5Ywv)K?>fMz_Q6ql1cWfGn1AT!5lmk z^llHH74hQ#;6JdD9KxOgp1cKm%gLG46$`%i=FOY=y?HagH=hfI91!yTUcGZm2jHh% zq@w-_&OeIa13&;l7g%yuT<9s5;;EJjfda6K)K3tAuVP$?r6JAI1)?DRGD0`RF6d>_ zOsrkTEdv|9Y>M`l(gOTi615R94=>|ccQQ1SP376!N>)P^G-|=u_AjWM( zXrdj85=mBqvRIM{9g2OPXp6LLllTr59KL{aNpaqJ`nVyG2B(7v`$tD*7vom9%!9yf z9Ap2uQ76p?BOI4Qr`2~lm^B1*l9I6(ud-W#FNyCkjusm`(wG0Xpb|#&?30T&9?)yz zUiq=?op3W1LO9z1&>UWoIt5nzKbxAnvAO$gZDiKQW^I_C68;&nAZX_RZK>i*Hwd7}eOQPKukS#`|P*8!vAT Kvr=hMyyrKuR?fEo literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyttsx.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyttsx.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c559dadf0106de67c43b71cddc3a994be6ec723b GIT binary patch literal 469 zcmYjNJx{|h5Oq?ZRYZ_rV)THJIwXOp6;g#5VX0Wysz{L=yRFsuqqb9#Of38cb{61w z@GrXZ2O@RrMAD{$ck(;G(@F2{K3vxU6}~Tr(@z_KpIYou=`Gf0ReA#$jKCCN>)jez z*nR@tR`Ke{+!*}~DU(7O4Y8t2qBLXzXDNYWqzQ(CLoG={Cp3XFMP?!t^PPK#fm zs4ORZvG7ttl9^|ONTVg;%VgkJ$%9dqW<$23GC_zom(Wza6J-xVfsH3X!7d|hSvH$=8 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyttsx3.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyttsx3.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9ad1d162fcf044b306274cbd2a8adf72a86a394 GIT binary patch literal 587 zcmZ8dL2DC16n>l8-NeY!ZmFnE4W)m z&$;Q*lOp~C&;EgJ5Da??c=8tLttV$wBic7J-+S+SGw*xMC&#ISwr}_LyI%>w&oWt> z&KGv}R=amVff^BbKr57VE1rRHRQYoQsM%k{f>6sNZ1umI{kK-twF<3ygkC{1vH?63 zjStqc%fBAYj|RXOeJ;$<>d#@T{;Nz6Mk_p3O1|0MrXn1okfUpth;2HE zgCIuTyF@$S92xx#XXS+F`0TN-d0&Y^itPBf86kFhO_d~(KSVb4_rpV9h6vLF|;+T+YkW^I9uT=pe$U!quwfZ%L+MP7K4C z-vZ-mRxj7gy`A5AlCQQhXKsU8J!y>}O-Lgrjj4M*+spQ*R_(+eznoZ`xwScUZGNoG#5UPgX?c5xBN?pv%Noy98|K7&mBmFaF3lb4tqQ&Ln~ znVMHvsGF0Tnw+6qlAoUwQ<{Fwp9} zlA_Ec{o;}ouz)^@)J1ZZUP0wA4x8Nkl+v73yCP8NfP7f23nV@;Gcq!MkYZpozrbLI cj2>`EUEq+KVSAB7^9qM%11ks?aR7Ay05G6uivR!s literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyvjoy.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyvjoy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10e323cef90a6cf35198a8add4af26a05494c50f GIT binary patch literal 347 zcmYjNK}*9h6n<$%ie)!JZ@Y;-w7aT^R}qE?-bSFbP1xenrc2U7ZvG3eo)qzC><>)v z)RW-J+hDhyOg0C8@8$8{Bk%i?_uA_nfW`b|I1W63Z&&Q#|0Szan>+ylf;g0Dgb;W@ z5%FFSz`H$Lj6CAsL$vqf$_RCbh2WePIwhvcN>-$t<*M7SP5U6sZRB@Hcjl&2I#U$23aNN?W#Y2{3#WaoU zte9qFs&HBxwo^zq+-V^yEm=NLnrs>a7vt@tlG?0;%Tkbr(<|u~<36Wi86P$gN!3Tfkw!F>q!3u0r)DPbF&R(*cnMQl(|UghTH|c zY?_IUi`+J`*~_K0cPWifwy&v}YA9=Guz@petpn{mf-gbE{H4%~iYBfQ<_!hY825Z1({kfU`9bZz zSWPRim~lMV+pVk!GxB)XCoQq|&j+<3CqAon!?4e&Y9ckH69we^t~xgG23VMgaTgIP zjD1-`j;+eXs*IjZP3!HOiFqTrS^r_y6SF=oZJwC3;`P&qN#S;~vN_7B JK}+&JzX8)Y&(r__ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pywt.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pywt.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ba98ba9a94f173f58b922dac5eb225c3f81f32b GIT binary patch literal 252 zcmZ3^%ge<81c%jp(zBTv7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfjoa7F3p(=*6d2 zl%(brXXfV>>%}LRm-uNi-r~*3Oi4-2%gimvFDfZs$?zFu%C97MtC+mR+?bN0(#q7l z!b07g)YRk*-IDzLoS3rIys{Xd%%qs&%#u{yg2d$P#PrnSnD~Oq%)H`~#GIVeqWFyb z{OscRPO4oI8_-IS>x+ef#0O?ZM#c|v S3__Y01T-6XL9mDgC=LJ@-%F?f literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-qtmodern.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-qtmodern.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..914e8d3c88a18c0d2afaaf6732698ddfd1c52ff4 GIT binary patch literal 381 zcmYjL%}T>S5Z+B1S$}%*BE-AULeh&U6zf%lB7(OP2;1zoUAo;(b~lB1@-6fU6wyQ9 z!566DDJQ{`w?c0{xv3WX=7*VKzHjEKUf%&0Z%5tXp##8I)of7vE0&=x?g0S=axj5C z2!R7ABo1+h@U`}6c`r78(Q}A*0~%Z3Roj5&ej+)iiHQj|I36%gb%`=Fk%TI7i<-?= zGt9KMn}~^o=Y;C3hFcz77nedCY`H4T4dXf-NjcWawX&sGiRovstd6V(7wt&kNn})B zP?2Q;r!*M_MoJz{shCDx){itZG)QqW#zU&3I4#&lK3)sQi4;b$eoGs&9<-_)Y(5Rs zVujA^*Ey%>YS*5HHuSMg3l~DT@BuuXgOmUMiTpY8AKEj2wl_zechvbnojb2GwQY$% DF(YtU literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-radicale.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-radicale.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e515b25af451f0248c2e43d9fef3beb92e2fd7d GIT binary patch literal 426 zcmZWlJxc>Y5S_it!JTrAAc9tD3@I+@EJW=5hy)Sr!ojh*-6UuBKC-(BoK;FoJN*TU z_%r+i38av#1S`8hx>W8))9BmTVdgRW-muTEy8#Ms`_1lw0r07tHA=t5;#?IEK!6|y zF>0aMXc-6$pokbx2;f!SAGAzrD&F|Z-?{)TlbF{~Eq&?Hs!_OMn&m-EB_>$nVk=A; zqoE9R7jz;tzc|zZEaA&=$+i z*`c4{*q3~m(_}F47^Pv)lWEHQ5lu#ZGiv)HlGMv^*vDNe{2v$tNXmgP(PC{D?c(PO@;Z1rD=hDvi2AvE6wbc!Z$@;^T8?K}7WW@?vbc6n^Q ZgEevXR6JfxoyyFqOrbKi^x=+D`vw{zc`^V1 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-raven.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-raven.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5e07633b193ea93022bba7dba74e5c21d2a2d7e GIT binary patch literal 267 zcmZ3^%ge<81c%jp(r+;`FgylvV1NnA_{;}nOlL@8NMTH8iegA%3TDt`uHq?5EKAMP zO9c`o#Z>|jUO`cQa%ypLeo?WXCgUyMjLejj)V$2xg8ZVA;*|`aK?eRxcDIVjOU#Wa zDJrc@%_}U_%}Gs7&d@E%&(Dbg8detLlbIA#oLQ2pTacKXotU0l91~wqnVDByl9-c| zS`?p=pPyYEpPZjpQk0pbUtE#`7SIQgx=>eC{^GF7%}*)KNwq6t1KJ7n8AGuckodsN a$jJCXia|)>f}-&S0h0z^5G-N=N&x^U^-*5{ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rawpy.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rawpy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd7ef3e8df389f7073c3d0d78789566848e96fd5 GIT binary patch literal 247 zcmZ3^%ge<81c%jp(p8xl7#@Q-FaYF(!Dl`oHJu@aA%!uWDT*P5DVRZ%`4($lX>LK~ zEtXUu?Wf6ji#H=PB_%a4Gq)hWsHAu$!)K7*U&-!PF?or(F(pN%m8p4!g}OPZsmU3- zCHeU|F=eTFWidXPNioHlC8@dviOJcC>8Zsr@dcHcdBr7(IXS6C@frE~*~Rh6`FSNp znMwM^B`IJ5eGsWzlvrL+saH_>i^C>2KczG$)vkyGXeT2O7mEUk56p~=j2{#jgd}IE PT@X-g;03`VHlPduJwr)q literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rdflib.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rdflib.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a156dd4471a7c1be2707408e4f3c3335bf21619a GIT binary patch literal 359 zcmYk1%}T^D5XUF2;0IL7UIdQ{;vU*PxG0Et6=4y<+fpcP6Wg$9(oNEZdh#uN14Voc zUtk4KdlEc(TiDy4Otvog&t#YxGV`0fc-{^ey&nzojsx&*leOHxU~z1MC%}LagAxr9 z0tX1f&NBjdGq=^y!R{S&H-2o|MYB#O7$cdERh^as*Nmu#U5W1*O~Z=SIpyl6>(2IW zn`^FgV&2NI)|9ER5MrdH#m~HgVoW$KDALPs&Kkx*>c#4j3U>5ojS; zG$DKv4QLuEs!32K*(k}0isGsX1R6Iu6-%D4b=Wq kg~rWYgwT8+(AgAD|J#>;Fg12~^5OSC{r;n8kK8mZzZYa`Bme*a literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-redmine.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-redmine.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90e0d51351152d094e2760756d7929c2aa8c3e53 GIT binary patch literal 251 zcmZ3^%ge<81c%jp(oZuoFgylvU;xMmgU>ubYC1y-Lpoy=LkeRsgCubYC1y-Lpoy=LkeRsgC^50j`GB!yv)4x zVn0pBTf7;WDJiLWnYjh|MJ2^689sxw{YrMXipfjNjVUQAtxU};EY!_OO-;_wEy>T% zi789XD~s{TOo}PaEJ@WZNKDR7OiwM2i7%+k%quQQ%*jbDiqFW;&n}Kn&d)0;%1qKP zE=d6k=z~bzqSW-%3cZ5LUmP~M`6;D2sdh!|Ks!M$E*1h3AD9^#89zud2+2&~Y2XFH IB37U<0B&$b_y7O^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-reportlab.lib.utils.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-reportlab.lib.utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47e2f4b0522dd2e360f525e7d54b758372c48db1 GIT binary patch literal 269 zcmYLEu}Z{15Z%qG$YBbL>%>yHBDww$TbskiP8Px@J0#0(c9WgSL9F}>KSBHs|H9S} zFmT;fw|gMIfj7K)@Obl)rgIkXb+@U1Ib%Oj{2}NQ_E%xOGsSBD!W4gI%j9+8p>v*$ zEOT!P1R`x~d|LAFw9!g|)ot|glkH>1p?_QpD_cQ+7{T^^W&o-tBj=3Rf!&FXE(L0W ztdrGN)_|huMs1O#G2n~Fxh)ozv*dNTLQ<#0DsuK;#pp60NE^(%@o;(HIyD%0@E4&$ adai-Ll0M@);D)amwcYp+$m!-0*?7$=9Ab@V?IRh^Cfw==Z^x}9f+Gs7tM zGp7wxMt@68ADNf2RA^h`-Cg;4IYb&7H7rH8yW5dM#Ql!Ra~bZ5Y%g3-qEIJBbP5&^ z*pAR4Ey^Urf;gd~{X8FN8l#p&7SQ!8gc1Dl zPUes2t509gdi1A2oskOGI;~!V+Bi(_oM;MR`qhRYAs!~Xw{;BUD9Oa7A%f@yQbCu E0nQ$vOaK4? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-resampy.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-resampy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4eac77fef7bb997a579a501a90ab20e0b30c4813 GIT binary patch literal 351 zcmZ3^%ge<81c%jp(nFXS7#@Q-Fu($3eAWUorZc24q%h_%RAoM5D>+b!V=7&$@&t+)nvRSl$@WFlbT!-pORRT7@wAzlUjU>y(qOfF}I-7%}TVU2mzWzbQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wX zNl|8!esM_(SU?{{>O$S5S5Wzj!zMRBr8Fnit_Tz`j6hs$2qZo*Gcq!MkYQjnzrbLI gj6Se2a7tg`keXq+AoU`L&J_-w238O(;sELb07=PaD*ylh literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rlp.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rlp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88e46dea3713f74b05f5a1ae5872d637b2114921 GIT binary patch literal 438 zcmZWlJx{|h5VeyO@sUhOR4}Cjl{zHtz=WV1t&j>ruvL*FH#Tk5eARY~!hjeV+29v| z5I=)I&`KRpRwlMc-8x~nbU-}&p6;IQyYsyo#wHN>D7U&d3IJa+SV8@DW)0yy0Sqt< zKnU9~RN4vz3Lp?GFA#utVM|a$s0vp9s%;f(S3p{&@GUP^lx*8)ZW!ZXKwO5n&#ryK zGQ*3L)C~zo7;$u~(;zYH$L4`uvul|uqVtND6))1$h;bAIgxW*y2h8rpai3AyFVzHP z1^Jx4ftf5eN6kYgLZQRyFeTAoUaS|J zi|no!N1XbdD&u$|R3%%YCp$^!>qpDK)ajO}D96Dr1?4J)Fy8~P3CE!Ef9GpJD~{Ej l$GeGIo~q>>Kv??JcOTB4_b0kJ)y?}8xn!Qw;*f5Lv_FnadyfDB literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rpy2.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rpy2.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..890a467b17482a25844b624e28e785655712c159 GIT binary patch literal 301 zcmZ3^%ge<81c%jp()pMe7#@Q-FaYF(!Dl`oHJu@yA%$TPV-!OQV=#jzlP1e8mZE}6 zqbgnysaKSrl$DxXQd}j5!qqECOwLYBPc5$E1B(}DmXs!zWaj7jX)@m8&B#niNzKd5 zEyyn_DPGC&8D!h9BzLQryu{p?lA_Ye)V#t%-JI0a^NLFnb8=FP;xqE|vy0=C^YcoIGL!U+OH#lB`XEvl?1qBMUmP~M`6;D2 msdh!|Kr0!6xL68Ed|+l|Wc(n-D#-MK0Y)_Nf?yFVP#ORLd0OKD literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rtree.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rtree.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f557d66a408c02242528f43b26930d59d0971ca GIT binary patch literal 1400 zcmZ`2OKclObY^#LuN~X#w2quWL#w7maj>0~3j(TK3@xAvRUj30wa8lUOr1^k{w+8k7cq}pzS}gz zqRjJ_?>N*7Yoz0uu5HyEyB_dNgN8NR3qli^jL(W^)3mnC28BD^2zZQzj8Y!6e2nPN2yPQor+MjPPz!T#8imd zAFKg-iW=w<`uzMCI6Niu2%oJULHDF5(${&&6tgs_L85XHGVm-_*0>5jYWHl124Vs( zT{^OEzGFbnM#x$n>fOIzb||$r%AxN&#slg-FmBm(Bd|kSK2AL_YR%3`Rcaf)zZKM= z03oyMt3gP{gjIpdRV+Wxq_c}WVewX0{OMrGzl=mm_Yx`Skcln9?joUM# zxi?Sf2Ox&F^P)DVin>w>{FUN4o)C=y9-q10`Ec4QCThkDrzn+HXgfh=92*le&O~V$ z{Dp|mPJ4Qi6i>e2wrDf7eQ(lIwQhSRgHCbP4q!OER-5A*pER~cY{r$_5C@MpO-8+t zXUCb3r)a`$IDY+S#Lf$+Vu+8_>#k2)4qa!L;VJqVQ~{4CPR{kyWW2?nT9KSnnv$B5nOl%wR8qW>;WNm9U#ad^F?or(F(pN%m8p4!g}OPZ zsmU3-AiXhVsd;5FKAA}|#hE3kx&?{J*@@|?#WC>(m6>_PC5bsXsYUS_`T5z!@yYpl zB}JJ@`o$$FU;%v)sasTSujJ?!?TAjPW)MFejpu%t=sF3oPXNw%;z|3be&5kJEp zXu;E-1W(=yz4hd#TJ%ja%nW&NX7b$Yb)m)E$!L1$0ere-5C1pV^xNP8IB+B(M`MJ* z1A(~rgaBUK`-8E^{aXkRzFZoj=7=dN1+xjKmL_+Z6sGAK%CyLp5#~Ddo8z1MsxX$e z?{r+*Oqw`VYG$-+-E%w~TKYsAg{f literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-saml2.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-saml2.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..044705675a5ba32f8e1591c6b99937513320393d GIT binary patch literal 578 zcmZ`$F>4z!6n?t%Ip@Gpx20rghtNR50o%|isY}-o2&K@e$H5_=R9jd&T_j!TdCJ(a zTl)*rl=ffr51hf%O@&U`4B0Y8vKtD8KIuJ4?|b6=^z=1~w!zxZXD1WY0{HC?cNYBF zTu<%hGY}w%gFrD7UhD}!_7QkMJ>p#;fbZ5f7Pn~2<`MBpYl40R7oJ6}Z)_d`#18jK z`=5IO*?J4T@X8hT{N_O>Ij5OP2{t%=&p6dhl*yt>1vS_u|CZ=-EF>vi$yQNmEco*# zSTFN%e}8DCT#-u-X>3LkxpKCwl(y9{^FgVi>mcHMbw=a-|)`6aJAqeW-5v=K%Y4&nY@ V-F;f`9W1(s%kJTMX9kSJLM5p?Qe>5z7F5OMQIrHJ4b0wKLz+t^Dk&0Q<$)X~vR{{lt) zGyDfy=pdN{C$~bkPTp0!=y&fP?|r=czQ;Y=_6A72?Ke9I8o;M&)+qfJi*s2#KnNkC z5F;1GnyVqufS^!&LIAJw{=n6VE_v-QKe7Q_J=CwETKZC>RjsfwOLIRaA_xN!6kC{4 zO0e)%=eHwDcwutfy^Y!;zpR#uovXZ&a1qFN8U1evzSS`($=26VT0VT)TrnFUm!5cEob%fA-7tkr1z{&skFt_jQ`bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wXNl|8! zesM_(SU?{{>Ox$kS5Wzj!zMRBr8Fnit_Tz+Ab%C>0*MdIjEsyQq!<{@FEE%PqX!&P X7dWJ5SX|^#xx%5+zzTvz96%iaViscM literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-selenium.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-selenium.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1454bc18f2f0a12677833d5176f946f937a39030 GIT binary patch literal 346 zcmYjNv1-FG5Ixxmh(eYw1%H642RmB}p>!>UPzv3Gz$liIh{%>>$pLTui}njzNrrbBJmp)hnl?q*8LW{)p&#cIhfEB7yMHyvBI^$|kb0MPjc Y&i%WD%s7@tkjS2O{&q6g8j1)D&#o0ewV#upW&1VSn{Uec6hc4xAgX7=IEq$W8? z{{#<$*W$qk{u%xQRtie4p1cKm>&e-qDN#(no%i?p%{Sk-9}|ffA_}kpj=onaQ5>tpNc3=Gs5&}F00Dc__JHIrLSi2j z0KUjRpo?~j^tuhw6Td^zQd;RINsCwp7f29?xFS8>xy|Jqv<;3MDs=_110<;Da+M3r zsM(nt$0sd|_@eH4jqx@x!A+lx=SvtZDmr(@`EWekWQ2EajT1nDy+2-^dA3bmyK{G( zx~K;PVJU(hM*xUZ$M*sO_qgW{*JCsx;*isLd^BS4A>7%G(;BQJj)VwOoG!uzW8+16 z%XnJacv38sHjP55{B-mAM!B$6+FnTK<51E(yg&$24iRLO3+UA#7lA~};VUZY5R)2e zG69K;Ohzyq1#@P&E`-nXnr2J+rm0$oqfXrWf%FXmP!|_v85OBHb#75wZuNH$m(n}g-GRpu zyIdtLL0p`2kT3gxP%O&lR4;gjbUNN74P+BuHT*Um0xx2G78Np@0mBh~NN6 z=DZ-lqO~6k9p>Iau=i!t0Bb*yMHOeR$_wdLA~t8v}*SyWUT?;?||6#P=z*VyxP)Vjt+#O4U_>;q2! YYvaNG!K42qKE2-3>pgU=D6eh#2G@0Fr2qf` literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-shapely.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-shapely.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db2e69f619d4187860c3535872ff9323025f2f3e GIT binary patch literal 4211 zcmd58TWl1`v1e!3GyC4P*AM)_W5D>_~EpJrBq2-zHN z$?N2pa>0r>;Y*{0A4ULk^T1na>kRpUj7m#1;f7*!ZMOF-A>8D=8H3(* zuSAQNuI*m*4Z1csE$BS$GzbSzxTLU?E76KuzRsBmA4cCqUqZ|5CuoVmtv~Z&KW>#G zv#zQa{Zcd$vVC3eltAX;{Qu-9uhihQMxxEJt9`HSYB+A&Cus-=q}VFe6U}$LiR(PN z4@(bg%gBC%0Zi|HP-W3YjQj>G_Ge%-25xgRyCV>3Jwo0>; zkNnV~-4DirRn&g`aT zP^%6GO2t z6h~G(;+w;37PP54Tm0XJm&U`f)n*6Uu}Sm*J@CBtDxv>;NCNE-}3KaAvAkh!8uuya7JFpWg+k^ zK6fphq~U0B6a$|@bjq0&fm&jD;4!9Ds}AbS5~R;aB{q@}8%aAZ>}ayT>!VN;pB<(tf_8eX`tENiw%Mb0cP6M^dPg&V*fL6?ft zXyDt9dc~iv6w))~4A5v9Qhy0HF0%~7lv@$wD|qRzgpTOWzJrEzXD^`<-Pud%pziGD zI#ho|j~pokci1K!dUM=hdrh_%(izhOtDgGxtloIka33vvuoLUnW8FpBhz*#r0Ru$~ z{94bBKUm;PyszLXvEJ3u7w8hh{D>(vx9jd$nMaMy8{?Z3_a=(X+eeMqpcxx1d{BxW zEV_Q<+a5NB<9g&o;ZlhUuKu))T%Pwzz<+gf>fTiGsCnqykK`wfM&r2IIKJj9@zLje z%QL=ZE4p>r;CoEIN9TJ=v8Ij7TQ|%YT(9hMd%jib==>t_>*TMJ+n*R6BWB0Qn(K~l zec0ezOAVdtr;EJN5H}m*Yy3_}@9vV$xBheM(>>E(ov-#17uLD95+7NgE3)fJ(BI&@ z*Z5Lfr_Q&4etetGwd!sC1}B=FSVmD#xCCX=P8(ax+Xs#MlV<(NHLm0j-Wj<&dV6%M z+3Y z**W|k@OD#a=!>N7)qh4B&)m+s!Y zeRJzlamffDGsDLU7kAu&YC>IkO#Za;RgW?Dp*i*;(2U5W3D7-RxJZ8`kKgn(mQj!j zZSALB{I1b@)@(gnA(rd+O1)%+L^C8hrRI(Bpcx(nshoFp>F2jTyS0AR;5tmMql_32 zJWM`P$!bqdJvsj8Q(vWxb03@MJ_ec*yJ`aDudea*S8k)%sLHjkRK;89F_ptq`iJ5v P+kftT^z{9}d5--T$nd)f literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-shotgun_api3.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-shotgun_api3.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..624615ac52eaf7f2b17c7b30935fc761b0842b87 GIT binary patch literal 414 zcmYk3K}*9h6vvZx8&y`2U4(fTHd!YK3M%s?A`B6{jY8>~*v6$vm!!jb+P83@KoLKN zUtof#UOjm$?6#B5#$f-KyvP3?@_W3z+x9Lf^>x?}uT21cwb`ijD=m)8@(K_@kb)Qv zAOy%jW@roy17L_MZxDdb@~$;7QS|||YJb|cVBQEgr8rO?@|EvB5{hMBdyc6{f){&T zoq!U|R9=@6S7FLLKOrY~txCRspWQO4{PF?eq>51KM4XSL(6i-sL=eJ^#0eKl=2Z=l zA7G)u%cq-jm-(@)M4DkX9(O3lLDW&4Q+I;d#O;%zD~ZCL#1BS(h^6Z#8QIXh6~_xW zQ-Tb;QlV9&t8-_2Oee{f)@965N^wurOSImEyeLy)LI{f{fM;`Xx_t@@G@7%k`QFjg YF6vF}iW3{JM9YTN0KLICv{Qv*} literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-simplemma.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-simplemma.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a721257a824158705016f9735a2de5d7d434fd77 GIT binary patch literal 348 zcmZ3^%ge<81c%jp(pi}p7#@Q-Fu)9DeAWOmrZc24q%h_%W}4R9cyu zS6HZp7kryO{3hz%ZfI?x1 z$)ME@5J%`OOu<(=0-V~;v~($%C8?0&GlFcn$PKAbnQG_$vj;Y)w&cl#M*I8CfKqR- zDdRY>4`_5?_t?M|Ow#7q^?X1pYzHt!Lb}i?clP4g7mgQ4lCwceNU}Dxlx$wEKc1Wy z9tLhWAZ~|WhvFq*VS<>UZ%@+K?0b*R&gF%QF&l@&A`9(b|kt`6_x(HXj za`hFs0U|Th&_!0l(-nORNE>W9PAJEyl&vpYAt3$r_WdRDHd<@(3N^f6Pr WJerqBi}GmpLan8tA~*4Cc)tL264s~y literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79023b5a453724e0274d8eb180baec6b8b5b3330 GIT binary patch literal 495 zcmZWm&uhXk6i!;5GAfJ>6m}3#0|%{Tw~f`?kTDs9-CUv6CTcKkwTXhB_Frs&fn&IX z_Z{~SRPZo*-Dx+$o2MoIIPFW`qUh00tt7pl1g5LUmnVyqQk bN3+`OGS;lQW-T=9`9?0;u)4Vv$$$O>5#x~) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.data.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.data.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a05d1fd0ce54ab1f7cac823d84a99d5a3189d4c0 GIT binary patch literal 749 zcmZ`%L2DC16rS15)>JowZD_zl$SDvZn@~K7<`57OYY}=23+rZQx;tieH=UUj613#t zf2c=K6|p~{cP}0{l0(_6CvSn=dh$(Tr3${8_n7zIy!XC&^FEbIw-M0S`d%nZgnnq{ znhL)UOAd!qL=eFo#khxKqi4is&&0?;6cghNBlHD$O`-}`gP5cc;&bcF03Yz0dIj*A z;M;hQ&TswWvqM%()YltkzRjc;r)0#bCw;}_A)_+i3R2E#pgiI$-#cXdrcI9e z>i{{~kpUYp)nu_B(pu+9t?lf#o%Y0*gO$nA@e}KTGaR!9&WkJw_=r#${CNt1(9oeV zXn7aJDS8V{7-$^lm<~# zr73rhX>#oDvA!#rqRpWn3;?TiJ%E%*<-tviVo};rOcf znEP>`_#JTvYHtHe8^jcSdzc-B-(Q4Nv;)_fF+ym<;$bS36h-aVRfL`;fUy36j<^S^Zh?FUVqs#87xxi-ZJCU(E&7#Q*>R literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.draw.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.draw.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a7c6c1757f978842799204a167749fcb5c7af97 GIT binary patch literal 749 zcmZ`%PiqrF6rb76##A?g?b3jUkW(N+HmP_L%^@Hn)*|#47S_$qba%}DNoOXN1T8uE z9qQ3jMeGOY-HXSK2b&TjnUGe~J4DQ;~1RM#7NzQu$ar(_gSS9p?%14c!@>8DXded!WUdhP*>uG_?@ zzYY+SZQ-*4lT8+T0j+f&*V^{|9lJd-#b9N!3HRPijC=NQ%o;c^vBZx?gbM%9Qvig5 z4vj&}+aONRTWG>S=?GwIdy~!Uxok;=6rT|!D-UXGt#m9s~ZMZ#Xy zP$Pl3ngect$PLwTk(Wb82u)Z#Ot}=ir2MK1SF;2V)*sN}cR*Dw5br=Nbd2%hF2b*H zhTQ+{MF|xunZBJ>S~I;p*V_xEVTLcvYGzhH9G_RtH!`z3GrM!MJAHCt)ibO9@i^-Q WYFpvV3g=cheWBLEP?78S6}(?8!PNo) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.exposure.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.exposure.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5584422196f9767be2eee220389431bc518179d9 GIT binary patch literal 763 zcmZ`%L2DC16rS15#;A#C8yfIXbE-thCiPa)90VhUS_Kb)})D#DEyciaI%n znGnl=M5ouT#4J*HjkMIR|J288X130x8*-8a)RmrM@{m!Pt@%6%sIOe&DbGD*!QVca zbXOPTctiSZz*L=uUXNB=PpVD(;kMlz-j>Sk(0@W$pfXEOUuLB~BZNjQjJZ%!6m(oy5&B;Ngw-uBtS*=|~FPmAqYu|0WqUfxQ9@9(5f Yx#n^_EyuHRJb9tl+|qYf8I}Nl0VkZ>%K!iX literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.feature.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.feature.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57df446d22becf0cb68b0138a4b6581035755b79 GIT binary patch literal 928 zcmZ`%&1(}u6rb6TbklZKYHXn%8ZVUuvWY#Z*ovT)LM>`QAq3XV&NLmeAL-1bnBXA? z{{*4_1r@b_K<{2WZX}1YS5Mvoz4hdq#EL}v_Pw|J-rM=TulZ!#vk2(h>UQ(7iO^4F zToBk}I{N^xLqrh40Sa*qhgwYw^_q?m(VDnsXozY=Cq@$=n@1W#UqL2RGa-ga<_Loq zWJ3HFRep`k5bOUlJsY9%IUVBJ_vm4F~z0rjOzJn6Z+Ecn+aI*rKz(JP1+3%w?FcBv;joH}mI8!n;3=d3Mb?zUsWB#R@F z&iwhcw^A&YFZ;`pZ)E|e7K{9#12DZs;jWNQU^J^0_qUGgC(?-ji7yPr*~rt!jV)+@fksWBl1Ej6juH`e0skQW?k}5mqz>h zrGQd@uO#C*s2|YipuWu-b!d{7+MeHnS%|s|l|({%FhcI`#c@lxejG{88f78L*ilxx zG+jZvdu}}lys$yM4L%R)mqCR3=%eo>c@_TH3H#^_Y*l3j_97|YDP+>6=iRM~j7~?g zKse(xT=mNhrPP&7?L9^ajab-@xfH3X)+=~c#o_88J_ia)n5=h$FMz40AijVa=@{eD zGQw|gg51k^ltByY$+d@ldt{;P&BR*%crU5ENXjo0t2(f%L#x_1A!IBi`eL$F9_W>! zUKt?`$N1F9CiaTr{GF56CtHcVIj}c}ppDJ`lhfR40(|>!@+efCiw3!9n2Y+))H5;_ J!USjB%Wp}A5Yqqv literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.filters.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.filters.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c20ac3a186a4fc6d779d5b2b74a03001bc35af65 GIT binary patch literal 961 zcmZ`%&1(}u6rb76Ch12sYT9ahuqafbWSf2_<8?DWrJF z!Gr%n|AUIyKfsG1c?cPu>=K>&Z78A`;^0U9yL3w>}hY8CINZX~B zuq6|RjEcc+CvaWrNQ>Cgwho#5Z%(vpBY-%W7Y=JOSzw-Br^~y~my71wwpl#6DVlN0 z1gNB3IDbjQp^Bsqc6kHbDS8LvYN{9=puAQ-nVZ0xk_st4p*$WWeA}Z!{cHKkd%07E zuqt`GL;a(pf=j8>D99jitH;zouI{l~RWL~lE!$~Ad!lN!I?NZ+25Q`D1VK|+PT)(< zYO6w$II*gHVX}i(=PLcowY?g#ce#28x4^_KxGuUN;T!Kq+3TW9h*g)#5$WrOvtESZ z7>`Y81Pas4cic9i*UxbaO7Bm0!fn54IsvDa)3G*4IiDOXyzZ37tjxA#t}tUNT+NiL zx5*7~gG_@FLVf170xreCP**E>O6|`mHw6x8j;?l>D~f8;;w!jF#~4S82*1T4vi_$- zeLe(TSncV>zFv&b6y6!;RzlE6Tj2{&Y0mHE{C>{w?ngb!B7j@fQnJw(6}3d-dpP#>wRNALK+-4_cY9HclXtb K3`oS;nBE^+pAdEc literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.future.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.future.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f1ba237772d0d3164b56a7bde2baf41a9d7a010 GIT binary patch literal 757 zcmZ`%L2DC16rS15#;8d_yENdT=2VH0P4rR_4IUyQv_()aVPW0uOp;+|chi~KVuD}} z{)hg9ir62}yBCie$)W7klea)_J^3cFq6Oc)_n7zI%zNK^GoLDz8wlv@&fegiiO>&i zTvFlpX31f5j0hr_qX>6#WOR+l?3x%Eh+<-#V1&MatVwKx*B~Y-4DhLSVn7UJP2B>- zOo$afqSI?vViqaALR#wAf9m6PGv8#=ixQG@>PcTQ*=JPdw}XUp8YqwW%J=$=|Lv1$ zZ+$^dwq(FUrW!2r2ej6HQfoO6A2_Yah74COr=O}+(1~^58I4&T=Oq>gJS9{Hf0_Xp z8a#{!EjK_NqxUd|P}>NA8V3{m-)xSeQpwK<(iLJqqEe@-UGV3RTrgcF(lLz>4;!4) zVAxPe!rdbpAGv$1=Srq%W8?=R;FYcipkk?f=v8>bBnhP#B(V~#*OZE^98IkoR{)I0 z7p2GCk9x#!iLHI4s zkoP}clu)6XnOj-4IWt>xv$a45j_`STI|IJkJlj31XXVbU+?kg<(`V=QP6m8$H+vdt Vw)xEFbDK~1^;%f^?mEK?;4g<`*o6Q9 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.graph.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.graph.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd7c467049696931ffbec898a8aa3bbe94c45c90 GIT binary patch literal 788 zcmZ`%KZ{dA5Z`?-FUB(w&4mOlLaJzlyo4)7V-ZD!cnDgB!1LwpUb1uoGwB*pPsE4#p1UFB@zi4mOL8FprNW_~lfA9J}a1oWla8T`}{`mU5q zO8q{Zb2uC!f(Z7IkGt5{x|*+db&QBMz}=LFC?@(bM(8u}ns^zk8c7jjfKSrL8u)AL@EdPqvw`{E&=2Y6)91vB#)L@=oY^)R7jkrETpo z?{AwJ_tybpninqf?Ey6h+>VCkklN9-C>-W8SzkFSt%sGSxwB(7r@4*0Q{$c)O;`;l z85TI+m{8&T=?{>peqd(k{5psu^akeRDjflKZFjo8k<64-Nbw0lwp3vIRH#gq3-{^$ z9;iLZ#}gXt@7Fy_onc*uq1QX0!9lOX`aQuUtw*-wLK~uI0j5Am8@lJ#FbrK`Ibk3< z>oxc`eyxTa*=u9*?yncEq)D(7lB0<#0-6X9KT}UI&6l{L01^lFi=VPZY`aZ zUQC`{)-%VFdBR*3;i^}zJ_$EKB)K6Yga*uyLM}yOsCN-Oqx`B0S04=^tly=@Z-T03 zAl`vk>KNnYZG>Or7+L?@%QVVY;~RHpxn%~WO0iyyOO3hSTUNpuYf_ui}OP literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.io.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.io.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..471a218198d0633b19f0180d148250e98fd37bf7 GIT binary patch literal 450 zcmZWlK}*9h7){y@s!|ww5cDDn!Vc}+&53yMpr}IxZ=+DUCaz&=(@LT3jGd)$!13&;l z3S!uTvC%RhFaU#e{SZ7ERmeFYeJ&AP}A)Ei=5^&>v-{&6TYU5^*4z#MH3T3IN1U43J$^LGCr)W hp~CjT$f}R6`k?$?*&QnE9gZrEaiuY^_2MgP)Hf#Vg`WTb literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.measure.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.measure.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7868c920e7015688d8617a4e95f9380e04a3a2ed GIT binary patch literal 760 zcmZ`%L5mYH6i#M3wQ8&A)-8Bgds?Z`Y1xyC7Ce+iSc@QdCc>?a7zc6)E`g-Xrh5~iivfK5&88{b#oB2 zA(sDy&aQ3598!3LjMT3GGRJFnw#Ae$Vv=y`t3We#$f(NhhB4Cxoi-Z#RI$ zpoiI@43@{GkTSk28<9IF)@mzRyE literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.metrics.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.metrics.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aedc1e5fcce6943fd5ac880f1fb2bc8049d963f8 GIT binary patch literal 760 zcmZ`%!HN?>5bd5xV$?*@jT`W==Cl$alb{zB4R{EPum(Z!5C+D{bZ^pRdM4Y|Sx6Mj z!GG94SP}OF_U^^wL~>Z>>d9Lmw>?>%xFP|otBS6w?y6VS{kd4YMv%Vk?)To?g#0wd zC1w6>mLYDA2_uY#MA8nGR>zWd$EL(0oHFZ#67m&gO=<_d7PDEVM^CdS7RFH4)X8AX z##rtXIlZzG%d-3%Vx)TYmpNXw(=7p>jM*sU9{5_of#8td4&pH6f%cfMeeXbo|N3Cm zU0;C7HUwfIbWKRV$1Ba}m4@^1k<*ymgu%+?NUoI#V3K{{49B8M)4Yg+aKtzSf4e~( z20hM(EN`GXCLeGP17j0JYPBbKHqtqogN82z^JOAmaxl3n7jo~Zi>9m9Xw0L-!&=CB z(68w@4&5Uj9l86W>w?g{HuQr5A_mt(R1s(&yH#F4jtAfcafFz=b@vTpu4DNv6eysYlJ6{eD}S`*lq}IUD04VM%~iXaOUtjvFE1-PBP~L3R%Mjw zSD6o?vZ&Im89k)MzF>?;LJni4LFG-{R8i(rA%yiyG}SFM%@p7xs)bD{UEC$~9ZiV$ zKVIZXrkvQ@Nx43=8*{s{AQp}3d0{6(zSlV0JA0B8TC+lHUT95Q=cU~Q`TpbNg*04> UW~FFeil(p3T4c@Lb%qtd-+BPq?f?J) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.morphology.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.morphology.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6663509ae0782950adf6ddbb7fd2499d4d27f00 GIT binary patch literal 519 zcmZWlO-lnY5Y6niepV0_3m(*yP+?cmn`m!hi$w%)Wno!2u?@{`)+DWLPyP%4fg<_? zyz39xLJzW6Pu>dNJejn5@@3vId4!oad01GOLmIDJjng@&@Last9iKEOXxez{0vT4OKaEte@}-b7MndJ| zKn4C4Wklx7RQeIeT}FHvC@QZgk^L1J(hgM)je-{0tR8Ldx_i6*CD|DZZp1~>=8U(} zesSB4le7Z)42?t9#YCP}3VHcFt;bRYdYW*%iZbc8IqyheYa_yJniq`+`G~%Zx9{ZS zz>9;(Q=*%a`1;ymgoJHJan8IRiF;myUV4%$;v_-X(Wa#5Cn^1#;g7rfA&-@ympfA7 zv9M#Z^WU|bq~9}#ldY>_UK=o9Dt(sJJhsirJt7rTGycn7_ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.registration.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.registration.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08d01808c7690e2d1d28318746296ecd9fe388ab GIT binary patch literal 776 zcmZ`%PiqrF6rb76##9qQ8ye`L=2VH0O(=K~o12QE79j^A2G-5aG#Rpg(s`5S4}v*( z@(c7ERK$LWf?r@GIh4J6@)pRgC*LGiMC#l3e$0Ds=gsfEna{c0ZG!S`_n`C1B;<#7 zt|j$*vGj3qN*H0(Cjo8Jz-StQ*)%CJ2&c?AqlA1#TZ`PmsKHE@>d((aX8t&siv(sDELCKXex9A4!U6RO1^l~Lbs*lV9dkg z?f7JZT+>b_;~!<-Y6nkUO*-q!xm5v2W>gqo@at7llfSb_En$1u7cL zH`3^juQE@4H)u1rChs7JO*F_MOiA2$6TcmPZw#koi2=LSpHwfF#!yjPXze{YWa18J*8+(2oo`tZ$|!@1d(_0Ur<+CZ%+- zP3Sus6X$=r$dFVaHn-wJWoB0AW_3XfI;NM|of!4Oel*XIrmyt3u=L(_g%!bHRW0EM literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.restoration.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.restoration.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eec9ebfabbb19dbc7e4d94a66d40777fb076ea15 GIT binary patch literal 773 zcmZ`%L2DC16rS15rco0?6B_hTbE-thCKOLnb1M?4MJjj*3+rZQnhZO;o6O8c5(IM) z{0aRB6|q0Squ?LdNDgJMp1cKe>&Z8X6_NV(y~n)wcE0)EoB3EO-9#YYb`Sd>OoV>u z;7W487b^~nQ$!HK9EG@xL!)biX4k~XKok?>3?uXzY$IX^vIa3pu8+^HGXrX18|mht zW1{U1>9+J)z*K{UUZ2+5PirlEZ_jQ`%Q9G}Y(b@p1>nZf)OutOC#;UM0*ic}5GwsY z9RU~J0n7)jZi72TZ($aJjuEgmj;8mnfwUFC%TEX}bCDNPsqt!;qi0VX2puJo35`ah z2B*{?G*ldOXH289bI5v*WQsP1o*w{n>A1iwlFEawg*%AjK)QY$DZzS8smMCf)V^^Y zi{a$5u+P1)N4&PU1r*9)vIK61(&JZYH~D^?%+LxFnra^Asi-)r=d0#h=s#gC@BiMUer#%FyOGcmbSP9p&o^N2X1L%jF- arw57F%6MKGFDm2NbNwwXy?2AKCin|wOyCy) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.transform.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.transform.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e525bb2e1baefb51fa912d60a393f05cfbea5989 GIT binary patch literal 908 zcmZ`%J8u&~5Z=8z8x!nE200EAg3thtah-K+G->&VI@8RsMgM6ZJ zLBTH|Jw*^AKOjAS;DS;_ZmH-_N|%aR8z(%(?96CqMmzKExBID3SRg20?`(A6TZDYq z!CW%GHm5Oe_6Q@4`Xr!D8W>F@Fq75_qC7RCPLPW&QC=&92w&+QsyXMwwN6FcK9y$%)YO zhm3=F&K}-avt^>4E~48bZ;}7LjtO#NY{um|jPr)J;-KI&!H!nw1{`#^m9wbvpoL*e z$>E5HJ3CdMbFWubQRKIFdAQr!5bYKS#j69?>mxzXau8Pt%0*_S(~F`$I9?PgDcWnG z*fg=Gef3`qgV9;;k?#g==B~>t2w)iv@I}d(BwMeNZTW3Wj>#z|G|=pf#LY@}QhqUd zHXmvamGHryPLlf45`QO=`b$mS5T0#XC_+wF3!ZuqZ4XJM9u(2uM1(4Ww-N|xc5Rkye!9CU#FHmq!8cIE z$M6Lrc#vE@c?p6PTrE>AM4XqQ&=5k!4xr-<{aC~xpUP)1A zl74YX3RplNMCwAFq*qY+i^C>2KczG$)vgE>Dj=T~>jH@n%#4hTALJMq%`Y&RA)^Nz YQWrR+W>{Y2P`$#T+Q15eMI1mK0F!QH2LJ#7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.linear_model.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.linear_model.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53f10f270fdbdd87badd70f428fd79338fb510f8 GIT binary patch literal 443 zcmYjNO-sWt7*5s=r?8XLfq2+S*rAi!N7cT$-1SyE% z076g#7^2cE1mHc7B}4@oJ{*)#`5x$KRetqG3(mHQbRv#M6g$#YL_QEKCw1wOkSK>@ zSFmR9qIqa_jwkyvEC_3)2$h!egoz(0XN*0?#cj)&HSUsYCY4Jm7OO)6=b;o@?W`6M zgfJsf%!QIuFxLte;_A$1Ze%MlN-%qTG%3bjU@Fe3J;rQo_sP(fL}4>_z0mcsw4FF1 z>o!i&!0|X!f(+YIp@L}ZY_9cE!g3?pCZ<-LEUM>A$33x`OVFPrFY}Zc5W;K^z|$0T o|Ie%n%8k_6O&jK?VSO1^1|aNy?;NG|ljj>f^wn;`ijDlGKg~ad+W-In literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.cluster.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.cluster.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f6556f3e0cfe39cc8314aaae16359e58b2231c7 GIT binary patch literal 513 zcmY*V%}N6?5KcDzReG^%4;CqiO2KWV7o`-hBGe*yD+|kZ6Stw+-8RWqx+mYlH&DdK z@C7P(ke&*jye;(BliB`&olJ)Bn+Y>t<~5hw0?Iy4n$A%IfS;JG4XwbeuD~eBa_ zF(ls5Xwr@$s3dydvU`?8gkknabUnsg3@~lqlbm*{LgGcD8b^Jt*CncGi;B$xA(gcL zXr5^-*L20RN=3Y3(NZBo5W=Vk;N=)x{P!u^A1g1MeIoq}=@Hn5scGi$J98W*(O&B5 SHa^h~$eu<>TXUXPE&l)%-65vpd7=%r`rKm#(`Bny#OB28R^jr+KW%eo*d& zR=xrQMq)@vk0e&lA~1j+wEzjTz7c>c%}WvvQbq@4?7|9R|AW{<6KS!HzwOHi=6nRh z%}2k?hfQn#gv%hwSP^3&L&fD8M>*e)vN*;_1+wTbopM~45g&2YiZK-F?!nvLSKgkt zH*Uz$!r~Q*$I=T_nIprq|KeY3d~1bIPzfICh&<%tGnW`JE>)ODCHVak&{6H0!EJJZ~Ka(VhA zwp5nI{spENeuwvc$rZNpFdBselzxzxe3dI$WC@}y)rI!kQn7`hZRA=Pd3j%ZvmDid zFl#p}lV7x`C?TYJ3Zz4(aJ+thY;8~6$^pAEr90DxH>2$v+OB{S=hl9FTYFYfYsdKw s)`l}VsW#Vegq#u$oYr5M`|{JQ-o2@JXLfgTVvb3FN-8i?)O0<60E;-nuK)l5 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.pairwise.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.pairwise.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c65f63060263e21ce5e876c001a50ce747ff6eec GIT binary patch literal 506 zcmZ8dy-EW?5T3nF;t!+}wGpurQskl_D5AC^L=o)d;5cu`WXav$WoHvfD&NB1LJ=Rp z2k-?HtWpV9b_aG=?nVQW`D6C`VCLJouU6;5+Vgs|_2dD3xW~l!U-PwPn;Q@ySOO_K zXAC?*CcHZa@M!bbbfpD?-?DR0l+M6qt^Dbz8XGN03e!yV5)3Iak}f6EaFJr!k*1zt zq}AHN{@SL$>2K8daDh5w%vzai)xx7Y#CE3^ZJ=PZXzU$(Z~+lKM&#`uX5{ zcJKF22YSxRaL1*lEd^(c6)V7YUSRuwyz`|O8_WJHZ@lqF0cBPxywYN&fJwPNc3yDD JI9kuxfjfgM7`F4(?jzG$Sj!5B3b9EQYufDs+RCm7X+ucdrbx9Cuzuw z&GkpI`2Y|=&;dPo0U@x#g(LwCk@N`y@Kwy)pcyP7*@l4*1i~#P808KoD=;e3Y-xdt zIT^uPu*WS8M;; z-BUFGGK(oQRyNEwB^*=Yxxvo=#$P4Q>%r3$zvSGvC?{NyOxHu0y{*Wz;=AD+mvPH+ zFf|68ILzpHUYF7MZD)FiAcS4g^F7Mh7jPYa!5i=OanrSWO-=_x?DqRr2jh09%016% zUSapDc}7}ICj3=>tKGG1%$lY@B&m#<2$*fp<&?B)jHBeB7O&M+*Z%M(+qiwMQ@SSf z<9~^L7fU2V2%{2!FGKKRdCa%-BYiFxLNSWfv209aBLdq{n=83#c0ZD(g7zCosx~?w zoktqbc0=`1xLX^m^@&=Kz{UdkY?|GRR5=FA3-BgT^Wrq_vQ&t+0Ne`m&%@lo7#xgr p(NifV>c&{EP2^exAZ$#PTv#{`cTUF2Nvtfi#SI!sjb_A!{s7R>1-bwL literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.tree.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.tree.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af8420ad3c63ac796df80e6f289f040cd3e6226e GIT binary patch literal 258 zcmZ3^%ge<81c%jp($6z8FgylvU;xMmgU>ubYC1y-Lpoy=LkeRsgC7O?=u0Y;-v1ONa4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.utils.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab22f9789a5828df1baa0033377f91ddf172a90e GIT binary patch literal 266 zcmZ3^%ge<81c%jp(yuWxFgylvU;xMmgU>ubYC1y-Lpoy=LkeRsgCD`ErM4f0E|Fp&7b X%*e?2L5e|0?}C6q11|^`u>i#ZJZMpf literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skyfield.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skyfield.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d8a914b096ee1d292383ea1786e66001cb37a8a GIT binary patch literal 346 zcmYjN!AiqG5S>jdEJ80{gnU3Shom=!B3?x(B6uqcA5?7SXd=# zp3IphanY8gH=wf&GVpHHACI4?H4drT_o{ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-slixmpp.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-slixmpp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e111b8e8d15ade65299ca20aea8e408df15e6c46 GIT binary patch literal 362 zcmYjMO-sW-5S>i~KOhi95Iib~JtRF@LBy*FMFejp5Yp_}EZt<&-Ayr`{1^QPiug19 z0~I{=BzW>x=&dJrTLZqCeasBI``)~G-VPYNA9n|P4#2l<8n}PO;=~japg;+Sob(6* z2ar(bnE4)F>^gB46(&v zZjCJnEI=%5KS2Oq_4~!x#;qIB-?}^ONKtW&7>$SfnNr0t2(r|ldWqnQ@~X;xPE@c7 z>UPM(J0IGU;bROk`ej}ek&o)UtEw}jt@BN~U2D&iGUGKo?mLsZms zT>-7Mk(r>RaUd05IReApra`}`m(FP}aK*@3>FT;>JMu`=+=dX&_bk|&149mgCo^#T Y|9-l?ncI7G-`&B7JGghuDcd^t2ZPsuUH||9 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sounddevice.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sounddevice.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44ccb7f81e748ddbffb420804598bf1ca1ebec8e GIT binary patch literal 2377 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-speech_recognition.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-speech_recognition.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6726cb70e9d3de7e8721db4341a583a8e7f58425 GIT binary patch literal 367 zcmZ3^%ge<81V_|-(x);pFgylvV1OCQ_^bhBOlL@8NMX!j$YqRTWMp7sNM%f6TE@u0 zuo{RVAc`r4Iha9{SHMt}{C9xziJ}omRwfL4$aY1Toaz=bnYI1&h zUS>&Vex9Eu^DXg!O3%FFl0=~TBE8a*%$#DqjQsrU;v$d}Zn1(4C|=3%8D#LU0(YyJ zyu{p?lA_Ye)V#t%-5ijKx+VGfIWc9ad1Wy^nMpClnI);Z1&PVoiRr1uG4TbJnK0wy z!3M`C=jW9aWhUttm!yCN^g*O9rt9I-Yx%n@=dQ!x{;SZSL zsVBjcx4~{ZnM?+vkf;g0Df)IE> z5%Hc7z^gsKn0Um$g=p{Fl@aRpvEZCyoe@*zCBqqKh3W!TGfYiwt|PxYxG`6i(z(4S zlU6gXl9>>5C7pB^6s*c6qv{3Lj&pN&d6rtLRLj=Ts%c_QDW1hz2%auzwMfUTNEOpG zu5&!kr&Og`ZP-pB+j3`ER9doPq%_$!MlQy?XC<}S1m~q7EvFaKEysOO#Wt*bgwW~` c(CHFR{`+S*ScZeg-g`Lw2#5E9Ga1;4A5H&fjQ{`u literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spnego.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spnego.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ea3d66f809c4d30dd7e32f8b30f14b93f58c8b9 GIT binary patch literal 350 zcmYjN!AiqG5S>j#N+A%u2p)S715JBV5%DTQ5y4wo2uXHHmTq>_-Ay4k|H7*$Mf?pv zpn|8I1W(=yz4c_avEZAXVP=?_H?uFE*M}DG$CIq@0DRkE2lvlepR~>+5Fm&{fu;z7 z0~8VG83DYt+F|Mt_a1`19~%a!IY=evG&PZ~l0uS-Q{C+AQqWA^25xhBSKkP2;RW%j!dB`bE^Uz4i@q&s4p0EUK zW@uQ(=`7Bu#!*?b9Zj?)h*BwxV#!z=vQ3Pw4ZF=oWxeTLcI#d#`#1JJ9kyoWB7{~) dfXwHJat~9zs81^B=fNjsu^(BY_r3;2bZo=)ItE zw0n!Kv8tU^Hg6a&Cp0J+!gcMKtSu>|5Kt3YHQG2!wuR&cVFpMIAV3hOyE`IXJTIhw zp>;{N%o1*ZxpPUyN+8zvZpl`g(ziDTxbq*!yWu6l+DY|1?(O@O3e73qCuf9?;1eB# zrIUTS&uUg>&a7LgSF2P3@FI0ut84@HCY#A+W~GBPIAS^2j5e)zYYR|ga%M#ItfVDy@VWv+e2 EFZ#iUY5)KL literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sspilib.raw.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sspilib.raw.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3e60480061b4288ea6f391a3770cd76ebb2ebb4 GIT binary patch literal 402 zcmYjNy-EW?5T3n@5)7v#jbLLT2r2FYK@>#NiV#Jx3n$0k?UF3n`^oNJ};(R z@ilya1gx&LvO7qZ%Du!uzWHHhVCI{dcgxxXjjz*g|Iq~aDU%H<|H0x+2QNT?APynw zAq2$eqn<$x11KWq8v^*$w#LK)=ozH)0L`7>veZO*BZxVtf%0VPhcQVxm3fU|g#(VI zq;gV|GGUzgj=)cMO*22d&u${Au|ZlUwOLhXjhmBq2dV8#SG53wWvbl`1xRJ6}y1;XY~`UuebAh Q`@7zrLwjnKBC2}CA3LLV_5c6? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-statsmodels.tsa.statespace.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-statsmodels.tsa.statespace.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc7900b2d5b3ca0dd8a6e9ff3849175db7f36c03 GIT binary patch literal 484 zcmaJ-%}T>S5Z+B{{eeLB;?L2d&_mLjf{3(w&_WTxTM2|TyEdVlY`VKCrYGORH&Dda z@Bv!rL3$EAd8_o+latnhUOGEF%zXRp%*Q+%#s&g=JFK_b8bY60v9R24GO0lFhzKH> zp%6DPMjE1+XipfSSGaSVVfufp2Tu)+lQ7TtS zs3?<`lCG82RK~7HE$1#^iVE2~SVn@+T=_t|F6pD~o3s`I8|DZrQ2{jdId4m$gM^Xc z2ZYcl2xBgkd_j{;*!2GL#E#t1Rw7Ah)ajUvQqMOP=gjWXsB71QrY!?SO;FW#TU6Rk zoCb?A&TN3=@koiFS(b{-fN~biCBox$x^_BW!4Wc92KnkRU;Wnc<~e>avLjZZ&kyDQlt%yn literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-stdnum.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-stdnum.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39e6211ac6f1fee2e90d6ab2794a50c2899f8f5a GIT binary patch literal 342 zcmZ3^%ge<81V_|-(tVj27#@Q-Fu)9DeAWOmrZc24q%h_%bQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wXNl|8! zKF|$d0euju3vrQNLFF$Fo80`A(wtPgB2bus{8g+ABt9@RGBSRUVPG`Bz+i@q9&kuq X;E8@jO literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-storm.database.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-storm.database.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3330d30e7e125a59405b2308cb69657087a5eae GIT binary patch literal 369 zcmZ8cy=ucS5SE;j1cQebQZjldg$%a$Qo6Q7+CsYpgODxN7LhGmrv&V&Z_&L=>3j4k zvi1cG*)ml&WN5zQzT>+e?(WO;Tx9Wcz04v9q2FE{VfBFhg$*Bwp%uyy!=HGCne&Pk zqju&#D7E(Al=i_WUHH#0kD+S|mxBx$H8i2XA%t2A!`u03zEWT^&7qy0R*J^XJT08v zgb=1uLUvv*7~`cVDy0p4qkVtfLEhiQB`sp3Hw`cAI*^>Fd0>>1@s^j{cqx(??DC+Z z>6&I7Vp27t1Vg3dn&kEaAgL;i7D)t#4T-4d;Qviw)f}d`g<>1Y@ASkj$JXJ>Qa8dF YcXJ1iJJi#3eC~AUNbg>6`ph=|0TS48^#A|> literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sudachipy.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sudachipy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac6acd614cdb5922b327cacffcf5da15487159fd GIT binary patch literal 799 zcmZ`%&1(}u6rb7IuSyrY(KaQBRE4&|BsCWiKZ*xIgeao7CAw^PCYz!Ak)DcT72Dm5%O465LWBP z)aSK!6zy|{#A;034`BJFq)NUAPmMOkn1r)kdAdC3wR4s);8bLSGw=DsX6OXXn00$3 zJUFQOgt+Z$97TTfkc5ZL2Hk6N8k1_rarYgM@TT4A(Zv+@l;0NH#*FUm@EA{lo!nOc zo<^s4razt?_AWC8Z~hwiH(@daAMVP$wzFdrGev!z7`c2x}j2Zguo4gdfE literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sunpy.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sunpy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07353f9a11546717dc9dcf6c4bd55208714e54d0 GIT binary patch literal 802 zcmZ`%&ubGw6n?Xtjl0EY@SqSWkp_eWk_a9OMGIaUgir*9HX#r;J7cnBe|2XPo8Tb_ z!5%z#v&WvQV*h~t0UlHYH;_ZgN$}*YkXuf^*|Z8(-_Coyec#)e?|nOOQ>i6D`*^$B zE~o%M=lsHrXKAt;$-%Gu?&=djsa}>=YfwtWHt*zSHP4uivQJtp>LRD+Z?3 zHQS6gn!&*KxG-_Ru-WnbE^k`CCqlbb=7PqBvW&%em{Ks9>-QYfZBcVQL>b{KI=_x# z1jk#S9(=2OsYFk~j4F^Q@P77mR4cuuU;6Sl)kF`H287fK;Rd3C0#j!h}^Y&Y;j!Ka#(p1+6iitMiS*3=>bvgo zT2$PK^vYPTO!Ue~I{_^+ZsOYC7#q2XksCuUuI?@GEx&#?HnI~VJBI8?lTS?a7s347 A0ssI2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sv_ttk.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sv_ttk.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10fe354295030ef6cf3f55826113d82674deca9b GIT binary patch literal 360 zcmZ3^%ge<81V_|-(oL8c7#@Q-Fu)9DeAWUorZc24q%h_%`IdMu^pr-2m&i#UPW03JYT8vpuST?uoWy#*{Wp^)fop0eAD8bk8 z0U}skC0N-7(xq}Y8nE!2ALfVon3?BxdlxKT4+mMt1Nd~w7XELrI=dg0*Yjb&)6eLfKs%lnDr;%VR9Y;n=k<3^z zO9p(DXl__kl5|2crW0J&d`piv#5k3OQGC?XhHeTy=cE5OjLUi*oad5Of?X*0Gk3R+ jty}sCp=B4)=>ksv>POIBSUos?3;ORt|DokX1$N{c2fT30 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sympy.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sympy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acbad9e6deaeed3c6c805a2bbda81a8e94cec3ef GIT binary patch literal 699 zcmZWmy>HV%6u$s ze;ZeyrST3pz=0m{VH^5NTY*3UL~)cc1mIHYOxT`eArG~YqqbGaK;24-jiqr}I)JFX z!e;A|1-sP}a4JL{E0QU7CPgLG)k#N~sy}n0p`=wWbX~&II^~uhIs=bb z+!mCdP{J>2Jo5XIzW-R?Y3@9FPDgbBE{xMK>@^BxS7$cmG;noBIs?XO80a4LsnA8J zuR8`#mtI7N0T;IC5!M_C>hWeC&Y2t|VEOD)#3P>G3dk#~2u&AUB5u;nu2dSFgy{nR z7x)6M@@HIkp6;4~?VExPA`+aPH9SH(rwtK?o_S7!bMuHEo16;L=-Zv1?GkQU{fL&0 zSw%}$CkzCm$J<;u#l`lYhc^4sHQt-eXP?c>n)zq)5Aw(mgfP1g;1d{wga3Difw~l< zdv9M)&_;qbGEjlWRGl9_%h&Yo;_z^)tqgghtxUAFL|gl~{9W6MwXG?xkE(Cx;>Cln q%M;v6a4W{GDPA3+1h2lQ6TF$=&A8mzoJ?Ef&Z+=El=1A2?CuwI*}|3p literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tableauhyperapi.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tableauhyperapi.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a9cf34f6a28ae58f571b8599ce59411d9dc4596 GIT binary patch literal 366 zcmZ8d!AiqG5S>jt1Va%-5WMI~%pocEq#|BLC?a?(3t^L8+NGOpy1Oal=3n>+O7S=R zfC`>+5{8qLa^MVv?)o!^HlImw>ySpf{}XER7{bI-$s7B zf7jfU+7Mf=lG<>glaZ8Tt=t4{knxfz&h!kHj(SyGUtr6Kjj9_~PA0KnEFZ;2N`a@W zoZ>#uu;zxv70JhB$TUu?hHrjI*W76?OQU$!)rPJUU1#He(n#qIJa_i`WE)y!`?&So(gQsH@cf`Pyhe` literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tables.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tables.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae5d94a5df0d7e35a57c5e3171b36c580739b11d GIT binary patch literal 872 zcmZuvzi-n(6uz_LA5EIHDo991h!#Pm3~?%2K(x>e0aA;Q*epwyle;FT`bT=_wj@)> z@)xi&6(JBa8w&%YBV~v@Au+L8>eh*OF+~aD`Q1Ce@15TF-Lv0Ut7QcCZFQ&fRYT~f zOfC)biJgCj?JXjR-~ff#!C1a4ffA~Y8kU?AS#2kJP} znedKTR9CXA?KlW%JMld&zDuZ zj1U^Juov@0@Hts9WiTLoK<5zA1$nyZ!bseNANFZlQkYegaMo&ygiL^@jEz5Y>-8_pN5!1C`67_Y-$VR>kgFKu z+(LLYMR%rsjCRxid9I_S+v%N$>Eh-|6_WYov~u&EIjq!2mHLS}Hp?ekK95S}9I1E@ zr?nO7x7LTXjZtl*0LO-vf?sbAjkS@nmLo;m!(($do%OM`m0DY0o_&9kx+Jye(4r%Y bzF9ccPG8F>HzY&RawaOWU(uD<;F7-qvtj;V literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tcod.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tcod.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..433d63333f40055b68bbd4a76a20825c6895d829 GIT binary patch literal 486 zcmYjM&uiN-6qan~2T9FZD6F@omqHG)DTL9M(PMu=8HL?~LD-TKi`tSaDFye`|6Zg;oKQH7%_K(N3Mgo!#vjb*}RATM~F9!Jl6V#`t9r8&WTbNy|L20)Y`%v zgyBTkbeaTIrtcAmf~-1FKXPU2%C8orxqe!ty}@e&Pu?5h+UX zE=X2VgeqyZNJ4P8x(MsM`fE^>%l4OCv1!H+^#_o|5atNd+{GBrw;b%vQJtCy@6XWQ m|NGBIZ??XDE+x+Fuy2I!0@OO83)2^5HVbm+`SCvHo literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tensorflow.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tensorflow.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb2c021b751b797ebee7ad11a3d12ce2d1637651 GIT binary patch literal 5867 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 W&cE>n?)IZ^`iJkn#eQ?10r=m1fRxez literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-text_unidecode.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-text_unidecode.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f39f9d4883294fc2fec4c729341eb0ecc839ef27 GIT binary patch literal 729 zcmY*VPiqrF6rb7MWYZ;SVlSd1q!%HF-K_;F4U(IPP(<*yEDW2SF_~nulkQAP(^C*Z zk0L@nc<@v!egQv#A0UAo!kh}8dJFW{lQU^klJ|e!48Pxd^RrZPfRevY4qAIA0RQx1 zDb{Uq^+y$_0D}Nvh>ZjWP-QbQdS+lkU;tub>kI<$TltLy7J;4I^7JFWtX4CzaPGlf z1Lw~Sg`oUK0(%XiuFF_L_ZCcLX^W?jWU@#0-%QNjqCIGOG3)u=9_aB0MlGVUXmh!#AEP_eOTGL_0Y@V8 znl!CB(nbig7$IpeF7Lk?zDl`>l7wX5K+uGHZN|DhQ@;*maTQuxnm}3|MpIeRfJgx@ zSY@6ZQ!cp7={ElbuJnM{$;*0}M!isEgCR)|58Z^2xa|tYlJJP6N8tf&hMWrG-tzDe z^@nsh4_ZuuVwQ@GHhnJeqT%c4u5an}hu4MYJ%$GfX=Gc9T(8YPsW3Mog!6|cwB|qu z2S8`Ep>+nHjo0m>TpcUhemW`dPRqNa;;gdu)jlnLDSivjx4)zF&ZM$Gt?Z9V7iR9m q-p9uK#%Fh8R;Oll4j|l_Z9W=5cE=@eT=YjTv}*R9#a&iW!~6#$p2*h# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-textdistance.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-textdistance.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a34bc48ea3a950b1f1accbaebb738a6b1b9fc3d0 GIT binary patch literal 386 zcmYk2y-EW?5XWcl5(t{q7GfZc5b%HkEpPgZ582HWXbFH=qR`18XLFfT|yJ9Qc zA@G1A;yodNH|u|j?0o2jepn*@4KzzXuH8h%ej+)iiHR}iMb*%mAxs-A5_;7v7YEn* zrLd(PQLTw#T(^c&jqnXy8e}*b;Q`fAoaJoGjW@(Nk-{j}Z)-y~jkb%y?!v7s zUst-RBoj{0Rn?;1_4?F?rH>F=)&X@spuPLP8Yhp3FSmedOT9}8#uZ{7KP`rUmdNsNMh-;O4-gV1m594+`e+gyk19dR^96U3vBXdLm* zGwOGjZ?P|hW?4Zst3Y#?>6xk^$sse!AeXmU=6^5V{Z;` zSorv*6yb+46<*L#!vgjD6h$k*uBNQP3uCKL-dbQ@Hd!1%&RL^CWjkG7)D~O`JX5rG z%U&Uc%j)K--&yqt;f4{iO7>6(rZ2Q<8{N(yhq%qG)~7jZW66l^9*!{ag;ieofkCPeall)Ay1^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-thinc.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-thinc.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8185d307270cbfbc0ee0f1543600caef9131200 GIT binary patch literal 553 zcmZWmL5mYH7)@q6>rfdeUX-4~78c4f)8m4OM;EmeK~H5Mq)F_A&LrI=?J}PBU+B@3 zqW%qkKnr`2ISHP;6?*GwleXevza)<@kK}tVU%nFQB{_X!(IdLHU4vEF{u<=INc_)-qNUl(mcSJDT;CP_)Yy%8cW=Loh_^= zP3BD)?Yp8|4w}eUHBEAGd^G$GY`yr7UOvqwsdB3qHJ4XcX~{V)Qma&%FS%UiLovyX zusn4yn2{+rIiA<99|uXi7sI|uT1*DUvOO{InC{(X^LiIQJG|hzPMoIy0W)&22_b}= zCjo42fQJ(RU&9r6b$|YjyQ{eS>0%xCZsXof^s95a>YRSQSa;5EJLflvANrvyc?Yt9 BsJZ|E literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-timezonefinder.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-timezonefinder.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..839e24a6aad06d894ca8706539e2edd85230049c GIT binary patch literal 359 zcmY*V!Ab)$5S{E=SPJ#vMW}aivAew~h%sjPPO|W=9?2Vcpz^6;L@PC8VkqsVz0wo*@(kBEw zKtjDo0`Ow*5BeVUZz0_Ia%o8FyU!6(0`H{2ArlnUb?DdoH`SHU zCbPXNo*BkSHMt}+KQA6AlDd-NGf4NZBzLQryu{p?lA_Ye)V#t%-JI0aF- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tinycss2.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tinycss2.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76d1429a776154a09f009e49b46e0652d39dc853 GIT binary patch literal 681 zcmZWnzi-n(6n+=G!i^{cLJb3hCsZTFmKZ>4(=H5vs4Ao|MV3w%-z7G6eD2*PC{+gr z{)eti{1E>JGip%~$SV_Dq->pdXK)4T)7|&{&ZqBv-_yO{*k}XB=ezskFD-zdwrB$D zI#zcuodSmeaKc+TnY0Ei0^E561BbhP2-c3%_7f=&{gG6@$%=WR_5JYj%g?mW{9L~3 z=3*vt|53m1mrQA)d{%IOEDE8Rkt%Gb#*}(HipH5qr^7IjljxZ|7A$H=+rO-&fK)dV zndc%glrzKVD9eRTNG^d^L={^EXc5Wn&rMA=jr%zW*z<4rrPj z1WvWiIIksWWtl3E(t=F{r6|!$aU_(LnYKj!#pv;Nj6Y+ergKpo9pN-Yl6H-hc{~%v zEZ)zCvCfR>mMl4BW1(YO&a*-rhE^4|beblzFe)2H+VJ`yve<3r6PEMJwI^yFd)~sW zw-8>#5BK_ack`>e`K=Rt*jn7%Iq&oqo!+^-yKr~Unzh2aa1glFHA=ZmD6Klr=T932 z;nZZg4(qnH-MYy~Q1%Te58=Y=O(dV@Vo%+`()!jtgr!3WS>ASty95g!kcVgR;NP|M M2-#c0RjAp21DNizPyhe` literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d7611252bc0ed721aad6f9a4ce75a2e9b4e5c20 GIT binary patch literal 723 zcmY+A&x;c=6vvaM(@tC4h3yZ;gTk^D3$}|_5kW6SSViz43?oB2$xg@4OlFgG-PuzG z4<0=T3bI#a@!}uhA5dWrB`3j?w}HLw$)wvteR+9#`Q*p@Cg1AyD$w?`yC2*w0`SL7 z)~4r6yZESwPk;adBM?IeLX#JwLW~>)0fn#EI{`-oIaboqth739SW&ZUnw2-0rCEWL z9E)0SYotuAFW|IrH4^(21qH`00E$TED+J)X?pNkiNHu^?m6Tq9UhS`eJ*Y}Pi&HFh zR`*$&c`=okV2PFGGoN9F0y$Ckn=mjrZSAgV9eM=aPt$Y5(TP75M^r? zg~{|-m2_s7>f?|QnuKx6xD?7VdWG7e$9^;=l&ts}xG-sx<@oQa`(fLD?&;8sji3vDqJtk!nJH~DbMp+B6&F46Ot^!o{9RB01wja(tZ## zGL7g%-q9t^my0tUas(mFZvuFG4sLDw0^FPb?|BIntLLbhgEDL`8tvI|He6V>cU}%G z1Db2_DhJ4b8wUJtZ0mrkbJSV1yPsdq+g;;#9{nimu=3X9*;9RerSrc2Ve-q~Ik$Ia SmIkfe`S$K?%QW87YX1S{ec6}* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_cocoa.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_cocoa.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f381bc88af6cc668dd9239e46e68970f492df02 GIT binary patch literal 445 zcmZWlKTE?v9Q|F=NK(n-B2>B+X@|DE6gU4t5y344!ZkVD&`U1OT?;7=9Xq<|Cs4!> z;1}=%w9qN5lUt!%C-0&i#CLZ;-aU@@9`|C~Wsvwd?)Kj`fKPSVq4Y~Omy$d}00E*9 zAqPd8qao0Mpg?;@0B`dAz|n~=buG~U>QfuQ(Sy=0G>k9xw4vn(KBJWQ!V9p#-d#uu z&uyP2nHLd(m6(?W>toMnKEu<3Hw%8MQ2*mHR(NHf9y5cdgpy(9~F8D8No zyTl?5du=X)LTIZgO?EX~NwzgR5evqYoTmFSSp5y}%CXiFLhA~kbF_f7|9ia$*3rVO jJav|4ePz~XhE&krygIKw+%K)#%Bn4)HZ#;pEot}-$)SJP literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_gtk.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_gtk.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6697c9ef71199c0ce353b7dcf2827844e595219a GIT binary patch literal 439 zcmZWlziYxk82v6WlC)&$Qn0u<2oBL*O1J(3DTQt!5YF7G!6X-Rrw}Jc$8POk&{Fyz zbnYLZ;FPsfH^I%RcUp(icXuD}9{0WXaj&+01QMV1PX9v#_)?bxO21@tBgqpGASi+u zxhU3L4S@y}5$y#5yvwtPt5aR-8qxpiQyak5N$CL^#5e&)-8D+Z>3x2iaDioe)*Op4;>`hLL!Rl1;ya`PvUMK8&JQUPPaWKSv$~`~L!$XF@bN2(5 zh%D^3xF9>BrK&X9kJwD}t$7|ZGLGm)b}VDnukem6YaJo9t^m413%LBh*JZHI7G~wS hy)^49vpzGVg39yiy!tp@TD6r`TS9GSsFhjL@CS~DeTo18 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_winforms.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_winforms.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b04aea49b651b0d038faaf3f5ca023043799e4a GIT binary patch literal 1015 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchvision.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchvision.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7df820195680b72908ed96d7aed1df4fb7d467d0 GIT binary patch literal 298 zcmZ3^%ge<81V_|-(%&&LFgylvV1N8Zsr@dcHcdBr7(K=X>?GxGDZi-Cscl@w(r=@*xzfCcnHB+w9q8w)Cb xao9kdVpqftv>D{XVp$;Zftit!@q-+LkkSPKr3T&)Yz$IL7Z}7KsE8G)0swq?T$TU; literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchvision.io.image.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchvision.io.image.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..276d2bd0735a1887c452f9cd3ba39de7a8ddab46 GIT binary patch literal 264 zcmZ3^%ge<81V_|-(iNB(7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfjm^mgE;DXOv|Y zXXfYWW#%TPr}}9!-r~*3Oi4-2%gimvFDfZs$?zFu!mlECtC+mR+?bN0(#q7l!b07g z)YRk*-IDzLoS3rIys{Xd%%qs&%#u{yg2d!(pi#v!@dcHcdBr7(IXS6C@frE~*~Rh6 z`FSNpnMwM^B`IJ5eGmyW1j!ls5SQo`RQ}?y$<0qG%}KQ@Vgot>ubYC1y-Lpoy=LkeRsgC^50_JZv6(vr*^ zKTXD4ycwA(DXDpxxdr(}CB-WlK7(}qN_Mx3$xFC%vKS(hMNl)Nz;03`V HR-iBd8i+=U literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_client.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_client.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fce2c4a58e34dbb1036be148e52dca67632c304 GIT binary patch literal 381 zcmYjN%}T>S5Z+DNvPgUJBK85qfJwoFf|XuHC?a?(fw0N0?b=PY-Q5&&^DXoV6w!kZ z;R8hQl#}4eTcNj}+-)uNn;&L|nQw-9ZnbuR!N);=xbFb)W0MVP|H0zO1P_1!0y#+G z07BpZ3W-D9x7w4LdNsDjz#;V;;5B}2>cMI^5uDRRM+9pe-7-#9)zlKFG)g$5nXVeC zAUUU|x1sWwFnQ&<)!ub+nJJCUtPFC^xC%x>jFof^ZB@5q>IE$9lI7jSS(xE8)G{w< zHl6yM(q!aoA$T~W*(~g{I8;nie}a=S9#R!XlY(vNqZM(Kh)hcsca$cpLdSZ4`_f=i zEYbP;+MaBh)zFwaHg4`h236!qV{9&{jfycPt^TF-TS%~X}|sl5EODk literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_code.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_code.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e02a8ecc08e1caabed456bbf2737557445091113 GIT binary patch literal 387 zcmYjNF-rq66i)8EQVzSg2*p|Ka91Z4TU-Z;Cc(+A(5;h6Ytb+7J>GldeedHvHX1%Kc-!wKO$UH4TWsL{CW}Lp+yMdzLYe*~4QmH4fuq&3s^HY@J6ls|k zG@DEUPH8+0v=AIkX*NYYHb9DL8jNu~!UJTAe}fBUR=OMlPUJ$gMT{m#4J`S3esy?g7~C++Qj E04Q8@-~a#s literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_components.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_components.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71391f196871ee426583669a6555bbe802b074a6 GIT binary patch literal 390 zcmZ8dPfNov6i?c96mcM4go#&SV7r5$AmWZ93=zDILP?vrhNVfDq=Vl47Jh??=)n)+ z2bkcgC&81q!EQU5Y!1ZV`@?%7@ArPZ$5v|#7`z?!hX)P-U$)tx@mnm8Oz{9Pz>t9) z4j=>$AP_s)eQ8Y1)U$~-1`hUaL8tj`+YYREQ^6QXb&Qcl@f~GE)jL|EoW!Zf3&9E3 zs&3{2myDSIO;skC%Il6>@7+{aTxn$HWmsy;RG0}dQqnclwPy*{6Ij?qOMZD4ag;|| zmKEXSali;kvp@^Mq6y)Xs85qfQB8sZr6V*XDvFDWZs_9`u~Edeq)At4yn5)`9Q;=s z7S+-}Un{S5Z+Ci62yA&BD8m*XwrkAAl9o2MFejp5H{I0UAoDpyPHC8zD3_a5k2@2 zK0pOeISHP;6?*H*-PD49^TW(A^UW}it=1OMc-tQ&9SeXjlWfrV4VH&Gm;nqhWFUn@ z2!RC%#1^(+8V`EvS=$;z3p=-<+x#|Z7goD5XN<%u#7Lp=jxr*v9VJjo>PjLgu9_*w z1tYq5n)cOJQr`$}x2E2`tT;6}vbMGL!~N6eYbh3i7kc<=wMeqOHJ yv-Q2_Vp}hV+T@XT3mZbXXajgM2giT)({0bSb`D-I=WhSq?SHuad&h_{um1sh2y`(3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_deckgl.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_deckgl.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33f13b7deab0f99aa4ff6f62f99756d0593d1d8b GIT binary patch literal 381 zcmYjN%}T>S5Z+DN5Tw0$5&HmQ!KC0p!AP$n6cN0YK-gy2bj>E)?rsXX`4;*Fis-?I z@Bt!t%1Q9#t{|f*m}G;-f3P^x!2`emLk2Q9 zgb-MOKx|?At?{I%UbU?;v~cqVbe&(5c4566bH+%lB8(J@ZYd+OZYhB>5@8aj39Frq z&Rk+skrLe_1<-PnM;NAtndp(ne@k;r&8FOwr(0S`2rSZ$@1>vEX+|BDp8aq zpH4kSNIdow=PaC&d=?JqD3nwYZ-U|!B}9hNq@)}AXhj^wJXeB_dQ#z4p=Z3eeW^bw zm+txc+P-M%)li!})^2V?212^ayyUx_ruB!KHcEU4epypg!%d(^eu82 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_formkit.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_formkit.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47abc43411482a32aebf4f5372a54fa80e848050 GIT binary patch literal 393 zcmY*Wy-EW?5Z=A>LO4ugBZ#&_ic73iL@uQWK?EBK2g~MmlPtG)o9ylduJbLlwopV1 zAHoMX!Rji($}W&DmAi=n{pN?6Vdk5Gd2BR%VDPrz9qu^*eA#3T?>CqqnBW!=Kp+Px z>_G^IzyTBzhqx~r4`%M!*b4Ws=Me7-G;80s(1g`iEI6mJMg(h&28>fxHMGPjMFSzz zgz2i53X*ebnrkZW6DBX3Znb?`oM%d7Gb~%VW?Z#KLL^GMhPU!8n|cCsyJeA_okST< zBQ5iSW|K+4DUC;g7J^4pnoXlF>qm-d8jNwA;2~8J8W(I$kCwzJ7MYf;-&UF|3vKIz zf2X#_#iD+?IyaP?W;ZmZj*XkS5W?9GfJY@b{Hve!PU-I&y+g0pr60cg;fEiV_0ElF IMcNPi0DkXw?EnA( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_grid.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_grid.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e30d883d4b0d08cc81a50caf8be1fbb7cfcdef74 GIT binary patch literal 387 zcmYjNy-EW?5Z=A>!f}|!MhMnoic73iOt2Lph+r2Mj?L|QS+aMV?Cu4w^DVSap@8z=IK$yI2y4CJgagiyF&7^GQnsL<{3NcdBHKdhisnio#*cHp+`6&h5d`mo_(lf8PBoU~$NUyXcGpATDBR@a8xQH2O>@8N1 zVZ|#MK7%azmE~>~lb4tqQ&Ln~nVMHvsGF0Tnw+6qlAoUwQ<{aC~xpUP)1Al74YX3RplNMCu~DRIi}&7l#eRwRS~3K&u&n yxY!6td|+l|Wc(n-z-WGf!3-Ha;E=k&AvMEpgT@68>x&%LS2(O2SV6D|6zTv0)N(8U literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_keycloak.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_keycloak.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c22cc2af9b62a4e2f69f0a2f86ba144b45618ed9 GIT binary patch literal 386 zcmY*V%}T>S5Z+DN62yA&BD8lQXwrkAAl9o2MFejpuxztyyJVAXcQ=LHe2cz;B6{#4 ze1Hg^auPgwEA-ZryR8NN=7*VK=9^(2o6Rj?@V4I@wjBVzY_dV^H&`5+Uvkb@NV zAp{PfkT}GBsXdsfXJc#h9a6sqe&gGwKCE_Q!8wgJB3NT|$2e8hj+Qv3D4|8n1x~6) zDoD<$>29ceK$yJt-D>ZqxXP5qW?F{1W?Y3MArd8BLtND@oq7TbyJpERPNNK`k(PNu zv&kgjl*Xe#3&Eo)&8AV04I;%f4aPW5@Q|tqjSIG+M=N3!i%d&4=qOEAg^u;X|69Xx zvGmT?_nymbvm6>zN5;)v2;sa1;7JLN|LUjLDvh=eUN1|p`|fo=yzYJ7inOo)0hAha AR{#J2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_leaflet.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_leaflet.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c7cbd9ad467a9f1002dd375620b469c74d835de GIT binary patch literal 393 zcmY*Wy-EW?5Z=A>LO4ugBZ#&_in~~;h+Ik$f(SMe4wlXBCRws~o9ylduJbLlwopV1 zAHoMX!Rji($}W&DmAi=n{pN?6Vdk5Gd2BR%VDPrz8SFU#eA#3T?>CqqnBW!=Kp+Px z>_P|zzyTBzhqx~r4`%M!*b4Ws>k#h>G;80s(1g`iA~>gsMg(h&`ixUmHMGPjMV#V3 zr@E@8g5;c<=9Q%_)Sw=70yCvk?; zSj)Vi*<=!MN|Rxrh2Zg&X4AOCda+`f24kFz@PMiqjSIG>M@wRqh)he?Ybi~Zg_iZf zzf;3;v8bP}&W+@z*$s`UW8-EngmAV4;86(<|LSMGUHZF5@6hXY=|}H=^x;Qky?x_Z Hk@f>WQ`&Z~ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_markdown.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_markdown.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff7f0c552d2929dc9d7572574bb47cfd4cd97215 GIT binary patch literal 396 zcmY*Wy-EW?5T3pBLO6_tjUZ|%q`1UNQN*MZA&6iX4vx+3nk?D7O?LMp*ZCIq7K&)$ zL-+tESY0Jp*#*+2a@QEpZ+@5=X1*Dihg!`CgV)_of5!p%w8;|QZ!p_4!7UIVh(m(9 z2tgklpoloceO|dYb5F(=xI3AG)O5;JGh2Y_YrjxM4dZA*P1|u8~ai6L%8s%(BAN>$Vu}HOKy{6LSr_i)M z_S5Z+Bp3BiJR5k$e0&_fzeiXuXL5uu3Stpvg*yS7U=*>rbP$j!I#?m-cK z03W~yh~OzF!IQT_Z#}u&S`feaVP=^5W?&whO%G_i?e_+I764x+S;6@YW(PXB0~lb) zKnnX1f&s7qf!My_s;vNTMQ)6pC&rBeLF50;MEM zk;)lYjK*~%<+xx(_cvq_V=69NcD;2~USv`sJuljYqD;1joR6fiHFfP6Liq${X3;!5 zKM6CGhDsDA$;M-!5t0mj#W@QnB%6di8i$f9;^!zCp#hO$l$UfxA1#QZgl9_7IFJf2 z3W4$d|7+WMId@N&7oUlBy&h_l$J$M82;p=az@rKr{?$*nTX{Q1cY{~A@;dKc=fmq% MZuizPBFrOx03DTiTL1t6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_mesh_streamer.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_mesh_streamer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f98ccdcd8730e3638a04542ca91f930f313a11a GIT binary patch literal 429 zcmZusyGjE=6rI`4V-Z(SK_&J=ij88S62u~n2tfq9urN$^#_W*Uoz2W_V7q*RoqwQ+ zet;j~2Sl)ttpqE(K)O`UCI&1#_rW~_XU@G3uDb#ZUiaF)6AOT^f-F(`9j1q7xB~l5%Qv6_s`glb7{UzI~Nl#7blHk8Grxan%Tg=qqU(i`)$v zAv9)DBBWM%x$sesU|RUk2Ioyb#*wdOn$dVL@HnMG=xHIiKcw-{Z?mqin5JHWgFfz2 z<)b8HOE)z4L4k<1WZiwG$^2oz=-xm3HV literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_plotly.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_plotly.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cec02713e1ff64cacd1b00e471b4a8014d225a70 GIT binary patch literal 381 zcmYjN%}T>S5Z+DNuty-!N);wxbFb)W0MVP|H0zO1P_1!0y#)w zA41>&3W-D9x7w4LdNsC2-y!uI;CsI|^IE$9lI7jSS(M>4(y}ON zHkkyR(qt59A$T;U*);00L8O?bL5`C#9#R#>dC4~P@rpQ3M5ZMhbd)BmLdW`G`_gt^ zF46h=+OBMv)zFwaHg4`h2S5Z+CivJ`vqQs@H+0n>s9rBb|#P(<)n0%4n7o28ptZ?HNv!5tugKn_wk zh7dS_LgEnjrSV{wuO;P}6OqV589?}x8wfd=nr@PP)mo)u|7{sSnMaGn4F literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_quasar.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_quasar.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd4cf9bff89bbab9af8e35c7c36b88047c314797 GIT binary patch literal 391 zcmYjNKTE?v6u(PM387tF1nDevNa~~_wyO$71h*0l*W8(&z2w@vOCg)zLT3j>bnrv? z0U|hM5}e!$-8y;KTIlcn;l0OuzxR00jfMv_KK6P^(*oefBx^YT!F*o__W%P78AxFt zLXZFp5Qr^ozimC~xmRr~Ji@+(oh#6){hC4xR@*UWjKnI!NTKM4G9s(G5-26nBu5g7 zs+Mw`GopKIG9O?nE?RcAb6K2cQXxGnf?QE1gCXZ5DQrz!IfhKWfVo++xIH}%Gn9r( z9qj-c8BEx80&^3LuB#vU9DM1HqsqnJUHs0U7 zG#D2P_hfZ#SJd@ts7)SeH?tvxvt0lWOK`BM-)^_`npz*O-_J^~^XYZIyiVzM?;In- G{QnPWrgioJ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_rca.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_rca.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5295452b1807204388fed3a83d4888675d4bd065 GIT binary patch literal 375 zcmYjN%}T>S5Z+DN5XD|RDC7ZzfJwoF1{JR&6cN0YK-gy2bm=DB?rw^?`4;sF{6QbX z2dLmFC&81qLT^2}+gkCPA7+M`Z-#knwKjpq+g>Nzu>klo$r_E{V7{+|3BUkD26EVi z5LkdfY+?Jg@t~((w5`y!aPu1Y&bLW@SZ}ACF_NkTBZZP1%80Btlt4L2M2c!B=eT4< zH#)NHVJa?tyWYL3E()oT9u#4zD3f8I^MMq$=B%5BNj`(Q*|5mYkK+R6u@YrPiqR-w zgrxmIan9l~DaLV!_F_pD35F;gpp3{k8CG;npDc-!lov|SURx@>EVPXe{>}`C)xtep woq8s=^j@e<9%whSA%rszz@sTR{I8#`H+8-Hlc(FM8@;>Hha25BjR^Da9|1*g;{X5v literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_router.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_router.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5611a85498f9ca986cfa704de733cd70cfc6930e GIT binary patch literal 381 zcmYjN%}T>S5Z+DN5Tw0$5&HmQz@*?o!AP$n6cN0YK-gs0cI_tH?rsXX`4;*Fis-?I z@Bt!t%1Q9#tkzMNlZpWH91!u--FJNJoEblJPq8w$B5=BY! z>C|V0q$6K(&Y~H~XHlOfk)(?F6O@k8kjN;WlypNMuZZK6=St9|D-~W9y2kt4mj;t^ z>7K8z?TMCN4YkQ*?dCRwaNYs%v;rsF`t5cqxAWM0KdjvF(+$7e@V;q8n6LiS5Z+DNuty-!N);wxbFb)W0MVP|H0zO1P_1!0y#)w zA41>&3W-D9x7w4LdNsC2-y!uI;CsI|^#1Tun7s1cYVW$d%#_AvR<;YxxN47t7%S--+Ny5J)C*YHCCj^uvna!9q-9ak zY%&QrrO7DJLhxuxvuV_0gGez=gB&MgJftd$^O9}o;}vn7h)hd1=qOEAg^u;X_NDE- zT%z;!wO!dTtD!MS5Z+Ci5Y%40So#1$z@*?oA*fdoiU{6HAZ)U0yL6LHcQ=LHd<%U7MfBi9 z_y83=17lbD36t>YEn!l z0V53uRHU)kLT~5nHPO}(U%w9J4S^0`5z!+ad!X! literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_tweakpane.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_tweakpane.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b444a78c7496b66743b0fb133ea2a0665eaf0bd GIT binary patch literal 398 zcmZ8eKTE?v6u(PM3Be+`2%@+N9g;dJiby+&P(*MmfpE>8?a@mvy}MMi`7PWX6w$#C z;RlG|lu2-MD|GARU28%7y+6G7c<=WfyvKUo0~&9;o&Jsmz?VsuaDId7o(}E+1{gAs zz%GQK4=g|+wy^!O@}TFQwJmTDyB2mXL8JC<3JqAT$DA<|s|X{7qASXXtk#r335nD- zLBkBCq^czx=Zxs~n#_Bcit~nDZCn&*sZ>ahiy&8&$zZ_wPzqZ!SB~M6Phe{H%#zci zFhxnIL|%||H1ZiC@xWJ{vv5q(aoC}~P*O$w48=p#Co+t(f-dQ!IdK&8R0-N^N`>cz zrt$v2V}q=ixyOrxPsFO;4zZjW-y)C2L!Rt-wwcfqfhu13I L_N`+?m^b_Y0LpmE literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vega.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vega.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48c76f156f32f22a4b6f7fd9fab0402e75d155d3 GIT binary patch literal 377 zcmYjN%}T>S5Z+DNvJ`vqQpf`c0h59UrBb|#P(<)n0%4O~)1{kiySpjm=3D3!D53`+ z!Uw3}DJQ{`w?c0{x!YRwn;&L|nQw-9>~z||;O$_TbsYe{Y_db+H&`8-;0_Q#AO|@d zK?oc`A#sTN(s(da&&IYGIiz_F{MNTkeOT|Of^(Ycm|%_L8^)=s+gjqB#&eqCx|Iu3 za%wtTs!Rxzm%dwfud0heX>2BCSZc;qI2K}}q-#j)rlnF(U}aaV$LFU}f%8bqvZBRo z7H~?_aiE3Z(VQ0ZXvmUCF-?OhPA52{DvGBS+tJ4x;y4wBmMrNhO*Vy|^}*kr;j~(# x!S>cOxn~wbW9rDbr3)ckdH|j*!0~_mMBV~<_k&loK>c^r|3LlQrWI*F{sa9za9jWY literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtk.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtk.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66eab6668cdbfe0837506cf0d255d228f6680754 GIT binary patch literal 447 zcmZXO%}T>S5XX0uuC-nR$j!IVvj;!W z$M6AC=s|K4Jb4TB)|0#a5W(4znQ06Z4W4WKkWI}1^{3Bu{E?w7H2BC0|XEl zf(Z5@1U@hTg~TA{Tj^2#dsV)+2e_%A|CPQ$b}m7q{H43h1UD5sN17;J zz(P-2`kiAZ#*rg=lG1oGu|i6{p`}^Ql*Uu17YrN`NNSC-H^M#@jyq0+E#6&$U5~|* z2ZNT7WF@q8w0_rZj??At$$I5eUQ=_Sa&e_XVL}Lt0|1XQVE?^E$*dS3sGgzvef7DU hA$x}GIkF2=>7QG@lcDwuwdbf^Af?|TeRx%Ye*h(Pf-(RA literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtk3d.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtk3d.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d7d40166a06db01ad8c55873d2c7fccc40cb3cd GIT binary patch literal 379 zcmYjN%}T>S5Z+Ci64YM2Sn>cuz@(s{5Y(#(MFejp5VqO1UAoD(yPHC8zJ+}PMfBi9 z_y7?+eQ;Y|=Tad(D#AihCc`1;BPndnT04eIzJP_&-6S+m#!Ay3v;#Jvc^$`S~B!m~jOF literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtklocal.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtklocal.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c411c4e71ac9dad758808592387f87916adb2765 GIT binary patch literal 419 zcmY*T%SyvQ6rD->2x1DlP^f#MNLo-(DAuhCMFe*x5T=>29XiRRGm}Dg{e*bBpyxg~_rkg7KDh1%FnHZ>_l_(8zVcy>!Y`R08gd6Pz>t9m zb|3`U>cNg>0Rpj&3(v)SqkS^9LdV9X8&E5M=VJ}(?T|A@LKR@7P;g5bk=h=qfvzZl zA`%$Nc!-!TMI5J$7)eQ{T};JQt)O?Wv&&d2WKM{Bswk87KIa1|Y;#?^eTp%OX_RoG zq%P(b@)68)>jgV+`Z0=pCDM$<2dj~HUQ>XRjwBDW8xR{67H1Zz+xqyKH literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vuetify.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vuetify.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..106e408bb490da6b37b0fb0a4198e80df776b4af GIT binary patch literal 383 zcmY*V%}T>S5Z+Ci62xA-2zdY@U{dg)B0-NL6cN0YK-gxt?b1!Q-Q5Io^DXoVETRV= z!Uu@pDJQ{`w?c0{x!YRMZ+@5=X1*C_-s$WBjkkl|$g=?WGRYRL-(Y#DgL{Ahh74q| z4{ zS5Z+DNu&BLwvGf6if=R)HLQtXnVglZNq9m5uDRR#{_E}-!V>AwW}pgX?(A#Oe-%H zBFWb#PN$WlCc+DuY}zu7aTuBPCtKTGcI=dI1Z&W63VVD8p%_WnR#1 zGVwX3$$c|; zx5A>zMvufv<$aCHm|9snoB!VuB0_7IeypKPBioMUh3ipY?I!(e-Q;e~$S&MVz6&X{ zeV@ej9`k%!7v0cU=DUa$0pga#Du)b7pT;oEJ8bQzy2o7%GD&3oi5tiA#coP^bU3>wUp1%1%Ubxs|PMtKpIzWlq|{Hxj= zR&N|vZ{(mNV+=#(^5FZupHqF|NMCsL%TTW$>-8KEE~VPJT#~VoYR2CD-u$Cqho#1G zsWH?VJ9r0=QhiRO@hTHYwV54-uLc`JQiF?&M^HX_=mKBe-poAw@mW)Tj+*k}V)5pR Obhv_VHu2$Ch~vM|!cEfv literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-travertino.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-travertino.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26fb45e0988ce0476054aa26a0148d4e6abe24c8 GIT binary patch literal 253 zcmZ3^%ge<81V_|-((RZS7#@Q-Fu(|9eC7c%rZc24q%%e_q%a0EXfoa6D^4vbEhx#) z&nb>CPR{kyWW2?nT9KSnnv$B5nOl%wR8qW>;WNm9Um5OJF?or(F(pN%m8p4!g}OPZ zsmU3-AiXhVsd;5FKAA}|#hE3kx&?{J*@@|?#WC>(m6>_PC5bsXsYUS_`T5z!@yYpl zB}JJ@`o$$FU;%v)sasN%Se9B;l9`vUS5Wzj!zMRBr8Fniu819IG06GF!a(8!Gb1D8 U2N?ztl?y^D4g4Tj#0nG#0Lp7jumAu6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trimesh.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trimesh.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51a1eb0321f2a5078901ea69b6ab2779c3ea158c GIT binary patch literal 346 zcmZ3^%ge<81V_|-(#x0_7#@Q-Fu)9DeAWOmrZc24q%h_%<{aC~xp9?5jR5FL4K*Xia1Lde1{v^^C}+0CW7l+tS{Y)hcG#bC6Sx~oQ(9Z3$@r~HZ1 zOAkG@l>UwW00(jizV_6cA-9}5-reNT&WuLP(@5_P`o6RC5YT=-oi09k0KdE9&ahtD z%?WOwfdL~DQZgf{Gjj+yz#Zm%BLF{ft!>t0J?5_5`{K@A>>8^xM zv!7&A^2ElBS{i>4lAGq>9xD}1MG{LfH;r$#u$ij-ysVz(W#i;!=;}^pwZA@^=t5bM z^2tYGtGx}DWND7C>U%&^wJ7L((Y>v!_@W&A?*;zTT;XH|7d;Kep2@ze+@4C;Z;Ap2-;oP8(a?`T@OYW?Upxm eTEJApVS4~uqdFMYqvw~w@l|kq;dQRJk?1eqL$Z1U5S>}uiZdt|IDm3MB_HrE+MSRP*^$Xwf&<2q6&bMz$y#Z)Jzcxg+Me$5 zbdT+ka>$Rc1P9I_#NXft1c{SR$eg%Y$}K0Vd&av)hVgnox~g8is(M{NKX?!Y^!)bG z!R*6(LGYLRar3OSU*7cT%l82fjshO?jtuk8Q6~&K0e1MxPhk-JO8?Dsw8B@v33_YQ zduu@ueWmprrn-d6Ae;%Cfz1%Cozq8-1`3wW*$ks-dBm|m#SLf$3?wUO2nH?aDTth0 zfhi87R1Q+j5vD>CN~)D*LLrY_3ZX#Q1vGF`Vrq3+$1uu}Xs{ANX-ja0E-muDhqPH` zh@3Ex5$A|LOFXG4mV?obb?pOFT?piH6cLus4#t*MYAXUIisW~neI(b4d2olKe{CzIvyZf5LehbOiBl{MlTjlS_d}41x=5m+_8&8YTTcO%Qw|4`2^}|Zt&T{id;4GZ`as|k zqsfFQ5(%fc$%N?9_f~2?^zg-=w^0nV$w;=X2yU^AOjS6k!LgC#twb4dWtU7!I*A&xp{mVwn25fy}r%6dA!CuxT1+)yFRHYF02 z2B{ebIw>n!P)eTyy!zyEr%RDyEPmishIjFdV{WlH{}#l4Ntoo9SZF0&+xQ=oWzo=u#VV z9Bven87t-+y@e|gh`*?;)vDV>^}*t~9d3MG3A@p!5#>4QV%QjCPHil8-HY8q>n>qh zvtuH)F39q?Ta&%;^4(NRN#ji16cfM4F7Ge4;EUes<-H`~I!%(x_Ydp+rf*orl@-#& zZbzBYt>?=%2Vi~)-ZKpc;ausCQ}uNfyr z-Hrvz!~-Wz<)t`&WGwdwkKFrU!7eW9x9iVy%`1t!+(SYnhsHE17EDj85B_uQ>TjBOVqy|-! z_;pvy1TB6Xi7*0=8KxX$3L+sN&=WCcsK7|*4b#vF0%S^NsN#v|y6p%l)|{c| zlt3W_acogGFm5$$9>>=~Hv>(v>SIbaCh@vE3n2=$_0vTNWhRK(oxs85b*c^Np~~F} z4UsLA#dZ-%8nq!Ph4r>OOwAA;Z+WZhP(7HKh>UCAhPMSHOh+{cQtlp#l*_S(%>~3$ zZyof6WReCI3v1-4)oM{znN$YMtY%$B%QL zutR*WJ*d`lqahTT{w7st;A@O0QjN+~E0wzCzubROhl)+w?(x*@RCY0rB^*i>^M{oi zh*#i6@{^m`5cC6){3$4vo(P6Zm-x zP8XVezqT~J<@;QQzCXRc*cwA4V(r<^(8}J!X~`<+&+Nh~Uq-KMYZH#&Qw+tI>cV}8YS$Im8I`B~@rxv(F~)F{zyYQu9w)6R|Sw)V2gWqCW1 zd>CU(-66;JqU%kX&Wn!YoIkkdES)nutuklxjBPBwKgug-<&_WH-^$hR&$uEnxi->V;o5RM)aYFYqXC(!R~9AXe;pBX>Z!?ZheFS~_bp$BRP2Xurh; zUJEV7)+S{$PFKeHCi(>{OH=hK{9013BZTrQpgS~!+ufa)VDETlRA1Y3qqZ<=(_&tR WgVR~%<{aC~xpUP)1A zl74YX3RplNMCwAFq*qY+i^C>2KczG$)vgE>Dj=T~>jH@n%#4hTAEX!<%`Y&RA)^Nz YQWrR+W>{Y2P`$#T+Q15eMI1mK0Ca(51^@s6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-u1db.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-u1db.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e30c79c0f9151d4f0b62e7fe96767d98edd1f7e7 GIT binary patch literal 723 zcmYjPO^XvT7|!$q>&PN_QT7yakQUm^R%8o<^&~7pSqiR~GB9K&*-mJh%qE$xg9!c$ z{RN8nH~axBc;2v5dk?Zi_e^HJL|vjGx087S@&~jv_%SnHMFYSTY;=W-fDH z+d@hB3{UX*$k{V4t9S4f%Q%tnxFD?2``*d$%RWjK}>zZa`?89gXbIpil(=%PML6fa=mrgU>L{h5q{(H1y zHHsnH5K%GoVF;Z!<#dWXvin9&ZK=7mK8AB8Et7WN@y^>+g@66Q4}$HZT)A`3ZAytH z={Xn7Y&)LU>7cW{mwMkHw7i>mx^J9%@|tIn`?b9z@_OWn;j+Hz zy=ZR2OZ~t>`fFq+PVL%35bT~j3_3gD6#~KJ3LO9c{O%oI^$tHD|Lmb(J@m2bm%i_6 F{{fY@+OYrt literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ultralytics.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ultralytics.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76432c76c718bdcec638270adfde191ab1de72a6 GIT binary patch literal 400 zcmYjNJxc>Y5S_hCzm%k5rZQ~59S7bxQ2 zuoWU$U2A0*NSDgpd_W$v!|a23?=f$++AbJ;9<_U44#2PdY~Zek`H2~xfdD}qhNy!O zI6x6`UJ<~Dc`I}r;&xn8dH}!tXDJ^Qd$Hi0#wsFM;pmZZDvN5)Rff4%ES8g-ve_46ATyhzC|df7^wJpZX|n8x80>Z{5s GX8Rvr{dpMx literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-umap.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-umap.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80eab3ebc23a5b94397014b5aa98889bdf25c274 GIT binary patch literal 338 zcmZ3^%ge<81V_|-(*H0rFgylvV1OCQ_^bhBOlL@8NMX!j$YqRTWMp7sNM%f6S_agy z8i*kviYbLTm_d`}C5WrZc#AhVzo0TcH?<@&C9x#2imNm?u|PK`HL)nqPm}qUctE9R zUU5lcPEKl(UTH~YPO)A_etvdw5y;kCtROALD;Yk6%=(q&ZWWW4m>W}4R9cyuS6B!% zB{exiwRF+H_7CcdCD6J~ro*x>l&{JfH)%q0Ed zk`%CjK8Vx>xk|5~@)w6qZhlH>PO4oIC(ufer;2re#0O?ZM#c|P42(t>7z~lo0}jy+ V-U&GuIh3z(C^xWzU=ce|0|0}wVcGxy literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-unidecode.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-unidecode.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ddfe15e7708f04f2a17568a03c62427752682892 GIT binary patch literal 358 zcmYjNze~h06n?onRH0B^Ttz`F*mhG;aTVbZ!R;uNUK84IY0^v5gKqv8u1<>hZ}0p<^A9bdHLRZub#I91|P@6;?x27wqygtS6G~w^aL0%Vo;$GLNEY= z@Zbdjyc=I*G{DXS1Y19r2B_Q11!E-FscOcRzzrj++ip0;Bo~<61x~kr-`;YiGxJPF zjiyXRr4SP(t#ap;6l20^RST)r8!YU<%i`uD;aQbv*|daDry(OGFGDQ^OJ;=6k|7-@ zifR(pSw6`MqLQ?3=|(1938cB;TGDZ>G+tfAHim!AMRmJ$uhvapOS>UErHW1H9fVMS f0O))UXaB8tVfSe6A3k4x`tg?^KYI2^*VOz15a?;P literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uniseg.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uniseg.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b471042a696ba515585b63f3894d5eb0290d9ab1 GIT binary patch literal 342 zcmZ3^%ge<81V_|-(p{Mt7#@Q-Fu)9DeAWOmrZc24q%h_%`IdM< zrDtAoNg_~9kzQ#@W=^qQMt**FaS_PcTdW{W#VZ*;gADtX;%*g_mzWzbQ=D0ns#}nloSm4SS{xH!P?-rcJ|1jvd~$wXNl|8! zesM_(SU?{{>Ox$kS5Wzj!zMRBr8Fnit_Tz+Ab%C>0*MdIjEsyQQnY^nX%H|mCj&j@CLos}r@o;qSL*iC z4&ThYuX!`?_hzJjg~LGv?T5i!`L7{_exyRP`3{&D*F6Y5L=uu11&NG1vmy&Kt9X_< zkz=UMqj;BnqHozR`dyh*_~n2Y0Nz_>#9$eT0*i16x?l1=W)OM`z0ukwF^t3dp1aEt zG2+fqF%m$qvIBYyN0#EhzVa7wj)G@r({m@$Zd~_Y~6T2Y0Zpr@z z!d;W7J?133{f5|sdp`Rk?%sLraH|#uvrD~Aapzc*Yn^e=QeRVU&#_%%(B_+f5Qn?l z^`fAT4j_EI6_2GqG$SssCy>@FCShe@slTa}c$|F90y@wejX`s81H|NCk}BVrSD96G z-!q3+87%0F*r$1=fD|mVVoK%8ND}_Zh$%p30H*+j8Sw;WmQFUK?F=@#))}Ap#mR^8 z&}SJu@Vk*4YLC}00bV&gpwWBD;emFWC}2Sw2FocdNT}!VknLVl=#Gnz&i)yF4k)yG zO5vYZNk?oDBVJE4q%*H!y`tR16UJH<>(k5Cie~6(mIP!yUs@}# z$|~`dv4Pcl;O$c?MGl6CsEj^AxBEY3j20i`uLiVzXm}En=MpO(tIzuDw047MAA? zZDkFsckgBtj7y6dqf$}k??KMHzZdvO2-WBpRKOF3XUtXZj>s^)$>{mcFjW9hhW%1W@4&A&thM%expD7_{n9f zYt*Lnr$gHda7F9vNqs#E^?;z6)7i1iSXNS$b)lhgg|u(oe_++%w-l`hA>#u@!!njV zP5cez81YxCSOxQQ3gUB${VOJ$P7|TzUWDw5AuGh!5C~h*N%zgQ>1N(p3Bzj1b<#B& zfy7$PG~0rqabVEA)Y{c*rJ?n#iel+}VJW1VnCC!h=}5Kzk(3p$3o0>|>fUZ5eqLY2ZmI7oJpE^9atZ=U**;D-fe1z*v$ zibi;N4-L+P@0W;wwV?1q#sv)2mG# z-Qv1Cdlal{^siN;|5aKC46pd{<%+bT;Pcuzh_vAPKj0PAJq*LtUqejXM6m`rD6rvv z`{-@6og6e~{u()G*lee|55>B-_>FKqh(bp;c$mC_jmcV~mN295Sb=dnFm7?@Z0=m$ zgP6`bkN9JCbd*UsTzumO{Twb~HmS~bcvJf$qfaKj^}sjr-x+J{qCIxe8o6YTTr&Ce zJ}+$Ye+z#V{xY%|sYUkViLEnR`j)?5bOwl`b=1X7GW&jD!rq|MH~MX#dF+D8_W;$oU|+C~ngi8z zqy7Pt>vK8>>&WAsg3Rbx3plav2e0qNhIeDbPu{X(XYJV8n%@y(rf}Q|o!kqJ?1oyC zEnAtZcIK)Tx@L#2nW1Yh9eNwY~#N6&WugWm1;9vt6^o6(bIWN>4Oe)RxdPGjiwPwYG9^6`lz`aan) R8S;F8x?|Gs`N8i6{wGQ%tg8S3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uvicorn.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uvicorn.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4b8c2aab552e231b418c67df395ad008b1e7874 GIT binary patch literal 352 zcmYjNy-LJD5S~p04j#iVz51yyqYWn)Ie3;#Gtqg0~U~Np@+LZnEj_CXkzd(W@s#{EdD< z1y4B%p1c)$>&e~5f^T+)nPFz$%)UC#5ojz=$J2!c@NI%U>_2C7rkw>~z=%PCCJ2EA z1Yzq10laJNF|n}y2>!v334PQZXPhyTsaV!&!Ew!q><;UOabDf~c6aj7-jz}%x<-Vx zqD+Q4=QAk`ZRg|^V^Y$h;zG$c*qEVPe0vp@Nf9Ygx1^lU14c-e2a0nRHKc5!F-;>$ z6$z>&n2%)tH c=wb!u|KFGEtz7T<^1~f|y2B^Oh#2UOUq^#y;Q#;t literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vaderSentiment.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vaderSentiment.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94104e418e122037a99c5730a06a0df20666f9af GIT binary patch literal 359 zcmY*VPfNov6n|+Ql)*fB5$0ViuH8*R#H$EHgxyAvCbnAL7lx=gNTm=gH3=n#B==k}-RxI{GBsqm;hCk|&~Fa!>YH2} zV*jeRG+gL-D&nbC%O^W7dR&wHma;yKA%T|v2+?4DFv=rUf}^BW6ceV z3X;yqglU`--6zI(0gdPqXL`q4JvGD?*IS* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkpython.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkpython.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1fad4fbc0619bc0ead30e7b21b253a057b4133c GIT binary patch literal 707 zcmZ9KzfQw25XPOPMYK@<6uKa0B!fY_4MnPw*h)+tJJ_ZoTL%W-fSm>L z0K5SYfS6ELCbmdyOxR5VG`4iQ`~3Otr#O#|Mjfd2vexyVEdV}rQ7ki0zP43z4iwWdKrIdJemols#H9@NHl`u1Dg3(G$CXxzu zLX47?EN!|boz#=x!mB4m{2G3M z37&cqJb4@Jwv)+pBL0*7d3ogh9xsp0rVW%{c6-AM1Aq^GS;_nf=6fo*0~quHhS*>* zHTnhw1|SADA0PnF>U^tj;>HzduiYHmc_kB`x!2)@3@9VrokYr9bbWtFWl~07%u|2D zM>OS`|L?8+scCIkZ^oQ45=(@uEKF&P7>z`2t(fQSM!k*@<}pI`)@5~;2^p$_!Yd_Z z!b>h3H-Wm`Cum;p% zl@(cr>Vj&h%88suvue1?i@ZmN)JQcdMyoL~#-ISgQJH(eAoMM~okxsUkeHCe;!p+2 z{8x;agf#-|a0G#71P|XvkJiK#X13GaJ%^)R%D>{&1bt(Uf z#|C#+7%PDw_OqYkBt-xHPmWIhm*|)?K8K327tw8xcd_>=IcmiK@dTbYyxi6L*B8Ki z+Y=aXfZb$|^${2B(l`zXrtrjIedK64a9*Rh921A0{Q-{{Ik4pM$e^Wo1z&**UKKMq zad_1is7Kzd z{b-JH*-s>M3sz1c#k!&aHC8k*(bXsTmf5Ib@_x0Z8zz|xxT%t^s<>npWyzF^Wktor zzY~8wX#ylExOS@=O$ETv(H-T0XDaomsQnD4G8l@ z&o5eI12SsZ0Lk2#m8j^O+kh&!lwZg#STP@K4TFh~2Q`i7lThCa*60PH=h}+ZB(0)D zBJ-Jt}hlJNgBF#pJDMp(nI% z-7yT^5b9gd2!d%e6s;ndx=>a$Ss)E!;%ZLOh$%tO$byV(Sd*y<1T!Qvj#vRCEo{K$reE z4$Un?uM2g_&;TS6BnZAsFyJmryDEhPb;!<5yRnjYEAqRhqPkp%aRWMW!!@`_G&%SM zL~iPn#{1{V8~Ku61*O4K#kgP5sfy=|81y&Pz2sNZ7$m=?>pR5YKx>4lNr+xQ;_{n{ z=GD=i?BAziC;OtT7)7swZqla&bi`%7nRZ=qQzBTCs&I{iz`CrLQ=A@P5qLPIh8qTg znz$@Y4}zX=ak-jgV9j*LeE$2vT@F80hzZ{Z_^bdJH%LswO`LyNJom(n`&pNhYP3b% z$epJpT%(8QGT05DpU5}p2gn`0+IsKi2H@E+jok*;9zV{h7?-wkrmm|SPq6l6_*l1t48ydS5RBUxh5z-u4wO2kkS^4aE<+J9>{npBTPv(qH9FPNIPhW3dz0taQ<1g>nnfL4~ zcblVkpWktoR_xKjnG+tRX}|4^=j`#^QMEa~)*4^iPdHO^ZNx<0_NM)NPJHxtAOH5_ zgN>u?m&K!!J+;(~FSp{$wl_|vgoE3MQ_ZP-YbtNE6Ha*QBs_f_o^FO`THzT06MEC0 z|HaAt`tkgFbN+5?{;nr;_{8(&=gan`x0>l(E1f&~m7RLW9)Sa0+YdR{=52oZ?Cdl= z3?SgF{IkQR_SS#%k)8gfEk10r8!dLj{?Rythj!y5h7ug&Jx33j-sT5QR&24N&5Ebt z*P#pycdl~y$KMA7A?{y*oTE_vQxNPtV?zIR{Og_QI)`3zq4jIQm$8xcZ1824(*Fjn CZeyeX literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-web3.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-web3.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6c2b0070d685a32cffb354565bee73b4ff7ba5f GIT binary patch literal 332 zcmZ3^%ge<81V_|-(!Vh>FgylvV1OCQ_^bhBOlL@8NMX!j$YqRTWMp7sNM%f6S_agy z8i*kviYbLTm_d`}C5WrZc#AhVzo0TcH?<@&C9x#&7E5_*lChsA^DXg!O3%FFlEj>x z)FQpolFXc9y^Q?)?BXJjeYaRaii=k=dm!&6tI9k zh|~qSN3Wpr7l%!5eoARhs$CH%C_vsR)&UY9m>C%vKS(h!8eL#8L`DxdL_2sVq+R5Y Py}}{ezzTvz96${K3iw}J literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webassets.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webassets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dad07772d78e38065575c6dc0de57365e82c5f02 GIT binary patch literal 378 zcmZ3^%ge<81V_|-(xsUg7#@Q-Fu($3eAWRnrZc24q%h_%Gw;(Y& zJ25@AI0k4}Cd~MFu)*=k`FSNpnMwM^B`IJ5eGsV&cd1@M literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webrtcvad.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webrtcvad.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c836d179081830d213e9ea4ea992c67f7e7c3474 GIT binary patch literal 342 zcmZ3^%ge<81V_|-(tk5DFgylvV1OCQ_^bhBOlL@8NMX!j$YqRTWMp7sNM%f6S_agy z8i*kviYbLTm_d`}C5WrZc#AhVzo0TcH?<@&C9x#&7H4^CQc+2ASz?NxCi5-vfJ)E2 z;*!LioYW${(vr-aV!e#~{OsZ)kfpa+K{|?8GJFOZ^()=oDkd*6H>RYhv@$iXuuwNA zH8nXywRF+H_7CcdCD6J~ro*x>l&{JfH)%q0Ed zk`%CjK8VzXJ4&yh@)w6qZhlH>PO4oIC{REiE7k!LAD9^#89zudFdAK8FhoWVI7B;m UCuCpbP`bjQ)W8aYMI1m40L7JL8vpj#N+A%v2p$#09Fp{;BE_o+MFejp5R&ZDEZJn!-AyGo|H7-MiufCT zKm|{^dh!fG-_vVg5SH)6RJU3>Y!U(HJ2x zfFNwl5x`rg8;lKX-h;FAtwRSj`w3@^Br23uoO4_;BAfmLi6u`mqU5b(HV1e0O(9j( z)d{aslu0k;Jd;9GH&#k9CI!t)E|h$Qr5?OWuP=il$^#{;niSKi%LqwQS8>jQ87XGL zh{l1WinwKzWYL7kAS`RTr3u#rVZsX~XzWXc*9l)+_isC|tXI9^X6-AX|482{{m!%| iLa03ibiRPI|F7MJz2k*_^gR5q2cP!f(b6J%UC$3Wz-rO} literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webview.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webview.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a6c3162df2bf792ebe009103016f33e76e20b1a GIT binary patch literal 545 zcmZWlJxc>Y5Z%3xB+6+-6u}}*P)LzW84$4(6`}}s$H8%TyT--6ySTeaxXyo}rIjLD zSX=u8E?^O^60Gb3cB$Nri73v_3^Q+LXWs7J!ooa|^0L`#KWhNIt7Im|H28F6a0L)R zkb($0Fwz_is$8RbWH<%{*kJ1#z!2%kcrV&j{xC;8Vh2 zjQ6%&$-@<_o8tK5qE0am&*~ycsN2JF&ux*w*pl3;K8;7xjdTd%r~=?2%s}hE4#7tDSKsux5zt^` uXjL++a-BY{W>#}xHD9gfWoa;J-Nab<;E`&5~8O7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-win32com.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-win32com.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fb5e8fe1acca541a15ddad22d87a2724d4e3228 GIT binary patch literal 284 zcmZ3^%ge<81V_|-(p#7q7#@Q-FaYF(!Dl`oHJu@aA%!uWDT*P5DVRZ%xk{uwGtby4 zIX_n~IVUqUuSBo3Br^v|v^ce>EVT$M>Zi$gi#H=PB_%a4Gq)hWsHAu$!)K7uztY^T zV)7DmV@irjD^v3d3w3i+Q z^NLFnb8=FP;xqE|vy0=C^YcoIGL!U+OH#lB`XEvl?!JP`UmP~M`6;D2sdhzdKx-L+ ixL5*6d|+l|Wc;AQz$$%%Md|}DyC72oF9;T~03`tvW}4R9cyu zS6HZx)FQpolFXc9y^Q?)?BXJjowry)8j4pkdm!& z6tI9kh}4C-Nw1*t7l%!5eoARhs$CH%NI>2y)&UY9m>C%vKS(h!8eL#8L`DxdL_2sV TWL@M?yuzW_zzTvz96${K2)1K~ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.lib.activex.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.lib.activex.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56ea398ff82fad770df28736bc6261b0782d8040 GIT binary patch literal 359 zcmY*U!AiqG5S>Y+6rt@&1W%q?dq@iPCgM#*C?a^1KuD9JUAoDpyPKGJ@-O@YMf?pv zpn|7fJ$Wni){~oRKp!)YnPKM5%yX-?3kGl9(d66$_^gr|_HVF0GQlH65Fv*cZxO)) z!pM3;fLG%`K#1%c=;|D`ITcrZYq@`2 zUM8lIbCPbR8CUL9h?$br1uw9!1ULNR#7lzM(=sb5na>?g6iyv21ov`Ea&N@Oo?@Du zGze$Ggp}u}C98G)t)d@_L`yavC>?DJgNmL1C%I|4X`aR+$~c|LrdeM7sD_4CHX^PL d0FM_i{A;TQVCSK|=yczq_W`{{ZL(p;z5x*wXVm}z literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.lib.pubsub.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.lib.pubsub.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5ae66d7855b424432a9aeb40a16b8994283729f GIT binary patch literal 433 zcmY*U%}T>S5Z+CUMx`QNgg$_fLQ?RcP(*KvP(-jOl)#egZj;b$l4dux>B+ayCs0Hm zzz6W)F@mR@1W(=yz4hd#wV>bpF!RC8H}g=btO1GFou+rJ0Ps~d3oQQ@lU-Td0s;tR zpaAc;MzP8 z)Qlb6bv(*#sTwTSquFAFqfjJ)TjzqzhfO;x>+LGP?Bq=^*Zp_h|Iqy#t+ZrSj{g8GqJ?V! literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.xrc.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.xrc.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fa905edeabe4142dfd997afb0ce8137fe8994e7 GIT binary patch literal 248 zcmZ3^%ge<81V_|-(vLGTFgylvV1NnA_{;}nOlL@8NMTH8iegA%3TDt`u3|5*(2K9g z&AG)?Ug4+7c#Ah9GbJT8FEh6wzo?{mCBtWs?q4bHRxx>rxiKY0rIo39g@w8~sj0~s zx+VGfIWc9ad1Wy^nMpClnI);Z1&PVoiRr1uG4TbJnR&$}i8(o`Me!N=`Ps$s$@zID zMVU$Z#U&|V0euju3v@t5QL-9PLi&6PIH{2 zH^Gx9Mf@B7fEMPk^dxxlHn6unna=Ejiy*!vFYhH^@_jG);<|0n_WjYxc-8{=*(6t{ z^NpQ<)YAtbKu`iH@=nFCi66+20>|YIOvqXGNG&g$Y);z8mo*p^*wHQ=$kn9y2w+{SFI( zi@^v-Q_6^(-@9ChCOMm?nBg%MvbI>BX2q-Cjr#uU;w6&`>#M{dS8*Z-6V9hnn3_~H zZ&X_iovhtSObBIhnsK3I?a(aTZtUvl+TK?2%&Wc&=8gI;_v>$X)mm^-8&0+ZNtOE(tBJUKCir^m3LG@XW^9X&KX$C w2NmpT9JuA)eg*q~qKB1tyz-9!jdlRpOK<7De_QQzS3BJbx(lmm;-(h)8?f8L6951J literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xml.dom.html.HTMLDocument.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xml.dom.html.HTMLDocument.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4254e6544abc63cb0c9fbe0f83430c4d6bb01002 GIT binary patch literal 1932 zcmah~&2G~`5Vi|K2oWU21(otAA*39Vo_awDsiC9^a!6^)1zCzV_Q>95y}Mnn(}WXm z!JP}@J$MSPyg;PhdSacjOVBvRmRDC z+%c0cUgE{xSO23I`y;Qp)!h5^Xr8flEV6d0&7^lS2=;lD3iXCT23%L+QZmpM-@*P0 z$Y!)daqcPX%VR3~Y@Bwe908y(Z?Dw5SGzJhBP?*WNz_{S)%5~Vz`2Dl_WR}$PR zJ=1g66Bn%i4|SYbKO>3DtODk;aP`2%`+1+oFt^KN|A0)OhFt&&a3>7TJLuccIPZY+ zsYP*@4T!WLb{zmO>QL?WUPWNx_+qt(lT*|FHZ+!FxZd8liHA}jDp5G*6$?mB>-OIf zQ6y1BrkgpGCa%?Sen+aN9o`p0I~cPYMT$z7egzJ!R-TbwFc1UMGw)?x$Kk;!(gTorL(uJ_k|^%X>@{woQFKdd#>yQcrM zk z565yrd9Dd#pvI{X(|jD6GeyzKZm#3ihuv~)p(-7Ss3=dpwp?7^e3^;3VDL)aFg$$o bjwS}Izq6^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xml.sax.saxexts.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xml.sax.saxexts.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f3b71c66080ebac5aa7e99bbb16f1815f2c3fc4 GIT binary patch literal 574 zcmZ{hze~h06vvZ05%H)XPM(Ku!VSFxM-f+-!^KSsCD(*DG-+~4uJk(jU%0!7|A&8t zgNy$_;kKK6IqV{BLLM*g!#D3o-h<#6!TP*jq~Ak?e*C3fgFk0`0?sQ+5k+tK8BzR% zri1CIo>WrIEU9MH@RAvO15O$14XZS9_4ps%Lx?$*_b35sqmufvSE)qK`(GA(S)cc4 zX;NQwp|;wqE(kGSP+Stxtf=jK8vma>dr@oU9 zw^2c4Sz}(xgZ56(bRnE@zW_NTa6<{aC~xpUP)1Al74YX z3RplNMCwAFq*qY+i^C>2KczG$)vgE>ARtc_>i~%l%#4hTA7mI9jV>@4BBKW!q8+>w TGB0u{T;Wh?UDghA literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xmlschema.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xmlschema.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..637553cee62e06c169db243f151dfb3b59924aa6 GIT binary patch literal 350 zcmZ3^%ge<81V_|-(p#7q7#@Q-Fu)9DeAWOmrZc24q%h_%W}4R9cyu zS6HZ{b3P`|>V-oOfiMI1mq0FVY|9{>OV literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xsge_gui.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xsge_gui.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c8e51d0d6aa76f842536f0d475b48f91a6bcdb3 GIT binary patch literal 346 zcmZ3^%ge<81V_|-(!H4&7#@Q-Fu)9DeAWOmrZc24q%h_%GNoG#5UPgX?c5xBN?pv%Noy98|K7&mBmFaF3lb4tqQ&Ln~ znVMHvsGF0Tnw+6qlAoUwQ<{aC~xp zUP)1Al74YX3RplNMCu|rORu2v7l%!5eoARhs$CH%bU;2V)&&wDm>C%vKS(h!nqOcr cLq-ocq%Lqs&9J@5p?QTvvw;-^i#UKf07YMCssI20 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-yapf_third_party.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-yapf_third_party.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18ed18a71f1223b141119f5c1bc059ca60060910 GIT binary patch literal 363 zcmZ8d%}N6?5T5K>Sj2*O5$avs!)|X1B3?x(B6ur-kZ#g$Xm+zrvW30*7QTTZzJ?D_ z!PA}uPu>c>^<+{lh~NA$Gt7L<%u~0!3l6WxgUMb1@adB+!rx$Z;(`ZYz>tIj4H1F> zIAXyg0(f!ugJHnJJBW9_d>W(nAX8HE%o0W|C1WAEY4;mijfu^LW~8FpHaBtD9^N+B zrLoj?>$J8)nlx8xYP4UV?f7x?3@cB&F0amUNegUs-SBcYOC;x6o>-+Mp7U~!2V#Vc zuso?~Hl-78FsT}`r6(I=lBv>aG3p!3Hif?T$^YHbs#!-Dg<`ejm)ify-)d6lmLWoD d*#mU8fYZPF5%m^MkCL}2eUH-nju#!dk#9L#Yuf+- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-z3c.rml.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-z3c.rml.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ce011ecb8dab893d2558c3918d7572843565731 GIT binary patch literal 466 zcmYjMu}T9$5S_it#YBlh8bKQ?A;Mh(f`W*x3L=7F5e|;c?IbSQyGwTWf=T6H*jp%~ z|6t<>q?EK)b|+d{x#y`kyYrZN4DZd{)@t)$;%WV;_hVO9^AeN7%pHx|IX$s*bob55aAe$CqknbpHY2n=<=sHQ=e3skeJ#6cpppq++2 zsdtlDt7fYuk+KLqeW5371=rzPX+uZu2qkp|4>4B7#8NSFX7~+H>#lLC@HiAHLv`G+ zXUiw!!&qr*yrq|FE|hnkBz+~#nJ{zmWz-$K=SzO#{*E8h$k#F*V>}$X0x>*yb&?2w zgz?Bf;vHXcjqZSkecD6i2ZJ&Hl@Gp!gV3BId8er~`zD$>x|7Y&lacTS E0H||{(*OVf literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zeep.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zeep.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5be059f0227f7b458a5a9debb6d03ad3086048e5 GIT binary patch literal 332 zcmZ3^%ge<81V_|-(o>ii7#@Q-Fu)9DeAWOmrZc24q%h_%wAjQQi89swd`IY2u6_b~k8>LTA7+xSg4zmnwp%U zTaurj6H}I&R~F-wnG{o;S(2(-keHmEn4Vf36JJo72{S$(Y;b&XeqKpYW|Dq!NeWm% zA4KYc+@n`e`HRCQH$SB`C)KV96cixu6zc$q56p~=j2{#j7>zD47$Tzw9HJe(6Vfhn Q$X?-)ZD0k#A`YMi0HnZQRsaA1 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zmq.cpython-311.pyc b/venv/Lib/site-packages/_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zmq.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e2ccb5202b48b9e5f571215afcf3641a7fb73e3 GIT binary patch literal 1941 zcmbVMO>Epm6dpU?U9Xe<%U@|#6jPc)qGnT-3N=Y-QUypV6)5CVSwWW9Gud_OwKp?P zlU)UM4+x>E5<#le2q6)nkQU{VBNuLn^IF=&$|odF+*ZmhC*IiIkVO>&#&6!td-L9# zneV;vvs6k!(0;jer}zWRe&<4`#a~R0(jr1n5k?xq0v2sS6T(r{L>PPQp0cD#0$-D0 z9@ApwxE2rPn4Kugnk=9q(vr{>94`u5FX_dJqEJgA#OER+5|;M`gbtubEm}(=BGX@C zJ%-cW>-1+Ltb%{kcGI2N=@I2PZy%JKX?LaR29s47`i>A?QITGz!sC{>Od;|G3{EN#a4+Z}6r2 zC9$}KI(=-YW-5!WdtY5~sd~4neeiK!ov(T&*HH@wBN%j%U^&=wiY&A%6UK}ph^lQB zs6nf$MyLy}O3Cvo)02}M8yoo=sLE@3mlh|LKlqhD920_m)3t44dOBM#lwG`T6E-FW z0~XUGNoR&D?KbdTr_BsaZ zOr;9;>dkl5t5@?^@>hZ$5Ra8mn+H@_EuObs1CN_0Zvh~Xpz}&Q8V2?hUegx(H2#^e zC1A87el0#uETJ)h@|XN00$fChEA!Ji20+fsOI44Jh3RFGmp!^(CC=K~giVN9n($oL zUVcEF2g`S?!ZNcwGEo5#01>tfcd#7h82~-iOOS1*o36vroMavj6_cD#a0n{ZW95cz zG0$|%m7A15rWxq$RbX}0NG(M4{Q8%hJLeneODCEmFhI4~cplsKf4}vykf(hRU`(X^ ze-OwJCCW^6Z<+yZc$$#Sg2c`PgCk{UBHF#T{pQa6_Q;8X@>f1K6eM&VyQZ!OqRRrQ zXuE~r%-!nk4kRxMD8zyC^iZBB8Uq&epSI(O7#`*S(?Bj*jzM{$#&{92AXTz3CXQ9E zxYT1b!Hpy^F9iu~QJ%p-27Gnux?Uiyx|S2fD+YzNK;{Lb^I3-1jP6nliQ4p*WUrL{H`>9fhrUm9Z~?w|fLZXur}UNNvQKj0B~gNe0>qNJ)>^pC)TdGmw49qec$tYhnv1S*Hq{H;akn& zTlJ4xQZg#l!-p{Xsf8wRX`%ie_~y=SOHYzJ7ruStyUX8P-rYPr)z!jIYB4R5_6d_$$I5xMNWXav`Wp@*~R6c^8k08E> z4`3OXY4L;5UEF$2T)D@10H?96o!)*{A{V=F zvBnI?4Hk^RN7VfF;s~pjFv+u!Rm*M|we&Fxs^h2fP8v(IjO%`?@`73&ICa&T3&yw< zd7-p5AF%a1cGKG{B56*nUX@%fmvP2Th*+Nj_P*faztd+1U0Rp{Z

                                          # pre-release
+            [-_\.]?
+            (?Palpha|a|beta|b|preview|pre|c|rc)
+            [-_\.]?
+            (?P[0-9]+)?
+        )?
+        (?P                                         # post release
+            (?:-(?P[0-9]+))
+            |
+            (?:
+                [-_\.]?
+                (?Ppost|rev|r)
+                [-_\.]?
+                (?P[0-9]+)?
+            )
+        )?
+        (?P                                          # dev release
+            [-_\.]?
+            (?Pdev)
+            [-_\.]?
+            (?P[0-9]+)?
+        )?
+    )
+    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
+"""
+
+VERSION_PATTERN = _VERSION_PATTERN
+"""
+A string containing the regular expression used to match a valid version.
+
+The pattern is not anchored at either end, and is intended for embedding in larger
+expressions (for example, matching a version number as part of a file name). The
+regular expression should be compiled with the ``re.VERBOSE`` and ``re.IGNORECASE``
+flags set.
+
+:meta hide-value:
+"""
+
+
+class Version(_BaseVersion):
+    """This class abstracts handling of a project's versions.
+
+    A :class:`Version` instance is comparison aware and can be compared and
+    sorted using the standard Python interfaces.
+
+    >>> v1 = Version("1.0a5")
+    >>> v2 = Version("1.0")
+    >>> v1
+    
+    >>> v2
+    
+    >>> v1 < v2
+    True
+    >>> v1 == v2
+    False
+    >>> v1 > v2
+    False
+    >>> v1 >= v2
+    False
+    >>> v1 <= v2
+    True
+    """
+
+    _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
+    _key: CmpKey
+
+    def __init__(self, version: str) -> None:
+        """Initialize a Version object.
+
+        :param version:
+            The string representation of a version which will be parsed and normalized
+            before use.
+        :raises InvalidVersion:
+            If the ``version`` does not conform to PEP 440 in any way then this
+            exception will be raised.
+        """
+
+        # Validate the version and parse it into pieces
+        match = self._regex.search(version)
+        if not match:
+            raise InvalidVersion(f"Invalid version: {version!r}")
+
+        # Store the parsed out pieces of the version
+        self._version = _Version(
+            epoch=int(match.group("epoch")) if match.group("epoch") else 0,
+            release=tuple(int(i) for i in match.group("release").split(".")),
+            pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")),
+            post=_parse_letter_version(
+                match.group("post_l"), match.group("post_n1") or match.group("post_n2")
+            ),
+            dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")),
+            local=_parse_local_version(match.group("local")),
+        )
+
+        # Generate a key which will be used for sorting
+        self._key = _cmpkey(
+            self._version.epoch,
+            self._version.release,
+            self._version.pre,
+            self._version.post,
+            self._version.dev,
+            self._version.local,
+        )
+
+    def __repr__(self) -> str:
+        """A representation of the Version that shows all internal state.
+
+        >>> Version('1.0.0')
+        
+        """
+        return f""
+
+    def __str__(self) -> str:
+        """A string representation of the version that can be round-tripped.
+
+        >>> str(Version("1.0a5"))
+        '1.0a5'
+        """
+        parts = []
+
+        # Epoch
+        if self.epoch != 0:
+            parts.append(f"{self.epoch}!")
+
+        # Release segment
+        parts.append(".".join(str(x) for x in self.release))
+
+        # Pre-release
+        if self.pre is not None:
+            parts.append("".join(str(x) for x in self.pre))
+
+        # Post-release
+        if self.post is not None:
+            parts.append(f".post{self.post}")
+
+        # Development release
+        if self.dev is not None:
+            parts.append(f".dev{self.dev}")
+
+        # Local version segment
+        if self.local is not None:
+            parts.append(f"+{self.local}")
+
+        return "".join(parts)
+
+    @property
+    def epoch(self) -> int:
+        """The epoch of the version.
+
+        >>> Version("2.0.0").epoch
+        0
+        >>> Version("1!2.0.0").epoch
+        1
+        """
+        return self._version.epoch
+
+    @property
+    def release(self) -> tuple[int, ...]:
+        """The components of the "release" segment of the version.
+
+        >>> Version("1.2.3").release
+        (1, 2, 3)
+        >>> Version("2.0.0").release
+        (2, 0, 0)
+        >>> Version("1!2.0.0.post0").release
+        (2, 0, 0)
+
+        Includes trailing zeroes but not the epoch or any pre-release / development /
+        post-release suffixes.
+        """
+        return self._version.release
+
+    @property
+    def pre(self) -> tuple[str, int] | None:
+        """The pre-release segment of the version.
+
+        >>> print(Version("1.2.3").pre)
+        None
+        >>> Version("1.2.3a1").pre
+        ('a', 1)
+        >>> Version("1.2.3b1").pre
+        ('b', 1)
+        >>> Version("1.2.3rc1").pre
+        ('rc', 1)
+        """
+        return self._version.pre
+
+    @property
+    def post(self) -> int | None:
+        """The post-release number of the version.
+
+        >>> print(Version("1.2.3").post)
+        None
+        >>> Version("1.2.3.post1").post
+        1
+        """
+        return self._version.post[1] if self._version.post else None
+
+    @property
+    def dev(self) -> int | None:
+        """The development number of the version.
+
+        >>> print(Version("1.2.3").dev)
+        None
+        >>> Version("1.2.3.dev1").dev
+        1
+        """
+        return self._version.dev[1] if self._version.dev else None
+
+    @property
+    def local(self) -> str | None:
+        """The local version segment of the version.
+
+        >>> print(Version("1.2.3").local)
+        None
+        >>> Version("1.2.3+abc").local
+        'abc'
+        """
+        if self._version.local:
+            return ".".join(str(x) for x in self._version.local)
+        else:
+            return None
+
+    @property
+    def public(self) -> str:
+        """The public portion of the version.
+
+        >>> Version("1.2.3").public
+        '1.2.3'
+        >>> Version("1.2.3+abc").public
+        '1.2.3'
+        >>> Version("1!1.2.3dev1+abc").public
+        '1!1.2.3.dev1'
+        """
+        return str(self).split("+", 1)[0]
+
+    @property
+    def base_version(self) -> str:
+        """The "base version" of the version.
+
+        >>> Version("1.2.3").base_version
+        '1.2.3'
+        >>> Version("1.2.3+abc").base_version
+        '1.2.3'
+        >>> Version("1!1.2.3dev1+abc").base_version
+        '1!1.2.3'
+
+        The "base version" is the public version of the project without any pre or post
+        release markers.
+        """
+        parts = []
+
+        # Epoch
+        if self.epoch != 0:
+            parts.append(f"{self.epoch}!")
+
+        # Release segment
+        parts.append(".".join(str(x) for x in self.release))
+
+        return "".join(parts)
+
+    @property
+    def is_prerelease(self) -> bool:
+        """Whether this version is a pre-release.
+
+        >>> Version("1.2.3").is_prerelease
+        False
+        >>> Version("1.2.3a1").is_prerelease
+        True
+        >>> Version("1.2.3b1").is_prerelease
+        True
+        >>> Version("1.2.3rc1").is_prerelease
+        True
+        >>> Version("1.2.3dev1").is_prerelease
+        True
+        """
+        return self.dev is not None or self.pre is not None
+
+    @property
+    def is_postrelease(self) -> bool:
+        """Whether this version is a post-release.
+
+        >>> Version("1.2.3").is_postrelease
+        False
+        >>> Version("1.2.3.post1").is_postrelease
+        True
+        """
+        return self.post is not None
+
+    @property
+    def is_devrelease(self) -> bool:
+        """Whether this version is a development release.
+
+        >>> Version("1.2.3").is_devrelease
+        False
+        >>> Version("1.2.3.dev1").is_devrelease
+        True
+        """
+        return self.dev is not None
+
+    @property
+    def major(self) -> int:
+        """The first item of :attr:`release` or ``0`` if unavailable.
+
+        >>> Version("1.2.3").major
+        1
+        """
+        return self.release[0] if len(self.release) >= 1 else 0
+
+    @property
+    def minor(self) -> int:
+        """The second item of :attr:`release` or ``0`` if unavailable.
+
+        >>> Version("1.2.3").minor
+        2
+        >>> Version("1").minor
+        0
+        """
+        return self.release[1] if len(self.release) >= 2 else 0
+
+    @property
+    def micro(self) -> int:
+        """The third item of :attr:`release` or ``0`` if unavailable.
+
+        >>> Version("1.2.3").micro
+        3
+        >>> Version("1").micro
+        0
+        """
+        return self.release[2] if len(self.release) >= 3 else 0
+
+
+class _TrimmedRelease(Version):
+    @property
+    def release(self) -> tuple[int, ...]:
+        """
+        Release segment without any trailing zeros.
+
+        >>> _TrimmedRelease('1.0.0').release
+        (1,)
+        >>> _TrimmedRelease('0.0').release
+        (0,)
+        """
+        rel = super().release
+        nonzeros = (index for index, val in enumerate(rel) if val)
+        last_nonzero = max(nonzeros, default=0)
+        return rel[: last_nonzero + 1]
+
+
+def _parse_letter_version(
+    letter: str | None, number: str | bytes | SupportsInt | None
+) -> tuple[str, int] | None:
+    if letter:
+        # We consider there to be an implicit 0 in a pre-release if there is
+        # not a numeral associated with it.
+        if number is None:
+            number = 0
+
+        # We normalize any letters to their lower case form
+        letter = letter.lower()
+
+        # We consider some words to be alternate spellings of other words and
+        # in those cases we want to normalize the spellings to our preferred
+        # spelling.
+        if letter == "alpha":
+            letter = "a"
+        elif letter == "beta":
+            letter = "b"
+        elif letter in ["c", "pre", "preview"]:
+            letter = "rc"
+        elif letter in ["rev", "r"]:
+            letter = "post"
+
+        return letter, int(number)
+
+    assert not letter
+    if number:
+        # We assume if we are given a number, but we are not given a letter
+        # then this is using the implicit post release syntax (e.g. 1.0-1)
+        letter = "post"
+
+        return letter, int(number)
+
+    return None
+
+
+_local_version_separators = re.compile(r"[\._-]")
+
+
+def _parse_local_version(local: str | None) -> LocalType | None:
+    """
+    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
+    """
+    if local is not None:
+        return tuple(
+            part.lower() if not part.isdigit() else int(part)
+            for part in _local_version_separators.split(local)
+        )
+    return None
+
+
+def _cmpkey(
+    epoch: int,
+    release: tuple[int, ...],
+    pre: tuple[str, int] | None,
+    post: tuple[str, int] | None,
+    dev: tuple[str, int] | None,
+    local: LocalType | None,
+) -> CmpKey:
+    # When we compare a release version, we want to compare it with all of the
+    # trailing zeros removed. So we'll use a reverse the list, drop all the now
+    # leading zeros until we come to something non zero, then take the rest
+    # re-reverse it back into the correct order and make it a tuple and use
+    # that for our sorting key.
+    _release = tuple(
+        reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release))))
+    )
+
+    # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
+    # We'll do this by abusing the pre segment, but we _only_ want to do this
+    # if there is not a pre or a post segment. If we have one of those then
+    # the normal sorting rules will handle this case correctly.
+    if pre is None and post is None and dev is not None:
+        _pre: CmpPrePostDevType = NegativeInfinity
+    # Versions without a pre-release (except as noted above) should sort after
+    # those with one.
+    elif pre is None:
+        _pre = Infinity
+    else:
+        _pre = pre
+
+    # Versions without a post segment should sort before those with one.
+    if post is None:
+        _post: CmpPrePostDevType = NegativeInfinity
+
+    else:
+        _post = post
+
+    # Versions without a development segment should sort after those with one.
+    if dev is None:
+        _dev: CmpPrePostDevType = Infinity
+
+    else:
+        _dev = dev
+
+    if local is None:
+        # Versions without a local segment should sort before those with one.
+        _local: CmpLocalType = NegativeInfinity
+    else:
+        # Versions with a local segment need that segment parsed to implement
+        # the sorting rules in PEP440.
+        # - Alpha numeric segments sort before numeric segments
+        # - Alpha numeric segments sort lexicographically
+        # - Numeric segments sort numerically
+        # - Shorter versions sort before longer versions when the prefixes
+        #   match exactly
+        _local = tuple(
+            (i, "") if isinstance(i, int) else (NegativeInfinity, i) for i in local
+        )
+
+    return epoch, _release, _pre, _post, _dev, _local
diff --git a/venv/Lib/site-packages/pefile-2023.2.7.dist-info/INSTALLER b/venv/Lib/site-packages/pefile-2023.2.7.dist-info/INSTALLER
new file mode 100644
index 0000000..a1b589e
--- /dev/null
+++ b/venv/Lib/site-packages/pefile-2023.2.7.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/venv/Lib/site-packages/pefile-2023.2.7.dist-info/LICENSE b/venv/Lib/site-packages/pefile-2023.2.7.dist-info/LICENSE
new file mode 100644
index 0000000..ddd7342
--- /dev/null
+++ b/venv/Lib/site-packages/pefile-2023.2.7.dist-info/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2004-2023 Ero Carrera
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/venv/Lib/site-packages/pefile-2023.2.7.dist-info/METADATA b/venv/Lib/site-packages/pefile-2023.2.7.dist-info/METADATA
new file mode 100644
index 0000000..fefd6a3
--- /dev/null
+++ b/venv/Lib/site-packages/pefile-2023.2.7.dist-info/METADATA
@@ -0,0 +1,34 @@
+Metadata-Version: 2.1
+Name: pefile
+Version: 2023.2.7
+Summary: Python PE parsing module
+Home-page: https://github.com/erocarrera/pefile
+Download-URL: https://github.com/erocarrera/pefile/releases/download/v2023.2.7/pefile-2023.2.7.tar.gz
+Author: Ero Carrera
+Author-email: ero.carrera@gmail.com
+License: MIT
+Keywords: pe,exe,dll,pefile,pecoff
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Science/Research
+Classifier: Natural Language :: English
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Requires-Python: >=3.6.0
+License-File: LICENSE
+
+pefile, Portable Executable reader module
+
+All the PE file basic structures are available with their default names as
+attributes of the instance returned.
+
+Processed elements such as the import table are made available with lowercase
+names, to differentiate them from the upper case basic structure names.
+
+pefile has been tested against many edge cases such as corrupted and malformed
+PEs as well as malware, which often attempts to abuse the format way beyond its
+standard use. To the best of my knowledge most of the abuse is handled
+gracefully.
+
+Copyright (c) 2005-2023 Ero Carrera 
diff --git a/venv/Lib/site-packages/pefile-2023.2.7.dist-info/RECORD b/venv/Lib/site-packages/pefile-2023.2.7.dist-info/RECORD
new file mode 100644
index 0000000..acc4d8e
--- /dev/null
+++ b/venv/Lib/site-packages/pefile-2023.2.7.dist-info/RECORD
@@ -0,0 +1,16 @@
+__pycache__/pefile.cpython-311.pyc,,
+__pycache__/peutils.cpython-311.pyc,,
+ordlookup/__init__.py,sha256=qV325Dvqk9HYGlF2BXkjSAU8NiAqGk9wg6bcGA7DMCY,784
+ordlookup/__pycache__/__init__.cpython-311.pyc,,
+ordlookup/__pycache__/oleaut32.cpython-311.pyc,,
+ordlookup/__pycache__/ws2_32.cpython-311.pyc,,
+ordlookup/oleaut32.py,sha256=g0bNcHLRuH_nW75xqZbtZZNWTrOVBbdEV8W7vxz0Ouc,10877
+ordlookup/ws2_32.py,sha256=gy-Vnrt6yVmzN8sbqLQESaNwFnZ2ojh4LsiAq5IDruA,3265
+pefile-2023.2.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+pefile-2023.2.7.dist-info/LICENSE,sha256=v9S15PipnJYf1vlNcI44OWzBRr_o-8XSqG5jqin7Qgg,1083
+pefile-2023.2.7.dist-info/METADATA,sha256=Nj9cLDBVi_AkWhZ26GqGr5QYbkgh4f6azj7_HX75EgQ,1352
+pefile-2023.2.7.dist-info/RECORD,,
+pefile-2023.2.7.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
+pefile-2023.2.7.dist-info/top_level.txt,sha256=e_EleSuZUOQKcXHJLs2sSeGkxG4OZghULcCc_v6kQbo,25
+pefile.py,sha256=-ZRoz-0ZMOjpA2pL9Py5sjrLKMTlQh4hXONSpczcgR8,292005
+peutils.py,sha256=KmQ2JO3osgXgugJRGM__CdwNVcM3X6xzhuHucI_5v0g,18361
diff --git a/venv/Lib/site-packages/pefile-2023.2.7.dist-info/WHEEL b/venv/Lib/site-packages/pefile-2023.2.7.dist-info/WHEEL
new file mode 100644
index 0000000..becc9a6
--- /dev/null
+++ b/venv/Lib/site-packages/pefile-2023.2.7.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.37.1)
+Root-Is-Purelib: true
+Tag: py3-none-any
+
diff --git a/venv/Lib/site-packages/pefile-2023.2.7.dist-info/top_level.txt b/venv/Lib/site-packages/pefile-2023.2.7.dist-info/top_level.txt
new file mode 100644
index 0000000..a9ab08d
--- /dev/null
+++ b/venv/Lib/site-packages/pefile-2023.2.7.dist-info/top_level.txt
@@ -0,0 +1,3 @@
+ordlookup
+pefile
+peutils
diff --git a/venv/Lib/site-packages/pefile.py b/venv/Lib/site-packages/pefile.py
new file mode 100644
index 0000000..f3052aa
--- /dev/null
+++ b/venv/Lib/site-packages/pefile.py
@@ -0,0 +1,7853 @@
+#!/usr/bin/python
+
+"""pefile, Portable Executable reader module
+
+All the PE file basic structures are available with their default names as
+attributes of the instance returned.
+
+Processed elements such as the import table are made available with lowercase
+names, to differentiate them from the upper case basic structure names.
+
+pefile has been tested against many edge cases such as corrupted and malformed
+PEs as well as malware, which often attempts to abuse the format way beyond its
+standard use. To the best of my knowledge most of the abuse is handled
+gracefully.
+
+Copyright (c) 2005-2023 Ero Carrera 
+"""
+
+__author__ = "Ero Carrera"
+__version__ = "2023.2.7"
+__contact__ = "ero.carrera@gmail.com"
+
+import collections
+import os
+import struct
+import codecs
+import time
+import math
+import string
+import mmap
+import uuid
+
+from collections import Counter
+from typing import Union
+from hashlib import sha1
+from hashlib import sha256
+from hashlib import sha512
+from hashlib import md5
+
+import functools
+import copy as copymod
+
+import ordlookup
+
+codecs.register_error("backslashreplace_", codecs.lookup_error("backslashreplace"))
+
+long = int
+# lru_cache with a shallow copy of the objects returned (list, dicts, ..)
+# we don't use deepcopy as it's _really_ slow and the data we retrieved using
+# this is enough with copy.copy taken from
+# https://stackoverflow.com/questions/54909357
+def lru_cache(maxsize=128, typed=False, copy=False):
+    if not copy:
+        return functools.lru_cache(maxsize, typed)
+
+    def decorator(f):
+        cached_func = functools.lru_cache(maxsize, typed)(f)
+
+        @functools.wraps(f)
+        def wrapper(*args, **kwargs):
+            # return copymod.deepcopy(cached_func(*args, **kwargs))
+            return copymod.copy(cached_func(*args, **kwargs))
+
+        return wrapper
+
+    return decorator
+
+
+@lru_cache(maxsize=2048)
+def cache_adjust_FileAlignment(val, file_alignment):
+    if file_alignment < FILE_ALIGNMENT_HARDCODED_VALUE:
+        return val
+    return (int(val / 0x200)) * 0x200
+
+
+@lru_cache(maxsize=2048)
+def cache_adjust_SectionAlignment(val, section_alignment, file_alignment):
+    if section_alignment < 0x1000:  # page size
+        section_alignment = file_alignment
+
+    # 0x200 is the minimum valid FileAlignment according to the documentation
+    # although ntoskrnl.exe has an alignment of 0x80 in some Windows versions
+    #
+    # elif section_alignment < 0x80:
+    #    section_alignment = 0x80
+
+    if section_alignment and val % section_alignment:
+        return section_alignment * (int(val / section_alignment))
+    return val
+
+
+def count_zeroes(data):
+    return data.count(0)
+
+
+fast_load = False
+
+# This will set a maximum length of a string to be retrieved from the file.
+# It's there to prevent loading massive amounts of data from memory mapped
+# files. Strings longer than 1MB should be rather rare.
+MAX_STRING_LENGTH = 0x100000  # 2^20
+
+# Maximum number of imports to parse.
+MAX_IMPORT_SYMBOLS = 0x2000
+
+# Limit maximum length for specific string types separately
+MAX_IMPORT_NAME_LENGTH = 0x200
+MAX_DLL_LENGTH = 0x200
+MAX_SYMBOL_NAME_LENGTH = 0x200
+
+# Limit maximum number of sections before processing of sections will stop
+MAX_SECTIONS = 0x800
+
+# The global maximum number of resource entries to parse per file
+MAX_RESOURCE_ENTRIES = 0x8000
+
+# The maximum depth of nested resource tables
+MAX_RESOURCE_DEPTH = 32
+
+# Limit number of exported symbols
+MAX_SYMBOL_EXPORT_COUNT = 0x2000
+
+IMAGE_DOS_SIGNATURE = 0x5A4D
+IMAGE_DOSZM_SIGNATURE = 0x4D5A
+IMAGE_NE_SIGNATURE = 0x454E
+IMAGE_LE_SIGNATURE = 0x454C
+IMAGE_LX_SIGNATURE = 0x584C
+IMAGE_TE_SIGNATURE = 0x5A56  # Terse Executables have a 'VZ' signature
+
+IMAGE_NT_SIGNATURE = 0x00004550
+IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16
+IMAGE_ORDINAL_FLAG = 0x80000000
+IMAGE_ORDINAL_FLAG64 = 0x8000000000000000
+OPTIONAL_HEADER_MAGIC_PE = 0x10B
+OPTIONAL_HEADER_MAGIC_PE_PLUS = 0x20B
+
+
+def two_way_dict(pairs):
+    return dict([(e[1], e[0]) for e in pairs] + pairs)
+
+
+directory_entry_types = [
+    ("IMAGE_DIRECTORY_ENTRY_EXPORT", 0),
+    ("IMAGE_DIRECTORY_ENTRY_IMPORT", 1),
+    ("IMAGE_DIRECTORY_ENTRY_RESOURCE", 2),
+    ("IMAGE_DIRECTORY_ENTRY_EXCEPTION", 3),
+    ("IMAGE_DIRECTORY_ENTRY_SECURITY", 4),
+    ("IMAGE_DIRECTORY_ENTRY_BASERELOC", 5),
+    ("IMAGE_DIRECTORY_ENTRY_DEBUG", 6),
+    # Architecture on non-x86 platforms
+    ("IMAGE_DIRECTORY_ENTRY_COPYRIGHT", 7),
+    ("IMAGE_DIRECTORY_ENTRY_GLOBALPTR", 8),
+    ("IMAGE_DIRECTORY_ENTRY_TLS", 9),
+    ("IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG", 10),
+    ("IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT", 11),
+    ("IMAGE_DIRECTORY_ENTRY_IAT", 12),
+    ("IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT", 13),
+    ("IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR", 14),
+    ("IMAGE_DIRECTORY_ENTRY_RESERVED", 15),
+]
+
+DIRECTORY_ENTRY = two_way_dict(directory_entry_types)
+
+image_characteristics = [
+    ("IMAGE_FILE_RELOCS_STRIPPED", 0x0001),
+    ("IMAGE_FILE_EXECUTABLE_IMAGE", 0x0002),
+    ("IMAGE_FILE_LINE_NUMS_STRIPPED", 0x0004),
+    ("IMAGE_FILE_LOCAL_SYMS_STRIPPED", 0x0008),
+    ("IMAGE_FILE_AGGRESIVE_WS_TRIM", 0x0010),
+    ("IMAGE_FILE_LARGE_ADDRESS_AWARE", 0x0020),
+    ("IMAGE_FILE_16BIT_MACHINE", 0x0040),
+    ("IMAGE_FILE_BYTES_REVERSED_LO", 0x0080),
+    ("IMAGE_FILE_32BIT_MACHINE", 0x0100),
+    ("IMAGE_FILE_DEBUG_STRIPPED", 0x0200),
+    ("IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP", 0x0400),
+    ("IMAGE_FILE_NET_RUN_FROM_SWAP", 0x0800),
+    ("IMAGE_FILE_SYSTEM", 0x1000),
+    ("IMAGE_FILE_DLL", 0x2000),
+    ("IMAGE_FILE_UP_SYSTEM_ONLY", 0x4000),
+    ("IMAGE_FILE_BYTES_REVERSED_HI", 0x8000),
+]
+
+IMAGE_CHARACTERISTICS = two_way_dict(image_characteristics)
+
+
+section_characteristics = [
+    ("IMAGE_SCN_TYPE_REG", 0x00000000),  # reserved
+    ("IMAGE_SCN_TYPE_DSECT", 0x00000001),  # reserved
+    ("IMAGE_SCN_TYPE_NOLOAD", 0x00000002),  # reserved
+    ("IMAGE_SCN_TYPE_GROUP", 0x00000004),  # reserved
+    ("IMAGE_SCN_TYPE_NO_PAD", 0x00000008),  # reserved
+    ("IMAGE_SCN_TYPE_COPY", 0x00000010),  # reserved
+    ("IMAGE_SCN_CNT_CODE", 0x00000020),
+    ("IMAGE_SCN_CNT_INITIALIZED_DATA", 0x00000040),
+    ("IMAGE_SCN_CNT_UNINITIALIZED_DATA", 0x00000080),
+    ("IMAGE_SCN_LNK_OTHER", 0x00000100),
+    ("IMAGE_SCN_LNK_INFO", 0x00000200),
+    ("IMAGE_SCN_LNK_OVER", 0x00000400),  # reserved
+    ("IMAGE_SCN_LNK_REMOVE", 0x00000800),
+    ("IMAGE_SCN_LNK_COMDAT", 0x00001000),
+    ("IMAGE_SCN_MEM_PROTECTED", 0x00004000),  # obsolete
+    ("IMAGE_SCN_NO_DEFER_SPEC_EXC", 0x00004000),
+    ("IMAGE_SCN_GPREL", 0x00008000),
+    ("IMAGE_SCN_MEM_FARDATA", 0x00008000),
+    ("IMAGE_SCN_MEM_SYSHEAP", 0x00010000),  # obsolete
+    ("IMAGE_SCN_MEM_PURGEABLE", 0x00020000),
+    ("IMAGE_SCN_MEM_16BIT", 0x00020000),
+    ("IMAGE_SCN_MEM_LOCKED", 0x00040000),
+    ("IMAGE_SCN_MEM_PRELOAD", 0x00080000),
+    ("IMAGE_SCN_ALIGN_1BYTES", 0x00100000),
+    ("IMAGE_SCN_ALIGN_2BYTES", 0x00200000),
+    ("IMAGE_SCN_ALIGN_4BYTES", 0x00300000),
+    ("IMAGE_SCN_ALIGN_8BYTES", 0x00400000),
+    ("IMAGE_SCN_ALIGN_16BYTES", 0x00500000),  # default alignment
+    ("IMAGE_SCN_ALIGN_32BYTES", 0x00600000),
+    ("IMAGE_SCN_ALIGN_64BYTES", 0x00700000),
+    ("IMAGE_SCN_ALIGN_128BYTES", 0x00800000),
+    ("IMAGE_SCN_ALIGN_256BYTES", 0x00900000),
+    ("IMAGE_SCN_ALIGN_512BYTES", 0x00A00000),
+    ("IMAGE_SCN_ALIGN_1024BYTES", 0x00B00000),
+    ("IMAGE_SCN_ALIGN_2048BYTES", 0x00C00000),
+    ("IMAGE_SCN_ALIGN_4096BYTES", 0x00D00000),
+    ("IMAGE_SCN_ALIGN_8192BYTES", 0x00E00000),
+    ("IMAGE_SCN_ALIGN_MASK", 0x00F00000),
+    ("IMAGE_SCN_LNK_NRELOC_OVFL", 0x01000000),
+    ("IMAGE_SCN_MEM_DISCARDABLE", 0x02000000),
+    ("IMAGE_SCN_MEM_NOT_CACHED", 0x04000000),
+    ("IMAGE_SCN_MEM_NOT_PAGED", 0x08000000),
+    ("IMAGE_SCN_MEM_SHARED", 0x10000000),
+    ("IMAGE_SCN_MEM_EXECUTE", 0x20000000),
+    ("IMAGE_SCN_MEM_READ", 0x40000000),
+    ("IMAGE_SCN_MEM_WRITE", 0x80000000),
+]
+
+SECTION_CHARACTERISTICS = two_way_dict(section_characteristics)
+
+
+debug_types = [
+    ("IMAGE_DEBUG_TYPE_UNKNOWN", 0),
+    ("IMAGE_DEBUG_TYPE_COFF", 1),
+    ("IMAGE_DEBUG_TYPE_CODEVIEW", 2),
+    ("IMAGE_DEBUG_TYPE_FPO", 3),
+    ("IMAGE_DEBUG_TYPE_MISC", 4),
+    ("IMAGE_DEBUG_TYPE_EXCEPTION", 5),
+    ("IMAGE_DEBUG_TYPE_FIXUP", 6),
+    ("IMAGE_DEBUG_TYPE_OMAP_TO_SRC", 7),
+    ("IMAGE_DEBUG_TYPE_OMAP_FROM_SRC", 8),
+    ("IMAGE_DEBUG_TYPE_BORLAND", 9),
+    ("IMAGE_DEBUG_TYPE_RESERVED10", 10),
+    ("IMAGE_DEBUG_TYPE_CLSID", 11),
+    ("IMAGE_DEBUG_TYPE_VC_FEATURE", 12),
+    ("IMAGE_DEBUG_TYPE_POGO", 13),
+    ("IMAGE_DEBUG_TYPE_ILTCG", 14),
+    ("IMAGE_DEBUG_TYPE_MPX", 15),
+    ("IMAGE_DEBUG_TYPE_REPRO", 16),
+    ("IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS", 20),
+]
+
+DEBUG_TYPE = two_way_dict(debug_types)
+
+
+subsystem_types = [
+    ("IMAGE_SUBSYSTEM_UNKNOWN", 0),
+    ("IMAGE_SUBSYSTEM_NATIVE", 1),
+    ("IMAGE_SUBSYSTEM_WINDOWS_GUI", 2),
+    ("IMAGE_SUBSYSTEM_WINDOWS_CUI", 3),
+    ("IMAGE_SUBSYSTEM_OS2_CUI", 5),
+    ("IMAGE_SUBSYSTEM_POSIX_CUI", 7),
+    ("IMAGE_SUBSYSTEM_NATIVE_WINDOWS", 8),
+    ("IMAGE_SUBSYSTEM_WINDOWS_CE_GUI", 9),
+    ("IMAGE_SUBSYSTEM_EFI_APPLICATION", 10),
+    ("IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER", 11),
+    ("IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER", 12),
+    ("IMAGE_SUBSYSTEM_EFI_ROM", 13),
+    ("IMAGE_SUBSYSTEM_XBOX", 14),
+    ("IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION", 16),
+]
+
+SUBSYSTEM_TYPE = two_way_dict(subsystem_types)
+
+
+machine_types = [
+    ("IMAGE_FILE_MACHINE_UNKNOWN", 0x0),
+    ("IMAGE_FILE_MACHINE_I386", 0x014C),
+    ("IMAGE_FILE_MACHINE_R3000", 0x0162),
+    ("IMAGE_FILE_MACHINE_R4000", 0x0166),
+    ("IMAGE_FILE_MACHINE_R10000", 0x0168),
+    ("IMAGE_FILE_MACHINE_WCEMIPSV2", 0x0169),
+    ("IMAGE_FILE_MACHINE_ALPHA", 0x0184),
+    ("IMAGE_FILE_MACHINE_SH3", 0x01A2),
+    ("IMAGE_FILE_MACHINE_SH3DSP", 0x01A3),
+    ("IMAGE_FILE_MACHINE_SH3E", 0x01A4),
+    ("IMAGE_FILE_MACHINE_SH4", 0x01A6),
+    ("IMAGE_FILE_MACHINE_SH5", 0x01A8),
+    ("IMAGE_FILE_MACHINE_ARM", 0x01C0),
+    ("IMAGE_FILE_MACHINE_THUMB", 0x01C2),
+    ("IMAGE_FILE_MACHINE_ARMNT", 0x01C4),
+    ("IMAGE_FILE_MACHINE_AM33", 0x01D3),
+    ("IMAGE_FILE_MACHINE_POWERPC", 0x01F0),
+    ("IMAGE_FILE_MACHINE_POWERPCFP", 0x01F1),
+    ("IMAGE_FILE_MACHINE_IA64", 0x0200),
+    ("IMAGE_FILE_MACHINE_MIPS16", 0x0266),
+    ("IMAGE_FILE_MACHINE_ALPHA64", 0x0284),
+    ("IMAGE_FILE_MACHINE_AXP64", 0x0284),  # same
+    ("IMAGE_FILE_MACHINE_MIPSFPU", 0x0366),
+    ("IMAGE_FILE_MACHINE_MIPSFPU16", 0x0466),
+    ("IMAGE_FILE_MACHINE_TRICORE", 0x0520),
+    ("IMAGE_FILE_MACHINE_CEF", 0x0CEF),
+    ("IMAGE_FILE_MACHINE_EBC", 0x0EBC),
+    ("IMAGE_FILE_MACHINE_RISCV32", 0x5032),
+    ("IMAGE_FILE_MACHINE_RISCV64", 0x5064),
+    ("IMAGE_FILE_MACHINE_RISCV128", 0x5128),
+    ("IMAGE_FILE_MACHINE_LOONGARCH32", 0x6232),
+    ("IMAGE_FILE_MACHINE_LOONGARCH64", 0x6264),
+    ("IMAGE_FILE_MACHINE_AMD64", 0x8664),
+    ("IMAGE_FILE_MACHINE_M32R", 0x9041),
+    ("IMAGE_FILE_MACHINE_ARM64", 0xAA64),
+    ("IMAGE_FILE_MACHINE_CEE", 0xC0EE),
+]
+
+MACHINE_TYPE = two_way_dict(machine_types)
+
+
+relocation_types = [
+    ("IMAGE_REL_BASED_ABSOLUTE", 0),
+    ("IMAGE_REL_BASED_HIGH", 1),
+    ("IMAGE_REL_BASED_LOW", 2),
+    ("IMAGE_REL_BASED_HIGHLOW", 3),
+    ("IMAGE_REL_BASED_HIGHADJ", 4),
+    ("IMAGE_REL_BASED_MIPS_JMPADDR", 5),
+    ("IMAGE_REL_BASED_SECTION", 6),
+    ("IMAGE_REL_BASED_REL", 7),
+    ("IMAGE_REL_BASED_MIPS_JMPADDR16", 9),
+    ("IMAGE_REL_BASED_IA64_IMM64", 9),
+    ("IMAGE_REL_BASED_DIR64", 10),
+    ("IMAGE_REL_BASED_HIGH3ADJ", 11),
+]
+
+RELOCATION_TYPE = two_way_dict(relocation_types)
+
+
+dll_characteristics = [
+    ("IMAGE_LIBRARY_PROCESS_INIT", 0x0001),  # reserved
+    ("IMAGE_LIBRARY_PROCESS_TERM", 0x0002),  # reserved
+    ("IMAGE_LIBRARY_THREAD_INIT", 0x0004),  # reserved
+    ("IMAGE_LIBRARY_THREAD_TERM", 0x0008),  # reserved
+    ("IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA", 0x0020),
+    ("IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE", 0x0040),
+    ("IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY", 0x0080),
+    ("IMAGE_DLLCHARACTERISTICS_NX_COMPAT", 0x0100),
+    ("IMAGE_DLLCHARACTERISTICS_NO_ISOLATION", 0x0200),
+    ("IMAGE_DLLCHARACTERISTICS_NO_SEH", 0x0400),
+    ("IMAGE_DLLCHARACTERISTICS_NO_BIND", 0x0800),
+    ("IMAGE_DLLCHARACTERISTICS_APPCONTAINER", 0x1000),
+    ("IMAGE_DLLCHARACTERISTICS_WDM_DRIVER", 0x2000),
+    ("IMAGE_DLLCHARACTERISTICS_GUARD_CF", 0x4000),
+    ("IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE", 0x8000),
+]
+
+DLL_CHARACTERISTICS = two_way_dict(dll_characteristics)
+
+FILE_ALIGNMENT_HARDCODED_VALUE = 0x200
+
+
+# Unwind info-related enums
+
+unwind_info_flags = [
+    ("UNW_FLAG_EHANDLER", 0x01),
+    ("UNW_FLAG_UHANDLER", 0x02),
+    ("UNW_FLAG_CHAININFO", 0x04),
+]
+
+UNWIND_INFO_FLAGS = two_way_dict(unwind_info_flags)
+
+registers = [
+    ("RAX", 0),
+    ("RCX", 1),
+    ("RDX", 2),
+    ("RBX", 3),
+    ("RSP", 4),
+    ("RBP", 5),
+    ("RSI", 6),
+    ("RDI", 7),
+    ("R8", 8),
+    ("R9", 9),
+    ("R10", 10),
+    ("R11", 11),
+    ("R12", 12),
+    ("R13", 13),
+    ("R14", 14),
+    ("R15", 15),
+]
+
+REGISTERS = two_way_dict(registers)
+
+# enum _UNWIND_OP_CODES
+UWOP_PUSH_NONVOL = 0
+UWOP_ALLOC_LARGE = 1
+UWOP_ALLOC_SMALL = 2
+UWOP_SET_FPREG = 3
+UWOP_SAVE_NONVOL = 4
+UWOP_SAVE_NONVOL_FAR = 5
+UWOP_EPILOG = 6
+UWOP_SAVE_XMM128 = 8
+UWOP_SAVE_XMM128_FAR = 9
+UWOP_PUSH_MACHFRAME = 10
+
+
+# Resource types
+resource_type = [
+    ("RT_CURSOR", 1),
+    ("RT_BITMAP", 2),
+    ("RT_ICON", 3),
+    ("RT_MENU", 4),
+    ("RT_DIALOG", 5),
+    ("RT_STRING", 6),
+    ("RT_FONTDIR", 7),
+    ("RT_FONT", 8),
+    ("RT_ACCELERATOR", 9),
+    ("RT_RCDATA", 10),
+    ("RT_MESSAGETABLE", 11),
+    ("RT_GROUP_CURSOR", 12),
+    ("RT_GROUP_ICON", 14),
+    ("RT_VERSION", 16),
+    ("RT_DLGINCLUDE", 17),
+    ("RT_PLUGPLAY", 19),
+    ("RT_VXD", 20),
+    ("RT_ANICURSOR", 21),
+    ("RT_ANIICON", 22),
+    ("RT_HTML", 23),
+    ("RT_MANIFEST", 24),
+]
+
+RESOURCE_TYPE = two_way_dict(resource_type)
+
+
+# Language definitions
+lang = [
+    ("LANG_NEUTRAL", 0x00),
+    ("LANG_INVARIANT", 0x7F),
+    ("LANG_AFRIKAANS", 0x36),
+    ("LANG_ALBANIAN", 0x1C),
+    ("LANG_ARABIC", 0x01),
+    ("LANG_ARMENIAN", 0x2B),
+    ("LANG_ASSAMESE", 0x4D),
+    ("LANG_AZERI", 0x2C),
+    ("LANG_BASQUE", 0x2D),
+    ("LANG_BELARUSIAN", 0x23),
+    ("LANG_BENGALI", 0x45),
+    ("LANG_BULGARIAN", 0x02),
+    ("LANG_CATALAN", 0x03),
+    ("LANG_CHINESE", 0x04),
+    ("LANG_CROATIAN", 0x1A),
+    ("LANG_CZECH", 0x05),
+    ("LANG_DANISH", 0x06),
+    ("LANG_DIVEHI", 0x65),
+    ("LANG_DUTCH", 0x13),
+    ("LANG_ENGLISH", 0x09),
+    ("LANG_ESTONIAN", 0x25),
+    ("LANG_FAEROESE", 0x38),
+    ("LANG_FARSI", 0x29),
+    ("LANG_FINNISH", 0x0B),
+    ("LANG_FRENCH", 0x0C),
+    ("LANG_GALICIAN", 0x56),
+    ("LANG_GEORGIAN", 0x37),
+    ("LANG_GERMAN", 0x07),
+    ("LANG_GREEK", 0x08),
+    ("LANG_GUJARATI", 0x47),
+    ("LANG_HEBREW", 0x0D),
+    ("LANG_HINDI", 0x39),
+    ("LANG_HUNGARIAN", 0x0E),
+    ("LANG_ICELANDIC", 0x0F),
+    ("LANG_INDONESIAN", 0x21),
+    ("LANG_ITALIAN", 0x10),
+    ("LANG_JAPANESE", 0x11),
+    ("LANG_KANNADA", 0x4B),
+    ("LANG_KASHMIRI", 0x60),
+    ("LANG_KAZAK", 0x3F),
+    ("LANG_KONKANI", 0x57),
+    ("LANG_KOREAN", 0x12),
+    ("LANG_KYRGYZ", 0x40),
+    ("LANG_LATVIAN", 0x26),
+    ("LANG_LITHUANIAN", 0x27),
+    ("LANG_MACEDONIAN", 0x2F),
+    ("LANG_MALAY", 0x3E),
+    ("LANG_MALAYALAM", 0x4C),
+    ("LANG_MANIPURI", 0x58),
+    ("LANG_MARATHI", 0x4E),
+    ("LANG_MONGOLIAN", 0x50),
+    ("LANG_NEPALI", 0x61),
+    ("LANG_NORWEGIAN", 0x14),
+    ("LANG_ORIYA", 0x48),
+    ("LANG_POLISH", 0x15),
+    ("LANG_PORTUGUESE", 0x16),
+    ("LANG_PUNJABI", 0x46),
+    ("LANG_ROMANIAN", 0x18),
+    ("LANG_RUSSIAN", 0x19),
+    ("LANG_SANSKRIT", 0x4F),
+    ("LANG_SERBIAN", 0x1A),
+    ("LANG_SINDHI", 0x59),
+    ("LANG_SLOVAK", 0x1B),
+    ("LANG_SLOVENIAN", 0x24),
+    ("LANG_SPANISH", 0x0A),
+    ("LANG_SWAHILI", 0x41),
+    ("LANG_SWEDISH", 0x1D),
+    ("LANG_SYRIAC", 0x5A),
+    ("LANG_TAMIL", 0x49),
+    ("LANG_TATAR", 0x44),
+    ("LANG_TELUGU", 0x4A),
+    ("LANG_THAI", 0x1E),
+    ("LANG_TURKISH", 0x1F),
+    ("LANG_UKRAINIAN", 0x22),
+    ("LANG_URDU", 0x20),
+    ("LANG_UZBEK", 0x43),
+    ("LANG_VIETNAMESE", 0x2A),
+    ("LANG_GAELIC", 0x3C),
+    ("LANG_MALTESE", 0x3A),
+    ("LANG_MAORI", 0x28),
+    ("LANG_RHAETO_ROMANCE", 0x17),
+    ("LANG_SAAMI", 0x3B),
+    ("LANG_SORBIAN", 0x2E),
+    ("LANG_SUTU", 0x30),
+    ("LANG_TSONGA", 0x31),
+    ("LANG_TSWANA", 0x32),
+    ("LANG_VENDA", 0x33),
+    ("LANG_XHOSA", 0x34),
+    ("LANG_ZULU", 0x35),
+    ("LANG_ESPERANTO", 0x8F),
+    ("LANG_WALON", 0x90),
+    ("LANG_CORNISH", 0x91),
+    ("LANG_WELSH", 0x92),
+    ("LANG_BRETON", 0x93),
+]
+
+LANG = two_way_dict(lang)
+
+
+# Sublanguage definitions
+sublang = [
+    ("SUBLANG_NEUTRAL", 0x00),
+    ("SUBLANG_DEFAULT", 0x01),
+    ("SUBLANG_SYS_DEFAULT", 0x02),
+    ("SUBLANG_ARABIC_SAUDI_ARABIA", 0x01),
+    ("SUBLANG_ARABIC_IRAQ", 0x02),
+    ("SUBLANG_ARABIC_EGYPT", 0x03),
+    ("SUBLANG_ARABIC_LIBYA", 0x04),
+    ("SUBLANG_ARABIC_ALGERIA", 0x05),
+    ("SUBLANG_ARABIC_MOROCCO", 0x06),
+    ("SUBLANG_ARABIC_TUNISIA", 0x07),
+    ("SUBLANG_ARABIC_OMAN", 0x08),
+    ("SUBLANG_ARABIC_YEMEN", 0x09),
+    ("SUBLANG_ARABIC_SYRIA", 0x0A),
+    ("SUBLANG_ARABIC_JORDAN", 0x0B),
+    ("SUBLANG_ARABIC_LEBANON", 0x0C),
+    ("SUBLANG_ARABIC_KUWAIT", 0x0D),
+    ("SUBLANG_ARABIC_UAE", 0x0E),
+    ("SUBLANG_ARABIC_BAHRAIN", 0x0F),
+    ("SUBLANG_ARABIC_QATAR", 0x10),
+    ("SUBLANG_AZERI_LATIN", 0x01),
+    ("SUBLANG_AZERI_CYRILLIC", 0x02),
+    ("SUBLANG_CHINESE_TRADITIONAL", 0x01),
+    ("SUBLANG_CHINESE_SIMPLIFIED", 0x02),
+    ("SUBLANG_CHINESE_HONGKONG", 0x03),
+    ("SUBLANG_CHINESE_SINGAPORE", 0x04),
+    ("SUBLANG_CHINESE_MACAU", 0x05),
+    ("SUBLANG_DUTCH", 0x01),
+    ("SUBLANG_DUTCH_BELGIAN", 0x02),
+    ("SUBLANG_ENGLISH_US", 0x01),
+    ("SUBLANG_ENGLISH_UK", 0x02),
+    ("SUBLANG_ENGLISH_AUS", 0x03),
+    ("SUBLANG_ENGLISH_CAN", 0x04),
+    ("SUBLANG_ENGLISH_NZ", 0x05),
+    ("SUBLANG_ENGLISH_EIRE", 0x06),
+    ("SUBLANG_ENGLISH_SOUTH_AFRICA", 0x07),
+    ("SUBLANG_ENGLISH_JAMAICA", 0x08),
+    ("SUBLANG_ENGLISH_CARIBBEAN", 0x09),
+    ("SUBLANG_ENGLISH_BELIZE", 0x0A),
+    ("SUBLANG_ENGLISH_TRINIDAD", 0x0B),
+    ("SUBLANG_ENGLISH_ZIMBABWE", 0x0C),
+    ("SUBLANG_ENGLISH_PHILIPPINES", 0x0D),
+    ("SUBLANG_FRENCH", 0x01),
+    ("SUBLANG_FRENCH_BELGIAN", 0x02),
+    ("SUBLANG_FRENCH_CANADIAN", 0x03),
+    ("SUBLANG_FRENCH_SWISS", 0x04),
+    ("SUBLANG_FRENCH_LUXEMBOURG", 0x05),
+    ("SUBLANG_FRENCH_MONACO", 0x06),
+    ("SUBLANG_GERMAN", 0x01),
+    ("SUBLANG_GERMAN_SWISS", 0x02),
+    ("SUBLANG_GERMAN_AUSTRIAN", 0x03),
+    ("SUBLANG_GERMAN_LUXEMBOURG", 0x04),
+    ("SUBLANG_GERMAN_LIECHTENSTEIN", 0x05),
+    ("SUBLANG_ITALIAN", 0x01),
+    ("SUBLANG_ITALIAN_SWISS", 0x02),
+    ("SUBLANG_KASHMIRI_SASIA", 0x02),
+    ("SUBLANG_KASHMIRI_INDIA", 0x02),
+    ("SUBLANG_KOREAN", 0x01),
+    ("SUBLANG_LITHUANIAN", 0x01),
+    ("SUBLANG_MALAY_MALAYSIA", 0x01),
+    ("SUBLANG_MALAY_BRUNEI_DARUSSALAM", 0x02),
+    ("SUBLANG_NEPALI_INDIA", 0x02),
+    ("SUBLANG_NORWEGIAN_BOKMAL", 0x01),
+    ("SUBLANG_NORWEGIAN_NYNORSK", 0x02),
+    ("SUBLANG_PORTUGUESE", 0x02),
+    ("SUBLANG_PORTUGUESE_BRAZILIAN", 0x01),
+    ("SUBLANG_SERBIAN_LATIN", 0x02),
+    ("SUBLANG_SERBIAN_CYRILLIC", 0x03),
+    ("SUBLANG_SPANISH", 0x01),
+    ("SUBLANG_SPANISH_MEXICAN", 0x02),
+    ("SUBLANG_SPANISH_MODERN", 0x03),
+    ("SUBLANG_SPANISH_GUATEMALA", 0x04),
+    ("SUBLANG_SPANISH_COSTA_RICA", 0x05),
+    ("SUBLANG_SPANISH_PANAMA", 0x06),
+    ("SUBLANG_SPANISH_DOMINICAN_REPUBLIC", 0x07),
+    ("SUBLANG_SPANISH_VENEZUELA", 0x08),
+    ("SUBLANG_SPANISH_COLOMBIA", 0x09),
+    ("SUBLANG_SPANISH_PERU", 0x0A),
+    ("SUBLANG_SPANISH_ARGENTINA", 0x0B),
+    ("SUBLANG_SPANISH_ECUADOR", 0x0C),
+    ("SUBLANG_SPANISH_CHILE", 0x0D),
+    ("SUBLANG_SPANISH_URUGUAY", 0x0E),
+    ("SUBLANG_SPANISH_PARAGUAY", 0x0F),
+    ("SUBLANG_SPANISH_BOLIVIA", 0x10),
+    ("SUBLANG_SPANISH_EL_SALVADOR", 0x11),
+    ("SUBLANG_SPANISH_HONDURAS", 0x12),
+    ("SUBLANG_SPANISH_NICARAGUA", 0x13),
+    ("SUBLANG_SPANISH_PUERTO_RICO", 0x14),
+    ("SUBLANG_SWEDISH", 0x01),
+    ("SUBLANG_SWEDISH_FINLAND", 0x02),
+    ("SUBLANG_URDU_PAKISTAN", 0x01),
+    ("SUBLANG_URDU_INDIA", 0x02),
+    ("SUBLANG_UZBEK_LATIN", 0x01),
+    ("SUBLANG_UZBEK_CYRILLIC", 0x02),
+    ("SUBLANG_DUTCH_SURINAM", 0x03),
+    ("SUBLANG_ROMANIAN", 0x01),
+    ("SUBLANG_ROMANIAN_MOLDAVIA", 0x02),
+    ("SUBLANG_RUSSIAN", 0x01),
+    ("SUBLANG_RUSSIAN_MOLDAVIA", 0x02),
+    ("SUBLANG_CROATIAN", 0x01),
+    ("SUBLANG_LITHUANIAN_CLASSIC", 0x02),
+    ("SUBLANG_GAELIC", 0x01),
+    ("SUBLANG_GAELIC_SCOTTISH", 0x02),
+    ("SUBLANG_GAELIC_MANX", 0x03),
+]
+
+SUBLANG = two_way_dict(sublang)
+
+# Initialize the dictionary with all the name->value pairs
+SUBLANG = dict(sublang)
+# Now add all the value->name information, handling duplicates appropriately
+for sublang_name, sublang_value in sublang:
+    if sublang_value in SUBLANG:
+        SUBLANG[sublang_value].append(sublang_name)
+    else:
+        SUBLANG[sublang_value] = [sublang_name]
+
+# Resolve a sublang name given the main lang name
+#
+def get_sublang_name_for_lang(lang_value, sublang_value):
+    lang_name = LANG.get(lang_value, "*unknown*")
+    for sublang_name in SUBLANG.get(sublang_value, []):
+        # if the main language is a substring of sublang's name, then
+        # return that
+        if lang_name in sublang_name:
+            return sublang_name
+    # otherwise return the first sublang name
+    return SUBLANG.get(sublang_value, ["*unknown*"])[0]
+
+
+# Ange Albertini's code to process resources' strings
+#
+def parse_strings(data, counter, l):
+    i = 0
+    error_count = 0
+    while i < len(data):
+
+        data_slice = data[i : i + 2]
+        if len(data_slice) < 2:
+            break
+
+        len_ = struct.unpack("= 3:
+                break
+            i += len_ * 2
+        counter += 1
+
+
+def retrieve_flags(flag_dict, flag_filter):
+    """Read the flags from a dictionary and return them in a usable form.
+
+    Will return a list of (flag, value) for all flags in "flag_dict"
+    matching the filter "flag_filter".
+    """
+
+    return [
+        (flag, flag_dict[flag])
+        for flag in flag_dict.keys()
+        if isinstance(flag, (str, bytes)) and flag.startswith(flag_filter)
+    ]
+
+
+def set_flags(obj, flag_field, flags):
+    """Will process the flags and set attributes in the object accordingly.
+
+    The object "obj" will gain attributes named after the flags provided in
+    "flags" and valued True/False, matching the results of applying each
+    flag value from "flags" to flag_field.
+    """
+
+    for flag, value in flags:
+        if value & flag_field:
+            obj.__dict__[flag] = True
+        else:
+            obj.__dict__[flag] = False
+
+
+def power_of_two(val):
+    return val != 0 and (val & (val - 1)) == 0
+
+
+def b(x):
+    if isinstance(x, bytes):
+        return x
+    elif isinstance(x, bytearray):
+        return bytes(x)
+    else:
+        return codecs.encode(x, "cp1252")
+
+
+class AddressSet(set):
+    def __init__(self):
+        super().__init__()
+        self.min = None
+        self.max = None
+
+    def add(self, value):
+        super().add(value)
+        self.min = value if self.min is None else min(self.min, value)
+        self.max = value if self.max is None else max(self.max, value)
+
+    def diff(self):
+        return 0 if self.min is None or self.max is None else self.max - self.min
+
+
+class UnicodeStringWrapperPostProcessor:
+    """This class attempts to help the process of identifying strings
+    that might be plain Unicode or Pascal. A list of strings will be
+    wrapped on it with the hope the overlappings will help make the
+    decision about their type."""
+
+    def __init__(self, pe, rva_ptr):
+        self.pe = pe
+        self.rva_ptr = rva_ptr
+        self.string = None
+
+    def get_rva(self):
+        """Get the RVA of the string."""
+        return self.rva_ptr
+
+    def __str__(self):
+        """Return the escaped UTF-8 representation of the string."""
+        return self.decode("utf-8", "backslashreplace_")
+
+    def decode(self, *args):
+        if not self.string:
+            return ""
+        return self.string.decode(*args)
+
+    def invalidate(self):
+        """Make this instance None, to express it's no known string type."""
+        self = None
+
+    def render_pascal_16(self):
+        try:
+            self.string = self.pe.get_string_u_at_rva(
+                self.rva_ptr + 2, max_length=self.get_pascal_16_length()
+            )
+        except PEFormatError:
+            self.pe.get_warnings().append(
+                "Failed rendering pascal string, "
+                "attempting to read from RVA 0x{0:x}".format(self.rva_ptr + 2)
+            )
+
+    def get_pascal_16_length(self):
+        return self.__get_word_value_at_rva(self.rva_ptr)
+
+    def __get_word_value_at_rva(self, rva):
+        try:
+            data = self.pe.get_data(rva, 2)
+        except PEFormatError:
+            return False
+
+        if len(data) < 2:
+            return False
+
+        return struct.unpack(" str:
+        return self.__format_str__
+
+    def get_field_absolute_offset(self, field_name):
+        """Return the offset within the field for the requested field in the structure."""
+        return self.__file_offset__ + self.__field_offsets__[field_name]
+
+    def get_field_relative_offset(self, field_name):
+        """Return the offset within the structure for the requested field."""
+        return self.__field_offsets__[field_name]
+
+    def get_file_offset(self):
+        return self.__file_offset__
+
+    def set_file_offset(self, offset):
+        self.__file_offset__ = offset
+
+    def all_zeroes(self):
+        """Returns true is the unpacked data is all zeros."""
+
+        return self.__all_zeroes__
+
+    def sizeof(self):
+        """Return size of the structure."""
+
+        return self.__format_length__
+
+    def __unpack__(self, data):
+
+        data = b(data)
+
+        if len(data) > self.__format_length__:
+            data = data[: self.__format_length__]
+
+        # OC Patch:
+        # Some malware have incorrect header lengths.
+        # Fail gracefully if this occurs
+        # Buggy malware: a29b0118af8b7408444df81701ad5a7f
+        #
+        elif len(data) < self.__format_length__:
+            raise PEFormatError("Data length less than expected header length.")
+
+        if count_zeroes(data) == len(data):
+            self.__all_zeroes__ = True
+
+        self.__unpacked_data_elms__ = struct.unpack(self.__format_str__, data)
+        for idx, val in enumerate(self.__unpacked_data_elms__):
+            for key in self.__keys__[idx]:
+                setattr(self, key, val)
+
+    def __pack__(self):
+
+        new_values = []
+
+        for idx, val in enumerate(self.__unpacked_data_elms__):
+            new_val = None
+            for key in self.__keys__[idx]:
+                new_val = getattr(self, key)
+                # In the case of unions, when the first changed value
+                # is picked the loop is exited
+                if new_val != val:
+                    break
+            new_values.append(new_val)
+
+        return struct.pack(self.__format_str__, *new_values)
+
+    def __str__(self):
+        return "\n".join(self.dump())
+
+    def __repr__(self):
+        return "" % (
+            " ".join([" ".join(s.split()) for s in self.dump()])
+        )
+
+    def dump(self, indentation=0):
+        """Returns a string representation of the structure."""
+
+        dump = []
+
+        dump.append("[{0}]".format(self.name))
+
+        printable_bytes = [
+            ord(i) for i in string.printable if i not in string.whitespace
+        ]
+
+        # Refer to the __set_format__ method for an explanation
+        # of the following construct.
+        for keys in self.__keys__:
+            for key in keys:
+
+                val = getattr(self, key)
+                if isinstance(val, (int, long)):
+                    if key.startswith("Signature_"):
+                        val_str = "{:<8X}".format(val)
+                    else:
+                        val_str = "0x{:<8X}".format(val)
+                    if key == "TimeDateStamp" or key == "dwTimeStamp":
+                        try:
+                            val_str += " [%s UTC]" % time.asctime(time.gmtime(val))
+                        except ValueError:
+                            val_str += " [INVALID TIME]"
+                else:
+                    val_str = bytearray(val)
+                    if key.startswith("Signature"):
+                        val_str = "".join(
+                            ["{:02X}".format(i) for i in val_str.rstrip(b"\x00")]
+                        )
+                    else:
+                        val_str = "".join(
+                            [
+                                chr(i)
+                                if (i in printable_bytes)
+                                else "\\x{0:02x}".format(i)
+                                for i in val_str.rstrip(b"\x00")
+                            ]
+                        )
+
+                dump.append(
+                    "0x%-8X 0x%-3X %-30s %s"
+                    % (
+                        self.__field_offsets__[key] + self.__file_offset__,
+                        self.__field_offsets__[key],
+                        key + ":",
+                        val_str,
+                    )
+                )
+
+        return dump
+
+    def dump_dict(self):
+        """Returns a dictionary representation of the structure."""
+
+        dump_dict = {}
+
+        dump_dict["Structure"] = self.name
+
+        # Refer to the __set_format__ method for an explanation
+        # of the following construct.
+        for keys in self.__keys__:
+            for key in keys:
+
+                val = getattr(self, key)
+                if isinstance(val, (int, long)):
+                    if key == "TimeDateStamp" or key == "dwTimeStamp":
+                        try:
+                            val = "0x%-8X [%s UTC]" % (
+                                val,
+                                time.asctime(time.gmtime(val)),
+                            )
+                        except ValueError:
+                            val = "0x%-8X [INVALID TIME]" % val
+                else:
+                    val = "".join(
+                        chr(d) if chr(d) in string.printable else "\\x%02x" % d
+                        for d in [ord(c) if not isinstance(c, int) else c for c in val]
+                    )
+
+                dump_dict[key] = {
+                    "FileOffset": self.__field_offsets__[key] + self.__file_offset__,
+                    "Offset": self.__field_offsets__[key],
+                    "Value": val,
+                }
+
+        return dump_dict
+
+
+class SectionStructure(Structure):
+    """Convenience section handling class."""
+
+    def __init__(self, *argl, **argd):
+        if "pe" in argd:
+            self.pe = argd["pe"]
+            del argd["pe"]
+
+        self.PointerToRawData = None
+        self.VirtualAddress = None
+        self.SizeOfRawData = None
+        self.Misc_VirtualSize = None
+        Structure.__init__(self, *argl, **argd)
+        self.PointerToRawData_adj = None
+        self.VirtualAddress_adj = None
+        self.section_min_addr = None
+        self.section_max_addr = None
+
+    def get_PointerToRawData_adj(self):
+        if self.PointerToRawData_adj is None:
+            if self.PointerToRawData is not None:
+                self.PointerToRawData_adj = self.pe.adjust_FileAlignment(
+                    self.PointerToRawData, self.pe.OPTIONAL_HEADER.FileAlignment
+                )
+        return self.PointerToRawData_adj
+
+    def get_VirtualAddress_adj(self):
+        if self.VirtualAddress_adj is None:
+            if self.VirtualAddress is not None:
+                self.VirtualAddress_adj = self.pe.adjust_SectionAlignment(
+                    self.VirtualAddress,
+                    self.pe.OPTIONAL_HEADER.SectionAlignment,
+                    self.pe.OPTIONAL_HEADER.FileAlignment,
+                )
+        return self.VirtualAddress_adj
+
+    def get_data(self, start=None, length=None, ignore_padding=False):
+        """Get data chunk from a section.
+
+        Allows to query data from the section by passing the
+        addresses where the PE file would be loaded by default.
+        It is then possible to retrieve code and data by their real
+        addresses as they would be if loaded.
+
+        Note that sections on disk can include padding that would
+        not be loaded to memory. That is the case if `section.SizeOfRawData`
+        is greater than `section.Misc_VirtualSize`, and that means
+        that data past `section.Misc_VirtualSize` is padding.
+        In case you are not interested in this padding, passing
+        `ignore_padding=True` will truncate the result in order
+        not to return the padding (if any).
+
+        Returns bytes() under Python 3.x and set() under Python 2.7
+        """
+
+        if start is None:
+            offset = self.get_PointerToRawData_adj()
+        else:
+            offset = (
+                start - self.get_VirtualAddress_adj()
+            ) + self.get_PointerToRawData_adj()
+
+        if length is not None:
+            end = offset + length
+        elif self.SizeOfRawData is not None:
+            end = offset + self.SizeOfRawData
+        else:
+            end = offset
+
+        if ignore_padding and end is not None and offset is not None:
+            end = min(end, offset + self.Misc_VirtualSize)
+
+        # PointerToRawData is not adjusted here as we might want to read any possible
+        # extra bytes that might get cut off by aligning the start (and hence cutting
+        # something off the end)
+        if self.PointerToRawData is not None and self.SizeOfRawData is not None:
+            if end > self.PointerToRawData + self.SizeOfRawData:
+                end = self.PointerToRawData + self.SizeOfRawData
+        return self.pe.__data__[offset:end]
+
+    def __setattr__(self, name, val):
+
+        if name == "Characteristics":
+            section_flags = retrieve_flags(SECTION_CHARACTERISTICS, "IMAGE_SCN_")
+
+            # Set the section's flags according to the Characteristics member
+            set_flags(self, val, section_flags)
+
+        elif "IMAGE_SCN_" in name and hasattr(self, name):
+            if val:
+                self.__dict__["Characteristics"] |= SECTION_CHARACTERISTICS[name]
+            else:
+                self.__dict__["Characteristics"] ^= SECTION_CHARACTERISTICS[name]
+
+        self.__dict__[name] = val
+
+    def get_rva_from_offset(self, offset):
+        return offset - self.get_PointerToRawData_adj() + self.get_VirtualAddress_adj()
+
+    def get_offset_from_rva(self, rva):
+        return rva - self.get_VirtualAddress_adj() + self.get_PointerToRawData_adj()
+
+    def contains_offset(self, offset):
+        """Check whether the section contains the file offset provided."""
+
+        if self.PointerToRawData is None:
+            # bss and other sections containing only uninitialized data must have 0
+            # and do not take space in the file
+            return False
+        PointerToRawData_adj = self.get_PointerToRawData_adj()
+        return (
+            PointerToRawData_adj <= offset < PointerToRawData_adj + self.SizeOfRawData
+        )
+
+    def contains_rva(self, rva):
+        """Check whether the section contains the address provided."""
+
+        # speedup
+        if self.section_min_addr is not None and self.section_max_addr is not None:
+            return self.section_min_addr <= rva < self.section_max_addr
+
+        VirtualAddress_adj = self.get_VirtualAddress_adj()
+        # Check if the SizeOfRawData is realistic. If it's bigger than the size of
+        # the whole PE file minus the start address of the section it could be
+        # either truncated or the SizeOfRawData contains a misleading value.
+        # In either of those cases we take the VirtualSize
+        #
+        if len(self.pe.__data__) - self.get_PointerToRawData_adj() < self.SizeOfRawData:
+            # PECOFF documentation v8 says:
+            # VirtualSize: The total size of the section when loaded into memory.
+            # If this value is greater than SizeOfRawData, the section is zero-padded.
+            # This field is valid only for executable images and should be set to zero
+            # for object files.
+            #
+            size = self.Misc_VirtualSize
+        else:
+            size = max(self.SizeOfRawData, self.Misc_VirtualSize)
+
+        # Check whether there's any section after the current one that starts before
+        # the calculated end for the current one. If so, cut the current section's size
+        # to fit in the range up to where the next section starts.
+        if (
+            self.next_section_virtual_address is not None
+            and self.next_section_virtual_address > self.VirtualAddress
+            and VirtualAddress_adj + size > self.next_section_virtual_address
+        ):
+            size = self.next_section_virtual_address - VirtualAddress_adj
+
+        self.section_min_addr = VirtualAddress_adj
+        self.section_max_addr = VirtualAddress_adj + size
+        return VirtualAddress_adj <= rva < VirtualAddress_adj + size
+
+    def contains(self, rva):
+        return self.contains_rva(rva)
+
+    def get_entropy(self):
+        """Calculate and return the entropy for the section."""
+
+        return self.entropy_H(self.get_data())
+
+    def get_hash_sha1(self):
+        """Get the SHA-1 hex-digest of the section's data."""
+
+        if sha1 is not None:
+            return sha1(self.get_data()).hexdigest()
+
+    def get_hash_sha256(self):
+        """Get the SHA-256 hex-digest of the section's data."""
+
+        if sha256 is not None:
+            return sha256(self.get_data()).hexdigest()
+
+    def get_hash_sha512(self):
+        """Get the SHA-512 hex-digest of the section's data."""
+
+        if sha512 is not None:
+            return sha512(self.get_data()).hexdigest()
+
+    def get_hash_md5(self):
+        """Get the MD5 hex-digest of the section's data."""
+
+        if md5 is not None:
+            return md5(self.get_data()).hexdigest()
+
+    def entropy_H(self, data):
+        """Calculate the entropy of a chunk of data."""
+
+        if not data:
+            return 0.0
+
+        occurences = Counter(bytearray(data))
+
+        entropy = 0
+        for x in occurences.values():
+            p_x = float(x) / len(data)
+            entropy -= p_x * math.log(p_x, 2)
+
+        return entropy
+
+
+@lru_cache(maxsize=2048, copy=False)
+def set_bitfields_format(format):
+    class Accumulator:
+        def __init__(self, fmt, comp_fields):
+            self._subfields = []
+            # add a prefix to distinguish the artificially created compoud field
+            # from regular fields
+            self._name = "~"
+            self._type = None
+            self._bits_left = 0
+            self._comp_fields = comp_fields
+            self._format = fmt
+
+        def wrap_up(self):
+            if self._type is None:
+                return
+            self._format.append(self._type + "," + self._name)
+            self._comp_fields[len(self._format) - 1] = (self._type, self._subfields)
+            self._name = "~"
+            self._type = None
+            self._subfields = []
+
+        def new_type(self, tp):
+            self._bits_left = STRUCT_SIZEOF_TYPES[tp] * 8
+            self._type = tp
+
+        def add_subfield(self, name, bitcnt):
+            self._name += name
+            self._bits_left -= bitcnt
+            self._subfields.append((name, bitcnt))
+
+        def get_type(self):
+            return self._type
+
+        def get_name(self):
+            return self._name
+
+        def get_bits_left(self):
+            return self._bits_left
+
+    old_fmt = []
+    comp_fields = {}
+    ac = Accumulator(old_fmt, comp_fields)
+
+    for elm in format[1]:
+        if not ":" in elm:
+            ac.wrap_up()
+            old_fmt.append(elm)
+            continue
+
+        elm_type, elm_name = elm.split(",", 1)
+
+        if "," in elm_name:
+            raise NotImplementedError(
+                "Structures with bitfields do not support unions yet"
+            )
+
+        elm_type, elm_bits = elm_type.split(":", 1)
+        elm_bits = int(elm_bits)
+        if elm_type != ac.get_type() or elm_bits > ac.get_bits_left():
+            ac.wrap_up()
+            ac.new_type(elm_type)
+
+        ac.add_subfield(elm_name, elm_bits)
+    ac.wrap_up()
+
+    format_str, _, field_offsets, keys, format_length = set_format(tuple(old_fmt))
+
+    extended_keys = []
+    for idx, val in enumerate(keys):
+        if not idx in comp_fields:
+            extended_keys.append(val)
+            continue
+        _, sbf = comp_fields[idx]
+        bf_names = [[f[StructureWithBitfields.BTF_NAME_IDX]] for f in sbf]
+        extended_keys.extend(bf_names)
+        for n in bf_names:
+            field_offsets[n[0]] = field_offsets[val[0]]
+
+    return (format_str, format_length, field_offsets, keys, extended_keys, comp_fields)
+
+
+class StructureWithBitfields(Structure):
+    """
+    Extends Structure's functionality with support for bitfields such as:
+        ('B:4,LowerHalf', 'B:4,UpperHalf')
+    To this end, two lists are maintained:
+        * self.__keys__ that contains compound fields, for example
+          ('B,~LowerHalfUpperHalf'), and is used during packing/unpaking
+        * self.__keys_ext__ containing a separate key for each field (ex., LowerHalf,
+          UpperHalf) to simplify implementation of dump()
+    This way the implementation of unpacking/packing and dump() from Structure can be
+    reused.
+
+    In addition, we create a dictionary:
+         -->
+            (data type, [ (subfield name, length in bits)+ ] )
+    that facilitates bitfield paking and unpacking.
+
+    With lru_cache() creating only once instance per format string, the memory
+    overhead is negligible.
+    """
+
+    BTF_NAME_IDX = 0
+    BTF_BITCNT_IDX = 1
+    CF_TYPE_IDX = 0
+    CF_SUBFLD_IDX = 1
+
+    def __init__(self, format, name=None, file_offset=None):
+        (
+            self.__format_str__,
+            self.__format_length__,
+            self.__field_offsets__,
+            self.__keys__,
+            self.__keys_ext__,
+            self.__compound_fields__,
+        ) = set_bitfields_format(format)
+        # create our own unpacked_data_elms to ensure they are not shared among
+        # StructureWithBitfields instances with the same format string
+        self.__unpacked_data_elms__ = [None for i in range(self.__format_length__)]
+        self.__all_zeroes__ = False
+        self.__file_offset__ = file_offset
+        self.name = name if name != None else format[0]
+
+    def __unpack__(self, data):
+        # calling the original routine to deal with special cases/spurious data
+        # structures
+        super(StructureWithBitfields, self).__unpack__(data)
+        self._unpack_bitfield_attributes()
+
+    def __pack__(self):
+        self._pack_bitfield_attributes()
+        try:
+            data = super(StructureWithBitfields, self).__pack__()
+        finally:
+            self._unpack_bitfield_attributes()
+        return data
+
+    def dump(self, indentation=0):
+        tk = self.__keys__
+        self.__keys__ = self.__keys_ext__
+        try:
+            ret = super(StructureWithBitfields, self).dump(indentation)
+        finally:
+            self.__keys__ = tk
+        return ret
+
+    def dump_dict(self):
+        tk = self.__keys__
+        self.__keys__ = self.__keys_ext__
+        try:
+            ret = super(StructureWithBitfields, self).dump_dict()
+        finally:
+            self.__keys__ = tk
+        return ret
+
+    def _unpack_bitfield_attributes(self):
+        """Replace compound attributes corresponding to bitfields with separate
+        sub-fields.
+        """
+        for i in self.__compound_fields__.keys():
+            cf_name = self.__keys__[i][0]
+            cval = getattr(self, cf_name)
+            delattr(self, cf_name)
+            offst = 0
+            for sf in self.__compound_fields__[i][StructureWithBitfields.CF_SUBFLD_IDX]:
+                mask = (1 << sf[StructureWithBitfields.BTF_BITCNT_IDX]) - 1
+                mask <<= offst
+                setattr(
+                    self,
+                    sf[StructureWithBitfields.BTF_NAME_IDX],
+                    (cval & mask) >> offst,
+                )
+                offst += sf[StructureWithBitfields.BTF_BITCNT_IDX]
+
+    def _pack_bitfield_attributes(self):
+        """Pack attributes into a compound bitfield"""
+        for i in self.__compound_fields__.keys():
+            cf_name = self.__keys__[i][0]
+            offst, acc_val = 0, 0
+            for sf in self.__compound_fields__[i][StructureWithBitfields.CF_SUBFLD_IDX]:
+                mask = (1 << sf[StructureWithBitfields.BTF_BITCNT_IDX]) - 1
+                field_val = (
+                    getattr(self, sf[StructureWithBitfields.BTF_NAME_IDX]) & mask
+                )
+                acc_val |= field_val << offst
+                offst += sf[StructureWithBitfields.BTF_BITCNT_IDX]
+            setattr(self, cf_name, acc_val)
+
+
+class DataContainer:
+    """Generic data container."""
+
+    def __init__(self, **args):
+        bare_setattr = super(DataContainer, self).__setattr__
+        for key, value in args.items():
+            bare_setattr(key, value)
+
+
+class ImportDescData(DataContainer):
+    """Holds import descriptor information.
+
+    dll:        name of the imported DLL
+    imports:    list of imported symbols (ImportData instances)
+    struct:     IMAGE_IMPORT_DESCRIPTOR structure
+    """
+
+
+class ImportData(DataContainer):
+    """Holds imported symbol's information.
+
+    ordinal:    Ordinal of the symbol
+    name:       Name of the symbol
+    bound:      If the symbol is bound, this contains
+                the address.
+    """
+
+    def __setattr__(self, name, val):
+
+        # If the instance doesn't yet have an ordinal attribute
+        # it's not fully initialized so can't do any of the
+        # following
+        #
+        if (
+            hasattr(self, "ordinal")
+            and hasattr(self, "bound")
+            and hasattr(self, "name")
+        ):
+
+            if name == "ordinal":
+
+                if self.pe.PE_TYPE == OPTIONAL_HEADER_MAGIC_PE:
+                    ordinal_flag = IMAGE_ORDINAL_FLAG
+                elif self.pe.PE_TYPE == OPTIONAL_HEADER_MAGIC_PE_PLUS:
+                    ordinal_flag = IMAGE_ORDINAL_FLAG64
+
+                # Set the ordinal and flag the entry as importing by ordinal
+                self.struct_table.Ordinal = ordinal_flag | (val & 0xFFFF)
+                self.struct_table.AddressOfData = self.struct_table.Ordinal
+                self.struct_table.Function = self.struct_table.Ordinal
+                self.struct_table.ForwarderString = self.struct_table.Ordinal
+            elif name == "bound":
+                if self.struct_iat is not None:
+                    self.struct_iat.AddressOfData = val
+                    self.struct_iat.AddressOfData = self.struct_iat.AddressOfData
+                    self.struct_iat.Function = self.struct_iat.AddressOfData
+                    self.struct_iat.ForwarderString = self.struct_iat.AddressOfData
+            elif name == "address":
+                self.struct_table.AddressOfData = val
+                self.struct_table.Ordinal = self.struct_table.AddressOfData
+                self.struct_table.Function = self.struct_table.AddressOfData
+                self.struct_table.ForwarderString = self.struct_table.AddressOfData
+            elif name == "name":
+                # Make sure we reset the entry in case the import had been set to
+                # import by ordinal
+                if self.name_offset:
+
+                    name_rva = self.pe.get_rva_from_offset(self.name_offset)
+                    self.pe.set_dword_at_offset(
+                        self.ordinal_offset, (0 << 31) | name_rva
+                    )
+
+                    # Complain if the length of the new name is longer than the
+                    # existing one
+                    if len(val) > len(self.name):
+                        raise PEFormatError(
+                            "The export name provided is longer than the existing one."
+                        )
+                        pass
+                    self.pe.set_bytes_at_offset(self.name_offset, val)
+
+        self.__dict__[name] = val
+
+
+class ExportDirData(DataContainer):
+    """Holds export directory information.
+
+    struct:     IMAGE_EXPORT_DIRECTORY structure
+    symbols:    list of exported symbols (ExportData instances)"""
+
+
+class ExportData(DataContainer):
+    """Holds exported symbols' information.
+
+    ordinal:    ordinal of the symbol
+    address:    address of the symbol
+    name:       name of the symbol (None if the symbol is
+                exported by ordinal only)
+    forwarder:  if the symbol is forwarded it will
+                contain the name of the target symbol,
+                None otherwise.
+    """
+
+    def __setattr__(self, name, val):
+
+        # If the instance doesn't yet have an ordinal attribute
+        # it's not fully initialized so can't do any of the
+        # following
+        #
+        if (
+            hasattr(self, "ordinal")
+            and hasattr(self, "address")
+            and hasattr(self, "forwarder")
+            and hasattr(self, "name")
+        ):
+
+            if name == "ordinal":
+                self.pe.set_word_at_offset(self.ordinal_offset, val)
+            elif name == "address":
+                self.pe.set_dword_at_offset(self.address_offset, val)
+            elif name == "name":
+                # Complain if the length of the new name is longer than the
+                # existing one
+                if len(val) > len(self.name):
+                    raise PEFormatError(
+                        "The export name provided is longer than the existing one."
+                    )
+                self.pe.set_bytes_at_offset(self.name_offset, val)
+            elif name == "forwarder":
+                # Complain if the length of the new name is longer than the
+                # existing one
+                if len(val) > len(self.forwarder):
+                    raise PEFormatError(
+                        "The forwarder name provided is longer than the existing one."
+                    )
+                self.pe.set_bytes_at_offset(self.forwarder_offset, val)
+
+        self.__dict__[name] = val
+
+
+class ResourceDirData(DataContainer):
+    """Holds resource directory information.
+
+    struct:     IMAGE_RESOURCE_DIRECTORY structure
+    entries:    list of entries (ResourceDirEntryData instances)
+    """
+
+
+class ResourceDirEntryData(DataContainer):
+    """Holds resource directory entry data.
+
+    struct:     IMAGE_RESOURCE_DIRECTORY_ENTRY structure
+    name:       If the resource is identified by name this
+                attribute will contain the name string. None
+                otherwise. If identified by id, the id is
+                available at 'struct.Id'
+    id:         the id, also in struct.Id
+    directory:  If this entry has a lower level directory
+                this attribute will point to the
+                ResourceDirData instance representing it.
+    data:       If this entry has no further lower directories
+                and points to the actual resource data, this
+                attribute will reference the corresponding
+                ResourceDataEntryData instance.
+    (Either of the 'directory' or 'data' attribute will exist,
+    but not both.)
+    """
+
+
+class ResourceDataEntryData(DataContainer):
+    """Holds resource data entry information.
+
+    struct:     IMAGE_RESOURCE_DATA_ENTRY structure
+    lang:       Primary language ID
+    sublang:    Sublanguage ID
+    """
+
+
+class DebugData(DataContainer):
+    """Holds debug information.
+
+    struct:     IMAGE_DEBUG_DIRECTORY structure
+    entries:    list of entries (IMAGE_DEBUG_TYPE instances)
+    """
+
+
+class DynamicRelocationData(DataContainer):
+    """Holds dynamic relocation information.
+
+    struct:        IMAGE_DYNAMIC_RELOCATION structure
+    symbol:        Symbol to which dynamic relocations must be applied
+    relocations:   List of dynamic relocations for this symbol (BaseRelocationData instances)
+    """
+
+
+class BaseRelocationData(DataContainer):
+    """Holds base relocation information.
+
+    struct:     IMAGE_BASE_RELOCATION structure
+    entries:    list of relocation data (RelocationData instances)
+    """
+
+
+class RelocationData(DataContainer):
+    """Holds relocation information.
+
+    type:       Type of relocation
+                The type string can be obtained by
+                RELOCATION_TYPE[type]
+    rva:        RVA of the relocation
+    """
+
+    def __setattr__(self, name, val):
+
+        # If the instance doesn't yet have a struct attribute
+        # it's not fully initialized so can't do any of the
+        # following
+        #
+        if hasattr(self, "struct"):
+            # Get the word containing the type and data
+            #
+            word = self.struct.Data
+
+            if name == "type":
+                word = (val << 12) | (word & 0xFFF)
+            elif name == "rva":
+                offset = max(val - self.base_rva, 0)
+                word = (word & 0xF000) | (offset & 0xFFF)
+
+            # Store the modified data
+            #
+            self.struct.Data = word
+
+        self.__dict__[name] = val
+
+
+class TlsData(DataContainer):
+    """Holds TLS information.
+
+    struct:     IMAGE_TLS_DIRECTORY structure
+    """
+
+
+class BoundImportDescData(DataContainer):
+    """Holds bound import descriptor data.
+
+    This directory entry will provide information on the
+    DLLs this PE file has been bound to (if bound at all).
+    The structure will contain the name and timestamp of the
+    DLL at the time of binding so that the loader can know
+    whether it differs from the one currently present in the
+    system and must, therefore, re-bind the PE's imports.
+
+    struct:     IMAGE_BOUND_IMPORT_DESCRIPTOR structure
+    name:       DLL name
+    entries:    list of entries (BoundImportRefData instances)
+                the entries will exist if this DLL has forwarded
+                symbols. If so, the destination DLL will have an
+                entry in this list.
+    """
+
+
+class LoadConfigData(DataContainer):
+    """Holds Load Config data.
+
+    struct:     IMAGE_LOAD_CONFIG_DIRECTORY structure
+    name:       dll name
+    dynamic_relocations: dynamic relocation information, if present
+    """
+
+
+class BoundImportRefData(DataContainer):
+    """Holds bound import forwarder reference data.
+
+    Contains the same information as the bound descriptor but
+    for forwarded DLLs, if any.
+
+    struct:     IMAGE_BOUND_FORWARDER_REF structure
+    name:       dll name
+    """
+
+
+class ExceptionsDirEntryData(DataContainer):
+    """Holds the data related to SEH (and stack unwinding, in particular)
+
+    struct      an instance of RUNTIME_FUNTION
+    unwindinfo  an instance of UNWIND_INFO
+    """
+
+
+class UnwindInfo(StructureWithBitfields):
+    """Handles the complexities of UNWIND_INFO structure:
+    * variable number of UWIND_CODEs
+    * optional ExceptionHandler and FunctionEntry fields
+    """
+
+    def __init__(self, file_offset=0):
+        super(UnwindInfo, self).__init__(
+            (
+                "UNWIND_INFO",
+                (
+                    "B:3,Version",
+                    "B:5,Flags",
+                    "B,SizeOfProlog",
+                    "B,CountOfCodes",
+                    "B:4,FrameRegister",
+                    "B:4,FrameOffset",
+                ),
+            ),
+            file_offset=file_offset,
+        )
+        self._full_size = super(UnwindInfo, self).sizeof()
+        self._opt_field_name = None
+        self._code_info = StructureWithBitfields(
+            ("UNWIND_CODE", ("B,CodeOffset", "B:4,UnwindOp", "B:4,OpInfo")),
+            file_offset=0,
+        )
+        self._chained_entry = None
+        self._finished_unpacking = False
+
+    def unpack_in_stages(self, data):
+        """Unpacks the UNWIND_INFO "in two calls", with the first call establishing
+        a full size of the structure and the second, performing the actual unpacking.
+        """
+        if self._finished_unpacking:
+            return None
+
+        super(UnwindInfo, self).__unpack__(data)
+        codes_cnt_max = (self.CountOfCodes + 1) & ~1
+        hdlr_offset = (
+            super(UnwindInfo, self).sizeof() + codes_cnt_max * self._code_info.sizeof()
+        )
+        self._full_size = hdlr_offset + (
+            0 if self.Flags == 0 else STRUCT_SIZEOF_TYPES["I"]
+        )
+
+        if len(data) < self._full_size:
+            return None
+
+        if self.Version != 1 and self.Version != 2:
+            return "Unsupported version of UNWIND_INFO at " + hex(self.__file_offset__)
+
+        self.UnwindCodes = []
+        ro = super(UnwindInfo, self).sizeof()
+        codes_left = self.CountOfCodes
+        while codes_left > 0:
+            self._code_info.__unpack__(data[ro : ro + self._code_info.sizeof()])
+            ucode = PrologEpilogOpsFactory.create(self._code_info)
+            if ucode is None:
+                return "Unknown UNWIND_CODE at " + hex(self.__file_offset__ + ro)
+
+            len_in_codes = ucode.length_in_code_structures(self._code_info, self)
+            opc_size = self._code_info.sizeof() * len_in_codes
+            ucode.initialize(
+                self._code_info,
+                data[ro : ro + opc_size],
+                self,
+                self.__file_offset__ + ro,
+            )
+            ro += opc_size
+            codes_left -= len_in_codes
+            self.UnwindCodes.append(ucode)
+
+        if self.UNW_FLAG_EHANDLER or self.UNW_FLAG_UHANDLER:
+            self._opt_field_name = "ExceptionHandler"
+
+        if self.UNW_FLAG_CHAININFO:
+            self._opt_field_name = "FunctionEntry"
+
+        if self._opt_field_name != None:
+            setattr(
+                self,
+                self._opt_field_name,
+                struct.unpack(
+                    " self._full_size:
+                break
+            data[cur_offset : cur_offset + uc.struct.sizeof()] = uc.struct.__pack__()
+            cur_offset += uc.struct.sizeof()
+
+        if self._opt_field_name != None:
+            data[
+                self._full_size - STRUCT_SIZEOF_TYPES["I"] : self._full_size
+            ] = struct.pack("" if self.struct.OpInfo else "")
+
+
+class PrologEpilogOpEpilogMarker(PrologEpilogOp):
+    """UWOP_EPILOG"""
+
+    def initialize(self, unw_code, data, unw_info, file_offset):
+        self._long_offst = True
+        self._first = not hasattr(unw_info, "SizeOfEpilog")
+        super(PrologEpilogOpEpilogMarker, self).initialize(
+            unw_code, data, unw_info, file_offset
+        )
+        if self._first:
+            setattr(unw_info, "SizeOfEpilog", self.struct.Size)
+            self._long_offst = unw_code.OpInfo & 1 == 0
+        self._epilog_size = unw_info.SizeOfEpilog
+
+    def _get_format(self, unw_code):
+        # check if it is the first epilog code among encountered; then its record
+        # will contain size of the epilog
+        if self._first:
+            return (
+                "UNWIND_CODE_EPILOG",
+                ("B,OffsetLow,Size", "B:4,UnwindOp", "B:4,Flags")
+                if unw_code.OpInfo & 1 == 1
+                else (
+                    "B,Size",
+                    "B:4,UnwindOp",
+                    "B:4,Flags",
+                    "B,OffsetLow",
+                    "B:4,Unused",
+                    "B:4,OffsetHigh",
+                ),
+            )
+        else:
+            return (
+                "UNWIND_CODE_EPILOG",
+                ("B,OffsetLow", "B:4,UnwindOp", "B:4,OffsetHigh"),
+            )
+
+    def length_in_code_structures(self, unw_code, unw_info):
+        return (
+            2
+            if not hasattr(unw_info, "SizeOfEpilog") and (unw_code.OpInfo & 1) == 0
+            else 1
+        )
+
+    def get_offset(self):
+        return self.struct.OffsetLow | (
+            self.struct.OffsetHigh << 8 if self._long_offst else 0
+        )
+
+    def is_valid(self):
+        return self.get_offset() > 0
+
+    def __str__(self):
+        # the EPILOG sequence may have a terminating all-zeros entry
+        return (
+            "EPILOG: size="
+            + hex(self._epilog_size)
+            + ", offset from the end=-"
+            + hex(self.get_offset())
+            if self.get_offset() > 0
+            else ""
+        )
+
+
+class PrologEpilogOpsFactory:
+    """A factory for creating unwind codes based on the value of UnwindOp"""
+
+    _class_dict = {
+        UWOP_PUSH_NONVOL: PrologEpilogOpPushReg,
+        UWOP_ALLOC_LARGE: PrologEpilogOpAllocLarge,
+        UWOP_ALLOC_SMALL: PrologEpilogOpAllocSmall,
+        UWOP_SET_FPREG: PrologEpilogOpSetFP,
+        UWOP_SAVE_NONVOL: PrologEpilogOpSaveReg,
+        UWOP_SAVE_NONVOL_FAR: PrologEpilogOpSaveRegFar,
+        UWOP_SAVE_XMM128: PrologEpilogOpSaveXMM,
+        UWOP_SAVE_XMM128_FAR: PrologEpilogOpSaveXMMFar,
+        UWOP_PUSH_MACHFRAME: PrologEpilogOpPushFrame,
+        UWOP_EPILOG: PrologEpilogOpEpilogMarker,
+    }
+
+    @staticmethod
+    def create(unwcode):
+        code = unwcode.UnwindOp
+        return (
+            PrologEpilogOpsFactory._class_dict[code]()
+            if code in PrologEpilogOpsFactory._class_dict
+            else None
+        )
+
+
+# Valid FAT32 8.3 short filename characters according to:
+#  http://en.wikipedia.org/wiki/8.3_filename
+# This will help decide whether DLL ASCII names are likely
+# to be valid or otherwise corrupt data
+#
+# The filename length is not checked because the DLLs filename
+# can be longer that the 8.3
+
+allowed_filename = b(
+    string.ascii_lowercase
+    + string.ascii_uppercase
+    + string.digits
+    + "!#$%&'()-@^_`{}~+,.;=[]"
+)
+
+
+def is_valid_dos_filename(s):
+    if s is None or not isinstance(s, (str, bytes, bytearray)):
+        return False
+    # Allow path separators as import names can contain directories.
+    allowed = allowed_filename + b"\\/"
+    return all(c in allowed for c in set(s))
+
+
+# Check if an imported name uses the valid accepted characters expected in
+# mangled function names. If the symbol's characters don't fall within this
+# charset we will assume the name is invalid.
+# The dot "." character comes from: https://github.com/erocarrera/pefile/pull/346
+# All other symbols can be inserted by adding a name with that symbol to a .def file,
+# and passing it to link.exe (See export_test.py)
+allowed_function_name = b(
+    string.ascii_lowercase + string.ascii_uppercase + string.digits
+)
+
+
+@lru_cache(maxsize=2048)
+def is_valid_function_name(
+    s: Union[str, bytes, bytearray], relax_allowed_characters: bool = False
+) -> bool:
+    allowed_extra = b"._?@$()<>"
+    if relax_allowed_characters:
+        allowed_extra = b"!\"#$%&'()*+,-./:<>?[\\]^_`{|}~@"
+    return (
+        s is not None
+        and isinstance(s, (str, bytes, bytearray))
+        and all((c in allowed_function_name or c in allowed_extra) for c in set(s))
+    )
+
+
+class PE:
+    """A Portable Executable representation.
+
+    This class provides access to most of the information in a PE file.
+
+    It expects to be supplied the name of the file to load or PE data
+    to process and an optional argument 'fast_load' (False by default)
+    which controls whether to load all the directories information,
+    which can be quite time consuming.
+
+    pe = pefile.PE('module.dll')
+    pe = pefile.PE(name='module.dll')
+
+    would load 'module.dll' and process it. If the data is already
+    available in a buffer the same can be achieved with:
+
+    pe = pefile.PE(data=module_dll_data)
+
+    The "fast_load" can be set to a default by setting its value in the
+    module itself by means, for instance, of a "pefile.fast_load = True".
+    That will make all the subsequent instances not to load the
+    whole PE structure. The "full_load" method can be used to parse
+    the missing data at a later stage.
+
+    Basic headers information will be available in the attributes:
+
+    DOS_HEADER
+    NT_HEADERS
+    FILE_HEADER
+    OPTIONAL_HEADER
+
+    All of them will contain among their attributes the members of the
+    corresponding structures as defined in WINNT.H
+
+    The raw data corresponding to the header (from the beginning of the
+    file up to the start of the first section) will be available in the
+    instance's attribute 'header' as a string.
+
+    The sections will be available as a list in the 'sections' attribute.
+    Each entry will contain as attributes all the structure's members.
+
+    Directory entries will be available as attributes (if they exist):
+    (no other entries are processed at this point)
+
+    DIRECTORY_ENTRY_IMPORT (list of ImportDescData instances)
+    DIRECTORY_ENTRY_EXPORT (ExportDirData instance)
+    DIRECTORY_ENTRY_RESOURCE (ResourceDirData instance)
+    DIRECTORY_ENTRY_DEBUG (list of DebugData instances)
+    DIRECTORY_ENTRY_BASERELOC (list of BaseRelocationData instances)
+    DIRECTORY_ENTRY_TLS
+    DIRECTORY_ENTRY_BOUND_IMPORT (list of BoundImportData instances)
+
+    The following dictionary attributes provide ways of mapping different
+    constants. They will accept the numeric value and return the string
+    representation and the opposite, feed in the string and get the
+    numeric constant:
+
+    DIRECTORY_ENTRY
+    IMAGE_CHARACTERISTICS
+    SECTION_CHARACTERISTICS
+    DEBUG_TYPE
+    SUBSYSTEM_TYPE
+    MACHINE_TYPE
+    RELOCATION_TYPE
+    RESOURCE_TYPE
+    LANG
+    SUBLANG
+    """
+
+    #
+    # Format specifications for PE structures.
+    #
+
+    __IMAGE_DOS_HEADER_format__ = (
+        "IMAGE_DOS_HEADER",
+        (
+            "H,e_magic",
+            "H,e_cblp",
+            "H,e_cp",
+            "H,e_crlc",
+            "H,e_cparhdr",
+            "H,e_minalloc",
+            "H,e_maxalloc",
+            "H,e_ss",
+            "H,e_sp",
+            "H,e_csum",
+            "H,e_ip",
+            "H,e_cs",
+            "H,e_lfarlc",
+            "H,e_ovno",
+            "8s,e_res",
+            "H,e_oemid",
+            "H,e_oeminfo",
+            "20s,e_res2",
+            "I,e_lfanew",
+        ),
+    )
+
+    __IMAGE_FILE_HEADER_format__ = (
+        "IMAGE_FILE_HEADER",
+        (
+            "H,Machine",
+            "H,NumberOfSections",
+            "I,TimeDateStamp",
+            "I,PointerToSymbolTable",
+            "I,NumberOfSymbols",
+            "H,SizeOfOptionalHeader",
+            "H,Characteristics",
+        ),
+    )
+
+    __IMAGE_DATA_DIRECTORY_format__ = (
+        "IMAGE_DATA_DIRECTORY",
+        ("I,VirtualAddress", "I,Size"),
+    )
+
+    __IMAGE_OPTIONAL_HEADER_format__ = (
+        "IMAGE_OPTIONAL_HEADER",
+        (
+            "H,Magic",
+            "B,MajorLinkerVersion",
+            "B,MinorLinkerVersion",
+            "I,SizeOfCode",
+            "I,SizeOfInitializedData",
+            "I,SizeOfUninitializedData",
+            "I,AddressOfEntryPoint",
+            "I,BaseOfCode",
+            "I,BaseOfData",
+            "I,ImageBase",
+            "I,SectionAlignment",
+            "I,FileAlignment",
+            "H,MajorOperatingSystemVersion",
+            "H,MinorOperatingSystemVersion",
+            "H,MajorImageVersion",
+            "H,MinorImageVersion",
+            "H,MajorSubsystemVersion",
+            "H,MinorSubsystemVersion",
+            "I,Reserved1",
+            "I,SizeOfImage",
+            "I,SizeOfHeaders",
+            "I,CheckSum",
+            "H,Subsystem",
+            "H,DllCharacteristics",
+            "I,SizeOfStackReserve",
+            "I,SizeOfStackCommit",
+            "I,SizeOfHeapReserve",
+            "I,SizeOfHeapCommit",
+            "I,LoaderFlags",
+            "I,NumberOfRvaAndSizes",
+        ),
+    )
+
+    __IMAGE_OPTIONAL_HEADER64_format__ = (
+        "IMAGE_OPTIONAL_HEADER64",
+        (
+            "H,Magic",
+            "B,MajorLinkerVersion",
+            "B,MinorLinkerVersion",
+            "I,SizeOfCode",
+            "I,SizeOfInitializedData",
+            "I,SizeOfUninitializedData",
+            "I,AddressOfEntryPoint",
+            "I,BaseOfCode",
+            "Q,ImageBase",
+            "I,SectionAlignment",
+            "I,FileAlignment",
+            "H,MajorOperatingSystemVersion",
+            "H,MinorOperatingSystemVersion",
+            "H,MajorImageVersion",
+            "H,MinorImageVersion",
+            "H,MajorSubsystemVersion",
+            "H,MinorSubsystemVersion",
+            "I,Reserved1",
+            "I,SizeOfImage",
+            "I,SizeOfHeaders",
+            "I,CheckSum",
+            "H,Subsystem",
+            "H,DllCharacteristics",
+            "Q,SizeOfStackReserve",
+            "Q,SizeOfStackCommit",
+            "Q,SizeOfHeapReserve",
+            "Q,SizeOfHeapCommit",
+            "I,LoaderFlags",
+            "I,NumberOfRvaAndSizes",
+        ),
+    )
+
+    __IMAGE_NT_HEADERS_format__ = ("IMAGE_NT_HEADERS", ("I,Signature",))
+
+    __IMAGE_SECTION_HEADER_format__ = (
+        "IMAGE_SECTION_HEADER",
+        (
+            "8s,Name",
+            "I,Misc,Misc_PhysicalAddress,Misc_VirtualSize",
+            "I,VirtualAddress",
+            "I,SizeOfRawData",
+            "I,PointerToRawData",
+            "I,PointerToRelocations",
+            "I,PointerToLinenumbers",
+            "H,NumberOfRelocations",
+            "H,NumberOfLinenumbers",
+            "I,Characteristics",
+        ),
+    )
+
+    __IMAGE_DELAY_IMPORT_DESCRIPTOR_format__ = (
+        "IMAGE_DELAY_IMPORT_DESCRIPTOR",
+        (
+            "I,grAttrs",
+            "I,szName",
+            "I,phmod",
+            "I,pIAT",
+            "I,pINT",
+            "I,pBoundIAT",
+            "I,pUnloadIAT",
+            "I,dwTimeStamp",
+        ),
+    )
+
+    __IMAGE_IMPORT_DESCRIPTOR_format__ = (
+        "IMAGE_IMPORT_DESCRIPTOR",
+        (
+            "I,OriginalFirstThunk,Characteristics",
+            "I,TimeDateStamp",
+            "I,ForwarderChain",
+            "I,Name",
+            "I,FirstThunk",
+        ),
+    )
+
+    __IMAGE_EXPORT_DIRECTORY_format__ = (
+        "IMAGE_EXPORT_DIRECTORY",
+        (
+            "I,Characteristics",
+            "I,TimeDateStamp",
+            "H,MajorVersion",
+            "H,MinorVersion",
+            "I,Name",
+            "I,Base",
+            "I,NumberOfFunctions",
+            "I,NumberOfNames",
+            "I,AddressOfFunctions",
+            "I,AddressOfNames",
+            "I,AddressOfNameOrdinals",
+        ),
+    )
+
+    __IMAGE_RESOURCE_DIRECTORY_format__ = (
+        "IMAGE_RESOURCE_DIRECTORY",
+        (
+            "I,Characteristics",
+            "I,TimeDateStamp",
+            "H,MajorVersion",
+            "H,MinorVersion",
+            "H,NumberOfNamedEntries",
+            "H,NumberOfIdEntries",
+        ),
+    )
+
+    __IMAGE_RESOURCE_DIRECTORY_ENTRY_format__ = (
+        "IMAGE_RESOURCE_DIRECTORY_ENTRY",
+        ("I,Name", "I,OffsetToData"),
+    )
+
+    __IMAGE_RESOURCE_DATA_ENTRY_format__ = (
+        "IMAGE_RESOURCE_DATA_ENTRY",
+        ("I,OffsetToData", "I,Size", "I,CodePage", "I,Reserved"),
+    )
+
+    __VS_VERSIONINFO_format__ = (
+        "VS_VERSIONINFO",
+        ("H,Length", "H,ValueLength", "H,Type"),
+    )
+
+    __VS_FIXEDFILEINFO_format__ = (
+        "VS_FIXEDFILEINFO",
+        (
+            "I,Signature",
+            "I,StrucVersion",
+            "I,FileVersionMS",
+            "I,FileVersionLS",
+            "I,ProductVersionMS",
+            "I,ProductVersionLS",
+            "I,FileFlagsMask",
+            "I,FileFlags",
+            "I,FileOS",
+            "I,FileType",
+            "I,FileSubtype",
+            "I,FileDateMS",
+            "I,FileDateLS",
+        ),
+    )
+
+    __StringFileInfo_format__ = (
+        "StringFileInfo",
+        ("H,Length", "H,ValueLength", "H,Type"),
+    )
+
+    __StringTable_format__ = ("StringTable", ("H,Length", "H,ValueLength", "H,Type"))
+
+    __String_format__ = ("String", ("H,Length", "H,ValueLength", "H,Type"))
+
+    __Var_format__ = ("Var", ("H,Length", "H,ValueLength", "H,Type"))
+
+    __IMAGE_THUNK_DATA_format__ = (
+        "IMAGE_THUNK_DATA",
+        ("I,ForwarderString,Function,Ordinal,AddressOfData",),
+    )
+
+    __IMAGE_THUNK_DATA64_format__ = (
+        "IMAGE_THUNK_DATA",
+        ("Q,ForwarderString,Function,Ordinal,AddressOfData",),
+    )
+
+    __IMAGE_DEBUG_DIRECTORY_format__ = (
+        "IMAGE_DEBUG_DIRECTORY",
+        (
+            "I,Characteristics",
+            "I,TimeDateStamp",
+            "H,MajorVersion",
+            "H,MinorVersion",
+            "I,Type",
+            "I,SizeOfData",
+            "I,AddressOfRawData",
+            "I,PointerToRawData",
+        ),
+    )
+
+    __IMAGE_BASE_RELOCATION_format__ = (
+        "IMAGE_BASE_RELOCATION",
+        ("I,VirtualAddress", "I,SizeOfBlock"),
+    )
+
+    __IMAGE_BASE_RELOCATION_ENTRY_format__ = (
+        "IMAGE_BASE_RELOCATION_ENTRY",
+        ("H,Data",),
+    )
+
+    __IMAGE_IMPORT_CONTROL_TRANSFER_DYNAMIC_RELOCATION_format__ = (
+        "IMAGE_IMPORT_CONTROL_TRANSFER_DYNAMIC_RELOCATION",
+        ("I:12,PageRelativeOffset", "I:1,IndirectCall", "I:19,IATIndex"),
+    )
+
+    __IMAGE_INDIR_CONTROL_TRANSFER_DYNAMIC_RELOCATION_format__ = (
+        "IMAGE_INDIR_CONTROL_TRANSFER_DYNAMIC_RELOCATION",
+        (
+            "I:12,PageRelativeOffset",
+            "I:1,IndirectCall",
+            "I:1,RexWPrefix",
+            "I:1,CfgCheck",
+            "I:1,Reserved",
+        ),
+    )
+
+    __IMAGE_SWITCHTABLE_BRANCH_DYNAMIC_RELOCATION_format__ = (
+        "IMAGE_SWITCHTABLE_BRANCH_DYNAMIC_RELOCATION",
+        ("I:12,PageRelativeOffset", "I:4,RegisterNumber"),
+    )
+
+    __IMAGE_TLS_DIRECTORY_format__ = (
+        "IMAGE_TLS_DIRECTORY",
+        (
+            "I,StartAddressOfRawData",
+            "I,EndAddressOfRawData",
+            "I,AddressOfIndex",
+            "I,AddressOfCallBacks",
+            "I,SizeOfZeroFill",
+            "I,Characteristics",
+        ),
+    )
+
+    __IMAGE_TLS_DIRECTORY64_format__ = (
+        "IMAGE_TLS_DIRECTORY",
+        (
+            "Q,StartAddressOfRawData",
+            "Q,EndAddressOfRawData",
+            "Q,AddressOfIndex",
+            "Q,AddressOfCallBacks",
+            "I,SizeOfZeroFill",
+            "I,Characteristics",
+        ),
+    )
+
+    __IMAGE_LOAD_CONFIG_DIRECTORY_format__ = (
+        "IMAGE_LOAD_CONFIG_DIRECTORY",
+        (
+            "I,Size",
+            "I,TimeDateStamp",
+            "H,MajorVersion",
+            "H,MinorVersion",
+            "I,GlobalFlagsClear",
+            "I,GlobalFlagsSet",
+            "I,CriticalSectionDefaultTimeout",
+            "I,DeCommitFreeBlockThreshold",
+            "I,DeCommitTotalFreeThreshold",
+            "I,LockPrefixTable",
+            "I,MaximumAllocationSize",
+            "I,VirtualMemoryThreshold",
+            "I,ProcessHeapFlags",
+            "I,ProcessAffinityMask",
+            "H,CSDVersion",
+            "H,Reserved1",
+            "I,EditList",
+            "I,SecurityCookie",
+            "I,SEHandlerTable",
+            "I,SEHandlerCount",
+            "I,GuardCFCheckFunctionPointer",
+            "I,GuardCFDispatchFunctionPointer",
+            "I,GuardCFFunctionTable",
+            "I,GuardCFFunctionCount",
+            "I,GuardFlags",
+            "H,CodeIntegrityFlags",
+            "H,CodeIntegrityCatalog",
+            "I,CodeIntegrityCatalogOffset",
+            "I,CodeIntegrityReserved",
+            "I,GuardAddressTakenIatEntryTable",
+            "I,GuardAddressTakenIatEntryCount",
+            "I,GuardLongJumpTargetTable",
+            "I,GuardLongJumpTargetCount",
+            "I,DynamicValueRelocTable",
+            "I,CHPEMetadataPointer",
+            "I,GuardRFFailureRoutine",
+            "I,GuardRFFailureRoutineFunctionPointer",
+            "I,DynamicValueRelocTableOffset",
+            "H,DynamicValueRelocTableSection",
+            "H,Reserved2",
+            "I,GuardRFVerifyStackPointerFunctionPointer" "I,HotPatchTableOffset",
+            "I,Reserved3",
+            "I,EnclaveConfigurationPointer",
+        ),
+    )
+
+    __IMAGE_LOAD_CONFIG_DIRECTORY64_format__ = (
+        "IMAGE_LOAD_CONFIG_DIRECTORY",
+        (
+            "I,Size",
+            "I,TimeDateStamp",
+            "H,MajorVersion",
+            "H,MinorVersion",
+            "I,GlobalFlagsClear",
+            "I,GlobalFlagsSet",
+            "I,CriticalSectionDefaultTimeout",
+            "Q,DeCommitFreeBlockThreshold",
+            "Q,DeCommitTotalFreeThreshold",
+            "Q,LockPrefixTable",
+            "Q,MaximumAllocationSize",
+            "Q,VirtualMemoryThreshold",
+            "Q,ProcessAffinityMask",
+            "I,ProcessHeapFlags",
+            "H,CSDVersion",
+            "H,Reserved1",
+            "Q,EditList",
+            "Q,SecurityCookie",
+            "Q,SEHandlerTable",
+            "Q,SEHandlerCount",
+            "Q,GuardCFCheckFunctionPointer",
+            "Q,GuardCFDispatchFunctionPointer",
+            "Q,GuardCFFunctionTable",
+            "Q,GuardCFFunctionCount",
+            "I,GuardFlags",
+            "H,CodeIntegrityFlags",
+            "H,CodeIntegrityCatalog",
+            "I,CodeIntegrityCatalogOffset",
+            "I,CodeIntegrityReserved",
+            "Q,GuardAddressTakenIatEntryTable",
+            "Q,GuardAddressTakenIatEntryCount",
+            "Q,GuardLongJumpTargetTable",
+            "Q,GuardLongJumpTargetCount",
+            "Q,DynamicValueRelocTable",
+            "Q,CHPEMetadataPointer",
+            "Q,GuardRFFailureRoutine",
+            "Q,GuardRFFailureRoutineFunctionPointer",
+            "I,DynamicValueRelocTableOffset",
+            "H,DynamicValueRelocTableSection",
+            "H,Reserved2",
+            "Q,GuardRFVerifyStackPointerFunctionPointer",
+            "I,HotPatchTableOffset",
+            "I,Reserved3",
+            "Q,EnclaveConfigurationPointer",
+        ),
+    )
+
+    __IMAGE_DYNAMIC_RELOCATION_TABLE_format__ = (
+        "IMAGE_DYNAMIC_RELOCATION_TABLE",
+        ("I,Version", "I,Size"),
+    )
+
+    __IMAGE_DYNAMIC_RELOCATION_format__ = (
+        "IMAGE_DYNAMIC_RELOCATION",
+        ("I,Symbol", "I,BaseRelocSize"),
+    )
+
+    __IMAGE_DYNAMIC_RELOCATION64_format__ = (
+        "IMAGE_DYNAMIC_RELOCATION64",
+        ("Q,Symbol", "I,BaseRelocSize"),
+    )
+
+    __IMAGE_DYNAMIC_RELOCATION_V2_format__ = (
+        "IMAGE_DYNAMIC_RELOCATION_V2",
+        ("I,HeaderSize", "I,FixupInfoSize", "I,Symbol", "I,SymbolGroup", "I,Flags"),
+    )
+
+    __IMAGE_DYNAMIC_RELOCATION64_V2_format__ = (
+        "IMAGE_DYNAMIC_RELOCATION64_V2",
+        ("I,HeaderSize", "I,FixupInfoSize", "Q,Symbol", "I,SymbolGroup", "I,Flags"),
+    )
+
+    __IMAGE_BOUND_IMPORT_DESCRIPTOR_format__ = (
+        "IMAGE_BOUND_IMPORT_DESCRIPTOR",
+        ("I,TimeDateStamp", "H,OffsetModuleName", "H,NumberOfModuleForwarderRefs"),
+    )
+
+    __IMAGE_BOUND_FORWARDER_REF_format__ = (
+        "IMAGE_BOUND_FORWARDER_REF",
+        ("I,TimeDateStamp", "H,OffsetModuleName", "H,Reserved"),
+    )
+
+    __RUNTIME_FUNCTION_format__ = (
+        "RUNTIME_FUNCTION",
+        ("I,BeginAddress", "I,EndAddress", "I,UnwindData"),
+    )
+
+    def __init__(
+        self,
+        name=None,
+        data=None,
+        fast_load=None,
+        max_symbol_exports=MAX_SYMBOL_EXPORT_COUNT,
+        max_repeated_symbol=120,
+    ):
+
+        self.max_symbol_exports = max_symbol_exports
+        self.max_repeated_symbol = max_repeated_symbol
+
+        self._get_section_by_rva_last_used = None
+
+        self.sections = []
+
+        self.__warnings = []
+
+        self.PE_TYPE = None
+
+        if name is None and data is None:
+            raise ValueError("Must supply either name or data")
+
+        # This list will keep track of all the structures created.
+        # That will allow for an easy iteration through the list
+        # in order to save the modifications made
+        self.__structures__ = []
+        self.__from_file = None
+
+        # We only want to print these warnings once
+        self.FileAlignment_Warning = False
+        self.SectionAlignment_Warning = False
+
+        # Count of total resource entries across nested tables
+        self.__total_resource_entries_count = 0
+        # Sum of the size of all resource entries parsed, which should not
+        # exceed the file size.
+        self.__total_resource_bytes = 0
+        # The number of imports parsed in this file
+        self.__total_import_symbols = 0
+
+        self.dynamic_relocation_format_by_symbol = {
+            3: PE.__IMAGE_IMPORT_CONTROL_TRANSFER_DYNAMIC_RELOCATION_format__,
+            4: PE.__IMAGE_INDIR_CONTROL_TRANSFER_DYNAMIC_RELOCATION_format__,
+            5: PE.__IMAGE_SWITCHTABLE_BRANCH_DYNAMIC_RELOCATION_format__,
+        }
+
+        fast_load = fast_load if fast_load is not None else globals()["fast_load"]
+        try:
+            self.__parse__(name, data, fast_load)
+        except:
+            self.close()
+            raise
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type, value, traceback):
+        self.close()
+
+    def close(self):
+        if (
+            self.__from_file is True
+            and hasattr(self, "__data__")
+            and (
+                (isinstance(mmap.mmap, type) and isinstance(self.__data__, mmap.mmap))
+                or "mmap.mmap" in repr(type(self.__data__))
+            )
+        ):
+            self.__data__.close()
+            del self.__data__
+
+    def __unpack_data__(self, format, data, file_offset):
+        """Apply structure format to raw data.
+
+        Returns an unpacked structure object if successful, None otherwise.
+        """
+
+        structure = Structure(format, file_offset=file_offset)
+
+        try:
+            structure.__unpack__(data)
+        except PEFormatError as err:
+            self.__warnings.append(
+                'Corrupt header "{0}" at file offset {1}. Exception: {2}'.format(
+                    format[0], file_offset, err
+                )
+            )
+            return None
+
+        self.__structures__.append(structure)
+
+        return structure
+
+    def __unpack_data_with_bitfields__(self, format, data, file_offset):
+        """Apply structure format to raw data.
+
+        Returns an unpacked structure object if successful, None otherwise.
+        """
+
+        structure = StructureWithBitfields(format, file_offset=file_offset)
+
+        try:
+            structure.__unpack__(data)
+        except PEFormatError as err:
+            self.__warnings.append(
+                'Corrupt header "{0}" at file offset {1}. Exception: {2}'.format(
+                    format[0], file_offset, err
+                )
+            )
+            return None
+
+        self.__structures__.append(structure)
+
+        return structure
+
+    def __parse__(self, fname, data, fast_load):
+        """Parse a Portable Executable file.
+
+        Loads a PE file, parsing all its structures and making them available
+        through the instance's attributes.
+        """
+
+        if fname is not None:
+            stat = os.stat(fname)
+            if stat.st_size == 0:
+                raise PEFormatError("The file is empty")
+            fd = None
+            try:
+                fd = open(fname, "rb")
+                self.fileno = fd.fileno()
+                if hasattr(mmap, "MAP_PRIVATE"):
+                    # Unix
+                    self.__data__ = mmap.mmap(self.fileno, 0, mmap.MAP_PRIVATE)
+                else:
+                    # Windows
+                    self.__data__ = mmap.mmap(self.fileno, 0, access=mmap.ACCESS_READ)
+                self.__from_file = True
+            except IOError as excp:
+                exception_msg = "{0}".format(excp)
+                exception_msg = exception_msg and (": %s" % exception_msg)
+                raise Exception(
+                    "Unable to access file '{0}'{1}".format(fname, exception_msg)
+                )
+            finally:
+                if fd is not None:
+                    fd.close()
+        elif data is not None:
+            self.__data__ = data
+            self.__from_file = False
+
+        # Resources should not overlap each other, so they should not exceed the
+        # file size.
+        self.__resource_size_limit_upperbounds = len(self.__data__)
+        self.__resource_size_limit_reached = False
+
+        if not fast_load:
+            for byte, byte_count in Counter(bytearray(self.__data__)).items():
+                # Only report the cases where a byte makes up for more than 50% (if
+                # zero) or 15% (if non-zero) of the file's contents. There are
+                # legitimate PEs where 0x00 bytes are close to 50% of the whole
+                # file's contents.
+                if (byte == 0 and byte_count / len(self.__data__) > 0.5) or (
+                    byte != 0 and byte_count / len(self.__data__) > 0.15
+                ):
+                    self.__warnings.append(
+                        (
+                            "Byte 0x{0:02x} makes up {1:.4f}% of the file's contents."
+                            " This may indicate truncation / malformation."
+                        ).format(byte, 100.0 * byte_count / len(self.__data__))
+                    )
+
+        dos_header_data = self.__data__[:64]
+        if len(dos_header_data) != 64:
+            raise PEFormatError(
+                "Unable to read the DOS Header, possibly a truncated file."
+            )
+
+        self.DOS_HEADER = self.__unpack_data__(
+            self.__IMAGE_DOS_HEADER_format__, dos_header_data, file_offset=0
+        )
+
+        if self.DOS_HEADER.e_magic == IMAGE_DOSZM_SIGNATURE:
+            raise PEFormatError("Probably a ZM Executable (not a PE file).")
+        if not self.DOS_HEADER or self.DOS_HEADER.e_magic != IMAGE_DOS_SIGNATURE:
+            raise PEFormatError("DOS Header magic not found.")
+
+        # OC Patch:
+        # Check for sane value in e_lfanew
+        #
+        if self.DOS_HEADER.e_lfanew > len(self.__data__):
+            raise PEFormatError("Invalid e_lfanew value, probably not a PE file")
+
+        nt_headers_offset = self.DOS_HEADER.e_lfanew
+
+        self.NT_HEADERS = self.__unpack_data__(
+            self.__IMAGE_NT_HEADERS_format__,
+            self.__data__[nt_headers_offset : nt_headers_offset + 8],
+            file_offset=nt_headers_offset,
+        )
+
+        # We better check the signature right here, before the file screws
+        # around with sections:
+        # OC Patch:
+        # Some malware will cause the Signature value to not exist at all
+        if not self.NT_HEADERS or not self.NT_HEADERS.Signature:
+            raise PEFormatError("NT Headers not found.")
+
+        if (0xFFFF & self.NT_HEADERS.Signature) == IMAGE_NE_SIGNATURE:
+            raise PEFormatError("Invalid NT Headers signature. Probably a NE file")
+        if (0xFFFF & self.NT_HEADERS.Signature) == IMAGE_LE_SIGNATURE:
+            raise PEFormatError("Invalid NT Headers signature. Probably a LE file")
+        if (0xFFFF & self.NT_HEADERS.Signature) == IMAGE_LX_SIGNATURE:
+            raise PEFormatError("Invalid NT Headers signature. Probably a LX file")
+        if (0xFFFF & self.NT_HEADERS.Signature) == IMAGE_TE_SIGNATURE:
+            raise PEFormatError("Invalid NT Headers signature. Probably a TE file")
+        if self.NT_HEADERS.Signature != IMAGE_NT_SIGNATURE:
+            raise PEFormatError("Invalid NT Headers signature.")
+
+        self.FILE_HEADER = self.__unpack_data__(
+            self.__IMAGE_FILE_HEADER_format__,
+            self.__data__[nt_headers_offset + 4 : nt_headers_offset + 4 + 32],
+            file_offset=nt_headers_offset + 4,
+        )
+        image_flags = retrieve_flags(IMAGE_CHARACTERISTICS, "IMAGE_FILE_")
+
+        if not self.FILE_HEADER:
+            raise PEFormatError("File Header missing")
+
+        # Set the image's flags according the the Characteristics member
+        set_flags(self.FILE_HEADER, self.FILE_HEADER.Characteristics, image_flags)
+
+        optional_header_offset = nt_headers_offset + 4 + self.FILE_HEADER.sizeof()
+
+        # Note: location of sections can be controlled from PE header:
+        sections_offset = optional_header_offset + self.FILE_HEADER.SizeOfOptionalHeader
+
+        self.OPTIONAL_HEADER = self.__unpack_data__(
+            self.__IMAGE_OPTIONAL_HEADER_format__,
+            # Read up to 256 bytes to allow creating a copy of too much data
+            self.__data__[optional_header_offset : optional_header_offset + 256],
+            file_offset=optional_header_offset,
+        )
+
+        # According to solardesigner's findings for his
+        # Tiny PE project, the optional header does not
+        # need fields beyond "Subsystem" in order to be
+        # loadable by the Windows loader (given that zeros
+        # are acceptable values and the header is loaded
+        # in a zeroed memory page)
+        # If trying to parse a full Optional Header fails
+        # we try to parse it again with some 0 padding
+        #
+        MINIMUM_VALID_OPTIONAL_HEADER_RAW_SIZE = 69
+
+        if (
+            self.OPTIONAL_HEADER is None
+            and len(
+                self.__data__[optional_header_offset : optional_header_offset + 0x200]
+            )
+            >= MINIMUM_VALID_OPTIONAL_HEADER_RAW_SIZE
+        ):
+
+            # Add enough zeros to make up for the unused fields
+            #
+            padding_length = 128
+
+            # Create padding
+            #
+            padded_data = self.__data__[
+                optional_header_offset : optional_header_offset + 0x200
+            ] + (b"\0" * padding_length)
+
+            self.OPTIONAL_HEADER = self.__unpack_data__(
+                self.__IMAGE_OPTIONAL_HEADER_format__,
+                padded_data,
+                file_offset=optional_header_offset,
+            )
+
+        # Check the Magic in the OPTIONAL_HEADER and set the PE file
+        # type accordingly
+        #
+        if self.OPTIONAL_HEADER is not None:
+
+            if self.OPTIONAL_HEADER.Magic == OPTIONAL_HEADER_MAGIC_PE:
+
+                self.PE_TYPE = OPTIONAL_HEADER_MAGIC_PE
+
+            elif self.OPTIONAL_HEADER.Magic == OPTIONAL_HEADER_MAGIC_PE_PLUS:
+
+                self.PE_TYPE = OPTIONAL_HEADER_MAGIC_PE_PLUS
+
+                self.OPTIONAL_HEADER = self.__unpack_data__(
+                    self.__IMAGE_OPTIONAL_HEADER64_format__,
+                    self.__data__[
+                        optional_header_offset : optional_header_offset + 0x200
+                    ],
+                    file_offset=optional_header_offset,
+                )
+
+                # Again, as explained above, we try to parse
+                # a reduced form of the Optional Header which
+                # is still valid despite not including all
+                # structure members
+                #
+                MINIMUM_VALID_OPTIONAL_HEADER_RAW_SIZE = 69 + 4
+
+                if (
+                    self.OPTIONAL_HEADER is None
+                    and len(
+                        self.__data__[
+                            optional_header_offset : optional_header_offset + 0x200
+                        ]
+                    )
+                    >= MINIMUM_VALID_OPTIONAL_HEADER_RAW_SIZE
+                ):
+
+                    padding_length = 128
+                    padded_data = self.__data__[
+                        optional_header_offset : optional_header_offset + 0x200
+                    ] + (b"\0" * padding_length)
+                    self.OPTIONAL_HEADER = self.__unpack_data__(
+                        self.__IMAGE_OPTIONAL_HEADER64_format__,
+                        padded_data,
+                        file_offset=optional_header_offset,
+                    )
+
+        if not self.FILE_HEADER:
+            raise PEFormatError("File Header missing")
+
+        # OC Patch:
+        # Die gracefully if there is no OPTIONAL_HEADER field
+        # 975440f5ad5e2e4a92c4d9a5f22f75c1
+        if self.OPTIONAL_HEADER is None:
+            raise PEFormatError("No Optional Header found, invalid PE32 or PE32+ file.")
+        if self.PE_TYPE is None:
+            self.__warnings.append(
+                "Invalid type 0x{0:04x} in Optional Header.".format(
+                    self.OPTIONAL_HEADER.Magic
+                )
+            )
+
+        dll_characteristics_flags = retrieve_flags(
+            DLL_CHARACTERISTICS, "IMAGE_DLLCHARACTERISTICS_"
+        )
+
+        # Set the Dll Characteristics flags according the the DllCharacteristics member
+        set_flags(
+            self.OPTIONAL_HEADER,
+            self.OPTIONAL_HEADER.DllCharacteristics,
+            dll_characteristics_flags,
+        )
+
+        self.OPTIONAL_HEADER.DATA_DIRECTORY = []
+        # offset = (optional_header_offset + self.FILE_HEADER.SizeOfOptionalHeader)
+        offset = optional_header_offset + self.OPTIONAL_HEADER.sizeof()
+
+        self.NT_HEADERS.FILE_HEADER = self.FILE_HEADER
+        self.NT_HEADERS.OPTIONAL_HEADER = self.OPTIONAL_HEADER
+
+        # Windows 8 specific check
+        #
+        if (
+            self.OPTIONAL_HEADER.AddressOfEntryPoint
+            < self.OPTIONAL_HEADER.SizeOfHeaders
+        ):
+            self.__warnings.append(
+                "SizeOfHeaders is smaller than AddressOfEntryPoint: this file "
+                "cannot run under Windows 8."
+            )
+
+        # The NumberOfRvaAndSizes is sanitized to stay within
+        # reasonable limits so can be casted to an int
+        #
+        if self.OPTIONAL_HEADER.NumberOfRvaAndSizes > 0x10:
+            self.__warnings.append(
+                "Suspicious NumberOfRvaAndSizes in the Optional Header. "
+                "Normal values are never larger than 0x10, the value is: 0x%x"
+                % self.OPTIONAL_HEADER.NumberOfRvaAndSizes
+            )
+
+        MAX_ASSUMED_VALID_NUMBER_OF_RVA_AND_SIZES = 0x100
+        for i in range(int(0x7FFFFFFF & self.OPTIONAL_HEADER.NumberOfRvaAndSizes)):
+
+            if len(self.__data__) - offset == 0:
+                break
+
+            if len(self.__data__) - offset < 8:
+                data = self.__data__[offset:] + b"\0" * 8
+            else:
+                data = self.__data__[
+                    offset : offset + MAX_ASSUMED_VALID_NUMBER_OF_RVA_AND_SIZES
+                ]
+
+            dir_entry = self.__unpack_data__(
+                self.__IMAGE_DATA_DIRECTORY_format__, data, file_offset=offset
+            )
+
+            if dir_entry is None:
+                break
+
+            # Would fail if missing an entry
+            # 1d4937b2fa4d84ad1bce0309857e70ca offending sample
+            try:
+                dir_entry.name = DIRECTORY_ENTRY[i]
+            except (KeyError, AttributeError):
+                break
+
+            offset += dir_entry.sizeof()
+
+            self.OPTIONAL_HEADER.DATA_DIRECTORY.append(dir_entry)
+
+            # If the offset goes outside the optional header,
+            # the loop is broken, regardless of how many directories
+            # NumberOfRvaAndSizes says there are
+            #
+            # We assume a normally sized optional header, hence that we do
+            # a sizeof() instead of reading SizeOfOptionalHeader.
+            # Then we add a default number of directories times their size,
+            # if we go beyond that, we assume the number of directories
+            # is wrong and stop processing
+            if offset >= (
+                optional_header_offset + self.OPTIONAL_HEADER.sizeof() + 8 * 16
+            ):
+
+                break
+
+        offset = self.parse_sections(sections_offset)
+
+        # OC Patch:
+        # There could be a problem if there are no raw data sections
+        # greater than 0
+        # fc91013eb72529da005110a3403541b6 example
+        # Should this throw an exception in the minimum header offset
+        # can't be found?
+        #
+        rawDataPointers = [
+            self.adjust_FileAlignment(
+                s.PointerToRawData, self.OPTIONAL_HEADER.FileAlignment
+            )
+            for s in self.sections
+            if s.PointerToRawData > 0
+        ]
+
+        if len(rawDataPointers) > 0:
+            lowest_section_offset = min(rawDataPointers)
+        else:
+            lowest_section_offset = None
+
+        if not lowest_section_offset or lowest_section_offset < offset:
+            self.header = self.__data__[:offset]
+        else:
+            self.header = self.__data__[:lowest_section_offset]
+
+        # Check whether the entry point lies within a section
+        #
+        if (
+            self.get_section_by_rva(self.OPTIONAL_HEADER.AddressOfEntryPoint)
+            is not None
+        ):
+
+            # Check whether the entry point lies within the file
+            #
+            ep_offset = self.get_offset_from_rva(
+                self.OPTIONAL_HEADER.AddressOfEntryPoint
+            )
+            if ep_offset > len(self.__data__):
+
+                self.__warnings.append(
+                    "Possibly corrupt file. AddressOfEntryPoint lies outside the"
+                    " file. AddressOfEntryPoint: 0x%x"
+                    % self.OPTIONAL_HEADER.AddressOfEntryPoint
+                )
+
+        else:
+
+            self.__warnings.append(
+                "AddressOfEntryPoint lies outside the sections' boundaries. "
+                "AddressOfEntryPoint: 0x%x" % self.OPTIONAL_HEADER.AddressOfEntryPoint
+            )
+
+        if not fast_load:
+            self.full_load()
+
+    def parse_rich_header(self):
+        """Parses the rich header
+        see http://www.ntcore.com/files/richsign.htm for more information
+
+        Structure:
+        00 DanS ^ checksum, checksum, checksum, checksum
+        10 Symbol RVA ^ checksum, Symbol size ^ checksum...
+        ...
+        XX Rich, checksum, 0, 0,...
+        """
+
+        # Rich Header constants
+        #
+        DANS = 0x536E6144  # 'DanS' as dword
+        RICH = 0x68636952  # 'Rich' as dword
+
+        rich_index = self.__data__.find(
+            b"Rich", 0x80, self.OPTIONAL_HEADER.get_file_offset()
+        )
+        if rich_index == -1:
+            return None
+
+        # Read a block of data
+        try:
+            # The end of the structure is 8 bytes after the start of the Rich
+            # string.
+            rich_data = self.__data__[0x80 : rich_index + 8]
+            # Make the data have length a multiple of 4, otherwise the
+            # subsequent parsing will fail. It's not impossible that we retrieve
+            # truncated data that it's not a multiple.
+            rich_data = rich_data[: 4 * int(len(rich_data) / 4)]
+            data = list(
+                struct.unpack("<{0}I".format(int(len(rich_data) / 4)), rich_data)
+            )
+            if RICH not in data:
+                return None
+        except PEFormatError:
+            return None
+
+        # get key, raw_data and clear_data
+        key = struct.pack("", warning)
+
+    def full_load(self):
+        """Process the data directories.
+
+        This method will load the data directories which might not have
+        been loaded if the "fast_load" option was used.
+        """
+
+        self.parse_data_directories()
+
+        class RichHeader:
+            pass
+
+        rich_header = self.parse_rich_header()
+        if rich_header:
+            self.RICH_HEADER = RichHeader()
+            self.RICH_HEADER.checksum = rich_header.get("checksum", None)
+            self.RICH_HEADER.values = rich_header.get("values", None)
+            self.RICH_HEADER.key = rich_header.get("key", None)
+            self.RICH_HEADER.raw_data = rich_header.get("raw_data", None)
+            self.RICH_HEADER.clear_data = rich_header.get("clear_data", None)
+        else:
+            self.RICH_HEADER = None
+
+    def write(self, filename=None):
+        """Write the PE file.
+
+        This function will process all headers and components
+        of the PE file and include all changes made (by just
+        assigning to attributes in the PE objects) and write
+        the changes back to a file whose name is provided as
+        an argument. The filename is optional, if not
+        provided the data will be returned as a 'str' object.
+        """
+
+        file_data = bytearray(self.__data__)
+
+        for structure in self.__structures__:
+            struct_data = bytearray(structure.__pack__())
+            offset = structure.get_file_offset()
+            file_data[offset : offset + len(struct_data)] = struct_data
+
+        if hasattr(self, "VS_VERSIONINFO"):
+            if hasattr(self, "FileInfo"):
+                for finfo in self.FileInfo:
+                    for entry in finfo:
+                        if hasattr(entry, "StringTable"):
+                            for st_entry in entry.StringTable:
+                                for key, entry in list(st_entry.entries.items()):
+
+                                    # Offsets and lengths of the keys and values.
+                                    # Each value in the dictionary is a tuple:
+                                    #  (key length, value length)
+                                    # The lengths are in characters, not in bytes.
+                                    offsets = st_entry.entries_offsets[key]
+                                    lengths = st_entry.entries_lengths[key]
+
+                                    if len(entry) > lengths[1]:
+                                        l = entry.decode("utf-8").encode("utf-16le")
+                                        file_data[
+                                            offsets[1] : offsets[1] + lengths[1] * 2
+                                        ] = l[: lengths[1] * 2]
+                                    else:
+                                        encoded_data = entry.decode("utf-8").encode(
+                                            "utf-16le"
+                                        )
+                                        file_data[
+                                            offsets[1] : offsets[1] + len(encoded_data)
+                                        ] = encoded_data
+
+        new_file_data = file_data
+        if not filename:
+            return new_file_data
+
+        f = open(filename, "wb+")
+        f.write(new_file_data)
+        f.close()
+        return
+
+    def parse_sections(self, offset):
+        """Fetch the PE file sections.
+
+        The sections will be readily available in the "sections" attribute.
+        Its attributes will contain all the section information plus "data"
+        a buffer containing the section's data.
+
+        The "Characteristics" member will be processed and attributes
+        representing the section characteristics (with the 'IMAGE_SCN_'
+        string trimmed from the constant's names) will be added to the
+        section instance.
+
+        Refer to the SectionStructure class for additional info.
+        """
+
+        self.sections = []
+        MAX_SIMULTANEOUS_ERRORS = 3
+        for i in range(self.FILE_HEADER.NumberOfSections):
+            if i >= MAX_SECTIONS:
+                self.__warnings.append(
+                    "Too many sections {0} (>={1})".format(
+                        self.FILE_HEADER.NumberOfSections, MAX_SECTIONS
+                    )
+                )
+                break
+            simultaneous_errors = 0
+            section = SectionStructure(self.__IMAGE_SECTION_HEADER_format__, pe=self)
+            if not section:
+                break
+            section_offset = offset + section.sizeof() * i
+            section.set_file_offset(section_offset)
+            section_data = self.__data__[
+                section_offset : section_offset + section.sizeof()
+            ]
+            # Check if the section is all nulls and stop if so.
+            if count_zeroes(section_data) == section.sizeof():
+                self.__warnings.append(f"Invalid section {i}. Contents are null-bytes.")
+                break
+            if not section_data:
+                self.__warnings.append(
+                    f"Invalid section {i}. No data in the file (is this corkami's "
+                    "virtsectblXP?)."
+                )
+                break
+            section.__unpack__(section_data)
+            self.__structures__.append(section)
+
+            if section.SizeOfRawData + section.PointerToRawData > len(self.__data__):
+                simultaneous_errors += 1
+                self.__warnings.append(
+                    f"Error parsing section {i}. SizeOfRawData is larger than file."
+                )
+
+            if self.adjust_FileAlignment(
+                section.PointerToRawData, self.OPTIONAL_HEADER.FileAlignment
+            ) > len(self.__data__):
+                simultaneous_errors += 1
+                self.__warnings.append(
+                    f"Error parsing section {i}. PointerToRawData points beyond "
+                    "the end of the file."
+                )
+
+            if section.Misc_VirtualSize > 0x10000000:
+                simultaneous_errors += 1
+                self.__warnings.append(
+                    f"Suspicious value found parsing section {i}. VirtualSize is "
+                    "extremely large > 256MiB."
+                )
+
+            if (
+                self.adjust_SectionAlignment(
+                    section.VirtualAddress,
+                    self.OPTIONAL_HEADER.SectionAlignment,
+                    self.OPTIONAL_HEADER.FileAlignment,
+                )
+                > 0x10000000
+            ):
+                simultaneous_errors += 1
+                self.__warnings.append(
+                    f"Suspicious value found parsing section {i}. VirtualAddress is "
+                    "beyond 0x10000000."
+                )
+
+            if (
+                self.OPTIONAL_HEADER.FileAlignment != 0
+                and (section.PointerToRawData % self.OPTIONAL_HEADER.FileAlignment) != 0
+            ):
+                simultaneous_errors += 1
+                self.__warnings.append(
+                    (
+                        f"Error parsing section {i}. "
+                        "PointerToRawData should normally be "
+                        "a multiple of FileAlignment, this might imply the file "
+                        "is trying to confuse tools which parse this incorrectly."
+                    )
+                )
+
+            if simultaneous_errors >= MAX_SIMULTANEOUS_ERRORS:
+                self.__warnings.append("Too many warnings parsing section. Aborting.")
+                break
+
+            section_flags = retrieve_flags(SECTION_CHARACTERISTICS, "IMAGE_SCN_")
+
+            # Set the section's flags according the the Characteristics member
+            set_flags(section, section.Characteristics, section_flags)
+
+            if section.__dict__.get(
+                "IMAGE_SCN_MEM_WRITE", False
+            ) and section.__dict__.get("IMAGE_SCN_MEM_EXECUTE", False):
+
+                if section.Name.rstrip(b"\x00") == b"PAGE" and self.is_driver():
+                    # Drivers can have a PAGE section with those flags set without
+                    # implying that it is malicious
+                    pass
+                else:
+                    self.__warnings.append(
+                        f"Suspicious flags set for section {i}. "
+                        "Both IMAGE_SCN_MEM_WRITE and IMAGE_SCN_MEM_EXECUTE are set. "
+                        "This might indicate a packed executable."
+                    )
+
+            self.sections.append(section)
+
+        # Sort the sections by their VirtualAddress and add a field to each of them
+        # with the VirtualAddress of the next section. This will allow to check
+        # for potentially overlapping sections in badly constructed PEs.
+        self.sections.sort(key=lambda a: a.VirtualAddress)
+        for idx, section in enumerate(self.sections):
+            if idx == len(self.sections) - 1:
+                section.next_section_virtual_address = None
+            else:
+                section.next_section_virtual_address = self.sections[
+                    idx + 1
+                ].VirtualAddress
+
+        if self.FILE_HEADER.NumberOfSections > 0 and self.sections:
+            return (
+                offset + self.sections[0].sizeof() * self.FILE_HEADER.NumberOfSections
+            )
+        else:
+            return offset
+
+    def parse_data_directories(
+        self, directories=None, forwarded_exports_only=False, import_dllnames_only=False
+    ):
+        """Parse and process the PE file's data directories.
+
+        If the optional argument 'directories' is given, only
+        the directories at the specified indexes will be parsed.
+        Such functionality allows parsing of areas of interest
+        without the burden of having to parse all others.
+        The directories can then be specified as:
+
+        For export / import only:
+
+          directories = [ 0, 1 ]
+
+        or (more verbosely):
+
+          directories = [ DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_IMPORT'],
+            DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_EXPORT'] ]
+
+        If 'directories' is a list, the ones that are processed will be removed,
+        leaving only the ones that are not present in the image.
+
+        If `forwarded_exports_only` is True, the IMAGE_DIRECTORY_ENTRY_EXPORT
+        attribute will only contain exports that are forwarded to another DLL.
+
+        If `import_dllnames_only` is True, symbols will not be parsed from
+        the import table and the entries in the IMAGE_DIRECTORY_ENTRY_IMPORT
+        attribute will not have a `symbols` attribute.
+        """
+
+        directory_parsing = (
+            ("IMAGE_DIRECTORY_ENTRY_IMPORT", self.parse_import_directory),
+            ("IMAGE_DIRECTORY_ENTRY_EXPORT", self.parse_export_directory),
+            ("IMAGE_DIRECTORY_ENTRY_RESOURCE", self.parse_resources_directory),
+            ("IMAGE_DIRECTORY_ENTRY_DEBUG", self.parse_debug_directory),
+            ("IMAGE_DIRECTORY_ENTRY_BASERELOC", self.parse_relocations_directory),
+            ("IMAGE_DIRECTORY_ENTRY_TLS", self.parse_directory_tls),
+            ("IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG", self.parse_directory_load_config),
+            ("IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT", self.parse_delay_import_directory),
+            ("IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT", self.parse_directory_bound_imports),
+            ("IMAGE_DIRECTORY_ENTRY_EXCEPTION", self.parse_exceptions_directory),
+        )
+
+        if directories is not None:
+            if not isinstance(directories, (tuple, list)):
+                directories = [directories]
+
+        for entry in directory_parsing:
+            # OC Patch:
+            #
+            try:
+                directory_index = DIRECTORY_ENTRY[entry[0]]
+                dir_entry = self.OPTIONAL_HEADER.DATA_DIRECTORY[directory_index]
+            except IndexError:
+                break
+
+            # Only process all the directories if no individual ones have
+            # been chosen
+            #
+            if directories is None or directory_index in directories:
+
+                value = None
+                if dir_entry.VirtualAddress:
+                    if (
+                        forwarded_exports_only
+                        and entry[0] == "IMAGE_DIRECTORY_ENTRY_EXPORT"
+                    ):
+                        value = entry[1](
+                            dir_entry.VirtualAddress,
+                            dir_entry.Size,
+                            forwarded_only=True,
+                        )
+                    elif (
+                        import_dllnames_only
+                        and entry[0] == "IMAGE_DIRECTORY_ENTRY_IMPORT"
+                    ):
+                        value = entry[1](
+                            dir_entry.VirtualAddress, dir_entry.Size, dllnames_only=True
+                        )
+
+                    else:
+                        try:
+                            value = entry[1](dir_entry.VirtualAddress, dir_entry.Size)
+                        except PEFormatError as excp:
+                            self.__warnings.append(
+                                f'Failed to process directoty "{entry[0]}": {excp}'
+                            )
+                    if value:
+                        setattr(self, entry[0][6:], value)
+
+            if (
+                (directories is not None)
+                and isinstance(directories, list)
+                and (entry[0] in directories)
+            ):
+                directories.remove(directory_index)
+
+    def parse_exceptions_directory(self, rva, size):
+        """Parses exception directory
+
+        All the code related to handling exception directories is documented in
+        https://auscitte.github.io/systems%20blog/Exception-Directory-pefile#implementation-details
+        """
+
+        # "For x64 and Itanium platforms; the format is different for other platforms"
+        if (
+            self.FILE_HEADER.Machine != MACHINE_TYPE["IMAGE_FILE_MACHINE_AMD64"]
+            and self.FILE_HEADER.Machine != MACHINE_TYPE["IMAGE_FILE_MACHINE_IA64"]
+        ):
+            return None
+
+        rf = Structure(self.__RUNTIME_FUNCTION_format__)
+        rf_size = rf.sizeof()
+        rva2rt = {}
+        rt_funcs = []
+        rva2infos = {}
+        for _ in range(size // rf_size):
+            rf = self.__unpack_data__(
+                self.__RUNTIME_FUNCTION_format__,
+                self.get_data(rva, rf_size),
+                file_offset=self.get_offset_from_rva(rva),
+            )
+
+            if rf is None:
+                break
+
+            ui = None
+
+            if (rf.UnwindData & 0x1) == 0:
+                # according to "Improving Automated Analysis of Windows x64 Binaries",
+                # if the lowest bit is set, (UnwindData & ~0x1) should point to the
+                # chained RUNTIME_FUNCTION instead of UNWIND_INFO
+
+                if (
+                    rf.UnwindData in rva2infos
+                ):  # unwind info data structures can be shared among functions
+                    ui = rva2infos[rf.UnwindData]
+                else:
+                    ui = UnwindInfo(file_offset=self.get_offset_from_rva(rf.UnwindData))
+                    rva2infos[rf.UnwindData] = ui
+
+                ws = ui.unpack_in_stages(self.get_data(rf.UnwindData, ui.sizeof()))
+                if ws != None:
+                    self.__warnings.append(ws)
+                    break
+                ws = ui.unpack_in_stages(self.get_data(rf.UnwindData, ui.sizeof()))
+                if ws != None:
+                    self.__warnings.append(ws)
+                    break
+
+                self.__structures__.append(ui)
+
+            entry = ExceptionsDirEntryData(struct=rf, unwindinfo=ui)
+            rt_funcs.append(entry)
+
+            rva2rt[rf.BeginAddress] = entry
+            rva += rf_size
+
+        # each chained function entry holds a reference to the function first in chain
+        for rf in rt_funcs:
+            if rf.unwindinfo is None:
+                # TODO: have not encountered such a binary yet;
+                # in theory, (UnwindData & ~0x1) should point to the chained
+                # RUNTIME_FUNCTION which could be used to locate the corresponding
+                # ExceptionsDirEntryData and set_chained_function_entry()
+                continue
+            if not hasattr(rf.unwindinfo, "FunctionEntry"):
+                continue
+            if not rf.unwindinfo.FunctionEntry in rva2rt:
+                self.__warnings.append(
+                    f"FunctionEntry of UNWIND_INFO at {rf.struct.get_file_offset():x}"
+                    " points to an entry that does not exist"
+                )
+                continue
+            try:
+                rf.unwindinfo.set_chained_function_entry(
+                    rva2rt[rf.unwindinfo.FunctionEntry]
+                )
+            except PEFormatError as excp:
+                self.__warnings.append(
+                    "Failed parsing FunctionEntry of UNWIND_INFO at "
+                    f"{rf.struct.get_file_offset():x}: {excp}"
+                )
+                continue
+
+        return rt_funcs
+
+    def parse_directory_bound_imports(self, rva, size):
+        """"""
+
+        bnd_descr = Structure(self.__IMAGE_BOUND_IMPORT_DESCRIPTOR_format__)
+        bnd_descr_size = bnd_descr.sizeof()
+        start = rva
+
+        bound_imports = []
+        while True:
+            bnd_descr = self.__unpack_data__(
+                self.__IMAGE_BOUND_IMPORT_DESCRIPTOR_format__,
+                self.__data__[rva : rva + bnd_descr_size],
+                file_offset=rva,
+            )
+            if bnd_descr is None:
+                # If can't parse directory then silently return.
+                # This directory does not necessarily have to be valid to
+                # still have a valid PE file
+
+                self.__warnings.append(
+                    "The Bound Imports directory exists but can't be parsed."
+                )
+
+                return
+
+            if bnd_descr.all_zeroes():
+                break
+
+            rva += bnd_descr.sizeof()
+
+            section = self.get_section_by_offset(rva)
+            file_offset = self.get_offset_from_rva(rva)
+            if section is None:
+                safety_boundary = len(self.__data__) - file_offset
+                sections_after_offset = [
+                    s.PointerToRawData
+                    for s in self.sections
+                    if s.PointerToRawData > file_offset
+                ]
+                if sections_after_offset:
+                    # Find the first section starting at a later offset than that
+                    # specified by 'rva'
+                    first_section_after_offset = min(sections_after_offset)
+                    section = self.get_section_by_offset(first_section_after_offset)
+                    if section is not None:
+                        safety_boundary = section.PointerToRawData - file_offset
+            else:
+                safety_boundary = (
+                    section.PointerToRawData + len(section.get_data()) - file_offset
+                )
+            if not section:
+                self.__warnings.append(
+                    (
+                        "RVA of IMAGE_BOUND_IMPORT_DESCRIPTOR points "
+                        "to an invalid address: {0:x}"
+                    ).format(rva)
+                )
+                return
+
+            forwarder_refs = []
+            # 8 is the size of __IMAGE_BOUND_IMPORT_DESCRIPTOR_format__
+            for _ in range(
+                min(bnd_descr.NumberOfModuleForwarderRefs, int(safety_boundary / 8))
+            ):
+                # Both structures IMAGE_BOUND_IMPORT_DESCRIPTOR and
+                # IMAGE_BOUND_FORWARDER_REF have the same size.
+                bnd_frwd_ref = self.__unpack_data__(
+                    self.__IMAGE_BOUND_FORWARDER_REF_format__,
+                    self.__data__[rva : rva + bnd_descr_size],
+                    file_offset=rva,
+                )
+                # OC Patch:
+                if not bnd_frwd_ref:
+                    raise PEFormatError("IMAGE_BOUND_FORWARDER_REF cannot be read")
+                rva += bnd_frwd_ref.sizeof()
+
+                offset = start + bnd_frwd_ref.OffsetModuleName
+                name_str = self.get_string_from_data(
+                    0, self.__data__[offset : offset + MAX_STRING_LENGTH]
+                )
+
+                # OffsetModuleName points to a DLL name. These shouldn't be too long.
+                # Anything longer than a safety length of 128 will be taken to indicate
+                # a corrupt entry and abort the processing of these entries.
+                # Names shorter than 4 characters will be taken as invalid as well.
+
+                if name_str:
+                    invalid_chars = [
+                        c for c in bytearray(name_str) if chr(c) not in string.printable
+                    ]
+                    if len(name_str) > 256 or invalid_chars:
+                        break
+
+                forwarder_refs.append(
+                    BoundImportRefData(struct=bnd_frwd_ref, name=name_str)
+                )
+
+            offset = start + bnd_descr.OffsetModuleName
+            name_str = self.get_string_from_data(
+                0, self.__data__[offset : offset + MAX_STRING_LENGTH]
+            )
+
+            if name_str:
+                invalid_chars = [
+                    c for c in bytearray(name_str) if chr(c) not in string.printable
+                ]
+                if len(name_str) > 256 or invalid_chars:
+                    break
+
+            if not name_str:
+                break
+            bound_imports.append(
+                BoundImportDescData(
+                    struct=bnd_descr, name=name_str, entries=forwarder_refs
+                )
+            )
+
+        return bound_imports
+
+    def parse_directory_tls(self, rva, size):
+        """"""
+
+        # By default let's pretend the format is a 32-bit PE. It may help
+        # produce some output for files where the Magic in the Optional Header
+        # is incorrect.
+        format = self.__IMAGE_TLS_DIRECTORY_format__
+
+        if self.PE_TYPE == OPTIONAL_HEADER_MAGIC_PE_PLUS:
+            format = self.__IMAGE_TLS_DIRECTORY64_format__
+
+        try:
+            tls_struct = self.__unpack_data__(
+                format,
+                self.get_data(rva, Structure(format).sizeof()),
+                file_offset=self.get_offset_from_rva(rva),
+            )
+        except PEFormatError:
+            self.__warnings.append(
+                "Invalid TLS information. Can't read " "data at RVA: 0x%x" % rva
+            )
+            tls_struct = None
+
+        if not tls_struct:
+            return None
+
+        return TlsData(struct=tls_struct)
+
+    def parse_directory_load_config(self, rva, size):
+        """"""
+
+        if self.PE_TYPE == OPTIONAL_HEADER_MAGIC_PE:
+            load_config_dir_sz = self.get_dword_at_rva(rva)
+            format = self.__IMAGE_LOAD_CONFIG_DIRECTORY_format__
+        elif self.PE_TYPE == OPTIONAL_HEADER_MAGIC_PE_PLUS:
+            load_config_dir_sz = self.get_dword_at_rva(rva)
+            format = self.__IMAGE_LOAD_CONFIG_DIRECTORY64_format__
+        else:
+            self.__warnings.append(
+                "Don't know how to parse LOAD_CONFIG information for non-PE32/"
+                "PE32+ file"
+            )
+            return None
+
+        # load config directory size can be less than represented by 'format' variable,
+        # generate truncated format which correspond load config directory size
+        fields_counter = 0
+        cumulative_sz = 0
+        for field in format[1]:
+            fields_counter += 1
+            cumulative_sz += STRUCT_SIZEOF_TYPES[field.split(",")[0]]
+            if cumulative_sz == load_config_dir_sz:
+                break
+        format = (format[0], format[1][:fields_counter])
+
+        load_config_struct = None
+        try:
+            load_config_struct = self.__unpack_data__(
+                format,
+                self.get_data(rva, Structure(format).sizeof()),
+                file_offset=self.get_offset_from_rva(rva),
+            )
+        except PEFormatError:
+            self.__warnings.append(
+                "Invalid LOAD_CONFIG information. Can't read " "data at RVA: 0x%x" % rva
+            )
+
+        if not load_config_struct:
+            return None
+
+        dynamic_relocations = None
+        if fields_counter > 35:
+            dynamic_relocations = self.parse_dynamic_relocations(
+                load_config_struct.DynamicValueRelocTableOffset,
+                load_config_struct.DynamicValueRelocTableSection,
+            )
+
+        return LoadConfigData(
+            struct=load_config_struct, dynamic_relocations=dynamic_relocations
+        )
+
+    def parse_dynamic_relocations(
+        self, dynamic_value_reloc_table_offset, dynamic_value_reloc_table_section
+    ):
+        if not dynamic_value_reloc_table_offset:
+            return None
+        if not dynamic_value_reloc_table_section:
+            return None
+
+        if dynamic_value_reloc_table_section > len(self.sections):
+            return None
+
+        section = self.sections[dynamic_value_reloc_table_section - 1]
+        rva = section.VirtualAddress + dynamic_value_reloc_table_offset
+        image_dynamic_reloc_table_struct = None
+        reloc_table_size = Structure(
+            self.__IMAGE_DYNAMIC_RELOCATION_TABLE_format__
+        ).sizeof()
+        try:
+            image_dynamic_reloc_table_struct = self.__unpack_data__(
+                self.__IMAGE_DYNAMIC_RELOCATION_TABLE_format__,
+                self.get_data(rva, reloc_table_size),
+                file_offset=self.get_offset_from_rva(rva),
+            )
+        except PEFormatError:
+            self.__warnings.append(
+                "Invalid IMAGE_DYNAMIC_RELOCATION_TABLE information. Can't read "
+                "data at RVA: 0x%x" % rva
+            )
+
+        if image_dynamic_reloc_table_struct.Version != 1:
+            self.__warnings.append(
+                "No pasring available for IMAGE_DYNAMIC_RELOCATION_TABLE.Version = %d",
+                image_dynamic_reloc_table_struct.Version,
+            )
+            return None
+
+        rva += reloc_table_size
+        end = rva + image_dynamic_reloc_table_struct.Size
+        dynamic_relocations = []
+
+        while rva < end:
+            format = self.__IMAGE_DYNAMIC_RELOCATION_format__
+
+            if self.PE_TYPE == OPTIONAL_HEADER_MAGIC_PE_PLUS:
+                format = self.__IMAGE_DYNAMIC_RELOCATION64_format__
+
+            rlc_size = Structure(format).sizeof()
+
+            try:
+                dynamic_rlc = self.__unpack_data__(
+                    format,
+                    self.get_data(rva, rlc_size),
+                    file_offset=self.get_offset_from_rva(rva),
+                )
+            except PEFormatError:
+                self.__warnings.append(
+                    "Invalid relocation information. Can't read "
+                    "data at RVA: 0x%x" % rva
+                )
+                dynamic_rlc = None
+
+            if not dynamic_rlc:
+                break
+
+            rva += rlc_size
+            symbol = dynamic_rlc.Symbol
+            size = dynamic_rlc.BaseRelocSize
+
+            if 3 <= symbol <= 5:
+                relocations = self.parse_image_base_relocation_list(
+                    rva, size, self.dynamic_relocation_format_by_symbol[symbol]
+                )
+                dynamic_relocations.append(
+                    DynamicRelocationData(
+                        struct=dynamic_rlc, symbol=symbol, relocations=relocations
+                    )
+                )
+
+            if symbol > 5:
+                relocations = self.parse_image_base_relocation_list(rva, size)
+                dynamic_relocations.append(
+                    DynamicRelocationData(
+                        struct=dynamic_rlc, symbol=symbol, relocations=relocations
+                    )
+                )
+
+            rva += size
+
+        return dynamic_relocations
+
+    def parse_relocations_directory(self, rva, size):
+        """"""
+
+        return self.parse_image_base_relocation_list(rva, size)
+
+    def parse_image_base_relocation_list(self, rva, size, fmt=None):
+        rlc_size = Structure(self.__IMAGE_BASE_RELOCATION_format__).sizeof()
+        end = rva + size
+
+        relocations = []
+        while rva < end:
+
+            # OC Patch:
+            # Malware that has bad RVA entries will cause an error.
+            # Just continue on after an exception
+            #
+            try:
+                rlc = self.__unpack_data__(
+                    self.__IMAGE_BASE_RELOCATION_format__,
+                    self.get_data(rva, rlc_size),
+                    file_offset=self.get_offset_from_rva(rva),
+                )
+            except PEFormatError:
+                self.__warnings.append(
+                    "Invalid relocation information. Can't read "
+                    "data at RVA: 0x%x" % rva
+                )
+                rlc = None
+
+            if not rlc:
+                break
+
+            # rlc.VirtualAddress must lie within the Image
+            if rlc.VirtualAddress > self.OPTIONAL_HEADER.SizeOfImage:
+                self.__warnings.append(
+                    "Invalid relocation information. VirtualAddress outside"
+                    " of Image: 0x%x" % rlc.VirtualAddress
+                )
+                break
+
+            # rlc.SizeOfBlock must be less or equal than the size of the image
+            # (It's a rather loose sanity test)
+            if rlc.SizeOfBlock > self.OPTIONAL_HEADER.SizeOfImage:
+                self.__warnings.append(
+                    "Invalid relocation information. SizeOfBlock too large"
+                    ": %d" % rlc.SizeOfBlock
+                )
+                break
+
+            if fmt is None:
+                reloc_entries = self.parse_relocations(
+                    rva + rlc_size, rlc.VirtualAddress, rlc.SizeOfBlock - rlc_size
+                )
+            else:
+                reloc_entries = self.parse_relocations_with_format(
+                    rva + rlc_size, rlc.VirtualAddress, rlc.SizeOfBlock - rlc_size, fmt
+                )
+
+            relocations.append(BaseRelocationData(struct=rlc, entries=reloc_entries))
+
+            if not rlc.SizeOfBlock:
+                break
+            rva += rlc.SizeOfBlock
+
+        return relocations
+
+    def parse_relocations(self, data_rva, rva, size):
+        """"""
+
+        try:
+            data = self.get_data(data_rva, size)
+            file_offset = self.get_offset_from_rva(data_rva)
+        except PEFormatError:
+            self.__warnings.append(f"Bad RVA in relocation data: 0x{data_rva:x}")
+            return []
+
+        entries = []
+        offsets_and_type = set()
+        for idx in range(int(len(data) / 2)):
+
+            entry = self.__unpack_data__(
+                self.__IMAGE_BASE_RELOCATION_ENTRY_format__,
+                data[idx * 2 : (idx + 1) * 2],
+                file_offset=file_offset,
+            )
+
+            if not entry:
+                break
+            word = entry.Data
+
+            reloc_type = word >> 12
+            reloc_offset = word & 0x0FFF
+            if (reloc_offset, reloc_type) in offsets_and_type:
+                self.__warnings.append(
+                    "Overlapping offsets in relocation data "
+                    "at RVA: 0x%x" % (reloc_offset + rva)
+                )
+                break
+
+            offsets_and_type.add((reloc_offset, reloc_type))
+
+            entries.append(
+                RelocationData(
+                    struct=entry, type=reloc_type, base_rva=rva, rva=reloc_offset + rva
+                )
+            )
+            file_offset += entry.sizeof()
+
+        return entries
+
+    def parse_relocations_with_format(self, data_rva, rva, size, format):
+        """"""
+
+        try:
+            data = self.get_data(data_rva, size)
+            file_offset = self.get_offset_from_rva(data_rva)
+        except PEFormatError:
+            self.__warnings.append(f"Bad RVA in relocation data: 0x{data_rva:x}")
+            return []
+
+        entry_size = StructureWithBitfields(format).sizeof()
+        entries = []
+        offsets = set()
+        for idx in range(int(len(data) / entry_size)):
+
+            entry = self.__unpack_data_with_bitfields__(
+                format,
+                data[idx * entry_size : (idx + 1) * entry_size],
+                file_offset=file_offset,
+            )
+
+            if not entry:
+                break
+
+            reloc_offset = entry.PageRelativeOffset
+            if reloc_offset in offsets:
+                self.__warnings.append(
+                    "Overlapping offsets in relocation data "
+                    "at RVA: 0x%x" % (reloc_offset + rva)
+                )
+                break
+            offsets.add(reloc_offset)
+
+            entries.append(
+                RelocationData(struct=entry, base_rva=rva, rva=reloc_offset + rva)
+            )
+            file_offset += entry_size
+
+        return entries
+
+    def parse_debug_directory(self, rva, size):
+        """"""
+
+        dbg_size = Structure(self.__IMAGE_DEBUG_DIRECTORY_format__).sizeof()
+
+        debug = []
+        for idx in range(int(size / dbg_size)):
+            try:
+                data = self.get_data(rva + dbg_size * idx, dbg_size)
+            except PEFormatError:
+                self.__warnings.append(
+                    "Invalid debug information. Can't read " "data at RVA: 0x%x" % rva
+                )
+                return None
+
+            dbg = self.__unpack_data__(
+                self.__IMAGE_DEBUG_DIRECTORY_format__,
+                data,
+                file_offset=self.get_offset_from_rva(rva + dbg_size * idx),
+            )
+
+            if not dbg:
+                return None
+
+            # apply structure according to DEBUG_TYPE
+            # http://www.debuginfo.com/articles/debuginfomatch.html
+            #
+            dbg_type = None
+
+            if dbg.Type == 1:
+                # IMAGE_DEBUG_TYPE_COFF
+                pass
+
+            elif dbg.Type == 2:
+                # if IMAGE_DEBUG_TYPE_CODEVIEW
+                dbg_type_offset = dbg.PointerToRawData
+                dbg_type_size = dbg.SizeOfData
+                dbg_type_data = self.__data__[
+                    dbg_type_offset : dbg_type_offset + dbg_type_size
+                ]
+
+                if dbg_type_data[:4] == b"RSDS":
+                    # pdb7.0
+                    __CV_INFO_PDB70_format__ = [
+                        "CV_INFO_PDB70",
+                        [
+                            "4s,CvSignature",
+                            "I,Signature_Data1",  # Signature is of GUID type
+                            "H,Signature_Data2",
+                            "H,Signature_Data3",
+                            "B,Signature_Data4",
+                            "B,Signature_Data5",
+                            "6s,Signature_Data6",
+                            "I,Age",
+                        ],
+                    ]
+                    pdbFileName_size = (
+                        dbg_type_size - Structure(__CV_INFO_PDB70_format__).sizeof()
+                    )
+
+                    # pdbFileName_size can be negative here, as seen in the malware
+                    # sample with hash
+                    # MD5: 7c297600870d026c014d42596bb9b5fd
+                    # SHA256:
+                    #   83f4e63681fcba8a9d7bbb1688c71981b1837446514a1773597e0192bba9fac3
+                    # Checking for positive size here to ensure proper parsing.
+                    if pdbFileName_size > 0:
+                        __CV_INFO_PDB70_format__[1].append(
+                            "{0}s,PdbFileName".format(pdbFileName_size)
+                        )
+                    dbg_type = self.__unpack_data__(
+                        __CV_INFO_PDB70_format__, dbg_type_data, dbg_type_offset
+                    )
+                    if dbg_type is not None:
+                        dbg_type.Signature_Data6_value = struct.unpack(
+                            ">Q", b"\0\0" + dbg_type.Signature_Data6
+                        )[0]
+                        dbg_type.Signature_String = (
+                            str(
+                                uuid.UUID(
+                                    fields=(
+                                        dbg_type.Signature_Data1,
+                                        dbg_type.Signature_Data2,
+                                        dbg_type.Signature_Data3,
+                                        dbg_type.Signature_Data4,
+                                        dbg_type.Signature_Data5,
+                                        dbg_type.Signature_Data6_value,
+                                    )
+                                )
+                            )
+                            .replace("-", "")
+                            .upper()
+                            + f"{dbg_type.Age:X}"
+                        )
+
+                elif dbg_type_data[:4] == b"NB10":
+                    # pdb2.0
+                    __CV_INFO_PDB20_format__ = [
+                        "CV_INFO_PDB20",
+                        [
+                            "I,CvHeaderSignature",
+                            "I,CvHeaderOffset",
+                            "I,Signature",
+                            "I,Age",
+                        ],
+                    ]
+                    pdbFileName_size = (
+                        dbg_type_size - Structure(__CV_INFO_PDB20_format__).sizeof()
+                    )
+
+                    # As with the PDB 7.0 case, ensuring a positive size for
+                    # pdbFileName_size to ensure proper parsing.
+                    if pdbFileName_size > 0:
+                        # Add the last variable-length string field.
+                        __CV_INFO_PDB20_format__[1].append(
+                            "{0}s,PdbFileName".format(pdbFileName_size)
+                        )
+                    dbg_type = self.__unpack_data__(
+                        __CV_INFO_PDB20_format__, dbg_type_data, dbg_type_offset
+                    )
+
+            elif dbg.Type == 4:
+                # IMAGE_DEBUG_TYPE_MISC
+                dbg_type_offset = dbg.PointerToRawData
+                dbg_type_size = dbg.SizeOfData
+                dbg_type_data = self.__data__[
+                    dbg_type_offset : dbg_type_offset + dbg_type_size
+                ]
+                ___IMAGE_DEBUG_MISC_format__ = [
+                    "IMAGE_DEBUG_MISC",
+                    [
+                        "I,DataType",
+                        "I,Length",
+                        "B,Unicode",
+                        "B,Reserved1",
+                        "H,Reserved2",
+                    ],
+                ]
+                dbg_type_partial = self.__unpack_data__(
+                    ___IMAGE_DEBUG_MISC_format__, dbg_type_data, dbg_type_offset
+                )
+
+                # Need to check that dbg_type_partial contains a correctly unpacked data
+                # structure, as the malware sample with the following hash
+                # MD5:    5e7d6707d693108de5a303045c17d95b
+                # SHA256:
+                #  5dd94a95025f3b6e3dd440d52f7c6d2964fdd1aa119e0ee92e38c7bf83829e5c
+                # contains a value of None for dbg_type_partial after unpacking,
+                # presumably due to a malformed DEBUG entry.
+                if dbg_type_partial:
+                    # The Unicode bool should be set to 0 or 1.
+                    if dbg_type_partial.Unicode in (0, 1):
+                        data_size = (
+                            dbg_type_size
+                            - Structure(___IMAGE_DEBUG_MISC_format__).sizeof()
+                        )
+
+                        # As with the PDB case, ensuring a positive size for data_size
+                        # here to ensure proper parsing.
+                        if data_size > 0:
+                            ___IMAGE_DEBUG_MISC_format__[1].append(
+                                "{0}s,Data".format(data_size)
+                            )
+                        dbg_type = self.__unpack_data__(
+                            ___IMAGE_DEBUG_MISC_format__, dbg_type_data, dbg_type_offset
+                        )
+
+            debug.append(DebugData(struct=dbg, entry=dbg_type))
+
+        return debug
+
+    def parse_resources_directory(self, rva, size=0, base_rva=None, level=0, dirs=None):
+        """Parse the resources directory.
+
+        Given the RVA of the resources directory, it will process all
+        its entries.
+
+        The root will have the corresponding member of its structure,
+        IMAGE_RESOURCE_DIRECTORY plus 'entries', a list of all the
+        entries in the directory.
+
+        Those entries will have, correspondingly, all the structure's
+        members (IMAGE_RESOURCE_DIRECTORY_ENTRY) and an additional one,
+        "directory", pointing to the IMAGE_RESOURCE_DIRECTORY structure
+        representing upper layers of the tree. This one will also have
+        an 'entries' attribute, pointing to the 3rd, and last, level.
+        Another directory with more entries. Those last entries will
+        have a new attribute (both 'leaf' or 'data_entry' can be used to
+        access it). This structure finally points to the resource data.
+        All the members of this structure, IMAGE_RESOURCE_DATA_ENTRY,
+        are available as its attributes.
+        """
+
+        # OC Patch:
+        if dirs is None:
+            dirs = [rva]
+
+        if base_rva is None:
+            base_rva = rva
+
+        if level > MAX_RESOURCE_DEPTH:
+            self.__warnings.append(
+                "Error parsing the resources directory. "
+                "Excessively nested table depth %d (>%s)" % (level, MAX_RESOURCE_DEPTH)
+            )
+            return None
+
+        try:
+            # If the RVA is invalid all would blow up. Some EXEs seem to be
+            # specially nasty and have an invalid RVA.
+            data = self.get_data(
+                rva, Structure(self.__IMAGE_RESOURCE_DIRECTORY_format__).sizeof()
+            )
+        except PEFormatError:
+            self.__warnings.append(
+                "Invalid resources directory. Can't read "
+                "directory data at RVA: 0x%x" % rva
+            )
+            return None
+
+        # Get the resource directory structure, that is, the header
+        # of the table preceding the actual entries
+        #
+        resource_dir = self.__unpack_data__(
+            self.__IMAGE_RESOURCE_DIRECTORY_format__,
+            data,
+            file_offset=self.get_offset_from_rva(rva),
+        )
+        if resource_dir is None:
+            # If we can't parse resources directory then silently return.
+            # This directory does not necessarily have to be valid to
+            # still have a valid PE file
+            self.__warnings.append(
+                "Invalid resources directory. Can't parse "
+                "directory data at RVA: 0x%x" % rva
+            )
+            return None
+
+        dir_entries = []
+
+        # Advance the RVA to the position immediately following the directory
+        # table header and pointing to the first entry in the table
+        #
+        rva += resource_dir.sizeof()
+
+        number_of_entries = (
+            resource_dir.NumberOfNamedEntries + resource_dir.NumberOfIdEntries
+        )
+
+        # Set a hard limit on the maximum reasonable number of entries
+        MAX_ALLOWED_ENTRIES = 4096
+        if number_of_entries > MAX_ALLOWED_ENTRIES:
+            self.__warnings.append(
+                "Error parsing the resources directory. "
+                "The directory contains %d entries (>%s)"
+                % (number_of_entries, MAX_ALLOWED_ENTRIES)
+            )
+            return None
+
+        self.__total_resource_entries_count += number_of_entries
+        if self.__total_resource_entries_count > MAX_RESOURCE_ENTRIES:
+            self.__warnings.append(
+                "Error parsing the resources directory. "
+                "The file contains at least %d entries (>%d)"
+                % (self.__total_resource_entries_count, MAX_RESOURCE_ENTRIES)
+            )
+            return None
+
+        strings_to_postprocess = []
+
+        # Keep track of the last name's start and end offsets in order
+        # to be able to detect overlapping entries that might suggest
+        # and invalid or corrupt directory.
+        last_name_begin_end = None
+        for idx in range(number_of_entries):
+            if (
+                not self.__resource_size_limit_reached
+                and self.__total_resource_bytes > self.__resource_size_limit_upperbounds
+            ):
+
+                self.__resource_size_limit_reached = True
+                self.__warnings.append(
+                    "Resource size 0x%x exceeds file size 0x%x, overlapping "
+                    "resources found."
+                    % (
+                        self.__total_resource_bytes,
+                        self.__resource_size_limit_upperbounds,
+                    )
+                )
+
+            res = self.parse_resource_entry(rva)
+            if res is None:
+                self.__warnings.append(
+                    "Error parsing the resources directory, "
+                    "Entry %d is invalid, RVA = 0x%x. " % (idx, rva)
+                )
+                break
+
+            entry_name = None
+            entry_id = None
+
+            name_is_string = (res.Name & 0x80000000) >> 31
+            if not name_is_string:
+                entry_id = res.Name
+            else:
+                ustr_offset = base_rva + res.NameOffset
+                try:
+                    entry_name = UnicodeStringWrapperPostProcessor(self, ustr_offset)
+                    self.__total_resource_bytes += entry_name.get_pascal_16_length()
+                    # If the last entry's offset points before the current's but its end
+                    # is past the current's beginning, assume the overlap indicates a
+                    # corrupt name.
+                    if last_name_begin_end and (
+                        last_name_begin_end[0] < ustr_offset
+                        and last_name_begin_end[1] >= ustr_offset
+                    ):
+                        # Remove the previous overlapping entry as it's likely to be
+                        # already corrupt data.
+                        strings_to_postprocess.pop()
+                        self.__warnings.append(
+                            "Error parsing the resources directory, "
+                            "attempting to read entry name. "
+                            "Entry names overlap 0x%x" % (ustr_offset)
+                        )
+                        break
+
+                    last_name_begin_end = (
+                        ustr_offset,
+                        ustr_offset + entry_name.get_pascal_16_length(),
+                    )
+
+                    strings_to_postprocess.append(entry_name)
+
+                except PEFormatError:
+                    self.__warnings.append(
+                        "Error parsing the resources directory, "
+                        "attempting to read entry name. "
+                        "Can't read unicode string at offset 0x%x" % (ustr_offset)
+                    )
+
+            if res.DataIsDirectory:
+                # OC Patch:
+                #
+                # One trick malware can do is to recursively reference
+                # the next directory. This causes hilarity to ensue when
+                # trying to parse everything correctly.
+                # If the original RVA given to this function is equal to
+                # the next one to parse, we assume that it's a trick.
+                # Instead of raising a PEFormatError this would skip some
+                # reasonable data so we just break.
+                #
+                # 9ee4d0a0caf095314fd7041a3e4404dc is the offending sample
+                if base_rva + res.OffsetToDirectory in dirs:
+                    break
+
+                entry_directory = self.parse_resources_directory(
+                    base_rva + res.OffsetToDirectory,
+                    size - (rva - base_rva),  # size
+                    base_rva=base_rva,
+                    level=level + 1,
+                    dirs=dirs + [base_rva + res.OffsetToDirectory],
+                )
+
+                if not entry_directory:
+                    break
+
+                # Ange Albertini's code to process resources' strings
+                #
+                strings = None
+                if entry_id == RESOURCE_TYPE["RT_STRING"]:
+                    strings = {}
+                    for resource_id in entry_directory.entries:
+                        if hasattr(resource_id, "directory"):
+
+                            resource_strings = {}
+
+                            for resource_lang in resource_id.directory.entries:
+
+                                if (
+                                    resource_lang is None
+                                    or not hasattr(resource_lang, "data")
+                                    or resource_lang.data.struct.Size is None
+                                    or resource_id.id is None
+                                ):
+                                    continue
+
+                                string_entry_rva = (
+                                    resource_lang.data.struct.OffsetToData
+                                )
+                                string_entry_size = resource_lang.data.struct.Size
+                                string_entry_id = resource_id.id
+
+                                # XXX: has been raising exceptions preventing parsing
+                                try:
+                                    string_entry_data = self.get_data(
+                                        string_entry_rva, string_entry_size
+                                    )
+                                except PEFormatError:
+                                    self.__warnings.append(
+                                        f"Error parsing resource of type RT_STRING at "
+                                        f"RVA 0x{string_entry_rva:x} with "
+                                        f"size {string_entry_size}"
+                                    )
+                                    continue
+
+                                parse_strings(
+                                    string_entry_data,
+                                    (int(string_entry_id) - 1) * 16,
+                                    resource_strings,
+                                )
+                                strings.update(resource_strings)
+
+                            resource_id.directory.strings = resource_strings
+
+                dir_entries.append(
+                    ResourceDirEntryData(
+                        struct=res,
+                        name=entry_name,
+                        id=entry_id,
+                        directory=entry_directory,
+                    )
+                )
+
+            else:
+                struct = self.parse_resource_data_entry(
+                    base_rva + res.OffsetToDirectory
+                )
+
+                if struct:
+                    self.__total_resource_bytes += struct.Size
+                    entry_data = ResourceDataEntryData(
+                        struct=struct, lang=res.Name & 0x3FF, sublang=res.Name >> 10
+                    )
+
+                    dir_entries.append(
+                        ResourceDirEntryData(
+                            struct=res, name=entry_name, id=entry_id, data=entry_data
+                        )
+                    )
+
+                else:
+                    break
+
+            # Check if this entry contains version information
+            #
+            if level == 0 and res.Id == RESOURCE_TYPE["RT_VERSION"]:
+                if dir_entries:
+                    last_entry = dir_entries[-1]
+
+                try:
+                    version_entries = last_entry.directory.entries[0].directory.entries
+                except:
+                    # Maybe a malformed directory structure...?
+                    # Let's ignore it
+                    pass
+                else:
+                    for version_entry in version_entries:
+                        rt_version_struct = None
+                        try:
+                            rt_version_struct = version_entry.data.struct
+                        except:
+                            # Maybe a malformed directory structure...?
+                            # Let's ignore it
+                            pass
+
+                        if rt_version_struct is not None:
+                            self.parse_version_information(rt_version_struct)
+
+            rva += res.sizeof()
+
+        string_rvas = [s.get_rva() for s in strings_to_postprocess]
+        string_rvas.sort()
+
+        for idx, s in enumerate(strings_to_postprocess):
+            s.render_pascal_16()
+
+        resource_directory_data = ResourceDirData(
+            struct=resource_dir, entries=dir_entries
+        )
+
+        return resource_directory_data
+
+    def parse_resource_data_entry(self, rva):
+        """Parse a data entry from the resources directory."""
+
+        try:
+            # If the RVA is invalid all would blow up. Some EXEs seem to be
+            # specially nasty and have an invalid RVA.
+            data = self.get_data(
+                rva, Structure(self.__IMAGE_RESOURCE_DATA_ENTRY_format__).sizeof()
+            )
+        except PEFormatError:
+            self.__warnings.append(
+                "Error parsing a resource directory data entry, "
+                "the RVA is invalid: 0x%x" % (rva)
+            )
+            return None
+
+        data_entry = self.__unpack_data__(
+            self.__IMAGE_RESOURCE_DATA_ENTRY_format__,
+            data,
+            file_offset=self.get_offset_from_rva(rva),
+        )
+
+        return data_entry
+
+    def parse_resource_entry(self, rva):
+        """Parse a directory entry from the resources directory."""
+
+        try:
+            data = self.get_data(
+                rva, Structure(self.__IMAGE_RESOURCE_DIRECTORY_ENTRY_format__).sizeof()
+            )
+        except PEFormatError:
+            # A warning will be added by the caller if this method returns None
+            return None
+
+        resource = self.__unpack_data__(
+            self.__IMAGE_RESOURCE_DIRECTORY_ENTRY_format__,
+            data,
+            file_offset=self.get_offset_from_rva(rva),
+        )
+
+        if resource is None:
+            return None
+
+        # resource.NameIsString = (resource.Name & 0x80000000L) >> 31
+        resource.NameOffset = resource.Name & 0x7FFFFFFF
+
+        resource.__pad = resource.Name & 0xFFFF0000
+        resource.Id = resource.Name & 0x0000FFFF
+
+        resource.DataIsDirectory = (resource.OffsetToData & 0x80000000) >> 31
+        resource.OffsetToDirectory = resource.OffsetToData & 0x7FFFFFFF
+
+        return resource
+
+    def parse_version_information(self, version_struct):
+        """Parse version information structure.
+
+        The date will be made available in three attributes of the PE object.
+
+        VS_VERSIONINFO   will contain the first three fields of the main structure:
+            'Length', 'ValueLength', and 'Type'
+
+        VS_FIXEDFILEINFO will hold the rest of the fields, accessible as sub-attributes:
+            'Signature', 'StrucVersion', 'FileVersionMS', 'FileVersionLS',
+            'ProductVersionMS', 'ProductVersionLS', 'FileFlagsMask', 'FileFlags',
+            'FileOS', 'FileType', 'FileSubtype', 'FileDateMS', 'FileDateLS'
+
+        FileInfo    is a list of all StringFileInfo and VarFileInfo structures.
+
+        StringFileInfo structures will have a list as an attribute named 'StringTable'
+        containing all the StringTable structures. Each of those structures contains a
+        dictionary 'entries' with all the key / value version information string pairs.
+
+        VarFileInfo structures will have a list as an attribute named 'Var' containing
+        all Var structures. Each Var structure will have a dictionary as an attribute
+        named 'entry' which will contain the name and value of the Var.
+        """
+
+        # Retrieve the data for the version info resource
+        #
+        try:
+            start_offset = self.get_offset_from_rva(version_struct.OffsetToData)
+        except PEFormatError:
+            self.__warnings.append(
+                "Error parsing the version information, "
+                "attempting to read OffsetToData with RVA: 0x{:x}".format(
+                    version_struct.OffsetToData
+                )
+            )
+            return
+        raw_data = self.__data__[start_offset : start_offset + version_struct.Size]
+
+        # Map the main structure and the subsequent string
+        #
+        versioninfo_struct = self.__unpack_data__(
+            self.__VS_VERSIONINFO_format__, raw_data, file_offset=start_offset
+        )
+
+        if versioninfo_struct is None:
+            return
+
+        ustr_offset = version_struct.OffsetToData + versioninfo_struct.sizeof()
+        section = self.get_section_by_rva(ustr_offset)
+        section_end = None
+        if section:
+            section_end = section.VirtualAddress + max(
+                section.SizeOfRawData, section.Misc_VirtualSize
+            )
+
+        versioninfo_string = None
+        # These should return 'ascii' decoded data. For the case when it's
+        # garbled data the ascii string will retain the byte values while
+        # encoding it to something else may yield values that don't match the
+        # file's contents.
+        try:
+            if section_end is None:
+                versioninfo_string = self.get_string_u_at_rva(
+                    ustr_offset, encoding="ascii"
+                )
+            else:
+                versioninfo_string = self.get_string_u_at_rva(
+                    ustr_offset, (section_end - ustr_offset) >> 1, encoding="ascii"
+                )
+        except PEFormatError:
+            self.__warnings.append(
+                "Error parsing the version information, "
+                "attempting to read VS_VERSION_INFO string. Can't "
+                "read unicode string at offset 0x%x" % (ustr_offset)
+            )
+
+        if versioninfo_string is None:
+            self.__warnings.append(
+                "Invalid VS_VERSION_INFO block: {0}".format(versioninfo_string)
+            )
+            return
+
+        # If the structure does not contain the expected name, it's assumed to
+        # be invalid
+        if versioninfo_string is not None and versioninfo_string != b"VS_VERSION_INFO":
+            if len(versioninfo_string) > 128:
+                excerpt = versioninfo_string[:128].decode("ascii")
+                # Don't leave any half-escaped characters
+                excerpt = excerpt[: excerpt.rfind("\\u")]
+                versioninfo_string = b(
+                    "{0} ... ({1} bytes, too long to display)".format(
+                        excerpt, len(versioninfo_string)
+                    )
+                )
+            self.__warnings.append(
+                "Invalid VS_VERSION_INFO block: {0}".format(
+                    versioninfo_string.decode("ascii").replace("\00", "\\00")
+                )
+            )
+            return
+
+        if not hasattr(self, "VS_VERSIONINFO"):
+            self.VS_VERSIONINFO = []
+
+        # Set the PE object's VS_VERSIONINFO to this one
+        vinfo = versioninfo_struct
+
+        # Set the Key attribute to point to the unicode string identifying the structure
+        vinfo.Key = versioninfo_string
+
+        self.VS_VERSIONINFO.append(vinfo)
+
+        if versioninfo_string is None:
+            versioninfo_string = ""
+        # Process the fixed version information, get the offset and structure
+        fixedfileinfo_offset = self.dword_align(
+            versioninfo_struct.sizeof() + 2 * (len(versioninfo_string) + 1),
+            version_struct.OffsetToData,
+        )
+        fixedfileinfo_struct = self.__unpack_data__(
+            self.__VS_FIXEDFILEINFO_format__,
+            raw_data[fixedfileinfo_offset:],
+            file_offset=start_offset + fixedfileinfo_offset,
+        )
+
+        if not fixedfileinfo_struct:
+            return
+
+        if not hasattr(self, "VS_FIXEDFILEINFO"):
+            self.VS_FIXEDFILEINFO = []
+
+        # Set the PE object's VS_FIXEDFILEINFO to this one
+        self.VS_FIXEDFILEINFO.append(fixedfileinfo_struct)
+
+        # Start parsing all the StringFileInfo and VarFileInfo structures
+
+        # Get the first one
+        stringfileinfo_offset = self.dword_align(
+            fixedfileinfo_offset + fixedfileinfo_struct.sizeof(),
+            version_struct.OffsetToData,
+        )
+
+        # Set the PE object's attribute that will contain them all.
+        if not hasattr(self, "FileInfo"):
+            self.FileInfo = []
+
+        finfo = []
+        while True:
+
+            # Process the StringFileInfo/VarFileInfo structure
+            stringfileinfo_struct = self.__unpack_data__(
+                self.__StringFileInfo_format__,
+                raw_data[stringfileinfo_offset:],
+                file_offset=start_offset + stringfileinfo_offset,
+            )
+
+            if stringfileinfo_struct is None:
+                self.__warnings.append(
+                    "Error parsing StringFileInfo/VarFileInfo struct"
+                )
+                return None
+
+            # Get the subsequent string defining the structure.
+            ustr_offset = (
+                version_struct.OffsetToData
+                + stringfileinfo_offset
+                + versioninfo_struct.sizeof()
+            )
+            try:
+                stringfileinfo_string = self.get_string_u_at_rva(ustr_offset)
+            except PEFormatError:
+                self.__warnings.append(
+                    "Error parsing the version information, "
+                    "attempting to read StringFileInfo string. Can't "
+                    "read unicode string at offset 0x{0:x}".format(ustr_offset)
+                )
+                break
+
+            # Set such string as the Key attribute
+            stringfileinfo_struct.Key = stringfileinfo_string
+
+            # Append the structure to the PE object's list
+            finfo.append(stringfileinfo_struct)
+
+            # Parse a StringFileInfo entry
+            if stringfileinfo_string and stringfileinfo_string.startswith(
+                b"StringFileInfo"
+            ):
+
+                if (
+                    stringfileinfo_struct.Type in (0, 1)
+                    and stringfileinfo_struct.ValueLength == 0
+                ):
+
+                    stringtable_offset = self.dword_align(
+                        stringfileinfo_offset
+                        + stringfileinfo_struct.sizeof()
+                        + 2 * (len(stringfileinfo_string) + 1),
+                        version_struct.OffsetToData,
+                    )
+
+                    stringfileinfo_struct.StringTable = []
+
+                    # Process the String Table entries
+                    while True:
+
+                        stringtable_struct = self.__unpack_data__(
+                            self.__StringTable_format__,
+                            raw_data[stringtable_offset:],
+                            file_offset=start_offset + stringtable_offset,
+                        )
+
+                        if not stringtable_struct:
+                            break
+
+                        ustr_offset = (
+                            version_struct.OffsetToData
+                            + stringtable_offset
+                            + stringtable_struct.sizeof()
+                        )
+                        try:
+                            stringtable_string = self.get_string_u_at_rva(ustr_offset)
+                        except PEFormatError:
+                            self.__warnings.append(
+                                "Error parsing the version information, "
+                                "attempting to read StringTable string. Can't "
+                                "read unicode string at offset 0x{0:x}".format(
+                                    ustr_offset
+                                )
+                            )
+                            break
+
+                        stringtable_struct.LangID = stringtable_string
+                        stringtable_struct.entries = {}
+                        stringtable_struct.entries_offsets = {}
+                        stringtable_struct.entries_lengths = {}
+                        stringfileinfo_struct.StringTable.append(stringtable_struct)
+
+                        entry_offset = self.dword_align(
+                            stringtable_offset
+                            + stringtable_struct.sizeof()
+                            + 2 * (len(stringtable_string) + 1),
+                            version_struct.OffsetToData,
+                        )
+
+                        # Process all entries in the string table
+
+                        while (
+                            entry_offset
+                            < stringtable_offset + stringtable_struct.Length
+                        ):
+
+                            string_struct = self.__unpack_data__(
+                                self.__String_format__,
+                                raw_data[entry_offset:],
+                                file_offset=start_offset + entry_offset,
+                            )
+
+                            if not string_struct:
+                                break
+
+                            ustr_offset = (
+                                version_struct.OffsetToData
+                                + entry_offset
+                                + string_struct.sizeof()
+                            )
+                            try:
+                                key = self.get_string_u_at_rva(ustr_offset)
+                                key_offset = self.get_offset_from_rva(ustr_offset)
+                            except PEFormatError:
+                                self.__warnings.append(
+                                    "Error parsing the version information, "
+                                    "attempting to read StringTable Key string. Can't "
+                                    "read unicode string at offset 0x{0:x}".format(
+                                        ustr_offset
+                                    )
+                                )
+                                break
+
+                            value_offset = self.dword_align(
+                                2 * (len(key) + 1)
+                                + entry_offset
+                                + string_struct.sizeof(),
+                                version_struct.OffsetToData,
+                            )
+
+                            ustr_offset = version_struct.OffsetToData + value_offset
+                            try:
+                                value = self.get_string_u_at_rva(
+                                    ustr_offset, max_length=string_struct.ValueLength
+                                )
+                                value_offset = self.get_offset_from_rva(ustr_offset)
+                            except PEFormatError:
+                                self.__warnings.append(
+                                    "Error parsing the version information, attempting "
+                                    "to read StringTable Value string. Can't read "
+                                    f"unicode string at offset 0x{ustr_offset:x}"
+                                )
+                                break
+
+                            if string_struct.Length == 0:
+                                entry_offset = (
+                                    stringtable_offset + stringtable_struct.Length
+                                )
+                            else:
+                                entry_offset = self.dword_align(
+                                    string_struct.Length + entry_offset,
+                                    version_struct.OffsetToData,
+                                )
+
+                            stringtable_struct.entries[key] = value
+                            stringtable_struct.entries_offsets[key] = (
+                                key_offset,
+                                value_offset,
+                            )
+                            stringtable_struct.entries_lengths[key] = (
+                                len(key),
+                                len(value),
+                            )
+
+                        new_stringtable_offset = self.dword_align(
+                            stringtable_struct.Length + stringtable_offset,
+                            version_struct.OffsetToData,
+                        )
+
+                        # Check if the entry is crafted in a way that would lead
+                        # to an infinite loop and break if so.
+                        if new_stringtable_offset == stringtable_offset:
+                            break
+                        stringtable_offset = new_stringtable_offset
+
+                        if stringtable_offset >= stringfileinfo_struct.Length:
+                            break
+
+            # Parse a VarFileInfo entry
+            elif stringfileinfo_string and stringfileinfo_string.startswith(
+                b"VarFileInfo"
+            ):
+
+                varfileinfo_struct = stringfileinfo_struct
+                varfileinfo_struct.name = "VarFileInfo"
+
+                if (
+                    varfileinfo_struct.Type in (0, 1)
+                    and varfileinfo_struct.ValueLength == 0
+                ):
+
+                    var_offset = self.dword_align(
+                        stringfileinfo_offset
+                        + varfileinfo_struct.sizeof()
+                        + 2 * (len(stringfileinfo_string) + 1),
+                        version_struct.OffsetToData,
+                    )
+
+                    varfileinfo_struct.Var = []
+
+                    # Process all entries
+
+                    while True:
+                        var_struct = self.__unpack_data__(
+                            self.__Var_format__,
+                            raw_data[var_offset:],
+                            file_offset=start_offset + var_offset,
+                        )
+
+                        if not var_struct:
+                            break
+
+                        ustr_offset = (
+                            version_struct.OffsetToData
+                            + var_offset
+                            + var_struct.sizeof()
+                        )
+                        try:
+                            var_string = self.get_string_u_at_rva(ustr_offset)
+                        except PEFormatError:
+                            self.__warnings.append(
+                                "Error parsing the version information, "
+                                "attempting to read VarFileInfo Var string. "
+                                "Can't read unicode string at offset 0x{0:x}".format(
+                                    ustr_offset
+                                )
+                            )
+                            break
+
+                        if var_string is None:
+                            break
+
+                        varfileinfo_struct.Var.append(var_struct)
+
+                        varword_offset = self.dword_align(
+                            2 * (len(var_string) + 1)
+                            + var_offset
+                            + var_struct.sizeof(),
+                            version_struct.OffsetToData,
+                        )
+                        orig_varword_offset = varword_offset
+
+                        while (
+                            varword_offset
+                            < orig_varword_offset + var_struct.ValueLength
+                        ):
+                            word1 = self.get_word_from_data(
+                                raw_data[varword_offset : varword_offset + 2], 0
+                            )
+                            word2 = self.get_word_from_data(
+                                raw_data[varword_offset + 2 : varword_offset + 4], 0
+                            )
+                            varword_offset += 4
+
+                            if isinstance(word1, int) and isinstance(word2, int):
+                                var_struct.entry = {
+                                    var_string: "0x%04x 0x%04x" % (word1, word2)
+                                }
+
+                        var_offset = self.dword_align(
+                            var_offset + var_struct.Length, version_struct.OffsetToData
+                        )
+
+                        if var_offset <= var_offset + var_struct.Length:
+                            break
+
+            # Increment and align the offset
+            stringfileinfo_offset = self.dword_align(
+                stringfileinfo_struct.Length + stringfileinfo_offset,
+                version_struct.OffsetToData,
+            )
+
+            # Check if all the StringFileInfo and VarFileInfo items have been processed
+            if (
+                stringfileinfo_struct.Length == 0
+                or stringfileinfo_offset >= versioninfo_struct.Length
+            ):
+                break
+
+        self.FileInfo.append(finfo)
+
+    def parse_export_directory(self, rva, size, forwarded_only=False):
+        """Parse the export directory.
+
+        Given the RVA of the export directory, it will process all
+        its entries.
+
+        The exports will be made available as a list of ExportData
+        instances in the 'IMAGE_DIRECTORY_ENTRY_EXPORT' PE attribute.
+        """
+
+        try:
+            export_dir = self.__unpack_data__(
+                self.__IMAGE_EXPORT_DIRECTORY_format__,
+                self.get_data(
+                    rva, Structure(self.__IMAGE_EXPORT_DIRECTORY_format__).sizeof()
+                ),
+                file_offset=self.get_offset_from_rva(rva),
+            )
+        except PEFormatError:
+            self.__warnings.append(
+                "Error parsing export directory at RVA: 0x%x" % (rva)
+            )
+            return
+
+        if not export_dir:
+            return
+
+        # We keep track of the bytes left in the file and use it to set a upper
+        # bound in the number of items that can be read from the different
+        # arrays.
+        def length_until_eof(rva):
+            return len(self.__data__) - self.get_offset_from_rva(rva)
+
+        try:
+            address_of_names = self.get_data(
+                export_dir.AddressOfNames,
+                min(
+                    length_until_eof(export_dir.AddressOfNames),
+                    export_dir.NumberOfNames * 4,
+                ),
+            )
+            address_of_name_ordinals = self.get_data(
+                export_dir.AddressOfNameOrdinals,
+                min(
+                    length_until_eof(export_dir.AddressOfNameOrdinals),
+                    export_dir.NumberOfNames * 4,
+                ),
+            )
+            address_of_functions = self.get_data(
+                export_dir.AddressOfFunctions,
+                min(
+                    length_until_eof(export_dir.AddressOfFunctions),
+                    export_dir.NumberOfFunctions * 4,
+                ),
+            )
+        except PEFormatError:
+            self.__warnings.append(
+                "Error parsing export directory at RVA: 0x%x" % (rva)
+            )
+            return
+
+        exports = []
+
+        max_failed_entries_before_giving_up = 10
+
+        section = self.get_section_by_rva(export_dir.AddressOfNames)
+        # Overly generous upper bound
+        safety_boundary = len(self.__data__)
+        if section:
+            safety_boundary = (
+                section.VirtualAddress
+                + len(section.get_data())
+                - export_dir.AddressOfNames
+            )
+
+        symbol_counts = collections.defaultdict(int)
+        export_parsing_loop_completed_normally = True
+        for i in range(min(export_dir.NumberOfNames, int(safety_boundary / 4))):
+            symbol_ordinal = self.get_word_from_data(address_of_name_ordinals, i)
+
+            if symbol_ordinal is not None and symbol_ordinal * 4 < len(
+                address_of_functions
+            ):
+                symbol_address = self.get_dword_from_data(
+                    address_of_functions, symbol_ordinal
+                )
+            else:
+                # Corrupt? a bad pointer... we assume it's all
+                # useless, no exports
+                return None
+            if symbol_address is None or symbol_address == 0:
+                continue
+
+            # If the function's RVA points within the export directory
+            # it will point to a string with the forwarded symbol's string
+            # instead of pointing the the function start address.
+            if symbol_address >= rva and symbol_address < rva + size:
+                forwarder_str = self.get_string_at_rva(symbol_address)
+                try:
+                    forwarder_offset = self.get_offset_from_rva(symbol_address)
+                except PEFormatError:
+                    continue
+            else:
+                if forwarded_only:
+                    continue
+                forwarder_str = None
+                forwarder_offset = None
+
+            symbol_name_address = self.get_dword_from_data(address_of_names, i)
+            if symbol_name_address is None:
+                max_failed_entries_before_giving_up -= 1
+                if max_failed_entries_before_giving_up <= 0:
+                    export_parsing_loop_completed_normally = False
+                    break
+
+            symbol_name = self.get_string_at_rva(
+                symbol_name_address, MAX_SYMBOL_NAME_LENGTH
+            )
+            if not is_valid_function_name(symbol_name, relax_allowed_characters=True):
+                export_parsing_loop_completed_normally = False
+                break
+            try:
+                symbol_name_offset = self.get_offset_from_rva(symbol_name_address)
+            except PEFormatError:
+                max_failed_entries_before_giving_up -= 1
+                if max_failed_entries_before_giving_up <= 0:
+                    export_parsing_loop_completed_normally = False
+                    break
+                try:
+                    symbol_name_offset = self.get_offset_from_rva(symbol_name_address)
+                except PEFormatError:
+                    max_failed_entries_before_giving_up -= 1
+                    if max_failed_entries_before_giving_up <= 0:
+                        export_parsing_loop_completed_normally = False
+                        break
+                    continue
+
+            # File 0b1d3d3664915577ab9a32188d29bbf3542b86c7b9ce333e245496c3018819f1
+            # was being parsed as potentially containing millions of exports.
+            # Checking for duplicates addresses the issue.
+            symbol_counts[(symbol_name, symbol_address)] += 1
+            if symbol_counts[(symbol_name, symbol_address)] > 10:
+                self.__warnings.append(
+                    f"Export directory contains more than 10 repeated entries "
+                    f"({symbol_name}, {symbol_address:#02x}). Assuming corrupt."
+                )
+                break
+            elif len(symbol_counts) > self.max_symbol_exports:
+                self.__warnings.append(
+                    "Export directory contains more than {} symbol entries. "
+                    "Assuming corrupt.".format(self.max_symbol_exports)
+                )
+                break
+
+            exports.append(
+                ExportData(
+                    pe=self,
+                    ordinal=export_dir.Base + symbol_ordinal,
+                    ordinal_offset=self.get_offset_from_rva(
+                        export_dir.AddressOfNameOrdinals + 2 * i
+                    ),
+                    address=symbol_address,
+                    address_offset=self.get_offset_from_rva(
+                        export_dir.AddressOfFunctions + 4 * symbol_ordinal
+                    ),
+                    name=symbol_name,
+                    name_offset=symbol_name_offset,
+                    forwarder=forwarder_str,
+                    forwarder_offset=forwarder_offset,
+                )
+            )
+
+        if not export_parsing_loop_completed_normally:
+            self.__warnings.append(
+                f"RVA AddressOfNames in the export directory points to an invalid "
+                f"address: {export_dir.AddressOfNames:x}"
+            )
+
+        ordinals = {exp.ordinal for exp in exports}
+
+        max_failed_entries_before_giving_up = 10
+
+        section = self.get_section_by_rva(export_dir.AddressOfFunctions)
+        # Overly generous upper bound
+        safety_boundary = len(self.__data__)
+        if section:
+            safety_boundary = (
+                section.VirtualAddress
+                + len(section.get_data())
+                - export_dir.AddressOfFunctions
+            )
+
+        symbol_counts = collections.defaultdict(int)
+        export_parsing_loop_completed_normally = True
+        for idx in range(min(export_dir.NumberOfFunctions, int(safety_boundary / 4))):
+
+            if not idx + export_dir.Base in ordinals:
+                try:
+                    symbol_address = self.get_dword_from_data(address_of_functions, idx)
+                except PEFormatError:
+                    symbol_address = None
+
+                if symbol_address is None:
+                    max_failed_entries_before_giving_up -= 1
+                    if max_failed_entries_before_giving_up <= 0:
+                        export_parsing_loop_completed_normally = False
+                        break
+
+                if symbol_address == 0:
+                    continue
+
+                # Checking for forwarder again.
+                if (
+                    symbol_address is not None
+                    and symbol_address >= rva
+                    and symbol_address < rva + size
+                ):
+                    forwarder_str = self.get_string_at_rva(symbol_address)
+                else:
+                    forwarder_str = None
+
+                # File 0b1d3d3664915577ab9a32188d29bbf3542b86c7b9ce333e245496c3018819f1
+                # was being parsed as potentially containing millions of exports.
+                # Checking for duplicates addresses the issue.
+                symbol_counts[symbol_address] += 1
+                if symbol_counts[symbol_address] > self.max_repeated_symbol:
+                    # if most_common and most_common[0][1] > 10:
+                    self.__warnings.append(
+                        "Export directory contains more than {} repeated "
+                        "ordinal entries (0x{:x}). Assuming corrupt.".format(
+                            self.max_repeated_symbol, symbol_address
+                        )
+                    )
+                    break
+                elif len(symbol_counts) > self.max_symbol_exports:
+                    self.__warnings.append(
+                        "Export directory contains more than "
+                        f"{self.max_symbol_exports} ordinal entries. Assuming corrupt."
+                    )
+                    break
+
+                exports.append(
+                    ExportData(
+                        ordinal=export_dir.Base + idx,
+                        address=symbol_address,
+                        name=None,
+                        forwarder=forwarder_str,
+                    )
+                )
+
+        if not export_parsing_loop_completed_normally:
+            self.__warnings.append(
+                "RVA AddressOfFunctions in the export directory points to an invalid "
+                f"address: {export_dir.AddressOfFunctions:x}"
+            )
+            return
+
+        if not exports and export_dir.all_zeroes():
+            return None
+        return ExportDirData(
+            struct=export_dir,
+            symbols=exports,
+            name=self.get_string_at_rva(export_dir.Name),
+        )
+
+    def dword_align(self, offset, base):
+        return ((offset + base + 3) & 0xFFFFFFFC) - (base & 0xFFFFFFFC)
+
+    def normalize_import_va(self, va):
+
+        # Setup image range
+        begin_of_image = self.OPTIONAL_HEADER.ImageBase
+        end_of_image = self.OPTIONAL_HEADER.ImageBase + self.OPTIONAL_HEADER.SizeOfImage
+
+        # Try to avoid bogus VAs, which are out of the image.
+        # This also filters out entries that are zero
+        if begin_of_image <= va and va < end_of_image:
+            va -= begin_of_image
+        return va
+
+    def parse_delay_import_directory(self, rva, size):
+        """Walk and parse the delay import directory."""
+
+        import_descs = []
+        error_count = 0
+        while True:
+            try:
+                # If the RVA is invalid all would blow up. Some PEs seem to be
+                # specially nasty and have an invalid RVA.
+                data = self.get_data(
+                    rva,
+                    Structure(self.__IMAGE_DELAY_IMPORT_DESCRIPTOR_format__).sizeof(),
+                )
+            except PEFormatError:
+                self.__warnings.append(
+                    "Error parsing the Delay import directory at RVA: 0x%x" % (rva)
+                )
+                break
+
+            file_offset = self.get_offset_from_rva(rva)
+            import_desc = self.__unpack_data__(
+                self.__IMAGE_DELAY_IMPORT_DESCRIPTOR_format__,
+                data,
+                file_offset=file_offset,
+            )
+
+            # If the structure is all zeros, we reached the end of the list
+            if not import_desc or import_desc.all_zeroes():
+                break
+            contains_addresses = False
+
+            # Handle old import descriptor that has Virtual Addresses instead of RVAs
+            # This version of import descriptor is created by old Visual Studio versions
+            # (pre 6.0)
+            # Can only be present in 32-bit binaries (no 64-bit compiler existed at the
+            # time)
+            # Sample: e8d3bff0c1a9a6955993f7a441121a2692261421e82fdfadaaded45d3bea9980
+            if (
+                import_desc.grAttrs == 0
+                and self.FILE_HEADER.Machine == MACHINE_TYPE["IMAGE_FILE_MACHINE_I386"]
+            ):
+                import_desc.pBoundIAT = self.normalize_import_va(import_desc.pBoundIAT)
+                import_desc.pIAT = self.normalize_import_va(import_desc.pIAT)
+                import_desc.pINT = self.normalize_import_va(import_desc.pINT)
+                import_desc.pUnloadIAT = self.normalize_import_va(
+                    import_desc.pUnloadIAT
+                )
+                import_desc.phmod = self.normalize_import_va(import_desc.pUnloadIAT)
+                import_desc.szName = self.normalize_import_va(import_desc.szName)
+                contains_addresses = True
+
+            rva += import_desc.sizeof()
+
+            # If the array of thunks is somewhere earlier than the import
+            # descriptor we can set a maximum length for the array. Otherwise
+            # just set a maximum length of the size of the file
+            max_len = len(self.__data__) - file_offset
+            if rva > import_desc.pINT or rva > import_desc.pIAT:
+                max_len = max(rva - import_desc.pINT, rva - import_desc.pIAT)
+
+            import_data = []
+            try:
+                import_data = self.parse_imports(
+                    import_desc.pINT,
+                    import_desc.pIAT,
+                    None,
+                    max_len,
+                    contains_addresses,
+                )
+            except PEFormatError as excp:
+                self.__warnings.append(
+                    "Error parsing the Delay import directory. "
+                    "Invalid import data at RVA: 0x{0:x} ({1})".format(rva, excp.value)
+                )
+
+            if error_count > 5:
+                self.__warnings.append(
+                    "Too many errors parsing the Delay import directory. "
+                    "Invalid import data at RVA: 0x{0:x}".format(rva)
+                )
+                break
+
+            if not import_data:
+                error_count += 1
+                continue
+
+            if self.__total_import_symbols > MAX_IMPORT_SYMBOLS:
+                self.__warnings.append(
+                    "Error, too many imported symbols %d (>%s)"
+                    % (self.__total_import_symbols, MAX_IMPORT_SYMBOLS)
+                )
+                break
+
+            dll = self.get_string_at_rva(import_desc.szName, MAX_DLL_LENGTH)
+            if not is_valid_dos_filename(dll):
+                dll = b("*invalid*")
+
+            if dll:
+                for symbol in import_data:
+                    if symbol.name is None:
+                        funcname = ordlookup.ordLookup(dll.lower(), symbol.ordinal)
+                        if funcname:
+                            symbol.name = funcname
+                import_descs.append(
+                    ImportDescData(struct=import_desc, imports=import_data, dll=dll)
+                )
+
+        return import_descs
+
+    def get_rich_header_hash(self, algorithm="md5"):
+        if not hasattr(self, "RICH_HEADER") or self.RICH_HEADER is None:
+            return ""
+
+        if algorithm == "md5":
+            return md5(self.RICH_HEADER.clear_data).hexdigest()
+        elif algorithm == "sha1":
+            return sha1(self.RICH_HEADER.clear_data).hexdigest()
+        elif algorithm == "sha256":
+            return sha256(self.RICH_HEADER.clear_data).hexdigest()
+        elif algorithm == "sha512":
+            return sha512(self.RICH_HEADER.clear_data).hexdigest()
+
+        raise Exception("Invalid hashing algorithm specified")
+
+    def get_imphash(self):
+        """Return the imphash of the PE file.
+
+        Creates a hash based on imported symbol names and their specific order within
+        the executable:
+        https://www.mandiant.com/resources/blog/tracking-malware-import-hashing
+
+        Returns:
+            the hexdigest of the MD5 hash of the exported symbols.
+        """
+
+        impstrs = []
+        exts = ["ocx", "sys", "dll"]
+        if not hasattr(self, "DIRECTORY_ENTRY_IMPORT"):
+            return ""
+        for entry in self.DIRECTORY_ENTRY_IMPORT:
+            if isinstance(entry.dll, bytes):
+                libname = entry.dll.decode().lower()
+            else:
+                libname = entry.dll.lower()
+            parts = libname.rsplit(".", 1)
+
+            if len(parts) > 1 and parts[1] in exts:
+                libname = parts[0]
+
+            entry_dll_lower = entry.dll.lower()
+            for imp in entry.imports:
+                funcname = None
+                if not imp.name:
+                    funcname = ordlookup.ordLookup(
+                        entry_dll_lower, imp.ordinal, make_name=True
+                    )
+                    if not funcname:
+                        raise PEFormatError(
+                            f"Unable to look up ordinal {entry.dll}:{imp.ordinal:04x}"
+                        )
+                else:
+                    funcname = imp.name
+
+                if not funcname:
+                    continue
+
+                if isinstance(funcname, bytes):
+                    funcname = funcname.decode()
+                impstrs.append("%s.%s" % (libname.lower(), funcname.lower()))
+
+        return md5(",".join(impstrs).encode()).hexdigest()
+
+    def get_exphash(self):
+        """Return the exphash of the PE file.
+
+        Similar to imphash, but based on exported symbol names and their specific order.
+
+        Returns:
+            the hexdigest of the SHA256 hash of the exported symbols.
+        """
+
+        if not hasattr(self, "DIRECTORY_ENTRY_EXPORT"):
+            return ""
+
+        if not hasattr(self.DIRECTORY_ENTRY_EXPORT, "symbols"):
+            return ""
+
+        export_list = [
+            e.name.decode().lower()
+            for e in self.DIRECTORY_ENTRY_EXPORT.symbols
+            if e and e.name is not None
+        ]
+        if len(export_list) == 0:
+            return ""
+
+        return sha256(",".join(export_list).encode()).hexdigest()
+
+    def parse_import_directory(self, rva, size, dllnames_only=False):
+        """Walk and parse the import directory."""
+
+        import_descs = []
+        error_count = 0
+        image_import_descriptor_size = Structure(
+            self.__IMAGE_IMPORT_DESCRIPTOR_format__
+        ).sizeof()
+        while True:
+            try:
+                # If the RVA is invalid all would blow up. Some EXEs seem to be
+                # specially nasty and have an invalid RVA.
+                data = self.get_data(rva, image_import_descriptor_size)
+            except PEFormatError:
+                self.__warnings.append(
+                    f"Error parsing the import directory at RVA: 0x{rva:x}"
+                )
+                break
+
+            file_offset = self.get_offset_from_rva(rva)
+            import_desc = self.__unpack_data__(
+                self.__IMAGE_IMPORT_DESCRIPTOR_format__, data, file_offset=file_offset
+            )
+
+            # If the structure is all zeros, we reached the end of the list
+            if not import_desc or import_desc.all_zeroes():
+                break
+
+            rva += import_desc.sizeof()
+
+            # If the array of thunks is somewhere earlier than the import
+            # descriptor we can set a maximum length for the array. Otherwise
+            # just set a maximum length of the size of the file
+            max_len = len(self.__data__) - file_offset
+            if rva > import_desc.OriginalFirstThunk or rva > import_desc.FirstThunk:
+                max_len = max(
+                    rva - import_desc.OriginalFirstThunk, rva - import_desc.FirstThunk
+                )
+
+            import_data = []
+            if not dllnames_only:
+                try:
+                    import_data = self.parse_imports(
+                        import_desc.OriginalFirstThunk,
+                        import_desc.FirstThunk,
+                        import_desc.ForwarderChain,
+                        max_length=max_len,
+                    )
+                except PEFormatError as e:
+                    self.__warnings.append(
+                        "Error parsing the import directory. "
+                        f"Invalid Import data at RVA: 0x{rva:x} ({e.value})"
+                    )
+
+                if error_count > 5:
+                    self.__warnings.append(
+                        "Too many errors parsing the import directory. "
+                        f"Invalid import data at RVA: 0x{rva:x}"
+                    )
+                    break
+
+                if not import_data:
+                    error_count += 1
+                    # TODO: do not continue here
+                    continue
+
+            dll = self.get_string_at_rva(import_desc.Name, MAX_DLL_LENGTH)
+            if not is_valid_dos_filename(dll):
+                dll = b("*invalid*")
+
+            if dll:
+                for symbol in import_data:
+                    if symbol.name is None:
+                        funcname = ordlookup.ordLookup(dll.lower(), symbol.ordinal)
+                        if funcname:
+                            symbol.name = funcname
+                import_descs.append(
+                    ImportDescData(struct=import_desc, imports=import_data, dll=dll)
+                )
+
+        if not dllnames_only:
+            suspicious_imports = set(["LoadLibrary", "GetProcAddress"])
+            suspicious_imports_count = 0
+            total_symbols = 0
+            for imp_dll in import_descs:
+                for symbol in imp_dll.imports:
+                    for suspicious_symbol in suspicious_imports:
+                        if not symbol or not symbol.name:
+                            continue
+                        name = symbol.name
+                        if type(symbol.name) == bytes:
+                            name = symbol.name.decode("utf-8")
+                        if name.startswith(suspicious_symbol):
+                            suspicious_imports_count += 1
+                            break
+                    total_symbols += 1
+            if (
+                suspicious_imports_count == len(suspicious_imports)
+                and total_symbols < 20
+            ):
+                self.__warnings.append(
+                    "Imported symbols contain entries typical of packed executables."
+                )
+
+        return import_descs
+
+    def parse_imports(
+        self,
+        original_first_thunk,
+        first_thunk,
+        forwarder_chain,
+        max_length=None,
+        contains_addresses=False,
+    ):
+        """Parse the imported symbols.
+
+        It will fill a list, which will be available as the dictionary
+        attribute "imports". Its keys will be the DLL names and the values
+        of all the symbols imported from that object.
+        """
+
+        imported_symbols = []
+
+        # Import Lookup Table. Contains ordinals or pointers to strings.
+        ilt = self.get_import_table(
+            original_first_thunk, max_length, contains_addresses
+        )
+        # Import Address Table. May have identical content to ILT if
+        # PE file is not bound. It will contain the address of the
+        # imported symbols once the binary is loaded or if it is already
+        # bound.
+        iat = self.get_import_table(first_thunk, max_length, contains_addresses)
+
+        # OC Patch:
+        # Would crash if IAT or ILT had None type
+        if (not iat or len(iat) == 0) and (not ilt or len(ilt) == 0):
+            self.__warnings.append(
+                "Damaged Import Table information. "
+                "ILT and/or IAT appear to be broken. "
+                f"OriginalFirstThunk: 0x{original_first_thunk:x} "
+                f"FirstThunk: 0x{first_thunk:x}"
+            )
+            return []
+
+        table = None
+        if ilt:
+            table = ilt
+        elif iat:
+            table = iat
+        else:
+            return None
+
+        imp_offset = 4
+        address_mask = 0x7FFFFFFF
+        if self.PE_TYPE == OPTIONAL_HEADER_MAGIC_PE:
+            ordinal_flag = IMAGE_ORDINAL_FLAG
+        elif self.PE_TYPE == OPTIONAL_HEADER_MAGIC_PE_PLUS:
+            ordinal_flag = IMAGE_ORDINAL_FLAG64
+            imp_offset = 8
+            address_mask = 0x7FFFFFFFFFFFFFFF
+        else:
+            # Some PEs may have an invalid value in the Magic field of the
+            # Optional Header. Just in case the remaining file is parseable
+            # let's pretend it's a 32bit PE32 by default.
+            ordinal_flag = IMAGE_ORDINAL_FLAG
+
+        num_invalid = 0
+        for idx, tbl_entry in enumerate(table):
+            imp_ord = None
+            imp_hint = None
+            imp_name = None
+            name_offset = None
+            hint_name_table_rva = None
+            import_by_ordinal = False  # declare it here first
+
+            if tbl_entry.AddressOfData:
+                # If imported by ordinal, we will append the ordinal number
+                #
+                if tbl_entry.AddressOfData & ordinal_flag:
+                    import_by_ordinal = True
+                    imp_ord = tbl_entry.AddressOfData & 0xFFFF
+                    imp_name = None
+                    name_offset = None
+                else:
+                    import_by_ordinal = False
+                    try:
+                        hint_name_table_rva = tbl_entry.AddressOfData & address_mask
+                        data = self.get_data(hint_name_table_rva, 2)
+                        # Get the Hint
+                        imp_hint = self.get_word_from_data(data, 0)
+                        imp_name = self.get_string_at_rva(
+                            tbl_entry.AddressOfData + 2, MAX_IMPORT_NAME_LENGTH
+                        )
+                        if not is_valid_function_name(imp_name):
+                            imp_name = b("*invalid*")
+
+                        name_offset = self.get_offset_from_rva(
+                            tbl_entry.AddressOfData + 2
+                        )
+                    except PEFormatError:
+                        pass
+
+                # by nriva: we want the ThunkRVA and ThunkOffset
+                thunk_offset = tbl_entry.get_file_offset()
+                thunk_rva = self.get_rva_from_offset(thunk_offset)
+
+            imp_address = (
+                first_thunk + self.OPTIONAL_HEADER.ImageBase + idx * imp_offset
+            )
+
+            struct_iat = None
+            try:
+                if iat and ilt and ilt[idx].AddressOfData != iat[idx].AddressOfData:
+                    imp_bound = iat[idx].AddressOfData
+                    struct_iat = iat[idx]
+                else:
+                    imp_bound = None
+            except IndexError:
+                imp_bound = None
+
+            # The file with hashes:
+            #
+            # MD5: bfe97192e8107d52dd7b4010d12b2924
+            # SHA256: 3d22f8b001423cb460811ab4f4789f277b35838d45c62ec0454c877e7c82c7f5
+            #
+            # has an invalid table built in a way that it's parseable but contains
+            # invalid entries that lead pefile to take extremely long amounts of time to
+            # parse. It also leads to extreme memory consumption.
+            # To prevent similar cases, if invalid entries are found in the middle of a
+            # table the parsing will be aborted
+            #
+            if imp_ord is None and imp_name is None:
+                raise PEFormatError("Invalid entries, aborting parsing.")
+
+            # Some PEs appear to interleave valid and invalid imports. Instead of
+            # aborting the parsing altogether we will simply skip the invalid entries.
+            # Although if we see 1000 invalid entries and no legit ones, we abort.
+            if imp_name == b("*invalid*"):
+                if num_invalid > 1000 and num_invalid == idx:
+                    raise PEFormatError("Too many invalid names, aborting parsing.")
+                num_invalid += 1
+                continue
+
+            if imp_ord or imp_name:
+                imported_symbols.append(
+                    ImportData(
+                        pe=self,
+                        struct_table=tbl_entry,
+                        struct_iat=struct_iat,  # for bound imports if any
+                        import_by_ordinal=import_by_ordinal,
+                        ordinal=imp_ord,
+                        ordinal_offset=tbl_entry.get_file_offset(),
+                        hint=imp_hint,
+                        name=imp_name,
+                        name_offset=name_offset,
+                        bound=imp_bound,
+                        address=imp_address,
+                        hint_name_table_rva=hint_name_table_rva,
+                        thunk_offset=thunk_offset,
+                        thunk_rva=thunk_rva,
+                    )
+                )
+
+        return imported_symbols
+
+    def get_import_table(self, rva, max_length=None, contains_addresses=False):
+
+        table = []
+
+        # We need the ordinal flag for a simple heuristic
+        # we're implementing within the loop
+        #
+        if self.PE_TYPE == OPTIONAL_HEADER_MAGIC_PE:
+            ordinal_flag = IMAGE_ORDINAL_FLAG
+            format = self.__IMAGE_THUNK_DATA_format__
+        elif self.PE_TYPE == OPTIONAL_HEADER_MAGIC_PE_PLUS:
+            ordinal_flag = IMAGE_ORDINAL_FLAG64
+            format = self.__IMAGE_THUNK_DATA64_format__
+        else:
+            # Some PEs may have an invalid value in the Magic field of the
+            # Optional Header. Just in case the remaining file is parseable
+            # let's pretend it's a 32bit PE32 by default.
+            ordinal_flag = IMAGE_ORDINAL_FLAG
+            format = self.__IMAGE_THUNK_DATA_format__
+
+        expected_size = Structure(format).sizeof()
+        MAX_ADDRESS_SPREAD = 128 * 2**20  # 128 MB
+        ADDR_4GB = 2**32
+        MAX_REPEATED_ADDRESSES = 15
+        repeated_address = 0
+        addresses_of_data_set_64 = AddressSet()
+        addresses_of_data_set_32 = AddressSet()
+        start_rva = rva
+        while rva:
+            if max_length is not None and rva >= start_rva + max_length:
+                self.__warnings.append(
+                    "Error parsing the import table. Entries go beyond bounds."
+                )
+                break
+            # Enforce an upper bounds on import symbols.
+            if self.__total_import_symbols > MAX_IMPORT_SYMBOLS:
+                self.__warnings.append(
+                    "Excessive number of imports %d (>%s)"
+                    % (self.__total_import_symbols, MAX_IMPORT_SYMBOLS)
+                )
+                break
+
+            self.__total_import_symbols += 1
+
+            # if we see too many times the same entry we assume it could be
+            # a table containing bogus data (with malicious intent or otherwise)
+            if repeated_address >= MAX_REPEATED_ADDRESSES:
+                return []
+
+            # if the addresses point somewhere but the difference between the highest
+            # and lowest address is larger than MAX_ADDRESS_SPREAD we assume a bogus
+            # table as the addresses should be contained within a module
+            if addresses_of_data_set_32.diff() > MAX_ADDRESS_SPREAD:
+                return []
+            if addresses_of_data_set_64.diff() > MAX_ADDRESS_SPREAD:
+                return []
+
+            failed = False
+            try:
+                data = self.get_data(rva, expected_size)
+            except PEFormatError:
+                failed = True
+
+            if failed or len(data) != expected_size:
+                self.__warnings.append(
+                    "Error parsing the import table. " "Invalid data at RVA: 0x%x" % rva
+                )
+                return None
+
+            thunk_data = self.__unpack_data__(
+                format, data, file_offset=self.get_offset_from_rva(rva)
+            )
+
+            # If the thunk data contains VAs instead of RVAs, we need to normalize them
+            if contains_addresses:
+                thunk_data.AddressOfData = self.normalize_import_va(
+                    thunk_data.AddressOfData
+                )
+                thunk_data.ForwarderString = self.normalize_import_va(
+                    thunk_data.ForwarderString
+                )
+                thunk_data.Function = self.normalize_import_va(thunk_data.Function)
+                thunk_data.Ordinal = self.normalize_import_va(thunk_data.Ordinal)
+
+            # Check if the AddressOfData lies within the range of RVAs that it's
+            # being scanned, abort if that is the case, as it is very unlikely
+            # to be legitimate data.
+            # Seen in PE with SHA256:
+            # 5945bb6f0ac879ddf61b1c284f3b8d20c06b228e75ae4f571fa87f5b9512902c
+            if (
+                thunk_data
+                and thunk_data.AddressOfData >= start_rva
+                and thunk_data.AddressOfData <= rva
+            ):
+                self.__warnings.append(
+                    "Error parsing the import table. "
+                    "AddressOfData overlaps with THUNK_DATA for "
+                    "THUNK at RVA 0x%x" % (rva)
+                )
+                break
+
+            if thunk_data and thunk_data.AddressOfData:
+                addr_of_data = thunk_data.AddressOfData
+                # If the entry looks like could be an ordinal...
+                if addr_of_data & ordinal_flag:
+                    # but its value is beyond 2^16, we will assume it's a
+                    # corrupted and ignore it altogether
+                    if addr_of_data & 0x7FFFFFFF > 0xFFFF:
+                        return []
+                # and if it looks like it should be an RVA
+                else:
+                    # keep track of the RVAs seen and store them to study their
+                    # properties. When certain non-standard features are detected
+                    # the parsing will be aborted
+                    if addr_of_data >= ADDR_4GB:
+                        the_set = addresses_of_data_set_64
+                    else:
+                        the_set = addresses_of_data_set_32
+
+                    if addr_of_data in the_set:
+                        repeated_address += 1
+                    the_set.add(addr_of_data)
+
+            if not thunk_data or thunk_data.all_zeroes():
+                break
+
+            rva += thunk_data.sizeof()
+
+            table.append(thunk_data)
+
+        return table
+
+    def get_memory_mapped_image(self, max_virtual_address=0x10000000, ImageBase=None):
+        """Returns the data corresponding to the memory layout of the PE file.
+
+        The data includes the PE header and the sections loaded at offsets
+        corresponding to their relative virtual addresses. (the VirtualAddress
+        section header member).
+        Any offset in this data corresponds to the absolute memory address
+        ImageBase+offset.
+
+        The optional argument 'max_virtual_address' provides with means of limiting
+        which sections are processed.
+        Any section with their VirtualAddress beyond this value will be skipped.
+        Normally, sections with values beyond this range are just there to confuse
+        tools. It's a common trick to see in packed executables.
+
+        If the 'ImageBase' optional argument is supplied, the file's relocations
+        will be applied to the image by calling the 'relocate_image()' method. Beware
+        that the relocation information is applied permanently.
+        """
+
+        # Rebase if requested
+        #
+        if ImageBase is not None:
+
+            # Keep a copy of the image's data before modifying it by rebasing it
+            #
+            original_data = self.__data__
+
+            self.relocate_image(ImageBase)
+
+        # Collect all sections in one code block
+        mapped_data = self.__data__[:]
+        for section in self.sections:
+
+            # Miscellaneous integrity tests.
+            # Some packer will set these to bogus values to make tools go nuts.
+            if section.Misc_VirtualSize == 0 and section.SizeOfRawData == 0:
+                continue
+
+            srd = section.SizeOfRawData
+            prd = self.adjust_FileAlignment(
+                section.PointerToRawData, self.OPTIONAL_HEADER.FileAlignment
+            )
+            VirtualAddress_adj = self.adjust_SectionAlignment(
+                section.VirtualAddress,
+                self.OPTIONAL_HEADER.SectionAlignment,
+                self.OPTIONAL_HEADER.FileAlignment,
+            )
+
+            if (
+                srd > len(self.__data__)
+                or prd > len(self.__data__)
+                or srd + prd > len(self.__data__)
+                or VirtualAddress_adj >= max_virtual_address
+            ):
+                continue
+
+            padding_length = VirtualAddress_adj - len(mapped_data)
+
+            if padding_length > 0:
+                mapped_data += b"\0" * padding_length
+            elif padding_length < 0:
+                mapped_data = mapped_data[:padding_length]
+
+            mapped_data += section.get_data()
+
+        # If the image was rebased, restore it to its original form
+        #
+        if ImageBase is not None:
+            self.__data__ = original_data
+
+        return mapped_data
+
+    def get_resources_strings(self):
+        """Returns a list of all the strings found withing the resources (if any).
+
+        This method will scan all entries in the resources directory of the PE, if
+        there is one, and will return a [] with the strings.
+
+        An empty list will be returned otherwise.
+        """
+
+        resources_strings = []
+
+        if hasattr(self, "DIRECTORY_ENTRY_RESOURCE"):
+
+            for res_type in self.DIRECTORY_ENTRY_RESOURCE.entries:
+                if hasattr(res_type, "directory"):
+                    for resource_id in res_type.directory.entries:
+                        if hasattr(resource_id, "directory"):
+                            if (
+                                hasattr(resource_id.directory, "strings")
+                                and resource_id.directory.strings
+                            ):
+                                for res_string in list(
+                                    resource_id.directory.strings.values()
+                                ):
+                                    resources_strings.append(res_string)
+
+        return resources_strings
+
+    def get_data(self, rva=0, length=None):
+        """Get data regardless of the section where it lies on.
+
+        Given a RVA and the size of the chunk to retrieve, this method
+        will find the section where the data lies and return the data.
+        """
+
+        s = self.get_section_by_rva(rva)
+
+        if length:
+            end = rva + length
+        else:
+            end = None
+
+        if not s:
+            if rva < len(self.header):
+                return self.header[rva:end]
+
+            # Before we give up we check whether the file might
+            # contain the data anyway. There are cases of PE files
+            # without sections that rely on windows loading the first
+            # 8291 bytes into memory and assume the data will be
+            # there
+            # A functional file with these characteristics is:
+            # MD5: 0008892cdfbc3bda5ce047c565e52295
+            # SHA-1: c7116b9ff950f86af256defb95b5d4859d4752a9
+            #
+            if rva < len(self.__data__):
+                return self.__data__[rva:end]
+
+            raise PEFormatError("data at RVA can't be fetched. Corrupt header?")
+
+        return s.get_data(rva, length)
+
+    def get_rva_from_offset(self, offset):
+        """Get the RVA corresponding to this file offset."""
+
+        s = self.get_section_by_offset(offset)
+        if not s:
+            if self.sections:
+                lowest_rva = min(
+                    [
+                        self.adjust_SectionAlignment(
+                            s.VirtualAddress,
+                            self.OPTIONAL_HEADER.SectionAlignment,
+                            self.OPTIONAL_HEADER.FileAlignment,
+                        )
+                        for s in self.sections
+                    ]
+                )
+                if offset < lowest_rva:
+                    # We will assume that the offset lies within the headers, or
+                    # at least points before where the earliest section starts
+                    # and we will simply return the offset as the RVA
+                    #
+                    # The case illustrating this behavior can be found at:
+                    # http://corkami.blogspot.com/2010/01/hey-hey-hey-whats-in-your-head.html
+                    # where the import table is not contained by any section
+                    # hence the RVA needs to be resolved to a raw offset
+                    return offset
+                return None
+            else:
+                return offset
+        return s.get_rva_from_offset(offset)
+
+    def get_offset_from_rva(self, rva):
+        """Get the file offset corresponding to this RVA.
+
+        Given a RVA , this method will find the section where the
+        data lies and return the offset within the file.
+        """
+
+        s = self.get_section_by_rva(rva)
+        if not s:
+
+            # If not found within a section assume it might
+            # point to overlay data or otherwise data present
+            # but not contained in any section. In those
+            # cases the RVA should equal the offset
+            if rva < len(self.__data__):
+                return rva
+
+            raise PEFormatError(f"data at RVA 0x{rva:x} can't be fetched")
+
+        return s.get_offset_from_rva(rva)
+
+    def get_string_at_rva(self, rva, max_length=MAX_STRING_LENGTH):
+        """Get an ASCII string located at the given address."""
+
+        if rva is None:
+            return None
+
+        s = self.get_section_by_rva(rva)
+        if not s:
+            return self.get_string_from_data(0, self.__data__[rva : rva + max_length])
+        return self.get_string_from_data(0, s.get_data(rva, length=max_length))
+
+    def get_bytes_from_data(self, offset, data):
+        """."""
+        if offset > len(data):
+            return b""
+        d = data[offset:]
+        if isinstance(d, bytearray):
+            return bytes(d)
+        return d
+
+    def get_string_from_data(self, offset, data):
+        """Get an ASCII string from data."""
+        s = self.get_bytes_from_data(offset, data)
+        end = s.find(b"\0")
+        if end >= 0:
+            s = s[:end]
+        return s
+
+    def get_string_u_at_rva(self, rva, max_length=2**16, encoding=None):
+        """Get an Unicode string located at the given address."""
+
+        if max_length == 0:
+            return b""
+
+        # If the RVA is invalid let the exception reach the callers. All
+        # call-sites of get_string_u_at_rva() will handle it.
+        data = self.get_data(rva, 2)
+        # max_length is the maximum count of 16bit characters needs to be
+        # doubled to get size in bytes
+        max_length <<= 1
+
+        requested = min(max_length, 256)
+        data = self.get_data(rva, requested)
+        # try to find null-termination
+        null_index = -1
+        while True:
+            null_index = data.find(b"\x00\x00", null_index + 1)
+            if null_index == -1:
+                data_length = len(data)
+                if data_length < requested or data_length == max_length:
+                    null_index = len(data) >> 1
+                    break
+
+                # Request remaining part of data limited by max_length
+                data += self.get_data(rva + data_length, max_length - data_length)
+                null_index = requested - 1
+                requested = max_length
+
+            elif null_index % 2 == 0:
+                null_index >>= 1
+                break
+
+        # convert selected part of the string to unicode
+        uchrs = struct.unpack("<{:d}H".format(null_index), data[: null_index * 2])
+        s = "".join(map(chr, uchrs))
+
+        if encoding:
+            return b(s.encode(encoding, "backslashreplace_"))
+
+        return b(s.encode("utf-8", "backslashreplace_"))
+
+    def get_section_by_offset(self, offset):
+        """Get the section containing the given file offset."""
+
+        for section in self.sections:
+            if section.contains_offset(offset):
+                return section
+
+        return None
+
+    def get_section_by_rva(self, rva):
+        """Get the section containing the given address."""
+
+        # if we look a lot of times at RVA in the same section, "cache" the last used section
+        # to speedup lookups (very useful when parsing import table)
+        if self._get_section_by_rva_last_used is not None:
+            if self._get_section_by_rva_last_used.contains_rva(rva):
+                return self._get_section_by_rva_last_used
+
+        for section in self.sections:
+            if section.contains_rva(rva):
+                self._get_section_by_rva_last_used = section
+                return section
+
+        return None
+
+    def __str__(self):
+        return self.dump_info()
+
+    def has_relocs(self):
+        """Checks if the PE file has relocation directory"""
+        return hasattr(self, "DIRECTORY_ENTRY_BASERELOC")
+
+    def has_dynamic_relocs(self):
+        if hasattr(self, "DIRECTORY_ENTRY_LOAD_CONFIG"):
+            if self.DIRECTORY_ENTRY_LOAD_CONFIG.dynamic_relocations:
+                return True
+
+        return False
+
+    def print_info(self, encoding="utf-8"):
+        """Print all the PE header information in a human readable from."""
+        print(self.dump_info(encoding=encoding))
+
+    def dump_info(self, dump=None, encoding="ascii"):
+        """Dump all the PE header information into human readable string."""
+
+        if dump is None:
+            dump = Dump()
+
+        warnings = self.get_warnings()
+        if warnings:
+            dump.add_header("Parsing Warnings")
+            for warning in warnings:
+                dump.add_line(warning)
+                dump.add_newline()
+
+        dump.add_header("DOS_HEADER")
+        dump.add_lines(self.DOS_HEADER.dump())
+        dump.add_newline()
+
+        dump.add_header("NT_HEADERS")
+        dump.add_lines(self.NT_HEADERS.dump())
+        dump.add_newline()
+
+        dump.add_header("FILE_HEADER")
+        dump.add_lines(self.FILE_HEADER.dump())
+
+        image_flags = retrieve_flags(IMAGE_CHARACTERISTICS, "IMAGE_FILE_")
+
+        dump.add("Flags: ")
+        flags = []
+        for flag in sorted(image_flags):
+            if getattr(self.FILE_HEADER, flag[0]):
+                flags.append(flag[0])
+        dump.add_line(", ".join(flags))
+        dump.add_newline()
+
+        if hasattr(self, "OPTIONAL_HEADER") and self.OPTIONAL_HEADER is not None:
+            dump.add_header("OPTIONAL_HEADER")
+            dump.add_lines(self.OPTIONAL_HEADER.dump())
+
+        dll_characteristics_flags = retrieve_flags(
+            DLL_CHARACTERISTICS, "IMAGE_DLLCHARACTERISTICS_"
+        )
+
+        dump.add("DllCharacteristics: ")
+        flags = []
+        for flag in sorted(dll_characteristics_flags):
+            if getattr(self.OPTIONAL_HEADER, flag[0]):
+                flags.append(flag[0])
+        dump.add_line(", ".join(flags))
+        dump.add_newline()
+
+        dump.add_header("PE Sections")
+
+        section_flags = retrieve_flags(SECTION_CHARACTERISTICS, "IMAGE_SCN_")
+
+        for section in self.sections:
+            dump.add_lines(section.dump())
+            dump.add("Flags: ")
+            flags = []
+            for flag in sorted(section_flags):
+                if getattr(section, flag[0]):
+                    flags.append(flag[0])
+            dump.add_line(", ".join(flags))
+            dump.add_line(
+                "Entropy: {0:f} (Min=0.0, Max=8.0)".format(section.get_entropy())
+            )
+            if md5 is not None:
+                dump.add_line("MD5     hash: {0}".format(section.get_hash_md5()))
+            if sha1 is not None:
+                dump.add_line("SHA-1   hash: %s" % section.get_hash_sha1())
+            if sha256 is not None:
+                dump.add_line("SHA-256 hash: %s" % section.get_hash_sha256())
+            if sha512 is not None:
+                dump.add_line("SHA-512 hash: %s" % section.get_hash_sha512())
+            dump.add_newline()
+
+        if hasattr(self, "OPTIONAL_HEADER") and hasattr(
+            self.OPTIONAL_HEADER, "DATA_DIRECTORY"
+        ):
+
+            dump.add_header("Directories")
+            for directory in self.OPTIONAL_HEADER.DATA_DIRECTORY:
+                if directory is not None:
+                    dump.add_lines(directory.dump())
+            dump.add_newline()
+
+        if hasattr(self, "VS_VERSIONINFO"):
+            for idx, vinfo_entry in enumerate(self.VS_VERSIONINFO):
+                if len(self.VS_VERSIONINFO) > 1:
+                    dump.add_header(f"Version Information {idx + 1}")
+                else:
+                    dump.add_header("Version Information")
+                if vinfo_entry is not None:
+                    dump.add_lines(vinfo_entry.dump())
+                dump.add_newline()
+
+                if hasattr(self, "VS_FIXEDFILEINFO"):
+                    dump.add_lines(self.VS_FIXEDFILEINFO[idx].dump())
+                    dump.add_newline()
+
+                if hasattr(self, "FileInfo") and len(self.FileInfo) > idx:
+                    for entry in self.FileInfo[idx]:
+                        dump.add_lines(entry.dump())
+                        dump.add_newline()
+
+                        if hasattr(entry, "StringTable"):
+                            for st_entry in entry.StringTable:
+                                [dump.add_line("  " + line) for line in st_entry.dump()]
+                                dump.add_line(
+                                    "  LangID: {0}".format(
+                                        st_entry.LangID.decode(
+                                            encoding, "backslashreplace_"
+                                        )
+                                    )
+                                )
+                                dump.add_newline()
+                                for str_entry in sorted(list(st_entry.entries.items())):
+                                    # try:
+                                    dump.add_line(
+                                        "    {0}: {1}".format(
+                                            str_entry[0].decode(
+                                                encoding, "backslashreplace_"
+                                            ),
+                                            str_entry[1].decode(
+                                                encoding, "backslashreplace_"
+                                            ),
+                                        )
+                                    )
+
+                            dump.add_newline()
+
+                        elif hasattr(entry, "Var"):
+                            for var_entry in entry.Var:
+                                if hasattr(var_entry, "entry"):
+                                    [
+                                        dump.add_line("  " + line)
+                                        for line in var_entry.dump()
+                                    ]
+                                    dump.add_line(
+                                        "    {0}: {1}".format(
+                                            list(var_entry.entry.keys())[0].decode(
+                                                "utf-8", "backslashreplace_"
+                                            ),
+                                            list(var_entry.entry.values())[0],
+                                        )
+                                    )
+
+                            dump.add_newline()
+
+        if hasattr(self, "DIRECTORY_ENTRY_EXPORT"):
+            dump.add_header("Exported symbols")
+            dump.add_lines(self.DIRECTORY_ENTRY_EXPORT.struct.dump())
+            dump.add_newline()
+            dump.add_line("%-10s   %-10s  %s" % ("Ordinal", "RVA", "Name"))
+            for export in self.DIRECTORY_ENTRY_EXPORT.symbols:
+                if export.address is not None:
+                    name = b("None")
+                    if export.name:
+                        name = export.name
+                    dump.add(
+                        "%-10d 0x%08X    %s"
+                        % (export.ordinal, export.address, name.decode(encoding))
+                    )
+                    if export.forwarder:
+                        dump.add_line(
+                            " forwarder: {0}".format(
+                                export.forwarder.decode(encoding, "backslashreplace_")
+                            )
+                        )
+                    else:
+                        dump.add_newline()
+
+            dump.add_newline()
+
+        if hasattr(self, "DIRECTORY_ENTRY_IMPORT"):
+            dump.add_header("Imported symbols")
+            for module in self.DIRECTORY_ENTRY_IMPORT:
+                dump.add_lines(module.struct.dump())
+                # Print the name of the DLL if there are no imports.
+                if not module.imports:
+                    dump.add(
+                        "  Name -> {0}".format(
+                            self.get_string_at_rva(module.struct.Name).decode(
+                                encoding, "backslashreplace_"
+                            )
+                        )
+                    )
+                    dump.add_newline()
+                dump.add_newline()
+                for symbol in module.imports:
+                    if symbol.import_by_ordinal is True:
+                        if symbol.name is not None:
+                            dump.add(
+                                "{0}.{1} Ordinal[{2}] (Imported by Ordinal)".format(
+                                    module.dll.decode("utf-8"),
+                                    symbol.name.decode("utf-8"),
+                                    symbol.ordinal,
+                                )
+                            )
+                        else:
+                            dump.add(
+                                "{0} Ordinal[{1}] (Imported by Ordinal)".format(
+                                    module.dll.decode("utf-8"), symbol.ordinal
+                                )
+                            )
+                    else:
+                        dump.add(
+                            "{0}.{1} Hint[{2:d}]".format(
+                                module.dll.decode(encoding, "backslashreplace_"),
+                                symbol.name.decode(encoding, "backslashreplace_"),
+                                symbol.hint,
+                            )
+                        )
+
+                    if symbol.bound:
+                        dump.add_line(" Bound: 0x{0:08X}".format(symbol.bound))
+                    else:
+                        dump.add_newline()
+                dump.add_newline()
+
+        if hasattr(self, "DIRECTORY_ENTRY_BOUND_IMPORT"):
+            dump.add_header("Bound imports")
+            for bound_imp_desc in self.DIRECTORY_ENTRY_BOUND_IMPORT:
+
+                dump.add_lines(bound_imp_desc.struct.dump())
+                dump.add_line(
+                    "DLL: {0}".format(
+                        bound_imp_desc.name.decode(encoding, "backslashreplace_")
+                    )
+                )
+                dump.add_newline()
+
+                for bound_imp_ref in bound_imp_desc.entries:
+                    dump.add_lines(bound_imp_ref.struct.dump(), 4)
+                    dump.add_line(
+                        "DLL: {0}".format(
+                            bound_imp_ref.name.decode(encoding, "backslashreplace_")
+                        ),
+                        4,
+                    )
+                    dump.add_newline()
+
+        if hasattr(self, "DIRECTORY_ENTRY_DELAY_IMPORT"):
+            dump.add_header("Delay Imported symbols")
+            for module in self.DIRECTORY_ENTRY_DELAY_IMPORT:
+
+                dump.add_lines(module.struct.dump())
+                dump.add_newline()
+
+                for symbol in module.imports:
+                    if symbol.import_by_ordinal is True:
+                        dump.add(
+                            "{0} Ordinal[{1:d}] (Imported by Ordinal)".format(
+                                module.dll.decode(encoding, "backslashreplace_"),
+                                symbol.ordinal,
+                            )
+                        )
+                    else:
+                        dump.add(
+                            "{0}.{1} Hint[{2}]".format(
+                                module.dll.decode(encoding, "backslashreplace_"),
+                                symbol.name.decode(encoding, "backslashreplace_"),
+                                symbol.hint,
+                            )
+                        )
+
+                    if symbol.bound:
+                        dump.add_line(" Bound: 0x{0:08X}".format(symbol.bound))
+                    else:
+                        dump.add_newline()
+                dump.add_newline()
+
+        if hasattr(self, "DIRECTORY_ENTRY_RESOURCE"):
+            dump.add_header("Resource directory")
+
+            dump.add_lines(self.DIRECTORY_ENTRY_RESOURCE.struct.dump())
+
+            for res_type in self.DIRECTORY_ENTRY_RESOURCE.entries:
+
+                if res_type.name is not None:
+                    name = res_type.name.decode(encoding, "backslashreplace_")
+                    dump.add_line(
+                        f"Name: [{name}]",
+                        2,
+                    )
+                else:
+                    res_type_id = RESOURCE_TYPE.get(res_type.struct.Id, "-")
+                    dump.add_line(
+                        f"Id: [0x{res_type.struct.Id:X}] ({res_type_id})",
+                        2,
+                    )
+
+                dump.add_lines(res_type.struct.dump(), 2)
+
+                if hasattr(res_type, "directory"):
+
+                    dump.add_lines(res_type.directory.struct.dump(), 4)
+
+                    for resource_id in res_type.directory.entries:
+
+                        if resource_id.name is not None:
+                            name = resource_id.name.decode("utf-8", "backslashreplace_")
+                            dump.add_line(
+                                f"Name: [{name}]",
+                                6,
+                            )
+                        else:
+                            dump.add_line(f"Id: [0x{resource_id.struct.Id:X}]", 6)
+
+                        dump.add_lines(resource_id.struct.dump(), 6)
+
+                        if hasattr(resource_id, "directory"):
+                            dump.add_lines(resource_id.directory.struct.dump(), 8)
+
+                            for resource_lang in resource_id.directory.entries:
+                                if hasattr(resource_lang, "data"):
+                                    dump.add_line(
+                                        "\\--- LANG [%d,%d][%s,%s]"
+                                        % (
+                                            resource_lang.data.lang,
+                                            resource_lang.data.sublang,
+                                            LANG.get(
+                                                resource_lang.data.lang, "*unknown*"
+                                            ),
+                                            get_sublang_name_for_lang(
+                                                resource_lang.data.lang,
+                                                resource_lang.data.sublang,
+                                            ),
+                                        ),
+                                        8,
+                                    )
+                                    dump.add_lines(resource_lang.struct.dump(), 10)
+                                    dump.add_lines(resource_lang.data.struct.dump(), 12)
+                            if (
+                                hasattr(resource_id.directory, "strings")
+                                and resource_id.directory.strings
+                            ):
+                                dump.add_line("[STRINGS]", 10)
+                                for idx, res_string in list(
+                                    sorted(resource_id.directory.strings.items())
+                                ):
+                                    dump.add_line(
+                                        "{0:6d}: {1}".format(
+                                            idx,
+                                            res_string.encode(
+                                                "unicode-escape", "backslashreplace"
+                                            ).decode("ascii"),
+                                        ),
+                                        12,
+                                    )
+
+                dump.add_newline()
+
+            dump.add_newline()
+
+        if (
+            hasattr(self, "DIRECTORY_ENTRY_TLS")
+            and self.DIRECTORY_ENTRY_TLS
+            and self.DIRECTORY_ENTRY_TLS.struct
+        ):
+
+            dump.add_header("TLS")
+            dump.add_lines(self.DIRECTORY_ENTRY_TLS.struct.dump())
+            dump.add_newline()
+
+        if (
+            hasattr(self, "DIRECTORY_ENTRY_LOAD_CONFIG")
+            and self.DIRECTORY_ENTRY_LOAD_CONFIG
+            and self.DIRECTORY_ENTRY_LOAD_CONFIG.struct
+        ):
+
+            dump.add_header("LOAD_CONFIG")
+            dump.add_lines(self.DIRECTORY_ENTRY_LOAD_CONFIG.struct.dump())
+            dump.add_newline()
+
+        if hasattr(self, "DIRECTORY_ENTRY_DEBUG"):
+            dump.add_header("Debug information")
+            for dbg in self.DIRECTORY_ENTRY_DEBUG:
+                dump.add_lines(dbg.struct.dump())
+                try:
+                    dump.add_line("Type: " + DEBUG_TYPE[dbg.struct.Type])
+                except KeyError:
+                    dump.add_line("Type: 0x{0:x}(Unknown)".format(dbg.struct.Type))
+                dump.add_newline()
+                if dbg.entry:
+                    dump.add_lines(dbg.entry.dump(), 4)
+                    dump.add_newline()
+
+        if self.has_relocs():
+            dump.add_header("Base relocations")
+            for base_reloc in self.DIRECTORY_ENTRY_BASERELOC:
+                dump.add_lines(base_reloc.struct.dump())
+                for reloc in base_reloc.entries:
+                    try:
+                        dump.add_line(
+                            "%08Xh %s" % (reloc.rva, RELOCATION_TYPE[reloc.type][16:]),
+                            4,
+                        )
+                    except KeyError:
+                        dump.add_line(
+                            "0x%08X 0x%x(Unknown)" % (reloc.rva, reloc.type), 4
+                        )
+                dump.add_newline()
+
+        if (
+            hasattr(self, "DIRECTORY_ENTRY_EXCEPTION")
+            and len(self.DIRECTORY_ENTRY_EXCEPTION) > 0
+        ):
+            dump.add_header("Unwind data for exception handling")
+            for rf in self.DIRECTORY_ENTRY_EXCEPTION:
+                dump.add_lines(rf.struct.dump())
+                if hasattr(rf, "unwindinfo") and rf.unwindinfo is not None:
+                    dump.add_lines(rf.unwindinfo.dump(), 4)
+
+        return dump.get_text()
+
+    def dump_dict(self):
+        """Dump all the PE header information into a dictionary."""
+
+        dump_dict = {}
+
+        warnings = self.get_warnings()
+        if warnings:
+            dump_dict["Parsing Warnings"] = warnings
+
+        dump_dict["DOS_HEADER"] = self.DOS_HEADER.dump_dict()
+        dump_dict["NT_HEADERS"] = self.NT_HEADERS.dump_dict()
+        dump_dict["FILE_HEADER"] = self.FILE_HEADER.dump_dict()
+
+        image_flags = retrieve_flags(IMAGE_CHARACTERISTICS, "IMAGE_FILE_")
+
+        dump_dict["Flags"] = []
+        for flag in image_flags:
+            if getattr(self.FILE_HEADER, flag[0]):
+                dump_dict["Flags"].append(flag[0])
+
+        if hasattr(self, "OPTIONAL_HEADER") and self.OPTIONAL_HEADER is not None:
+            dump_dict["OPTIONAL_HEADER"] = self.OPTIONAL_HEADER.dump_dict()
+
+        dll_characteristics_flags = retrieve_flags(
+            DLL_CHARACTERISTICS, "IMAGE_DLLCHARACTERISTICS_"
+        )
+
+        dump_dict["DllCharacteristics"] = []
+        for flag in dll_characteristics_flags:
+            if getattr(self.OPTIONAL_HEADER, flag[0]):
+                dump_dict["DllCharacteristics"].append(flag[0])
+
+        dump_dict["PE Sections"] = []
+
+        section_flags = retrieve_flags(SECTION_CHARACTERISTICS, "IMAGE_SCN_")
+        for section in self.sections:
+            section_dict = section.dump_dict()
+            dump_dict["PE Sections"].append(section_dict)
+            section_dict["Flags"] = []
+            for flag in section_flags:
+                if getattr(section, flag[0]):
+                    section_dict["Flags"].append(flag[0])
+
+            section_dict["Entropy"] = section.get_entropy()
+            if md5 is not None:
+                section_dict["MD5"] = section.get_hash_md5()
+            if sha1 is not None:
+                section_dict["SHA1"] = section.get_hash_sha1()
+            if sha256 is not None:
+                section_dict["SHA256"] = section.get_hash_sha256()
+            if sha512 is not None:
+                section_dict["SHA512"] = section.get_hash_sha512()
+
+        if hasattr(self, "OPTIONAL_HEADER") and hasattr(
+            self.OPTIONAL_HEADER, "DATA_DIRECTORY"
+        ):
+
+            dump_dict["Directories"] = []
+
+            for idx, directory in enumerate(self.OPTIONAL_HEADER.DATA_DIRECTORY):
+                if directory is not None:
+                    dump_dict["Directories"].append(directory.dump_dict())
+
+        if hasattr(self, "VS_VERSIONINFO"):
+            dump_dict["Version Information"] = []
+            for idx, vs_vinfo in enumerate(self.VS_VERSIONINFO):
+                version_info_list = []
+                version_info_list.append(vs_vinfo.dump_dict())
+
+                if hasattr(self, "VS_FIXEDFILEINFO"):
+                    version_info_list.append(self.VS_FIXEDFILEINFO[idx].dump_dict())
+
+                if hasattr(self, "FileInfo") and len(self.FileInfo) > idx:
+                    fileinfo_list = []
+                    version_info_list.append(fileinfo_list)
+                    for entry in self.FileInfo[idx]:
+                        fileinfo_list.append(entry.dump_dict())
+
+                        if hasattr(entry, "StringTable"):
+                            stringtable_dict = {}
+                            for st_entry in entry.StringTable:
+                                fileinfo_list.extend(st_entry.dump_dict())
+                                stringtable_dict["LangID"] = st_entry.LangID
+                                for str_entry in list(st_entry.entries.items()):
+                                    stringtable_dict[str_entry[0]] = str_entry[1]
+                            fileinfo_list.append(stringtable_dict)
+
+                        elif hasattr(entry, "Var"):
+                            for var_entry in entry.Var:
+                                var_dict = {}
+                                if hasattr(var_entry, "entry"):
+                                    fileinfo_list.extend(var_entry.dump_dict())
+                                    var_dict[list(var_entry.entry.keys())[0]] = list(
+                                        var_entry.entry.values()
+                                    )[0]
+                                    fileinfo_list.append(var_dict)
+
+                dump_dict["Version Information"].append(version_info_list)
+
+        if hasattr(self, "DIRECTORY_ENTRY_EXPORT"):
+            dump_dict["Exported symbols"] = []
+            dump_dict["Exported symbols"].append(
+                self.DIRECTORY_ENTRY_EXPORT.struct.dump_dict()
+            )
+            for export in self.DIRECTORY_ENTRY_EXPORT.symbols:
+                export_dict = {}
+                if export.address is not None:
+                    export_dict.update(
+                        {
+                            "Ordinal": export.ordinal,
+                            "RVA": export.address,
+                            "Name": export.name,
+                        }
+                    )
+                    if export.forwarder:
+                        export_dict["forwarder"] = export.forwarder
+                dump_dict["Exported symbols"].append(export_dict)
+
+        if hasattr(self, "DIRECTORY_ENTRY_IMPORT"):
+            dump_dict["Imported symbols"] = []
+            for module in self.DIRECTORY_ENTRY_IMPORT:
+                import_list = []
+                dump_dict["Imported symbols"].append(import_list)
+                import_list.append(module.struct.dump_dict())
+                for symbol in module.imports:
+                    symbol_dict = {}
+                    if symbol.import_by_ordinal is True:
+                        symbol_dict["DLL"] = module.dll
+                        symbol_dict["Ordinal"] = symbol.ordinal
+                    else:
+                        symbol_dict["DLL"] = module.dll
+                        symbol_dict["Name"] = symbol.name
+                        symbol_dict["Hint"] = symbol.hint
+
+                    if symbol.bound:
+                        symbol_dict["Bound"] = symbol.bound
+                    import_list.append(symbol_dict)
+
+        if hasattr(self, "DIRECTORY_ENTRY_BOUND_IMPORT"):
+            dump_dict["Bound imports"] = []
+            for bound_imp_desc in self.DIRECTORY_ENTRY_BOUND_IMPORT:
+                bound_imp_desc_dict = {}
+                dump_dict["Bound imports"].append(bound_imp_desc_dict)
+
+                bound_imp_desc_dict.update(bound_imp_desc.struct.dump_dict())
+                bound_imp_desc_dict["DLL"] = bound_imp_desc.name
+
+                for bound_imp_ref in bound_imp_desc.entries:
+                    bound_imp_ref_dict = {}
+                    bound_imp_ref_dict.update(bound_imp_ref.struct.dump_dict())
+                    bound_imp_ref_dict["DLL"] = bound_imp_ref.name
+
+        if hasattr(self, "DIRECTORY_ENTRY_DELAY_IMPORT"):
+            dump_dict["Delay Imported symbols"] = []
+            for module in self.DIRECTORY_ENTRY_DELAY_IMPORT:
+                module_list = []
+                dump_dict["Delay Imported symbols"].append(module_list)
+                module_list.append(module.struct.dump_dict())
+
+                for symbol in module.imports:
+                    symbol_dict = {}
+                    if symbol.import_by_ordinal is True:
+                        symbol_dict["DLL"] = module.dll
+                        symbol_dict["Ordinal"] = symbol.ordinal
+                    else:
+                        symbol_dict["DLL"] = module.dll
+                        symbol_dict["Name"] = symbol.name
+                        symbol_dict["Hint"] = symbol.hint
+
+                    if symbol.bound:
+                        symbol_dict["Bound"] = symbol.bound
+                    module_list.append(symbol_dict)
+
+        if hasattr(self, "DIRECTORY_ENTRY_RESOURCE"):
+            dump_dict["Resource directory"] = []
+            dump_dict["Resource directory"].append(
+                self.DIRECTORY_ENTRY_RESOURCE.struct.dump_dict()
+            )
+
+            for res_type in self.DIRECTORY_ENTRY_RESOURCE.entries:
+                resource_type_dict = {}
+
+                if res_type.name is not None:
+                    resource_type_dict["Name"] = res_type.name
+                else:
+                    resource_type_dict["Id"] = (
+                        res_type.struct.Id,
+                        RESOURCE_TYPE.get(res_type.struct.Id, "-"),
+                    )
+
+                resource_type_dict.update(res_type.struct.dump_dict())
+                dump_dict["Resource directory"].append(resource_type_dict)
+
+                if hasattr(res_type, "directory"):
+                    directory_list = []
+                    directory_list.append(res_type.directory.struct.dump_dict())
+                    dump_dict["Resource directory"].append(directory_list)
+
+                    for resource_id in res_type.directory.entries:
+                        resource_id_dict = {}
+
+                        if resource_id.name is not None:
+                            resource_id_dict["Name"] = resource_id.name
+                        else:
+                            resource_id_dict["Id"] = resource_id.struct.Id
+
+                        resource_id_dict.update(resource_id.struct.dump_dict())
+                        directory_list.append(resource_id_dict)
+
+                        if hasattr(resource_id, "directory"):
+                            resource_id_list = []
+                            resource_id_list.append(
+                                resource_id.directory.struct.dump_dict()
+                            )
+                            directory_list.append(resource_id_list)
+
+                            for resource_lang in resource_id.directory.entries:
+                                if hasattr(resource_lang, "data"):
+                                    resource_lang_dict = {}
+                                    resource_lang_dict["LANG"] = resource_lang.data.lang
+                                    resource_lang_dict[
+                                        "SUBLANG"
+                                    ] = resource_lang.data.sublang
+                                    resource_lang_dict["LANG_NAME"] = LANG.get(
+                                        resource_lang.data.lang, "*unknown*"
+                                    )
+                                    resource_lang_dict[
+                                        "SUBLANG_NAME"
+                                    ] = get_sublang_name_for_lang(
+                                        resource_lang.data.lang,
+                                        resource_lang.data.sublang,
+                                    )
+                                    resource_lang_dict.update(
+                                        resource_lang.struct.dump_dict()
+                                    )
+                                    resource_lang_dict.update(
+                                        resource_lang.data.struct.dump_dict()
+                                    )
+                                    resource_id_list.append(resource_lang_dict)
+                            if (
+                                hasattr(resource_id.directory, "strings")
+                                and resource_id.directory.strings
+                            ):
+                                for idx, res_string in list(
+                                    resource_id.directory.strings.items()
+                                ):
+                                    resource_id_list.append(
+                                        res_string.encode(
+                                            "unicode-escape", "backslashreplace"
+                                        ).decode("ascii")
+                                    )
+
+        if (
+            hasattr(self, "DIRECTORY_ENTRY_TLS")
+            and self.DIRECTORY_ENTRY_TLS
+            and self.DIRECTORY_ENTRY_TLS.struct
+        ):
+            dump_dict["TLS"] = self.DIRECTORY_ENTRY_TLS.struct.dump_dict()
+
+        if (
+            hasattr(self, "DIRECTORY_ENTRY_LOAD_CONFIG")
+            and self.DIRECTORY_ENTRY_LOAD_CONFIG
+            and self.DIRECTORY_ENTRY_LOAD_CONFIG.struct
+        ):
+            dump_dict[
+                "LOAD_CONFIG"
+            ] = self.DIRECTORY_ENTRY_LOAD_CONFIG.struct.dump_dict()
+
+        if hasattr(self, "DIRECTORY_ENTRY_DEBUG"):
+            dump_dict["Debug information"] = []
+            for dbg in self.DIRECTORY_ENTRY_DEBUG:
+                dbg_dict = {}
+                dump_dict["Debug information"].append(dbg_dict)
+                dbg_dict.update(dbg.struct.dump_dict())
+                dbg_dict["Type"] = DEBUG_TYPE.get(dbg.struct.Type, dbg.struct.Type)
+
+        if self.has_relocs():
+            dump_dict["Base relocations"] = []
+            for base_reloc in self.DIRECTORY_ENTRY_BASERELOC:
+                base_reloc_list = []
+                dump_dict["Base relocations"].append(base_reloc_list)
+                base_reloc_list.append(base_reloc.struct.dump_dict())
+                for reloc in base_reloc.entries:
+                    reloc_dict = {}
+                    base_reloc_list.append(reloc_dict)
+                    reloc_dict["RVA"] = reloc.rva
+                    try:
+                        reloc_dict["Type"] = RELOCATION_TYPE[reloc.type][16:]
+                    except KeyError:
+                        reloc_dict["Type"] = reloc.type
+
+        return dump_dict
+
+    # OC Patch
+    def get_physical_by_rva(self, rva):
+        """Gets the physical address in the PE file from an RVA value."""
+        try:
+            return self.get_offset_from_rva(rva)
+        except Exception:
+            return None
+
+    ##
+    # Double-Word get / set
+    ##
+
+    def get_data_from_dword(self, dword):
+        """Return a four byte string representing the double word value (little endian)."""
+        return struct.pack(" len(data):
+            return None
+
+        return struct.unpack(" len(self.__data__):
+            return None
+
+        return self.get_dword_from_data(self.__data__[offset : offset + 4], 0)
+
+    def set_dword_at_rva(self, rva, dword):
+        """Set the double word value at the file offset corresponding to the given RVA."""
+        return self.set_bytes_at_rva(rva, self.get_data_from_dword(dword))
+
+    def set_dword_at_offset(self, offset, dword):
+        """Set the double word value at the given file offset."""
+        return self.set_bytes_at_offset(offset, self.get_data_from_dword(dword))
+
+    ##
+    # Word get / set
+    ##
+
+    def get_data_from_word(self, word):
+        """Return a two byte string representing the word value. (little endian)."""
+        return struct.pack(" len(data):
+            return None
+
+        return struct.unpack(" len(self.__data__):
+            return None
+
+        return self.get_word_from_data(self.__data__[offset : offset + 2], 0)
+
+    def set_word_at_rva(self, rva, word):
+        """Set the word value at the file offset corresponding to the given RVA."""
+        return self.set_bytes_at_rva(rva, self.get_data_from_word(word))
+
+    def set_word_at_offset(self, offset, word):
+        """Set the word value at the given file offset."""
+        return self.set_bytes_at_offset(offset, self.get_data_from_word(word))
+
+    ##
+    # Quad-Word get / set
+    ##
+
+    def get_data_from_qword(self, word):
+        """Return an eight byte string representing the quad-word value (little endian)."""
+        return struct.pack(" len(data):
+            return None
+
+        return struct.unpack(" len(self.__data__):
+            return None
+
+        return self.get_qword_from_data(self.__data__[offset : offset + 8], 0)
+
+    def set_qword_at_rva(self, rva, qword):
+        """Set the quad-word value at the file offset corresponding to the given RVA."""
+        return self.set_bytes_at_rva(rva, self.get_data_from_qword(qword))
+
+    def set_qword_at_offset(self, offset, qword):
+        """Set the quad-word value at the given file offset."""
+        return self.set_bytes_at_offset(offset, self.get_data_from_qword(qword))
+
+    ##
+    # Set bytes
+    ##
+
+    def set_bytes_at_rva(self, rva, data):
+        """Overwrite, with the given string, the bytes at the file offset corresponding
+        to the given RVA.
+
+        Return True if successful, False otherwise. It can fail if the
+        offset is outside the file's boundaries.
+        """
+
+        if not isinstance(data, bytes):
+            raise TypeError("data should be of type: bytes")
+
+        offset = self.get_physical_by_rva(rva)
+        if not offset:
+            return False
+
+        return self.set_bytes_at_offset(offset, data)
+
+    def set_bytes_at_offset(self, offset, data):
+        """Overwrite the bytes at the given file offset with the given string.
+
+        Return True if successful, False otherwise. It can fail if the
+        offset is outside the file's boundaries.
+        """
+
+        if not isinstance(data, bytes):
+            raise TypeError("data should be of type: bytes")
+
+        if 0 <= offset < len(self.__data__):
+            self.set_data_bytes(offset, data)
+        else:
+            return False
+
+        return True
+
+    def set_data_bytes(self, offset: int, data: bytes):
+        if not isinstance(self.__data__, bytearray):
+            self.__data__ = bytearray(self.__data__)
+
+        self.__data__[offset : offset + len(data)] = data
+
+    def merge_modified_section_data(self):
+        """Update the PE image content with any individual section data that has been
+        modified.
+        """
+
+        for section in self.sections:
+            section_data_start = self.adjust_FileAlignment(
+                section.PointerToRawData, self.OPTIONAL_HEADER.FileAlignment
+            )
+            section_data_end = section_data_start + section.SizeOfRawData
+            if section_data_start < len(self.__data__) and section_data_end < len(
+                self.__data__
+            ):
+                self.set_data_bytes(section_data_start, section.get_data())
+
+    def relocate_image(self, new_ImageBase):
+        """Apply the relocation information to the image using the provided image base.
+
+        This method will apply the relocation information to the image. Given the new
+        base, all the relocations will be processed and both the raw data and the
+        section's data will be fixed accordingly.
+        The resulting image can be retrieved as well through the method:
+
+            get_memory_mapped_image()
+
+        In order to get something that would more closely match what could be found in
+        memory once the Windows loader finished its work.
+        """
+
+        relocation_difference = new_ImageBase - self.OPTIONAL_HEADER.ImageBase
+
+        if (
+            len(self.OPTIONAL_HEADER.DATA_DIRECTORY) >= 6
+            and self.OPTIONAL_HEADER.DATA_DIRECTORY[5].Size
+        ):
+            if not hasattr(self, "DIRECTORY_ENTRY_BASERELOC"):
+                self.parse_data_directories(
+                    directories=[DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_BASERELOC"]]
+                )
+            if not hasattr(self, "DIRECTORY_ENTRY_BASERELOC"):
+                self.__warnings.append(
+                    "Relocating image but PE does not have (or pefile cannot "
+                    "parse) a DIRECTORY_ENTRY_BASERELOC"
+                )
+            else:
+                for reloc in self.DIRECTORY_ENTRY_BASERELOC:
+
+                    # We iterate with an index because if the relocation is of type
+                    # IMAGE_REL_BASED_HIGHADJ we need to also process the next entry
+                    # at once and skip it for the next iteration
+                    #
+                    entry_idx = 0
+                    while entry_idx < len(reloc.entries):
+
+                        entry = reloc.entries[entry_idx]
+                        entry_idx += 1
+
+                        if entry.type == RELOCATION_TYPE["IMAGE_REL_BASED_ABSOLUTE"]:
+                            # Nothing to do for this type of relocation
+                            pass
+
+                        elif entry.type == RELOCATION_TYPE["IMAGE_REL_BASED_HIGH"]:
+                            # Fix the high 16-bits of a relocation
+                            #
+                            # Add high 16-bits of relocation_difference to the
+                            # 16-bit value at RVA=entry.rva
+
+                            self.set_word_at_rva(
+                                entry.rva,
+                                (
+                                    self.get_word_at_rva(entry.rva)
+                                    + relocation_difference
+                                    >> 16
+                                )
+                                & 0xFFFF,
+                            )
+
+                        elif entry.type == RELOCATION_TYPE["IMAGE_REL_BASED_LOW"]:
+                            # Fix the low 16-bits of a relocation
+                            #
+                            # Add low 16 bits of relocation_difference to the 16-bit
+                            # value at RVA=entry.rva
+
+                            self.set_word_at_rva(
+                                entry.rva,
+                                (
+                                    self.get_word_at_rva(entry.rva)
+                                    + relocation_difference
+                                )
+                                & 0xFFFF,
+                            )
+
+                        elif entry.type == RELOCATION_TYPE["IMAGE_REL_BASED_HIGHLOW"]:
+                            # Handle all high and low parts of a 32-bit relocation
+                            #
+                            # Add relocation_difference to the value at RVA=entry.rva
+
+                            self.set_dword_at_rva(
+                                entry.rva,
+                                self.get_dword_at_rva(entry.rva)
+                                + relocation_difference,
+                            )
+
+                        elif entry.type == RELOCATION_TYPE["IMAGE_REL_BASED_HIGHADJ"]:
+                            # Fix the high 16-bits of a relocation and adjust
+                            #
+                            # Add high 16-bits of relocation_difference to the 32-bit
+                            # value composed from the (16-bit value at
+                            # RVA=entry.rva)<<16 plus the 16-bit value at the next
+                            # relocation entry.
+
+                            # If the next entry is beyond the array's limits,
+                            # abort... the table is corrupt
+                            if entry_idx == len(reloc.entries):
+                                break
+
+                            next_entry = reloc.entries[entry_idx]
+                            entry_idx += 1
+                            self.set_word_at_rva(
+                                entry.rva,
+                                (
+                                    (self.get_word_at_rva(entry.rva) << 16)
+                                    + next_entry.rva
+                                    + relocation_difference
+                                    & 0xFFFF0000
+                                )
+                                >> 16,
+                            )
+
+                        elif entry.type == RELOCATION_TYPE["IMAGE_REL_BASED_DIR64"]:
+                            # Apply the difference to the 64-bit value at the offset
+                            # RVA=entry.rva
+
+                            self.set_qword_at_rva(
+                                entry.rva,
+                                self.get_qword_at_rva(entry.rva)
+                                + relocation_difference,
+                            )
+
+            self.OPTIONAL_HEADER.ImageBase = new_ImageBase
+
+            # correct VAs(virtual addresses) occurrences in directory information
+            if hasattr(self, "DIRECTORY_ENTRY_IMPORT"):
+                for dll in self.DIRECTORY_ENTRY_IMPORT:
+                    for func in dll.imports:
+                        func.address += relocation_difference
+            if hasattr(self, "DIRECTORY_ENTRY_TLS"):
+                self.DIRECTORY_ENTRY_TLS.struct.StartAddressOfRawData += (
+                    relocation_difference
+                )
+                self.DIRECTORY_ENTRY_TLS.struct.EndAddressOfRawData += (
+                    relocation_difference
+                )
+                self.DIRECTORY_ENTRY_TLS.struct.AddressOfIndex += relocation_difference
+                self.DIRECTORY_ENTRY_TLS.struct.AddressOfCallBacks += (
+                    relocation_difference
+                )
+            if hasattr(self, "DIRECTORY_ENTRY_LOAD_CONFIG"):
+                load_config = self.DIRECTORY_ENTRY_LOAD_CONFIG.struct
+                if (
+                    hasattr(load_config, "LockPrefixTable")
+                    and load_config.LockPrefixTable
+                ):
+                    load_config.LockPrefixTable += relocation_difference
+                if hasattr(load_config, "EditList") and load_config.EditList:
+                    load_config.EditList += relocation_difference
+                if (
+                    hasattr(load_config, "SecurityCookie")
+                    and load_config.SecurityCookie
+                ):
+                    load_config.SecurityCookie += relocation_difference
+                if (
+                    hasattr(load_config, "SEHandlerTable")
+                    and load_config.SEHandlerTable
+                ):
+                    load_config.SEHandlerTable += relocation_difference
+                if (
+                    hasattr(load_config, "GuardCFCheckFunctionPointer")
+                    and load_config.GuardCFCheckFunctionPointer
+                ):
+                    load_config.GuardCFCheckFunctionPointer += relocation_difference
+                if (
+                    hasattr(load_config, "GuardCFDispatchFunctionPointer")
+                    and load_config.GuardCFDispatchFunctionPointer
+                ):
+                    load_config.GuardCFDispatchFunctionPointer += relocation_difference
+                if (
+                    hasattr(load_config, "GuardCFFunctionTable")
+                    and load_config.GuardCFFunctionTable
+                ):
+                    load_config.GuardCFFunctionTable += relocation_difference
+                if (
+                    hasattr(load_config, "GuardAddressTakenIatEntryTable")
+                    and load_config.GuardAddressTakenIatEntryTable
+                ):
+                    load_config.GuardAddressTakenIatEntryTable += relocation_difference
+                if (
+                    hasattr(load_config, "GuardLongJumpTargetTable")
+                    and load_config.GuardLongJumpTargetTable
+                ):
+                    load_config.GuardLongJumpTargetTable += relocation_difference
+                if (
+                    hasattr(load_config, "DynamicValueRelocTable")
+                    and load_config.DynamicValueRelocTable
+                ):
+                    load_config.DynamicValueRelocTable += relocation_difference
+                if (
+                    self.PE_TYPE == OPTIONAL_HEADER_MAGIC_PE_PLUS
+                    and hasattr(load_config, "CHPEMetadataPointer")
+                    and load_config.CHPEMetadataPointer
+                ):
+                    load_config.CHPEMetadataPointer += relocation_difference
+                if (
+                    hasattr(load_config, "GuardRFFailureRoutine")
+                    and load_config.GuardRFFailureRoutine
+                ):
+                    load_config.GuardRFFailureRoutine += relocation_difference
+                if (
+                    hasattr(load_config, "GuardRFFailureRoutineFunctionPointer")
+                    and load_config.GuardRFFailureRoutineFunctionPointer
+                ):
+                    load_config.GuardRFVerifyStackPointerFunctionPointer += (
+                        relocation_difference
+                    )
+                if (
+                    hasattr(load_config, "GuardRFVerifyStackPointerFunctionPointer")
+                    and load_config.GuardRFVerifyStackPointerFunctionPointer
+                ):
+                    load_config.GuardRFVerifyStackPointerFunctionPointer += (
+                        relocation_difference
+                    )
+                if (
+                    hasattr(load_config, "EnclaveConfigurationPointer")
+                    and load_config.EnclaveConfigurationPointer
+                ):
+                    load_config.EnclaveConfigurationPointer += relocation_difference
+
+    def verify_checksum(self):
+
+        return self.OPTIONAL_HEADER.CheckSum == self.generate_checksum()
+
+    def generate_checksum(self):
+        # This will make sure that the data representing the PE image
+        # is updated with any changes that might have been made by
+        # assigning values to header fields as those are not automatically
+        # updated upon assignment.
+        #
+        # data = self.write()
+        # print('{0}'.format(len(data)))
+        # for idx, b in enumerate(data):
+        #     if b != ord(self.__data__[idx]) or (idx > 1244440 and idx < 1244460):
+        #         print('Idx: {0} G {1:02x} {3} B {2:02x}'.format(
+        #             idx, ord(self.__data__[idx]), b,
+        #             self.__data__[idx], chr(b)))
+        self.__data__ = self.write()
+
+        # Get the offset to the CheckSum field in the OptionalHeader
+        # (The offset is the same in PE32 and PE32+)
+        checksum_offset = self.OPTIONAL_HEADER.get_file_offset() + 0x40  # 64
+
+        checksum = 0
+        # Verify the data is dword-aligned. Add padding if needed
+        #
+        remainder = len(self.__data__) % 4
+        data_len = len(self.__data__) + ((4 - remainder) * (remainder != 0))
+
+        for i in range(int(data_len / 4)):
+            # Skip the checksum field
+            if i == int(checksum_offset / 4):
+                continue
+            if i + 1 == (int(data_len / 4)) and remainder:
+                dword = struct.unpack(
+                    "I", self.__data__[i * 4 :] + (b"\0" * (4 - remainder))
+                )[0]
+            else:
+                dword = struct.unpack("I", self.__data__[i * 4 : i * 4 + 4])[0]
+            # Optimized the calculation (thanks to Emmanuel Bourg for pointing it out!)
+            checksum += dword
+            if checksum >= 2**32:
+                checksum = (checksum & 0xFFFFFFFF) + (checksum >> 32)
+
+        checksum = (checksum & 0xFFFF) + (checksum >> 16)
+        checksum = (checksum) + (checksum >> 16)
+        checksum = checksum & 0xFFFF
+
+        # The length is the one of the original data, not the padded one
+        #
+        return checksum + len(self.__data__)
+
+    def is_exe(self):
+        """Check whether the file is a standard executable.
+
+        This will return true only if the file has the IMAGE_FILE_EXECUTABLE_IMAGE flag
+        set and the IMAGE_FILE_DLL not set and the file does not appear to be a driver
+        either.
+        """
+
+        EXE_flag = IMAGE_CHARACTERISTICS["IMAGE_FILE_EXECUTABLE_IMAGE"]
+
+        if (
+            (not self.is_dll())
+            and (not self.is_driver())
+            and (EXE_flag & self.FILE_HEADER.Characteristics) == EXE_flag
+        ):
+            return True
+
+        return False
+
+    def is_dll(self):
+        """Check whether the file is a standard DLL.
+
+        This will return true only if the image has the IMAGE_FILE_DLL flag set.
+        """
+
+        DLL_flag = IMAGE_CHARACTERISTICS["IMAGE_FILE_DLL"]
+
+        if (DLL_flag & self.FILE_HEADER.Characteristics) == DLL_flag:
+            return True
+
+        return False
+
+    def is_driver(self):
+        """Check whether the file is a Windows driver.
+
+        This will return true only if there are reliable indicators of the image
+        being a driver.
+        """
+
+        # Checking that the ImageBase field of the OptionalHeader is above or
+        # equal to 0x80000000 (that is, whether it lies in the upper 2GB of
+        # the address space, normally belonging to the kernel) is not a
+        # reliable enough indicator.  For instance, PEs that play the invalid
+        # ImageBase trick to get relocated could be incorrectly assumed to be
+        # drivers.
+
+        # This is not reliable either...
+        #
+        # if any((section.Characteristics &
+        #           SECTION_CHARACTERISTICS['IMAGE_SCN_MEM_NOT_PAGED']) for
+        #        section in self.sections ):
+        #    return True
+
+        # If the import directory was not parsed (fast_load = True); do it now.
+        if not hasattr(self, "DIRECTORY_ENTRY_IMPORT"):
+            self.parse_data_directories(
+                directories=[DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_IMPORT"]]
+            )
+
+        # If there's still no import directory (the PE doesn't have one or it's
+        # malformed), give up.
+        if not hasattr(self, "DIRECTORY_ENTRY_IMPORT"):
+            return False
+
+        # self.DIRECTORY_ENTRY_IMPORT will now exist, although it may be empty.
+        # If it imports from "ntoskrnl.exe" or other kernel components it should
+        # be a driver
+        #
+        system_DLLs = set(
+            (b"ntoskrnl.exe", b"hal.dll", b"ndis.sys", b"bootvid.dll", b"kdcom.dll")
+        )
+        if system_DLLs.intersection(
+            [imp.dll.lower() for imp in self.DIRECTORY_ENTRY_IMPORT]
+        ):
+            return True
+
+        driver_like_section_names = set((b"page", b"paged"))
+        if driver_like_section_names.intersection(
+            [section.Name.lower().rstrip(b"\x00") for section in self.sections]
+        ) and (
+            self.OPTIONAL_HEADER.Subsystem
+            in (
+                SUBSYSTEM_TYPE["IMAGE_SUBSYSTEM_NATIVE"],
+                SUBSYSTEM_TYPE["IMAGE_SUBSYSTEM_NATIVE_WINDOWS"],
+            )
+        ):
+            return True
+
+        return False
+
+    def get_overlay_data_start_offset(self):
+        """Get the offset of data appended to the file and not contained within
+        the area described in the headers."""
+
+        largest_offset_and_size = (0, 0)
+
+        def update_if_sum_is_larger_and_within_file(
+            offset_and_size, file_size=len(self.__data__)
+        ):
+            if sum(offset_and_size) <= file_size and sum(offset_and_size) > sum(
+                largest_offset_and_size
+            ):
+                return offset_and_size
+            return largest_offset_and_size
+
+        if hasattr(self, "OPTIONAL_HEADER"):
+            largest_offset_and_size = update_if_sum_is_larger_and_within_file(
+                (
+                    self.OPTIONAL_HEADER.get_file_offset(),
+                    self.FILE_HEADER.SizeOfOptionalHeader,
+                )
+            )
+
+        for section in self.sections:
+            largest_offset_and_size = update_if_sum_is_larger_and_within_file(
+                (section.PointerToRawData, section.SizeOfRawData)
+            )
+
+        skip_directories = [DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]]
+
+        for idx, directory in enumerate(self.OPTIONAL_HEADER.DATA_DIRECTORY):
+            if idx in skip_directories:
+                continue
+            try:
+                largest_offset_and_size = update_if_sum_is_larger_and_within_file(
+                    (self.get_offset_from_rva(directory.VirtualAddress), directory.Size)
+                )
+            # Ignore directories with RVA out of file
+            except PEFormatError:
+                continue
+
+        if len(self.__data__) > sum(largest_offset_and_size):
+            return sum(largest_offset_and_size)
+
+        return None
+
+    def get_overlay(self):
+        """Get the data appended to the file and not contained within the area described
+        in the headers."""
+
+        overlay_data_offset = self.get_overlay_data_start_offset()
+
+        if overlay_data_offset is not None:
+            return self.__data__[overlay_data_offset:]
+
+        return None
+
+    def trim(self):
+        """Return the just data defined by the PE headers, removing any overlaid data."""
+
+        overlay_data_offset = self.get_overlay_data_start_offset()
+
+        if overlay_data_offset is not None:
+            return self.__data__[:overlay_data_offset]
+
+        return self.__data__[:]
+
+    # According to http://corkami.blogspot.com/2010/01/parce-que-la-planche-aura-brule.html
+    # if PointerToRawData is less that 0x200 it's rounded to zero. Loading the test file
+    # in a debugger it's easy to verify that the PointerToRawData value of 1 is rounded
+    # to zero. Hence we reproduce the behavior
+    #
+    # According to the document:
+    # [ Microsoft Portable Executable and Common Object File Format Specification ]
+    # "The alignment factor (in bytes) that is used to align the raw data of sections in
+    #  the image file. The value should be a power of 2 between 512 and 64 K, inclusive.
+    #  The default is 512. If the SectionAlignment is less than the architecture's page
+    #  size, then FileAlignment must match SectionAlignment."
+    #
+    # The following is a hard-coded constant if the Windows loader
+    def adjust_FileAlignment(self, val, file_alignment):
+        if file_alignment > FILE_ALIGNMENT_HARDCODED_VALUE:
+            # If it's not a power of two, report it:
+            if self.FileAlignment_Warning is False and not power_of_two(file_alignment):
+                self.__warnings.append(
+                    "If FileAlignment > 0x200 it should be a power of 2. Value: %x"
+                    % (file_alignment)
+                )
+                self.FileAlignment_Warning = True
+
+        return cache_adjust_FileAlignment(val, file_alignment)
+
+    # According to the document:
+    # [ Microsoft Portable Executable and Common Object File Format Specification ]
+    # "The alignment (in bytes) of sections when they are loaded into memory. It must be
+    #  greater than or equal to FileAlignment. The default is the page size for the
+    #  architecture."
+    #
+    def adjust_SectionAlignment(self, val, section_alignment, file_alignment):
+        if file_alignment < FILE_ALIGNMENT_HARDCODED_VALUE:
+            if (
+                file_alignment != section_alignment
+                and self.SectionAlignment_Warning is False
+            ):
+                self.__warnings.append(
+                    "If FileAlignment(%x) < 0x200 it should equal SectionAlignment(%x)"
+                    % (file_alignment, section_alignment)
+                )
+                self.SectionAlignment_Warning = True
+
+        return cache_adjust_SectionAlignment(val, section_alignment, file_alignment)
+
+
+def main():
+    import sys
+
+    usage = """\
+pefile.py 
+pefile.py exports """
+
+    if not sys.argv[1:]:
+        print(usage)
+    elif sys.argv[1] == "exports":
+        if not sys.argv[2:]:
+            sys.exit("error:  required")
+        pe = PE(sys.argv[2])
+        for exp in pe.DIRECTORY_ENTRY_EXPORT.symbols:
+            print(
+                hex(pe.OPTIONAL_HEADER.ImageBase + exp.address), exp.name, exp.ordinal
+            )
+    else:
+        print(PE(sys.argv[1]).dump_info())
+
+
+if __name__ == "__main__":
+    main()
diff --git a/venv/Lib/site-packages/peutils.py b/venv/Lib/site-packages/peutils.py
new file mode 100644
index 0000000..9170cb9
--- /dev/null
+++ b/venv/Lib/site-packages/peutils.py
@@ -0,0 +1,585 @@
+
+"""peutils, Portable Executable utilities module
+
+
+Copyright (c) 2005-2023 Ero Carrera 
+
+All rights reserved.
+"""
+import os
+import re
+import string
+import urllib.request, urllib.parse, urllib.error
+import pefile
+
+__author__ = "Ero Carrera"
+__version__ = pefile.__version__
+__contact__ = "ero.carrera@gmail.com"
+
+
+class SignatureDatabase(object):
+    """This class loads and keeps a parsed PEiD signature database.
+
+    Usage:
+
+        sig_db = SignatureDatabase('/path/to/signature/file')
+
+    and/or
+
+        sig_db = SignatureDatabase()
+        sig_db.load('/path/to/signature/file')
+
+    Signature databases can be combined by performing multiple loads.
+
+    The filename parameter can be a URL too. In that case the
+    signature database will be downloaded from that location.
+    """
+
+    def __init__(self, filename=None, data=None):
+
+        # RegExp to match a signature block
+        #
+        self.parse_sig = re.compile(
+            "\[(.*?)\]\s+?signature\s*=\s*(.*?)(\s+\?\?)*\s*ep_only\s*=\s*(\w+)(?:\s*section_start_only\s*=\s*(\w+)|)",
+            re.S,
+        )
+
+        # Signature information
+        #
+        # Signatures are stored as trees using dictionaries
+        # The keys are the byte values while the values for
+        # each key are either:
+        #
+        # - Other dictionaries of the same form for further
+        #   bytes in the signature
+        #
+        # - A dictionary with a string as a key (packer name)
+        #   and None as value to indicate a full signature
+        #
+        self.signature_tree_eponly_true = dict()
+        self.signature_count_eponly_true = 0
+        self.signature_tree_eponly_false = dict()
+        self.signature_count_eponly_false = 0
+        self.signature_tree_section_start = dict()
+        self.signature_count_section_start = 0
+
+        # The depth (length) of the longest signature
+        #
+        self.max_depth = 0
+
+        self.__load(filename=filename, data=data)
+
+    def generate_section_signatures(self, pe, name, sig_length=512):
+        """Generates signatures for all the sections in a PE file.
+
+        If the section contains any data a signature will be created
+        for it. The signature name will be a combination of the
+        parameter 'name' and the section number and its name.
+        """
+
+        section_signatures = list()
+
+        for idx, section in enumerate(pe.sections):
+
+            if section.SizeOfRawData < sig_length:
+                continue
+
+            # offset = pe.get_offset_from_rva(section.VirtualAddress)
+            offset = section.PointerToRawData
+
+            sig_name = "%s Section(%d/%d,%s)" % (
+                name,
+                idx + 1,
+                len(pe.sections),
+                "".join([c for c in section.Name if c in string.printable]),
+            )
+
+            section_signatures.append(
+                self.__generate_signature(
+                    pe,
+                    offset,
+                    sig_name,
+                    ep_only=False,
+                    section_start_only=True,
+                    sig_length=sig_length,
+                )
+            )
+
+        return "\n".join(section_signatures) + "\n"
+
+    def generate_ep_signature(self, pe, name, sig_length=512):
+        """Generate signatures for the entry point of a PE file.
+
+        Creates a signature whose name will be the parameter 'name'
+        and the section number and its name.
+        """
+
+        offset = pe.get_offset_from_rva(pe.OPTIONAL_HEADER.AddressOfEntryPoint)
+
+        return self.__generate_signature(
+            pe, offset, name, ep_only=True, sig_length=sig_length
+        )
+
+    def __generate_signature(
+        self, pe, offset, name, ep_only=False, section_start_only=False, sig_length=512
+    ):
+
+        data = pe.__data__[offset : offset + sig_length]
+
+        signature_bytes = " ".join(["%02x" % ord(c) for c in data])
+
+        if ep_only == True:
+            ep_only = "true"
+        else:
+            ep_only = "false"
+
+        if section_start_only == True:
+            section_start_only = "true"
+        else:
+            section_start_only = "false"
+
+        signature = "[%s]\nsignature = %s\nep_only = %s\nsection_start_only = %s\n" % (
+            name,
+            signature_bytes,
+            ep_only,
+            section_start_only,
+        )
+
+        return signature
+
+    def match(self, pe, ep_only=True, section_start_only=False):
+        """Matches and returns the exact match(es).
+
+        If ep_only is True the result will be a string with
+        the packer name. Otherwise it will be a list of the
+        form (file_offset, packer_name) specifying where
+        in the file the signature was found.
+        """
+
+        matches = self.__match(pe, ep_only, section_start_only)
+
+        # The last match (the most precise) from the
+        # list of matches (if any) is returned
+        #
+        if matches:
+            if ep_only == False:
+                # Get the most exact match for each list of matches
+                # at a given offset
+                #
+                return [(match[0], match[1][-1]) for match in matches]
+
+            return matches[1][-1]
+
+        return None
+
+    def match_all(self, pe, ep_only=True, section_start_only=False):
+        """Matches and returns all the likely matches."""
+
+        matches = self.__match(pe, ep_only, section_start_only)
+
+        if matches:
+            if ep_only == False:
+                # Get the most exact match for each list of matches
+                # at a given offset
+                #
+                return matches
+
+            return matches[1]
+
+        return None
+
+    def __match(self, pe, ep_only, section_start_only):
+
+        # Load the corresponding set of signatures
+        # Either the one for ep_only equal to True or
+        # to False
+        #
+        if section_start_only is True:
+
+            # Fetch the data of the executable as it'd
+            # look once loaded in memory
+            #
+            try:
+                data = pe.__data__
+            except Exception as excp:
+                raise
+
+            # Load the corresponding tree of signatures
+            #
+            signatures = self.signature_tree_section_start
+
+            # Set the starting address to start scanning from
+            #
+            scan_addresses = [section.PointerToRawData for section in pe.sections]
+
+        elif ep_only is True:
+
+            # Fetch the data of the executable as it'd
+            # look once loaded in memory
+            #
+            try:
+                data = pe.get_memory_mapped_image()
+            except Exception as excp:
+                raise
+
+            # Load the corresponding tree of signatures
+            #
+            signatures = self.signature_tree_eponly_true
+
+            # Fetch the entry point of the PE file and the data
+            # at the entry point
+            #
+            ep = pe.OPTIONAL_HEADER.AddressOfEntryPoint
+
+            # Set the starting address to start scanning from
+            #
+            scan_addresses = [ep]
+
+        else:
+
+            data = pe.__data__
+
+            signatures = self.signature_tree_eponly_false
+
+            scan_addresses = range(len(data))
+
+        # For each start address, check if any signature matches
+        #
+        matches = []
+        for idx in scan_addresses:
+            result = self.__match_signature_tree(
+                signatures, data[idx : idx + self.max_depth]
+            )
+            if result:
+                matches.append((idx, result))
+
+        # Return only the matched items found at the entry point if
+        # ep_only is True (matches will have only one element in that
+        # case)
+        #
+        if ep_only is True:
+            if matches:
+                return matches[0]
+
+        return matches
+
+    def match_data(self, code_data, ep_only=True, section_start_only=False):
+
+        data = code_data
+        scan_addresses = [0]
+
+        # Load the corresponding set of signatures
+        # Either the one for ep_only equal to True or
+        # to False
+        #
+        if section_start_only is True:
+
+            # Load the corresponding tree of signatures
+            #
+            signatures = self.signature_tree_section_start
+
+            # Set the starting address to start scanning from
+            #
+
+        elif ep_only is True:
+
+            # Load the corresponding tree of signatures
+            #
+            signatures = self.signature_tree_eponly_true
+
+        # For each start address, check if any signature matches
+        #
+        matches = []
+        for idx in scan_addresses:
+            result = self.__match_signature_tree(
+                signatures, data[idx : idx + self.max_depth]
+            )
+            if result:
+                matches.append((idx, result))
+
+        # Return only the matched items found at the entry point if
+        # ep_only is True (matches will have only one element in that
+        # case)
+        #
+        if ep_only is True:
+            if matches:
+                return matches[0]
+
+        return matches
+
+    def __match_signature_tree(self, signature_tree, data, depth=0):
+        """Recursive function to find matches along the signature tree.
+
+        signature_tree  is the part of the tree left to walk
+        data    is the data being checked against the signature tree
+        depth   keeps track of how far we have gone down the tree
+        """
+
+        matched_names = list()
+        match = signature_tree
+
+        # Walk the bytes in the data and match them
+        # against the signature
+        #
+        for idx, byte in enumerate([b if isinstance(b, int) else ord(b) for b in data]):
+
+            # If the tree is exhausted...
+            #
+            if match is None:
+                break
+
+            # Get the next byte in the tree
+            #
+            match_next = match.get(byte, None)
+
+            # If None is among the values for the key
+            # it means that a signature in the database
+            # ends here and that there's an exact match.
+            #
+            if None in list(match.values()):
+                # idx represent how deep we are in the tree
+                #
+                # names = [idx+depth]
+                names = list()
+
+                # For each of the item pairs we check
+                # if it has an element other than None,
+                # if not then we have an exact signature
+                #
+                for item in list(match.items()):
+                    if item[1] is None:
+                        names.append(item[0])
+                matched_names.append(names)
+
+            # If a wildcard is found keep scanning the signature
+            # ignoring the byte.
+            #
+            if "??" in match:
+                match_tree_alternate = match.get("??", None)
+                data_remaining = data[idx + 1 :]
+                if data_remaining:
+                    matched_names.extend(
+                        self.__match_signature_tree(
+                            match_tree_alternate, data_remaining, idx + depth + 1
+                        )
+                    )
+
+            match = match_next
+
+        # If we have any more packer name in the end of the signature tree
+        # add them to the matches
+        #
+        if match is not None and None in list(match.values()):
+            # names = [idx + depth + 1]
+            names = list()
+            for item in list(match.items()):
+                if item[1] is None:
+                    names.append(item[0])
+            matched_names.append(names)
+
+        return matched_names
+
+    def load(self, filename=None, data=None):
+        """Load a PEiD signature file.
+
+        Invoking this method on different files combines the signatures.
+        """
+
+        self.__load(filename=filename, data=data)
+
+    def __load(self, filename=None, data=None):
+
+        if filename is not None:
+            # If the path does not exist, attempt to open a URL
+            #
+            if not os.path.exists(filename):
+                try:
+                    sig_f = urllib.request.urlopen(filename)
+                    sig_data = sig_f.read()
+                    sig_f.close()
+                except IOError:
+                    # Let this be raised back to the user...
+                    raise
+            else:
+                # Get the data for a file
+                #
+                try:
+                    sig_f = open(filename, "rt")
+                    sig_data = sig_f.read()
+                    sig_f.close()
+                except IOError:
+                    # Let this be raised back to the user...
+                    raise
+        else:
+            sig_data = data
+
+        # If the file/URL could not be read or no "raw" data
+        # was provided there's nothing else to do
+        #
+        if not sig_data:
+            return
+
+        # Helper function to parse the signature bytes
+        #
+        def to_byte(value):
+            if "?" in value:
+                return value
+            return int(value, 16)
+
+        # Parse all the signatures in the file
+        #
+        matches = self.parse_sig.findall(sig_data)
+
+        # For each signature, get the details and load it into the
+        # signature tree
+        #
+        for (
+            packer_name,
+            signature,
+            superfluous_wildcards,
+            ep_only,
+            section_start_only,
+        ) in matches:
+
+            ep_only = ep_only.strip().lower()
+
+            signature = signature.replace("\\n", "").strip()
+
+            signature_bytes = [to_byte(b) for b in signature.split()]
+
+            if ep_only == "true":
+                ep_only = True
+            else:
+                ep_only = False
+
+            if section_start_only == "true":
+                section_start_only = True
+            else:
+                section_start_only = False
+
+            depth = 0
+
+            if section_start_only is True:
+
+                tree = self.signature_tree_section_start
+                self.signature_count_section_start += 1
+
+            else:
+                if ep_only is True:
+                    tree = self.signature_tree_eponly_true
+                    self.signature_count_eponly_true += 1
+                else:
+                    tree = self.signature_tree_eponly_false
+                    self.signature_count_eponly_false += 1
+
+            for idx, byte in enumerate(signature_bytes):
+
+                if idx + 1 == len(signature_bytes):
+
+                    tree[byte] = tree.get(byte, dict())
+                    tree[byte][packer_name] = None
+
+                else:
+
+                    tree[byte] = tree.get(byte, dict())
+
+                tree = tree[byte]
+                depth += 1
+
+            if depth > self.max_depth:
+                self.max_depth = depth
+
+
+def is_valid(pe):
+    """"""
+    pass
+
+
+def is_suspicious(pe):
+    """
+    unusual locations of import tables
+    non recognized section names
+    presence of long ASCII strings
+    """
+
+    relocations_overlap_entry_point = False
+    sequential_relocs = 0
+
+    # If relocation data is found and the entries go over the entry point, and also are very
+    # continuous or point outside section's boundaries => it might imply that an obfuscation
+    # trick is being used or the relocations are corrupt (maybe intentionally)
+    #
+    if hasattr(pe, "DIRECTORY_ENTRY_BASERELOC"):
+        for base_reloc in pe.DIRECTORY_ENTRY_BASERELOC:
+            last_reloc_rva = None
+            for reloc in base_reloc.entries:
+                if reloc.rva <= pe.OPTIONAL_HEADER.AddressOfEntryPoint <= reloc.rva + 4:
+                    relocations_overlap_entry_point = True
+
+                if (
+                    last_reloc_rva is not None
+                    and last_reloc_rva <= reloc.rva <= last_reloc_rva + 4
+                ):
+                    sequential_relocs += 1
+
+                last_reloc_rva = reloc.rva
+
+    # If import tables or strings exist (are pointed to) to within the header or in the area
+    # between the PE header and the first section that's suspicious
+    #
+    # IMPLEMENT
+
+    warnings_while_parsing = False
+    # If we have warnings, that's suspicious, some of those will be because of out-of-ordinary
+    # values are found in the PE header fields
+    # Things that are reported in warnings:
+    # (parsing problems, special section characteristics i.e. W & X, uncommon values of fields,
+    # unusual entrypoint, suspicious imports)
+    #
+    warnings = pe.get_warnings()
+    if warnings:
+        warnings_while_parsing
+
+    # If there are few or none (should come with a standard "density" of strings/kilobytes of data) longer (>8)
+    # ascii sequences that might indicate packed data, (this is similar to the entropy test in some ways but
+    # might help to discard cases of legitimate installer or compressed data)
+
+    # If compressed data (high entropy) and is_driver => uuuuhhh, nasty
+
+    pass
+
+
+def is_probably_packed(pe):
+    """Returns True is there is a high likelihood that a file is packed or contains compressed data.
+
+    The sections of the PE file will be analyzed, if enough sections
+    look like containing compressed data and the data makes
+    up for more than 20% of the total file size, the function will
+    return True.
+    """
+
+    # Calculate the length of the data up to the end of the last section in the
+    # file. Overlay data won't be taken into account
+    #
+    total_pe_data_length = len(pe.trim())
+    # Assume that the file is packed when no data is available
+    if not total_pe_data_length:
+        return True
+    has_significant_amount_of_compressed_data = False
+
+    # If some of the sections have high entropy and they make for more than 20% of the file's size
+    # it's assumed that it could be an installer or a packed file
+
+    total_compressed_data = 0
+    for section in pe.sections:
+        s_entropy = section.get_entropy()
+        s_length = len(section.get_data())
+        # The value of 7.4 is empirical, based on looking at a few files packed
+        # by different packers
+        if s_entropy > 7.4:
+            total_compressed_data += s_length
+
+    if (total_compressed_data / total_pe_data_length) > 0.2:
+        has_significant_amount_of_compressed_data = True
+
+    return has_significant_amount_of_compressed_data
diff --git a/venv/Lib/site-packages/pip-24.2.dist-info/AUTHORS.txt b/venv/Lib/site-packages/pip-24.3.1.dist-info/AUTHORS.txt
similarity index 99%
rename from venv/Lib/site-packages/pip-24.2.dist-info/AUTHORS.txt
rename to venv/Lib/site-packages/pip-24.3.1.dist-info/AUTHORS.txt
index dda2ac3..8ccefbc 100644
--- a/venv/Lib/site-packages/pip-24.2.dist-info/AUTHORS.txt
+++ b/venv/Lib/site-packages/pip-24.3.1.dist-info/AUTHORS.txt
@@ -57,6 +57,7 @@ Anthony Sottile
 Antoine Musso
 Anton Ovchinnikov
 Anton Patrushev
+Anton Zelenov
 Antonio Alvarado Hernandez
 Antony Lee
 Antti Kaihola
@@ -225,6 +226,7 @@ Diego Ramirez
 DiegoCaraballo
 Dimitri Merejkowsky
 Dimitri Papadopoulos
+Dimitri Papadopoulos Orfanos
 Dirk Stolle
 Dmitry Gladkov
 Dmitry Volodin
@@ -690,6 +692,7 @@ snook92
 socketubs
 Sorin Sbarnea
 Srinivas Nyayapati
+Srishti Hegde
 Stavros Korokithakis
 Stefan Scherfke
 Stefano Rivera
diff --git a/venv/Lib/site-packages/pip-24.3.1.dist-info/INSTALLER b/venv/Lib/site-packages/pip-24.3.1.dist-info/INSTALLER
new file mode 100644
index 0000000..a1b589e
--- /dev/null
+++ b/venv/Lib/site-packages/pip-24.3.1.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/venv/Lib/site-packages/pip-24.2.dist-info/LICENSE.txt b/venv/Lib/site-packages/pip-24.3.1.dist-info/LICENSE.txt
similarity index 100%
rename from venv/Lib/site-packages/pip-24.2.dist-info/LICENSE.txt
rename to venv/Lib/site-packages/pip-24.3.1.dist-info/LICENSE.txt
diff --git a/venv/Lib/site-packages/pip-24.2.dist-info/METADATA b/venv/Lib/site-packages/pip-24.3.1.dist-info/METADATA
similarity index 98%
rename from venv/Lib/site-packages/pip-24.2.dist-info/METADATA
rename to venv/Lib/site-packages/pip-24.3.1.dist-info/METADATA
index 6141107..9e5aa3a 100644
--- a/venv/Lib/site-packages/pip-24.2.dist-info/METADATA
+++ b/venv/Lib/site-packages/pip-24.3.1.dist-info/METADATA
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: pip
-Version: 24.2
+Version: 24.3.1
 Summary: The PyPA recommended tool for installing Python packages.
 Author-email: The pip developers 
 License: MIT
@@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
 Requires-Python: >=3.8
diff --git a/venv/Lib/site-packages/pip-24.2.dist-info/RECORD b/venv/Lib/site-packages/pip-24.3.1.dist-info/RECORD
similarity index 92%
rename from venv/Lib/site-packages/pip-24.2.dist-info/RECORD
rename to venv/Lib/site-packages/pip-24.3.1.dist-info/RECORD
index 54bc442..3a332cb 100644
--- a/venv/Lib/site-packages/pip-24.2.dist-info/RECORD
+++ b/venv/Lib/site-packages/pip-24.3.1.dist-info/RECORD
@@ -1,16 +1,16 @@
-../../Scripts/pip.exe,sha256=YQfW5tdtkSbt8ujVSiQQfVfbebzxnviBNRMfbIwFGyA,108409
-../../Scripts/pip3.11.exe,sha256=YQfW5tdtkSbt8ujVSiQQfVfbebzxnviBNRMfbIwFGyA,108409
-../../Scripts/pip3.exe,sha256=YQfW5tdtkSbt8ujVSiQQfVfbebzxnviBNRMfbIwFGyA,108409
-pip-24.2.dist-info/AUTHORS.txt,sha256=KDa8Pd3GDeKSogF6yFW0l9A9eMneLDOFrcIDqkL8G8s,10868
-pip-24.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-pip-24.2.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
-pip-24.2.dist-info/METADATA,sha256=PhzCxQxIhsnZ871cPUe3Hew9PhhpgflLbfqU3WizZqM,3624
-pip-24.2.dist-info/RECORD,,
-pip-24.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip-24.2.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
-pip-24.2.dist-info/entry_points.txt,sha256=eeIjuzfnfR2PrhbjnbzFU6MnSS70kZLxwaHHq6M-bD0,87
-pip-24.2.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-pip/__init__.py,sha256=EQxEGXUQIu-9fNJxVEK74ufx_fTk_HpYV9lAbw-WWbs,355
+../../Scripts/pip.exe,sha256=i27pIUFH6LIQbZG5ze0rXXFZhdkkuAHd9ahR2MT1KCQ,108409
+../../Scripts/pip3.11.exe,sha256=i27pIUFH6LIQbZG5ze0rXXFZhdkkuAHd9ahR2MT1KCQ,108409
+../../Scripts/pip3.exe,sha256=i27pIUFH6LIQbZG5ze0rXXFZhdkkuAHd9ahR2MT1KCQ,108409
+pip-24.3.1.dist-info/AUTHORS.txt,sha256=Cbb630k8EL9FkBzX9Vpi6hpYWrLSlh08eXodL5u0eLI,10925
+pip-24.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+pip-24.3.1.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
+pip-24.3.1.dist-info/METADATA,sha256=V8iCNK1GYbC82PWsLMsASDh9AO4veocRlM4Pn9q2KFI,3677
+pip-24.3.1.dist-info/RECORD,,
+pip-24.3.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip-24.3.1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
+pip-24.3.1.dist-info/entry_points.txt,sha256=eeIjuzfnfR2PrhbjnbzFU6MnSS70kZLxwaHHq6M-bD0,87
+pip-24.3.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+pip/__init__.py,sha256=faXY_neeYrA_88plEhkyhwAaYeds7wu5U1iGwP24J0s,357
 pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
 pip/__pip-runner__.py,sha256=cPPWuJ6NK_k-GzfvlejLFgwzmYUROmpAR6QC3Q-vkXQ,1450
 pip/__pycache__/__init__.cpython-311.pyc,,
@@ -26,7 +26,7 @@ pip/_internal/__pycache__/main.cpython-311.pyc,,
 pip/_internal/__pycache__/pyproject.cpython-311.pyc,,
 pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc,,
 pip/_internal/__pycache__/wheel_builder.cpython-311.pyc,,
-pip/_internal/build_env.py,sha256=QiusW8QEaj387y0hdRqVbuelHSHGYcT7WzVckbmMhR0,10420
+pip/_internal/build_env.py,sha256=wsTPOWyPTKvUREUcO585OU01kbQufpdigY8fVHv3WIw,10584
 pip/_internal/cache.py,sha256=Jb698p5PNigRtpW5o26wQNkkUv4MnQ94mc471wL63A0,10369
 pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132
 pip/_internal/cli/__pycache__/__init__.cpython-311.pyc,,
@@ -46,11 +46,11 @@ pip/_internal/cli/autocompletion.py,sha256=Lli3Mr6aDNu7ZkJJFFvwD2-hFxNI6Avz8OwMy
 pip/_internal/cli/base_command.py,sha256=F8nUcSM-Y-MQljJUe724-yxmc5viFXHyM_zH70NmIh4,8289
 pip/_internal/cli/cmdoptions.py,sha256=mDqBr0d0hoztbRJs-PWtcKpqNAc7khU6ZpoesZKocT8,30110
 pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
-pip/_internal/cli/index_command.py,sha256=YIJ84cfYcbDBACnB8eoDgqjYJU6GpiWP2Rh7Ij-Xyak,5633
+pip/_internal/cli/index_command.py,sha256=-0oPTruZGkLSMrWDleZ6UtcKP3G-SImRRuhH0RfVE3o,5631
 pip/_internal/cli/main.py,sha256=BDZef-bWe9g9Jpr4OVs4dDf-845HJsKw835T7AqEnAc,2817
 pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338
-pip/_internal/cli/parser.py,sha256=QAkY6s8N-AD7w5D2PQm2Y8C2MIJSv7iuAeNjOMvDBUA,10811
-pip/_internal/cli/progress_bars.py,sha256=0FAf7eN67KnIv_gZQhTWSnKXXUzQko1ftGXEoLe5Yec,2713
+pip/_internal/cli/parser.py,sha256=VCMtduzECUV87KaHNu-xJ-wLNL82yT3x16V4XBxOAqI,10825
+pip/_internal/cli/progress_bars.py,sha256=VgydyqjZvfhqpuNcFDn00QNuA9GxRe9CKrRG8jhPuKU,2723
 pip/_internal/cli/req_command.py,sha256=DqeFhmUMs6o6Ev8qawAcOoYNdAZsfyKS0MZI5jsJYwQ,12250
 pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118
 pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
@@ -85,8 +85,8 @@ pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIo
 pip/_internal/commands/index.py,sha256=RAXxmJwFhVb5S1BYzb5ifX3sn9Na8v2CCVYwSMP8pao,4731
 pip/_internal/commands/inspect.py,sha256=PGrY9TRTRCM3y5Ml8Bdk8DEOXquWRfscr4DRo1LOTPc,3189
 pip/_internal/commands/install.py,sha256=iqesiLIZc6Op9uihMQFYRhAA2DQRZUxbM4z1BwXoFls,29428
-pip/_internal/commands/list.py,sha256=RgaIV4kN-eMSpgUAXc-6bjnURzl0v3cRE11xr54O9Cg,12771
-pip/_internal/commands/search.py,sha256=hSGtIHg26LRe468Ly7oZ6gfd9KbTxBRZAAtJc9Um6S4,5628
+pip/_internal/commands/list.py,sha256=oiIzSjLP6__d7dIS3q0Xb5ywsaOThBWRqMyjjKzkPdM,12769
+pip/_internal/commands/search.py,sha256=fWkUQVx_gm8ebbFAlCgqtxKXT9rNahpJ-BI__3HNZpg,5626
 pip/_internal/commands/show.py,sha256=IG9L5uo8w6UA4tI_IlmaxLCoNKPa5JNJCljj3NWs0OE,7507
 pip/_internal/commands/uninstall.py,sha256=7pOR7enK76gimyxQbzxcG1OsyLXL3DvX939xmM8Fvtg,3892
 pip/_internal/commands/wheel.py,sha256=eJRhr_qoNNxWAkkdJCNiQM7CXd4E1_YyQhsqJnBPGGg,6414
@@ -101,7 +101,7 @@ pip/_internal/distributions/base.py,sha256=QeB9qvKXDIjLdPBDE5fMgpfGqMMCr-govnuoQ
 pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842
 pip/_internal/distributions/sdist.py,sha256=PlcP4a6-R6c98XnOM-b6Lkb3rsvh9iG4ok8shaanrzs,6751
 pip/_internal/distributions/wheel.py,sha256=THBYfnv7VVt8mYhMYUtH13S1E7FDwtDyDfmUcl8ai0E,1317
-pip/_internal/exceptions.py,sha256=6qcW3QgmFVlRxlZvDSLUhSzKJ7_Tedo-lyqWA6NfdAU,25371
+pip/_internal/exceptions.py,sha256=2_byISIv3kSnI_9T-Esfxrt0LnTRgcUHyxu0twsHjQY,26481
 pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30
 pip/_internal/index/__pycache__/__init__.cpython-311.pyc,,
 pip/_internal/index/__pycache__/collector.cpython-311.pyc,,
@@ -109,13 +109,13 @@ pip/_internal/index/__pycache__/package_finder.cpython-311.pyc,,
 pip/_internal/index/__pycache__/sources.cpython-311.pyc,,
 pip/_internal/index/collector.py,sha256=RdPO0JLAlmyBWPAWYHPyRoGjz3GNAeTngCNkbGey_mE,16265
 pip/_internal/index/package_finder.py,sha256=yRC4xsyudwKnNoU6IXvNoyqYo5ScT7lB6Wa-z2eh7cs,37666
-pip/_internal/index/sources.py,sha256=dJegiR9f86kslaAHcv9-R5L_XBf5Rzm_FkyPteDuPxI,8688
+pip/_internal/index/sources.py,sha256=lPBLK5Xiy8Q6IQMio26Wl7ocfZOKkgGklIBNyUJ23fI,8632
 pip/_internal/locations/__init__.py,sha256=UaAxeZ_f93FyouuFf4p7SXYF-4WstXuEvd3LbmPCAno,14925
 pip/_internal/locations/__pycache__/__init__.cpython-311.pyc,,
 pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc,,
 pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc,,
 pip/_internal/locations/__pycache__/base.cpython-311.pyc,,
-pip/_internal/locations/_distutils.py,sha256=H9ZHK_35rdDV1Qsmi4QeaBULjFT4Mbu6QuoVGkJ6QHI,6009
+pip/_internal/locations/_distutils.py,sha256=x6nyVLj7X11Y4khIdf-mFlxMl2FWadtVEgeb8upc_WI,6013
 pip/_internal/locations/_sysconfig.py,sha256=IGzds60qsFneRogC-oeBaY7bEh3lPt_v47kMJChQXsU,7724
 pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556
 pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
@@ -133,7 +133,7 @@ pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc,,
 pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc,,
 pip/_internal/metadata/importlib/_compat.py,sha256=c6av8sP8BBjAZuFSJow1iWfygUXNM3xRTCn5nqw6B9M,2796
 pip/_internal/metadata/importlib/_dists.py,sha256=anh0mLI-FYRPUhAdipd0Va3YJJc6HelCKQ0bFhY10a0,8017
-pip/_internal/metadata/importlib/_envs.py,sha256=JHjNfnk9RsjrcQw8dLBqdfBglOKSepEe9aq03B4nRpU,7431
+pip/_internal/metadata/importlib/_envs.py,sha256=UUB980XSrDWrMpQ1_G45i0r8Hqlg_tg3IPQ63mEqbNc,7431
 pip/_internal/metadata/pkg_resources.py,sha256=U07ETAINSGeSRBfWUG93E4tZZbaW_f7PGzEqZN0hulc,10542
 pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63
 pip/_internal/models/__pycache__/__init__.cpython-311.pyc,,
@@ -158,7 +158,7 @@ pip/_internal/models/scheme.py,sha256=PakmHJM3e8OOWSZFtfz1Az7f1meONJnkGuQxFlt3wB
 pip/_internal/models/search_scope.py,sha256=67NEnsYY84784S-MM7ekQuo9KXLH-7MzFntXjapvAo0,4531
 pip/_internal/models/selection_prefs.py,sha256=qaFfDs3ciqoXPg6xx45N1jPLqccLJw4N0s4P0PyHTQ8,2015
 pip/_internal/models/target_python.py,sha256=2XaH2rZ5ZF-K5wcJbEMGEl7SqrTToDDNkrtQ2v_v_-Q,4271
-pip/_internal/models/wheel.py,sha256=Odc1NVWL5N-i6A3vFa50BfNvCRlGvGa4som60FQM198,3601
+pip/_internal/models/wheel.py,sha256=G7dND_s4ebPkEL7RJ1qCY0QhUUWIIK6AnjWgRATF5no,4539
 pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50
 pip/_internal/network/__pycache__/__init__.cpython-311.pyc,,
 pip/_internal/network/__pycache__/auth.cpython-311.pyc,,
@@ -171,7 +171,7 @@ pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc,,
 pip/_internal/network/auth.py,sha256=D4gASjUrqoDFlSt6gQ767KAAjv6PUyJU0puDlhXNVRE,20809
 pip/_internal/network/cache.py,sha256=48A971qCzKNFvkb57uGEk7-0xaqPS0HWj2711QNTxkU,3935
 pip/_internal/network/download.py,sha256=FLOP29dPYECBiAi7eEjvAbNkyzaKNqbyjOT2m8HPW8U,6048
-pip/_internal/network/lazy_wheel.py,sha256=2PXVduYZPCPZkkQFe1J1GbfHJWeCU--FXonGyIfw9eU,7638
+pip/_internal/network/lazy_wheel.py,sha256=PBdoMoNQQIA84Fhgne38jWF52W4x_KtsHjxgv4dkRKA,7622
 pip/_internal/network/session.py,sha256=XmanBKjVwPFmh1iJ58q6TDh9xabH37gREuQJ_feuZGA,18741
 pip/_internal/network/utils.py,sha256=Inaxel-NxBu4PQWkjyErdnfewsFCcgHph7dzR1-FboY,4088
 pip/_internal/network/xmlrpc.py,sha256=sAxzOacJ-N1NXGPvap9jC3zuYWSnnv3GXtgR2-E2APA,1838
@@ -213,8 +213,8 @@ pip/_internal/req/__pycache__/req_file.cpython-311.pyc,,
 pip/_internal/req/__pycache__/req_install.cpython-311.pyc,,
 pip/_internal/req/__pycache__/req_set.cpython-311.pyc,,
 pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc,,
-pip/_internal/req/constructors.py,sha256=qXNZtUqhsXpHxkRaIQhp20_Kz6I88MDKM8SQR9fckIc,18424
-pip/_internal/req/req_file.py,sha256=hnC9Oz-trqGQpuDnCVWqwpJkAvtbCsk7-5k0EWVQhlQ,17687
+pip/_internal/req/constructors.py,sha256=v1qzCN1mIldwx-nCrPc8JO4lxkm3Fv8M5RWvt8LISjc,18430
+pip/_internal/req/req_file.py,sha256=gOOJTzL-mDRPcQhjwqjDrjn4V-3rK9TnEFnU3v8RA4Q,18752
 pip/_internal/req/req_install.py,sha256=yhT98NGDoAEk03jznTJnYCznzhiMEEA2ocgsUG_dcNU,35788
 pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858
 pip/_internal/req/req_uninstall.py,sha256=qzDIxJo-OETWqGais7tSMCDcWbATYABT-Tid3ityF0s,23853
@@ -237,8 +237,8 @@ pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc,,
 pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc,,
 pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc,,
 pip/_internal/resolution/resolvelib/base.py,sha256=DCf669FsqyQY5uqXeePDHQY1e4QO-pBzWH8O0s9-K94,5023
-pip/_internal/resolution/resolvelib/candidates.py,sha256=07CBc85ya3J19XqdvUsLQwtVIxiTYq9km9hbTRh0jb0,19823
-pip/_internal/resolution/resolvelib/factory.py,sha256=mTTq_nG1F9Eq3VnlYPH6Ap-mydcS-mxC5y5L-CLLp80,32459
+pip/_internal/resolution/resolvelib/candidates.py,sha256=5UZ1upNnmqsP-nmEZaDYxaBgCoejw_e2WVGmmAvBxXc,20001
+pip/_internal/resolution/resolvelib/factory.py,sha256=511CaUR41LqjALuFafLVfx15WRvMhxYTdjQCoSvp4gw,32661
 pip/_internal/resolution/resolvelib/found_candidates.py,sha256=9hrTyQqFvl9I7Tji79F1AxHv39Qh1rkJ_7deSHSMfQc,6383
 pip/_internal/resolution/resolvelib/provider.py,sha256=bcsFnYvlmtB80cwVdW1fIwgol8ZNr1f1VHyRTkz47SM,9935
 pip/_internal/resolution/resolvelib/reporter.py,sha256=00JtoXEkTlw0-rl_sl54d71avwOsJHt9GGHcrj5Sza0,3168
@@ -277,7 +277,7 @@ pip/_internal/utils/_jaraco_text.py,sha256=M15uUPIh5NpP1tdUGBxRau6q1ZAEtI8-XyLEE
 pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
 pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665
 pip/_internal/utils/compat.py,sha256=ckkFveBiYQjRWjkNsajt_oWPS57tJvE8XxoC4OIYgCY,2399
-pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377
+pip/_internal/utils/compatibility_tags.py,sha256=OWq5axHpW-MEEPztGdvgADrgJPAcV9a88Rxm4Z8VBs8,6272
 pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242
 pip/_internal/utils/deprecation.py,sha256=k7Qg_UBAaaTdyq82YVARA6D7RmcGTXGv7fnfcgigj4Q,3707
 pip/_internal/utils/direct_url_helpers.py,sha256=r2MRtkVDACv9AGqYODBUC9CjwgtsUU1s68hmgfCJMtA,3196
@@ -289,7 +289,7 @@ pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8
 pip/_internal/utils/glibc.py,sha256=vUkWq_1pJuzcYNcGKLlQmABoUiisK8noYY1yc8Wq4w4,3734
 pip/_internal/utils/hashes.py,sha256=XGGLL0AG8-RhWnyz87xF6MFZ--BKadHU35D47eApCKI,4972
 pip/_internal/utils/logging.py,sha256=7BFKB1uFjdxD5crM-GtwA5T2qjbQ2LPD-gJDuJeDNTg,11606
-pip/_internal/utils/misc.py,sha256=HR_V97vNTHNzwq01JrnTZtsLLkWAOJ9_EeYfHJZSgDY,23745
+pip/_internal/utils/misc.py,sha256=NRV0_2fFhzy1jhvInSBv4dqCmTwct8PV7Kp0m-BPRGM,23530
 pip/_internal/utils/packaging.py,sha256=iI3LH43lVNR4hWBOqF6lFsZq4aycb2j0UcHlmDmcqUg,2109
 pip/_internal/utils/retry.py,sha256=mhFbykXjhTnZfgzeuy-vl9c8nECnYn_CMtwNJX2tYzQ,1392
 pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435
@@ -340,15 +340,15 @@ pip/_vendor/cachecontrol/heuristics.py,sha256=IYe4QmHERWsMvtxNrp920WeaIsaTTyqLB1
 pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
 pip/_vendor/cachecontrol/serialize.py,sha256=HQd2IllQ05HzPkVLMXTF2uX5mjEQjDBkxCqUJUODpZk,5163
 pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417
-pip/_vendor/certifi/__init__.py,sha256=LHXz7E80YJYBzCBv6ZyidQ5-ciYSkSebpY2E5OM0l7o,94
+pip/_vendor/certifi/__init__.py,sha256=p_GYZrjUwPBUhpLlCZoGb0miKBKSqDAyZC5DvIuqbHQ,94
 pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
 pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc,,
 pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc,,
 pip/_vendor/certifi/__pycache__/core.cpython-311.pyc,,
-pip/_vendor/certifi/cacert.pem,sha256=SIupYGAr8HzGP073rsEIaS_sQYIPwzKKjj894DgUmu4,291528
+pip/_vendor/certifi/cacert.pem,sha256=lO3rZukXdPyuk6BWUJFOKQliWaXH6HGh9l1GGrUgG0c,299427
 pip/_vendor/certifi/core.py,sha256=2SRT5rIcQChFDbe37BQa-kULxAgJ8qN6l1jfqTp4HIs,4486
 pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/distlib/__init__.py,sha256=hJKF7FHoqbmGckncDuEINWo_OYkDNiHODtYXSMcvjcc,625
+pip/_vendor/distlib/__init__.py,sha256=dcwgYGYGQqAEawBXPDtIx80DO_3cOmFv8HTc8JMzknQ,625
 pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc,,
 pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc,,
 pip/_vendor/distlib/__pycache__/database.cpython-311.pyc,,
@@ -362,24 +362,24 @@ pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc,,
 pip/_vendor/distlib/__pycache__/util.cpython-311.pyc,,
 pip/_vendor/distlib/__pycache__/version.cpython-311.pyc,,
 pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc,,
-pip/_vendor/distlib/compat.py,sha256=Un-uIBvy02w-D267OG4VEhuddqWgKj9nNkxVltAb75w,41487
-pip/_vendor/distlib/database.py,sha256=0V9Qvs0Vrxa2F_-hLWitIyVyRifJ0pCxyOI-kEOBwsA,51965
+pip/_vendor/distlib/compat.py,sha256=2jRSjRI4o-vlXeTK2BCGIUhkc6e9ZGhSsacRM5oseTw,41467
+pip/_vendor/distlib/database.py,sha256=mHy_LxiXIsIVRb-T0-idBrVLw3Ffij5teHCpbjmJ9YU,51160
 pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797
-pip/_vendor/distlib/locators.py,sha256=o1r_M86_bRLafSpetmyfX8KRtFu-_Q58abvQrnOSnbA,51767
+pip/_vendor/distlib/locators.py,sha256=oBeAZpFuPQSY09MgNnLfQGGAXXvVO96BFpZyKMuK4tM,51026
 pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168
-pip/_vendor/distlib/markers.py,sha256=n3DfOh1yvZ_8EW7atMyoYeZFXjYla0Nz0itQlojCd0A,5268
-pip/_vendor/distlib/metadata.py,sha256=pB9WZ9mBfmQxc9OVIldLS5CjOoQRvKAvUwwQyKwKQtQ,39693
+pip/_vendor/distlib/markers.py,sha256=X6sDvkFGcYS8gUW8hfsWuKEKAqhQZAJ7iXOMLxRYjYk,5164
+pip/_vendor/distlib/metadata.py,sha256=zil3sg2EUfLXVigljY2d_03IJt-JSs7nX-73fECMX2s,38724
 pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
-pip/_vendor/distlib/scripts.py,sha256=8_gP9J7_tlNRicnWmPX4ZiDlP5wTwJKDeeg-8_qXUZU,18780
+pip/_vendor/distlib/scripts.py,sha256=BJliaDAZaVB7WAkwokgC3HXwLD2iWiHaVI50H7C6eG8,18608
 pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
 pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
 pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
-pip/_vendor/distlib/util.py,sha256=XSznxEi_i3T20UJuaVc0qXHz5ksGUCW1khYlBprN_QE,67530
-pip/_vendor/distlib/version.py,sha256=9pXkduchve_aN7JG6iL9VTYV_kqNSGoc2Dwl8JuySnQ,23747
+pip/_vendor/distlib/util.py,sha256=vMPGvsS4j9hF6Y9k3Tyom1aaHLb0rFmZAEyzeAdel9w,66682
+pip/_vendor/distlib/version.py,sha256=s5VIs8wBn0fxzGxWM_aA2ZZyx525HcZbMvcTlTyZ3Rg,23727
 pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
 pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
 pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
-pip/_vendor/distlib/wheel.py,sha256=FVQCve8u-L0QYk5-YTZc7s4WmNQdvjRWTK08KXzZVX4,43958
+pip/_vendor/distlib/wheel.py,sha256=DFIVguEQHCdxnSdAO0dfFsgMcvVZitg7bCOuLwZ7A_s,43979
 pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
 pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
 pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc,,
@@ -438,7 +438,7 @@ pip/_vendor/packaging/metadata.py,sha256=KINuSkJ12u-SyoKNTy_pHNGAfMUtxNvZ53qA1zA
 pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
 pip/_vendor/packaging/requirements.py,sha256=gYyRSAdbrIyKDY66ugIDUQjRMvxkH2ALioTmX3tnL6o,2947
 pip/_vendor/packaging/specifiers.py,sha256=HfGgfNJRvrzC759gnnoojHyiWs_DYmcw5PEh5jHH-YE,39738
-pip/_vendor/packaging/tags.py,sha256=y8EbheOu9WS7s-MebaXMcHMF-jzsA_C1Lz5XRTiSy4w,18883
+pip/_vendor/packaging/tags.py,sha256=Fo6_cit95-7QfcMb16XtI7AUiSMgdwA_hCO_9lV2pz4,21388
 pip/_vendor/packaging/utils.py,sha256=NAdYUwnlAOpkat_RthavX8a07YuVxgGL_vwrx73GSDM,5287
 pip/_vendor/packaging/version.py,sha256=wE4sSVlF-d1H6HFC1vszEe35CwTig_fh4HHIFg95hFE,16210
 pip/_vendor/pkg_resources/__init__.py,sha256=jrhDRbOubP74QuPXxd7U7Po42PH2l-LZ2XfcO7llpZ4,124463
@@ -757,18 +757,18 @@ pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,
 pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943
 pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
 pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
-pip/_vendor/truststore/__init__.py,sha256=M-PhuLMIF7gxKXk7tpo2MD7dk6nqG1ae8GXWdNXbMdQ,403
+pip/_vendor/truststore/__init__.py,sha256=WIDeyzWm7EVX44g354M25vpRXbeY1lsPH6EmUJUcq4o,1264
 pip/_vendor/truststore/__pycache__/__init__.cpython-311.pyc,,
 pip/_vendor/truststore/__pycache__/_api.cpython-311.pyc,,
 pip/_vendor/truststore/__pycache__/_macos.cpython-311.pyc,,
 pip/_vendor/truststore/__pycache__/_openssl.cpython-311.pyc,,
 pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-311.pyc,,
 pip/_vendor/truststore/__pycache__/_windows.cpython-311.pyc,,
-pip/_vendor/truststore/_api.py,sha256=B9JIHipzBIS8pMP_J50-o1DHVZsvKZQUXTB0HQQ_UPg,10461
-pip/_vendor/truststore/_macos.py,sha256=VJ24avz5aEGYAs_kWvnGjMJtuIP4xJcYa459UQOQC3M,17608
+pip/_vendor/truststore/_api.py,sha256=GeXRNTlxPZ3kif4kNoh6JY0oE4QRzTGcgXr6l_X_Gk0,10555
+pip/_vendor/truststore/_macos.py,sha256=nZlLkOmszUE0g6ryRwBVGY5COzPyudcsiJtDWarM5LQ,20503
 pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324
 pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130
-pip/_vendor/truststore/_windows.py,sha256=eldNViHNHeY5r3fiBoz_JFGD37atXB9S5yaRoPKEGAA,17891
+pip/_vendor/truststore/_windows.py,sha256=rAHyKYD8M7t-bXfG8VgOVa3TpfhVhbt4rZQlO45YuP8,17993
 pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
 pip/_vendor/typing_extensions.py,sha256=78hFl0HpDY-ylHUVCnWdU5nTHxUP2-S-3wEZk6CQmLk,134499
 pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
@@ -784,9 +784,9 @@ pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc,,
 pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc,,
 pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc,,
 pip/_vendor/urllib3/_collections.py,sha256=pyASJJhW7wdOpqJj9QJA8FyGRfr8E8uUUhqUvhF0728,11372
-pip/_vendor/urllib3/_version.py,sha256=cuJvnSrWxXGYgQ3-ZRoPMw8-qaN5tpw71jnH1t16dLA,64
-pip/_vendor/urllib3/connection.py,sha256=92k9td_y4PEiTIjNufCUa1NzMB3J3w0LEdyokYgXnW8,20300
-pip/_vendor/urllib3/connectionpool.py,sha256=Be6q65SR9laoikg-h_jmc_p8OWtEmwgq_Om_Xtig-2M,40285
+pip/_vendor/urllib3/_version.py,sha256=t9wGB6ooOTXXgiY66K1m6BZS1CJyXHAU8EoWDTe6Shk,64
+pip/_vendor/urllib3/connection.py,sha256=ttIA909BrbTUzwkqEe_TzZVh4JOOj7g61Ysei2mrwGg,20314
+pip/_vendor/urllib3/connectionpool.py,sha256=e2eiAwNbFNCKxj4bwDKNK-w7HIdSz3OmMxU_TIt-evQ,40408
 pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
 pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc,,
 pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc,,
@@ -842,12 +842,12 @@ pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5
 pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
 pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
 pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
-pip/_vendor/urllib3/util/retry.py,sha256=Z6WEf518eTOXP5jr5QSQ9gqJI0DVYt3Xs3EKnYaTmus,22013
-pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177
+pip/_vendor/urllib3/util/retry.py,sha256=6ENvOZ8PBDzh8kgixpql9lIrb2dxH-k7ZmBanJF2Ng4,22050
+pip/_vendor/urllib3/util/ssl_.py,sha256=QDuuTxPSCj1rYtZ4xpD7Ux-r20TD50aHyqKyhQ7Bq4A,17460
 pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
 pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
 pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
 pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
 pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
-pip/_vendor/vendor.txt,sha256=PxNaxxkkpBaw5zOTsDpHEY-zEaHjgkDgyrSxOuxg8nw,330
+pip/_vendor/vendor.txt,sha256=43152uDtpsunEE29vmLqqKZUosdrbvzIFkzscLB55Cg,332
 pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
diff --git a/venv/Lib/site-packages/pip-24.3.1.dist-info/REQUESTED b/venv/Lib/site-packages/pip-24.3.1.dist-info/REQUESTED
new file mode 100644
index 0000000..e69de29
diff --git a/venv/Lib/site-packages/pip-24.2.dist-info/WHEEL b/venv/Lib/site-packages/pip-24.3.1.dist-info/WHEEL
similarity index 65%
rename from venv/Lib/site-packages/pip-24.2.dist-info/WHEEL
rename to venv/Lib/site-packages/pip-24.3.1.dist-info/WHEEL
index ecaf39f..da25d7b 100644
--- a/venv/Lib/site-packages/pip-24.2.dist-info/WHEEL
+++ b/venv/Lib/site-packages/pip-24.3.1.dist-info/WHEEL
@@ -1,5 +1,5 @@
 Wheel-Version: 1.0
-Generator: setuptools (71.1.0)
+Generator: setuptools (75.2.0)
 Root-Is-Purelib: true
 Tag: py3-none-any
 
diff --git a/venv/Lib/site-packages/pip-24.2.dist-info/entry_points.txt b/venv/Lib/site-packages/pip-24.3.1.dist-info/entry_points.txt
similarity index 100%
rename from venv/Lib/site-packages/pip-24.2.dist-info/entry_points.txt
rename to venv/Lib/site-packages/pip-24.3.1.dist-info/entry_points.txt
diff --git a/venv/Lib/site-packages/pip-24.3.1.dist-info/top_level.txt b/venv/Lib/site-packages/pip-24.3.1.dist-info/top_level.txt
new file mode 100644
index 0000000..a1b589e
--- /dev/null
+++ b/venv/Lib/site-packages/pip-24.3.1.dist-info/top_level.txt
@@ -0,0 +1 @@
+pip
diff --git a/venv/Lib/site-packages/pip/__init__.py b/venv/Lib/site-packages/pip/__init__.py
index 640e922..efefccf 100644
--- a/venv/Lib/site-packages/pip/__init__.py
+++ b/venv/Lib/site-packages/pip/__init__.py
@@ -1,6 +1,6 @@
 from typing import List, Optional
 
-__version__ = "24.2"
+__version__ = "24.3.1"
 
 
 def main(args: Optional[List[str]] = None) -> int:
diff --git a/venv/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc
index 8b3d49a9dced404ce385160b3f16bafd19d6935b..e52ec65ef67cf0465bf4d635eab27499b19cb288 100644
GIT binary patch
delta 39
tcmey#`kR$^IWI340}$}3`=qB%sd{~%!IWI340}$}3`)uUi!3h8}Csd{~%!IWI340}#BelHSO@gA)KcJ_UjR

diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc
index f51ca28767638b05630c9e47ee679ac4a3a1cd5a..54b2a16653ab22b9d5779a2c5f45d6dbb7c6381f 100644
GIT binary patch
delta 20
acmaFM_Lhx%IWI340}$}3`)uS+Vg>*<-UMF&

delta 20
acmaFM_Lhx%IWI340}#BelHSOj#0&sE^aWr5

diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc
index c00f4efdf4cde52a8b5bc1d366ba26dab420ffa9..5ba1087a3dafc239389245849a76e79a35488f0a 100644
GIT binary patch
delta 483
zcmcao|Gu7YIWI340}$}3`=m!`ZsfbE!Nm>aG6V7FWs^T@n6jm?r*NcmPu9@PWaOMY
zNi%=)Rvkg66z<6)TAqwNljF1`C3#c$mN79ftOjBTr~*{$hCI8uZrOK8h83QxAs)@2l#oThEaC^~tDwlyPAg|;K3_+&91
zTSke=Av)%al9PLMG=a8l)3IijD$$%A$SyINM^}(hda|6ZIR|aQ
zw|TR{4kiI5aZfhplWZ)WTVSKv)

delta 465
zcmZup&npCR9Q}Ug$L{RdncdlCci64f7It=Kw360_BuOL`FN=w>v&^adm=Oas
zvXpNJSj}`WV*xa@aqweBn~n;HK*%xW4}e$!RI^21w0(O)TvMV6V%1o|Lxx^a{$P=c
zCGAOGk4M=E$as|<;({RwQV%Sum9@A!v)L?VlWS6leJ9v`7A+sNnxMNN_@zxRpPq>k55u##3
zEOQ?*=Pq~2gd5{Uj=kZyqTs)&fui74+OJ`>z{?M@dY7g898S4BRo6%2smIiH1PJ~zMuefIyXe(&G^wj+4aTlfNcH+U8R

diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc
index 9d5e6efde5357b22af1bc9bf533ea6983bf825a1..1c637fa38cbddab9300098ed2a6c685b74bdf4dd 100644
GIT binary patch
delta 20
acmZ2mu(p7EIWI340}$}3`)uS^vH$=(`vj-}

delta 20
acmZ2mu(p7EIWI340}#BelHSOzWB~v}5e2CL

diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc
index bc1cd47fc15dadb4c6e8538b9427793c1c9d49ed..28737552bd07dd6688a3927f3abad9a870b2ecf4 100644
GIT binary patch
delta 22
ccmdlpi*e5^M(*Xjyj%=Gz^CrBk=xK007!WSKmY&$

delta 22
ccmdlpi*e5^M(*Xjyj%=G@U}{NBe$V108ftwK>z>%

diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc
index 9b217a8c0e246f69250d553e72bf32943f5f1a2a..9526602670055cac39b808b069ddbb961e195107 100644
GIT binary patch
delta 9648
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

delta 7920
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

diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc
index a6dee60db58a0002b4d316b0425a288237548bd7..f5c44f10fbbe8d1b74c74d4671c041cbc1c32ddd 100644
GIT binary patch
delta 20
acmdlSxH*t}IWI340}$}3`)uT1p#cCne+29R

delta 20
acmdlSxH*t}IWI340}#BelHSO@LIVIml?Ckp

diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc
index 1964221be464930993c73e3aff2e4ffa68f6008e..dc89c2355398b7e5c3ef04a8b8a01e9077d0abe6 100644
GIT binary patch
delta 20
acmcZ?buWs0IWI340}$}3`)uS6)&&4SfCU5q

delta 20
acmcZ?buWs0IWI340}#BelHSN2tP21~mIeg?

diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc
index 33de2275f5dd8ce57776cb6a19bbc0ef806fd041..6cbf01533567f8baa55497f3c0e7bcad851aeaf5 100644
GIT binary patch
delta 22
ccmez0&h)>XiF-LOFBbz4@TvQ3XiF-LOFBbz4yseVn$o-`m09i%{oB#j-

diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc
index 41e91a2c7a725e5c91840fea14c81cfb2e19e030..95c1c588779fe54b94c7394f5b8ff4df04f905d1 100644
GIT binary patch
delta 20
acmdlkuw8(AIWI340}$}3`)uUa;Q#XBW=0;FrN*odchS{yq6!mxAqV_)`C&qs34v#2h)6^B9fArc{%nHKV!Ml4>c2
zQ(?9C8j)gas>31nvJ<5WpA0_>+nBp}cFT`X2(bvT|ThF{=fkl0L%dc>221?a0
z*zZoQ87)GK_`sdlVo1()iqX1=X!OWtog{Gt(}|$#utGfaaMn|u)J9yaO8z14%`7*JbovH^ZseNOr%Bt3CQ@yx-fNj>nu@8ZIvaVJX>sC*
zt9M%aoNT}Nt1TJWfE?+{a|@zkv_0HM4FP##VvrpVzv
z+S@`97QHJzAMZmFqko?`^$1eSmP=EGJVc2@t@WrxN=0p7%HUHA78A>RtVZQ7b%%6K
z^OG=J{j?{-7#FwVgK?c~tIqk5s9B}OXS1dUDI9GY?y9r*gfqG{XHGawy5z;uKwj=Y
zkJZr!l0mv+6J9%xi=sHNJeVf+A)Bp>j|PT%)j3|1XK6lwjy5UL>OeXYX{n27La+K0
zyJ~HIyn1l(Ta66~-@3ya$eRR%EA-E!{E_U0GGs@iqo5YUnKQNaoe)>n9UrG`NMAN%
z7?YXow0(25*?pkBmN90y3CBrAJE0ahyf{DCiBpG@l*ZvEm(^%#8QcGmm>BMCTtFQt
z5vX{-5f_HX4v~Y>iyJeR1qr|1+seM*$XGnh@f17jUbLL1i(;v!sw7k#lP-#*c6O3U
zdl)O#)$1QTMACIMN6iwHQ~ma@kNb
zqbh3;Fx3L+P6PTqp=t`$=0I7obNC}sK7v~WPr1u{4k(kTT1PnF5PZR*>=0__O(0;v=~UC?LxrK|u2U++EV
z+;h)+UOCTxUu52oyxvL$pFieaj*W`S0pIoc@x?F9%Hs_D~
z<=&;&ChUfkd&%MsTwV`hS$Q6vp%Ns%PeHxVL#i{b*Kbt
z`3*-#4dHUWiH}wWc*rRlT8I-tFl-3nFtp-75#aZo0p6}Y#@fuHI%H=J{4@9Twq;@1
zNXIsjsH0FU8Sn@$4HY3QAE^a8&BK+gjJ0vyGupBRnGbCJmA90r4Wy!eICWbP?o-;BA1rK#YE5GG6P_nstAM@-(A`B30;nOu;n}%t*pWpyO
z)NWmL5ZA(~Cnq(1m71?=enQh;_w5XkX)s6!%9b6)^@?S``NmLiVBL@HBx4EMg{^0s
zaOl~*2FFR-GH(IR+fl0zw~^oxgs4q8jiR0{!7kc4EQ6jVHXRf0ymmH0S`5R1`*3)|
z$^Z=WUuv^n(t}2IlYEq)@b8LI`a}iByqE+-6Y6NOlr7|i-6#Qckyt0e5WxsR1;H4>
zF@j-!*B_`4(7hBJ3Hh
z1XP!zTAM8<^XWudn@Y~;C0PbAMH~!`Q4%iDih44offs2})$%^VFEzFY!$?`F7z`Zl
z0TAXl^Lv42^Vh~8^GN^QFo9&Q23x|!hYZ1U2&-L~CgLVnpY>_?lp|fY=!n-|RAyP+Kc++jkmql;
zUZ^M6g(IKLY49p8p_ahU``X?+(Sb`0(`BM~5QLg4sk;j)K31Q^_
zE3*ASongVL$(RsGt8m
z)XFM(IM%9C??V+IiG_k*T2>T!sJdaVCAmY1xAr?F!KOr=PMU^$%o}}*+$WaA!
p_nJZWpkhz1ke<=CLAZ-thOcph-;a&<4E~_}k3TcDH^Lm`;Xl7mDWm`Z

diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc
index f2dc124d690049e2ff83ed9ea08bb80ef53b54f3..e1e70e9978e2809e78df681942820c98503f7c58 100644
GIT binary patch
delta 51
zcmaE={8gEEIWI340}$}3`=l?P$ScVhG*SJ~WNAi~#f*&njQ2M)38*r%3QsWZ(VeUz
GxEBChxD9sz

delta 45
zcmeyW{8X8DIWI340}#Bel1`sFkynz@ZKC=iM(K^;#Q7O-Z{`zFWn|==Y$3Q806O;#
AR{#J2

diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc
index 5a8e65ee88940f4f8b2588ba86ae7ee3ea0c7861..8c48d1cc97f998c97e03d1ff06212cf99513d68d 100644
GIT binary patch
delta 20
acmbP~HYtsJIWI340}$}3`)uT9HwFMURs=o(

delta 20
acmbP~HYtsJIWI340}#BelHSP8ZVUiDYz036

diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc
index 0d35e0d9dd8925797933157ade5e9bd0aaf743f3..80340cca99b5ebb74059c4098fef9933da98a2e7 100644
GIT binary patch
delta 20
acmez8^3R2PIWI340}$}3`)uScRssM*T?H)w

delta 20
acmez8^3R2PIWI340}#BelHSN&tONi_a|SK|

diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc
index 113f661be1e9c4674865c3fc4c690b97855eee0a..546bcf7f0d1fcd984bec371fc05b10b57d97249b 100644
GIT binary patch
delta 20
acmey!^pS~sIWI340}$}3`)uS+V*~&;>;z!|

delta 20
acmey!^pS~sIWI340}#BelHSOj#s~mD0tI3K

diff --git a/venv/Lib/site-packages/pip/_internal/cli/index_command.py b/venv/Lib/site-packages/pip/_internal/cli/index_command.py
index 226f8da..db105d0 100644
--- a/venv/Lib/site-packages/pip/_internal/cli/index_command.py
+++ b/venv/Lib/site-packages/pip/_internal/cli/index_command.py
@@ -54,7 +54,7 @@ class SessionCommandMixin(CommandContextMixIn):
 
     def __init__(self) -> None:
         super().__init__()
-        self._session: Optional["PipSession"] = None
+        self._session: Optional[PipSession] = None
 
     @classmethod
     def _get_index_urls(cls, options: Values) -> Optional[List[str]]:
diff --git a/venv/Lib/site-packages/pip/_internal/cli/parser.py b/venv/Lib/site-packages/pip/_internal/cli/parser.py
index b7d7c1f..bc4aca0 100644
--- a/venv/Lib/site-packages/pip/_internal/cli/parser.py
+++ b/venv/Lib/site-packages/pip/_internal/cli/parser.py
@@ -6,7 +6,7 @@
 import sys
 import textwrap
 from contextlib import suppress
-from typing import Any, Dict, Generator, List, Optional, Tuple
+from typing import Any, Dict, Generator, List, NoReturn, Optional, Tuple
 
 from pip._internal.cli.status_codes import UNKNOWN_ERROR
 from pip._internal.configuration import Configuration, ConfigurationError
@@ -289,6 +289,6 @@ def get_default_values(self) -> optparse.Values:
                 defaults[option.dest] = option.check_value(opt_str, default)
         return optparse.Values(defaults)
 
-    def error(self, msg: str) -> None:
+    def error(self, msg: str) -> NoReturn:
         self.print_usage(sys.stderr)
         self.exit(UNKNOWN_ERROR, f"{msg}\n")
diff --git a/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py b/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py
index 883359c..1236180 100644
--- a/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py
+++ b/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py
@@ -25,7 +25,7 @@ def _rich_progress_bar(
     iterable: Iterable[bytes],
     *,
     bar_type: str,
-    size: int,
+    size: Optional[int],
 ) -> Generator[bytes, None, None]:
     assert bar_type == "on", "This should only be used in the default mode."
 
diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc
index 9bdd1242d87178aa28aaed08ca31855abe184973..e75c5e2cf293f602d2c21905778f7641cc5b31d7 100644
GIT binary patch
delta 20
acmaE;^iYX=IWI340}$}3`)uS669fP_`~-mj

delta 20
acmaE;^iYX=IWI340}#BelHSN2CI|pP5(R<)

diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc
index ca021ddf89810c601193cc31640275fa83c0d0ba..84eec376b532ab136e958f6ba827c4786a0eab77 100644
GIT binary patch
delta 20
acmeww@->8eIWI340}$}3`)uUS(gFZOJq0=d

delta 20
acmeww@->8eIWI340}#BelHSOjr3C;=QwBQ#

diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc
index 1cffe9d911a35791111ca091cbeee41020905ded..458d068419990c175a078c8a56c1f2a751ea1282 100644
GIT binary patch
delta 20
acmdljzFVAoIWI340}$}3`)uUizzqO0dIWO-

delta 20
acmdljzFVAoIWI340}#BelHSO@fg1ohkOg!A

diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc
index 5f4b5b504f266f3da0842d7fa106dc7a9fce696a..4356179f2f5be94dc4b78393bd217be235861ec9 100644
GIT binary patch
delta 20
acmeyY{aKrPIWI340}$}3`)uTXAqoIK6a`HH

delta 20
acmeyY{aKrPIWI340}#BelHSPuLKFZ+Dh5sf

diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc
index f6ecff7abc90a8fb1b71f87849fa41964ca953be..0fc3947f556a4788d8dd2d1f7938b9597708fdec 100644
GIT binary patch
delta 20
acmexg{J)rcIWI340}$}3`)uU?VhI3BI0hvE

delta 20
acmexg{J)rcIWI340}#BelHSPu#S#EfP6s9c

diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc
index 5ab53932bf0223560f4d8ae0a2e4d7e070a14769..8954a163d6d7adb26b4d88c5427b026877814dad 100644
GIT binary patch
delta 20
ZcmZpOZ;0n!&dbZi00eyMJ{!49^#L=61a<%b

delta 20
acmZpOZ;0n!&dbZi00eKVq&ISx>H`2eoCS9P

diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc
index dfd3703301f68ef2886d5d1fc5911bebc67ef69c..715a15912291f88bda7cae8f4cb0b95963963543 100644
GIT binary patch
delta 20
acmZ2%yV#a{IWI340}$}3`)uT%AqN07B?O89

delta 20
acmZ2%yV#a{IWI340}#BelHSNYLk<8tI|YjX

diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc
index f2f1b3c0b93dfaba1da6478f4ea6ea860cd7c231..ba16663a03cdcc86854f023ec94c05bc9956f800 100644
GIT binary patch
delta 20
acmcbhazTZAIWI340}$}3`)uTP6#@V@odi<=

delta 20
acmcbhazTZAIWI340}#BelHSPeDg*#MvjtQD

diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc
index e6c2c0bf0b29477d6fa1d1798ad933869d5c48ae..5e81f48171b69c35cd316381145052ca0656b7db 100644
GIT binary patch
delta 20
acmbO(HC>8(IWI340}$}3`)uUq;ROIJNCS@m

delta 20
acmbO(HC>8(IWI340}#BelHSP8!wUd2UIdT;

diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc
index b91e4ab5dd42f2a2a95a06647ba8eb4d0f3d42db..ae3d1e988f41781e3056e20a286cb23131d35d4b 100644
GIT binary patch
delta 20
acmZ3@znY(WIWI340}$}3`)uT1zzzT|)&wsA

delta 20
acmZ3@znY(WIWI340}#BelHSO@fE@re>;*6Y

diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc
index f4caeae64baa001ab77b45f22ac60840434f9547..846c9054cba02a4163d7cb192897e0ffc96cff4a 100644
GIT binary patch
delta 20
acmaE2{luDkIWI340}$}3`)uUCDGLBT1O-R{

delta 20
acmaE2{luDkIWI340}#BelHSODQx*V48U{%K

diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc
index 346a7428ee69c9ed64a0743c47470ad1e97c50a7..250d250bfe57a04d589652ae9006ac9eb52a73ca 100644
GIT binary patch
delta 20
acmcbibVG@IIWI340}$}3`)uU)6$Ah`lmun~

delta 20
acmcbibVG@IIWI340}#BelHSPeD+mBSss(2N

diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc
index 15ec35953b6b6d300c26bb4593bbfed83719662b..31b5bcd61435628d753cbd04bddc1bfb85d78232 100644
GIT binary patch
delta 22
ccmZ4Vm2uHmM(*Xjyj%=Gz^CrBk$ZX-08=FfRR910

delta 22
ccmZ4Vm2uHmM(*Xjyj%=G@U}{NBlq+w09rc-RsaA1

diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc
index 0ef7d2c88d25d7c00e4a53a0892adef16a81953d..714ed6a82f9d3d0824d6ffa41e867f8b0dafe249 100644
GIT binary patch
delta 103
zcmZ45#kjPKk#{*SFBbz4@TvQxKitUsUP@P$>jMKPlz1Q@_?4M~SMY+M+6u;tJX%+H
lv_3GyBtgnHYf39Ju|ZT%4v=-=R^|E#()|S_H(Rz#9RQC=8w>yd

delta 103
zcmZ45#kjPKk#{*SFBbz4yseT>f4q_Ry_Bvx*9QhpDDgl*@GCO|uiyniwH1sPd9<$Z
lXnkOYNrIGZ)|6IcVuPrj93bn!tI>D89IWI340}$}3`=tNc$Xg-Arfs%Tca84mZXs3y0GkjAC;$Ke

delta 34
ocmbQ>I>D89IWI340}#Bel1~4#k+(vKP1j}yUj(@T

delta 20
acmccOam9msIWI340}#BelHSPesR95)bp^Tr

diff --git a/venv/Lib/site-packages/pip/_internal/commands/list.py b/venv/Lib/site-packages/pip/_internal/commands/list.py
index 82fc46a..8494370 100644
--- a/venv/Lib/site-packages/pip/_internal/commands/list.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/list.py
@@ -176,7 +176,7 @@ def run(self, options: Values, args: List[str]) -> int:
         if options.excludes:
             skip.update(canonicalize_name(n) for n in options.excludes)
 
-        packages: "_ProcessedDists" = [
+        packages: _ProcessedDists = [
             cast("_DistWithLatestInfo", d)
             for d in get_environment(options.path).iter_installed_distributions(
                 local_only=options.local,
diff --git a/venv/Lib/site-packages/pip/_internal/commands/search.py b/venv/Lib/site-packages/pip/_internal/commands/search.py
index e0d329d..74b8d65 100644
--- a/venv/Lib/site-packages/pip/_internal/commands/search.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/search.py
@@ -89,7 +89,7 @@ def transform_hits(hits: List[Dict[str, str]]) -> List["TransformedHit"]:
     packages with the list of versions stored inline. This converts the
     list from pypi into one we can use.
     """
-    packages: Dict[str, "TransformedHit"] = OrderedDict()
+    packages: Dict[str, TransformedHit] = OrderedDict()
     for hit in hits:
         name = hit["name"]
         summary = hit["summary"]
diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc
index 2a6b51d5d0d4d55b7c36d18a31fdb223f8b047e5..fccd553bcaba841e03211b4988774a1d18223193 100644
GIT binary patch
delta 20
acmZqYXy@Qw&dbZi00eyMJ{!6JFarQ7HUu#M

delta 20
acmZqYXy@Qw&dbZi00eKVq&IT^VFmy&Oa(Fk

diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc
index 0a079d347d38ccb1d6c42d8a0112183b0d3b7620..b61e8b2413e7829e3e60c959c0d315ff71043a68 100644
GIT binary patch
delta 20
acmca7aZiGKIWI340}$}3`)uS6<^cdV7X)7b

delta 20
acmca7aZiGKIWI340}#BelHSN2%mV;EEd^iz

diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc
index edb4c87ac535534da17ca420e2e3d4a9a3bd136c..90b6102f8315dbe429e72c7776b294f622c01425 100644
GIT binary patch
delta 20
acmdnMw}Fp)IWI340}$}3`)uS^Wd{H*dIP)w

delta 20
acmdnMw}Fp)IWI340}#BelHSOz$_@ZEkOaK|

diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc
index dfe4c2bba26bfbe50f559bbf60d92db54939e98a..ab1cc28fc13e5e20845383a107e43bebf6bb47a7 100644
GIT binary patch
delta 20
ZcmZqlZ1m(_&dbZi00eyMJ{!5qQ~)rG1VR7+

delta 20
acmZqlZ1m(_&dbZi00eKVq&ISxsQ>^sp#?(#

diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc
index b56d7ab1ced4963ef1cdf19abc73a30940dedc04..814ce667cb5e99027a0e20560d7f3657947c8288 100644
GIT binary patch
delta 20
acmZ1@yhfONIWI340}$}3`)uT1$O!;1kOVvc

delta 20
acmZ1@yhfONIWI340}#BelHSO@kP`qlrUg9!

diff --git a/venv/Lib/site-packages/pip/_internal/exceptions.py b/venv/Lib/site-packages/pip/_internal/exceptions.py
index 2587740..45a876a 100644
--- a/venv/Lib/site-packages/pip/_internal/exceptions.py
+++ b/venv/Lib/site-packages/pip/_internal/exceptions.py
@@ -15,6 +15,8 @@
 from itertools import chain, groupby, repeat
 from typing import TYPE_CHECKING, Dict, Iterator, List, Literal, Optional, Union
 
+from pip._vendor.packaging.requirements import InvalidRequirement
+from pip._vendor.packaging.version import InvalidVersion
 from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult
 from pip._vendor.rich.markup import escape
 from pip._vendor.rich.text import Text
@@ -429,7 +431,7 @@ class HashErrors(InstallationError):
     """Multiple HashError instances rolled into one for reporting"""
 
     def __init__(self) -> None:
-        self.errors: List["HashError"] = []
+        self.errors: List[HashError] = []
 
     def append(self, error: "HashError") -> None:
         self.errors.append(error)
@@ -775,3 +777,33 @@ def __init__(self, *, distribution: "BaseDistribution") -> None:
             ),
             hint_stmt=None,
         )
+
+
+class InvalidInstalledPackage(DiagnosticPipError):
+    reference = "invalid-installed-package"
+
+    def __init__(
+        self,
+        *,
+        dist: "BaseDistribution",
+        invalid_exc: Union[InvalidRequirement, InvalidVersion],
+    ) -> None:
+        installed_location = dist.installed_location
+
+        if isinstance(invalid_exc, InvalidRequirement):
+            invalid_type = "requirement"
+        else:
+            invalid_type = "version"
+
+        super().__init__(
+            message=Text(
+                f"Cannot process installed package {dist} "
+                + (f"in {installed_location!r} " if installed_location else "")
+                + f"because it has an invalid {invalid_type}:\n{invalid_exc.args[0]}"
+            ),
+            context=(
+                "Starting with pip 24.1, packages with invalid "
+                f"{invalid_type}s can not be processed."
+            ),
+            hint_stmt="To proceed this package must be uninstalled.",
+        )
diff --git a/venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc
index 8d0781694e7ae282a19a74fce4528b019eaf22ea..4623f112918a323c064dd9620e56739721aaeba6 100644
GIT binary patch
delta 19
ZcmaFO_?nS>IWI340}$}3`%L71001$o1gro6

delta 19
ZcmaFO_?nS>IWI340}#BelAg%@001|@1+4%8

diff --git a/venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc
index 009023c9114b97376480f591884641f460c4e2e4..7db9ccb8eb07f418864a24e126baecb5c4ba2549 100644
GIT binary patch
delta 22
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 None:
             # otherwise not worth considering as a package
             try:
                 project_filename = parse_wheel_filename(entry.name)[0]
-            except (InvalidWheelFilename, InvalidVersion):
+            except InvalidWheelFilename:
                 try:
                     project_filename = parse_sdist_filename(entry.name)[0]
-                except (InvalidSdistFilename, InvalidVersion):
+                except InvalidSdistFilename:
                     continue
 
             self._project_name_to_urls[project_filename].append(url)
diff --git a/venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc
index 5f2f4e54ff1f8292ca40298ad6196bee61531d8f..d41ec5399fec708f1115c0d3350ac788bff3699d 100644
GIT binary patch
delta 22
ccmX@s&3LSvk$X8WFBbz4@TvQ3&u<$=7@b*r?Kt*s9mn?WdgIz|jExgi$blb<2oeP<3Q-QIhhjCXoX*&F*tN~<
zMj}!yUvdV*cR)yy$f-S494d=SAf)~UMMXlQ?4j3kfa^-siXTy?Ni;
znU$Zc-da^|D#|S4L#?lOh6jp)|2e4N9brTylCblR*3<$%YwM2DGyVG@79mT4_rsi`!|U@5h^qVY39{?VjK0Iek`740#i+trBBjZdN(x%}8NC
z+I-2uJ2){|+;tcd66?|v>RiuTby(Ad&$4Vl6)V-9IfRUW5
z2PYtA_vArrFSUJgpR!K41deRt2z)1-k<^g_e?+Q!7Y!9}Av8qjU9_nWRj&jqu@#(#
zyU{%C#&UQLzKm(hnNY`D9CI>%C`}(0MqV9$jV(8_p?)a$;?Kq!%HC2~Lufk>pX5pj
znPf?h1i%)6nvF*
zU2n(h+U|M5nE7?GlNRxr=*Dsa^6*V^tuB1n84iBB+jG5^ZCg7oWm_!{B~dF2n1d%t
zvpO$m;4(1~x0-;!RO}!#VKwzprOK(FKF(md*RE5CviJG)BEQ^6@O|pv$b-ci{HWZK
zily;q>WVyiNf;~(c!h%>cdxPTz;pd5X?d-N%%mk497!&0`5YvY5gAytp}z@O>$nKNj4*ZqjQ>rS3oD*mb3#!NgnT-c~TrXuJD4y8>zLXIz7O+Eu+K)&~iaLN(Z7)b4JvO?X=`2a*eo
z%d9CxA~L%w;Pe{1<%u;G+|$d7C^qDa8ygol8ZW|Q{ZcG=fXi^n*nm%yCL9{C!SBXd
ztiaz!8LOZbs-xieqrs8S@%4U!XIbxeI+Xb{mep%H)Uw#Cq7vcnk{{jb_wC7+uZuue
z1Z)bh1Wbo~JoBd0Cp$KMi+Q{%{sG+|`1br2!5BY4YxmI_{8YFNH_deBK01HuI|lPl
F{2xw9A-ezo

delta 1520
zcma)6PiP}m7=Le)nWUXek|t>~lce2A|7;rCEEKh@MOV8Z?cm%Wd&dIzWnC>
ze&6@|-kV1bmj7HEKNm^56%$g=C
zD`QP*f%GaO>7fNgG9Vg1v6h9koRzYstf{6jNJh;hQFkN8Okg&G!0zEj|KW4)gi+2?
zn{lG;ipDG$f*Hy0hKXOXkHhu4a5zL$#b3+fmoRf=Amv>dnVwruANN3_TeN7t~z9@i$v=s0L7
zzjKstiRRb^`N{G;he-%tvbEv3rft`|jzt?L1f6pw9#ZT;F0gN8P4@HoO@P`z%P*B?
z0eZ=SZQWVDVzn*$JSEWvhhW6rOIn9
z@URHMi#V&a)o~p!Oib6Th;*2z7rF8U2o=FMq5L*fBJ8%DpYwaW0MAYYg5Dq0?{IX@
za)aJ#>`uCg%e|$HCcLPF(%+*O-PokrFUN$BTAs(`|wh
z{JEbeHCh|>&X&XPzpm3+wwKLdgME>`iOVdaKFvPQ<<&B;<2NGnMmk+;*{uexvmbN1
zFFXJ88(hNsrk8m*nE|dm!vyXCro&&s+vvWm-3TAb)w^=_o?JZ)SN*(-xKgXF)G8JB
zq57PpgOa|&epPECT?Wiv)s_URuy?f*j

delta 20
acmdn*y5E(1IWI340}#BelHSO@MF{{vzXkIE

diff --git a/venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc
index 3287d3525148920eb3eacc6b830b7b0900733fee..2e244932372f43a8edbd7ed2bf12a229935e363f 100644
GIT binary patch
delta 20
acmbOyKTn=}IWI340}$}3`)uT%%ntxB76dQ=

delta 20
acmbOyKTn=}IWI340}#BelHSNYnI8Z)ECn$D

diff --git a/venv/Lib/site-packages/pip/_internal/locations/_distutils.py b/venv/Lib/site-packages/pip/_internal/locations/_distutils.py
index 0e18c6e..3d85625 100644
--- a/venv/Lib/site-packages/pip/_internal/locations/_distutils.py
+++ b/venv/Lib/site-packages/pip/_internal/locations/_distutils.py
@@ -21,7 +21,7 @@
 from distutils.command.install import SCHEME_KEYS
 from distutils.command.install import install as distutils_install_command
 from distutils.sysconfig import get_python_lib
-from typing import Dict, List, Optional, Union, cast
+from typing import Dict, List, Optional, Union
 
 from pip._internal.models.scheme import Scheme
 from pip._internal.utils.compat import WINDOWS
@@ -64,7 +64,7 @@ def distutils_scheme(
     obj: Optional[DistutilsCommand] = None
     obj = d.get_command_obj("install", create=True)
     assert obj is not None
-    i = cast(distutils_install_command, obj)
+    i: distutils_install_command = obj
     # NOTE: setting user or home has the side-effect of creating the home dir
     # or user base for installations during finalize_options()
     # ideally, we'd prefer a scheme class that has no side-effects.
@@ -78,7 +78,7 @@ def distutils_scheme(
     i.root = root or i.root
     i.finalize_options()
 
-    scheme = {}
+    scheme: Dict[str, str] = {}
     for key in SCHEME_KEYS:
         scheme[key] = getattr(i, "install_" + key)
 
diff --git a/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc
index 442994fae06ca4e6aaa3d8caf939244c07705929..3b384801986056b59416135c9570af5c79fd4bbc 100644
GIT binary patch
delta 20
acmaE8^w5ZVIWI340}$}3`)uS6lLP=eLk$X8WFBbz4@TvQ3k$X8WFBbz4yseVn$SvRw07xnYzyJUM

diff --git a/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc
index b02354fab25fbff79a81d6f3542289b6038b5391..83c70357e5fb84542128c7f0dc6bd0c5b47aa96b 100644
GIT binary patch
delta 20
ZcmZo-Zer$M&dbZi00eyMJ{!5q8387^1C{^)

delta 20
acmZo-Zer$M&dbZi00eKVq&ISxGXelD&IFeL

diff --git a/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc
index 427164caf59b895f40e6b009508cc33155e021b3..0afd13e646a49271eb84f774d00db2e98eaf01c8 100644
GIT binary patch
delta 20
acmeyM`azX@IWI340}$}3`)uTXDg*#L!38w{

delta 20
acmeyM`azX@IWI340}#BelHSPuR0se=*9JBK

diff --git a/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc
index 4110edabcf1f9305a388dbce95dbfe684b98d370..90a619617f9b25970c6c947ea3444680bd2b07e3 100644
GIT binary patch
delta 20
acmZq3YslkX&dbZi00eyMJ{!5engIYdsRbJV

delta 20
acmZq3YslkX&dbZi00eKVq&ISZH3I-WzXlut

diff --git a/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc
index ebd9a15c1b4fe9f5df2154955685bc538adcd09f..70bd075738229e667e8b3b0235dae43c4b1b81c4 100644
GIT binary patch
delta 29
jcmZ3MxGa%-IWI340}$}3`)uTXtHf-oXSn&d(rR7+c5Mhy

delta 29
jcmZ3MxGa%-IWI340}#BelHSPuR*Bg}&v^51rPaIuhL8zT

diff --git a/venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py b/venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py
index 70cb7a6..4d906fd 100644
--- a/venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py
+++ b/venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py
@@ -150,7 +150,7 @@ def _emit_egg_deprecation(location: Optional[str]) -> None:
     deprecated(
         reason=f"Loading egg at {location} is deprecated.",
         replacement="to use pip for package installation",
-        gone_in="24.3",
+        gone_in="25.1",
         issue=12330,
     )
 
diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc
index 98158e9dfafa18c5131f8a5f2d90634d57873d1e..f890a190cb703edbc05b4ac59ddeb9e9144c13ff 100644
GIT binary patch
delta 20
ZcmeBW>Sf|y&dbZi00eyMJ{!527y&0t12q5u

delta 20
acmeBW>Sf|y&dbZi00eKVq&IRiF#-TCVgxn-

diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc
index 26a0c58cb10f8b2af633fa19e83e6f707c4a4c32..d872e327285b794de87b5a34f2c61b866f174885 100644
GIT binary patch
delta 20
acmZ3_x1NuCIWI340}$}3`)uS^VFv&%QUkdF

delta 20
acmZ3_x1NuCIWI340}#BelHSOz!VUm6Xau?d

diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc
index 8c5f826ddd993d203d7a5be9c200e95a056f9c03..9faa0e11cef8658759bc735570c590d440a97498 100644
GIT binary patch
delta 20
acmeyE@G*gVIWI340}$}3`)uS+GXMZYQw2-_

delta 20
acmeyE@G*gVIWI340}#BelHSOjW&i+7X$DOI

diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc
index e3d90de2a488ec44a726a86744e5ee52c1b8f215..8b4e50a19bd281116e8dabf26b63adb34d875f45 100644
GIT binary patch
delta 20
ZcmeBI=~v-i&dbZi00eyMJ{!4Nga9mc1CRg!

delta 20
acmeBI=~v-i&dbZi00eKVq&IT22mt^yiv*DX

diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc
index 67ba715ad87fcbb810d7a7da3674f4691d4be748..d0769b924fb3cae1ec53e6161ec2ce829f7bb313 100644
GIT binary patch
delta 20
acmaFH_l%EwIWI340}$}3`)uTnW(NQ^>I7Z@

delta 20
acmaFH_l%EwIWI340}#BelHSN2%?vOvO6D+IIv

diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc
index 851f30c6905c3cb29c89683b3b3c896fc5ecaccf..8d02d87d931366ba3c27f5d2285435278a766ff9 100644
GIT binary patch
delta 22
ccmaF|09*A2_W%F@

delta 22
ccmaF=j|6`J

delta 20
acmeyy@r{FfIWI340}#BelHSOj%>n>Fr3HWh

diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc
index 8181c08cff65b2af8465c79929ab20ca3d11dbd5..79b1693adc0fb51bbd76b7a397dc3bb82716d095 100644
GIT binary patch
delta 20
acmeyb^IwO1IWI340}$}3`)uSc5d#1}83gnI

delta 20
acmeyb^IwO1IWI340}#BelHSN&A_f3PF9r1g

diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc
index efcfc50348fd3d39fab2b9b00656788510af5961..e915c4609b28f95ee6374ea4d58d3f3cfa33523a 100644
GIT binary patch
delta 20
acmX@kf1ICtIWI340}$}3`)uUi!wvv5HUxtJ

delta 20
acmX@kf1ICtIWI340}#BelHSO@haCVqOa+7h

diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc
index 247af664870ee92376e725add4525c551776bdb3..964094c544a0cf7da1cce27ef53a53038ac87a0b 100644
GIT binary patch
delta 20
acmZ3bxk{6JIWI340}$}3`)uT%F9HBEV+3sg

delta 20
acmZ3bxk{6JIWI340}#BelHSNYUjzU-c?E6&

diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc
index 2faa62efe727276d2eeff3555d5d9a51dd03285e..983f8c34e0f90aed5491ae09b774dac833b88df1 100644
GIT binary patch
delta 2101
zcmaJ?Uu+ab7@yg_yYAif{`Bt3U4e3o2i#pDS6YFjP^sZ>Axcz4p&_}hx7+L1z1?GW
zuZ5mY$7k(2V?X_OiYX~g+QnqNg(65FgZU_FBqeaWeax
znQwkG-=Fzr_I&3TUBS-+0Uv@AOuth6rfE8uz+=Qm??vs@=Q3{f!$a5+DBaR5LoQLnv1Arf(3uubs<__A*YG%lsHWj7Y(Ytk9w!
zXvXjr465O)6^!)m6tcogV}v#!(mw98qRSH5Glnm5a>JNw$Z?*{$U@5#!X%XE8mhMs
zJ?1
z#Z5~d%RxBHW_rQ>;lya@ZFY#_(jkhY$3)c>b;A-127$A*v@9SsYO{O(YUE{POP>J>8k*ReH8CiAjG$Xim;%(}@2CT?V6Urnp34;Z$PUv$&Pis^>geh~`U
zNQ*+NXDy7)`}CYJG_eqEy&X;6h^A)tUyrukjJ8b*3;y8w%w*4GPn8P?B6q?YW{zJE
z=Wd2`^Gg*0OOg&wtOmp9*UQyx@o&5515T8J$Wc-
z(Svm^JqY&H7WGig#lJxGAlTYcTo42=q6iUt5K(cy+4_jI!_IH^`{wt(=TZOdE@j2%
zlLfXu&4#CHlm#V##ul26HoB2u6NUv%niDkVvP}>kux+givSu3*60U{Sd*wWOjy!gz
z7uo)D*G7+vJM^`91UYHS5%WvSh*`32t$AVG1^OCiwSLJ>YwUG?SGAV0WzKe2>-S}Q
zI9uL}ja;E`6p#FUW`NdsqsTDCmt
zg~_4;{mMk6BtqBZgA!(vk)*HWnZ}AF1mfGcX#+Q{I@WR9CT`oteH*xM&3H1nj?xVjaixKmB
z!K!4pyAb4G(+tne#B{wL)9W~b2I&eu!P2VW4-HV3DeH!&8#6_{P$B~m^H1x(1|n#T
z27-qeJrz8eiG%MBfEEA;Ko5Y#z!bqj3Pczv83KR?nf8mtVvY=h3`O#3SsinO2mlYq
z_(|Ufd*ZbYdC6Z9*s)s6kN=^Cra})@sGplAJmeJopQb-TNtz7@+pGu4eOJf(=1S&^
r+T~n!fQ&K|7`m}YUxd$$ycPOiR(}=g975d{VQ>7*^*j6A@(O None:
             raise InvalidWheelFilename(f"{filename} is not a valid wheel filename.")
         self.filename = filename
         self.name = wheel_info.group("name").replace("_", "-")
-        # we'll assume "_" means "-" due to wheel naming scheme
-        # (https://github.com/pypa/pip/issues/1150)
-        self.version = wheel_info.group("ver").replace("_", "-")
+        _version = wheel_info.group("ver")
+        if "_" in _version:
+            try:
+                parse_wheel_filename(filename)
+            except PackagingInvalidWheelName as e:
+                deprecated(
+                    reason=(
+                        f"Wheel filename {filename!r} is not correctly normalised. "
+                        "Future versions of pip will raise the following error:\n"
+                        f"{e.args[0]}\n\n"
+                    ),
+                    replacement=(
+                        "to rename the wheel to use a correctly normalised "
+                        "name (this may require updating the version in "
+                        "the project metadata)"
+                    ),
+                    gone_in="25.1",
+                    issue=12938,
+                )
+
+            _version = _version.replace("_", "-")
+
+        self.version = _version
         self.build_tag = wheel_info.group("build")
         self.pyversions = wheel_info.group("pyver").split(".")
         self.abis = wheel_info.group("abi").split(".")
diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc
index 7b8805b21ce6a9c7d0695bc58f6b5f757cea8307..143364be2825072025b0fac09a5f13ea900c02c0 100644
GIT binary patch
delta 19
ZcmZo

diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc
index 5bcbc33358e9d0dda95591e663abbb1c1a154444..8baec14179ab3d99fab1b7b2fd69870abbd2e6bf 100644
GIT binary patch
delta 22
ccmZ3#hjINLM(*Xjyj%=Gz^CrBky|AW085DlZU6uP

delta 22
ccmZ3#hjINLM(*Xjyj%=G@U}{NBezN%08*a@ZvX%Q

diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc
index 22dc161ff635b2845fd7570ab6658eb109426483..7bf75116353945e544b50cc4ab341c64bd1fc973 100644
GIT binary patch
delta 20
acmexr`_-0vIWI340}$}3`)uTXB?kaN^#y3kHDz

diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc
index ed4bbf3b08f0c5d7092c50c0df1d048cfc270954..72c455f4472bfc724feacd983c1f22f2ec4ef2ad 100644
GIT binary patch
delta 20
acmeD3>hj`V&dbZi00eyMJ{!6Js{jBq7X;q`

delta 20
acmeD3>hj`V&dbZi00eKVq&IT^R{;PzEd}5J

diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc
index 730e5eb233c33f9d253a93a636fb767e638d698d..8404dcc633215412fa62b9a6a87bd9b9d365d6c7 100644
GIT binary patch
delta 22
ccmcbWdMlN8IWI340}$}3`=lS+$a~fZ08ont!T?i

diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc
index 070078d83aa5bce69c472672e4ba282dfd64130e..d17c673d1e74251306cb4d26ab94fed656e69eff 100644
GIT binary patch
delta 20
acmZ22xmuEYIWI340}$}3`)uT1zykm None:
                 try:
                     # For read-only ZIP files, ZipFile only needs
                     # methods read, seek, seekable and tell.
-                    ZipFile(self)  # type: ignore
+                    ZipFile(self)
                 except BadZipFile:
                     pass
                 else:
diff --git a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc
index 3b03bb328f6f7acc7afd4eb44e1f5581a49c6d70..37224ebf70451505b8ab4687c35492623bcbd98d 100644
GIT binary patch
delta 19
ZcmX@ic$krUIWI340}$}3`%L8C0RSuG1T+8u

delta 19
ZcmX@ic$krUIWI340}#BelAg%D0{}7j1vLNw

diff --git a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc
index 0c760076e514c606fa0b5a502ade37307be94a86..99a6b905fbfc002227c1e9d1c3c8c3ffc19159a9 100644
GIT binary patch
delta 20
acmZp0XmH?O&dbZi00eyMJ{!5e$^!r}8U&~S

delta 20
acmZp0XmH?O&dbZi00eKVq&ISZl?MPfFa@aq

diff --git a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc
index bed6096a8cee209859d5a6ca34ad1252ffeb9465..1cf85c69c733d30075526e756584f2e11c27d948 100644
GIT binary patch
delta 20
acmewn^&^UVIWI340}$}3`)uUS)dc`VkOfiz

delta 20
acmewn^&^UVIWI340}#BelHSOjs|x^2rUp|0

diff --git a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc
index fba83f14580b3bcf401694f6eedb11b6443139f7..74525ecfe6a0727b7c0c639cddf19c5e8d6723a7 100644
GIT binary patch
delta 22
ccmdmTi*d^>M(*Xjyj%=Gz^CrBky|qt08s%2$N&HU

delta 22
ccmdmTi*d^>M(*Xjyj%=G@U}{NBe!NQ09Y3W$p8QV

diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc
index fcb117e5d2e1c5eb0028661383ff0542fbf29336..243eb5e94784fb263e1fe5b666a2437e21a85d5f 100644
GIT binary patch
delta 19
ZcmX@fc#@HOIWI340}$}3`%L8C2LLR=1V#V=

delta 19
ZcmX@fc#@HOIWI340}#BelAg%D4*)XO1xEk?

diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc
index f1c5fd5e648ce76e2398390438204a1dcd02908b..2088c86f1c33ccd4076d79868277d20e8ae7728d 100644
GIT binary patch
delta 20
acmccOa>a#vIWI340}$}3`)uU)R004y%>=Ii

delta 20
acmccOa>a#vIWI340}#BelHSPesRRH*;{~t)

diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc
index e4393b306e62d74747c2aae0d78fa4abcd18dd7b..3d0aa3bcc76bc7c0a4a9ed08224b95d9351e9597 100644
GIT binary patch
delta 20
acmaDL_&|_*IWI340}$}3`)uUC$^ig3X9Uv#

delta 20
acmaDL_&|_*IWI340}#BelHSODl>-1ieFfA2

diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc
index d4eeb5bcc61f4451dea1736abd5b14411c0995ba..bd77cfa04bd514e7c9395a7013596b2c9f410abe 100644
GIT binary patch
delta 20
acmZn>Y7ydI&dbZi00eyMJ{!4zasU7-D+ECR

delta 20
acmZn>Y7ydI&dbZi00eKVq&IT^jb4G@HIWI340}$}3`)uTPjb4G@HIWI340}#BelHSPe$OiyB?*%jf

diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc
index 4da9deb46ab9ac7488ffcfb9cc55585fa3b6f18e..150f3d147f09948e523bd00fa2b6d601ea0a2c2d 100644
GIT binary patch
delta 20
acmbQlKZ&1vIWI340}$}3`)uTHX9oZ(?gQii

delta 20
acmbQlKZ&1vIWI340}#BelHSPO&JF-F1O(*(

diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc
index 1694e9cc16418e8776db64b291a6f9b06df6a6e7..ba47135c2bd08c74cc32827ddf3f12cd939d76f3 100644
GIT binary patch
delta 20
acmX>nbWVtSIWI340}$}3`)uTP<^%vUyaXTs

delta 20
acmX>nbWVtSIWI340}#BelHSPe%n1NG(gh&^

diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc
index 7912cb9545cedcbc2070654cf26f32f287c33412..77acc499523f2bc996fcf8bca997114eca234858 100644
GIT binary patch
delta 20
acmdn4v|WjNIWI340}$}3`)uUa5d;7-Yy<-U

delta 20
acmdn4v|WjNIWI340}#BelHSOzBM1OFf&~Ns

diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc
index 1020bcd95cf1511eb67989bd092f9f09dd08da69..802a4de8fe172aa0276086313ec44ecc0d285128 100644
GIT binary patch
delta 20
ZcmeBW>Sf|y&dbZi00eyMJ{!527y&0t12q5u

delta 20
acmeBW>Sf|y&dbZi00eKVq&IRiF#-TCVgxn-

diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc
index 015e20db397c32fe23a3b37d256c5770f9df8388..9f36c47085d74f1c01acdbc67475f5af93cfa12a 100644
GIT binary patch
delta 20
ZcmeAW>=5K$&dbZi00eyMJ{!4fIRGiA1Iqva

delta 20
acmeAW>=5K$&dbZi00eKVq&ITcasU7@y#&kv

diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc
index 99eb268621f868deecfd86c40d50a3883395f267..c175da5175892fa9b70cf410bcdd818f24b2b414 100644
GIT binary patch
delta 22
ccmaF1hw0fKChq0Dyj%=Gz^CrBkvn=G097jnRR910

delta 22
ccmaF1hw0fKChq0Dyj%=G@U}{NBX{&X09-)_RsaA1

diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc
index 1894e43b348452cddee3dc482d4ad8b533163f1a..c0631591bba937bb8514da82f0d5ad8e6c3df67e 100644
GIT binary patch
delta 20
acmbQGFiU}ZIWI340}$}3`)uUq7XSb)n**l+

delta 20
acmbQGFiU}ZIWI340}#BelHSP8F8}~Eu>`09

diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc
index b88d465e725cb9ace34ca464a83f5c1029f12fcc..e37541ee9099fe135bb72edbc9877bae6bdea968 100644
GIT binary patch
delta 1738
zcmZuxYe*bd6!y-(cf0PYb=9bG*GF}#YitY!b)&3`S}|x8TH2<{#2t5+>_g9Nqe(VC
zf>xUbE4hWlLcsP%r7viig!YepKx`syK*3-0qqLO1eiTYep$IL#=T7R1WZ3!k+;h)&
z?z!hNOSj3Vw~2Gz>9l9DC%d{Y{O`xkza7+7SWLZ-{UU^H)a~?G(*(*x_BAuj$$4Bz
zx#&dY5&Eh>+mj$6$2%k|>wWg>&t+38M?K?wo!Bp3erb=?X<4F;{*_&BF^?r7E~Ti)
zHEa(u+gA1}-_vQ=4S#Oo4gYoj7xr!M;F@9G`nL5$&qwwhv1M0m+3^N;y@74^8yMWl
z9oo$uQk&gr(~*;mtvRGvY(yE2$Z=T#7t@GVXjixMsfqNcq2e-<|2!TdFz|ZeN%jY4
z7|^T5C+IgNqva!Pp&1kMR0;~2C>mi9HDpXP#i9x3^F?~Pw2?&Ah0m&*FD_@$B0oqZKGEbn<1l_0@Gonc2?gF*7vW(>6O0+;b@{I{8E<+z3
zuPS4-m8yC&qkdl1MQB4!xd4k)tbVg>2^}qOi&CAyx!SNZ7v3>ueqMunwHHMk#&jQYAWi?M6ry@1Ov?=B`#>TIP^qP*j4)XeQk~77gA-IF7JJ&j%XG9reAyvjXdnBF8Ffu`ys#t!(>%n0cucEN_4}
z#60eCFK8v2;SMSewFVF4VSnH?^!~`_+yf`z&THy(!QaUL<>>8D9CN6iMOdKsJ5HSB
zS;8C@kln2pP=Cq!T}yG`TeG8Q)ds^P_J}Sp`KgK;vNr#+v`_F-4zC!
zIU*?$SrKh|#Ep-LShQ&lR;~T9DM2!y3hsZNE_WA{;3ZjZKEu63aV^p>yIaZK>pefQ
z>HN9pzMIpoqGcx6KAvlyVTYbvew~aduSjmjO3=xhw7j>0+*5~oj|-1<+?=W3KABIx
z=sIvt5TiMUa44<^G7KTL+{R)4YUYqp_T
zV##orO*eF@fA$B3(iEP;=iWZDKW>`woP0rnb$WU*Z-xhR6wM+CIG()o`A11Jo=qlW
zz>B~?DL8FNyF0|fkFKpg^px%aGrcrx^IOm2lA*^;nVsjy^a{ca%Y
J4}(>f{{We9tr-9S

delta 1807
zcma)6TTEO<7-sg)ZkJslK
zXXgLsvla5v3UPnrb~`ipZ)4OK-CTBWx|}vXGV|{@$~?R7IK~MLL^2~z)_PB#DdlGG
z`S-BTtFv~E^0*|4xF)PAk2da}CC-4_cb8P@8IptLdiJtbPoMJ;*JYrN%aT+eR2nccWnr=9YSTlWMxOLv9i@qTq+
zP)^7y^>B~mplw(3n3Z&CZ~2Nz?vv0qaVROF75tAr!-0L_+t2?
zGo?I>J$v6=>>{)-fZ&iLu~hg(T&6F=7Xq9IOai6=(|~h;89+G)$x6?{&IOzX2%?yB
ziA<j{2mL)x8A|0%^GSATk8A8XHQdvr7wM&(+S-i7Q+Byu{$*OCs@=kH5
zZXXWQWGoq#%;KCttF0$<+6T42THV8tGSPRyp4Z-Q2%4(B8(;K!CK1WB{w@n4@=`3D{Gr>VOhm#|ErZObca7v+nm4#Kv(g_6E
z!;wgTLXFZmI15@u^Dyx;*r*5U0(7wDgZrX$+|+GGeNn$Lki&FfkRC%&0X&YF+CMxf
z%W;|m9}0+$VZ#1`Ox2i@q}^~m0B8od0iqhbB9P9rmSCBe!o3JUiO~={9V{rsGP>1}
z$FMrBJ#TL`-|GqduG#N{*^2N4ZId=T0pIq0@AFVUxrp30Uf;XmFT)B8D#F61ykv!Yd
zIE4J~2khJl=-E4%gs!sAo^rCLDLvm42gv*lSY=Oyn#c`yDHJ7r>`ut%`G!yE_P7#_
z@>ha(Xk`z#nTk}bBHj;Y|5n@TmgnRVl`gUAM{*{iNACqh0cdm4LE?GSEhiKuPQ|^=
zVg_AnlyMQPtAJ~O>wq=D4Ztv<3Q)n}t|ORGBG1R=7WxAp68@=W_Kb|5%|y$2G+_S|
Dfu6vS

diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc
index 91565001ef2d854c8c960b653e756912b374dbf2..e2284816231e531033dc21d8fad0c48b4e9e39a7 100644
GIT binary patch
delta 2064
zcma)-drVVT7{JfDx3`bmhXsl}TBW6kw9q021VO;b!$%YpbUL?%A-%F{t>m`&V3)8h
z{;_2m>&^^LG*+g_hEtZhW!oQ%dzod)vSMoNYTPi(lFj|GOT;YuW68c#24b>5cJ9sZ
zeCM3+JLlZ*`_8#z*YPKxV#8&r^+#GugG74UY7LU$j?Vi2YfLlg%A
zrG?>tt!h0{Ry}0gj+eq8Q`pJU2ctPFAp_siXmft+hGA4co0c6Bz{x?MW
z0m<~#F1($4e10L=84PuG@9S2;z+6#-U{?Yjx>?fY^yD_7Fn+#&Kp`pi;yI--4(^i_
zWU@GOi5~jrJ+OCvrZ5)UK?9d$VX9{$t`fb5^D+a5=OKcqHWe1exrxH7OYz=W6
zjVu=k(RLa)3M-AzuNK@z8eCb#>3WLR*pTwF-(^&Bqp%}>9J46F2
ziIY?Zk+@s}X+ghQQoq7^6_R=wonr#n%MEBkdGlsS;)an|DdAxxX+T5q%fV@W#g+R9uwE99p!M}%UInv25u03Tm
zZ^T0seH2DOQqg^&_lS55M2A*fLA$FdoD|1Nk9%2tQnxS*k~&|&7xH!aQ%R9jgt~nG
zq%j~In$6gMb0tU*k(Cy5(p}rJ1;P{j8}KVUFC$rpGIQ>j3T~MSB0I)XHcYd{B(Jms>qxNFJ*ZAw{78wc
z`DYKEA3QU7FFW_F>b&lZ?w)1o*>&gJ&a{oKpR`oQEtLsN!8FI_#E{fcM5>T5sJx+kz8lhLr$t0y7uOYE-b|j=kcRy<*b7GHzcPGg=d_
zN?;^=(&$W>^X`~Ex6Gb|$r4*y8uP4;mF8Meb
zIn2}NBriXM!Mot+sA0u#*fs(o3hL(KlnR#BD%xn^!+`#L^0G3MxIB7%G+OJy7%w7q
z%+rbJ3wH
z7USz=xH<=)jec1DI)kr~hT2yCeX2xpoeb5=$_unPLXNL)&{L1T%gmml5%R<8GJKP0
z>zetL3dPrCS6vgn5ItX4kMRikvA%8A{4-MC(17odV8e-}Uw~ea1EeA{8;|#(DN=kJ
zwXP{*)gRIJ3HS+YZrq74lF>#Rz90Rjv4F{gPSomP#qXd_vcbOH;`bmy$2Mwmk!V};
z7{o+NTHFdSe0F0Eqh+E)8*j7t6xrWet({8Q^#~#HE}3X8Hr}OXYbbuEm?FQo7V{A*
zQWQq5ZKrYmm$XfPPf11;#H&=$^@)DJZ?`*jb%>{;$t~5`a+!{(x)1E{h5tzsZx9JJ
zq+1nl6L))_@=Yq9BpvO4l~M;MHO+^+g;b=(ln=k6<0)rsrBXXZ2StRu)UgDsqi=WE
ZxD~rFHpu9|Ii2dCSvcAseXz40{{z6MGv)vQ

delta 1459
zcmZ{keM}o=9LMju>lJ#1wyYEig+SRxXrZN@4oL}Zd5t9UHW-*K5jWZ~HU{K5$jnmQ
zOw?$^jpet+jTa$Vwz276%$b<^l4y(?jmcms88(v4KNdB<jQKQfA7(`?~*L?2#
zd%NFrzkAYK?~~bgiRp4`s>HGN%P~h!X5Blc>qU|QZMGhqfzOLt;GoMcN-yg6NYLeS
z8jVaDBVrrpN`cp0zezflxD}JDVbr}H4wsmK6j$3wVoTTHJ}O7M_Vq`)XtaBnY3M1g
z?<`}w(2giE^n=O8qxK4GXGX+sWtO*C6szI;a5);GFeQdpUsnPa4d5SuhcGDGvn4mmCH(XELzgf7~+;fRY1e-ecKgx
zhnN9X{x)KOvwrV!F)ibMo^$f(bZk7fWY3;Vnl_J{XOrjc{aj$!Oc
zRpN5;?>cteaqPHRK3CZ^?`V!Yn&&K!_|03I?`33)SYZ+DsJz;-yQ-bM#cQt
z*Mv;Kw~uG*PqMc>RsbjTHWT$eJb4Ft`=Upbyq$!Q6mXUW^f)4V5(dkh`~wc4EO=Ze
zR*^-!LlrdP@~nz`hAm@(b3-%jb5>W};8sP9s@x`~~_8BfBq
z`P7Ngnl-$nd|L4;PiCPp*d$#-FJcNV237qyniDV)3Z+gkd4*p+E)(#5$WLxSR=7^m
zQV`eSV7QiyE7!t79P-aq&8y|_K~;5#d<-vCpCTVXT8&k@fKNpzinpdn5N|M?HHpF=t?Z_p(a<#)L`f3OSRR910

diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc
index 41e800e6ebb66140523891e65407293d7c40e42a..e1ec3d65a35b233b26c4374410139d7b7e4c1fdd 100644
GIT binary patch
delta 22
ccmbQfn`!!PChq0Dyj%=Gz^CrBk-KLu07$+C_g0U4IWI340}$}3`)uS+5(fZ0k_5v5

delta 20
acmaE>_g0U4IWI340}#BelHSOjBn|*Ws0G9T

diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc
index 375263b42924d0d54c6fee2b898c591625e00a3c..7525794ec2c36b9e6f1c1bc661c11e297e8a1a75 100644
GIT binary patch
delta 22
ccmbO_k7?>WChq0Dyj%=Gz^CrBk(;X@07CBt7XSbN

delta 22
ccmbO_k7?>WChq0Dyj%=G@U}{NBR5w+07?Z07ytkO

diff --git a/venv/Lib/site-packages/pip/_internal/req/constructors.py b/venv/Lib/site-packages/pip/_internal/req/constructors.py
index d73236e..56a964f 100644
--- a/venv/Lib/site-packages/pip/_internal/req/constructors.py
+++ b/venv/Lib/site-packages/pip/_internal/req/constructors.py
@@ -80,7 +80,7 @@ def _set_requirement_extras(req: Requirement, new_extras: Set[str]) -> Requireme
     assert (
         pre is not None and post is not None
     ), f"regex group selection for requirement {req} failed, this should never happen"
-    extras: str = "[%s]" % ",".join(sorted(new_extras)) if new_extras else ""
+    extras: str = "[{}]".format(",".join(sorted(new_extras)) if new_extras else "")
     return get_requirement(f"{pre}{extras}{post}")
 
 
diff --git a/venv/Lib/site-packages/pip/_internal/req/req_file.py b/venv/Lib/site-packages/pip/_internal/req/req_file.py
index 53ad867..eb2a1f6 100644
--- a/venv/Lib/site-packages/pip/_internal/req/req_file.py
+++ b/venv/Lib/site-packages/pip/_internal/req/req_file.py
@@ -329,10 +329,15 @@ def parse(
         self, filename: str, constraint: bool
     ) -> Generator[ParsedLine, None, None]:
         """Parse a given file, yielding parsed lines."""
-        yield from self._parse_and_recurse(filename, constraint)
+        yield from self._parse_and_recurse(
+            filename, constraint, [{os.path.abspath(filename): None}]
+        )
 
     def _parse_and_recurse(
-        self, filename: str, constraint: bool
+        self,
+        filename: str,
+        constraint: bool,
+        parsed_files_stack: List[Dict[str, Optional[str]]],
     ) -> Generator[ParsedLine, None, None]:
         for line in self._parse_file(filename, constraint):
             if not line.is_requirement and (
@@ -353,12 +358,30 @@ def _parse_and_recurse(
                 # original file and nested file are paths
                 elif not SCHEME_RE.search(req_path):
                     # do a join so relative paths work
-                    req_path = os.path.join(
-                        os.path.dirname(filename),
-                        req_path,
+                    # and then abspath so that we can identify recursive references
+                    req_path = os.path.abspath(
+                        os.path.join(
+                            os.path.dirname(filename),
+                            req_path,
+                        )
                     )
-
-                yield from self._parse_and_recurse(req_path, nested_constraint)
+                parsed_files = parsed_files_stack[0]
+                if req_path in parsed_files:
+                    initial_file = parsed_files[req_path]
+                    tail = (
+                        f" and again in {initial_file}"
+                        if initial_file is not None
+                        else ""
+                    )
+                    raise RequirementsFileParseError(
+                        f"{req_path} recursively references itself in {filename}{tail}"
+                    )
+                # Keeping a track where was each file first included in
+                new_parsed_files = parsed_files.copy()
+                new_parsed_files[req_path] = filename
+                yield from self._parse_and_recurse(
+                    req_path, nested_constraint, [new_parsed_files, *parsed_files_stack]
+                )
             else:
                 yield line
 
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc
index 6c7e3ae29d0d8eaf21ac27ba237a7a9273070be1..b9cd0ea2535005bf6b2f45824bef653b14da2882 100644
GIT binary patch
delta 19
ZcmX@ic$krUIWI340}$}3`%L8C0RSuG1T+8u

delta 19
ZcmX@ic$krUIWI340}#BelAg%D0{}7j1vLNw

diff --git a/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc
index e3ac238e7e7b121b565ec6e4c055802c7066298f..e1e09cb095b5bb7f9ce0bb602c2c6a95b6cc0f67 100644
GIT binary patch
delta 20
acmcb{b&ZRAIWI340}$}3`)uU)W(5E<*aRd1

delta 20
acmcb{b&ZRAIWI340}#BelHSPe%?bcI?gb?P

diff --git a/venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc
index 4cf5655ed3692526f3261b7279758f75f0e7b3cf..3eeaa84270803bc8d5bc9fdf8c3a594abc1025c2 100644
GIT binary patch
delta 19
ZcmX@bc#4sGIWI340}$}3`%L8C4*)FY1W5n@

delta 19
ZcmX@bc#4sGIWI340}#BelAg%D9{@7@1xf$_

diff --git a/venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc
index 61bcdce60d6b3c82c07394d44457b9a603cfffae..e40f66b3af18916c7e64c0fcfe67724833f3cd6a 100644
GIT binary patch
delta 22
ccmbQdi*fQUM(*Xjyj%=Gz^CrBk((nH07ixd6#xJL

delta 22
ccmbQdi*fQUM(*Xjyj%=G@U}{NBR5AZ08N|*761SM

diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc
index 26ba87614bea04ad5102506a0b57940f245ad2ed..29bb9fe13b029301ec9a5e98048162ab8eeffc82 100644
GIT binary patch
delta 19
ZcmX@dc#e^KIWI340}$}3`%L6M3;->91XTb4

delta 19
ZcmX@dc#e^KIWI340}#BelAg$Y7yvVm1y%q6

diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc
index 5a499166c29cc5ea9ecb6f442cb411cf06c42138..da7a9a376055f1ca794afc592b0c19a320fb21e9 100644
GIT binary patch
delta 20
acmbQ^KF6JVIWI340}$}3`)uT%s0;u!dIXLD

delta 20
acmbQ^KF6JVIWI340}#BelHSNYQ5gU`kOhwb

diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc
index e3cbcc73e61392d5b36ce763443445f12e5e7830..0549080b027b99610b9153058c8b744b9c6b704c 100644
GIT binary patch
delta 6962
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 H3pxA0zOKBM diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc index 0b09cf78b37c896d00307090d216a6689b82ca3a..914f996d50c2e875f1deb9eae1c3ed7ab95182e8 100644 GIT binary patch delta 5754 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

aheM!UKtqT2kqSk?&V)}yaw^) zsi?*T&v$+S7I?BN0xa=dcM4eHr#&|fJZ9gS0q?M6+hsL5&-lqK9;lv-gK#zO? delta 486 zcmZqQ#Q16>Bj0jfUM>b8cvmHz{x@_Z-y)v+6qXd$bf#sD3=FG*7y_c$Q`n+7QrJ^C zU@(;v$l^@l0z!@yu2jxc&NTiM?iR)-WJAXKm%68jA4l4P2mH| z@}=+tN&XZ8ASsX{mm&z%Czv7xLX3=4HZL%jXJnkS`G7?%6XT-Ia@L0!88>ZyXcNuIxNEbm-F-&J z1Dj;{=Pez8N)Vn2JT^GjM;oFsF{)JALC^2kPx8_ z9y{_c82eq+^uMC%e}P5q1KZ~9A%B^zd^i|2J}_V>JKR2kWxjyPkIW2A@>dw;J}`k* KCro}9AqfEC28jaz diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc index 60f121a8f6b71a1a987e7541e5004173c783bd52..3936e20ad7af368e2576189395ff98d326f3625c 100644 GIT binary patch delta 3116 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 w)OGX!|MAK3=jxwqUH||9 diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc index 6856a9f2d75343c8e0de776923cfd9b41066b767..e755f8d8529d785671e6eced0368fbfe689af476 100644 GIT binary patch delta 20 acmZ3WyFizFIWI340}$}5`)uT%Dh2>CYy?^W delta 20 acmZ3WyFizFIWI340}#BclHSNYRSW<)f(2Uu diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc index 0a335b50b1936ac9a129f018ed2d277e12f61e8d..48dca783da5cd50a5d187498edfa27cd4bf35cb9 100644 GIT binary patch delta 20 acmaDF^)!lmIWI340}$}5`)uTn(ggrPp9LBK delta 20 acmaDF^)!lmIWI340}#BclHSN2r3(N^wFVmi diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc index 1db7f206ad23619129485c99ff502654351d50ad..cb92a85929a2bd0e3834bc2aa04d6566860d5669 100644 GIT binary patch delta 20 acmX>eaXf;1IWI340}$}5`)uU4(E$KFrUbhH delta 20 acmX>eaXf;1IWI340}#BclHSN|qXPg#yal`f diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc index 8b02ced82d12f8cdb8caa819d448ac5e452b57c0..42b519739c1e9792a7efb0516eca3af40d0c9496 100644 GIT binary patch delta 22 ccmZ3{$+)7Ek$X8WFBbz4@T>c5=3.8 +Description-Content-Type: text/x-rst +License-File: COPYING.txt +Requires-Dist: setuptools>=42.0.0 +Requires-Dist: altgraph +Requires-Dist: pyinstaller-hooks-contrib>=2024.9 +Requires-Dist: packaging>=22.0 +Requires-Dist: importlib-metadata>=4.6; python_version < "3.10" +Requires-Dist: macholib>=1.8; sys_platform == "darwin" +Requires-Dist: pefile!=2024.8.26,>=2022.5.30; sys_platform == "win32" +Requires-Dist: pywin32-ctypes>=0.2.1; sys_platform == "win32" +Provides-Extra: completion +Requires-Dist: argcomplete; extra == "completion" +Provides-Extra: hook_testing +Requires-Dist: pytest>=2.7.3; extra == "hook-testing" +Requires-Dist: execnet>=1.5.0; extra == "hook-testing" +Requires-Dist: psutil; extra == "hook-testing" + +PyInstaller Overview +==================== + +.. image:: https://img.shields.io/pypi/v/pyinstaller + :alt: PyPI + :target: https://pypi.org/project/pyinstaller +.. image:: https://img.shields.io/pypi/pyversions/pyinstaller + :alt: PyPI - Python Version + :target: https://pypi.org/project/pyinstaller +.. image:: https://img.shields.io/readthedocs/pyinstaller/stable + :alt: Read the Docs (version) + :target: https://pyinstaller.org +.. image:: https://img.shields.io/pypi/dm/pyinstaller + :alt: PyPI - Downloads + :target: https://pypistats.org/packages/pyinstaller + + +PyInstaller bundles a Python application and all its dependencies into a single +package. The user can run the packaged app without installing a Python +interpreter or any modules. + +:Documentation: https://pyinstaller.org/ +:Code: https://github.com/pyinstaller/pyinstaller + +PyInstaller reads a Python script written by you. It analyzes your code +to discover every other module and library your script needs in order to +execute. Then it collects copies of all those files -- including the active +Python interpreter! -- and puts them with your script in a single folder, or +optionally in a single executable file. + + +PyInstaller is tested against Windows, macOS, and GNU/Linux. +However, it is not a cross-compiler: +to make a Windows app you run PyInstaller in Windows; to make +a GNU/Linux app you run it in GNU/Linux, etc. +PyInstaller has been used successfully +with AIX, Solaris, FreeBSD and OpenBSD, +but is not tested against them as part of the continuous integration tests. + + +Main Advantages +--------------- + +- Works out-of-the-box with any Python version 3.8-3.13. +- Fully multi-platform, and uses the OS support to load the dynamic libraries, + thus ensuring full compatibility. +- Correctly bundles the major Python packages such as numpy, PyQt5, + PySide2, PyQt6, PySide6, wxPython, matplotlib and others out-of-the-box. +- Compatible with many 3rd-party packages out-of-the-box. (All the required + tricks to make external packages work are already integrated.) +- Works with code signing on macOS. +- Bundles MS Visual C++ DLLs on Windows. + + +Installation +------------ + +PyInstaller is available on PyPI. You can install it through `pip`: + +.. code:: bash + + pip install pyinstaller + + +Requirements and Tested Platforms +--------------------------------- + +- Python: + - 3.8-3.13. Note that Python 3.10.0 contains a bug making it unsupportable by + PyInstaller. PyInstaller will also not work with beta releases of Python + 3.14. +- Windows (32bit/64bit/ARM64): + - PyInstaller should work on Windows 7 or newer, but we only officially support Windows 8+. + - Support for Python installed from the Windows store without using virtual + environments requires PyInstaller 4.4 or later. +- Linux: + - GNU libc based distributions on architectures ``x86_64``, ``aarch64``, + ``i686``, ``ppc64le``, ``s390x``. + - musl libc based distributions on architectures ``x86_64``, ``aarch64``. + - ldd: Console application to print the shared libraries required + by each program or shared library. This typically can be found in + the distribution-package `glibc` or `libc-bin`. + - objdump: Console application to display information from + object files. This typically can be found in the + distribution-package `binutils`. + - objcopy: Console application to copy and translate object files. + This typically can be found in the distribution-package `binutils`, + too. + - Raspberry Pi users on ``armv5``-``armv7`` should `add piwheels as an extra + index url `_ then ``pip install pyinstaller`` + as usual. +- macOS (``x86_64`` or ``arm64``): + - macOS 10.15 (Catalina) or newer. + - Supports building ``universal2`` applications provided that your installation + of Python and all your dependencies are also compiled ``universal2``. + + +Usage +----- + +Basic usage is very simple, just run it against your main script: + +.. code:: bash + + pyinstaller /path/to/yourscript.py + +For more details, see the `manual`_. + + +Untested Platforms +------------------ + +The following platforms have been contributed and any feedback or +enhancements on these are welcome. + +- FreeBSD + - ldd +- Solaris + - ldd + - objdump +- AIX + - AIX 6.1 or newer. PyInstaller will not work with statically + linked Python libraries. + - ldd +- Linux on any other libc implementation/architecture combination not listed + above. + +Before using any contributed platform, you need to build the PyInstaller +bootloader. This will happen automatically when you ``pip install +pyinstaller`` provided that you have an appropriate C compiler (typically +either ``gcc`` or ``clang``) and zlib's development headers already installed. + + +Support +------- + +- Official debugging guide: https://pyinstaller.org/en/v6.11.1/when-things-go-wrong.html +- Assorted user contributed help topics: https://github.com/pyinstaller/pyinstaller/wiki +- Web based Q&A forums: https://github.com/pyinstaller/pyinstaller/discussions +- Email based Q&A forums: https://groups.google.com/g/pyinstaller + + +Changes in this Release +----------------------- + +You can find a detailed list of changes in this release +in the `Changelog`_ section of the manual. + +.. _`manual`: https://pyinstaller.org/en/v6.11.1/ +.. _`Changelog`: https://pyinstaller.org/en/v6.11.1/CHANGES.html diff --git a/venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/RECORD b/venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/RECORD new file mode 100644 index 0000000..1663fc3 --- /dev/null +++ b/venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/RECORD @@ -0,0 +1,1084 @@ +../../Scripts/pyi-archive_viewer.exe,sha256=oDvoAOwCUJeOxypF8gkX8z5lomiRuEw-sFI_UlRzXL8,108426 +../../Scripts/pyi-bindepend.exe,sha256=cKIGsPJBWGdL8w-Ie3pRHyoAVWvz6GnOPEuVwJ20Cvc,108421 +../../Scripts/pyi-grab_version.exe,sha256=q8kSUnOqJm_JG8aHDPVDjTw2lx2mXKsr9YTYTOTUuP8,108424 +../../Scripts/pyi-makespec.exe,sha256=3Tf0HI2_hQmu_GeicesQrbYGxzstyXoYTWGEwF-UiuM,108420 +../../Scripts/pyi-set_version.exe,sha256=HDgBqqYF1vmzkNLg24Hc76wAUXIWrESPN0lO8ndxee0,108423 +../../Scripts/pyinstaller.exe,sha256=BJKWWZXt2PtqA_Xzo1fYQasd8YDEXA3R6CZGvi9xQ_w,108437 +PyInstaller/__init__.py,sha256=_UJQvP5QN8xLoghFxceNLTkSuqDcP8mGWJmGXb7IJIU,2012 +PyInstaller/__main__.py,sha256=R-Cs40eMwBX7HNmcON77T1D-_GDRbUE9KJSdINxDUVk,12622 +PyInstaller/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/__pycache__/__main__.cpython-311.pyc,, +PyInstaller/__pycache__/_recursion_too_deep_message.cpython-311.pyc,, +PyInstaller/__pycache__/_shared_with_waf.cpython-311.pyc,, +PyInstaller/__pycache__/compat.cpython-311.pyc,, +PyInstaller/__pycache__/config.cpython-311.pyc,, +PyInstaller/__pycache__/configure.cpython-311.pyc,, +PyInstaller/__pycache__/exceptions.cpython-311.pyc,, +PyInstaller/__pycache__/log.cpython-311.pyc,, +PyInstaller/_recursion_too_deep_message.py,sha256=Nq51eGfSfiU_CKYk7nAvz591LHiLsmY4KVEK5Lr-HUQ,1820 +PyInstaller/_shared_with_waf.py,sha256=5geAGNdLJU4sGTdqXXoPmOudxqE1H0qz5xiXLT4RqiY,3911 +PyInstaller/archive/__init__.py,sha256=fNGhsx0m5s9iq4yMvH6J1tI0vzUKWd62lIQNSnKTGCE,22 +PyInstaller/archive/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/archive/__pycache__/pyz_crypto.cpython-311.pyc,, +PyInstaller/archive/__pycache__/readers.cpython-311.pyc,, +PyInstaller/archive/__pycache__/writers.cpython-311.pyc,, +PyInstaller/archive/pyz_crypto.py,sha256=9SsKY26cVDwVxlwD-6LSC0Pw3rsIoOhV-A6Y6s9IPBI,747 +PyInstaller/archive/readers.py,sha256=cc8-Av88NhfgZjkgv5JM3DFNyTpNjQT0G7oqKS2Z7d0,7981 +PyInstaller/archive/writers.py,sha256=70Irw1wlqFptNhYVpjSI-NiF3sHxHp8D-P3HY5PrivQ,18482 +PyInstaller/bootloader/Windows-64bit-intel/run.exe,sha256=KERtUJun0U-c9roJINp92B-bBu4JGid-TpntzHLXf00,268800 +PyInstaller/bootloader/Windows-64bit-intel/run_d.exe,sha256=WF9J8rE5qXtH11uGzR5QCK4VEy3mHKqET7aUCYfLlhI,285184 +PyInstaller/bootloader/Windows-64bit-intel/runw.exe,sha256=YcXE4_oQt55hfNdHf2OEIKbHhW-ecTYUrCS-F7KlO_E,264704 +PyInstaller/bootloader/Windows-64bit-intel/runw_d.exe,sha256=9qdxjRbi2QxJi5XqhudMsG2zg-qU8iWsO0ESgf84gVY,280576 +PyInstaller/bootloader/images/icon-console.ico,sha256=aALW1IOexhlTRN7sYcLc9gIWH52Xsk9ic3kEaehHets,59521 +PyInstaller/bootloader/images/icon-windowed.ico,sha256=Fo2xuKfGL6KrksEhAYXRRZI_McG-I_3tQtlCD0i5g5I,60690 +PyInstaller/building/__init__.py,sha256=MsSFjiLMLJZ7QhUPpVBWKiyDnCzryquRyr329NoCACI,2 +PyInstaller/building/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/building/__pycache__/api.cpython-311.pyc,, +PyInstaller/building/__pycache__/build_main.cpython-311.pyc,, +PyInstaller/building/__pycache__/datastruct.cpython-311.pyc,, +PyInstaller/building/__pycache__/icon.cpython-311.pyc,, +PyInstaller/building/__pycache__/makespec.cpython-311.pyc,, +PyInstaller/building/__pycache__/osx.cpython-311.pyc,, +PyInstaller/building/__pycache__/splash.cpython-311.pyc,, +PyInstaller/building/__pycache__/splash_templates.cpython-311.pyc,, +PyInstaller/building/__pycache__/templates.cpython-311.pyc,, +PyInstaller/building/__pycache__/utils.cpython-311.pyc,, +PyInstaller/building/api.py,sha256=H0Ra3qiJz34Ut2VBdUZXBejklzpqRinFU0Tu2syAuVA,66821 +PyInstaller/building/build_main.py,sha256=E3cWXqzx5O2QxiFh_v7bL_g-ePfZ9inaSyQYhupbhGE,60347 +PyInstaller/building/datastruct.py,sha256=AGQQTL4cfQIApxl_vD5LRpl5nHpEcCN5El3u89jkRmU,17435 +PyInstaller/building/icon.py,sha256=BMyohNvNi-Zp1hbC0i9wExyxoa9QMP_7wfQqBOnauYg,4015 +PyInstaller/building/makespec.py,sha256=ebBQVs5aeNTbVbqGkCpdf4T3z1GfMMSyFfzGszODji8,35831 +PyInstaller/building/osx.py,sha256=16Ns1uwNfMAxMYpM_T_41X4lJzV_b1aryj68lwgAepg,41582 +PyInstaller/building/splash.py,sha256=O0IB8L1TBV2qYV6PVwwLWxm5zjCNzmz4Q07ciUnsj10,21256 +PyInstaller/building/splash_templates.py,sha256=VmtOwhx6B37ufbvbTC74uADLpWEFpev-qjnFNJlpdIE,7453 +PyInstaller/building/templates.py,sha256=T64VeVrybxnFVL-m4OmoVgmbmGsgBmz-GltBSLu-YWg,3146 +PyInstaller/building/utils.py,sha256=bkR08pYHLjH9XHVQHMpwDJ4b_mnyhqhkuk_alqHOkDI,36047 +PyInstaller/compat.py,sha256=nAohhzm_0gYmkzd7VgeJ4K49z-HBwRPZuZj4MDooDsw,31996 +PyInstaller/config.py,sha256=7GMtLgwDTZwcG2pwY6jUEtCQbLA7K_5hauTvbGdQ5Eo,1852 +PyInstaller/configure.py,sha256=cy15xry6JclyWqGfhTPtsCgJXfRA8Qp7CMGTgHZYeFA,4160 +PyInstaller/depend/__init__.py,sha256=MsSFjiLMLJZ7QhUPpVBWKiyDnCzryquRyr329NoCACI,2 +PyInstaller/depend/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/depend/__pycache__/analysis.cpython-311.pyc,, +PyInstaller/depend/__pycache__/bindepend.cpython-311.pyc,, +PyInstaller/depend/__pycache__/bytecode.cpython-311.pyc,, +PyInstaller/depend/__pycache__/dylib.cpython-311.pyc,, +PyInstaller/depend/__pycache__/imphook.cpython-311.pyc,, +PyInstaller/depend/__pycache__/imphookapi.cpython-311.pyc,, +PyInstaller/depend/__pycache__/utils.cpython-311.pyc,, +PyInstaller/depend/analysis.py,sha256=H7Yq-GO1_SB5GsfB_b1s8jcCX3aPKYfWcdSk4nd929g,50232 +PyInstaller/depend/bindepend.py,sha256=RNBSqVDnstKrSuVwKqYyBKvO_qPbBJzYE0E6UXpw0Z4,42827 +PyInstaller/depend/bytecode.py,sha256=PDKfJwaP6wQ0Ol6ERfGUOls2SeUFWpP46UlIsl19EyE,13702 +PyInstaller/depend/dylib.py,sha256=voLoU6LMK3WhsjaY7xMyEAqKaAdw8uY4kEnn9FPZTJA,12716 +PyInstaller/depend/imphook.py,sha256=LRcdRjQmQcTjBcq_zsuhg4T506f_j5jHawRMrIIEsdo,27568 +PyInstaller/depend/imphookapi.py,sha256=gDEoXiyUuo6AkDq8USwwwurY8fHNQhVcO0QQiiz6J9I,21234 +PyInstaller/depend/utils.py,sha256=qeHsmfLdlRQmKOpM3hchlezeYChHa2iq4CEdmplQD7A,16939 +PyInstaller/exceptions.py,sha256=8GDeuIYYbmZdaxDE356uG6v5EEnxyA7Fihuja_7t4g4,3001 +PyInstaller/fake-modules/__pycache__/pyi_splash.cpython-311.pyc,, +PyInstaller/fake-modules/_pyi_rth_utils/__init__.py,sha256=eB5Dwu9lqSMqbLtIXpkYUaU7dEiymGkij-MOIDO9ZdI,1710 +PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/_win32.cpython-311.pyc,, +PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/qt.cpython-311.pyc,, +PyInstaller/fake-modules/_pyi_rth_utils/__pycache__/tempfile.cpython-311.pyc,, +PyInstaller/fake-modules/_pyi_rth_utils/_win32.py,sha256=8DO_CZTynydjJJmIHCgvvjBpjc46MN5bg0dOkQsIX1M,11564 +PyInstaller/fake-modules/_pyi_rth_utils/qt.py,sha256=24b7dxj7GQQiXeFuYm74TQBDUCGnEdREuQhyvEKAepM,4204 +PyInstaller/fake-modules/_pyi_rth_utils/tempfile.py,sha256=xU--svg9lzC2Aj6dTrQMCh2Zek4-eN1sLrRjKpoEct0,2262 +PyInstaller/fake-modules/pyi_splash.py,sha256=uHOBvS9elRsxhCypWsG_KxB0NmQu6U1gxMLNMa-4_A8,7703 +PyInstaller/hooks/__init__.py,sha256=MsSFjiLMLJZ7QhUPpVBWKiyDnCzryquRyr329NoCACI,2 +PyInstaller/hooks/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PIL.Image.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PIL.ImageFilter.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PIL.SpiderImagePlugin.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PIL.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QAxContainer.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.Qsci.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.Qt.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DAnimation.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DCore.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DExtras.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DInput.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DLogic.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.Qt3DRender.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtBluetooth.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtChart.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtCore.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtDBus.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtDataVisualization.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtDesigner.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtGui.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtHelp.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtLocation.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtMacExtras.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtMultimedia.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtMultimediaWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtNetwork.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtNetworkAuth.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtNfc.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtOpenGL.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtPositioning.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtPrintSupport.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtPurchasing.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtQml.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuick.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuick3D.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtQuickWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtRemoteObjects.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtScript.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtSensors.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtSerialPort.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtSql.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtSvg.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtTest.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtTextToSpeech.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebChannel.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngine.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngineCore.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebEngineWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebKit.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebKitWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtWebSockets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtWinExtras.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtX11Extras.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtXml.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.QtXmlPatterns.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt5.uic.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QAxContainer.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.Qsci.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DAnimation.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DCore.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DExtras.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DInput.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DLogic.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.Qt3DRender.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtBluetooth.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtCharts.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtCore.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtDBus.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtDataVisualization.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtDesigner.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtGui.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtHelp.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtMultimedia.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtMultimediaWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtNetwork.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtNetworkAuth.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtNfc.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtOpenGL.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtOpenGLWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtPdf.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtPdfWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtPositioning.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtPrintSupport.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtQml.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuick.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuick3D.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtQuickWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtRemoteObjects.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtSensors.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtSerialPort.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtSpatialAudio.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtSql.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtSvg.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtSvgWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtTest.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtTextToSpeech.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebChannel.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineCore.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineQuick.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebEngineWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtWebSockets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.QtXml.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PyQt6.uic.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DAnimation.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DCore.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DExtras.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DInput.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DLogic.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.Qt3DRender.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtAxContainer.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtCharts.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtConcurrent.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtCore.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtDataVisualization.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtGui.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtHelp.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtLocation.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtMacExtras.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtMultimedia.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtMultimediaWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtNetwork.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtOpenGL.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtOpenGLFunctions.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtPositioning.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtPrintSupport.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtQml.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtQuick.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtQuickControls2.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtQuickWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtRemoteObjects.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtScript.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtScriptTools.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtScxml.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtSensors.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtSerialPort.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtSql.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtSvg.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtTest.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtTextToSpeech.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtUiTools.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtWebChannel.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngine.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngineCore.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtWebEngineWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtWebKit.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtWebKitWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtWebSockets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtWinExtras.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtX11Extras.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtXml.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.QtXmlPatterns.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.Qwt5.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide2.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DAnimation.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DCore.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DExtras.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DInput.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DLogic.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.Qt3DRender.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtAxContainer.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtBluetooth.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtCharts.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtConcurrent.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtCore.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtDBus.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtDataVisualization.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtDesigner.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtGraphs.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtGraphsWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtGui.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtHelp.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtHttpServer.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtLocation.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtMultimedia.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtMultimediaWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtNetwork.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtNetworkAuth.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtNfc.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtOpenGL.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtOpenGLWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtPdf.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtPdfWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtPositioning.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtPrintSupport.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtQml.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtQuick.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtQuick3D.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtQuickControls2.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtQuickWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtRemoteObjects.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtScxml.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtSensors.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtSerialBus.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtSerialPort.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtSpatialAudio.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtSql.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtStateMachine.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtSvg.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtSvgWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtTest.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtTextToSpeech.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtUiTools.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtWebChannel.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineCore.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineQuick.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtWebEngineWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtWebSockets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtWidgets.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.QtXml.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-PySide6.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-_pyi_rth_utils.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-_tkinter.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-babel.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-difflib.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-distutils.command.check.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-distutils.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-distutils.util.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-django.contrib.sessions.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-django.core.cache.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-django.core.mail.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-django.core.management.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-django.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-django.db.backends.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-django.db.backends.mysql.base.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-django.db.backends.oracle.base.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-django.template.loaders.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-encodings.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gevent.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.Adw.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.AppIndicator3.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.Atk.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.AyatanaAppIndicator3.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.Champlain.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.Clutter.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.DBus.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GIRepository.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GLib.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GModule.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GObject.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.Gdk.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GdkPixbuf.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.Gio.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.Graphene.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.Gsk.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.Gst.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstAllocators.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstApp.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstAudio.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstBadAudio.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstBase.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstCheck.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstCodecs.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstController.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstGL.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLEGL.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLWayland.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstGLX11.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstInsertBin.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstMpegts.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstNet.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstPbutils.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstPlay.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstPlayer.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtp.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtsp.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstRtspServer.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstSdp.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstTag.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstTranscoder.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstVideo.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkan.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkanWayland.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstVulkanXCB.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GstWebRTC.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.Gtk.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GtkChamplain.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GtkClutter.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GtkSource.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.GtkosxApplication.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.HarfBuzz.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.Pango.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.PangoCairo.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.cairo.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.freetype2.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-gi.repository.xlib.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-heapq.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-idlelib.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-importlib_metadata.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-importlib_resources.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-keyring.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-kivy.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-lib2to3.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-matplotlib.backend_bases.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-matplotlib.backends.backend_qtagg.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-matplotlib.backends.backend_qtcairo.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-matplotlib.backends.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-matplotlib.backends.qt_compat.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-matplotlib.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-matplotlib.numerix.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-matplotlib.pyplot.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-multiprocessing.util.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-numpy.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-packaging.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-pandas.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-pandas.io.clipboard.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-pandas.io.formats.style.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-pandas.plotting.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-pickle.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-pkg_resources.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-platform.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-pygments.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-pytz.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-pytzdata.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-qtawesome.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-qtpy.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-scapy.layers.all.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-scipy.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-scipy.io.matlab.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-scipy.linalg.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-scipy.sparse.csgraph.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-scipy.spatial.transform.rotation.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-scipy.special._ellip_harm_2.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-scipy.special._ufuncs.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-scipy.stats._stats.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-scrapy.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-setuptools._vendor.importlib_metadata.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-setuptools._vendor.jaraco.text.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-setuptools.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-shelve.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-shiboken6.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-sphinx.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-sqlalchemy.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-sqlite3.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-sysconfig.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-wcwidth.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-win32ctypes.core.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-xml.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-xml.dom.domreg.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-xml.etree.cElementTree.cpython-311.pyc,, +PyInstaller/hooks/__pycache__/hook-zope.interface.cpython-311.pyc,, +PyInstaller/hooks/hook-PIL.Image.py,sha256=xVqeatL2Pyud1OfdEd_NsBYoWKgJxYndA5zAJUq65Qs,845 +PyInstaller/hooks/hook-PIL.ImageFilter.py,sha256=SzNTo7kh7tRKKovVkCTWvGg6MHzGBTacbqPI-e55gkk,589 +PyInstaller/hooks/hook-PIL.SpiderImagePlugin.py,sha256=RfNA7s9x1Ti__UNR1aFGJbIAilfhyX99q1hDJ7eWwng,773 +PyInstaller/hooks/hook-PIL.py,sha256=iDHOmiCbD_JVYkhIfyILP8RqfhH16iRONpADqoa-q44,1100 +PyInstaller/hooks/hook-PyQt5.QAxContainer.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.Qsci.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.Qt.py,sha256=j0So5QvbWd1q2UpwmxWQSGco770fUEOSnu0kyKAVTvA,1274 +PyInstaller/hooks/hook-PyQt5.Qt3DAnimation.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.Qt3DCore.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.Qt3DExtras.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.Qt3DInput.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.Qt3DLogic.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.Qt3DRender.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtBluetooth.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtChart.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtCore.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtDBus.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtDataVisualization.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtDesigner.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtGui.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtHelp.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtLocation.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtMacExtras.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtMultimedia.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtMultimediaWidgets.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtNetwork.py,sha256=ulfru1n_aKP8t70lPw9mmA1JOUCUVKRuE2udksUzQHQ,710 +PyInstaller/hooks/hook-PyQt5.QtNetworkAuth.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtNfc.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtOpenGL.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtPositioning.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtPrintSupport.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtPurchasing.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtQml.py,sha256=9iBtfG0pUGnSHFAyzJdUaOX6tftELh1iEYE-BF1f3U8,764 +PyInstaller/hooks/hook-PyQt5.QtQuick.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtQuick3D.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtQuickWidgets.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtRemoteObjects.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtScript.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtSensors.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtSerialPort.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtSql.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtSvg.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtTest.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtTextToSpeech.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtWebChannel.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtWebEngine.py,sha256=8v1T1hQOX9jSD3y6rEiwdEOytqqNB7FxGejXbVkDlMU,633 +PyInstaller/hooks/hook-PyQt5.QtWebEngineCore.py,sha256=aZzbd6E_89Ype_7HqLt987AKQsZ81NWsZJhHz9sxBqA,995 +PyInstaller/hooks/hook-PyQt5.QtWebEngineWidgets.py,sha256=8v1T1hQOX9jSD3y6rEiwdEOytqqNB7FxGejXbVkDlMU,633 +PyInstaller/hooks/hook-PyQt5.QtWebKit.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtWebKitWidgets.py,sha256=8v1T1hQOX9jSD3y6rEiwdEOytqqNB7FxGejXbVkDlMU,633 +PyInstaller/hooks/hook-PyQt5.QtWebSockets.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtWidgets.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtWinExtras.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtX11Extras.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtXml.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.QtXmlPatterns.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PyQt5.py,sha256=EJVCGUfy59jwZgAPgRCfKDMU8xA2nTw-jV_881EoTrU,1182 +PyInstaller/hooks/hook-PyQt5.uic.py,sha256=84RPP_83POC6omCwnWObq5ll63SxVoSvwfhX3j_exD4,979 +PyInstaller/hooks/hook-PyQt6.QAxContainer.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.Qsci.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.Qt3DAnimation.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.Qt3DCore.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.Qt3DExtras.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.Qt3DInput.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.Qt3DLogic.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.Qt3DRender.py,sha256=oVmMojFOwYquJN_iyTDESJ0nhs4ehshmtt46ud2cu0k,670 +PyInstaller/hooks/hook-PyQt6.QtBluetooth.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtCharts.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtCore.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PyQt6.QtDBus.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtDataVisualization.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtDesigner.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtGui.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PyQt6.QtHelp.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PyQt6.QtMultimedia.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtMultimediaWidgets.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtNetwork.py,sha256=dgck_Mmop4kEanguw_yXaedNRxzOOuu7bEtZyVYYh-U,710 +PyInstaller/hooks/hook-PyQt6.QtNetworkAuth.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtNfc.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtOpenGL.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PyQt6.QtOpenGLWidgets.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PyQt6.QtPdf.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtPdfWidgets.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtPositioning.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtPrintSupport.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PyQt6.QtQml.py,sha256=PLw5WhHb8V0WXXFY69RZLMWIZXwB_lr3mut0AyWmCIw,764 +PyInstaller/hooks/hook-PyQt6.QtQuick.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PyQt6.QtQuick3D.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtQuickWidgets.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PyQt6.QtRemoteObjects.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtSensors.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtSerialPort.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtSpatialAudio.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtSql.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PyQt6.QtSvg.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PyQt6.QtSvgWidgets.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtTest.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PyQt6.QtTextToSpeech.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtWebChannel.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtWebEngineCore.py,sha256=X9bCUdal9-_Ymhj-Ue3TgWFMyzs2Q4Rdu7D9qqLsipQ,1351 +PyInstaller/hooks/hook-PyQt6.QtWebEngineQuick.py,sha256=cq1LjMw4S_JrC47Ihz1kh7td06JQ1FO_a94J0dJFG94,633 +PyInstaller/hooks/hook-PyQt6.QtWebEngineWidgets.py,sha256=cq1LjMw4S_JrC47Ihz1kh7td06JQ1FO_a94J0dJFG94,633 +PyInstaller/hooks/hook-PyQt6.QtWebSockets.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PyQt6.QtWidgets.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PyQt6.QtXml.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PyQt6.py,sha256=9M5liqiED7hrlqRFSJzWn2fgiUjS0-ljCri_lr9PyG0,1025 +PyInstaller/hooks/hook-PyQt6.uic.py,sha256=aqbbDAUty1kOTEHQDKak-N1Yk78pQIXt1LtgLiOw3Sg,979 +PyInstaller/hooks/hook-PySide2.Qt3DAnimation.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.Qt3DCore.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.Qt3DExtras.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.Qt3DInput.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.Qt3DLogic.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.Qt3DRender.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtAxContainer.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtCharts.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtConcurrent.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtCore.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtDataVisualization.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtGui.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtHelp.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtLocation.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtMacExtras.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtMultimedia.py,sha256=DyIsljc-dNhSMZsjyFtouaLp8ZLdhUWQaMeaQQ8cQjY,979 +PyInstaller/hooks/hook-PySide2.QtMultimediaWidgets.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtNetwork.py,sha256=52vtimdyB73bgVxazsQ-VfNnEAj_VDjl9eX0Uk6OVxs,714 +PyInstaller/hooks/hook-PySide2.QtOpenGL.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtOpenGLFunctions.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtPositioning.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtPrintSupport.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtQml.py,sha256=5W2Zr3rpyso-91Hjc28tfRkEYOdulhdwQnOX3uMBBzQ,804 +PyInstaller/hooks/hook-PySide2.QtQuick.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtQuickControls2.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtQuickWidgets.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtRemoteObjects.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtScript.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtScriptTools.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtScxml.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtSensors.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtSerialPort.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtSql.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtSvg.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtTest.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtTextToSpeech.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtUiTools.py,sha256=vK9DFnB41R-Falc9v-vpXr_MvCo719gJfAaYGn_pbAo,710 +PyInstaller/hooks/hook-PySide2.QtWebChannel.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtWebEngine.py,sha256=8v1T1hQOX9jSD3y6rEiwdEOytqqNB7FxGejXbVkDlMU,633 +PyInstaller/hooks/hook-PySide2.QtWebEngineCore.py,sha256=95kMNBhui4wfAOqu0R5P0atuk28qNx76CiglODAnJwQ,1003 +PyInstaller/hooks/hook-PySide2.QtWebEngineWidgets.py,sha256=8v1T1hQOX9jSD3y6rEiwdEOytqqNB7FxGejXbVkDlMU,633 +PyInstaller/hooks/hook-PySide2.QtWebKit.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtWebKitWidgets.py,sha256=8v1T1hQOX9jSD3y6rEiwdEOytqqNB7FxGejXbVkDlMU,633 +PyInstaller/hooks/hook-PySide2.QtWebSockets.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtWidgets.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtWinExtras.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtX11Extras.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtXml.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.QtXmlPatterns.py,sha256=UochHJ51ckZ_syXJyeLM264STUXRCB_RUsv3oCd6g98,633 +PyInstaller/hooks/hook-PySide2.Qwt5.py,sha256=iPZ4IL_gOs0h5pYTjvYHnJCdVCB-sDvpHFpoX-VOh_k,972 +PyInstaller/hooks/hook-PySide2.py,sha256=6vzXvVtUQYJiifknYcvJJdV1ojWoAQJxonYBddpPoiQ,1141 +PyInstaller/hooks/hook-PySide6.Qt3DAnimation.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.Qt3DCore.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.Qt3DExtras.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.Qt3DInput.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.Qt3DLogic.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.Qt3DRender.py,sha256=45jlg3Va-bAusaRaZA3JWfJGg4XgfS_exNnbvCVBPw0,1122 +PyInstaller/hooks/hook-PySide6.QtAxContainer.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtBluetooth.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtCharts.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtConcurrent.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtCore.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PySide6.QtDBus.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtDataVisualization.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtDesigner.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtGraphs.py,sha256=rgWc6i9j5HrbRyVDZjptPrNu24NT-Uc0_bJAj8Z8v9o,628 +PyInstaller/hooks/hook-PySide6.QtGraphsWidgets.py,sha256=w9ICAH2zNa2KniPB7NunLK3MpI1ECJmzkpEaOq2j64Q,764 +PyInstaller/hooks/hook-PySide6.QtGui.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PySide6.QtHelp.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PySide6.QtHttpServer.py,sha256=pnm0JlKbPaJvU4C2CBTZf5YOFdLv0JzstefyQTmc3M8,837 +PyInstaller/hooks/hook-PySide6.QtLocation.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtMultimedia.py,sha256=apdddXdKLkbCSREJo8W9zHP_iZh-wiFGZeezSMYKw2c,981 +PyInstaller/hooks/hook-PySide6.QtMultimediaWidgets.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtNetwork.py,sha256=o1tB7jEyZGCUQzEv-uypg8ghl3iMaEUJR9uppFjlSAk,714 +PyInstaller/hooks/hook-PySide6.QtNetworkAuth.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtNfc.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtOpenGL.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PySide6.QtOpenGLWidgets.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PySide6.QtPdf.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtPdfWidgets.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtPositioning.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtPrintSupport.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PySide6.QtQml.py,sha256=kPZge8513WUfKoV4yr49zND7K-m5oug7gHAZVJt3sDc,768 +PyInstaller/hooks/hook-PySide6.QtQuick.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PySide6.QtQuick3D.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtQuickControls2.py,sha256=rlKwMNNYovkBDloHUZjpQFS6bungJ8ZRjiHaHpPeWhs,671 +PyInstaller/hooks/hook-PySide6.QtQuickWidgets.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PySide6.QtRemoteObjects.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtScxml.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtSensors.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtSerialBus.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtSerialPort.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtSpatialAudio.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtSql.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PySide6.QtStateMachine.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtSvg.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PySide6.QtSvgWidgets.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtTest.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PySide6.QtTextToSpeech.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtUiTools.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PySide6.QtWebChannel.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtWebEngineCore.py,sha256=gVHkCC20EZTbqlSl2AM76jpz7xBcKY0VYDbobWjD5V0,1410 +PyInstaller/hooks/hook-PySide6.QtWebEngineQuick.py,sha256=cq1LjMw4S_JrC47Ihz1kh7td06JQ1FO_a94J0dJFG94,633 +PyInstaller/hooks/hook-PySide6.QtWebEngineWidgets.py,sha256=cq1LjMw4S_JrC47Ihz1kh7td06JQ1FO_a94J0dJFG94,633 +PyInstaller/hooks/hook-PySide6.QtWebSockets.py,sha256=xyYQlN8teZE9iQ9eCbUVKEKG7Q7fKhShb4skrs0llHY,633 +PyInstaller/hooks/hook-PySide6.QtWidgets.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PySide6.QtXml.py,sha256=2F9qD4YqIZq6DMKRegn7DHvS6Eq3IWkBa5SRie11N-o,633 +PyInstaller/hooks/hook-PySide6.py,sha256=_vu5Cx2tP-xeizvYi7oZS2g62KmK8tCfAyvs1Ga7dQY,1279 +PyInstaller/hooks/hook-_pyi_rth_utils.py,sha256=HvliUIYSZQFmhLz9ABAzwK-iNurl6oY_eM9mgJRIcHQ,680 +PyInstaller/hooks/hook-_tkinter.py,sha256=2Sz18FAMHPdfdG1cLIyXTqyoXf5y7UcNDA8CIZLApdU,1191 +PyInstaller/hooks/hook-babel.py,sha256=2W8yoXGOs2c7gmoI71VzKsiVwIrNfOywB3NPK46wweI,924 +PyInstaller/hooks/hook-difflib.py,sha256=whXBs38P70PWAv5IW-L6B3phR_D3gkzzT6jap7PqBCE,577 +PyInstaller/hooks/hook-distutils.command.check.py,sha256=so8h5fLMRsiJrEVWNaAPAekziYQY744kpA2J8BFDioQ,606 +PyInstaller/hooks/hook-distutils.py,sha256=JHrLMrbVMTCwqV83Z84eOaXNYruODZrz-aan1x-2R4c,1893 +PyInstaller/hooks/hook-distutils.util.py,sha256=ogjFFsduAfi4QXp2K-qMovorSZM0Wk-ON9lsIKpn1d0,661 +PyInstaller/hooks/hook-django.contrib.sessions.py,sha256=1bXvBmfdjldiywMQPSkl5e94NShMoUmtTLoW5yN4k3M,635 +PyInstaller/hooks/hook-django.core.cache.py,sha256=yiRj8bhzRhB4rkQWiFe4RAtSuJsRakzfMNg8mtknjzo,629 +PyInstaller/hooks/hook-django.core.mail.py,sha256=Fhwo_CjxNQ8jh9_cu0Z5d0QlX5-8LRO4LusKc3sskwc,1069 +PyInstaller/hooks/hook-django.core.management.py,sha256=g8NXb7a-cgfo0IRIZuravW1YcSxDvLASr1p3trefhQM,942 +PyInstaller/hooks/hook-django.db.backends.mysql.base.py,sha256=XDf5vHB7eUZnQzP_xc68F1w2avWO1vKzAxykpSACHss,611 +PyInstaller/hooks/hook-django.db.backends.oracle.base.py,sha256=NtUXz6s4xJyxJgVXsatrMO3X42RxnVq5-v1JAMVU29k,563 +PyInstaller/hooks/hook-django.db.backends.py,sha256=NTWkllG7dc-TR-6rCkcNvlEfwlmGi8vhVbXxQuOKa8o,983 +PyInstaller/hooks/hook-django.py,sha256=5chCU9FUO1Th8-GcVhQgO4VpovCg9ysU3LWSf3yXWAE,3922 +PyInstaller/hooks/hook-django.template.loaders.py,sha256=rcU0WR52DFFxt91MWHscKaDxhvja94d7Ggejtw_5aH0,626 +PyInstaller/hooks/hook-encodings.py,sha256=zTyqMMiW7ghKxyygcOl6MJfmQwt5EdyD1JJnzB7Ol34,612 +PyInstaller/hooks/hook-gevent.py,sha256=_EFWvRtFto7AN-mx-cBcn6L9u-rtZtLeLbwx7Lv6meM,1011 +PyInstaller/hooks/hook-gi.py,sha256=xvJ12MAltpj-r9GzPKLsN4zIQ7Ax9g1cc3Ss7b3UWGA,552 +PyInstaller/hooks/hook-gi.repository.Adw.py,sha256=NwRYqmZESkyKkpCOJbNq8BVu_h5Y7Qw7_bBSsAWe6As,698 +PyInstaller/hooks/hook-gi.repository.AppIndicator3.py,sha256=Bwid2vErvCkB1kkjYc6QJnnv3_Jqf3VvC1fn2vkz6AY,710 +PyInstaller/hooks/hook-gi.repository.Atk.py,sha256=di-iBdmgg6BNhdXgUi0NSTIilzAF7dAx213vlZXzaIo,1084 +PyInstaller/hooks/hook-gi.repository.AyatanaAppIndicator3.py,sha256=9BTVgthn0s8CLk52V-bB4GRmfxlR7N45CGvAbcG4WNM,717 +PyInstaller/hooks/hook-gi.repository.Champlain.py,sha256=b-WMOJ5wo9IJxTA8VEtRA0DkoLGIKGpZRROt97K6sdA,707 +PyInstaller/hooks/hook-gi.repository.Clutter.py,sha256=VR3XwfcdcerLYuG6C_8jH9DbX9Ka2reBBZ_aFkC8__o,704 +PyInstaller/hooks/hook-gi.repository.DBus.py,sha256=pv9g8ObQCghzaLzGYrf5oYoA0fAhVMGktw1v2d4Okkw,701 +PyInstaller/hooks/hook-gi.repository.GIRepository.py,sha256=pADSM-De6Pa6jl45ZBKeP9ObE2At2vWpKUe-8Q3PUbs,709 +PyInstaller/hooks/hook-gi.repository.GLib.py,sha256=6Lhx56wjr3wl5oeSx134eVVWK2WudF13kPOqzKyfvm4,1490 +PyInstaller/hooks/hook-gi.repository.GModule.py,sha256=fpyExmwwNceUthEUZpS9EuaanoKqc8NAsGFuZgov_mM,704 +PyInstaller/hooks/hook-gi.repository.GObject.py,sha256=KkT6C-YbGIoPMkPfCLXprAWdSB2_Cn6f52-pdQ9c_9s,905 +PyInstaller/hooks/hook-gi.repository.Gdk.py,sha256=gGUVXbJ9sKf8WPjrxjPTlW0QEriKy6gvKre3GTP4NbA,1393 +PyInstaller/hooks/hook-gi.repository.GdkPixbuf.py,sha256=N6cB1VyD6EKmYo4xjqcuveugFwTxiq-bp2OXwwGRtdw,6318 +PyInstaller/hooks/hook-gi.repository.Gio.py,sha256=9vMXEAMaiZG0CoHXZXtMHAiXJjVAp1u_b6CPcVWKlew,2605 +PyInstaller/hooks/hook-gi.repository.Graphene.py,sha256=kPN5lzSJZ1yH-wQ0s00vL_zHMckNH7SS1w7dz4-5Dhc,705 +PyInstaller/hooks/hook-gi.repository.Gsk.py,sha256=UK0rvXX0CsHNyJ3SLs29aOnN92KFoSKtSXU08exYzjM,700 +PyInstaller/hooks/hook-gi.repository.Gst.py,sha256=1yevQzFiRUAjzTkwiZOgsQiu6rrUYB_Hg3KpviSfT7c,3461 +PyInstaller/hooks/hook-gi.repository.GstAllocators.py,sha256=ryA-HqngziZjrL3OBCF6zOvqT4INKhejrRi8JNNIB3s,710 +PyInstaller/hooks/hook-gi.repository.GstApp.py,sha256=eyqjhws-xrCrfFFDhqHjp8RV-GLiI5Qop3FSx84aoJA,703 +PyInstaller/hooks/hook-gi.repository.GstAudio.py,sha256=kJnvOIlWDflbCMFNatGsN7Ql1Xvo9ffmdRlzHFnKKT8,705 +PyInstaller/hooks/hook-gi.repository.GstBadAudio.py,sha256=tCt0HhYm9M98SiBREXCrKh__d5KuT0FZFr1QlZhq7BM,708 +PyInstaller/hooks/hook-gi.repository.GstBase.py,sha256=JaETtokmwH78qQfpjesqKTfBEk-1g1ktvMaIpXzFTEU,704 +PyInstaller/hooks/hook-gi.repository.GstCheck.py,sha256=2vgJstFwiiKyARmpag0wfBcU3pevgm8Zo4dySyEzRyg,705 +PyInstaller/hooks/hook-gi.repository.GstCodecs.py,sha256=_IktlFHwuRd7dWNTY7I-WkddtSPTnarXFTOlQXiVt18,706 +PyInstaller/hooks/hook-gi.repository.GstController.py,sha256=IOq8HWRh_VPdY7NT4OV0-pmFAAYYcKBwZ0QA0WIBanY,710 +PyInstaller/hooks/hook-gi.repository.GstGL.py,sha256=L6bSj5NSIu6XMPpC7tjGukuKJtbXVkQsf8zRM_g5EZY,702 +PyInstaller/hooks/hook-gi.repository.GstGLEGL.py,sha256=FrSoWPNESToC36pZGVpVIiiJ3ox798AqZRGUwMiAzSM,705 +PyInstaller/hooks/hook-gi.repository.GstGLWayland.py,sha256=LTQqLLY99wUKQqlbG3eQ_5SRo4g_enehVKUshE3wB8o,709 +PyInstaller/hooks/hook-gi.repository.GstGLX11.py,sha256=CW8_aDTy1eg5-h0scvoDrwf1_WmfSyubG4-LOS-yhlE,705 +PyInstaller/hooks/hook-gi.repository.GstInsertBin.py,sha256=9YyLJmMHQl7i-q1oTZckGC23_YTDbVpTI58fhw9C6A0,709 +PyInstaller/hooks/hook-gi.repository.GstMpegts.py,sha256=1H4EnbwZW70trU8ivRv2EowUZvebs1B5sO27bKX7Lvo,706 +PyInstaller/hooks/hook-gi.repository.GstNet.py,sha256=anwfzAqBlaGh_Kmy25z2-YynVJo4cgKKgsLzvqUtrvU,703 +PyInstaller/hooks/hook-gi.repository.GstPbutils.py,sha256=eIaEhzlsyawjzjiiqNGFwIiflfDWZ1GO1GnY72gIolk,707 +PyInstaller/hooks/hook-gi.repository.GstPlay.py,sha256=kih5CSzeBI2Zgg7DIz-9ZQbs0MKjqbjBKtLE0bE8vzY,704 +PyInstaller/hooks/hook-gi.repository.GstPlayer.py,sha256=4-8kI3EHUf610zfcA6ovaU_1YiMybz8m1jX-N_9dbRM,706 +PyInstaller/hooks/hook-gi.repository.GstRtp.py,sha256=MT5yvnKq1FBaEFIWy0yGZAQKC8Z20tuQUSB_koDwPIw,703 +PyInstaller/hooks/hook-gi.repository.GstRtsp.py,sha256=h7pOjxw1sFEpe33M3r_-24YczqfI1sQg0Y2ZBQ6nlFE,704 +PyInstaller/hooks/hook-gi.repository.GstRtspServer.py,sha256=lAIHSUOIrC7XQ4ZG5AbR2J-OiukSFK2TiBWBLaq7gZo,710 +PyInstaller/hooks/hook-gi.repository.GstSdp.py,sha256=ywxH8YxjksNuhpdeWrGIkSuMBF8xBau-YkYXqFIl9DM,703 +PyInstaller/hooks/hook-gi.repository.GstTag.py,sha256=bu9I6OoSUEVNbkrUOUFHKe0e057INqeMCeyB5AHH0dM,703 +PyInstaller/hooks/hook-gi.repository.GstTranscoder.py,sha256=m6YtxnRBG1wWalzZgtTKOIv8fKvzwiHjepbckfli7vc,710 +PyInstaller/hooks/hook-gi.repository.GstVideo.py,sha256=6wDSl-9fg_C3qorsgiCnHrqR46Y0tA4NnWEQnAX0tug,705 +PyInstaller/hooks/hook-gi.repository.GstVulkan.py,sha256=wQXXd9_Wp03xsu_Y8ml3bGBDj1JjB1NxqYSqZ6XJFUk,706 +PyInstaller/hooks/hook-gi.repository.GstVulkanWayland.py,sha256=0t7TQcr5pJ058whWXN-pVJhYvbmA0bPMkjshDyRWY7Y,713 +PyInstaller/hooks/hook-gi.repository.GstVulkanXCB.py,sha256=CVKjOp2xJ6Iq3MxbtV9nQJTV0TQXvsumojRzI5NkkFM,709 +PyInstaller/hooks/hook-gi.repository.GstWebRTC.py,sha256=9W6manw1GmQKnWA-Cq6rbykbAAoEQB359XBMwRmQWv8,706 +PyInstaller/hooks/hook-gi.repository.Gtk.py,sha256=8kAtofOZcoiBjTgf0S2mBxv5thpFU3JFEeQ5YG8TiTo,2150 +PyInstaller/hooks/hook-gi.repository.GtkChamplain.py,sha256=mk1keoUxkuD8FHfIFW8i9IpSpN2qiUvVRWVNnOco8nI,710 +PyInstaller/hooks/hook-gi.repository.GtkClutter.py,sha256=Yu6TRHQVi42DsZsoKWwE2G-GDGNzMUrxTR5BBQRkyOc,707 +PyInstaller/hooks/hook-gi.repository.GtkSource.py,sha256=MERiaYTs-_swaRUFS1BqJQ5T5FpfrgPSvH9I4pjzKo4,1297 +PyInstaller/hooks/hook-gi.repository.GtkosxApplication.py,sha256=E-nWcs8eef4Gu1N5miKUMaXPMI0xu3O6PRzX1ZkP9Zw,781 +PyInstaller/hooks/hook-gi.repository.HarfBuzz.py,sha256=vUu5j4FBHqQPLGbjhkWJx1tWi86-HxiBmkgRjrXEpko,705 +PyInstaller/hooks/hook-gi.repository.Pango.py,sha256=yB2ZbRI2vG1OuigPDCIGRKqIxPPAE2SGQ5dh5UoL9uU,702 +PyInstaller/hooks/hook-gi.repository.PangoCairo.py,sha256=0z-JkDB74mtvK-qBbIpqB9UmChAPfcY4Z0cdXa7156U,707 +PyInstaller/hooks/hook-gi.repository.cairo.py,sha256=8E7NMq7RGLg5S506KrHp02qPi8Xq70cTQLz8-2L1Yko,702 +PyInstaller/hooks/hook-gi.repository.freetype2.py,sha256=X6cMHL6XRVrw92SFGRAmwCrWm_k8fHJdk8bVsBxUAnY,706 +PyInstaller/hooks/hook-gi.repository.xlib.py,sha256=MvSXmdVHKrEPpbCRVikFfpK_tCPifwGSyTjkxZ70WMA,701 +PyInstaller/hooks/hook-heapq.py,sha256=gjF79X1Jt5zDPGD9Q_VdmBfn8_NZCn622l7YArn2u38,578 +PyInstaller/hooks/hook-idlelib.py,sha256=96jkUh7GNAPaBdV2ebvtuW7QhnmVMp8F_uvRl7IEyug,602 +PyInstaller/hooks/hook-importlib_metadata.py,sha256=lWesTFNaBn9FjUekBi82wqRwZTU35JqeXRRdBn8hvUA,1350 +PyInstaller/hooks/hook-importlib_resources.py,sha256=qnYt9Bu6zOErsKmDsk6dX7ImRVwCV_cDNSZJRFK7Hxo,1015 +PyInstaller/hooks/hook-keyring.py,sha256=bYnya8YRlh8Cn1DLoDNINWMp_YTKgnSZafhHIecGS1Y,888 +PyInstaller/hooks/hook-kivy.py,sha256=QlC2_9p6MqyKuIVePUGVHzxl_y4j7EC3k_Wlr5UKdXc,1126 +PyInstaller/hooks/hook-lib2to3.py,sha256=uU3mDEtYPN-Z_GxO-zt6orNo7qK8Q_30bSugb02RyPo,653 +PyInstaller/hooks/hook-matplotlib.backend_bases.py,sha256=7iniaWkwXT6sohBNGxq9mA1EpQdZe8i6G4-FdW25Eos,533 +PyInstaller/hooks/hook-matplotlib.backends.backend_qtagg.py,sha256=P1oAFSt-848iD4kuhE4AthDGWXmsV1tgI9gPTCMOLWM,894 +PyInstaller/hooks/hook-matplotlib.backends.backend_qtcairo.py,sha256=tBYzMUrY7pKSuBklcAJvVrKZ8mddX1O-nxy_YgkIrq8,896 +PyInstaller/hooks/hook-matplotlib.backends.py,sha256=SWWxGBJfrZ7NbZqZtIkMeD0I-nysDo2Ek58m9Wesk3E,9657 +PyInstaller/hooks/hook-matplotlib.backends.qt_compat.py,sha256=YmmBT0MiyEDmVXrNMpgj0G9EEjUma2a5xGsCUSpvWoM,1284 +PyInstaller/hooks/hook-matplotlib.numerix.py,sha256=IeAi4MV6B5QJ1xhrrknpna6W7GOoU-hHZDqGRi0jJbw,683 +PyInstaller/hooks/hook-matplotlib.py,sha256=oScRuUc0Y3jXjp_Yy1vkyETtkrOZzwRr-eWmWKOeDhY,1568 +PyInstaller/hooks/hook-matplotlib.pyplot.py,sha256=Z_bOet2njmp6DZt4nc6afxLyGBCbgSsj9TEc3rerX0o,560 +PyInstaller/hooks/hook-multiprocessing.util.py,sha256=d9rgj6yOLda8nXxCQofqgcQABGhl4snJu-oIA4tk8zw,791 +PyInstaller/hooks/hook-numpy.py,sha256=_TXRgxZu3Buoi4vcfxuAEMocVatOrYTfvskWYclPAL0,6051 +PyInstaller/hooks/hook-packaging.py,sha256=-xKZIGp9It9_aWoZYQZLdFMNhsxJjwwv5tYSem8t-2I,577 +PyInstaller/hooks/hook-pandas.io.clipboard.py,sha256=syzylK5jU3Lm8IFomqrdtKx_-rZzdEGUnG5X6vaquC4,1156 +PyInstaller/hooks/hook-pandas.io.formats.style.py,sha256=zxvJxol9G5FwRjU90EpmzgMBlzx03lrLkAorhDAXxa4,751 +PyInstaller/hooks/hook-pandas.plotting.py,sha256=XGZMzp_CUX8VTzLG-4Stbb8AAM_ICnW758-eQGrBDwc,938 +PyInstaller/hooks/hook-pandas.py,sha256=x7kjmXFdtYYWYlBMgNq4wjO0vMalSrf_XgJiB-vxq2o,955 +PyInstaller/hooks/hook-pickle.py,sha256=UodGjHVD_QtTR8VW2mQ8XL4toCpHYfU3QIVwPd1DOu4,589 +PyInstaller/hooks/hook-pkg_resources.py,sha256=CoQupujLoZgi79d_flMEhFPpOUJxDJGXgqBXCww3cLI,3563 +PyInstaller/hooks/hook-platform.py,sha256=PXPyeR-xcVpVagddP0opUdW6QNi5F_gOTkl7f4b77S8,713 +PyInstaller/hooks/hook-pygments.py,sha256=bFqk7NfL9GXrMTDCWUv1oOK9pQbx1354THBLlgsqOFE,1184 +PyInstaller/hooks/hook-pytz.py,sha256=ZCJFYXAljJSbyqiu262tZL_qpnZsajehWzRDKvoI7dc,734 +PyInstaller/hooks/hook-pytzdata.py,sha256=h6qOdqNVmFnWE0b1DeE-gpVqeL-MVs25VbC-s8dsvNY,603 +PyInstaller/hooks/hook-qtawesome.py,sha256=UDQFON0R3GbQoPxJ2nBYmr11FOVbc2mZn0jWg0i8q28,792 +PyInstaller/hooks/hook-qtpy.py,sha256=Imf8Sma0zykdKY_ltMlKtccb0CWPsL0DY0UWjU2ckYE,1179 +PyInstaller/hooks/hook-scapy.layers.all.py,sha256=71caVRTCmcClHNBwlmRKKBHZfWEYE9qubn_DNxN8Xbo,930 +PyInstaller/hooks/hook-scipy.io.matlab.py,sha256=_W8WtCFFsLIoxUX5DRDj2YULfi4bo13OkK6MoNKj25g,655 +PyInstaller/hooks/hook-scipy.linalg.py,sha256=iXsaTpTOgNalynuMqMdI0JRenRsZ1G5kx_D8EKJWaRU,633 +PyInstaller/hooks/hook-scipy.py,sha256=HSc1rIEz-XGrBqS9NQMD7skf-AAJ2PeQPnTt48_Ia60,2467 +PyInstaller/hooks/hook-scipy.sparse.csgraph.py,sha256=pCQv4w_ReJsQCl0udEomCM9WcrsYVJ1QGxxW5IikLLY,611 +PyInstaller/hooks/hook-scipy.spatial.transform.rotation.py,sha256=YJ44N1xt8P1SB3PKSfuPiB1E2iV1MSLWLMKS_hSmlL0,793 +PyInstaller/hooks/hook-scipy.special._ellip_harm_2.py,sha256=UlLNQkgYOCFCmMItBKvvVRwSUZpAWJRst0IpdJqX8M4,1317 +PyInstaller/hooks/hook-scipy.special._ufuncs.py,sha256=v1GYZ6g5NA9g0GfZV7ymBz-xIGD_3oWv9MoaPGxSElA,1258 +PyInstaller/hooks/hook-scipy.stats._stats.py,sha256=9HkYRAJhusS5gyXIvhBjtkc2z0EjvtMY_0zTBxq70sY,656 +PyInstaller/hooks/hook-scrapy.py,sha256=360AxhD-RoAKPY9gNo-DW4Yx9YCc1WTTJ_VKRu6Amp0,819 +PyInstaller/hooks/hook-setuptools._vendor.importlib_metadata.py,sha256=olw_k1O_UERG8lXz7aqi3iOg7svYNEAZX6t3dDXRxg0,1127 +PyInstaller/hooks/hook-setuptools._vendor.jaraco.text.py,sha256=4mzkjFNSvo27UGVm6dteGPB8ilUgb1LEbnmnSiMeW6o,927 +PyInstaller/hooks/hook-setuptools.py,sha256=iyfdli1uj8DMObrg9mDuCK55KhlezS2cdJWHQt9PeUw,4466 +PyInstaller/hooks/hook-shelve.py,sha256=ToCfEfqwboTS42HS9Ugv1h0xAo2M_CmBb8_gP2cldqE,603 +PyInstaller/hooks/hook-shiboken6.py,sha256=1krp8Ui-4Kl5IoPzX3HECUmD5BG2M0J3LNHLvaVnpw0,766 +PyInstaller/hooks/hook-sphinx.py,sha256=fc8mbEuArO9mEelgapVJjI3Lcln1u4d_XkW4nMudpYE,1998 +PyInstaller/hooks/hook-sqlalchemy.py,sha256=14Ccv93R6oHjyYlXTQ-l0F3x1xcf_4xkI_O0Hk4jOmc,3496 +PyInstaller/hooks/hook-sqlite3.py,sha256=oZ2oAKTuORGunOzbvMDyRKV9lLpDbMede9ozuyLDeqM,813 +PyInstaller/hooks/hook-sysconfig.py,sha256=5IcB6ZlhVkP6kf8csyo8Xrz7WleJTbWEhMZKoswAUu0,1558 +PyInstaller/hooks/hook-wcwidth.py,sha256=zWcpM-dXNP7vuhDyjEMhlsjWQQ9WPtTtxn1S9xG5jc8,602 +PyInstaller/hooks/hook-win32ctypes.core.py,sha256=_IqEnHRy2Jhq-57MKZGFZGS5Bvg53vMp9eQqzeaJY0E,1204 +PyInstaller/hooks/hook-xml.dom.domreg.py,sha256=dCHWL_UpnTqCnrv7DL3-IWULcqthaJVtm2WX4FTmPHo,569 +PyInstaller/hooks/hook-xml.etree.cElementTree.py,sha256=Duh1C8zTwmt_lg_Ek9rLgxxww88fgpiuGyI8OynK-q8,615 +PyInstaller/hooks/hook-xml.py,sha256=oxHKZoo7YNgI_8qG9q3wgYukjIDr27PL8Wv051SrzyA,569 +PyInstaller/hooks/hook-zope.interface.py,sha256=1Xrezxtifo9OUMPDTDGGaEoOn04xIU33OsO_lvX2gWM,539 +PyInstaller/hooks/pre_find_module_path/__init__.py,sha256=MsSFjiLMLJZ7QhUPpVBWKiyDnCzryquRyr329NoCACI,2 +PyInstaller/hooks/pre_find_module_path/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/hooks/pre_find_module_path/__pycache__/hook-PyQt5.uic.port_v2.cpython-311.pyc,, +PyInstaller/hooks/pre_find_module_path/__pycache__/hook-_pyi_rth_utils.cpython-311.pyc,, +PyInstaller/hooks/pre_find_module_path/__pycache__/hook-distutils.cpython-311.pyc,, +PyInstaller/hooks/pre_find_module_path/__pycache__/hook-pyi_splash.cpython-311.pyc,, +PyInstaller/hooks/pre_find_module_path/__pycache__/hook-tkinter.cpython-311.pyc,, +PyInstaller/hooks/pre_find_module_path/hook-PyQt5.uic.port_v2.py,sha256=lMGJ1xNvaAxuHkGivHHno1q7QZ_F0WsTKstlmc4NcHc,696 +PyInstaller/hooks/pre_find_module_path/hook-_pyi_rth_utils.py,sha256=cPgCZrMJdWTO43CEN4J3mvtlzF9yWlEBsEmzi5u8fyo,905 +PyInstaller/hooks/pre_find_module_path/hook-distutils.py,sha256=yLU8K5hn85G2y5Hs_XF0hgMP9hQg3qIqOJKEv2q39jo,2347 +PyInstaller/hooks/pre_find_module_path/hook-pyi_splash.py,sha256=edbvRQ2Thc2qHA36uUCLHPC-HIembOEkr5bA8orH9pU,1412 +PyInstaller/hooks/pre_find_module_path/hook-tkinter.py,sha256=lbu1k3kYhULblbqn90-g5GN2qir7Rz7ShbTfYEyGAiw,834 +PyInstaller/hooks/pre_safe_import_module/__init__.py,sha256=MsSFjiLMLJZ7QhUPpVBWKiyDnCzryquRyr329NoCACI,2 +PyInstaller/hooks/pre_safe_import_module/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-autocommand.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-backports.tarfile.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-distutils.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Adw.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.AppIndicator3.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Atk.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.AyatanaAppIndicator3.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Champlain.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Clutter.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.DBus.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GIRepository.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GLib.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GModule.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GObject.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gdk.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GdkPixbuf.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gio.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Graphene.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gsk.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gst.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstAllocators.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstApp.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstAudio.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstBadAudio.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstBase.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstCheck.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstCodecs.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstController.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGL.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLEGL.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLWayland.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstGLX11.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstInsertBin.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstMpegts.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstNet.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPbutils.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPlay.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstPlayer.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtp.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtsp.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstRtspServer.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstSdp.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstTag.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstTranscoder.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVideo.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkan.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkanWayland.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstVulkanXCB.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GstWebRTC.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Gtk.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkChamplain.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkClutter.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkSource.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.GtkosxApplication.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.HarfBuzz.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.Pango.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.PangoCairo.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.cairo.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.freetype2.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-gi.repository.xlib.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-importlib_metadata.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-importlib_resources.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-inflect.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.context.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.functools.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-jaraco.text.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-more_itertools.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-ordered_set.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-packaging.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-platformdirs.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-setuptools.extern.six.moves.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-six.moves.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-tomli.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-typeguard.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-typing_extensions.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-urllib3.packages.six.moves.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-wheel.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/__pycache__/hook-zipp.cpython-311.pyc,, +PyInstaller/hooks/pre_safe_import_module/hook-autocommand.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-backports.tarfile.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-distutils.py,sha256=LDvJiYH0gr2-e5UC0wD5U2MU2jB2KHvGIlDqmMT4Ubw,1235 +PyInstaller/hooks/pre_safe_import_module/hook-gi.py,sha256=UU9LBJIf3EIFC1pKwi1hqxV-iGvI4VtJBVa6KPOXXKU,1955 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Adw.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AppIndicator3.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Atk.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.AyatanaAppIndicator3.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Champlain.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Clutter.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.DBus.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GIRepository.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GLib.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GModule.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GObject.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gdk.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GdkPixbuf.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gio.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Graphene.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gsk.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gst.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAllocators.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstApp.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstAudio.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBadAudio.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstBase.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCheck.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstCodecs.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstController.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGL.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLEGL.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLWayland.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstGLX11.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstInsertBin.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstMpegts.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstNet.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPbutils.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlay.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstPlayer.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtp.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtsp.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstRtspServer.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstSdp.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTag.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstTranscoder.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVideo.py,sha256=wwWsrx5A4AsvLZimx7h9M9T0gBFBqPXb5z2MIgX3EEs,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkan.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanWayland.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstVulkanXCB.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GstWebRTC.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Gtk.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkChamplain.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkClutter.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkSource.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.GtkosxApplication.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.HarfBuzz.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.Pango.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.PangoCairo.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.cairo.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.freetype2.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-gi.repository.xlib.py,sha256=c5f74KePUHt-7fH_tJQfuqB44ysYTLbCm76u2QVB07U,783 +PyInstaller/hooks/pre_safe_import_module/hook-importlib_metadata.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-importlib_resources.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-inflect.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-jaraco.context.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-jaraco.functools.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-jaraco.text.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-more_itertools.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-ordered_set.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-packaging.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-platformdirs.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-setuptools.extern.six.moves.py,sha256=A-aFL3cZ_AgA2Ia5UPEnFijM5vCP-S-U24kiOMrgdpY,1629 +PyInstaller/hooks/pre_safe_import_module/hook-six.moves.py,sha256=drAs8emHi0X9vxDtKo-n3XBTanM6RuJPJATfVoVFOXE,3744 +PyInstaller/hooks/pre_safe_import_module/hook-tomli.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-typeguard.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-typing_extensions.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-urllib3.packages.six.moves.py,sha256=vLiXNHM4LwX4sWP6j_pQnBpLpwFXz0TCxHnQpqUdjf8,1380 +PyInstaller/hooks/pre_safe_import_module/hook-wheel.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/pre_safe_import_module/hook-zipp.py,sha256=O56uUBdY_je3jGpxwWo_qyKHCUPZX805adawrj8kBBE,924 +PyInstaller/hooks/rthooks.dat,sha256=bdXIqqe9MG02b81XxSNDeewioDtjKLydPCyiPZsX9g8,956 +PyInstaller/hooks/rthooks/__init__.py,sha256=MsSFjiLMLJZ7QhUPpVBWKiyDnCzryquRyr329NoCACI,2 +PyInstaller/hooks/rthooks/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth__tkinter.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_django.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gdkpixbuf.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gi.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gio.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_glib.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gstreamer.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_gtk.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_inspect.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_kivy.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_mplconfig.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_multiprocessing.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pkgres.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pkgutil.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyqt5.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyqt6.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyside2.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_pyside6.cpython-311.pyc,, +PyInstaller/hooks/rthooks/__pycache__/pyi_rth_setuptools.cpython-311.pyc,, +PyInstaller/hooks/rthooks/pyi_rth__tkinter.py,sha256=iF0MUBG5v18Mygb1sgqkvSgFPGmgF-z0DmtlOK2n9DE,1381 +PyInstaller/hooks/rthooks/pyi_rth_django.py,sha256=9FeO_ektm32U-b-dZvvNdjrT0S6-H3I5rFCHSvBmG0A,1111 +PyInstaller/hooks/rthooks/pyi_rth_gdkpixbuf.py,sha256=IOq2fxAQZ4OIMam-sLr0NI93dfMC8KgsrmXdjzE7M3g,1437 +PyInstaller/hooks/rthooks/pyi_rth_gi.py,sha256=H5wdL7AjlrfPib7En_YYLebfltmm5V4AUZ_PacAEFlQ,632 +PyInstaller/hooks/rthooks/pyi_rth_gio.py,sha256=6T0LIFqi8l5HzCWE-0mYIQ6DaxNGn0533Xn7V0uhLZo,631 +PyInstaller/hooks/rthooks/pyi_rth_glib.py,sha256=s7VmqbBTJBAU--RrroztL5u7CY3seSbFM6xR6BpCa1U,1444 +PyInstaller/hooks/rthooks/pyi_rth_gstreamer.py,sha256=r2MTC-bYPN1Kdfvw_Am2KiVnvA6WqikLGpaqVLeDIZM,1175 +PyInstaller/hooks/rthooks/pyi_rth_gtk.py,sha256=yR1NT5tRR-g9y-bG7Tk7ZosPTNHMnV7KFme7dlz6NFA,886 +PyInstaller/hooks/rthooks/pyi_rth_inspect.py,sha256=plSsK6xps0rNPr2UY7e_vljFKH4InjddNU66VyRCk2A,2429 +PyInstaller/hooks/rthooks/pyi_rth_kivy.py,sha256=jIBZeNe2Kmbxi00XJ96l5KvNWD9KCvzFQp-Ug93-FpU,737 +PyInstaller/hooks/rthooks/pyi_rth_mplconfig.py,sha256=XuCFEHpud0vYuwQX56LcuGoZgkjB_pHPyseJcs5UwSY,1808 +PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py,sha256=6a2ZoTIVNGKHdB-aAAfG7dVN56R9soM5AJV0-D9T-Yg,2219 +PyInstaller/hooks/rthooks/pyi_rth_pkgres.py,sha256=pK7zQnH9D7yYuqQOhDCYlvphC6ckQRyKFGSAP9RCNpI,8660 +PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py,sha256=052KyovwgWko4GUDJyl5wWtu1hY2hAWxAb0aSsjFVN4,3084 +PyInstaller/hooks/rthooks/pyi_rth_pyqt5.py,sha256=og6YoJVF0NfPDvZUCydq5Hc1mOylHfoPlZr5U9FDQ4c,3542 +PyInstaller/hooks/rthooks/pyi_rth_pyqt6.py,sha256=La9r6nfWJzXPGi9llkcEq5PvLaZLnkqdhCMhySS6oQY,3803 +PyInstaller/hooks/rthooks/pyi_rth_pyside2.py,sha256=UNxayNyGCcbxheNwM0zz9shmGuOcy4ubIr0OQ0qHJms,3235 +PyInstaller/hooks/rthooks/pyi_rth_pyside6.py,sha256=0SAB-MUdyPdxFNnUgHixB-HXwNvYnQOPTucn08GlN6s,3730 +PyInstaller/hooks/rthooks/pyi_rth_setuptools.py,sha256=rrDcdbUGSuUnUeXDRR_HalxM1-ghtJiWFIgOvOIIMPo,1430 +PyInstaller/isolated/__init__.py,sha256=eY1YBvBNir3Mwn2-lSXEBmiY-i_jz1ZZ_uQVRq_qZms,1526 +PyInstaller/isolated/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/isolated/__pycache__/_child.cpython-311.pyc,, +PyInstaller/isolated/__pycache__/_parent.cpython-311.pyc,, +PyInstaller/isolated/_child.py,sha256=sQERIgcb0bB38MAZP2s6UM29yEKkVeB_jV0lEHXckzQ,3980 +PyInstaller/isolated/_parent.py,sha256=w1AGtK8vWlazpJUaAjlBV10MSs1JEtfVnxq_T40pY2Q,18005 +PyInstaller/lib/README.rst,sha256=VdkvnJUKg6D2bv3nfb-bJoWQ00jTf-pLbvv7KbsSaTA,1333 +PyInstaller/lib/__init__.py,sha256=MsSFjiLMLJZ7QhUPpVBWKiyDnCzryquRyr329NoCACI,2 +PyInstaller/lib/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/lib/modulegraph/__init__.py,sha256=q1XQN2YGfSINUSLuBsTs7uhMArf62AFQxdSrq3fS4-o,21 +PyInstaller/lib/modulegraph/__main__.py,sha256=hiwjxxmiY3QfLQ7f0Pd_eSDQYL8MXQyQtkRoJSHe3hU,2653 +PyInstaller/lib/modulegraph/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/lib/modulegraph/__pycache__/__main__.cpython-311.pyc,, +PyInstaller/lib/modulegraph/__pycache__/find_modules.cpython-311.pyc,, +PyInstaller/lib/modulegraph/__pycache__/modulegraph.cpython-311.pyc,, +PyInstaller/lib/modulegraph/__pycache__/util.cpython-311.pyc,, +PyInstaller/lib/modulegraph/find_modules.py,sha256=D3B5WujxMc6syDuReriZfwxoFw7mBbkLj3-MADyVLD8,1754 +PyInstaller/lib/modulegraph/modulegraph.py,sha256=UUpwYXUZLb0dKX4AwbZWdPKITpjO-Y3YkZDDyBw9gZ8,130955 +PyInstaller/lib/modulegraph/util.py,sha256=S-0SI65fylZqvy0bN-xMB1xRYp5o0qo7UJnX5IwCzcg,849 +PyInstaller/loader/__init__.py,sha256=MsSFjiLMLJZ7QhUPpVBWKiyDnCzryquRyr329NoCACI,2 +PyInstaller/loader/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/loader/__pycache__/pyiboot01_bootstrap.cpython-311.pyc,, +PyInstaller/loader/__pycache__/pyimod01_archive.cpython-311.pyc,, +PyInstaller/loader/__pycache__/pyimod02_importers.cpython-311.pyc,, +PyInstaller/loader/__pycache__/pyimod03_ctypes.cpython-311.pyc,, +PyInstaller/loader/__pycache__/pyimod04_pywin32.cpython-311.pyc,, +PyInstaller/loader/pyiboot01_bootstrap.py,sha256=L-dAFf4veUwC6xF9qXPvCxuimCDVYyf_f8QU5cJ803A,3712 +PyInstaller/loader/pyimod01_archive.py,sha256=cw3eZLwFidkSLzCrbaGjFuevlxjxSAi02Eg_S2eubWw,5346 +PyInstaller/loader/pyimod02_importers.py,sha256=NArs-KoR2vn4mqq2kLqSxU5YdVPt_GMJ4exdxq_j394,32643 +PyInstaller/loader/pyimod03_ctypes.py,sha256=ZdLzbVIP1uf5RB5mLs2JTJJjdfu5pswa_5S6vEBTMSc,4915 +PyInstaller/loader/pyimod04_pywin32.py,sha256=vFVETWdFpZIroatj0TGpDE2fAMgAVTs80IQjrNGYKuw,2936 +PyInstaller/log.py,sha256=1Pqaq6YwtV-zg4UMA826AJey6zWZwajFwwKsXNBmIu8,2058 +PyInstaller/utils/__init__.py,sha256=MsSFjiLMLJZ7QhUPpVBWKiyDnCzryquRyr329NoCACI,2 +PyInstaller/utils/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/utils/__pycache__/conftest.cpython-311.pyc,, +PyInstaller/utils/__pycache__/misc.cpython-311.pyc,, +PyInstaller/utils/__pycache__/osx.cpython-311.pyc,, +PyInstaller/utils/__pycache__/run_tests.cpython-311.pyc,, +PyInstaller/utils/__pycache__/tests.cpython-311.pyc,, +PyInstaller/utils/cliutils/__init__.py,sha256=MsSFjiLMLJZ7QhUPpVBWKiyDnCzryquRyr329NoCACI,2 +PyInstaller/utils/cliutils/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/utils/cliutils/__pycache__/archive_viewer.cpython-311.pyc,, +PyInstaller/utils/cliutils/__pycache__/bindepend.cpython-311.pyc,, +PyInstaller/utils/cliutils/__pycache__/grab_version.cpython-311.pyc,, +PyInstaller/utils/cliutils/__pycache__/makespec.cpython-311.pyc,, +PyInstaller/utils/cliutils/__pycache__/set_version.cpython-311.pyc,, +PyInstaller/utils/cliutils/archive_viewer.py,sha256=TApsAzyxsO0TL02Dyu0G_u-ckOmZnuy-UoVQ2bNfjwQ,9253 +PyInstaller/utils/cliutils/bindepend.py,sha256=3ds2RnLHUtRYZricqMPRjMcVccKsn9zcwauPCFIRHLA,1844 +PyInstaller/utils/cliutils/grab_version.py,sha256=i2j8WItcJp5tgUUCVFqO2tRN-DtBe-yO3lKqbBP0Zjo,1857 +PyInstaller/utils/cliutils/makespec.py,sha256=dO9-KTe_lsUFlurY2gF6bOnd7OAn2hvGcmgg2n-GBSs,1640 +PyInstaller/utils/cliutils/set_version.py,sha256=FbC-FfXZs3W0XAvpgsy16T8HPJgZbFlHd2xB9EBwIMc,1503 +PyInstaller/utils/conftest.py,sha256=BVJnY2YVtu28VePDDVYlBzB-1t-0Wdd-K9IOxsiNn7M,24294 +PyInstaller/utils/hooks/__init__.py,sha256=xWb-ye-BfKMYWYQoAuO0lJUL5LaTLK5YDScQdB9v7HY,54416 +PyInstaller/utils/hooks/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/utils/hooks/__pycache__/conda.cpython-311.pyc,, +PyInstaller/utils/hooks/__pycache__/django.cpython-311.pyc,, +PyInstaller/utils/hooks/__pycache__/gi.cpython-311.pyc,, +PyInstaller/utils/hooks/__pycache__/setuptools.cpython-311.pyc,, +PyInstaller/utils/hooks/__pycache__/tcl_tk.cpython-311.pyc,, +PyInstaller/utils/hooks/conda.py,sha256=HKIaa1UoqOTBaUfk7_Nm5eRGv3sCZLy7fZBwvoFIafE,14694 +PyInstaller/utils/hooks/django.py,sha256=veWnLehyo9xC94_D0TchQuCL4M2-T6EVjNrsoUEoiO0,6135 +PyInstaller/utils/hooks/gi.py,sha256=e_L3yot9Np4ajl57c3hbn5abFOmFOoBGTN2J1lKqezY,17414 +PyInstaller/utils/hooks/qt/__init__.py,sha256=3eboHkSBiH33ikHtq-ior55HEFHWsP2nYmY_Abt-a8I,75389 +PyInstaller/utils/hooks/qt/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/utils/hooks/qt/__pycache__/_modules_info.cpython-311.pyc,, +PyInstaller/utils/hooks/qt/_modules_info.py,sha256=OWfRSZa-zMmOtvdSurQhaf2VTbQYhIKU8FtlAEFnqqg,25226 +PyInstaller/utils/hooks/setuptools.py,sha256=iwNd50MM-jaL3sgaUOPt_iw6O_bFPXAopQv-WPBbg4Q,10735 +PyInstaller/utils/hooks/tcl_tk.py,sha256=7kNT1WTUZQyjJsK7i_iPAKlWGfLfQFc_5DbeXXGsYr0,14931 +PyInstaller/utils/misc.py,sha256=5NmfvxjaomhoPEg7yRv1-evvTWTD2HQysd3lhOfgRNg,7030 +PyInstaller/utils/osx.py,sha256=RBb79kbLTzTLLfMROBxkYUptXq0TJjaEAruNNiLdIQE,29624 +PyInstaller/utils/run_tests.py,sha256=OCnUmL3dBAN5D-wKM1Dg3sSvsMy925LicSEktIyYodE,2875 +PyInstaller/utils/tests.py,sha256=v0TZbQH9A7sijrfko7aEOKBVodh2qk10E48n_sfSdpI,5813 +PyInstaller/utils/win32/__init__.py,sha256=fNGhsx0m5s9iq4yMvH6J1tI0vzUKWd62lIQNSnKTGCE,22 +PyInstaller/utils/win32/__pycache__/__init__.cpython-311.pyc,, +PyInstaller/utils/win32/__pycache__/icon.cpython-311.pyc,, +PyInstaller/utils/win32/__pycache__/versioninfo.cpython-311.pyc,, +PyInstaller/utils/win32/__pycache__/winmanifest.cpython-311.pyc,, +PyInstaller/utils/win32/__pycache__/winresource.cpython-311.pyc,, +PyInstaller/utils/win32/__pycache__/winutils.cpython-311.pyc,, +PyInstaller/utils/win32/icon.py,sha256=vgM-RKozX_VoXBpV5eXwWjyeryJJFkCXe_7RsDrUMDc,9327 +PyInstaller/utils/win32/versioninfo.py,sha256=ykWWzXVSnouldIfVapxysCEtWIR0oigX_rLL4zggO2k,20594 +PyInstaller/utils/win32/winmanifest.py,sha256=zO7kzIDp7MD_9GeF_RfsTrxaTOu_UnICMQUJFGoO54M,10644 +PyInstaller/utils/win32/winresource.py,sha256=DcA0UehlxjoU4s-mRPc51kHrQcHY0GEmAddGnYTekyk,7625 +PyInstaller/utils/win32/winutils.py,sha256=SSU_rotjJ0Eomy1Nn1oPRxF7qtAe_7UMWyAQsr_BZQc,9175 +pyinstaller-6.11.1.dist-info/COPYING.txt,sha256=3Pdf25WdseO0HA-FBQadLs54G17Gs9Ck0wl1z8ZYAkU,32138 +pyinstaller-6.11.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pyinstaller-6.11.1.dist-info/METADATA,sha256=VdS2TKaQdrzntHPB8zO_gTIa2-uOq-p5VBQkoXq8vis,8344 +pyinstaller-6.11.1.dist-info/RECORD,, +pyinstaller-6.11.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyinstaller-6.11.1.dist-info/WHEEL,sha256=MKsKTYcJ8UB7nlhmb6_u5qoYj_ULa0PDSKtamp2tTfc,98 +pyinstaller-6.11.1.dist-info/entry_points.txt,sha256=laaKjYFiMC3YuqudHNNx42-TdVB-y4YDLNDOrRFgk4I,376 +pyinstaller-6.11.1.dist-info/top_level.txt,sha256=GuRmvWXGTRJNYmK5iWGOglNv4L3by7YKaEiKycNZ4XQ,12 diff --git a/venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/REQUESTED b/venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/WHEEL b/venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/WHEEL new file mode 100644 index 0000000..e4fec26 --- /dev/null +++ b/venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.44.0) +Root-Is-Purelib: true +Tag: py3-none-win_amd64 + diff --git a/venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/entry_points.txt b/venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/entry_points.txt new file mode 100644 index 0000000..22c2452 --- /dev/null +++ b/venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/entry_points.txt @@ -0,0 +1,7 @@ +[console_scripts] +pyi-archive_viewer = PyInstaller.utils.cliutils.archive_viewer:run +pyi-bindepend = PyInstaller.utils.cliutils.bindepend:run +pyi-grab_version = PyInstaller.utils.cliutils.grab_version:run +pyi-makespec = PyInstaller.utils.cliutils.makespec:run +pyi-set_version = PyInstaller.utils.cliutils.set_version:run +pyinstaller = PyInstaller.__main__:_console_script_run diff --git a/venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/top_level.txt b/venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/top_level.txt new file mode 100644 index 0000000..c313980 --- /dev/null +++ b/venv/Lib/site-packages/pyinstaller-6.11.1.dist-info/top_level.txt @@ -0,0 +1 @@ +PyInstaller diff --git a/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/INSTALLER b/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/LICENSE b/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/LICENSE new file mode 100644 index 0000000..99bef9e --- /dev/null +++ b/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/LICENSE @@ -0,0 +1,521 @@ +============================================ +PyInstaller Community Hooks: License details +============================================ + +This software is made available under the terms of the licenses found below. +Contributions to the Community Hooks are made under the terms of the license +that covers that type of hook/file. (See below) + + +Standard hooks and files +------------------------ + +The PyInstaller Community Hooks are licensed under the terms of the GNU General +Public License as published by the Free Software Foundation; either version 2 of +the License, or (at your option) any later version (SPDX GPL-2.0-or-later). +These are all hooks/files except runtime hooks (see below). The terms of GPL 2.0 +are found in the section titled *GNU General Public License* below. + + +Runtime hooks +------------- + +These are runtime hooks, bundled with complete pyinstaller executables. These +files are licensed under the Apache-2.0 whose terms are found in the section +titled *Apache License 2.0*. + +These reside in "_pyinstaller_hooks_contrib/rthooks". + + +GNU General Public License +-------------------------- + +https://gnu.org/licenses/gpl-2.0.html + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + +Apache License 2.0 +++++++++++++++++++ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/METADATA b/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/METADATA new file mode 100644 index 0000000..7d1d760 --- /dev/null +++ b/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/METADATA @@ -0,0 +1,371 @@ +Metadata-Version: 2.1 +Name: pyinstaller-hooks-contrib +Version: 2024.10 +Summary: Community maintained hooks for PyInstaller +Home-page: https://github.com/pyinstaller/pyinstaller-hooks-contrib +Download-URL: https://pypi.org/project/pyinstaller-hooks-contrib +Maintainer: Legorooj +Maintainer-email: legorooj@protonmail.com +Keywords: pyinstaller development hooks +Classifier: Intended Audience :: Developers +Classifier: Topic :: Software Development :: Build Tools +Classifier: License :: OSI Approved :: Apache Software License +Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2) +Classifier: Natural Language :: English +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +License-File: LICENSE +Requires-Dist: setuptools>=42.0.0 +Requires-Dist: packaging>=22.0 +Requires-Dist: importlib-metadata>=4.6; python_version < "3.10" + +# `pyinstaller-hooks-contrib`: The PyInstaller community hooks repository + +What happens when (your?) package doesn't work with PyInstaller? Say you have data files that you need at runtime? +PyInstaller doesn't bundle those. Your package requires others which PyInstaller can't see? How do you fix that? + +In summary, a "hook" file extends PyInstaller to adapt it to the special needs and methods used by a Python package. +The word "hook" is used for two kinds of files. A runtime hook helps the bootloader to launch an app, setting up the +environment. A package hook (there are several types of those) tells PyInstaller what to include in the final app - +such as the data files and (hidden) imports mentioned above. + +This repository is a collection of hooks for many packages, and allows PyInstaller to work with these packages +seamlessly. + + +## Installation + +`pyinstaller-hooks-contrib` is automatically installed when you install PyInstaller, or can be installed with pip: + +```commandline +pip install -U pyinstaller-hooks-contrib +``` + + +## I can't see a hook for `a-package` + +Either `a-package` works fine without a hook, or no-one has contributed hooks. +If you'd like to add a hook, or view information about hooks, +please see below. + + +## Hook configuration (options) + +Hooks that support configuration (options) and their options are documented in +[Supported hooks and options](hooks-config.rst). + + +## I want to help! + +If you've got a hook you want to share then great! +The rest of this page will walk you through the process of contributing a hook. +If you've been here before then you may want to skip to the [summary checklist](#summary) + +**Unless you are very comfortable with `git rebase -i`, please provide one hook per pull request!** +**If you have more than one then submit them in separate pull requests.** + + +### Setup + +[Fork this repo](https://github.com/pyinstaller/pyinstaller-hooks-contrib/fork) if you haven't already done so. +(If you have a fork already but its old, click the **Fetch upstream** button on your fork's homepage.) +Clone and `cd` inside your fork by running the following (replacing `bob-the-barnacle` with your github username): + +``` +git clone https://github.com/bob-the-barnacle/pyinstaller-hoooks-contrib.git +cd pyinstaller-hooks-contrib +``` + +Create a new branch for you changes (replacing `foo` with the name of the package): +You can name this branch whatever you like. + +``` +git checkout -b hook-for-foo +``` + +If you wish to create a virtual environment then do it now before proceeding to the next step. + +Install this repo in editable mode. +This will overwrite your current installation. +(Note that you can reverse this with `pip install --force-reinstall pyinstaller-hooks-contrib`). + +``` +pip install -e . +pip install -r requirements-test.txt +pip install flake8 pyinstaller +``` + +Note that on macOS and Linux, `pip` may by called `pip3`. +If you normally use `pip3` and `python3` then use `pip3` here too. +You may skip the 2nd line if you have no intention of providing tests (but please do provide tests!). + + +### Add the hook + +Standard hooks live in the [_pyinstaller_hooks_contrib/stdhooks/](../master/_pyinstaller_hooks_contrib/stdhooks/) directory. +Runtime hooks live in the [_pyinstaller_hooks_contrib/rthooks/](../master/_pyinstaller_hooks_contrib/rthooks/) directory. +Simply copy your hook into there. +If you're unsure if your hook is a runtime hook then it almost certainly is a standard hook. + +Please annotate (with comments) anything unusual in the hook. +*Unusual* here is defined as any of the following: + +* Long lists of `hiddenimport` submodules. + If you need lots of hidden imports then use [`collect_submodules('foo')`](https://pyinstaller.readthedocs.io/en/latest/hooks.html#PyInstaller.utils.hooks.collect_submodules). + For bonus points, track down why so many submodules are hidden. Typical causes are: + * Lazily loaded submodules (`importlib.importmodule()` inside a module `__getattr__()`). + * Dynamically loaded *backends*. + * Usage of `Cython` or Python extension modules containing `import` statements. +* Use of [`collect_all()`](https://pyinstaller.readthedocs.io/en/latest/hooks.html#PyInstaller.utils.hooks.collect_all). + This function's performance is abismal and [it is broken by + design](https://github.com/pyinstaller/pyinstaller/issues/6458#issuecomment-1000481631) because it confuses + packages with distributions. + Check that you really do need to collect all of submodules, data files, binaries, metadata and dependencies. + If you do then add a comment to say so (and if you know it - why). + Do not simply use `collect_all()` just to *future proof* the hook. +* Any complicated `os.path` arithmetic (by which I simply mean overly complex filename manipulations). + + +#### Add the copyright header + +All source files must contain the copyright header to be covered by our terms and conditions. + +If you are **adding** a new hook (or any new python file), copy/paste the appropriate copyright header (below) at the top +replacing 2021 with the current year. + +

GPL 2 header for standard hooks or other Python files. + +```python +# ------------------------------------------------------------------ +# Copyright (c) 2024 PyInstaller Development Team. +# +# This file is distributed under the terms of the GNU General Public +# License (version 2.0 or later). +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: GPL-2.0-or-later +# ------------------------------------------------------------------ +``` + +
+ +
Apache header for runtime hooks only. +Again, if you're unsure if your hook is a runtime hook then it'll be a standard hook. + +```python +# ------------------------------------------------------------------ +# Copyright (c) 2024 PyInstaller Development Team. +# +# This file is distributed under the terms of the Apache License 2.0 +# +# The full license is available in LICENSE, distributed with +# this software. +# +# SPDX-License-Identifier: Apache-2.0 +# ------------------------------------------------------------------ +``` + +
+ + +If you are **updating** a hook, skip this step. +Do not update the year of the copyright header - even if it's out of date. + + +### Test + +Having tests is key to our continuous integration. +With them we can automatically verify that your hook works on all platforms, all Python versions and new versions of +libraries as and when they are released. +Without them, we have no idea if the hook is broken until someone finds out the hard way. +Please write tests!!! + +Some user interface libraries may be impossible to test without user interaction +or a wrapper library for some web API may require credentials (and possibly a paid subscription) to test. +In such cases, don't provide a test. +Instead explain either in the commit message or when you open your pull request why an automatic test is impractical +then skip on to [the next step](#run-linter). + + +#### Write tests(s) + +A test should be the least amount of code required to cause a breakage +if you do not have the hook which you are contributing. +For example if you are writing a hook for a library called `foo` +which crashes immediately under PyInstaller on `import foo` then `import foo` is your test. +If `import foo` works even without the hook then you will have to get a bit more creative. +Good sources of such minimal tests are introductory examples +from the documentation of whichever library you're writing a hook for. +Package's internal data files and hidden dependencies are prone to moving around so +tests should not explicitly check for presence of data files or hidden modules directly - +rather they should use parts of the library which are expected to use said data files or hidden modules. + +Tests generally live in [tests/test_libraries.py](../master/tests/test_libraries.py). +Navigate there and add something like the following, replacing all occurrences of `foo` with the real name of the library. +(Note where you put it in that file doesn't matter.) + +```python +@importorskip('foo') +def test_foo(pyi_builder): + pyi_builder.test_source(""" + + # Your test here! + import foo + + foo.something_fooey() + + """) +``` + +If the library has changed significantly over past versions then you may need to add version constraints to the test. +To do that, replace the `@importorskip("foo")` with a call to `PyInstaller.utils.tests.requires()` (e.g. +`@requires("foo >= 1.4")`) to only run the test if the given version constraint is satisfied. +Note that `@importorskip` uses module names (something you'd `import`) whereas `@requires` uses distribution names +(something you'd `pip install`) so you'd use `@importorskip("PIL")` but `@requires("pillow")`. +For most packages, the distribution and packages names are the same. + + +#### Run the test locally + +Running our full test suite is not recommended as it will spend a very long time testing code which you have not touched. +Instead, run tests individually using either the `-k` option to search for test names: + +``` +pytest -k test_foo +``` + +Or using full paths: +``` +pytest tests/test_libraries.py::test_foo +``` + + +#### Pin the test requirement + +Get the version of the package you are working with (`pip show foo`) +and add it to the [requirements-test-libraries.txt](../master/requirements-test-libraries.txt) file. +The requirements already in there should guide you on the syntax. + + +#### Run the test on CI/CD + +
CI/CD now triggers itself when you open a pull request. +These instructions for triggering jobs manually are obsolete except in rare cases. + +To test hooks on all platforms we use Github's continuous integration (CI/CD). +Our CI/CD is a bit unusual in that it's triggered manually and takes arguments +which limit which tests are run. +This is for the same reason we filter tests when running locally - +the full test suite takes ages. + +First push the changes you've made so far. + +```commandline +git push --set-upstream origin hook-for-foo +``` + +Replace *billy-the-buffalo* with your Github username in the following url then open it. +It should take you to the `oneshot-test` actions workflow on your fork. +You may be asked if you want to enable actions on your fork - say yes. +``` +https://github.com/billy-the-buffalo/pyinstaller-hooks-contrib/actions/workflows/oneshot-test.yml +``` + +Find the **Run workflow** button and click on it. +If you can't see the button, +select the **Oneshot test** tab from the list of workflows on the left of the page +and it should appear. +A dialog should appear containing one drop-down menu and 5 line-edit fields. +This dialog is where you specify what to test and which platforms and Python versions to test on. +Its fields are as follows: + +1. A branch to run from. Set this to the branch which you are using (e.g. ``hook-for-foo``), +2. Which package(s) to install and their version(s). + Which packages to test are inferred from which packages are installed. + You can generally just copy your own changes to the `requirements-test-libraries.txt` file into this box. + * Set to `foo` to test the latest version of `foo`, + * Set to `foo==1.2, foo==2.3` (note the comma) to test two different versions of `foo` in separate jobs, + * Set to `foo bar` (note the lack of a comma) to test `foo` and `bar` in the same job, +3. Which OS or OSs to run on + * Set to `ubuntu` to test only `ubuntu`, + * Set to `ubuntu, macos, windows` (order is unimportant) to test all three OSs. +4. Which Python version(s) to run on + * Set to `3.9` to test only Python 3.9, + * Set to `3.8, 3.9, 3.10, 3.11` to test all currently supported version of Python. +5. The final two options can generally be left alone. + +Hit the green **Run workflow** button at the bottom of the dialog, wait a few seconds then refresh the page. +Your workflow run should appear. + +We'll eventually want to see a build (or collection of builds) which pass on +all OSs and all Python versions. +Once you have one, hang onto its URL - you'll need it when you submit the pull request. +If you can't get it to work - that's fine. +Open a pull request as a draft, show us what you've got and we'll try and help. + + +#### Triggering CI/CD from a terminal + +If you find repeatedly entering the configuration into Github's **Run workflow** dialog arduous +then we also have a CLI script to launch it. +Run ``python scripts/cloud-test.py --help`` which should walk you through it. +You will have to enter all the details again but, thanks to the wonders of terminal history, +rerunning a configuration is just a case of pressing up then enter. + +
+ + +### Run Linter + +We use `flake8` to enforce code-style. +`pip install flake8` if you haven't already then run it with the following. + +``` +flake8 +``` + +No news is good news. +If it complains about your changes then do what it asks then run it again. +If you don't understand the errors it come up with them lookup the error code +in each line (a capital letter followed by a number e.g. `W391`). + +**Please do not fix flake8 issues found in parts of the repository other than the bit that you are working on.** Not only is it very boring for you, but it is harder for maintainers to +review your changes because so many of them are irrelevant to the hook you are adding or changing. + + +### Add a news entry + +Please read [news/README.txt](https://github.com/pyinstaller/pyinstaller-hooks-contrib/blob/master/news/README.txt) before submitting you pull request. +This will require you to know the pull request number before you make the pull request. +You can usually guess it by adding 1 to the number of [the latest issue or pull request](https://github.com/pyinstaller/pyinstaller-hooks-contrib/issues?q=sort%3Acreated-desc). +Alternatively, [submit the pull request](#submit-the-pull-request) as a draft, +then add, commit and push the news item after you know your pull request number. + + +### Summary + +A brief checklist for before submitting your pull request: + +* [ ] All new Python files have [the appropriate copyright header](#add-the-copyright-header). +* [ ] You have written a [news entry](#add-a-news-entry). +* [ ] Your changes [satisfy the linter](#run-linter) (run `flake8`). +* [ ] You have written tests (if possible) and [pinned the test requirement](#pin-the-test-requirement). + + +### Submit the pull request + +Once you've done all the above, run `git push --set-upstream origin hook-for-foo` then go ahead and create a pull request. +If you're stuck doing any of the above steps, create a draft pull request and explain what's wrong - we'll sort you out... +Feel free to copy/paste commit messages into the Github pull request title and description. +If you've never done a pull request before, note that you can edit it simply by running `git push` again. +No need to close the old one and start a new one. + +--- + +If you plan to contribute frequently or are interested in becoming a developer, +send an email to `legorooj@protonmail.com` to let us know. diff --git a/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/RECORD b/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/RECORD new file mode 100644 index 0000000..282ef60 --- /dev/null +++ b/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/RECORD @@ -0,0 +1,1015 @@ +_pyinstaller_hooks_contrib/__init__.py,sha256=FekX0pQUgYHbYEgBJre2WK1fmFZvD8bsAQ_wszOOfII,855 +_pyinstaller_hooks_contrib/__pycache__/__init__.cpython-311.pyc,, +_pyinstaller_hooks_contrib/__pycache__/__init__.cpython-39.pyc,sha256=RTaaARFMZmwZ35exzJuBrG_TRsecIUXkooswyXatHY0,548 +_pyinstaller_hooks_contrib/__pycache__/compat.cpython-311.pyc,, +_pyinstaller_hooks_contrib/compat.py,sha256=0j90ldRf8YpffLKamgybdqt4OepoPO1gFHI7HKE08b8,1535 +_pyinstaller_hooks_contrib/pre_find_module_path/__init__.py,sha256=XqTB__uJKeDTb84jwHlEmqemORWifP5u1Qi4lRzoTqo,420 +_pyinstaller_hooks_contrib/pre_find_module_path/__pycache__/__init__.cpython-311.pyc,, +_pyinstaller_hooks_contrib/pre_safe_import_module/__init__.py,sha256=XqTB__uJKeDTb84jwHlEmqemORWifP5u1Qi4lRzoTqo,420 +_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/__init__.cpython-311.pyc,, +_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/hook-tensorflow.cpython-311.pyc,, +_pyinstaller_hooks_contrib/pre_safe_import_module/__pycache__/hook-win32com.cpython-311.pyc,, +_pyinstaller_hooks_contrib/pre_safe_import_module/hook-tensorflow.py,sha256=2g3DIc1sCJGnaWQtAHNtU4P0GxBwO2qb07leNCLQVqw,1415 +_pyinstaller_hooks_contrib/pre_safe_import_module/hook-win32com.py,sha256=0MWymjscSjZYmAZ5y8EnHQaWiWxNKP9gvxYjKJWlbpc,1591 +_pyinstaller_hooks_contrib/rthooks.dat,sha256=3njJi-VRQez966tAcQge2yu82SxpbIEVevqNj7MVinI,599 +_pyinstaller_hooks_contrib/rthooks/__init__.py,sha256=QCvGkX3OU8wyd01O8N1mu-joIPa0-FEZ7eUxvpLXCMY,380 +_pyinstaller_hooks_contrib/rthooks/__pycache__/__init__.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_cryptography_openssl.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_enchant.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_ffpyplayer.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_findlibs.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_nltk.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_osgeo.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pygraphviz.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pyproj.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pyqtgraph_multiprocess.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pythoncom.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_pywintypes.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_tensorflow.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_traitlets.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/__pycache__/pyi_rth_usb.cpython-311.pyc,, +_pyinstaller_hooks_contrib/rthooks/pyi_rth_cryptography_openssl.py,sha256=jnzEkk1MZzFk9Mf3fGKvargi127JTaE2QdSrECbiDx4,755 +_pyinstaller_hooks_contrib/rthooks/pyi_rth_enchant.py,sha256=PrKqo5wO5SRSiGnZUXxVUFs-HWXLUHp5ky9HBO-Xtto,903 +_pyinstaller_hooks_contrib/rthooks/pyi_rth_ffpyplayer.py,sha256=qKPwYCFQmmBKitKrbQ0BFTra3bbVmGXB8QwcxXkng6Y,879 +_pyinstaller_hooks_contrib/rthooks/pyi_rth_findlibs.py,sha256=vMqQP1qXnAp-VzDOoLjD2Y-DRPm-cT3wMUZjp-a0Hlw,2046 +_pyinstaller_hooks_contrib/rthooks/pyi_rth_nltk.py,sha256=J50SKKti3MvZIWBRnIBBaqtq91dQ1ogRCVrDvn6Ea54,534 +_pyinstaller_hooks_contrib/rthooks/pyi_rth_osgeo.py,sha256=3REIgW6smeuQhOkiO2OkQ0K6YSqppDHFOmgnJ6AlTZk,1090 +_pyinstaller_hooks_contrib/rthooks/pyi_rth_pygraphviz.py,sha256=G5baiXo35aEQuqdzrRqmPd9BVhdsv5xO9O-5WJvdSpk,1076 +_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyproj.py,sha256=GBehG9sdgrdac6t47V-6azNz5CCjbVegCeezuajdC9k,754 +_pyinstaller_hooks_contrib/rthooks/pyi_rth_pyqtgraph_multiprocess.py,sha256=1ZmW_cic9OaOrojd1RknjTgvn7N6_C53Ej0imuuwEzE,2375 +_pyinstaller_hooks_contrib/rthooks/pyi_rth_pythoncom.py,sha256=HYSYLvFIWF2p_-VBreDLFLLkux2WzUFvxJX3dmuDyu8,1259 +_pyinstaller_hooks_contrib/rthooks/pyi_rth_pywintypes.py,sha256=HYSYLvFIWF2p_-VBreDLFLLkux2WzUFvxJX3dmuDyu8,1259 +_pyinstaller_hooks_contrib/rthooks/pyi_rth_tensorflow.py,sha256=5iE26zQTgDcjxvnSKy_CCXpJOLVN9-6cQEeFpb_8h34,2665 +_pyinstaller_hooks_contrib/rthooks/pyi_rth_traitlets.py,sha256=6zxDqoyDuCwvg7u-Xu13zsW1hN58Ns8TGqEA06mytow,806 +_pyinstaller_hooks_contrib/rthooks/pyi_rth_usb.py,sha256=_FTLys4_Nj-9oYM0n8N-_d9P5TQ5Z7D3Z_-FRcXheMg,2799 +_pyinstaller_hooks_contrib/stdhooks/__init__.py,sha256=XqTB__uJKeDTb84jwHlEmqemORWifP5u1Qi4lRzoTqo,420 +_pyinstaller_hooks_contrib/stdhooks/__pycache__/__init__.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-BTrees.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-CTkMessagebox.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Crypto.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Cryptodome.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-HtmlTestRunner.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-IPython.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-OpenGL.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-OpenGL_accelerate.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-PyTaskbar.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-Xlib.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-_mssql.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-_mysql.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-accessible_output2.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adbutils.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-adios.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-afmformats.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-aliyunsdkcore.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-altair.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-amazonproduct.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-anyio.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-appdirs.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-appy.pod.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-apscheduler.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-argon2.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astor.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astroid.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astropy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-astropy_iers_data.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-av.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-avro.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-azurerm.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-backports.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-backports.zoneinfo.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bacon.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bcrypt.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bitsandbytes.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bleak.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-blspy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-bokeh.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-boto.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-boto3.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-botocore.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-branca.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cairocffi.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cairosvg.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-capstone.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cassandra.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-celpy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-certifi.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cf_units.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cftime.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-charset_normalizer.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cloudpickle.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cloudscraper.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-clr.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-clr_loader.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cmocean.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-compliance_checker.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-comtypes.client.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-countrycode.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-countryinfo.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cryptography.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-customtkinter.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cv2.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cx_Oracle.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-cytoolz.itertoolz.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_bootstrap_components.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_core_components.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_html_components.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_renderer.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_table.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dash_uploader.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dask.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-datasets.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dateparser.utils.strptime.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dbus_fast.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dclab.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-detectron2.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-discid.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-distorm3.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dns.rdata.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docutils.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docx.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-docx2pdf.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-dynaconf.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-easyocr.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eel.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-enchant.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eng_to_ipa.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ens.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-enzyme.parsers.ebml.core.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_abi.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_account.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_hash.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_keyfile.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_keys.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_rlp.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_typing.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_utils.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-eth_utils.network.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-exchangelib.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fabric.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fairscale.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-faker.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-falcon.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fastai.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fastparquet.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ffpyplayer.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fiona.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flask_compress.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flask_restx.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flex.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-flirpy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fmpy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-folium.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-freetype.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-fvcore.nn.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gadfly.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gbulb.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gcloud.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-geopandas.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gitlab.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gmplot.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gmsh.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gooey.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.api_core.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.bigquery.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.core.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.kms_v1.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.pubsub_v1.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.speech.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.storage.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-google.cloud.translate.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-googleapiclient.model.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-grapheme.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-graphql_query.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-great_expectations.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gribapi.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-grpc.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gst._gst.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-gtk.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-h3.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-h5py.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hdf5plugin.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hexbytes.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-httplib2.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-humanize.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-hydra.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ijson.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imageio.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-imageio_ffmpeg.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-iminuit.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-iso639.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-itk.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jaraco.text.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jedi.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jieba.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jinja2.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jinxed.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jira.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonpath_rw_ext.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonrpcserver.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonschema.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jsonschema_specifications.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-jupyterlab.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-kaleido.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-khmernltk.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-kinterbasdb.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langchain.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langcodes.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-langdetect.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-laonlp.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lark.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ldfparser.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lensfunpy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-libaudioverse.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-librosa.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lightgbm.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lightning.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-limits.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-linear_operator.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lingua.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-litestar.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-llvmlite.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-logilab.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.etree.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.isoschematron.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lxml.objectify.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-lz4.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-magic.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mako.codegen.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mariadb.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-markdown.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mecab.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-metpy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-migrate.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mimesis.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-minecraft_launcher_lib.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mistune.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mnemonic.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-monai.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-moviepy.audio.fx.all.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-moviepy.video.fx.all.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-mpl_toolkits.basemap.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-msoffcrypto.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nacl.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-names.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nanite.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbconvert.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbdime.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbformat.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nbt.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ncclient.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-netCDF4.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nltk.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nnpy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-notebook.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numba.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numbers_parser.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-numcodecs.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cublas.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_cupti.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_nvcc.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_nvrtc.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cuda_runtime.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cudnn.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cufft.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.curand.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cusolver.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.cusparse.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nccl.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nvjitlink.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-nvidia.nvtx.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-office365.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-onnxruntime.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-opencc.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-openpyxl.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-opentelemetry.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-orjson.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-osgeo.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pandas_flavor.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-panel.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-parsedatetime.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-parso.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-passlib.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-paste.exceptions.reporter.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-patoolib.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-patsy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pdfminer.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pendulum.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-phonenumbers.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pingouin.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pint.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pinyin.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-platformdirs.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-plotly.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pptx.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-prettytable.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psutil.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psychopy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-psycopg2.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-publicsuffix2.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pubsub.core.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-puremagic.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-py.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyarrow.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycountry.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycparser.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pycrfsuite.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydantic.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydicom.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pydivert.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-io.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-ods.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-ods3.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-odsr.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xls.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xlsx.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel-xlsxw.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_io.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_ods.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_ods3.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_odsr.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xls.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xlsx.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcel_xlsxw.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyexcelerate.Writer.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pygraphviz.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pygwalker.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylibmagic.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylint.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pylsl.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymediainfo.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymorphy3.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pymssql.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pynput.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyodbc.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyopencl.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypemicro.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyphen.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyppeteer.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyproj.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypsexec.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pypylon.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyqtgraph.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyshark.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pysnmp.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pystray.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pytest.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pythainlp.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pythoncom.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyttsx.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyttsx3.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyviz_comms.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pyvjoy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pywintypes.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-pywt.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-qtmodern.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-radicale.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-raven.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rawpy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rdflib.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-redmine.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-regex.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-reportlab.lib.utils.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-reportlab.pdfbase._fontdata.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-resampy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rlp.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rpy2.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rtree.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-rubicon.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sacremoses.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-saml2.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-schwifty.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-seedir.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-selenium.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sentry_sdk.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-setuptools_scm.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-shapely.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-shotgun_api3.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-simplemma.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.color.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.data.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.draw.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.exposure.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.feature.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.filters.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.future.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.graph.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.io.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.measure.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.metrics.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.morphology.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.registration.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.restoration.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skimage.transform.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.cluster.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.linear_model.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.cluster.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.metrics.pairwise.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.neighbors.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.tree.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sklearn.utils.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-skyfield.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-slixmpp.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sound_lib.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sounddevice.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-soundfile.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spacy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-speech_recognition.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spiceypy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-spnego.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-srsly.msgpack._packer.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sspilib.raw.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-statsmodels.tsa.statespace.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-stdnum.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-storm.database.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sudachipy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sunpy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sv_ttk.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-swagger_spec_validator.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-sympy.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tableauhyperapi.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tables.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tcod.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tensorflow.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-text_unidecode.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-textdistance.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-thinc.backends.numpy_ops.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-thinc.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-timezonefinder.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-timm.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tinycss2.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_cocoa.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_gtk.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-toga_winforms.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torch.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchaudio.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchtext.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchvision.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-torchvision.io.image.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_client.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_code.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_components.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_datagrid.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_deckgl.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_formkit.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_grid.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_iframe.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_keycloak.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_leaflet.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_markdown.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_matplotlib.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_mesh_streamer.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_plotly.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_pvui.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_quasar.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_rca.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_router.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_simput.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_tauri.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_tweakpane.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vega.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtk.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtk3d.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vtklocal.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_vuetify.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trame_xterm.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-transformers.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-travertino.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-trimesh.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-triton.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ttkthemes.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ttkwidgets.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tzdata.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-tzwhere.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-u1db.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-ultralytics.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-umap.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-unidecode.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uniseg.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-usb.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uvicorn.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-uvloop.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vaderSentiment.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-vtkpython.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wavefile.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-weasyprint.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-web3.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webassets.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webrtcvad.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-websockets.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-webview.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-win32com.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wordcloud.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-workflow.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.lib.activex.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.lib.pubsub.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-wx.xrc.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xarray.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xml.dom.html.HTMLDocument.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xml.sax.saxexts.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xmldiff.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xmlschema.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xsge_gui.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-xyzservices.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-yapf_third_party.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-z3c.rml.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zeep.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zmq.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/__pycache__/hook-zoneinfo.cpython-311.pyc,, +_pyinstaller_hooks_contrib/stdhooks/hook-BTrees.py,sha256=7H9uPnxAIrlAlMRCpdB5R3EbW-A5LIwzQAGRqvYG3-s,581 +_pyinstaller_hooks_contrib/stdhooks/hook-CTkMessagebox.py,sha256=02LmjIn8U1VELdrxTS0a35PutAP4nKF8ZR99WfIwxvE,663 +_pyinstaller_hooks_contrib/stdhooks/hook-Crypto.py,sha256=ImifI41XPN7GRu8DXatzHp4gC0mcFeIYIjnsgNRABq4,2320 +_pyinstaller_hooks_contrib/stdhooks/hook-Cryptodome.py,sha256=a_fbq7kjC1Zz7qjX5UDYFww7jXZ_Np0PVRE9wY1rCHI,1441 +_pyinstaller_hooks_contrib/stdhooks/hook-HtmlTestRunner.py,sha256=thy5tcQy3lL8tYq_PVJKeqXH1XkOQwlz2xMYvNPDVHc,598 +_pyinstaller_hooks_contrib/stdhooks/hook-IPython.py,sha256=kKCfeaEb5xK2cfzsL0APdYiWOM-j3X2oPLtpOS1XaFY,1358 +_pyinstaller_hooks_contrib/stdhooks/hook-OpenGL.py,sha256=W-blhzRK3eicSxqRQ4tviS9svMs1nIX2DcML0fxeEgU,2153 +_pyinstaller_hooks_contrib/stdhooks/hook-OpenGL_accelerate.py,sha256=5yYETP_dLQwMiTaJMdPxTZPl7gqnVL11gyFcQkoTIf4,761 +_pyinstaller_hooks_contrib/stdhooks/hook-PyTaskbar.py,sha256=hu3r-jyXMpgGe5d6oT4WTKHsadgxvdkCMPRJt3r-JBw,516 +_pyinstaller_hooks_contrib/stdhooks/hook-Xlib.py,sha256=5xU-W0ViBe9fJzkCn9N0hwXQcotayyIJeJEhiDLFNGU,520 +_pyinstaller_hooks_contrib/stdhooks/hook-_mssql.py,sha256=V_j3fb9LsniyK2lWFHnpYLU_s2B2hIk0wEcFQbmye44,446 +_pyinstaller_hooks_contrib/stdhooks/hook-_mysql.py,sha256=7xdzIT7I98Sskkr4khJDGFqdl9wzr7BykdwZWDwGWgE,544 +_pyinstaller_hooks_contrib/stdhooks/hook-accessible_output2.py,sha256=Ua9KkGnbwt-vZqVBIDTQyI-CWRnonhz1RrxTUMrV8HQ,606 +_pyinstaller_hooks_contrib/stdhooks/hook-adbutils.py,sha256=QF2KWHkLivI_UaZLavIRYXdG_x4QnFmX5Wg10vF86Pw,1068 +_pyinstaller_hooks_contrib/stdhooks/hook-adios.py,sha256=3QjwQJxqlXbxDFZLE5V6KxlB5wKe7EWnQ4CPdeGiork,514 +_pyinstaller_hooks_contrib/stdhooks/hook-afmformats.py,sha256=GigubbKoElF8fyK11_ZjoWl_qATq29-o27GczSDAxNg,582 +_pyinstaller_hooks_contrib/stdhooks/hook-aliyunsdkcore.py,sha256=69Q48xGmEUNWohujaq8wgrzl5u-9Jf_EAWF0QblmYeU,520 +_pyinstaller_hooks_contrib/stdhooks/hook-altair.py,sha256=bt3IHynMXZPiD_Lgo_o4WkJ7YcaVfJx6fqGte1nSsOw,514 +_pyinstaller_hooks_contrib/stdhooks/hook-amazonproduct.py,sha256=l0CZhE6sGsuQNSW5B4pXkS0ggLPhf3HbpqSAqAsDL2o,1063 +_pyinstaller_hooks_contrib/stdhooks/hook-anyio.py,sha256=_JkaNd7mliBObKBivEGOJr7PME8fj0x-k7v4v-vfyps,652 +_pyinstaller_hooks_contrib/stdhooks/hook-appdirs.py,sha256=zyPFyUQeR2msS9V_jCqkHlbxKEI4F7fwcenRR_-_VPo,736 +_pyinstaller_hooks_contrib/stdhooks/hook-appy.pod.py,sha256=zXYSVcOaM1Rd5-7XHbdhXcPkXdp2F_Q-2haf-ePtTPM,584 +_pyinstaller_hooks_contrib/stdhooks/hook-apscheduler.py,sha256=JYZ3WCI-UvxHxlkub7BPtcgAC7rIvnmZu_lv8ug4SfE,958 +_pyinstaller_hooks_contrib/stdhooks/hook-argon2.py,sha256=uL9MNx-TVv7xkU6Yna7ZAut_lpmhfU3JtlxqXZPeCz8,455 +_pyinstaller_hooks_contrib/stdhooks/hook-astor.py,sha256=39fA7fjiii_16lKjKfIloHL_XBLZmiLY51EiVLDsdUc,513 +_pyinstaller_hooks_contrib/stdhooks/hook-astroid.py,sha256=c3vLz5R9gpXH1LMgGmgK2M4AyO6GNbjh5F2l9W4wM64,2096 +_pyinstaller_hooks_contrib/stdhooks/hook-astropy.py,sha256=VHGCBTgpzR91qWHyY6RJYvRhpc7dgAGjHLu6WiaHVUM,1744 +_pyinstaller_hooks_contrib/stdhooks/hook-astropy_iers_data.py,sha256=V_rB5H1YPNN8lDpMgItXXPjc5XGLdhm76U0L7I52mZw,581 +_pyinstaller_hooks_contrib/stdhooks/hook-av.py,sha256=j-tpSaAvpyiixxF98-WM-hdVm2kH1dFFDbJwv_4tvtY,2082 +_pyinstaller_hooks_contrib/stdhooks/hook-avro.py,sha256=RRQmqN-5RXPobRHPHO5vNnv-ZPzeQ-0lRoWknxWEkK4,981 +_pyinstaller_hooks_contrib/stdhooks/hook-azurerm.py,sha256=r9O9s3r438qfrR_gFEipp4DzoiVzdxVclosv53Vum0Y,838 +_pyinstaller_hooks_contrib/stdhooks/hook-backports.py,sha256=r0UIln-d8ep_5CTIr1dfV3mHd8SnbJfKgoBVhUbcSp8,905 +_pyinstaller_hooks_contrib/stdhooks/hook-backports.zoneinfo.py,sha256=99A9LN6khAbUAQfey6FaTHtdGZEaaOjavxwawAzbTdo,595 +_pyinstaller_hooks_contrib/stdhooks/hook-bacon.py,sha256=lqd0CnY45BUEVurtqc1VV92ltGnOjjTKfErgLeeBW-w,1675 +_pyinstaller_hooks_contrib/stdhooks/hook-bcrypt.py,sha256=hhNZqKFF5qODocZJ5lBRFdDtJdRBYoiryhtOoSn0jbc,505 +_pyinstaller_hooks_contrib/stdhooks/hook-bitsandbytes.py,sha256=qRx2M9xhKA4qVKLTWYDIee4SlkN4T6z1b5exIssYC3w,1117 +_pyinstaller_hooks_contrib/stdhooks/hook-bleak.py,sha256=Zm9WX0NmPZPbdTh-6pXhO0GFqvKFzXoGBarYngpXk0M,702 +_pyinstaller_hooks_contrib/stdhooks/hook-blspy.py,sha256=KCo9qWmcFhveIvngEgyNALozIAVKp-9DyaE7hs6F9rw,1407 +_pyinstaller_hooks_contrib/stdhooks/hook-bokeh.py,sha256=-8OUbeppabAY3qVGLWtJC0tqMbgq0W1yvBnKCU4pD4w,922 +_pyinstaller_hooks_contrib/stdhooks/hook-boto.py,sha256=JUGaLqkuSl8u7bO5UlEBoC0T3semsBxQlpr_yDxokUM,786 +_pyinstaller_hooks_contrib/stdhooks/hook-boto3.py,sha256=pI5miSDkHOUA9qHlh4-0lD8odMRD09NS-rLCXU0r-xQ,999 +_pyinstaller_hooks_contrib/stdhooks/hook-botocore.py,sha256=N3hZC_AoVGhB03Pk-nVmM5ezpXtrfaVaEPYwPLZ6sJ8,1067 +_pyinstaller_hooks_contrib/stdhooks/hook-branca.py,sha256=fYU2gaKNBRbG399Vif6CR61fPnDXkr1mzyihcG6cSqM,514 +_pyinstaller_hooks_contrib/stdhooks/hook-cairocffi.py,sha256=xFSRmFXxpK5g4cSfEyUHNMZiJZ-YQ1gzujICk056ch8,1596 +_pyinstaller_hooks_contrib/stdhooks/hook-cairosvg.py,sha256=LtlVNSqrF7mVxHZSYPY1n_8zZUqNhRYG-FuvRgAxkgQ,1303 +_pyinstaller_hooks_contrib/stdhooks/hook-capstone.py,sha256=aaFGgiFLPyUBTtsUQdU6bfzWNTDt6OfzhcaEJloxxrE,562 +_pyinstaller_hooks_contrib/stdhooks/hook-cassandra.py,sha256=-VhGeIvcKJJi8Okp3_cGGKBjStNr8iAB7H-8i1lqr8Q,832 +_pyinstaller_hooks_contrib/stdhooks/hook-celpy.py,sha256=k7jxOzOFwfwXI7cHslOivG6MSuQOWAqv5cwk7bejuts,979 +_pyinstaller_hooks_contrib/stdhooks/hook-certifi.py,sha256=kCFePXDxRwHIQdgFe4DeV-RhS-n33EGeApVuetO9omA,735 +_pyinstaller_hooks_contrib/stdhooks/hook-cf_units.py,sha256=13FWN2RadSk-yJuUkyjGUwqu9yP1xuJzWff5jKWmUS0,591 +_pyinstaller_hooks_contrib/stdhooks/hook-cftime.py,sha256=3rVzaTYOkzhwKOYGO5hpzKJt2dM45hPIUlJTMz01DA4,605 +_pyinstaller_hooks_contrib/stdhooks/hook-charset_normalizer.py,sha256=B9lqK-U2QxEjzf1zUUdZmiXRi9satc2xBGtvp5vIb-0,586 +_pyinstaller_hooks_contrib/stdhooks/hook-cloudpickle.py,sha256=HIrogozsv_bflq62cOENJ80BwrRzgZ2TH2r4zx5oPbA,776 +_pyinstaller_hooks_contrib/stdhooks/hook-cloudscraper.py,sha256=DUQsQhydlJBLnrJ5lLTvxA3CHKXZr4jfPkw1EhRlN04,520 +_pyinstaller_hooks_contrib/stdhooks/hook-clr.py,sha256=HkUhiIpLUJ1sZPpsrIvZtKLnJDRGvkVsKPgt8ERGfaI,2600 +_pyinstaller_hooks_contrib/stdhooks/hook-clr_loader.py,sha256=r6shf_xCOoGitgm3mje_tmpvOyCuPzZHmRpG9QPAMRs,954 +_pyinstaller_hooks_contrib/stdhooks/hook-cmocean.py,sha256=vwCbQwhokfcEO9Mt1jVSY952Nnxlv-QNort_Hj5v0AA,529 +_pyinstaller_hooks_contrib/stdhooks/hook-compliance_checker.py,sha256=wM6-xACzS3QuiXcXbNNvCqN_yx66bQu5hAWLirMYk-U,988 +_pyinstaller_hooks_contrib/stdhooks/hook-comtypes.client.py,sha256=iN0OgoMpMvIk1b3_ax9IdFyjKD3DSVDC4n3f3Dm7iwk,683 +_pyinstaller_hooks_contrib/stdhooks/hook-countrycode.py,sha256=1hqqPNPpQxOw78iFqOjkPv0JhpOD9_eiGZQRmuoNF5Y,519 +_pyinstaller_hooks_contrib/stdhooks/hook-countryinfo.py,sha256=z_QVmMe89k1f5n4R23mUQi2wUxiCdKvpU9LlKEGmQ_0,565 +_pyinstaller_hooks_contrib/stdhooks/hook-cryptography.py,sha256=oPbDqHZW9TSd2BYX6oxP3YSSPFv2S2WhY9mnpKkoVhs,5815 +_pyinstaller_hooks_contrib/stdhooks/hook-customtkinter.py,sha256=po89SWrZ1MnlliL1rpaiOdrdR7SZ3sYgeNA-IKdOCpE,520 +_pyinstaller_hooks_contrib/stdhooks/hook-cv2.py,sha256=2D7U2s8858uZk64zKFEIVLAylkjcSKj0no6T362aBMU,8117 +_pyinstaller_hooks_contrib/stdhooks/hook-cx_Oracle.py,sha256=_UwEKqFgJmFfipDEBw9_L6ZFTTkHvaPBfzNhLAREhEo,449 +_pyinstaller_hooks_contrib/stdhooks/hook-cytoolz.itertoolz.py,sha256=Sd_M-AavngziR768WUNTDA0MqQJR2-_u-6ZXbrgWy8s,614 +_pyinstaller_hooks_contrib/stdhooks/hook-dash.py,sha256=JrWymJXOyzHaHHkVoezeLA-pSqKshptuwtJE_eG0AhE,512 +_pyinstaller_hooks_contrib/stdhooks/hook-dash_bootstrap_components.py,sha256=6D7QdcZoxz-g_8Tkunk8TI5i37TY2sDTkDgdAQp4jI0,533 +_pyinstaller_hooks_contrib/stdhooks/hook-dash_core_components.py,sha256=wc5HQi5SGVkduizRW334gtF_oK3G6rBRRC-lnz4gGw4,528 +_pyinstaller_hooks_contrib/stdhooks/hook-dash_html_components.py,sha256=7GCOEhBFjj-T8qLzN6h5KkkrkSXC-t9K1ih303pkQ-0,528 +_pyinstaller_hooks_contrib/stdhooks/hook-dash_renderer.py,sha256=wSmHKr_Kxi8V072QfEYaau1AhnfaXJfdrNsyprRVZLY,521 +_pyinstaller_hooks_contrib/stdhooks/hook-dash_table.py,sha256=GEeJRc0W2nl0YYmCmqMQIuRgexUErPSNqnfLoMmUg1o,518 +_pyinstaller_hooks_contrib/stdhooks/hook-dash_uploader.py,sha256=TqkZRZUpSBqwoYQn4zutn2sg6relzM5-TZFwXATTT9s,521 +_pyinstaller_hooks_contrib/stdhooks/hook-dask.py,sha256=RyVKpErefI3rx7k5aWdXXalIS3_sObOhS8ki3I8P4X0,636 +_pyinstaller_hooks_contrib/stdhooks/hook-datasets.py,sha256=L508elVV7ax33mODkIR3zrkCnahihoH7UIjheGAzCkM,557 +_pyinstaller_hooks_contrib/stdhooks/hook-dateparser.utils.strptime.py,sha256=wp34VFRBNFRL5WE99cFNe7IH56n11ydsToVj4JLh6gE,608 +_pyinstaller_hooks_contrib/stdhooks/hook-dbus_fast.py,sha256=fWCWWH1HVQcSttJs75snPaUJQGDJ3S01oMnr-hJjnJk,601 +_pyinstaller_hooks_contrib/stdhooks/hook-dclab.py,sha256=CfGdIi5A3LiYpmq36m3cSwk2by3PeZJO-jvZRgM7XhU,567 +_pyinstaller_hooks_contrib/stdhooks/hook-detectron2.py,sha256=L508elVV7ax33mODkIR3zrkCnahihoH7UIjheGAzCkM,557 +_pyinstaller_hooks_contrib/stdhooks/hook-discid.py,sha256=qh4NpkcK8iGOaZTlDaFzSZs1_vn77ZxJAr_cEVleoRg,1424 +_pyinstaller_hooks_contrib/stdhooks/hook-distorm3.py,sha256=2_5Bog4d91cSmurO9g3LOgHkeYr293elZ4-EJjKjGu8,736 +_pyinstaller_hooks_contrib/stdhooks/hook-dns.rdata.py,sha256=4qJuSXX7pXMEfAKtLA4nfzOY_wglG_AHV3JIKUEZQK4,577 +_pyinstaller_hooks_contrib/stdhooks/hook-docutils.py,sha256=92774IR5j_D9YEL2lFNB31k01Y5jCZg2iqsazEoAxps,798 +_pyinstaller_hooks_contrib/stdhooks/hook-docx.py,sha256=KMXfmjt7AnJoeTS6hfhNBJUggZMti1liAl4kD5hpQxk,512 +_pyinstaller_hooks_contrib/stdhooks/hook-docx2pdf.py,sha256=FKJp5FKPzgSsZFu8YxdNrKwMSbk-6vZvT2hma02vaS0,624 +_pyinstaller_hooks_contrib/stdhooks/hook-dynaconf.py,sha256=Ss3Gq19q0S9mbBRWVNH6k0_JgFMz-ZXUA68QNYmOUbw,569 +_pyinstaller_hooks_contrib/stdhooks/hook-easyocr.py,sha256=Y_Q-FawbXomqbqHzMxPF8yqo-8c-6dyCx4_rGrUXyjw,793 +_pyinstaller_hooks_contrib/stdhooks/hook-eel.py,sha256=AacHCZd4184RbnUFOLTYbkmKkJEQkGr3LdMqn1UXiBc,548 +_pyinstaller_hooks_contrib/stdhooks/hook-enchant.py,sha256=6mswnI2jCHY18DS5J4wnmHvrDAGKr8yBhBHzCe4j1uY,2851 +_pyinstaller_hooks_contrib/stdhooks/hook-eng_to_ipa.py,sha256=YDRMsxwI9VzlZn69TwuYiMC4jv-7elcnO3IEYFnRw2E,518 +_pyinstaller_hooks_contrib/stdhooks/hook-ens.py,sha256=3vC3d_ENo5JdDSq2ajWKfnR5WKC2OJQOdPJqjtn7sLA,511 +_pyinstaller_hooks_contrib/stdhooks/hook-enzyme.parsers.ebml.core.py,sha256=yS_g1AxOW2-R-1xKtBK0Q9EC_D9ylhVBrirH9tJ0-zY,722 +_pyinstaller_hooks_contrib/stdhooks/hook-eth_abi.py,sha256=NHm7ncjWCD_l2XdP6vBaxz5y516U_IL1P4YevtTtuRM,505 +_pyinstaller_hooks_contrib/stdhooks/hook-eth_account.py,sha256=wjvWKcrTK2fWp6S4pEm-o8NYc3g9mCbHVZuU035zFrc,509 +_pyinstaller_hooks_contrib/stdhooks/hook-eth_hash.py,sha256=lzNsLR5kuz2sXXxkym0HTko_393jucPnFCQDQd_g7zg,814 +_pyinstaller_hooks_contrib/stdhooks/hook-eth_keyfile.py,sha256=CYTnYWvRKUwVEjUTF1-O8gA3_uqKOHZpZJryaFVSFPc,509 +_pyinstaller_hooks_contrib/stdhooks/hook-eth_keys.py,sha256=4r5kmLTtARNZza-JoJP1rLL2RExMrwbxrTtxBsLIIQg,667 +_pyinstaller_hooks_contrib/stdhooks/hook-eth_rlp.py,sha256=kQWMVCiyc4htFsk1JySBkj74Q0QqrSjcD-C-C_xn5yI,643 +_pyinstaller_hooks_contrib/stdhooks/hook-eth_typing.py,sha256=c6ywwe1EhToKTbCbGmUGK6RUTD8oVwP5DGM6rl5JKPI,586 +_pyinstaller_hooks_contrib/stdhooks/hook-eth_utils.network.py,sha256=1dmUGrCLFa_xkiF5fNDYUom4SjnnI2t9yd5XSXl32Lw,517 +_pyinstaller_hooks_contrib/stdhooks/hook-eth_utils.py,sha256=ORE3BzSrHBDzqMjFR88iTm5VOvL7EPOjgLgP3caXoPU,507 +_pyinstaller_hooks_contrib/stdhooks/hook-exchangelib.py,sha256=PjUxCRbRboGbLZzFeehWOhPzr0jO11AYstKtsFQvRkw,447 +_pyinstaller_hooks_contrib/stdhooks/hook-fabric.py,sha256=H87in7hd-RG6PfQTmEulm_mG0sbs5rG3-H8gWfct96A,733 +_pyinstaller_hooks_contrib/stdhooks/hook-fairscale.py,sha256=c_35rJ4w0apax7S0Pnkz7gN0oM3fmbGYhhp1eo9rfHk,557 +_pyinstaller_hooks_contrib/stdhooks/hook-faker.py,sha256=6MMBGNG0oZC4wiq4FnFxqRimXOoNUHDeO8QCxNqdbfg,685 +_pyinstaller_hooks_contrib/stdhooks/hook-falcon.py,sha256=qOelGQSufRVtgZNH0DFMQtPFAl-9UbYXkgWIEIB74qg,1194 +_pyinstaller_hooks_contrib/stdhooks/hook-fastai.py,sha256=L508elVV7ax33mODkIR3zrkCnahihoH7UIjheGAzCkM,557 +_pyinstaller_hooks_contrib/stdhooks/hook-fastparquet.py,sha256=y3QWOzrz-Ra8H18SWDujD9dozbkzXR8BPesRWReYN-U,1469 +_pyinstaller_hooks_contrib/stdhooks/hook-ffpyplayer.py,sha256=WD4t4z-SQHZAe-bqIKVEwrWbIUhxQNn6io5PnPWL6UY,741 +_pyinstaller_hooks_contrib/stdhooks/hook-fiona.py,sha256=IjYbiaUeeKB_gq4lPM6OJDLAnXjLyiIyW5jp3cNZ_JA,860 +_pyinstaller_hooks_contrib/stdhooks/hook-flask_compress.py,sha256=UMHjLHHYDtnW50Y_MtQUZqJX0-cimZJsJsA3El6ZUJc,512 +_pyinstaller_hooks_contrib/stdhooks/hook-flask_restx.py,sha256=KnTudaPgYyQXgmDtjYQUJ_lVkUc9hvZOLNNO_Fa_LHo,546 +_pyinstaller_hooks_contrib/stdhooks/hook-flex.py,sha256=q7mHzzXLkNUYRZNJRz-60lvuPtHYoPYd3MUxue5Lh5E,551 +_pyinstaller_hooks_contrib/stdhooks/hook-flirpy.py,sha256=xmI3ET8t0j3rVUbN_4foknfB1W9QGFRZq0l6pa3u4h8,650 +_pyinstaller_hooks_contrib/stdhooks/hook-fmpy.py,sha256=ZLsw9nwYplOC9AZpYRS08WYech5yNW3LdYmbL1-oTqE,799 +_pyinstaller_hooks_contrib/stdhooks/hook-folium.py,sha256=J81aLD-9FBtrnO1XhRpZUQ6qNoRpvBkByYa45Xs_FbI,547 +_pyinstaller_hooks_contrib/stdhooks/hook-freetype.py,sha256=t1qrKUdxYInJIt0pplH-vsvLyt-YUJsbLobgPN0dGq4,584 +_pyinstaller_hooks_contrib/stdhooks/hook-fvcore.nn.py,sha256=L508elVV7ax33mODkIR3zrkCnahihoH7UIjheGAzCkM,557 +_pyinstaller_hooks_contrib/stdhooks/hook-gadfly.py,sha256=9mUNliNadIqvXXvQth9EPB6LdBfPWSbMYwumdy9m8NA,449 +_pyinstaller_hooks_contrib/stdhooks/hook-gbulb.py,sha256=QMzeWRQmulGUFSBGcyfjxTP3iDz_sf5ItOVyiENGCN4,574 +_pyinstaller_hooks_contrib/stdhooks/hook-gcloud.py,sha256=2g2hKGl7Zrvrqf3LoStiJlKyt-8HQsghwOCyxtyx2R4,793 +_pyinstaller_hooks_contrib/stdhooks/hook-geopandas.py,sha256=f48s1JU_xMkNmMqP_SC1mFsEP_wDmh6T3N0jWd6vGBE,536 +_pyinstaller_hooks_contrib/stdhooks/hook-gitlab.py,sha256=aG2RH2UnKEwxnWNRbC5qpiOF7_K0CC56TOS-lDaXtl0,735 +_pyinstaller_hooks_contrib/stdhooks/hook-gmplot.py,sha256=3ushmjY5pSdT1NogR2UQ7Gx6ICcBNCyvuoKb3-vSXsQ,519 +_pyinstaller_hooks_contrib/stdhooks/hook-gmsh.py,sha256=LDtlKdCjMuk5pCq-BC962k9LFvfDMpUy5y8GSNj0t98,999 +_pyinstaller_hooks_contrib/stdhooks/hook-gooey.py,sha256=bqarqbH4UYL6HayuYlxlwpdbupmsX6bh6wiaH_Bf0YQ,589 +_pyinstaller_hooks_contrib/stdhooks/hook-google.api_core.py,sha256=2bn_nmbQSXYrIryWoWSiQKZc_n366zmRGaygkb5CLF8,513 +_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.bigquery.py,sha256=HC9mpFSO_64lDE0NPt1x6jJ-8jDjQSJD5R8sclQ0bB8,616 +_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.core.py,sha256=KS3LQpaY_QdbB7dukd9-A4_XwlfNpZAAu7eFnABVHe8,515 +_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.kms_v1.py,sha256=63WBtHUc0Cmd5jaGGuDXpC7nfvMjy6B8GGs4Kr4hfHQ,709 +_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.pubsub_v1.py,sha256=NBN0AvXonoi8gVC7mbO9GcEkpgqvTJusw77cf8x9d58,517 +_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.speech.py,sha256=IDmBkM2IXW9stcNaPEZmdpo8zCyNJN_lARhDx3USKYE,517 +_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.storage.py,sha256=IPIqFK6fbDn1pfBoZz9Qblh3fd9yzFvv7tmEgcB52AM,518 +_pyinstaller_hooks_contrib/stdhooks/hook-google.cloud.translate.py,sha256=qEs34x4eIHlMbgXEYlF_lWsoS7WueJT4MuaVRrU3P3A,520 +_pyinstaller_hooks_contrib/stdhooks/hook-googleapiclient.model.py,sha256=E-iDIuZc6ZVAdREtV3N3HLpytuL6I8ZQEtiUanbYlCo,852 +_pyinstaller_hooks_contrib/stdhooks/hook-grapheme.py,sha256=qZDgWdsOXerr29TAVkT6Kf74WnAWL_4Sln-09f-t_tA,516 +_pyinstaller_hooks_contrib/stdhooks/hook-graphql_query.py,sha256=KJUnT5Mw7j2bRecW2sRQ6qCRtUUuzF9r6wJ5lqWb-Ow,623 +_pyinstaller_hooks_contrib/stdhooks/hook-great_expectations.py,sha256=lGEsG7c8SCYYqTTkIq5-lFH5y8HXumf0XiE6wnj7J1k,526 +_pyinstaller_hooks_contrib/stdhooks/hook-gribapi.py,sha256=3MYOhV30T2NYugbHORnjj4B8DcoUFdNnjlMscYAdMKs,3607 +_pyinstaller_hooks_contrib/stdhooks/hook-grpc.py,sha256=LOSNA9INFfZNN3ExRQgVuof--iX63covoc_Qak_Vf8M,512 +_pyinstaller_hooks_contrib/stdhooks/hook-gst._gst.py,sha256=pUwgQGZvZcqc0B17mKrQkjO9HK6LJVvT2bOESNH0CaU,1324 +_pyinstaller_hooks_contrib/stdhooks/hook-gtk.py,sha256=fsCK_gJ-Gr3wQwp6KKA3Schnp5M7fCaHVKW_17aSEXU,667 +_pyinstaller_hooks_contrib/stdhooks/hook-h3.py,sha256=l02ffSxT6gn8TGL-Gy6Ckp7S3wwHTZNWggBm8NALNWw,633 +_pyinstaller_hooks_contrib/stdhooks/hook-h5py.py,sha256=gBakBqcfHnzCv2_OmERWW2Ec74l_W4i_jKRGlSK5dl4,544 +_pyinstaller_hooks_contrib/stdhooks/hook-hdf5plugin.py,sha256=VXWPfqygkI3MEqgtYwMId1y9stV1hw2cgxzKdClYIPI,583 +_pyinstaller_hooks_contrib/stdhooks/hook-hexbytes.py,sha256=xNwjMe8uKcWA38uvakQD2Ai82Fpnlq2U00vFSEqXRUE,646 +_pyinstaller_hooks_contrib/stdhooks/hook-httplib2.py,sha256=jfXcSWs7-Y6rZnTzMdn8EeWZ2gIrQ853PjJS0Q5EUkU,588 +_pyinstaller_hooks_contrib/stdhooks/hook-humanize.py,sha256=jrrLXtdJHGahTfb9PJ87bYvF_NWeQIeNCdv03Tsq_rs,785 +_pyinstaller_hooks_contrib/stdhooks/hook-hydra.py,sha256=OS29zE6K1PfxfIjqhjrVB0gEBMIGuBItM1PfIrJpfiA,1627 +_pyinstaller_hooks_contrib/stdhooks/hook-ijson.py,sha256=3aBT5U_9srfc87VKclEFjnhfspLFqARnBtVS4eQ4GiE,530 +_pyinstaller_hooks_contrib/stdhooks/hook-imageio.py,sha256=vJhTwA3FFwJtM2PpBYs8KbE61ZMZ2EmAY_5aVoybPvo,793 +_pyinstaller_hooks_contrib/stdhooks/hook-imageio_ffmpeg.py,sha256=2-sPmk5OXOCJM2n4_OFPLLTsjwVdLc5Gm9TPfG-Oyno,905 +_pyinstaller_hooks_contrib/stdhooks/hook-iminuit.py,sha256=N5CFLEfIobQAEBX8QDaC5dXmmRiKeW6hoQiZw1H8oN4,843 +_pyinstaller_hooks_contrib/stdhooks/hook-iso639.py,sha256=1EpKUHp9Is6cXqKg_xZGt2WXD6YzXDvkhvwp1UIEWzQ,546 +_pyinstaller_hooks_contrib/stdhooks/hook-itk.py,sha256=zKRK27k3FbTapA4qND2cRBTpuZLomDytNapCoprjQzA,784 +_pyinstaller_hooks_contrib/stdhooks/hook-jaraco.text.py,sha256=fyTyuTGQtSohmuztyrpqnhNMypIpuDqydCfDgjxgNYw,586 +_pyinstaller_hooks_contrib/stdhooks/hook-jedi.py,sha256=UV5c9XwxrJbidPDmA6XsOxTvz80t2ApH7gwfpB7rw-c,584 +_pyinstaller_hooks_contrib/stdhooks/hook-jieba.py,sha256=0jVycYYGjL1l5VhuzqOuNbrqtH4r8NCsUM2NEazptZ4,513 +_pyinstaller_hooks_contrib/stdhooks/hook-jinja2.py,sha256=FFEjO4CoqIlIFVGrdE1dczGexwhjtpUM3rfI3iMj9rE,452 +_pyinstaller_hooks_contrib/stdhooks/hook-jinxed.py,sha256=4Gb2axZd_-IZOsehrDA77EU3UiJgSinNt3AZ8TqHyZg,498 +_pyinstaller_hooks_contrib/stdhooks/hook-jira.py,sha256=MmTbxQc6MyvmGkkVeCHW2I3LrTu5A9LqYiErBBQnnIc,617 +_pyinstaller_hooks_contrib/stdhooks/hook-jsonpath_rw_ext.py,sha256=g9VVlyJm5vG6WfOFL39F4cAOpzoFQRbeQbLgw9l6Zvg,513 +_pyinstaller_hooks_contrib/stdhooks/hook-jsonrpcserver.py,sha256=uWOOdTGQqG3DvJNXrH5RieeiXp-EiCIyEmj6c4TMSTU,608 +_pyinstaller_hooks_contrib/stdhooks/hook-jsonschema.py,sha256=qmhcVRvyD_Zp18NsI53HIDfG25LdT7Aumw7W4n37Uqs,828 +_pyinstaller_hooks_contrib/stdhooks/hook-jsonschema_specifications.py,sha256=kDKzf09IHlbHzq2Ks4Tl40iN6WrxQfWPjpn3DYnWseI,532 +_pyinstaller_hooks_contrib/stdhooks/hook-jupyterlab.py,sha256=TU3o0IgEU9y9fyv5PsHzsKiadmXvvTxHyLYcLYzUQhk,518 +_pyinstaller_hooks_contrib/stdhooks/hook-kaleido.py,sha256=VQMvkWK3B1bSOmaKUZuSx_BHyAhMW2goRmZzEqGHYas,515 +_pyinstaller_hooks_contrib/stdhooks/hook-khmernltk.py,sha256=9RQud3NQliAQCtgo8hwQaS1Z5TKAc1he4zQ6bfeYMk8,554 +_pyinstaller_hooks_contrib/stdhooks/hook-kinterbasdb.py,sha256=cztOr2aUEqQ8d5qpQpuEAridpYruESuhfxBWSlJ6QoE,843 +_pyinstaller_hooks_contrib/stdhooks/hook-langchain.py,sha256=Ot2OiUOmUdzd_eK3Lmsp-p9N9BjwZvTEYjukprNaxxQ,517 +_pyinstaller_hooks_contrib/stdhooks/hook-langcodes.py,sha256=7hkFTGFSzn0DxY4NV1UEKodps6H6r4bYXUTojIFfhX4,517 +_pyinstaller_hooks_contrib/stdhooks/hook-langdetect.py,sha256=Qz0siDS9evVsqD3_OP2AgNpCz80qZ-hbfWUXs1ELtI4,518 +_pyinstaller_hooks_contrib/stdhooks/hook-laonlp.py,sha256=ZdENgKj_FFxnJfMoylOOouTn9UO2ifsamzT_PaWm-C0,514 +_pyinstaller_hooks_contrib/stdhooks/hook-lark.py,sha256=zQzLT5Uu5jzKTDvGu377iTWbzW77LhJV_W-vDcnmHI0,512 +_pyinstaller_hooks_contrib/stdhooks/hook-ldfparser.py,sha256=EIwxRlqMm2cOBgY6l1kgiJu_mTCX5lAryYty-I4FkZ0,527 +_pyinstaller_hooks_contrib/stdhooks/hook-lensfunpy.py,sha256=mPlp2664ax5tALxpyFiMsl_IQMBb746yMUD4bi8cS1I,665 +_pyinstaller_hooks_contrib/stdhooks/hook-libaudioverse.py,sha256=Y0tna0zcvXUUd5GFAhPWtPYv7wdrrcFt84HPecw-Sm8,598 +_pyinstaller_hooks_contrib/stdhooks/hook-librosa.py,sha256=rGNfBzWJENA4pBcL2r7-mtkQo9itqSu3JMyBfPpP5Yg,1178 +_pyinstaller_hooks_contrib/stdhooks/hook-lightgbm.py,sha256=70sAQmPVTOmG4N2tlwoCx8IAJi4u9L7ETQtFJzST2gI,937 +_pyinstaller_hooks_contrib/stdhooks/hook-lightning.py,sha256=7t0rY7UaocV5G_o09y1tNygCuilGCVX7XMG0sUfqEWw,834 +_pyinstaller_hooks_contrib/stdhooks/hook-limits.py,sha256=KvoW_h8Y_wcVkE_vlFIasuZ4S94kSKYdSlm1Ixg3_KI,514 +_pyinstaller_hooks_contrib/stdhooks/hook-linear_operator.py,sha256=amNNgp4raSBDaxNePyQVBov8_HzAhRflS66FWxljFQ0,542 +_pyinstaller_hooks_contrib/stdhooks/hook-lingua.py,sha256=gesRIVvBsRj3D4FWRY0jyMsQXR9uWs-mxWD3lruevdc,514 +_pyinstaller_hooks_contrib/stdhooks/hook-litestar.py,sha256=xJ3Y0Fj2sbkjFUhXiZIpUUsP9X81Z0bw7iGQ03Xif6o,531 +_pyinstaller_hooks_contrib/stdhooks/hook-llvmlite.py,sha256=B3-ddCSih9fqn8mbdY23YoENrC8s7rNw8WrMiSWgYmA,705 +_pyinstaller_hooks_contrib/stdhooks/hook-logilab.py,sha256=yb-uN2Rg-1ihtwse8jrTjHIMjNU6nmj1bEA4wIrPFNg,939 +_pyinstaller_hooks_contrib/stdhooks/hook-lxml.etree.py,sha256=XF1VE0AnAth1M-K6uYgtMCeFxfamSy7SLC4dH5-iee8,481 +_pyinstaller_hooks_contrib/stdhooks/hook-lxml.isoschematron.py,sha256=sKerEc6cSSX7CkkMWKfLRYHd-mu_iH0iQUrsp_MZXpM,608 +_pyinstaller_hooks_contrib/stdhooks/hook-lxml.objectify.py,sha256=MZX0zqo3_F6E4k0MS2A0iNF6QMGVD9fHhd2Ma0cXv9g,452 +_pyinstaller_hooks_contrib/stdhooks/hook-lxml.py,sha256=luxF2PUPGJFBDZY6Y486XEfhPowPSgzB_AKE-H7Xgig,673 +_pyinstaller_hooks_contrib/stdhooks/hook-lz4.py,sha256=FtaB7EdUUQc85tIhSDLhdTqauinP4RoyaqtQDbacmyk,553 +_pyinstaller_hooks_contrib/stdhooks/hook-magic.py,sha256=tBNg4y0dohfsfx2au3pHY8Sa56zkwRiqd2QdNY2P8o8,630 +_pyinstaller_hooks_contrib/stdhooks/hook-mako.codegen.py,sha256=jxcMKzHiK-n92wy4pA1WNbvZi-j6Icsu6RRU_wI1_z4,608 +_pyinstaller_hooks_contrib/stdhooks/hook-mariadb.py,sha256=8VjEMveHwCNh0SmJhs3IF5BpdrC-vq-oCsf59E4Hilk,1102 +_pyinstaller_hooks_contrib/stdhooks/hook-markdown.py,sha256=GuzXwF811hd-X4plC2JpxsnPZ8_iiXhDp0UcODyDaDg,957 +_pyinstaller_hooks_contrib/stdhooks/hook-mecab.py,sha256=TmOaHmDsVqUhHWqIJs9dKGL-T3AECAVLkGx8KjLj0y0,557 +_pyinstaller_hooks_contrib/stdhooks/hook-metpy.py,sha256=C-jKRq46CqsM8RDxDWvqgJzzjutzdVmbG1QyZZtzsWE,763 +_pyinstaller_hooks_contrib/stdhooks/hook-migrate.py,sha256=wzhAF5oPLYG2SBnK4h_4Rvd-x3hxJvCXYgdZlTutYTE,743 +_pyinstaller_hooks_contrib/stdhooks/hook-mimesis.py,sha256=njbgWuTJAA7W-l-EtiUU6G7xaRO3yP6ifjLJ1n1aScc,616 +_pyinstaller_hooks_contrib/stdhooks/hook-minecraft_launcher_lib.py,sha256=N6mf05sx3DX6pD1brbLuH6ftqMvA4fd_vi97FzBX3ec,529 +_pyinstaller_hooks_contrib/stdhooks/hook-mistune.py,sha256=9_blbpnB___kQ7gGpnJevHCjuGOVG3COt2-r-lgEpds,766 +_pyinstaller_hooks_contrib/stdhooks/hook-mnemonic.py,sha256=7XNJhrD_xeQb-2GX0kc_SeWMpMqIDHs8QV6u6NDGXD8,516 +_pyinstaller_hooks_contrib/stdhooks/hook-monai.py,sha256=P6KfEOWbPSQAjG9v81gKtZN4uz_PAGBMoOIB9eGEEfE,557 +_pyinstaller_hooks_contrib/stdhooks/hook-moviepy.audio.fx.all.py,sha256=JV9JNs53PuDR0Cxs0f2HjdJeqpHPEscnVfAXjJyks3w,682 +_pyinstaller_hooks_contrib/stdhooks/hook-moviepy.video.fx.all.py,sha256=cV4zBHk-_Lv5KX6unZirO_6JaqOSZpCciO0WTAEM19M,682 +_pyinstaller_hooks_contrib/stdhooks/hook-mpl_toolkits.basemap.py,sha256=ON-rPY8kO_IASnjpEeDaHrQXkUmXpzIP03GX-xOyzY8,1283 +_pyinstaller_hooks_contrib/stdhooks/hook-msoffcrypto.py,sha256=6PhHu099kv6aw1SizJFkUvQjyd8uOwHXdrx4jOmFQV4,573 +_pyinstaller_hooks_contrib/stdhooks/hook-nacl.py,sha256=Yl9cJzIOFKxTpmPJQhZZC_0dU3N-wpcumgXftncw_x4,1029 +_pyinstaller_hooks_contrib/stdhooks/hook-names.py,sha256=xT5qJlRMFOoftJfxVTlzamWQDBBp4iS0o8MxVLXPH6Y,610 +_pyinstaller_hooks_contrib/stdhooks/hook-nanite.py,sha256=1WAm5zr93zGp-9tCkSAjAHrn_Ip20EGOWvkCE9KhODc,570 +_pyinstaller_hooks_contrib/stdhooks/hook-nbconvert.py,sha256=hjVfkj9XSy6Cb0oqjXPUMDsOPXFFw0J-WbWVVe5Sf48,663 +_pyinstaller_hooks_contrib/stdhooks/hook-nbdime.py,sha256=KRxL0qDNvWCeYVcaBJZkNiQlxiY8uhbitRVs0-b3PNo,514 +_pyinstaller_hooks_contrib/stdhooks/hook-nbformat.py,sha256=pODKrbD5E56BvJ1igFFFI0zGhNX94ariUckS-FzTyJg,516 +_pyinstaller_hooks_contrib/stdhooks/hook-nbt.py,sha256=uVSdxM8DzSAXrm-Vj4ZUbjbSA1DxAC-O17wx33sXVIM,488 +_pyinstaller_hooks_contrib/stdhooks/hook-ncclient.py,sha256=272a8onLx4TVwQOLgkACgxdB3IFqWSO3gMeTtY75Hy8,862 +_pyinstaller_hooks_contrib/stdhooks/hook-netCDF4.py,sha256=eIijhYxEiYtuOJ7k7kdlfNDb5Jm49UWx7f-Y39m4M-8,1658 +_pyinstaller_hooks_contrib/stdhooks/hook-nltk.py,sha256=muSBoO_ynOKyiAgrrxFG8TEbw8c7PwIz2rRzHYMPg14,808 +_pyinstaller_hooks_contrib/stdhooks/hook-nnpy.py,sha256=ZKFpMzgVuMehm_cGLWb8ABTE0ZEJEmNuCTjEhnn87Zo,503 +_pyinstaller_hooks_contrib/stdhooks/hook-notebook.py,sha256=1wUrdtvTqXi6Q7kBNOnavWY4LIGVbRMPDVjZ3KlQu24,1046 +_pyinstaller_hooks_contrib/stdhooks/hook-numba.py,sha256=G7sHUxTodrq3vBXPw19DwAyG2_lhZVzqzLWnfJ1jxPQ,1029 +_pyinstaller_hooks_contrib/stdhooks/hook-numbers_parser.py,sha256=TkQrE6nvV-DR2pDjUWPqlBRJ2w-e2oGP6CFqrmyGMkk,586 +_pyinstaller_hooks_contrib/stdhooks/hook-numcodecs.py,sha256=gsc_2nebGq6C2ugbvzWOeowavn4Nw-wgyBamPjN7jCM,524 +_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cublas.py,sha256=rvXPfMIVmWjQZMd-d-fXV-m2XnIG4ACHlYPwBk18CfM,686 +_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_cupti.py,sha256=rvXPfMIVmWjQZMd-d-fXV-m2XnIG4ACHlYPwBk18CfM,686 +_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_nvcc.py,sha256=hWVCA2qKLcvnp84nUA7SmbrAwL4Iu-coalThGBKhaRU,1287 +_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_nvrtc.py,sha256=rvXPfMIVmWjQZMd-d-fXV-m2XnIG4ACHlYPwBk18CfM,686 +_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cuda_runtime.py,sha256=rvXPfMIVmWjQZMd-d-fXV-m2XnIG4ACHlYPwBk18CfM,686 +_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cudnn.py,sha256=rvXPfMIVmWjQZMd-d-fXV-m2XnIG4ACHlYPwBk18CfM,686 +_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cufft.py,sha256=rvXPfMIVmWjQZMd-d-fXV-m2XnIG4ACHlYPwBk18CfM,686 +_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.curand.py,sha256=rvXPfMIVmWjQZMd-d-fXV-m2XnIG4ACHlYPwBk18CfM,686 +_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cusolver.py,sha256=rvXPfMIVmWjQZMd-d-fXV-m2XnIG4ACHlYPwBk18CfM,686 +_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.cusparse.py,sha256=rvXPfMIVmWjQZMd-d-fXV-m2XnIG4ACHlYPwBk18CfM,686 +_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nccl.py,sha256=rvXPfMIVmWjQZMd-d-fXV-m2XnIG4ACHlYPwBk18CfM,686 +_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nvjitlink.py,sha256=rvXPfMIVmWjQZMd-d-fXV-m2XnIG4ACHlYPwBk18CfM,686 +_pyinstaller_hooks_contrib/stdhooks/hook-nvidia.nvtx.py,sha256=rvXPfMIVmWjQZMd-d-fXV-m2XnIG4ACHlYPwBk18CfM,686 +_pyinstaller_hooks_contrib/stdhooks/hook-office365.py,sha256=eOajWAQm3b8-4Du-ow8MGOVhUfTZYzGBdwEX7GIXu60,679 +_pyinstaller_hooks_contrib/stdhooks/hook-onnxruntime.py,sha256=98X6Ba4datHVWvkqHP-9facA_acVjYqCjW2560W8eQ8,576 +_pyinstaller_hooks_contrib/stdhooks/hook-opencc.py,sha256=P9mLJiUtD-dnFuBX3KzoDyRIXdN-XqduXGiGGCJkLOo,514 +_pyinstaller_hooks_contrib/stdhooks/hook-openpyxl.py,sha256=m6WoCKU1nco__-gW-a03SOSXYM12bcTTf-Pz8gCWMk8,637 +_pyinstaller_hooks_contrib/stdhooks/hook-opentelemetry.py,sha256=Qkoy-y7-PzJgEKCEIwr1W60AjEmjxbGAKFeKUdKTsPk,1290 +_pyinstaller_hooks_contrib/stdhooks/hook-orjson.py,sha256=bqnlukfGNV4oD4XL5VoW6l8F4LXic9e5lh22Ji1dLsE,621 +_pyinstaller_hooks_contrib/stdhooks/hook-osgeo.py,sha256=Y9uwC6ERLExngFNyXW0uX6NrKzGBukgsy2bqeh4eF_s,2910 +_pyinstaller_hooks_contrib/stdhooks/hook-pandas_flavor.py,sha256=SebmIynW0u0ScnL49GF_7MlT9hrN74UKCcEH9DchpXM,648 +_pyinstaller_hooks_contrib/stdhooks/hook-panel.py,sha256=tYSkJ7c75X9hRmlBOwnDvxjlrQiyxqHpTsDZGucy-SI,654 +_pyinstaller_hooks_contrib/stdhooks/hook-parsedatetime.py,sha256=9Q3zkAIr6WKW_ORQ8eiM37v00-9PP1qbEf_HI8r1y_4,844 +_pyinstaller_hooks_contrib/stdhooks/hook-parso.py,sha256=wytvf2FAJOYVr41XBBoBhSdHwBqmVRcW6NX48YLSPDY,635 +_pyinstaller_hooks_contrib/stdhooks/hook-passlib.py,sha256=4-RQEZow_YmJAMN_fMe_fTzE1d7cIDnX5OAHLxF02vo,744 +_pyinstaller_hooks_contrib/stdhooks/hook-paste.exceptions.reporter.py,sha256=Kqn35mVCmW_jp942jhkjQ-OYdkz5QkT3RJV6I9eF7YM,594 +_pyinstaller_hooks_contrib/stdhooks/hook-patoolib.py,sha256=ZcP0tnJlIh_PFJlXWc0oNfXAn_npLl5dD0YqkSOOrKo,665 +_pyinstaller_hooks_contrib/stdhooks/hook-patsy.py,sha256=vWNbnyzAJzVMrZSsHTNBr7XZCOLGVFapdM4im0v73P8,456 +_pyinstaller_hooks_contrib/stdhooks/hook-pdfminer.py,sha256=bI8JBQn7-RAcINnPIZWULYjWs-SQhoIWbAV0et_SQN8,516 +_pyinstaller_hooks_contrib/stdhooks/hook-pendulum.py,sha256=jboGCmxlO7DfRGK9JJ19KUH4nMjGTU5uz5Gc-c5xRls,795 +_pyinstaller_hooks_contrib/stdhooks/hook-phonenumbers.py,sha256=zjjxVuQCGUftbsnXuuA1UaihlDt1_4sHVEsAu-GnElU,682 +_pyinstaller_hooks_contrib/stdhooks/hook-pingouin.py,sha256=8DnNfY_Hfpv-pwXzQqyk5bJuLJcYHPE6kph_G7eSuDc,516 +_pyinstaller_hooks_contrib/stdhooks/hook-pint.py,sha256=kZVeEtqKYXlqGtt_sfT7NFeg7jsCnilyujbfV6U-vhY,558 +_pyinstaller_hooks_contrib/stdhooks/hook-pinyin.py,sha256=g0iSA9JlUm0TPCC4CxaTOJpiNW0gl6Izc2xKZqcgh4g,738 +_pyinstaller_hooks_contrib/stdhooks/hook-platformdirs.py,sha256=NCEoeP_XKX5yxCjDwT0cPohcZ3-xPMZnLCQRFsuTJRI,839 +_pyinstaller_hooks_contrib/stdhooks/hook-plotly.py,sha256=Yp4RK1TyjmL8bAPFpNsfZiz5UhWxH48t8eKKOmMCZOo,681 +_pyinstaller_hooks_contrib/stdhooks/hook-pptx.py,sha256=Z2S-ITYXrEEQgfhj1anvOnAaQrrKtMhz4nB1jJaO9gw,522 +_pyinstaller_hooks_contrib/stdhooks/hook-prettytable.py,sha256=LR7k0VtxljNCpkfypkAClotbRTvIId2HIElIx0UHor4,508 +_pyinstaller_hooks_contrib/stdhooks/hook-psutil.py,sha256=q3PHBjQWaW_9uvMbKNBTdXRAENKM5HX0m0xE_WtHOy8,1662 +_pyinstaller_hooks_contrib/stdhooks/hook-psychopy.py,sha256=TjcAifKGMUmn7Up5o251n0-7F4igd34jO_tI7D1QjMc,584 +_pyinstaller_hooks_contrib/stdhooks/hook-psycopg2.py,sha256=AYhLOAtcetLs0m_cjJQjnOmhUCTM3GeNL0R14rXTxC0,453 +_pyinstaller_hooks_contrib/stdhooks/hook-publicsuffix2.py,sha256=1JAim_QMHt74gn2JCxPjXz7qjEiXR9y9vsowb0vuSFE,521 +_pyinstaller_hooks_contrib/stdhooks/hook-pubsub.core.py,sha256=6HrYFNpinML13-6r8Qha6CuCKXpXu7rgIJxQ_gND4Xo,580 +_pyinstaller_hooks_contrib/stdhooks/hook-puremagic.py,sha256=0Xvb0WRlPB4nOCV7LffKg6S6NSOsGKuOKpGSkva-HpM,517 +_pyinstaller_hooks_contrib/stdhooks/hook-py.py,sha256=U7XDI-qn1L8VoSivgpyuNbHwyw2nijYIknmWEqGpm68,524 +_pyinstaller_hooks_contrib/stdhooks/hook-pyarrow.py,sha256=kYm4XaJ8GQFn4lsxzO1tqeDtPb8JgYvDDe8EW5wDiTg,727 +_pyinstaller_hooks_contrib/stdhooks/hook-pycountry.py,sha256=CfZlViBOJLtbWhY4s-_8P3qRA_M1dOtiwh4ECDNS_c8,691 +_pyinstaller_hooks_contrib/stdhooks/hook-pycparser.py,sha256=P43K-yDI8XmmxcchKI8KLTyr44hI4tK21FzQzL9qf1A,875 +_pyinstaller_hooks_contrib/stdhooks/hook-pycrfsuite.py,sha256=RWHkauAGHZ7-Xed0GNGnI8VXBnruXi1zrAHvfUKkD00,501 +_pyinstaller_hooks_contrib/stdhooks/hook-pydantic.py,sha256=y6yrY-KKB_zxwgaOGHm72sZkR9o6qJDTryq6osq1UHU,1944 +_pyinstaller_hooks_contrib/stdhooks/hook-pydicom.py,sha256=8OdvGBM_OgIG7LmOt-ghu4yRMxITkuTJoldEH0rEzI0,3170 +_pyinstaller_hooks_contrib/stdhooks/hook-pydivert.py,sha256=fTOz2ZV8ds9hMxjxpkRWnO3Hu1Rp-TklQn_i5l3BQ6w,530 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-io.py,sha256=FZcuwojyp_ohP2hlcfOPaKMnIn6z1sdYpUdG2Ttuus4,540 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-ods.py,sha256=wm2aZ2uH2cyFeQkmOuxmAm-Rb38buqrybqSJJ1Wu_yY,542 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-ods3.py,sha256=ElPK-BsVkzZyYovwRr6STzP9zwPv8vNQtKdcgII7y2w,545 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-odsr.py,sha256=H8f3KuemVMIhd4jiDnF7Yqm8tV_rMX_-Rji1d2soHGU,541 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xls.py,sha256=4R0j_zrp_f3Fsso9a4VEnCDUV4yj5Jn-bbVEYdJps8s,542 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xlsx.py,sha256=8Ciw7Xgcn9jrXjFge_c2miroB9-Tbl4uKm8TFpzB_t0,545 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel-xlsxw.py,sha256=fdUqkVzW8lVNPZl-hZLWB-V0W84IsFilxDWxJuG0KDY,548 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel.py,sha256=O4AxWgjHAqEY0qwDEHI7oRyadmkCJvvlcr51W0FH1Uo,1270 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_io.py,sha256=dvm5ED0pqFM8Nm_qXTiOiazK1Yy4lKLFpApozAchnf4,1026 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_ods.py,sha256=Iz0fWJ_yu-bUcOReVdlIONX10AK2tS9eulAFMXRdwqY,604 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_ods3.py,sha256=Jq2vUOuWLH6eGgSsaQ2FUGe2SBnhpRU2Mw4n1zoezO8,587 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_odsr.py,sha256=nrT8jVqP6XMJsvkjsz9CvR29mGfBHE57iCfCZk7u0k8,562 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xls.py,sha256=oKb4_uAhN4lD2HIkCZ6Y7nZTq6Vrm0ASNguxzvqrQZ4,582 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xlsx.py,sha256=4f6MoRb5lv6q2v1Ep6aZH_fzbHhqOKYV88-63Kc-1Og,589 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcel_xlsxw.py,sha256=Q6nFCXD_8M4n6eP6c6bDKZ9FMgHdmlcwUWseprA1RWw,571 +_pyinstaller_hooks_contrib/stdhooks/hook-pyexcelerate.Writer.py,sha256=L_KxyR2a27d0hjtK_L5Xt6Bh8CSXwsrDCJmwN5SRrxc,520 +_pyinstaller_hooks_contrib/stdhooks/hook-pygraphviz.py,sha256=Mt__nm7XELuC_MDM4cGBzJfvZ9woBq2dtPuDdiE3IVc,2090 +_pyinstaller_hooks_contrib/stdhooks/hook-pygwalker.py,sha256=riOBNf_TUoNdah7wNAPg0YOZ9ruzexvYN5_DhTW_uuQ,517 +_pyinstaller_hooks_contrib/stdhooks/hook-pylibmagic.py,sha256=HCi2VRbUeBRFHbu3aZaQVpdH4CLjt6Mg55MT5r29AtU,638 +_pyinstaller_hooks_contrib/stdhooks/hook-pylint.py,sha256=7CGgOElk4-j1dUFSYvdgkDhnaWA64NyPklA59tJYCxE,2797 +_pyinstaller_hooks_contrib/stdhooks/hook-pylsl.py,sha256=3alIt8qCeJwrbIWx2DZB0gUl3pP_OyPC5Gl6E_kq9js,1380 +_pyinstaller_hooks_contrib/stdhooks/hook-pymediainfo.py,sha256=SZHmXlXI3hg6WQI1DB0SQ2CgMdvC4R_lKXITC28JdSc,1720 +_pyinstaller_hooks_contrib/stdhooks/hook-pymorphy3.py,sha256=WiiMapatPQ-tMqu9uJMqb-YrZgz4-z9UzCuGIH-hFuk,882 +_pyinstaller_hooks_contrib/stdhooks/hook-pymssql.py,sha256=lvxXSQPWOjXk01HpxQD4vuz_NWRLu7dHVzdBBFObd4Q,702 +_pyinstaller_hooks_contrib/stdhooks/hook-pynput.py,sha256=Bst5K7rJ2x6zu7RH9Rw2o3bt9OH6zKcdCSvkjLxiVVs,522 +_pyinstaller_hooks_contrib/stdhooks/hook-pyodbc.py,sha256=O4xxP-3UYj1U-F5brNgHUJqrLZ1xEhi8dmyewtdjAQg,800 +_pyinstaller_hooks_contrib/stdhooks/hook-pyopencl.py,sha256=BYmdmFmWfLvTCwYfoU5R6te6ZLiOIOowt3lCFf90vSI,636 +_pyinstaller_hooks_contrib/stdhooks/hook-pypemicro.py,sha256=AAcRqmDT99-Hf6qOx-oYpVz5ikMSSrdmTHNIPlw0fRE,1537 +_pyinstaller_hooks_contrib/stdhooks/hook-pyphen.py,sha256=TOIIizX9zsR8Yxne30gn3kVD3-_SR3yLbIdDeRrRNm0,514 +_pyinstaller_hooks_contrib/stdhooks/hook-pyppeteer.py,sha256=tQBftDHjR6UE8hLS9TOhdfZ2CtYj3pQA7RPQICnEq2Y,569 +_pyinstaller_hooks_contrib/stdhooks/hook-pyproj.py,sha256=AutxkRkRAaaHv6pepOHlntsGew20Aw0BHfp27XIpoDY,2874 +_pyinstaller_hooks_contrib/stdhooks/hook-pypsexec.py,sha256=1dsJpXxQSf_ax1ZG404Gt_lugYsZnp4sccNDC9ARs2k,663 +_pyinstaller_hooks_contrib/stdhooks/hook-pypylon.py,sha256=0lVseKKn8a_oAJSD2gKmk1BB8c2JV0JzPLpV29-lQr4,2502 +_pyinstaller_hooks_contrib/stdhooks/hook-pyqtgraph.py,sha256=TV_83_49-Ct7JMDLTWZ40lhUkBu2JgrVeh9ViyDKvVY,2724 +_pyinstaller_hooks_contrib/stdhooks/hook-pyshark.py,sha256=QiK5ngnGJgd-4Ej9bSCfLm6C0T59nR2Wcmv9W4T3OGk,894 +_pyinstaller_hooks_contrib/stdhooks/hook-pysnmp.py,sha256=VTFu70OKNnuxQf5BgFoQfRNKhHIYpsYBBq3Um61cBpk,620 +_pyinstaller_hooks_contrib/stdhooks/hook-pystray.py,sha256=zwrmSkRqcqCTB0LorfBeohRhK6z83Gn6mtHkn8stjHk,645 +_pyinstaller_hooks_contrib/stdhooks/hook-pytest.py,sha256=KswRiZA4mc6ntcoRZP1uuWCvWjeOMH3EyXlUR1HIk6U,530 +_pyinstaller_hooks_contrib/stdhooks/hook-pythainlp.py,sha256=LjYyaZ6bippZB_FaEhfO98ZoMuMq2ts4tJNM-oFOX0M,517 +_pyinstaller_hooks_contrib/stdhooks/hook-pythoncom.py,sha256=8BNoI-XzdFcMMYZGhtgJlKQafkLCPNEcNkYvklCl-oA,1310 +_pyinstaller_hooks_contrib/stdhooks/hook-pyttsx.py,sha256=Dc_k1cOMrTiyUD2ykczvMjFnKsxqnsRyoubp6AZuK0U,680 +_pyinstaller_hooks_contrib/stdhooks/hook-pyttsx3.py,sha256=tSKAGe5li3ZNgXmD8uBAOklK2gXZsb8N_g0DmDwXz3Q,953 +_pyinstaller_hooks_contrib/stdhooks/hook-pyviz_comms.py,sha256=tIouDRIPXMthfkbl92nPp_WoiV95hgkvX2fJmNt6Q_M,519 +_pyinstaller_hooks_contrib/stdhooks/hook-pyvjoy.py,sha256=z_5pzdhljTAIqXr6ZUAU90yetm9XsismXM8fJACXJOE,520 +_pyinstaller_hooks_contrib/stdhooks/hook-pywintypes.py,sha256=P1c320OpZ0aYBcuvJYuyn6GXs9rR9SXYlifElNhGg3A,1312 +_pyinstaller_hooks_contrib/stdhooks/hook-pywt.py,sha256=h66LHiEystMScItTwayt9BVAbxTKtRaHh9eAJn3yVbU,875 +_pyinstaller_hooks_contrib/stdhooks/hook-qtmodern.py,sha256=YsxMuexOuumpdDaxGJHm72B3Ir1g4QYFhQaaGcMPiTc,539 +_pyinstaller_hooks_contrib/stdhooks/hook-radicale.py,sha256=fiBeBFdZEF4SOsmex1KuBzxk8wuIPbXvSAYtw9Z333k,566 +_pyinstaller_hooks_contrib/stdhooks/hook-raven.py,sha256=ZMjvs_bMMzL6ivmkMYd4JaH1GQjySXFvMWY2FKo_QMQ,474 +_pyinstaller_hooks_contrib/stdhooks/hook-rawpy.py,sha256=Unn3Dmi-1DO6PEsP1V1fc4msZKjlfdRfRJ1lHuhW430,549 +_pyinstaller_hooks_contrib/stdhooks/hook-rdflib.py,sha256=rZILYAIHxVLRb8Yoo-OrCwOxgpnXa0mIUtAt7NQdn1w,530 +_pyinstaller_hooks_contrib/stdhooks/hook-redmine.py,sha256=WB6xvPntTEPCgr0OObGvIrA2-tJf_Pj6VPOg-haG_Lw,459 +_pyinstaller_hooks_contrib/stdhooks/hook-regex.py,sha256=NbwTOxbeaB2odUSDRMfG_A3MlsE4gBK5-87xXDDVoLE,450 +_pyinstaller_hooks_contrib/stdhooks/hook-reportlab.lib.utils.py,sha256=pZqRNQOrita5omAC5_nSskyAAu3p4JpsgQ1aqPYyKlE,495 +_pyinstaller_hooks_contrib/stdhooks/hook-reportlab.pdfbase._fontdata.py,sha256=tEXZopdzGoV68mBgXZiDFEj2X2BoIBc6q7QcGI-4glY,754 +_pyinstaller_hooks_contrib/stdhooks/hook-resampy.py,sha256=vAXcFQNF7T3C_Noq2d7BhhWh4M2rUMR-w7m0WsA631w,596 +_pyinstaller_hooks_contrib/stdhooks/hook-rlp.py,sha256=MZaRLPT-yxpVpYHmPSn6QKZDesyZrgWvjOQSiF-s0qs,631 +_pyinstaller_hooks_contrib/stdhooks/hook-rpy2.py,sha256=jw3x7MFzZ1W4JmLG3ee-mJAfeHONVj0OfD6P0XMD9sQ,526 +_pyinstaller_hooks_contrib/stdhooks/hook-rtree.py,sha256=qWGm91ktqZNaRgxcC2sTjz2d3ii1f3J-lQvQticA6Io,1735 +_pyinstaller_hooks_contrib/stdhooks/hook-rubicon.py,sha256=QMzeWRQmulGUFSBGcyfjxTP3iDz_sf5ItOVyiENGCN4,574 +_pyinstaller_hooks_contrib/stdhooks/hook-sacremoses.py,sha256=lm66cE71dKrvqLJJA-yJ3vtuxH7kcb8ptroAEfdQRJ8,518 +_pyinstaller_hooks_contrib/stdhooks/hook-saml2.py,sha256=S1UqQSq4qsJqr731S_pQ3n78vZ0sD5HLl8j6WyjqfQk,1138 +_pyinstaller_hooks_contrib/stdhooks/hook-schwifty.py,sha256=KR8NXP6rWyt7QlUpDSwT1YFM9SbTpzZAsv8FCqXdNQ8,566 +_pyinstaller_hooks_contrib/stdhooks/hook-seedir.py,sha256=IHIIi5YRBlRmixBGQkKG20hTbxCFFSAmTn5PKoSDyxI,514 +_pyinstaller_hooks_contrib/stdhooks/hook-selenium.py,sha256=evaqzJ9MoXzbS0RaUGyta7C75YOLm0pL2FbqrOL0sV8,516 +_pyinstaller_hooks_contrib/stdhooks/hook-sentry_sdk.py,sha256=RRHQjGatbPphkfgBXH6ZRC663uVEDtVUR4YQqnf0ivo,1555 +_pyinstaller_hooks_contrib/stdhooks/hook-setuptools_scm.py,sha256=AKzhxS_poloeTW3P1AqpfEhv1Pj22ObVPlcmMKVxTcE,638 +_pyinstaller_hooks_contrib/stdhooks/hook-shapely.py,sha256=xyvXIL2GvUJrT47IrWc_8sJ5oRttUGzB_2HSCu54ek0,4786 +_pyinstaller_hooks_contrib/stdhooks/hook-shotgun_api3.py,sha256=PWWJA_bTQulDDZ_SlJknhwMmBJMlA0syMN7ty4CqKfA,837 +_pyinstaller_hooks_contrib/stdhooks/hook-simplemma.py,sha256=1bBXLPhsKhWION7Yao22LQTMQJ4Yo0LWKX0cFjBSONg,517 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.color.py,sha256=f3Gggsi95Q8Mzr4dV_WECbSmvWMeQ4YZptkzNf-5wlE,885 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.data.py,sha256=wDeAlllX4ohrXZQMMPFDhXqwSQKaJszi_X0fLhh4FOw,882 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.draw.py,sha256=BdsCh5CYIlUmB9TU0q6LRo0vNfkiP9Ikl1CGOrrf02g,882 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.exposure.py,sha256=RvZnk0miH3VeMCjXcPk7PMjgyaD2-Ts5WomfA6l2DkQ,894 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.feature.py,sha256=hGjCqKixqNQWSNeh3YbWL9Pgeu-Oj_jo66r6OfSz6vA,1348 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.filters.py,sha256=Wf1FoAwOOSEJN338XePFGQQQEY2mDsnLn1djfXmyJa8,1224 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.future.py,sha256=A1Ozf_BsbVh9FeNY7M7RPYlPmQqq5XqaG1nnDscjmEE,888 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.graph.py,sha256=W6E_UbfmgCvsf7xFVLnjNWRbEnWQCXFIKrylJ19af0M,1012 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.io.py,sha256=gvA5t2GkyzSTDe475c7TWJMxH0ZwcIVZtBFypufVTHU,692 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.measure.py,sha256=kBIwSn8bHZkyBx4e_kmbIfEhBDpM56-TUMds2NrIotM,891 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.metrics.py,sha256=UXc7fYHmZtjSjigpNpRWNXd8n5PlrttGpNf-6FJhCd8,891 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.morphology.py,sha256=rNY8kBmId9ZjqErQCtjcaVM5z7NAV7GX5-6zDe-ejPk,708 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.py,sha256=X1D4G1ifc2NJYgEP8BJv7_HbibSIh_zU_mi02Tz2Ro8,699 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.registration.py,sha256=fPIIIOtwjCrTjtrFx-Gm43gQRQ3hIt07j5B0ukkPnZ8,906 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.restoration.py,sha256=L8Sl7-uEt0w0fkMFuj_F9Br5t3rPmeTC9Gl5tOTB1kE,903 +_pyinstaller_hooks_contrib/stdhooks/hook-skimage.transform.py,sha256=JzT1ZOZSYF9AIE0GqofIDqeJAzeZqR8ueOtWH4USQ2A,1160 +_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.cluster.py,sha256=oP45i7CNTVbV24F7lcW1SENbY3FkL-r_g-ZfsRhPo3g,646 +_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.linear_model.py,sha256=CwIAWIFg3WAB9h77Cy606FOWJ8M1PwM84APlOi6wP7o,681 +_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.cluster.py,sha256=q77JZ2N5g2JAdJ9KZc1M6VmghFFJEZix9QCIppRyvpo,1059 +_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.pairwise.py,sha256=Y-mMC21KcFLZl8tBlFZk0Rhxh3RAF7uBZa9_XC3yBT4,695 +_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.metrics.py,sha256=jMbCX7-k2My3roYB8InOM8MW80_7TYJtaOsR5CVW41I,836 +_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.neighbors.py,sha256=QqEsYvxvqhtkraAZCGeJyqV9vmv6N6Gzf4PVJLQiXxY,1256 +_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.py,sha256=IBTUfO-Z5Sa2mw2iCEMKGd_0-kDpDXSTlXo-BqiuS4Q,563 +_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.tree.py,sha256=BNYMndC-EY8vAnVArPYjjpJ895PxllGlsc1suGUh1A0,463 +_pyinstaller_hooks_contrib/stdhooks/hook-sklearn.utils.py,sha256=N768grgs_ku04fPBmluXTO7Xbh5Yzfl5lwABwghG1z4,470 +_pyinstaller_hooks_contrib/stdhooks/hook-skyfield.py,sha256=6oKXVPWHwEbqV_RrMOxL1t7PGZ7hiBhH4ChjG3CdXfY,515 +_pyinstaller_hooks_contrib/stdhooks/hook-slixmpp.py,sha256=oQkL_3sMJ5PVQJbYP4xCnybIW50WvDCnGXefOVot4ug,532 +_pyinstaller_hooks_contrib/stdhooks/hook-sound_lib.py,sha256=Kq3QihOuvNPWwy_6A9aWUAaL7WNzpNuilXKztVEFKLk,579 +_pyinstaller_hooks_contrib/stdhooks/hook-sounddevice.py,sha256=FGwJDIZkgFIbMiS0PvT6nu3aXDX08tzTqLgx3tGbP-A,2274 +_pyinstaller_hooks_contrib/stdhooks/hook-soundfile.py,sha256=0LjHvLYMaqRFdwj-ejmNPKe00TfXa2n4JzSf9WtMdz4,2205 +_pyinstaller_hooks_contrib/stdhooks/hook-spacy.py,sha256=0mBcrUsC6yf2Ojn6U8H6qxv91pQu6pMthpYt0KHa8Jk,660 +_pyinstaller_hooks_contrib/stdhooks/hook-speech_recognition.py,sha256=piGWZuxa_PXxTEyPOFb7iyFzJxiG6n3Tt_-zPm1kaug,661 +_pyinstaller_hooks_contrib/stdhooks/hook-spiceypy.py,sha256=Ed6LYIhF6poAcCSPyb5rvhVjUFkdl9qw0qxyn73JJDU,625 +_pyinstaller_hooks_contrib/stdhooks/hook-spnego.py,sha256=ehk5wUbK8Xj-Oh75VyPssmzZSeK7QcFo2wNFZ8RaJW8,522 +_pyinstaller_hooks_contrib/stdhooks/hook-srsly.msgpack._packer.py,sha256=WXdQwncBqLpuxfcR_i-OySkzAtlkbAepvX82vMnfQ7M,596 +_pyinstaller_hooks_contrib/stdhooks/hook-sspilib.raw.py,sha256=d4vicope-Y7s4BjCk9I6lrsYm9MUc5_NDa3tiyATOlg,861 +_pyinstaller_hooks_contrib/stdhooks/hook-statsmodels.tsa.statespace.py,sha256=z1YSRSV5BtzND932WFgwB70XFU2yz0-lK5vxIJpCKLQ,619 +_pyinstaller_hooks_contrib/stdhooks/hook-stdnum.py,sha256=KOp6fIP-1UYDUQvQTtjsfDf85sTfouUh9XDP28TTGdg,589 +_pyinstaller_hooks_contrib/stdhooks/hook-storm.database.py,sha256=Enp0r3QnP011rR4Lo6Jmh_7tuKeX-FO9wF-b2rF_Gfo,559 +_pyinstaller_hooks_contrib/stdhooks/hook-sudachipy.py,sha256=mznzdDeOa49mGSqNMjmIlWHgTI0tabQ1Xy-8IbS6ks8,1088 +_pyinstaller_hooks_contrib/stdhooks/hook-sunpy.py,sha256=WdRTp2-VH2zgM8lhXbeL4H08MWVyfHh8lVee5RPSZiA,810 +_pyinstaller_hooks_contrib/stdhooks/hook-sv_ttk.py,sha256=gkQBskWzIY9vj5JaCgIZbFGsiBPWtd2KRXiUzWOLY5g,564 +_pyinstaller_hooks_contrib/stdhooks/hook-swagger_spec_validator.py,sha256=CZxq9j5qkkuVAjSQWQwRRaIJT9GGa978Q9F57erq4HY,530 +_pyinstaller_hooks_contrib/stdhooks/hook-sympy.py,sha256=pQtYWj2ASprai-lEud0Jq-Ld-JT0yT2Vk7E5udcbCrI,874 +_pyinstaller_hooks_contrib/stdhooks/hook-tableauhyperapi.py,sha256=AumaK0lkQrfiCsG9p6t5L7RGWme6OJ5b579vugQVF4k,530 +_pyinstaller_hooks_contrib/stdhooks/hook-tables.py,sha256=IOnpCJdV4hWIz1is97IDMSC1prG4c2wkIsyB1WikmxI,1471 +_pyinstaller_hooks_contrib/stdhooks/hook-tcod.py,sha256=d30d6w3skLxkY1O-4qgWOcITPbiXKN-Af3tp9gqAYpk,675 +_pyinstaller_hooks_contrib/stdhooks/hook-tensorflow.py,sha256=X98jHWPPNuqgpQq_Pm08gOsUFFMYjiegB4ue916uVlU,8521 +_pyinstaller_hooks_contrib/stdhooks/hook-text_unidecode.py,sha256=aiKF9Adg3AERYMKQfnGu4NIjXvkd9cabMbn7EWbnZaU,823 +_pyinstaller_hooks_contrib/stdhooks/hook-textdistance.py,sha256=VMB0NOWxX-wm0iaN7LZu7DDNl-oZeYPOLkq99bQynyY,602 +_pyinstaller_hooks_contrib/stdhooks/hook-thinc.backends.numpy_ops.py,sha256=fQe7iRyYKHzh2O51Rhqla_wQTDD0qPh4MwS70SuBGwA,620 +_pyinstaller_hooks_contrib/stdhooks/hook-thinc.py,sha256=kv4x4ewqLapioW9Iyt4pgZAklPqYH2buCl0bU6l4q94,682 +_pyinstaller_hooks_contrib/stdhooks/hook-timezonefinder.py,sha256=gFfA4F9ImepBorXt9onYcWoaNCv-PSrjUrkS8H-Vt8w,522 +_pyinstaller_hooks_contrib/stdhooks/hook-timm.py,sha256=L508elVV7ax33mODkIR3zrkCnahihoH7UIjheGAzCkM,557 +_pyinstaller_hooks_contrib/stdhooks/hook-tinycss2.py,sha256=ke7JomKRtbpoKSoOAbqBsVs7KBbMyqNc9LdKPsy8940,718 +_pyinstaller_hooks_contrib/stdhooks/hook-toga.py,sha256=AlnWcLqUrzOnB4tYPHoarDZBmrJNQugfw9WeA5rrync,1068 +_pyinstaller_hooks_contrib/stdhooks/hook-toga_cocoa.py,sha256=lRTBxt7K5mDBr0Vg9_cKtlWjYwo3aYkuxYZYUGQBFgI,695 +_pyinstaller_hooks_contrib/stdhooks/hook-toga_gtk.py,sha256=BLhknKuw1taIhpChywxds5YAaErt3p1QEbMaD_LW5N0,698 +_pyinstaller_hooks_contrib/stdhooks/hook-toga_winforms.py,sha256=ZdedhJzay8JBOpHFkh886uhqkbVceUtZCQ42a0PcIIQ,1676 +_pyinstaller_hooks_contrib/stdhooks/hook-torch.py,sha256=Bycjt0ibDsfalzHOo9dsXqJRauC_imRQULUR2BA1LyM,6353 +_pyinstaller_hooks_contrib/stdhooks/hook-torchaudio.py,sha256=uiHAOGQ-3-ObT97AVxv0z0QlpbjFJbNE2Q0gYNADXGM,867 +_pyinstaller_hooks_contrib/stdhooks/hook-torchtext.py,sha256=CzTfNYupWeGaRRfSIL2eJY0aDBhQv1QXtJbWA-NEDN0,864 +_pyinstaller_hooks_contrib/stdhooks/hook-torchvision.io.image.py,sha256=gY1Lyzi4FXkXgunJsO1tu0L1mF57K7UYEJRbUv5ty8A,544 +_pyinstaller_hooks_contrib/stdhooks/hook-torchvision.py,sha256=4b1nEXZqf2wF3NQmnxHSAzjKdVg5_v7vdXqQZBnDqcY,750 +_pyinstaller_hooks_contrib/stdhooks/hook-trame.py,sha256=wfWJdueXwSbtg5ltTooMVKIScckp4MJfAMjQUSrggZI,449 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_client.py,sha256=VzWxVdG9C6_5R0VSNK13fbi6UEpiqrho26uU8y4jgFc,537 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_code.py,sha256=lBe5ZK_X8AjASCPIV9APv5YGX2ISWvBnbIkjg_FfNw0,538 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_components.py,sha256=54f4hYedYKygfRWKPdagVKWHUW_Rln9hYUsz1bIV-lc,541 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_datagrid.py,sha256=_YgeTfiZm-HByd8G1_DIb70yXdgKiDXyROaDXBiXHs8,539 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_deckgl.py,sha256=Jv0w7wuGjC3AuQ4sgLGtA3Eiijda2D_i8eFFkgyRuB8,537 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_formkit.py,sha256=ryM4qXa18QDuBdWffklfR-B3-FUs5N_x1l1LVJxcIus,541 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_grid.py,sha256=za_pkjIroAH_VjdYywXdSsA4uP8yAHIMT84UYkmUlm8,538 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_iframe.py,sha256=EIAhF1ARh2m19WvQIIkzkKbmAWrVzqLcxp97qd5fZ-8,537 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_keycloak.py,sha256=BrfdnSqBj2xwebMRwxiFtnBK6bpl99ytdZWv_mS5YLo,539 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_leaflet.py,sha256=A5HftRWLEo-4JxANDRf1qyYdzQ9UMjkT9ZQAITqhK4k,541 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_markdown.py,sha256=F6U1hYfdc76jU4Mw64o8DNSsbDzputARvHW3_NpMRwQ,542 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_matplotlib.py,sha256=y2zdoreEfcZ12d7K8tZdtMrnkT8m5-JS5pi5_4JVHI0,544 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_mesh_streamer.py,sha256=MM0sW1v0nCpXywQ4j6ioy9RK6cxS5Yg-0eY7zZxua0c,568 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_plotly.py,sha256=Jus__aRsqdUEyLe96VsAKggn3eNEqL2SvDV8R6kB7ao,537 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_pvui.py,sha256=t-k_oh-jEQ7WZYxWp5mrF_zdbjlDb5K-f9b26p6OTFU,535 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_quasar.py,sha256=yGPS7wYndn26rud-Qry0HxMvB3N7mYgoBv5CbQe7JBI,540 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_rca.py,sha256=Vz-h_WumdIelMNLG31vWUO7fSjEM2O2zG2Je7Mg5Jkk,534 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_router.py,sha256=u1wTcmw6sfgWMyEX3pkj7_4PVkuL9VQsFE98IkB1X0I,537 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_simput.py,sha256=e7XVwnoMR-grO51ir3iX0ToTOB7M31oqp7EAv5TNb5M,537 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_tauri.py,sha256=c-qQLEenEVzwFl9CJvGioTnf-9OHQhL-4SUD_iAlgf8,536 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_tweakpane.py,sha256=1yTKF43c-bwM5GNUiP5pg-7dZoLi2MicTGiIy6djgAo,543 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_vega.py,sha256=8m8NgpnnfQDKB96FSLkVdVFBXrut8EVFN6p_d74KK0s,535 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtk.py,sha256=rQzWSHqHjITxVctPZCcvupmNUrP6qWO5KvfapQ59Jug,599 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtk3d.py,sha256=C50pnto4_ZHuYoNnwUbQwxKPnVbLUgAbGVEzdm3QCYY,536 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_vtklocal.py,sha256=MJ4b692GnZ8xeLf7U3MfA_8UhnPH6m8WU3vv1V0C1WI,563 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_vuetify.py,sha256=uzrIK50-q9-ElD4iGi7r9hCUshtntdpdJgSWCFMTORo,538 +_pyinstaller_hooks_contrib/stdhooks/hook-trame_xterm.py,sha256=bv8OYRBotPrbovDdbRAIm__Byask8Gl-WNn3S6nqFT8,536 +_pyinstaller_hooks_contrib/stdhooks/hook-transformers.py,sha256=oUp7eMv1GZVkRwu8uoUPPoMnbUN7T-9QHhE5LeeovTg,1441 +_pyinstaller_hooks_contrib/stdhooks/hook-travertino.py,sha256=QMzeWRQmulGUFSBGcyfjxTP3iDz_sf5ItOVyiENGCN4,574 +_pyinstaller_hooks_contrib/stdhooks/hook-trimesh.py,sha256=8rZOJcrZzvQP1dcNFbFiIGNciMNcN8nfQ5l8A962ct0,630 +_pyinstaller_hooks_contrib/stdhooks/hook-triton.py,sha256=tPWQDjLZ5K9F9uU6XKomodKxwBq0uBGKi17GMn47nE8,1429 +_pyinstaller_hooks_contrib/stdhooks/hook-ttkthemes.py,sha256=r3b6GzZQ5Kr9JLCK8NOmodZkBl_lbYA8yuiPohVEzDA,1822 +_pyinstaller_hooks_contrib/stdhooks/hook-ttkwidgets.py,sha256=vS1Xdgi8Q-m9qhK97u1T111pBEPm2HVgmbWi7byqTr0,1288 +_pyinstaller_hooks_contrib/stdhooks/hook-tzdata.py,sha256=OsSahzrcY_SuaoZB6gXT7HtkWSJGb_c_h76du4talxk,826 +_pyinstaller_hooks_contrib/stdhooks/hook-tzwhere.py,sha256=qNPXs2MAeH5Y0FWDCOXoplHp5FI-GIRkI62yFvUzN5A,515 +_pyinstaller_hooks_contrib/stdhooks/hook-u1db.py,sha256=ftGC2v2SEPsypYXY934pYN8H_dvOoEbafKaeiNP06n4,876 +_pyinstaller_hooks_contrib/stdhooks/hook-ultralytics.py,sha256=LoDbFbjOrzRzEpViEzZ1ZPb4DVk_h3QNjsPSex_hgys,717 +_pyinstaller_hooks_contrib/stdhooks/hook-umap.py,sha256=Df75m78IePhWxlordune2qRC_UmgTLDvrlQyePr5HMI,508 +_pyinstaller_hooks_contrib/stdhooks/hook-unidecode.py,sha256=t86yg_WZ0An4pjHIVQ_Mnnvn8u74LKZmNEsnPd2CiAo,812 +_pyinstaller_hooks_contrib/stdhooks/hook-uniseg.py,sha256=vBDFt52WHwaVWhSJGmBxlPR8Iuvjo9iVvw8l5xSrv_I,581 +_pyinstaller_hooks_contrib/stdhooks/hook-usb.py,sha256=es_6ZM9HBo-fIhyRACCiCINf_0rGHSlJuUBCQcNetag,3211 +_pyinstaller_hooks_contrib/stdhooks/hook-uvicorn.py,sha256=rPwThXcBdALtt0PQ2_kCG77QhiFTsLPVVvRHnO-zPdE,523 +_pyinstaller_hooks_contrib/stdhooks/hook-uvloop.py,sha256=klDycjXcNetKquOPOWYx2VedfVovgHE4sT0d24EsG6Q,663 +_pyinstaller_hooks_contrib/stdhooks/hook-vaderSentiment.py,sha256=oLtl1Fxlp5BBvcPvnY350FlkKJ_xe6TNDt6e20-CwQk,522 +_pyinstaller_hooks_contrib/stdhooks/hook-vtkpython.py,sha256=XY14rmVQKna1LvNhqszoImb0sW0UKuVZzYm_kOocjbs,949 +_pyinstaller_hooks_contrib/stdhooks/hook-wavefile.py,sha256=F-rA6wwxPPP-Ri15hEjDUVZ5uZ57uNt9rkNawmNaEuw,591 +_pyinstaller_hooks_contrib/stdhooks/hook-weasyprint.py,sha256=YQOd1AX1lmOr8rHwKcuuhzClJ4DlEFf8MZcsG5bAwI8,3915 +_pyinstaller_hooks_contrib/stdhooks/hook-web3.py,sha256=0XtNeiUKBz-SpHYaij3g_1KatWh3fIxJWyQrbK1Dg68,502 +_pyinstaller_hooks_contrib/stdhooks/hook-webassets.py,sha256=-9vQAQ_Dd_-zwabZSkNxn-vcCBbIDNp6mHKXT2jRhKk,539 +_pyinstaller_hooks_contrib/stdhooks/hook-webrtcvad.py,sha256=-Hhm45kE1oYpZ9c00GJfMdd46Isxh7IqXh58oircRcA,507 +_pyinstaller_hooks_contrib/stdhooks/hook-websockets.py,sha256=PklUXHU4iZxvFsnOgGdRyDFRxc15MCUSYIukc5L6vrA,568 +_pyinstaller_hooks_contrib/stdhooks/hook-webview.py,sha256=gcMHLFaKnsJuT08WGHbNeUOG0CabbQkggLursppRF40,698 +_pyinstaller_hooks_contrib/stdhooks/hook-win32com.py,sha256=0qR38kqHPFVAVKNhoCf7J-Oiui5gMM4myOTnZ5iEARI,644 +_pyinstaller_hooks_contrib/stdhooks/hook-wordcloud.py,sha256=nxDRIYdgKiB4QAoHBWRH5NFIqIaGVn560YWDI3Wnj1Y,517 +_pyinstaller_hooks_contrib/stdhooks/hook-workflow.py,sha256=l-HbGtVerjzReiLC0yrcyU0jsif_-NS7X2_f4_oxxII,506 +_pyinstaller_hooks_contrib/stdhooks/hook-wx.lib.activex.py,sha256=2ulQkghVbnvMxfynUZqGnRvpmplAYbOW08g578JY9Ik,581 +_pyinstaller_hooks_contrib/stdhooks/hook-wx.lib.pubsub.py,sha256=DIywUIZkoSM9VOqolMahmlcy8S3wdo4EOA6SxAawetE,582 +_pyinstaller_hooks_contrib/stdhooks/hook-wx.xrc.py,sha256=G1iIeRh7Kfa1W6dkewEK28s1zAgLWP8RN9nYnNVbPbU,455 +_pyinstaller_hooks_contrib/stdhooks/hook-xarray.py,sha256=LMjkQzvZN96S9PQOUKYguyWOyAFqFOakIWYONg9sW_g,1137 +_pyinstaller_hooks_contrib/stdhooks/hook-xml.dom.html.HTMLDocument.py,sha256=ABU_wswgSp07v_Bi_5mba8z1m3UpQHFl-xL7ihogAvs,3146 +_pyinstaller_hooks_contrib/stdhooks/hook-xml.sax.saxexts.py,sha256=406w-Anp5EylNFApwQ0bnbuIyMpiU1jU4BfdSGuPl-4,990 +_pyinstaller_hooks_contrib/stdhooks/hook-xmldiff.py,sha256=4Ko0wHSSSsmBPntpyr22NzY1ZAbB546go6Vxmjwst68,550 +_pyinstaller_hooks_contrib/stdhooks/hook-xmlschema.py,sha256=l59u4QIkdzmcIMj27GLW1puTVMNIdr8e96ur3viCYmk,644 +_pyinstaller_hooks_contrib/stdhooks/hook-xsge_gui.py,sha256=NJ70wLfuoi-jyCD-mDR1NAP01mhSr0AT3qwuvkZT8dU,587 +_pyinstaller_hooks_contrib/stdhooks/hook-xyzservices.py,sha256=6cgNAv3RLgNsQYF91Y61ai3EfJCaz2f6Htcn-Dsm9Wo,519 +_pyinstaller_hooks_contrib/stdhooks/hook-yapf_third_party.py,sha256=JwB1RswTKDKzdIVFe3qmt30Y6DHsMu2N7vzd6U8GY-g,524 +_pyinstaller_hooks_contrib/stdhooks/hook-z3c.rml.py,sha256=phkXTZu8hR1Y7GfFnbGw6Zcj2yVwRvbqvpx1fNR6KAQ,959 +_pyinstaller_hooks_contrib/stdhooks/hook-zeep.py,sha256=Ds1kPuoCIJmioNWV91MI76TUO5al5QBlfHW_4Hu2ubI,612 +_pyinstaller_hooks_contrib/stdhooks/hook-zmq.py,sha256=B_VFStoRQzFF5tej6d6keZ1TGNCsEedH56FmdKkRqVk,2725 +_pyinstaller_hooks_contrib/stdhooks/hook-zoneinfo.py,sha256=99A9LN6khAbUAQfey6FaTHtdGZEaaOjavxwawAzbTdo,595 +_pyinstaller_hooks_contrib/utils/__init__.py,sha256=MsSFjiLMLJZ7QhUPpVBWKiyDnCzryquRyr329NoCACI,2 +_pyinstaller_hooks_contrib/utils/__pycache__/__init__.cpython-311.pyc,, +_pyinstaller_hooks_contrib/utils/__pycache__/nvidia_cuda.cpython-311.pyc,, +_pyinstaller_hooks_contrib/utils/nvidia_cuda.py,sha256=gJO659n9CBpaGi6zYgFl1cdHHPvN125IaWWBC3yR9Qc,3009 +pyinstaller_hooks_contrib-2024.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pyinstaller_hooks_contrib-2024.10.dist-info/LICENSE,sha256=kdC6r_AHcwOOcsCh_J1dLThwa3ornATzQpZgj5MbnNA,27666 +pyinstaller_hooks_contrib-2024.10.dist-info/METADATA,sha256=rwdCwvShyp0HojumqxC8yukk4_Hawzro87xZXHjgg_0,16000 +pyinstaller_hooks_contrib-2024.10.dist-info/RECORD,, +pyinstaller_hooks_contrib-2024.10.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 +pyinstaller_hooks_contrib-2024.10.dist-info/entry_points.txt,sha256=FsM9QtmkHCPo9b23sWrxVW7Fv4awouh1WnBDFJpxJPs,69 +pyinstaller_hooks_contrib-2024.10.dist-info/top_level.txt,sha256=iLfKgsga5bLZMSkoWpHxWt6tDjcPVCvGsJgvwfMYcnA,27 diff --git a/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/WHEEL b/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/WHEEL new file mode 100644 index 0000000..9b78c44 --- /dev/null +++ b/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.3.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/entry_points.txt b/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/entry_points.txt new file mode 100644 index 0000000..a8c18cf --- /dev/null +++ b/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[pyinstaller40] +hook-dirs = _pyinstaller_hooks_contrib:get_hook_dirs diff --git a/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/top_level.txt b/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/top_level.txt new file mode 100644 index 0000000..3d4a9b3 --- /dev/null +++ b/venv/Lib/site-packages/pyinstaller_hooks_contrib-2024.10.dist-info/top_level.txt @@ -0,0 +1 @@ +_pyinstaller_hooks_contrib diff --git a/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/INSTALLER b/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/LICENSE.txt b/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/LICENSE.txt new file mode 100644 index 0000000..d0ce125 --- /dev/null +++ b/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +This software is OSI Certified Open Source Software. +OSI Certified is a certification mark of the Open Source Initiative. + +Copyright (c) 2014, Enthought, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of Enthought, Inc. nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/METADATA b/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/METADATA new file mode 100644 index 0000000..1d67907 --- /dev/null +++ b/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/METADATA @@ -0,0 +1,134 @@ +Metadata-Version: 2.1 +Name: pywin32-ctypes +Version: 0.2.3 +Summary: A (partial) reimplementation of pywin32 using ctypes/cffi +Home-page: https://github.com/enthought/pywin32-ctypes +Author: Enthought Inc. +Author-email: info@enthough.com +License: BSD-3-Clause +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Requires-Python: >=3.6 + + +.. image:: https://readthedocs.org/projects/pywin32-ctypes/badge/?version=master + :target: http://pywin32-ctypes.readthedocs.org/en/latest/?badge=master + :alt: Documentation Status + +A reimplementation of pywin32 that is pure python. The default +behaviour will try to use cffi (>= 1.3.0), if available, and fall back +to using ctypes. Please note that there is no need to have a compiler +available on installation or at runtime. + +Usage +===== + +Example:: + + # Equivalent to 'import win32api' from pywin32. + from win32ctypes.pywin32 import win32api + + win32api.LoadLibraryEx(sys.executable, 0, win32api.LOAD_LIBRARY_AS_DATAFILE) + +.. note:: + + Currently pywin32ctypes implements only a very small subset + of pywin32, for internal needs at Enthought. We do welcome + additional features and PRs, though. + +Development setup +================= + +The following should be good enough:: + + pip install -r test_requirements.txt + python install -e . + +.. note:: + + - While pywin32-ctypes should regularly be tested on windows, you can also + develop/test on unix by using wine + +Change Log +========== + +Version 0.2.3 +------------- + +- Do not use loal_module in backend selection code (#131, #132) +- Add pywin32.pywintypes.Time (#122) + +Version 0.2.2 +------------- + +- Use ctypes.set_last_error to avoid race conditions (#122) + +Version 0.2.1 +------------- + +- Use faulthandler when testing and fix discovered errors (#115, #117). +- Fix support for None username in credentials to be consistent in all backends (#99). +- Test also on cp38, cp39, cp310, cp311 and use cp38 for linking (#114, #107, #100). +- Add support for CredEnumerate extending code from @markb-EE (#110, #109, #111) +- Remove support for older python versions < cp36 (#104, #120). + +Version 0.2.0 +------------- + +- Fix syntax error when installing in python 3.7 (#81). +- Support testing on python 3.7 (#82). +- Support testing on python 3.3 and python 3.4 (#77). +- Do not use 2to3 (#75). +- Support lazy wrapping of win32 functions (#67). +- Add CRED_PERSIST constants (#79 contributed by @tivnet). + +Version 0.1.2 +------------- + +(bugfix release) + +- Fix implementation for the deprecated api (#64). + +Version 0.1.1 +------------- + +(bugfix release) + +- Update Manifest.in entries (#63) +- fix VERSION path in Manifest.in (#62 contributed by @MinchinWeb) + + +Version 0.1.0 +------------- + +- Update tests and provide better compatibility with pywin32 for + Resource functions +- Fix: Python 3.5 and 3.6 support (#52). +- API additions to allow pywin32-ctypes to work with pyinstaller (#46 + and #57 contributed by @virtuald). +- Fix: do not update the global copy of the windows dlls (#42) +- Add documentation and setup automatic builds in ReadTheDocs (#3, #36). +- Add cffi backend to be used when available (#31). +- Fix: EnumResourceTypes and EnumResourceNames would only return ints + (#21, #30). +- Restructure package layout to split core wrapping modules from + pywin32 emulation (#15, #17). + +Version 0.0.1 +------------- + +7/04/2014 + +- Python 2.6 support (#13) +- Python 3 support (#12) +- Basic maintenance work (#11, #7) +- Fix error raising to be pywin32 compatible (#8) +- Package rename mini_pywin32 -> pywin32-ctypes +- Add travis-ci integration using wine! (#2) +- Support basic library and resource loading (#1) +- mini_pywin32 is born diff --git a/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/RECORD b/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/RECORD new file mode 100644 index 0000000..282adb3 --- /dev/null +++ b/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/RECORD @@ -0,0 +1,74 @@ +pywin32_ctypes-0.2.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pywin32_ctypes-0.2.3.dist-info/LICENSE.txt,sha256=36g7PicJrfzbg42a1VgjymdKu3gOYFY9ndlUTMv3hek,1644 +pywin32_ctypes-0.2.3.dist-info/METADATA,sha256=Hjdn0_r_TVucNHFgiDgxCY0fJaz0MGsCyazcxr-1iDs,3909 +pywin32_ctypes-0.2.3.dist-info/RECORD,, +pywin32_ctypes-0.2.3.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92 +pywin32_ctypes-0.2.3.dist-info/top_level.txt,sha256=Q67ar0C8ghsHWr96rJ8iA0mLCxbYQLxeS5fHmMODw0k,12 +win32ctypes/__init__.py,sha256=EmS7iTWm0dQUortMjTA5JEWYIH25AUBUaDPhppFfTHo,214 +win32ctypes/__pycache__/__init__.cpython-311.pyc,, +win32ctypes/__pycache__/pywintypes.cpython-311.pyc,, +win32ctypes/__pycache__/version.cpython-311.pyc,, +win32ctypes/__pycache__/win32api.cpython-311.pyc,, +win32ctypes/__pycache__/win32cred.cpython-311.pyc,, +win32ctypes/core/__init__.py,sha256=qbdg3TvIwp_CZd4nHUhGiXEw1bTKXxJHqQt-4647c1Q,1647 +win32ctypes/core/__pycache__/__init__.cpython-311.pyc,, +win32ctypes/core/__pycache__/_winerrors.cpython-311.pyc,, +win32ctypes/core/__pycache__/compat.cpython-311.pyc,, +win32ctypes/core/_winerrors.py,sha256=p52rv5vvDGMNiRvvT_npIXWEsXPoVDMtom-gmto5k0M,199 +win32ctypes/core/cffi/__init__.py,sha256=M68T4frchcWxHFZZhDm7F9Os4YbPX4RUtKBboPTsu70,270 +win32ctypes/core/cffi/__pycache__/__init__.cpython-311.pyc,, +win32ctypes/core/cffi/__pycache__/_authentication.cpython-311.pyc,, +win32ctypes/core/cffi/__pycache__/_common.cpython-311.pyc,, +win32ctypes/core/cffi/__pycache__/_dll.cpython-311.pyc,, +win32ctypes/core/cffi/__pycache__/_nl_support.cpython-311.pyc,, +win32ctypes/core/cffi/__pycache__/_resource.cpython-311.pyc,, +win32ctypes/core/cffi/__pycache__/_system_information.cpython-311.pyc,, +win32ctypes/core/cffi/__pycache__/_time.cpython-311.pyc,, +win32ctypes/core/cffi/__pycache__/_util.cpython-311.pyc,, +win32ctypes/core/cffi/_authentication.py,sha256=oRxgigZ3mB_JTXFHIlJZxWY2b35PnQaDvEbzqJNxpzs,5333 +win32ctypes/core/cffi/_common.py,sha256=tKvSSDBiYlL1gqvg1FX_RHLTYaoNWO7LJ61d78CVyf4,576 +win32ctypes/core/cffi/_dll.py,sha256=GIGxlq_6hY-OiCc0pAmPcGNav-q68jdtMdoTSCgUt64,771 +win32ctypes/core/cffi/_nl_support.py,sha256=FFxF4XcAF2W_fPvpwrrTpA61lYMRh03qwF3kF9dvFkw,313 +win32ctypes/core/cffi/_resource.py,sha256=GABPpUTN16QiXlXqYSjkw7kpJUY-DZExfMVWc8cBRlo,4555 +win32ctypes/core/cffi/_system_information.py,sha256=a_WRyYi-F9Bf299lvNMb_ZEc4zxIoL02VMj-5j_dkM8,872 +win32ctypes/core/cffi/_time.py,sha256=yEUTm7TIx_d2Me1vOFVsubOR_8Xmsob6e80n6dj9wYI,332 +win32ctypes/core/cffi/_util.py,sha256=qwc1wkFdryhvOPZf1W7nWZMkuS2o8GuPpQM2-sQCDUY,2662 +win32ctypes/core/compat.py,sha256=XPSOaAxQA4dLn0knXO9wferQb6IpVVA56AKa95W5MkU,158 +win32ctypes/core/ctypes/__init__.py,sha256=HeNUjdP0Bj5SHeb_cVMqCZa00BUTHD8E1DqFq0wpaFk,272 +win32ctypes/core/ctypes/__pycache__/__init__.cpython-311.pyc,, +win32ctypes/core/ctypes/__pycache__/_authentication.cpython-311.pyc,, +win32ctypes/core/ctypes/__pycache__/_common.cpython-311.pyc,, +win32ctypes/core/ctypes/__pycache__/_dll.cpython-311.pyc,, +win32ctypes/core/ctypes/__pycache__/_nl_support.cpython-311.pyc,, +win32ctypes/core/ctypes/__pycache__/_resource.cpython-311.pyc,, +win32ctypes/core/ctypes/__pycache__/_system_information.cpython-311.pyc,, +win32ctypes/core/ctypes/__pycache__/_time.cpython-311.pyc,, +win32ctypes/core/ctypes/__pycache__/_util.cpython-311.pyc,, +win32ctypes/core/ctypes/_authentication.py,sha256=vcNber8K_MUWDgzieTiV4wVEWl1wwTBevnMKpf6SDTM,3822 +win32ctypes/core/ctypes/_common.py,sha256=xPyUGrNusRGHPJcstR4vxPJiXD75COovAWo0EsCX7ro,1223 +win32ctypes/core/ctypes/_dll.py,sha256=mfEhaV7Nbp8pok0xg0O6GhasE6oSOOxb4cgKPe38FTg,552 +win32ctypes/core/ctypes/_nl_support.py,sha256=ST6YPzpCVq1JqiXVxEoULUTRFl_rBjMF_1qPNmsLqlU,315 +win32ctypes/core/ctypes/_resource.py,sha256=YzmBvf04Gd0pWLt0i2cIQYmaBcBW4X2Qu--sbk4331A,4264 +win32ctypes/core/ctypes/_system_information.py,sha256=TDrldTP4LTrOOGe6UVLKdFkrRwE428BWVTE2GPNHVMo,941 +win32ctypes/core/ctypes/_time.py,sha256=0XYWMiahecwh2VgCLdfoHxFqw-bufX4_RCA2sr4CSxI,342 +win32ctypes/core/ctypes/_util.py,sha256=Yb5hKGpbfnHfZX6x4oYzco5iLg6AhMTa6OCeLHf8-go,2030 +win32ctypes/pywin32/__init__.py,sha256=Wx5mqYeeweqoUDcHEBzrgDNLRPye2SoWk1MwUsDDkSU,354 +win32ctypes/pywin32/__pycache__/__init__.cpython-311.pyc,, +win32ctypes/pywin32/__pycache__/pywintypes.cpython-311.pyc,, +win32ctypes/pywin32/__pycache__/win32api.cpython-311.pyc,, +win32ctypes/pywin32/__pycache__/win32cred.cpython-311.pyc,, +win32ctypes/pywin32/pywintypes.py,sha256=kpOmM9lJ8w3BIP0T7j7efzxhroD7Yyp7Em80O8q1BrQ,1867 +win32ctypes/pywin32/win32api.py,sha256=NZ3dUJ9bdMPBhH89EDb3s_ijljFRWvy2vFwrO6bJuA8,7724 +win32ctypes/pywin32/win32cred.py,sha256=ZgSLu7NU5kAQP8a6SlHXtfTSLufAd24uO8govj1i2kA,4801 +win32ctypes/pywintypes.py,sha256=wVw61R5MJfof6hExSaI4RR3cnxEZjoJarCH80NtPnr8,350 +win32ctypes/tests/__init__.py,sha256=sr6UZPhlGoCY5Hm7pEt8NKzXKP9YIuiIObi-HO2BLiI,693 +win32ctypes/tests/__pycache__/__init__.cpython-311.pyc,, +win32ctypes/tests/__pycache__/test_backends.cpython-311.pyc,, +win32ctypes/tests/__pycache__/test_win32api.cpython-311.pyc,, +win32ctypes/tests/__pycache__/test_win32cred.cpython-311.pyc,, +win32ctypes/tests/test_backends.py,sha256=Qjlo6GC2HHkcS31wnmvLjna2UtCym2qwR1jWWcqo_EY,1245 +win32ctypes/tests/test_win32api.py,sha256=8b-ZvjAjHhUO5aCqKM2rYR_4UprSfv8AFNKSo2b5grA,11687 +win32ctypes/tests/test_win32cred.py,sha256=SM__Oj6LNPzmZIOWZwBK3nHvSRNW6Nk6AO8kk9iR9bE,7948 +win32ctypes/version.py,sha256=o4ScPsx3ebE9pX-fF55Y4NZwE-gZl1putS6aE2pTVtI,23 +win32ctypes/win32api.py,sha256=iEIHL_pJIHauSkKXKAz0CpQ-tg9lR9YJzrV68jAVjq0,346 +win32ctypes/win32cred.py,sha256=NNXVc3-4Cot0xxwJmTFzY9B6H6YEX6egQW-kbmWFkf8,348 diff --git a/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/WHEEL b/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/WHEEL new file mode 100644 index 0000000..385faab --- /dev/null +++ b/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.36.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/top_level.txt b/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/top_level.txt new file mode 100644 index 0000000..b10cf3c --- /dev/null +++ b/venv/Lib/site-packages/pywin32_ctypes-0.2.3.dist-info/top_level.txt @@ -0,0 +1 @@ +win32ctypes diff --git a/venv/Lib/site-packages/win32ctypes/__init__.py b/venv/Lib/site-packages/win32ctypes/__init__.py new file mode 100644 index 0000000..d769d60 --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/__init__.py @@ -0,0 +1,8 @@ +# +# (C) Copyright 2014 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +from .version import __version__ # noqa diff --git a/venv/Lib/site-packages/win32ctypes/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6fe815ca169500855f3bdc5a43c7627feef22e1 GIT binary patch literal 241 zcmZ3^%ge<81P9f8(ysyO#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@8G#a- zjJLSsJ}s>XD6no7RMl2sgH0M(AHlZHo5sJr8%i~MchEMfnmr{>;xn}Ff%eTeh^?_ s6lmZF!5a)Z7hvcC18)OI3-1jU+Z!xmA6c0gCB85Ki4Ukm5hu_X0MLSV&;S4c literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/__pycache__/version.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/__pycache__/version.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3d211a9df52a341dc90c63cb47551b41b0f2ce7 GIT binary patch literal 201 zcmZ3^%ge<81P9f8(#3)FV-N=h7@>^MASKfoQW&BbQW%37G?}Vc4fKrkjQunjZ*j-R zm!%dJXXfX{$FF4g4ASw-!`&(-FEKZ!q^PtqHLtKxHzzeUIYYN3KR+j?EH$qz#wRl= zrZ}@CRkt89IXf{uwK%3cGtby4xuminwOAi&o?b!aFAkgB{FKt1RJ$TJpur&b6!QUz U56p~=j5qj18@NHRhy^GF08RQe+yDRo literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/__pycache__/win32api.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/__pycache__/win32api.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4874d007d5744f7249e4fe931ace0cb5893dffb1 GIT binary patch literal 411 zcmZ3^%ge<81P9f8(xVs|7#@Q-Fu($3e6|2GrZc24q%h_%M1g3g9L5j^CWcgoEGC%Z z6y{XsWkB9)xCkRqeK3P2%S(_FKTXD4j9OKu0XeCO#i$z#6GezF-m-401_Wii6Ty*F#s9@az6k7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/__pycache__/win32cred.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/__pycache__/win32cred.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f262112c078d5ed3dbc95451f671915b71377b27 GIT binary patch literal 414 zcmZ3^%ge<81P9f8(qkAI7#@Q-Fu($3e6|2GrZc24q%h_%M1g3g9L5j^CWcgoEGC%Z z6y{XsWkB9)xCkRqeK3P2%S(_FKTXD4j9OJ@0XeCO#i;Jp0?3`DVZQ=6m}0 zNF+$0{W*4jAtw{^H%`0;bEoZY!)uM`MCS~Wbl+T(gE?>T86hcT#H7d(UC>2C%E(EX zBLR1pFX{W%r%OqHHZn?R;4EPh?30uJha@XLCohDDjEKf;c;6s z=+FW{3sRwr7NX>F*xOl&c%$|=PiSa?=%L@Zbq@H#;bh> z-=wU?+v%)MnJwSXrQrPmzfW*>P<@`xQpR%3v_)-xK5fgIwVbD>=5lw@J8X9Z=4*r! zR9KSNxtAm<=scjP3xJX?!r_t~xslSI(5&vBrSWaNaEv zquFP(_tSH;X4<0Td5|ZyK+RdW?Ps65H@v9j7`>>f>1^6kRVBY{`@Kn_zvBXmw?2r6 z_W+bg{j{9{A}(Yfa(7_1S?Qz6VAx5h>CxTTv;JI)Y>{*VytKsuAp zG0RBL*%5cxREeXC1kaAaK2T1cYE8YcD6T{_MpG7TZZ4eayio^n81|d}041^&jn|@M z6{~jc+D3G$7M-g4r`T~IbzBZF;9L%)3WKRB?i=FCBfDnnkSIi7P|cI)WT!lBq!Hk0 z`T#)5{_v{k96z0q(L7*ns;c0%O*SwNtLoFGl;Khs8i(Ok7}|=(5m0*bnob&}wn*h@YPP@V7j*K;UTFo=-?hq^;i5QF)4q}Gyh!!_OI~3iD zmh%o947eiq6R zLmcGf3bD4}Q80Lv?^YmG<@p@Tq%4R~UYTGgfnmGV4+2vrwX|F&f4z`s+T6WpE2@+! zBd4Vd^SaX7dJef<1}KpR;YUXgVY{clA&|(K_u=!K;q$NiH^LLO@I*uC*yI=mL_6VS z5vn&G#`GN2*L2W!Ssm|b#eSERV<=L>6^Zvw+aCO=A;Dw^h1^5Hq;R_Gbk}h;5x(&n zj-9~y3kGXoOUM8ojXWbvD{_@~)3s=Nmr-;c745ba(P}$G7oIrI$7EeBia(QI_!TKD z>5@0LFtnPjD0OC?71{E8G{{rvI8Lj0)ze#W-n#7aEXwO};#<$u1sP$^Ei`Uqqm$c#OiEkCnzn2Q zA2_vR22vw@=;TTN{F3413R}!WQM6?%#TKY#hg^4X5{w-@bQ@bXoOlWb?kjMNU05Vx9R<>#bN;QPNK6vI=rh|U%SLsGm!{s-LCkyFBFi>huIc2rF*S&KAlrL~lm&Sh;$ zwbB`C`&3978JGuDM$Oz3)2JO%vxaIe<*^*vG1Xi)Et-My?dBi&IC0DtV3j$3&@7fv zH}a3uKWq`F>`%ID$lOqXH~{8O&i zTxU1n1B_d97_cF59M|X}T&NVpU!C++yteKY4}T3m2}J7A zzS7;&-Tg*@_+wyJ4pi+yJvxB2(p@|~zQ4cUI2PcbSRIA(?Hyd*J0!(VAg7~Hp5DRL zy+hIk!ig^MCc#dLx2%C3?ptBsO?~)^Su&BNX2(Sc*9)~ F{srv$!;Am` literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/core/__pycache__/_winerrors.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/core/__pycache__/_winerrors.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26ac308fb47f85893b6e98acd8e806b5bc50b61c GIT binary patch literal 213 zcmZ3^%ge<81P9f8(vJh_#~=<2FhUuhK}x1Gq%cG=q%a0EXfkC^U}0eJ(`3BG?-~^3 z9~AHB9}@58AL{3_lHoH*&#wS?tC+mR+?bN0(#q7l!b07g)YRk*-IDzLoS3rIys{Xd z%%qs&%#u{yg2d$P#PrnSnDWd#W25Af%7WBl{p9?jRQ-6MNNQ10eo?VrLFF$Fo80`A k(wtPgA~v7}AeR*j0ErLGjEsyQgcyV+8u&r52{4l| z1fRk;NFddLl`jyuE|s&JAA+?G%y%>M4Lje=z31~e1onAcYrn$xTPAD6s~|muV1#`1 zgl>?J0kN+EYQEk;w&AV&WV->bgQq6|BP6!CArcxCSM~<+$0l!}F|ONMlB1jkT)2Tp zl1wWWgxfg5EiRuaFKXA9PT+PO!TK=?dc8`A5bw4k!m#5ENHB0}wB>LrNF{Q;JGV`^ zb5Dbdb5Fz(;b&gR2tYS-#c32LCgn{vf|>BToWS=09?_Rocy?b3Q>!$yN)w}$LKXeZ zmQ3Ep)|fm~qI1FIdVIMa%gSOFR0;ARSRS$rc)BfWe`*zHR&in!*$#03A&Le+wC0X&~C80K2nAL9R_dDc@9YC|Xa}|QQjxnBV7?4BO~Jn0R~3? x20jpcz$w)seuYzNhQ&orl`EVo4Qw|U*xGrTcrNfNU1U(c!k~NshKe|W`T=ACVwwN| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_authentication.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_authentication.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36fcc276ff8ba7d57639c3f865572794a8f2a087 GIT binary patch literal 7704 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 DvrMI# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_common.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_common.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..942d853daa6ed68143cf901c3aaae3fdc1228f8c GIT binary patch literal 1247 zcmZ`&&r2IY6rS15FS91qYHcf}CZM5_T4_^AEmCX|dr(q;9E1=Ead(n#-R#EMP3%ev zIauf+2M;ZJY{6Q^OaF!b2MOdL3k9JkZvk(f`eu_Xrq#*L%e=egxxJ zWFa@hA@qkiodLc*&KKZs7fDFM3d-Xo#z^8MUg7e5lE;Wc1Rnt6xP=CrbV;sllypmO zupY?+)+_Z$-ff)pNxl^n^`9|p6kGkPB(pwG%vo79WKGRb^9;96_-s}dI}8}w1(Sz) zJ_BYK84TAR@0@iRmGJ?*b?m(Pfh%*s9DU^OcHjsY;6#+8ZrHIrYsGAq&?s+t3!1DN zgjz0L-Xhcsr#g!m3WY9~Uq4T&nS9EiMU$u-8xsm4;@b&B)09++sHN0`yq3~sgG>}M z;(8`W^wg%T#-50VSs?nPs8KR0LQ0cqQOoBw^-;mJhSQ7YE7Kr)dX8%O6@$uZ?xiZN zu;2p3y}<~C!Bo)iKwmYv=lwcZ4@4S)NM-Is=-&ymUv;YH8axLO5*-!5VdQPKO0c+2 ztu756#kzLc9rh@r1GxX#i6Q-?Gn{wn4jOX_3y()#Etz?hY+Ak?F>FOF57R}<9$^c= z*V&~Z${NuU)=WyE97Gif9fTb=^#@=;1R+?Be~Epb{?70F4<13@`arBP5c|1Q z7vc>eUUS81FMzwWV42xk+=Rt0DnlQ4^#Yfm4041h19Y*GfJukVZ8*Hc0IW6@bRzVA zTB<&+%>N(IY1M~-yiR-xUn$v^cXsv7@@#0l-Jg_o0emU$Qbs9~%j7(ZHj)kl;2un! zN!3EZCLCUT4)<7Z9e7$3%c%xxQR$C!Jiv045FKuP}% literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_dll.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_dll.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77f76eb71570ad356ac6ab425e67e50007e69fe6 GIT binary patch literal 1382 zcmcIj&1(}u6n~T5O}5*nEr=EE!4+F=z_xyX2Ng>-jV-Q8>4%XJ2yu7Pq}?QSc4Muy z&_geU9=v%`P|#|r_&@j`s0hkHLGa`)q4DC$H=7R=dhz08=eKX>&HUb*_ujk-1~owW zaK>1WB!C}c(h!_`axjCxr(l6aY{-)Y$@>z%yp)jgazf542_^4O_zC!clEpy%3|PJ$ z0L6B4Q=BX(HIEQI_&g*D{oQYMq*nwh2MQmRn0ZQfbaGilqQT()f6;ep9J zvGBYx!IkN|v8nLmbxo_U=<%uO`1F)+6w{WGyU)^Wb>dNc$e6x4H#;|@+sl!hO{3{N zJ*Q8ON5jU1o)s(S^l&^j6V|Pjh@D<=LRYmLv6#^yi!e&-WJ3)<**it6WK-O!nT_0t z%ZWRS`N4aHr{Fg44B+~3sV<96{YC5Ph8f(BrV4A&o;}yAQq8{TZ|qz1?I6=$lg%RU zd^_l6ujy%Ba(f!P0oJ5;R;+;(<-xYZ?Ghf$lnSPsD;81(%vwlgGEy+%m8(mX6{vmb zBJXZH73Y%UGA1J7a&+D>m`F-U=2|WNf`}_#-g%&&aqef-DcP&V120EjjeJrsd{Hla>pNXme9B-25UK*o?ZA#9M>M2yB~@~Bw%0?oj{6&; zXeKW@E}It3cy(kVfL-v8doli2ujRc5dYzp_lL+2fM<`2#ka91O2>A#T|NfQzSo{rX fQ!Rs{$rVtDQWbzxgkFX83#|^l62Xfd1~0rnM%pjb literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_nl_support.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_nl_support.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17cfbe3ab2c29dec6149f6a2ef23f3535ff419d4 GIT binary patch literal 572 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 R`r^vd08kP{l>!Ze{{axHF$4er literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_system_information.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/core/cffi/__pycache__/_system_information.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15a4e6eb7d13ca656368c450fb41bcae351d9e57 GIT binary patch literal 1465 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 16 == 0 + + +def RESOURCE(resource): + """ Convert a resource into a compatible input for cffi. + + """ + if is_integer(resource): + resource = ffi.cast('wchar_t *', resource) + elif is_bytes(resource): + resource = str(resource) + return resource + + +def resource(lpRESOURCEID): + """ Convert the windows RESOURCE into a python friendly object. + """ + if IS_INTRESOURCE(lpRESOURCEID): + resource = int(ffi.cast("uintptr_t", lpRESOURCEID)) + else: + resource = ffi.string(lpRESOURCEID) + return resource + + +class ErrorWhen(object): + """ Callable factory for raising errors when calling cffi functions. + + """ + + def __init__(self, check, raise_on_zero=True): + """ Constructor + + Parameters + ---------- + check : + The return value that designates that an error has taken place. + + raise_on_zero : bool + When set any error will be raised. When false the winerror + is checked and only non-zero win errors are raised. Currently + this parameters is used to workaround issues with the win32 + implementation in ``wine``. + + """ + self._check = check + self._raise_on_zero = raise_on_zero + + def __call__(self, value, function_name=''): + if value == self._check: + self._raise_error(function_name) + else: + return value + + def _raise_error(self, function_name=''): + code, message = ffi.getwinerror() + exception = WindowsError() + exception.errno = ffi.errno + exception.winerror = code + exception.strerror = message + exception.function = function_name + raise exception + + +check_null = ErrorWhen(ffi.NULL) +check_zero = ErrorWhen(0) +check_false = ErrorWhen(False) + + +class Libraries(object): + + def __getattr__(self, name): + library = ffi.dlopen('{}.dll'.format(name)) + self.__dict__[name] = library + return library + + +dlls = Libraries() diff --git a/venv/Lib/site-packages/win32ctypes/core/compat.py b/venv/Lib/site-packages/win32ctypes/core/compat.py new file mode 100644 index 0000000..2de6bf2 --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/core/compat.py @@ -0,0 +1,10 @@ +def is_bytes(b): + return isinstance(b, bytes) + + +def is_text(s): + return isinstance(s, str) + + +def is_integer(i): + return isinstance(i, int) diff --git a/venv/Lib/site-packages/win32ctypes/core/ctypes/__init__.py b/venv/Lib/site-packages/win32ctypes/core/ctypes/__init__.py new file mode 100644 index 0000000..628b1eb --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/core/ctypes/__init__.py @@ -0,0 +1,11 @@ +# +# (C) Copyright 2014-2023 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +import logging + +logger = logging.getLogger(__name__) +logger.debug('Loaded ctypes backend') diff --git a/venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c02d8b82d53cc0d4996c7d88911aa1312b40b7e GIT binary patch literal 390 zcmZ3^%ge<81P9f8(ghe97#@Q-Fu)9De2xGzrZc24q%h_%L@_Wiq%vdy)j~ij(=s4? zHJl&CoXWg_1tyD3r=Y211ezDjpvn9aq{y#I)F(eNB{fAMxuminwOAo3F*!RmFGZ8} z7JE*9dU|GF`Yq1%)Dj;cJGJN*M|^x(ZkZHd{-K}DP z3Svr%N-I$S?0r|Pu8c2L#W@KdiAi%)L-@pfg u4>+Yd#IJBl&9J!0sd9x=rGf1R16w;!6VC-+m5U6jR~S?;z)%q7&-6`m!Rl54|sgElMmPAVA?mE(HxIK#^15EdS*+ zKs(%hdh`Bv=FQCaMt^X*>-xci!uCA=Mx%l$z`*Gbi zw-{YrTD}^gbX!X175ppZJF=G|Cfz!>c>aUsxE|yex6f}YSmrNCSrI;*%52PJgr(G7 z95L(O^;{;Yq_P=)J&{zh(zfnT-oVM5&`ry@DWrvTS|%UiFJfgTx(Jh@m$$dDZeLDF z8(5i7h#01aB{?N4I8KA+BBPu4P2qpo`Al?2Q~gb_yx zh%*TkHm{omlR?dx2A(#k1zUi(8gd)90?!ycYfwA3fy7~0Itkryatvk#ui(Bzr-p##Wj~7@@lWmpf*Ke4*a*=1yzru);QU2q1IM z((1LigI=96KBn@pnm3I(NuG{)2fp?(WkPw>Ir<%1Y3vjDV4m)by<<^4t#NENKpy2S zf~iB(oW;Qiolr}m_WZ=qwMRSFyfshVM$&KdR)Mb1qE8{)q~7v0vB+D=eyO#CF&`XJ z$PTHuJSEU=wy=V&GO%Oo7`3zMV>>W!ro*l^JEqg_r>ztyj*Yh2%x}wFEMrBdiKFgYT3K9NxVjvV@#Gv|iGQ%9o6~Sk?Y~T< zb2u(ZSxL99XC*PA=#Is&9podld*-69yN9 zb9-$rb$v}vDR^Qlk-VAM!1CIiROa*>wRuk^vl5=F^L!$w+#m>@OptmoxwWk`>rgR- zR8qO?ZzXNAAsmB|$d_Q-7SM}8|L*wjroNae2ajvPv`ZR-PofZzxC+dXT9aox3$r? z%gnUKOsmZF3xBwZoa`J`qs3^&<11~do)A10e?Se6f8!rl{p0)H1G^XZmY$A3Tl#vc z+&!&zPpiiBVqom4T|FJuj>XCYacv-8itUGvYN2<V)`m?+oNTXmWWGjaECO?& zGNMj2lT3NEgp{_rdZ5Zsd9>HOz(KfX>!^-YXHUL^TbppW~9F(^UXWSpCR@`ltMd{0$ig( z-JIVsLDi?~^|HG?^Ldm%kTs~DCbB^v3@UB+i;m2rO}Y_XA$z~xIkDqa4<<$cdc71=DO3{o^#9B$P&`i)~$b&T#0 zhxhQ)rSkA8ZTM92a!LNpLUG}Re`4R;U0Tt4B7Ztt_MXwaXDZ$v&3o*n#ne6iJpxjU zRjp_OJk;J}WoJZnMkz4uJKuAZ3jx1db%EpP6bFsb3 zyB6EK#(^+aLuV4g?Zj5<^c%Gl7BVmqK!d78KtzPZloM!q~ zb+@5x3TjEeAYoh&M_4IJ2H!;FADMS*SpS~14hjNv@+~;kRWn6VRWG941sC~M&}H?1 zd8#IgIsygw{~}gIolw#7_NRh=q5jlULGP*m{i&dk+WEkC4fL0ms>l>P`4X7|r(hcg zPN~ROwU1L!5?&{z{+C4heM`kr2ny&%X|wDe(cB{i2dSrbN&sD>nrF1&tay7%wq0l0 z8`iwxf~#s}s5o2*+GxN|1*)h?g2+9rx`rw=bN_vf9;{eMA*B1DU!i+dx_8%6rjKa! zk(Vs(KKeZZQm|K@$Tg%o2kTA)6^pZoODnr`DjjJ#+ROB)MvsD{D-4dVaDfF!&mq-4 zTz4F*JF4_R%gtG)!x|k1H_sTjdBzG3aPu8jyGH76p_HV6E`NDV8#?{$=Cf;MXH;`W3oQ8=Tk=2051gw2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_common.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_common.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..639de1315e31dd2877354bbd2cc0739fc5ce34a2 GIT binary patch literal 2152 zcmcgs&2JM&6rcUF*I%&-`EWvFQfO!+)gU#9DiN(zAbhAHiIPy%RjQG*I|&>1Bg}3n z4ym-2axhg6K2(B34>?p6L=XKJdTNgj%E4NxQly@^8NrED-&-dx4(+uwJHL7JK4#u~ z^Jag}WRe8hZ>J`gf0qgQ3l|4X*(Y8-5eRum3}Oft(VDZM39uF|VvCw+OPXZMnrthY zV#l&@gvnY?BurwN$8g>= z7|o^~VZuu1!ODo=20sbWjB2#`*A4?D&jAqmFMq-m_ec*q8i+9XO0&hSh zSBR0?Bu1JI9!jt(swcX8PLH{KRai z>h!K_8gvz<)LmR*x{pl#R*3^s(W&Y9VN9o%>nw-yXnF2zm~1kTIUD6-Bacz!5wq_^hrf8ymO6}9JILpL4jIAMsfmUFRU{cA z<}ge^E_jKX%+sTS-#122BX2JN@sRijTfu6jMQ;f0&){2eLxi|m`)mm3L4N}d;#kCR zTCADYFm}^)E=^8`Dy4?0`;>xA_L#L4%5ZTkj9ZacWeTM5XYo%tV%+wxB5@NVaDC0;KKSLCfs)!0#w)w4a7jwoMKBQiRHhf*3Q zDYac=%|bd&>7BKb)s*m4uq8i=fLV^*;RU1+iZHyB070uaWJ&35kawYJk5(f?d8|4 z{8imKF}8bR?71>lQ^xAqzToQKV6iq>tjn2Q`GdNWsjS!J{(7#j5tj&yC5>8mD;UBNDV0z$!(woMY1ee#(qiDobB}N6tZPt z=*Y&-00RCB{(}q*(M^?@x}|ETPTY}1;>Q5*?mm6*-FxrueIE-26AAlz*XrC;5c)2i zg=OaC;=Lg6P=EqVQHX6EDz*};wi*(fgqp2k6exj8Gofzlp2oTyqC$m$Ix3NU53Bf=L;; z(E}C%U0>rxEA|4b`;vKVxb?cli|%g$o_oXq=J!1B{^ET?7oruqdiHq3iM-HB*8_y@H#j;V7D(Xk_{our#Wt?&6guLFrA{=U98n`70F8LZB^D~4R@53h{-VH^x7 zJYYA(3sS7)vw*3JF`kwYuH!M<{GWY_>f?Xy)5`L=vOFQio1JfDX`g0i;$r$v`$(DaVSD51r;O&LQJkT?d4A|mr6Fjg$~Y& zxb!Rd4JvfHso>PD(5;gf+k%77``+=qaQFOp-wFj4ggy^jy%PlRoeo=NHfGro<_R2d z5CISA2!SIxGLbx4mpw&S5J-S!tn{}(pr74_I0{CuGQfv8Yw0;hxdJUSPe%=L<>s<| zJr{7$Bwp&qzRldgH@lY20-A8eAtY*Rd0w^!&CDRnj^8-wM zOzJhBZDMwQ(cw9BZQfxi9>D6hd2INWXD}Kk*dGqd1Y`TY%z}UzBkYfimV0MJF2m)} zvIkZVM}}b5YioYh4k)f}yy+7&io-CVtP&=xe8UTznBX&76rgmas4cFAj1XFs03A$V m|8LJgoBY=^b$6ofJ|DfDPWP(goiY1T8&kFMm`jTmMC1?OUU$_1 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_resource.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_resource.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3f7df78dd88a00420987dc5d6c757a195f6deda GIT binary patch literal 5845 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 D%_|h` literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_system_information.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_system_information.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..248899a3f697f9a96448041d095cc66659ebf760 GIT binary patch literal 1516 zcmdT^%}*0S6o1>DenAUGK+tmFB3iK}ffy4pCa3{SN<##NY?`dg?i3dG17^378cjHG z@ZiB49P|i=5d0s!dTNs%$Rs2tp1jrIiIX$CZ4ks@YP zin6od7Dz2xh{@If;0TT`#~Rl!#~T_(SX>NX5r_8>zyVwSklHTzv^Q*5`Xn@A22$Z) z9GFWX8qQ8Xotv3`LD9?Sxmg;@PJ6q^)Y!Z{JvKY}OJKm1NL$n;tggs!FtKT(P_$H6 zw=KD#sIE;)6lsRxsEwENCy$a<3{E~Vu?;T2raqRNy4%bJV2_<1G%fGI4L9%rZ{Z9w zz>sYDLpXbP^G4?5ap$A<&iE`hxPuwk7jmgE4XJKv6+5(BC0KE>T(or6*08)#EEF&y z98Y`YCyIk7usf$)n!VvX(+RGpuPTm9c)B#Wt{6qUFVK+h>hP5MPhU?w%v*|?cS*5? zt+lnZfw8)jc5U0puVZUHpVb%gj_%_0s-mtai`dC;=+?-vAJ&j+6FgMcWvAr0*pzjv zU=vf}JY-f&v`fAuGSbc7-o}>mfQd~wj(1k$slz*!_((NAvN?W?`gUIJ&R0;TiZW%C zId1LvF#2)*^G2ohc9qX`8KqB{EBv4268<@*!i0ZIgxA4mvZul1j91DgktD$(oJZ2Z z#Wf~;0!bHBX(zAod7m51!mU@9IJq;vJ6S>LD&p0=w8Z2(yCBu!#Yx+JqBE=kyr%R6 z;*Cv$TzJhGl#8xzkO)7Ba>1M3qnq%6Xk-Nw3mYTDwCj?-m?Qk3f_7d^XO8qT%RYD! zd0C%E9+|dQH1K26&rH0Zo$pN4L_rX02@u*g-*Ww9NQkDw%<|Im-qurl%cm4gXCcO=G{8-)_G)-Ba;l- I<4-TwzZauc?*IS* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_time.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/core/ctypes/__pycache__/_time.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..805e4bb5c3502f09618c2bfd410f5b15d5a55fbd GIT binary patch literal 456 zcmZus%SyvQ6upy7Y7j%)9}p`jWYHGdoroI?-P8wFDuh6&$+V`OB<*BU$Fg6@~0lG3trH&G%c6HXQ zO+-5AQj+ULzRlghw>oW`2P{soLuq)bt4Y@8@qmP-Ti5?1EVWD&E8;F?X*5ey6SYs6 zPiVE0Y}ESl2W`9G?vl_H`PIteEoD1kq`c%7cRf-X#B=q~3!I3OBbF5r>BqvBXj2&>G|d6p s9YbNgK0zP{+|9R|Qm1JHZb=GFi=eG44y7L=GJ+O?Or*u#og{A7-gI`| zkkpa3C=xE}AxNO~*i%YW&YZaLAK1te)=H5oapHoE!U6Tfn_2HBc2kK%$KE#|?_=Kn z-kUf3B$0?CXunR(%>NZd=nppWTev;g{TT+ENJlxOV_h(CQOF6!P%cyyb0S7D`027P zuH#%-@6p51N1%^D9~BUZZh`hw-zLgQz>5Me2E14oFAh8jcrx(hE?$p-t|C3Qj`TQ5 zY=yukJYLHsK|a|f->ZjipiE-*?ewR1!6?`(>A7-AvkPX)O50|7ff!5a<$}GC*6fuf zVx^a9erc&tnxBgQ$*g8VZgQU3s*$&Bl~8I@SH5D>V&49MPa>ZcN|$G5vYOa-f^`Bs z%&XmZfo!4*z8|gN3Q}R_wTb{U9Lz$%55Wr4VC2&Jq zAlhO^bS3{~+$0E=i=zH2q;z+7rf_T4D%fOlDX%T&=ZQ7DTqsSS@xVH*nUtJvkJU2ZJGHdp zrhK2&xx8kZbcLp1y97MeBoGI+B1jsnMaP<>C#zCJ8fgw4bFMYS{$_Mw|Ek>Qe6$M+ zNDFX*3B#3R`wI*R z^JQPyPlTw7s()G_>M)D=(hy%!g_GsAig*K2Hp@tq8K*2DZrHMEVab(L6+%K()$M`g z(#>VdOEn3Q=W(Pmla@f5Pcva}Araut)Ll_Cb>hl8u{5yC65frGuQbAk7ITwjK$`Y4 zWAS2sk$Cw{M`2+Y9_tGr4%(4N>hj@+eAv0Xqa1mp*Ol>xGXA@g`Ax~xl~WDnl=ERT z+Fy%~Hiy%V;Y>BLlN$Xl`F+y4-W)mNTyKbj&5?v5EeHijFwlnJ*?kkp4;T&_a#H&fqJkfYTVV8Q5bUqv7`CC` z#{5mU!)^plR@tyU6l4B5vRn~{7UfX*a5-(b_(@VrWy4sV*cl@5Q$AF^w4;nZ`uy=)T{+iK&eeL(HG2oD369A&yeZ$79%o9-`7hgXQuYk` zo6!m2Gr?U(zVQ8BJ9@zDc#(rl|5pGYl9Y+lql~111PR%R z@G7CEk1!kiFWrqWRq^Gq^GW-&b6LI;pI z>KUqugI*j!BWQj_+3km=O+-)*!#9fnbp+)?x&U<~gpstt>*%D$MRh zuG$e1C`3OAoz-MbU>Esqe?utwOs~SX$llCgH(9pGzE20pHdaVjh1Uz3t*YROXc1%1 z6?w^y8r-WDi}?`LW?5C?3nXvbR8?080>`KJEnfq9i{&%KMj3w8|D#@0rt8XdLz%8d zo3EXyiVqVTdR;o)>>aEoIb_+4NEtwGTvdyvUN-oJqpEkxdBeMY=zGBCA@qXDE(&_a zCoF5NaUf3cYl)%o5Gy?0#M5W0nNT*H^=`hD8wD6l4eq&!_X)9g6>^yPXM>l#;p{_VhaIz zhTf^Y{NIw$v5978vK5wae+zYz!5AKBp-wU!#!!YkNeU&?wZzeSVyuxEbK-QXy{djEt1Ak7v AWB>pF literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/core/ctypes/_authentication.py b/venv/Lib/site-packages/win32ctypes/core/ctypes/_authentication.py new file mode 100644 index 0000000..508f4b1 --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/core/ctypes/_authentication.py @@ -0,0 +1,122 @@ +# +# (C) Copyright 2014-18 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +import ctypes +from ctypes import POINTER, Structure, c_void_p, c_wchar_p, c_char_p, cast +from ctypes.wintypes import ( + BOOL, DWORD, FILETIME, LPCWSTR) + +from win32ctypes.core.compat import is_text +from ._common import LPBYTE, _PyBytes_FromStringAndSize +from ._util import function_factory, check_false_factory, dlls +from ._nl_support import _GetACP + + +SUPPORTED_CREDKEYS = set(( + u'Type', u'TargetName', u'Persist', + u'UserName', u'Comment', u'CredentialBlob')) + + +class CREDENTIAL(Structure): + _fields_ = [ + ("Flags", DWORD), + ("Type", DWORD), + ("TargetName", c_wchar_p), + ("Comment", c_wchar_p), + ("LastWritten", FILETIME), + ("CredentialBlobSize", DWORD), + ("CredentialBlob", LPBYTE), + ("Persist", DWORD), + ("_DO_NOT_USE_AttributeCount", DWORD), + ("__DO_NOT_USE_Attribute", c_void_p), + ("TargetAlias", c_wchar_p), + ("UserName", c_wchar_p)] + + @classmethod + def fromdict(cls, credential, flags=0): + unsupported = set(credential.keys()) - SUPPORTED_CREDKEYS + if len(unsupported): + raise ValueError("Unsupported keys: {0}".format(unsupported)) + if flags != 0: + raise ValueError("flag != 0 not yet supported") + + c_creds = cls() + c_pcreds = PCREDENTIAL(c_creds) + + # zero-out memory + ctypes.memset(c_pcreds, 0, ctypes.sizeof(c_creds)) + + for key in SUPPORTED_CREDKEYS: + if key in credential: + if key != 'CredentialBlob': + setattr(c_creds, key, credential[key]) + else: + blob = make_unicode(credential['CredentialBlob']) + blob_data = ctypes.create_unicode_buffer(blob) + # Create_unicode_buffer adds a NULL at the end of the + # string we do not want that. + c_creds.CredentialBlobSize = \ + ctypes.sizeof(blob_data) - \ + ctypes.sizeof(ctypes.c_wchar) + c_creds.CredentialBlob = ctypes.cast(blob_data, LPBYTE) + return c_creds + + +PCREDENTIAL = POINTER(CREDENTIAL) +PPCREDENTIAL = POINTER(PCREDENTIAL) +PPPCREDENTIAL = POINTER(PPCREDENTIAL) + + +def make_unicode(text): + """ Convert the input string to unicode. + + """ + if is_text(text): + return text + else: + code_page = _GetACP() + return text.decode(encoding=str(code_page), errors='strict') + + +def credential2dict(creds): + credential = {} + for key in SUPPORTED_CREDKEYS: + if key != u'CredentialBlob': + credential[key] = getattr(creds, key) + else: + blob = _PyBytes_FromStringAndSize( + cast(creds.CredentialBlob, c_char_p), + creds.CredentialBlobSize) + credential[u'CredentialBlob'] = blob + return credential + + +_CredWrite = function_factory( + dlls.advapi32.CredWriteW, + [PCREDENTIAL, DWORD], + BOOL, + check_false_factory("CredWrite")) + +_CredRead = function_factory( + dlls.advapi32.CredReadW, + [LPCWSTR, DWORD, DWORD, PPCREDENTIAL], + BOOL, + check_false_factory("CredRead")) + +_CredDelete = function_factory( + dlls.advapi32.CredDeleteW, + [LPCWSTR, DWORD, DWORD], + BOOL, + check_false_factory("CredDelete")) + +_CredEnumerate = function_factory( + dlls.advapi32.CredEnumerateW, + [LPCWSTR, DWORD, POINTER(DWORD), PPPCREDENTIAL], + BOOL, + check_false_factory("CredEnumerate")) + +_CredFree = function_factory(dlls.advapi32.CredFree, [PCREDENTIAL]) diff --git a/venv/Lib/site-packages/win32ctypes/core/ctypes/_common.py b/venv/Lib/site-packages/win32ctypes/core/ctypes/_common.py new file mode 100644 index 0000000..2067bb7 --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/core/ctypes/_common.py @@ -0,0 +1,53 @@ +# +# (C) Copyright 2014 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +import ctypes +import sys +from ctypes import ( + pythonapi, POINTER, c_void_p, py_object, c_char_p, c_int, c_long, c_int64, + c_longlong) +from ctypes import cast # noqa imported here for convenience +from ctypes.wintypes import BYTE + +from ._util import function_factory + +PPy_UNICODE = c_void_p +LPBYTE = POINTER(BYTE) +is_64bits = sys.maxsize > 2**32 +Py_ssize_t = c_int64 if is_64bits else c_int + +if ctypes.sizeof(c_long) == ctypes.sizeof(c_void_p): + LONG_PTR = c_long +elif ctypes.sizeof(c_longlong) == ctypes.sizeof(c_void_p): + LONG_PTR = c_longlong + +_PyBytes_FromStringAndSize = function_factory( + pythonapi.PyBytes_FromStringAndSize, + [c_char_p, Py_ssize_t], + return_type=py_object) + + +def IS_INTRESOURCE(x): + return x >> 16 == 0 + + +byreference = ctypes.byref + + +def dereference(x): + return x.contents + + +class Libraries(object): + + def __getattr__(self, name): + library = ctypes.WinDLL(name) + self.__dict__[name] = library + return library + + +dlls = Libraries() diff --git a/venv/Lib/site-packages/win32ctypes/core/ctypes/_dll.py b/venv/Lib/site-packages/win32ctypes/core/ctypes/_dll.py new file mode 100644 index 0000000..e44c663 --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/core/ctypes/_dll.py @@ -0,0 +1,21 @@ +# +# (C) Copyright 2018 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +from ctypes.wintypes import BOOL, DWORD, HANDLE, HMODULE, LPCWSTR + +from ._util import check_null, check_false, function_factory, dlls + +_LoadLibraryEx = function_factory( + dlls.kernel32.LoadLibraryExW, + [LPCWSTR, HANDLE, DWORD], + HMODULE, check_null) + +_FreeLibrary = function_factory( + dlls.kernel32.FreeLibrary, + [HMODULE], + BOOL, + check_false) diff --git a/venv/Lib/site-packages/win32ctypes/core/ctypes/_nl_support.py b/venv/Lib/site-packages/win32ctypes/core/ctypes/_nl_support.py new file mode 100644 index 0000000..9a3a07d --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/core/ctypes/_nl_support.py @@ -0,0 +1,12 @@ +# +# (C) Copyright 2018 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +from ctypes.wintypes import UINT + +from ._util import function_factory, dlls + +_GetACP = function_factory(dlls.kernel32.GetACP, None, UINT) diff --git a/venv/Lib/site-packages/win32ctypes/core/ctypes/_resource.py b/venv/Lib/site-packages/win32ctypes/core/ctypes/_resource.py new file mode 100644 index 0000000..23adb1f --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/core/ctypes/_resource.py @@ -0,0 +1,148 @@ +# +# (C) Copyright 2018 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +import ctypes +from ctypes.wintypes import ( + BOOL, DWORD, HANDLE, HMODULE, LPCWSTR, WORD, HRSRC, + HGLOBAL, LPVOID) + +from ._common import LONG_PTR, IS_INTRESOURCE +from ._util import check_null, check_zero, check_false, function_factory, dlls + +_ENUMRESTYPEPROC = ctypes.WINFUNCTYPE(BOOL, HMODULE, LPVOID, LONG_PTR) +_ENUMRESNAMEPROC = ctypes.WINFUNCTYPE(BOOL, HMODULE, LPVOID, LPVOID, LONG_PTR) +_ENUMRESLANGPROC = ctypes.WINFUNCTYPE( + BOOL, HMODULE, LPVOID, LPVOID, WORD, LONG_PTR) + + +def ENUMRESTYPEPROC(callback): + def wrapped(handle, type_, param): + if IS_INTRESOURCE(type_): + type_ = int(type_) + else: + type_ = ctypes.cast(type_, LPCWSTR).value + return callback(handle, type_, param) + + return _ENUMRESTYPEPROC(wrapped) + + +def ENUMRESNAMEPROC(callback): + def wrapped(handle, type_, name, param): + if IS_INTRESOURCE(type_): + type_ = int(type_) + else: + type_ = ctypes.cast(type_, LPCWSTR).value + if name is None: + return False + elif IS_INTRESOURCE(name): + name = int(name) + else: + name = ctypes.cast(name, LPCWSTR).value + return callback(handle, type_, name, param) + + return _ENUMRESNAMEPROC(wrapped) + + +def ENUMRESLANGPROC(callback): + def wrapped(handle, type_, name, language, param): + if IS_INTRESOURCE(type_): + type_ = int(type_) + else: + type_ = ctypes.cast(type_, LPCWSTR).value + if IS_INTRESOURCE(name): + name = int(name) + else: + name = ctypes.cast(name, LPCWSTR).value + return callback(handle, type_, name, language, param) + + return _ENUMRESLANGPROC(wrapped) + + +def _UpdateResource(hUpdate, lpType, lpName, wLanguage, lpData, cbData): + lp_type = LPCWSTR(lpType) + lp_name = LPCWSTR(lpName) + _BaseUpdateResource(hUpdate, lp_type, lp_name, wLanguage, lpData, cbData) + + +def _EnumResourceNames(hModule, lpszType, lpEnumFunc, lParam): + resource_type = LPCWSTR(lpszType) + _BaseEnumResourceNames(hModule, resource_type, lpEnumFunc, lParam) + + +def _EnumResourceLanguages(hModule, lpType, lpName, lpEnumFunc, lParam): + resource_type = LPCWSTR(lpType) + resource_name = LPCWSTR(lpName) + _BaseEnumResourceLanguages( + hModule, resource_type, resource_name, lpEnumFunc, lParam) + + +def _FindResourceEx(hModule, lpType, lpName, wLanguage): + resource_type = LPCWSTR(lpType) + resource_name = LPCWSTR(lpName) + return _BaseFindResourceEx( + hModule, resource_type, resource_name, wLanguage) + + +_EnumResourceTypes = function_factory( + dlls.kernel32.EnumResourceTypesW, + [HMODULE, _ENUMRESTYPEPROC, LONG_PTR], + BOOL, + check_false) + +_LoadResource = function_factory( + dlls.kernel32.LoadResource, + [HMODULE, HRSRC], + HGLOBAL, + check_null) + +_LockResource = function_factory( + dlls.kernel32.LockResource, + [HGLOBAL], + LPVOID, + check_null) + +_SizeofResource = function_factory( + dlls.kernel32.SizeofResource, + [HMODULE, HRSRC], + DWORD, + check_zero) + +_BeginUpdateResource = function_factory( + dlls.kernel32.BeginUpdateResourceW, + [LPCWSTR, BOOL], + HANDLE, + check_null) + +_EndUpdateResource = function_factory( + dlls.kernel32.EndUpdateResourceW, + [HANDLE, BOOL], + BOOL, + check_false) + +_BaseEnumResourceNames = function_factory( + dlls.kernel32.EnumResourceNamesW, + [HMODULE, LPCWSTR, _ENUMRESNAMEPROC, LONG_PTR], + BOOL, + check_false) + +_BaseEnumResourceLanguages = function_factory( + dlls.kernel32.EnumResourceLanguagesW, + [HMODULE, LPCWSTR, LPCWSTR, _ENUMRESLANGPROC, LONG_PTR], + BOOL, + check_false) + +_BaseFindResourceEx = function_factory( + dlls.kernel32.FindResourceExW, + [HMODULE, LPCWSTR, LPCWSTR, WORD], + HRSRC, + check_null) + +_BaseUpdateResource = function_factory( + dlls.kernel32.UpdateResourceW, + [HANDLE, LPCWSTR, LPCWSTR, WORD, LPVOID, DWORD], + BOOL, + check_false) diff --git a/venv/Lib/site-packages/win32ctypes/core/ctypes/_system_information.py b/venv/Lib/site-packages/win32ctypes/core/ctypes/_system_information.py new file mode 100644 index 0000000..1a38757 --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/core/ctypes/_system_information.py @@ -0,0 +1,36 @@ +# +# (C) Copyright 2018 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +import ctypes +from ctypes.wintypes import LPCWSTR, UINT, LPWSTR, MAX_PATH + +from ._util import check_zero, function_factory, dlls + + +def _GetWindowsDirectory(): + buffer = ctypes.create_unicode_buffer(MAX_PATH) + _BaseGetWindowsDirectory(buffer, MAX_PATH) + return ctypes.cast(buffer, LPCWSTR).value + + +def _GetSystemDirectory(): + buffer = ctypes.create_unicode_buffer(MAX_PATH) + _BaseGetSystemDirectory(buffer, MAX_PATH) + return ctypes.cast(buffer, LPCWSTR).value + + +_BaseGetWindowsDirectory = function_factory( + dlls.kernel32.GetWindowsDirectoryW, + [LPWSTR, UINT], + UINT, + check_zero) + +_BaseGetSystemDirectory = function_factory( + dlls.kernel32.GetSystemDirectoryW, + [LPWSTR, UINT], + UINT, + check_zero) diff --git a/venv/Lib/site-packages/win32ctypes/core/ctypes/_time.py b/venv/Lib/site-packages/win32ctypes/core/ctypes/_time.py new file mode 100644 index 0000000..da8a936 --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/core/ctypes/_time.py @@ -0,0 +1,15 @@ +# +# (C) Copyright 2018 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +from ctypes.wintypes import DWORD + +from ._util import function_factory, dlls + + +_GetTickCount = function_factory( + dlls.kernel32.GetTickCount, + None, DWORD) diff --git a/venv/Lib/site-packages/win32ctypes/core/ctypes/_util.py b/venv/Lib/site-packages/win32ctypes/core/ctypes/_util.py new file mode 100644 index 0000000..27b5fc4 --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/core/ctypes/_util.py @@ -0,0 +1,78 @@ +# +# (C) Copyright 2014 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +""" Utility functions to help with ctypes wrapping. +""" +from ctypes import get_last_error, FormatError, WinDLL + + +def function_factory( + function, argument_types=None, + return_type=None, error_checking=None): + if argument_types is not None: + function.argtypes = argument_types + function.restype = return_type + if error_checking is not None: + function.errcheck = error_checking + return function + + +def make_error(function, function_name=None): + code = get_last_error() + description = FormatError(code).strip() + if function_name is None: + function_name = function.__name__ + exception = WindowsError() + exception.winerror = code + exception.function = function_name + exception.strerror = description + return exception + + +def check_null_factory(function_name=None): + def check_null(result, function, arguments, *args): + if result is None: + raise make_error(function, function_name) + return result + return check_null + + +check_null = check_null_factory() + + +def check_zero_factory(function_name=None): + def check_zero(result, function, arguments, *args): + if result == 0: + raise make_error(function, function_name) + return result + return check_zero + + +check_zero = check_zero_factory() + + +def check_false_factory(function_name=None): + def check_false(result, function, arguments, *args): + if not bool(result): + raise make_error(function, function_name) + else: + return True + return check_false + + +check_false = check_false_factory() + + +class Libraries(object): + + def __getattr__(self, name): + library = WinDLL(name, use_last_error=True) + self.__dict__[name] = library + return library + + +dlls = Libraries() diff --git a/venv/Lib/site-packages/win32ctypes/pywin32/__init__.py b/venv/Lib/site-packages/win32ctypes/pywin32/__init__.py new file mode 100644 index 0000000..3fc135b --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/pywin32/__init__.py @@ -0,0 +1,12 @@ +# +# (C) Copyright 2014 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +from win32ctypes.pywin32 import pywintypes +from win32ctypes.pywin32 import win32api +from win32ctypes.pywin32 import win32cred + +__all__ = ['win32api', 'win32cred', 'pywintypes'] diff --git a/venv/Lib/site-packages/win32ctypes/pywin32/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/pywin32/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1784240cc8fa980cdd5db5662ada8c4a76e555a9 GIT binary patch literal 398 zcmY+A%Syvg5Qb-Rv2COv_zq%}SWI^!Zruby+=aj)O%5@5a_LE0$JMNZe76ToY>d2mj?=Qrc|ld5cx?N5Og!i~kUTV1snN95+oV#u zGxg^9x7}@CbVtT^*ZiMtdW`u(Ft&g-ZNcXL_R35B#4F{j;^}m13C@E@tIRUt&3QWa zoOt3DamlUR51#yp7v7G`XzMa!EKcK+F|ytCuahjC34S9F$$`EJ3Ww54Ma0z+;CT&a ayIR6&y{{#h^}arh%evD`uYGbr2Y&#O)oT<0 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/pywin32/__pycache__/pywintypes.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/pywin32/__pycache__/pywintypes.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08c7bf35ca771da195723b50d080a5e572ab14cc GIT binary patch literal 3345 zcmbVOU2Gf25#IYFc_hV?Oo@)H{G4pjHLc2)8n=O6xv^2ZhMPnxs=`540R(+_k|~i# zYVT-SDisKZ0-z2J_1s-#RJcZAt*`UTOhP;{@*d&jk^3+q1S<$f#f^A3> z4%qUlxJhQiDmz0`;kC2!WjS9^OF2zmxs_FJ$wsMIEKt*sl|nvW(B%)ax>{Hq3p<}uWs`kHmF3{hI*p(CNOGDL6?MTg2H?f27zD(S3)729FOc3H8Whqjep z2P>|_itDoS_oHp)*GeSrQ1x0a{#=!ep%$e62Z!W!{Gd=;fL7Khstt+3455$Vl zi1cnv+&f=6-*{cF_C35-xpM!5$_L-QE~D`OH#S3kR_NHyxmswfIs(jnpB(o^SJ;E; z0DO6j7=|;Qw!`VPdjLR=rqj!%OwMg_7WEH85y~`<47bu@h*jeRunqrdu`%IHiyUUI zJ(_l%lmIBu!yX>p_u$}c6A|EWgKW29ae|o8;?W49lk3FvAw~dBD)Si7^3(^b5mZ@# zyk9pV5qVT5i--V+K=%89>;tqrQQU=-yG}kLE6fVH!~GG;6gTAp(ZO7>q%Y}(6&=7D zZ6}GVc(Co@t&EW|O-hf!Xl~3fH_|9DNF1W(!PY>)%T8$RXd71!gy>t)Fbtou4D7$~ zY>*Z&2)|<*p`ME1JujM(qbp^>B@C0`erj0-@0z~ zpL`-(r!M^Kx-~gfk4;;#=~`&|1yC!9u0Sww$2a*fxfj0N%RPAKa)kRTB7oSnfnEsr z641LN)$uC3$w0E>;A9IFH|!;wR1~i})Cnr_+xsc7ZP>{wl!xhH>H~+2lX@Wq%wy_J zu@sSLbMtxAzyaiTGy}gW(0s;Rle{E-##M|#A7^zNq#?yWTfeuyGgFs_EorzG8g_sR z{wYR2#nS;OC@zj3MV3VN8nXQZfs1gKI0}Ms3RuU1;2GgK#Q)XIb%OSXE&?YqH()sj zE&^h9#IPIr6mUO7OdrXwIvw;9#2I}bqVCIco#`B>>YtiUGc&SZTf~#>(82xczPMn1 zi1#*?iHSM0P5YPmqJMQ9SmB31Fec;-mHoKmI_n;Foi%YE+f*jqt#G+HF@=j1BB*wF zQTa7k<5~|P;GrY#uZ~BV?e;qZx$H++9hl7wBt#Pd*Cxn$NxbeCF>^Si3hnv!n?s%s z_L^JtW7$2AyUbmP&pP)J*OA2nQ?`hw$1D|d+AhX>7xUACUem4u5$<2*Zsz3w0L}CrXqdpp1b_@K z++g2U^2^ui!Q)mC4q=~=Xh{8)XjAOn8rX@{#Su#!X%Pw3{e#=nUrg8glU9GSA~vO? z-%816Qu1%=qoseQ>L(|ylaqDnq9t9dg)TP5_}0}gfBEoTYv}E|c+L{fwMbM*GzSJB z{HZ!nrB9eDeKc4f7_|mQE8%7&Rw@1E!u<<7N1jE7YLTHvG_jMcG7nExZ`6;C)}y19 z-}>WK7wgi5B~8>q6D>X~3Q^eos=Oq&h_Y%%R+R0>DKz1{3syMI2T!|xJxZZBs; z4y4PMp-J~o<5zSNj4>M+{|46L7=~%}66O~*^797it9fsO9I1J4gG4r*r$J8Fy5Ckn zV&K=~FsodDj@s|{n??v5wU}cqHo)MmiTpW7*r9#h5sm@C9A=f(=cxUDzbSfzft@(a HoYek5%IL{e literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/pywin32/__pycache__/win32api.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/pywin32/__pycache__/win32api.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..732daaee063ef80f3b8c5e32fc61dd168136b401 GIT binary patch literal 11780 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 0: + self.winerror = args[0] + else: + self.winerror = None + if nargs > 1: + self.funcname = args[1] + else: + self.funcname = None + if nargs > 2: + self.strerror = args[2] + else: + self.strerror = None + Exception.__init__(self, *args, **kw) + + +@contextlib.contextmanager +def pywin32error(): + try: + yield + except WindowsError as exception: + if not hasattr(exception, 'function'): + exception.function = 'unknown' + raise error(exception.winerror, exception.function, exception.strerror) + + +class datetime(_datetime): + + def Format(self, fmt='%c'): + return self.strftime(fmt) + + +def Time(value): + if isinstance(value, datetime): + return value + elif hasattr(value, 'timetuple'): + timetuple = value.timetuple() + return datetime.fromtimestamp(time.mktime(timetuple)) + elif isinstance(value, collections.abc.Sequence): + time_value = time.mktime(value[:9]) + if len(value) == 10: + time_value += value[9] / 1000.0 + return datetime.fromtimestamp(time_value) + else: + try: + return datetime.fromtimestamp(value) + except OSError as error: + if error.errno == 22: + raise ValueError(error.strerror) + else: + raise diff --git a/venv/Lib/site-packages/win32ctypes/pywin32/win32api.py b/venv/Lib/site-packages/win32ctypes/pywin32/win32api.py new file mode 100644 index 0000000..18e1934 --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/pywin32/win32api.py @@ -0,0 +1,294 @@ +# +# (C) Copyright 2014 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +""" A module, encapsulating the Windows Win32 API. """ +from win32ctypes.core import ( + _common, _dll, _resource, _system_information, _backend, _time) +from win32ctypes.pywin32.pywintypes import pywin32error as _pywin32error + +LOAD_LIBRARY_AS_DATAFILE = 0x2 +LANG_NEUTRAL = 0x00 + + +def LoadLibraryEx(fileName, handle, flags): + """ Loads the specified DLL, and returns the handle. + + Parameters + ---------- + fileName : unicode + The filename of the module to load. + + handle : int + Reserved, always zero. + + flags : int + The action to be taken when loading the module. + + Returns + ------- + handle : hModule + The handle of the loaded module + + """ + if not handle == 0: + raise ValueError("handle != 0 not supported") + with _pywin32error(): + return _dll._LoadLibraryEx(fileName, 0, flags) + + +def EnumResourceTypes(hModule): + """ Enumerates resource types within a module. + + Parameters + ---------- + hModule : handle + The handle to the module. + + Returns + ------- + resource_types : list + The list of resource types in the module. + + """ + resource_types = [] + + def callback(hModule, type_, param): + resource_types.append(type_) + return True + + with _pywin32error(): + _resource._EnumResourceTypes( + hModule, _resource.ENUMRESTYPEPROC(callback), 0) + return resource_types + + +def EnumResourceNames(hModule, resType): + """ Enumerates all the resources of the specified type within a module. + + Parameters + ---------- + hModule : handle + The handle to the module. + resType : str : int + The type or id of resource to enumerate. + + Returns + ------- + resource_names : list + The list of resource names (unicode strings) of the specific + resource type in the module. + + """ + resource_names = [] + + def callback(hModule, type_, type_name, param): + resource_names.append(type_name) + return True + + with _pywin32error(): + _resource._EnumResourceNames( + hModule, resType, _resource.ENUMRESNAMEPROC(callback), 0) + return resource_names + + +def EnumResourceLanguages(hModule, lpType, lpName): + """ List languages of a resource module. + + Parameters + ---------- + hModule : handle + Handle to the resource module. + + lpType : str : int + The type or id of resource to enumerate. + + lpName : str : int + The type or id of resource to enumerate. + + Returns + ------- + resource_languages : list + List of the resource language ids. + + """ + resource_languages = [] + + def callback(hModule, type_name, res_name, language_id, param): + resource_languages.append(language_id) + return True + + with _pywin32error(): + _resource._EnumResourceLanguages( + hModule, lpType, lpName, _resource.ENUMRESLANGPROC(callback), 0) + return resource_languages + + +def LoadResource(hModule, type, name, language=LANG_NEUTRAL): + """ Find and Load a resource component. + + Parameters + ---------- + handle : hModule + The handle of the module containing the resource. + Use None for current process executable. + + type : str : int + The type of resource to load. + + name : str : int + The name or Id of the resource to load. + + language : int + Language to use, default is LANG_NEUTRAL. + + Returns + ------- + resource : bytes + The byte string blob of the resource + + """ + with _pywin32error(): + hrsrc = _resource._FindResourceEx(hModule, type, name, language) + size = _resource._SizeofResource(hModule, hrsrc) + hglob = _resource._LoadResource(hModule, hrsrc) + if _backend == 'ctypes': + pointer = _common.cast( + _resource._LockResource(hglob), _common.c_char_p) + else: + pointer = _resource._LockResource(hglob) + return _common._PyBytes_FromStringAndSize(pointer, size) + + +def FreeLibrary(hModule): + """ Free the loaded dynamic-link library (DLL) module. + + If necessary, decrements its reference count. + + Parameters + ---------- + handle : hModule + The handle to the library as returned by the LoadLibrary function. + + """ + with _pywin32error(): + return _dll._FreeLibrary(hModule) + + +def GetTickCount(): + """ The number of milliseconds that have elapsed since startup + + Returns + ------- + counts : int + The millisecond counts since system startup. + """ + return _time._GetTickCount() + + +def BeginUpdateResource(filename, delete): + """ Get a handle that can be used by the :func:`UpdateResource`. + + Parameters + ---------- + fileName : unicode + The filename of the module to load. + delete : bool + When true all existing resources are deleted + + Returns + ------- + result : hModule + Handle of the resource. + + """ + with _pywin32error(): + return _resource._BeginUpdateResource(filename, delete) + + +def EndUpdateResource(handle, discard): + """ End the update resource of the handle. + + Parameters + ---------- + handle : hModule + The handle of the resource as it is returned + by :func:`BeginUpdateResource` + + discard : bool + When True all writes are discarded. + + """ + with _pywin32error(): + _resource._EndUpdateResource(handle, discard) + + +def UpdateResource(handle, type, name, data, language=LANG_NEUTRAL): + """ Update a resource. + + Parameters + ---------- + handle : hModule + The handle of the resource file as returned by + :func:`BeginUpdateResource`. + + type : str : int + The type of resource to update. + + name : str : int + The name or Id of the resource to update. + + data : bytes + A bytes like object is expected. + + .. note:: + PyWin32 version 219, on Python 2.7, can handle unicode inputs. + However, the data are stored as bytes and it is not really + possible to convert the information back into the original + unicode string. To be consistent with the Python 3 behaviour + of PyWin32, we raise an error if the input cannot be + converted to `bytes`. + + language : int + Language to use, default is LANG_NEUTRAL. + + """ + with _pywin32error(): + try: + lp_data = bytes(data) + except UnicodeEncodeError: + raise TypeError( + "a bytes-like object is required, not a 'unicode'") + _resource._UpdateResource( + handle, type, name, language, lp_data, len(lp_data)) + + +def GetWindowsDirectory(): + """ Get the ``Windows`` directory. + + Returns + ------- + result : str + The path to the ``Windows`` directory. + + """ + with _pywin32error(): + # Note: pywin32 returns str on py27, unicode (which is str) on py3 + return str(_system_information._GetWindowsDirectory()) + + +def GetSystemDirectory(): + """ Get the ``System`` directory. + + Returns + ------- + result : str + The path to the ``System`` directory. + + """ + with _pywin32error(): + # Note: pywin32 returns str on py27, unicode (which is str) on py3 + return str(_system_information._GetSystemDirectory()) diff --git a/venv/Lib/site-packages/win32ctypes/pywin32/win32cred.py b/venv/Lib/site-packages/win32ctypes/pywin32/win32cred.py new file mode 100644 index 0000000..0f37f1d --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/pywin32/win32cred.py @@ -0,0 +1,145 @@ +# +# (C) Copyright 2014 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +""" Interface to credentials management functions. """ +from win32ctypes.core import _authentication, _common, _backend +from win32ctypes.pywin32.pywintypes import pywin32error as _pywin32error + +CRED_TYPE_GENERIC = 0x1 +CRED_PERSIST_SESSION = 0x1 +CRED_PERSIST_LOCAL_MACHINE = 0x2 +CRED_PERSIST_ENTERPRISE = 0x3 +CRED_PRESERVE_CREDENTIAL_BLOB = 0 +CRED_ENUMERATE_ALL_CREDENTIALS = 0x1 + + +def CredWrite(Credential, Flags=CRED_PRESERVE_CREDENTIAL_BLOB): + """ Creates or updates a stored credential. + + Parameters + ---------- + Credential : dict + A dictionary corresponding to the PyWin32 ``PyCREDENTIAL`` + structure. + Flags : int + Always pass ``CRED_PRESERVE_CREDENTIAL_BLOB`` (i.e. 0). + + """ + c_creds = _authentication.CREDENTIAL.fromdict(Credential, Flags) + c_pcreds = _authentication.PCREDENTIAL(c_creds) + with _pywin32error(): + _authentication._CredWrite(c_pcreds, 0) + + +def CredRead(TargetName, Type, Flags=0): + """ Retrieves a stored credential. + + Parameters + ---------- + TargetName : unicode + The target name to fetch from the keyring. + Type : int + One of the CRED_TYPE_* constants. + Flags : int + Reserved, always use 0. + + Returns + ------- + credentials : dict + ``None`` if the target name was not found or A dictionary + corresponding to the PyWin32 ``PyCREDENTIAL`` structure. + + """ + if Type != CRED_TYPE_GENERIC: + raise ValueError("Type != CRED_TYPE_GENERIC not yet supported") + + flag = 0 + with _pywin32error(): + if _backend == 'cffi': + ppcreds = _authentication.PPCREDENTIAL() + _authentication._CredRead(TargetName, Type, flag, ppcreds) + pcreds = _common.dereference(ppcreds) + else: + pcreds = _authentication.PCREDENTIAL() + _authentication._CredRead( + TargetName, Type, flag, _common.byreference(pcreds)) + try: + return _authentication.credential2dict(_common.dereference(pcreds)) + finally: + _authentication._CredFree(pcreds) + + +def CredDelete(TargetName, Type, Flags=0): + """ Remove the given target name from the stored credentials. + + Parameters + ---------- + TargetName : unicode + The target name to fetch from the keyring. + Type : int + One of the CRED_TYPE_* constants. + Flags : int + Reserved, always use 0. + + """ + if not Type == CRED_TYPE_GENERIC: + raise ValueError("Type != CRED_TYPE_GENERIC not yet supported.") + with _pywin32error(): + _authentication._CredDelete(TargetName, Type, 0) + + +def CredEnumerate(Filter=None, Flags=0): + """ Remove the given target name from the stored credentials. + + Parameters + ---------- + Filter : unicode + Matches credentials' target names by prefix, can be None. + Flags : int + When set to CRED_ENUMERATE_ALL_CREDENTIALS enumerates all of + the credentials in the user's credential set but in that + case the Filter parameter should be NULL, an error is + raised otherwise + + Returns + ------- + credentials : list + Returns a sequence of CREDENTIAL dictionaries. + + """ + with _pywin32error(): + if _backend == 'cffi': + pcount = _common.PDWORD() + pppcredential = _authentication.PPPCREDENTIAL() + _authentication._CredEnumerate( + Filter, Flags, pcount, pppcredential) + count = pcount[0] + data = _common.dereference( + _common.ffi.cast(f"PCREDENTIAL*[{count}]", pppcredential)) + memory = _common.dereference(pppcredential) + else: + import ctypes + count = _authentication.DWORD() + pcredential = _authentication.PCREDENTIAL() + ppcredential = ctypes.pointer(pcredential) + pppcredential = ctypes.pointer(ppcredential) + _authentication._CredEnumerate( + Filter, Flags, _common.byreference(count), pppcredential) + count = count.value + data = _common.dereference( + _common.cast( + ppcredential, + _common.POINTER(_authentication.PCREDENTIAL*count))) + memory = pcredential + try: + result = [] + for i in range(count): + credential = _common.dereference(data[i]) + result.append(_authentication.credential2dict(credential)) + return result + finally: + _authentication._CredFree(memory) diff --git a/venv/Lib/site-packages/win32ctypes/pywintypes.py b/venv/Lib/site-packages/win32ctypes/pywintypes.py new file mode 100644 index 0000000..6209e1f --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/pywintypes.py @@ -0,0 +1,13 @@ +# +# (C) Copyright 2017 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +import warnings +from win32ctypes.pywin32.pywintypes import * # noqa + +warnings.warn( + "Please use 'from win32ctypes.pywin32 import pywintypes'", + DeprecationWarning) diff --git a/venv/Lib/site-packages/win32ctypes/tests/__init__.py b/venv/Lib/site-packages/win32ctypes/tests/__init__.py new file mode 100644 index 0000000..44e7289 --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/tests/__init__.py @@ -0,0 +1,21 @@ +# +# (C) Copyright 2014 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +import os + +if 'SHOW_TEST_ENV' in os.environ: + import sys + from win32ctypes.core import _backend + is_64bits = sys.maxsize > 2**32 + print('=' * 30, file=sys.stderr) + print( + 'Running on python: {} {}'.format( + sys.version, '64bit' if is_64bits else '32bit'), + file=sys.stderr) + print('The executable is: {}'.format(sys.executable), file=sys.stderr) + print('Using the {} backend'.format(_backend), file=sys.stderr) + print('=' * 30, file=sys.stderr, flush=True) diff --git a/venv/Lib/site-packages/win32ctypes/tests/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/tests/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f65c4c59ddaa61bed47b3fce35bab1a9d5cb7e8 GIT binary patch literal 1131 zcmb7C&rcIU6rSCkZMOr}#!4z4NKqo}f!{<4K`*3HDuG0*CQXw~+a2h_cDL+oE3Gl< z(E|q$B=+Ee6Jp@t#e^6x{s-Hp3C*5JJb5dD6DMc4RN;WZH*em&eQ(}3-@KjAem??K zemt04{>B3E)A?wN=iE8jWB~XGWFRvthy$6$V1-6nQUJzxH^atRx^gO)g>lFL%&ze5 zJu+N{jvx210DEPg=7e@`&$CU>-KDc73~={&w|wo$#g$gNe4QBf7_2O4jO@FNa1C^H zC3;8uv~7CB-9NXy24=?DHVqm;_NHkeo35SlO}1^Iggmg8qRyL`6V?^GGeFA z>csY9t)LjXW^<%S?7$mE8y`!X#T+I>Y2Cnv^J;8wHn~oe61IH`kz4}A=5vOknYM?R zGBym`v!ol@q-lE#*dPkULw{*~0VhtA&K90dCA4HVVH)`&*4EYrRgBY_K~vY&M1k^1 z%qgh^QA|9TqpeFWW0JVQXV}EVB*T)VXo@LGL%HIaFrC%qyo#R~A&T!j6%wSj$uSJm z3;+g|ea<-IZhc5?u2@`{Y6IRVN1f4tqIFptf#7CG1=j-i%d-vWD@WcBRDz%GTClGQ z`|7ZdI&Qcj+&dJ+njkhhZ*Dx_nzg#8Dxpf~>!V|i@lBrsYL5JYjd;_`@!iLOnp4L# zT_XS#3s2I-1-k2PF$et1w!JQR=uyStxvn`fI3vN2sFFIvU;Q n4v+{*YFzdP~&y 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/tests/__pycache__/test_win32cred.cpython-311.pyc b/venv/Lib/site-packages/win32ctypes/tests/__pycache__/test_win32cred.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e3fc6a4ba47c1617f29a919b071140ea7762404 GIT binary patch literal 12081 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/win32ctypes/tests/test_backends.py b/venv/Lib/site-packages/win32ctypes/tests/test_backends.py new file mode 100644 index 0000000..97a7de8 --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/tests/test_backends.py @@ -0,0 +1,36 @@ +# +# (C) Copyright 2023 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +import importlib +import unittest + +from win32ctypes.core import _backend + +_modules = [ + '_dll', '_authentication', '_time', '_common', + '_resource', '_nl_support', '_system_information'] + + +class TestBackends(unittest.TestCase): + + @unittest.skipIf(_backend != 'cffi', 'cffi backend not enabled') + def test_backend_cffi_load(self): + # when/then + for name in _modules: + module = importlib.import_module(f'win32ctypes.core.{name}') + self.assertEqual( + module.__spec__.name, f'win32ctypes.core.{name}') + self.assertTrue(module.__file__.endswith(f'cffi\\{name}.py')) + + @unittest.skipIf(_backend != 'ctypes', 'ctypes backend not enabled') + def test_backend_ctypes_load(self): + # when/then + for name in _modules: + module = importlib.import_module(f'win32ctypes.core.{name}') + self.assertEqual( + module.__spec__.name, f'win32ctypes.core.{name}') + self.assertTrue(module.__file__.endswith(f'ctypes\\{name}.py')) diff --git a/venv/Lib/site-packages/win32ctypes/tests/test_win32api.py b/venv/Lib/site-packages/win32ctypes/tests/test_win32api.py new file mode 100644 index 0000000..e84dff9 --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/tests/test_win32api.py @@ -0,0 +1,304 @@ +# +# (C) Copyright 2014 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +import os +import sys +import unittest +import contextlib +import tempfile +import shutil +import faulthandler + +import win32api + + +from win32ctypes import pywin32 +from win32ctypes.pywin32.pywintypes import error + + +skip_on_wine = 'SKIP_WINE_KNOWN_FAILURES' in os.environ + + +class TestWin32API(unittest.TestCase): + + # the pywin32ctypes implementation + module = pywin32.win32api + + def setUp(self): + self.tempdir = tempfile.mkdtemp() + shutil.copy(sys.executable, self.tempdir) + + def tearDown(self): + shutil.rmtree(self.tempdir) + + @contextlib.contextmanager + def load_library(self, module, library=sys.executable, flags=0x2): + handle = module.LoadLibraryEx(library, 0, flags) + try: + yield handle + finally: + module.FreeLibrary(handle) + + @contextlib.contextmanager + def resource_update(self, module, library=sys.executable): + handle = module.BeginUpdateResource(library, False) + try: + yield handle + finally: + module.EndUpdateResource(handle, False) + + @contextlib.contextmanager + def nofaulthandler(self): + """ Disable the faulthander + + Use this function to avoid poluting the output with errors + When it is known that an access violation is expected. + + """ + enabled = faulthandler.is_enabled() + faulthandler.disable() + try: + yield + finally: + if enabled: + faulthandler.enable() + + def test_load_library_ex(self): + with self.load_library(win32api) as expected: + with self.load_library(self.module) as handle: + self.assertEqual(handle, expected) + + with self.assertRaises(error): + self.module.LoadLibraryEx(u'ttt.dll', 0, 0x2) + + def test_free_library(self): + with self.load_library(win32api) as handle: + self.assertTrue(win32api.FreeLibrary(handle) is None) + self.assertNotEqual(self.module.FreeLibrary(handle), 0) + + with self.assertRaises(error): + with self.nofaulthandler(): + self.module.FreeLibrary(-3) + + def test_enum_resource_types(self): + with self.load_library(win32api, u'shell32.dll') as handle: + expected = win32api.EnumResourceTypes(handle) + + with self.load_library(pywin32.win32api, u'shell32.dll') as handle: + resource_types = self.module.EnumResourceTypes(handle) + + self.assertEqual(resource_types, expected) + + with self.assertRaises(error): + with self.nofaulthandler(): + self.module.EnumResourceTypes(-3) + + def test_enum_resource_names(self): + with self.load_library(win32api, u'shell32.dll') as handle: + resource_types = win32api.EnumResourceTypes(handle) + for resource_type in resource_types: + expected = win32api.EnumResourceNames(handle, resource_type) + resource_names = self.module.EnumResourceNames( + handle, resource_type) + self.assertEqual(resource_names, expected) + # check that the # format works + resource_names = self.module.EnumResourceNames( + handle, self._id2str(resource_type)) + self.assertEqual(resource_names, expected) + + with self.assertRaises(error): + self.module.EnumResourceNames(2, 3) + + def test_enum_resource_languages(self): + with self.load_library(win32api, u'shell32.dll') as handle: + resource_types = win32api.EnumResourceTypes(handle) + for resource_type in resource_types: + resource_names = win32api.EnumResourceNames( + handle, resource_type) + for resource_name in resource_names: + expected = win32api.EnumResourceLanguages( + handle, resource_type, resource_name) + resource_languages = self.module.EnumResourceLanguages( + handle, resource_type, resource_name) + self.assertEqual(resource_languages, expected) + # check that the # format works + resource_languages = self.module.EnumResourceLanguages( + handle, self._id2str(resource_type), + self._id2str(resource_name)) + self.assertEqual(resource_languages, expected) + + with self.assertRaises(error): + self.module.EnumResourceLanguages(handle, resource_type, 2235) + + def test_load_resource(self): + with self.load_library(win32api, u'explorer.exe') as handle: + resource_types = win32api.EnumResourceTypes(handle) + for resource_type in resource_types: + resource_names = win32api.EnumResourceNames( + handle, resource_type) + for resource_name in resource_names: + resource_languages = win32api.EnumResourceLanguages( + handle, resource_type, resource_name) + for resource_language in resource_languages: + expected = win32api.LoadResource( + handle, resource_type, resource_name, + resource_language) + resource = self.module.LoadResource( + handle, resource_type, resource_name, + resource_language) + # check that the # format works + resource = self.module.LoadResource( + handle, self._id2str(resource_type), + self._id2str(resource_name), + resource_language) + self.assertEqual(resource, expected) + + with self.assertRaises(error): + with self.nofaulthandler(): + self.module.LoadResource( + handle, resource_type, resource_name, 12435) + + def test_get_tick_count(self): + self.assertGreater(self.module.GetTickCount(), 0.0) + + def test_begin_and_end_update_resource(self): + # given + module = self.module + filename = os.path.join(self.tempdir, 'python.exe') + with self.load_library(module, filename) as handle: + count = len(module.EnumResourceTypes(handle)) + + # when + handle = module.BeginUpdateResource(filename, False) + module.EndUpdateResource(handle, False) + + # then + with self.load_library(module, filename) as handle: + self.assertEqual(len(module.EnumResourceTypes(handle)), count) + + # when + handle = module.BeginUpdateResource(filename, True) + module.EndUpdateResource(handle, True) + + # then + with self.load_library(module, filename) as handle: + self.assertEqual(len(module.EnumResourceTypes(handle)), count) + + def test_begin_removing_all_resources(self): + if skip_on_wine: + self.skipTest('EnumResourceTypes known failure on wine, see #59') + + # given + module = self.module + filename = os.path.join(self.tempdir, 'python.exe') + + # when + handle = module.BeginUpdateResource(filename, True) + module.EndUpdateResource(handle, False) + + # then + with self.load_library(module, filename) as handle: + self.assertEqual(len(module.EnumResourceTypes(handle)), 0) + + def test_begin_update_resource_with_invalid(self): + if skip_on_wine: + self.skipTest('BeginUpdateResource known failure on wine, see #59') + + # when/then + with self.assertRaises(error) as context: + self.module.BeginUpdateResource('invalid', False) + # the errno cannot be 0 (i.e. success) + self.assertNotEqual(context.exception.winerror, 0) + + def test_end_update_resource_with_invalid(self): + if skip_on_wine: + self.skipTest('EndUpdateResource known failure on wine, see #59') + + # when/then + with self.assertRaises(error) as context: + self.module.EndUpdateResource(-3, False) + # the errno cannot be 0 (i.e. success) + self.assertNotEqual(context.exception.winerror, 0) + + def test_update_resource(self): + # given + module = self.module + filename = os.path.join(self.tempdir, 'python.exe') + with self.load_library(self.module, filename) as handle: + resource_type = module.EnumResourceTypes(handle)[-1] + resource_name = module.EnumResourceNames(handle, resource_type)[-1] + resource_language = module.EnumResourceLanguages( + handle, resource_type, resource_name)[-1] + resource = module.LoadResource( + handle, resource_type, resource_name, resource_language) + + # when + with self.resource_update(self.module, filename) as handle: + module.UpdateResource( + handle, resource_type, resource_name, resource[:-2], + resource_language) + + # then + with self.load_library(self.module, filename) as handle: + updated = module.LoadResource( + handle, resource_type, resource_name, resource_language) + self.assertEqual(len(updated), len(resource) - 2) + self.assertEqual(updated, resource[:-2]) + + def test_update_resource_with_unicode(self): + # given + module = self.module + filename = os.path.join(self.tempdir, 'python.exe') + with self.load_library(module, filename) as handle: + resource_type = module.EnumResourceTypes(handle)[-1] + resource_name = module.EnumResourceNames(handle, resource_type)[-1] + resource_language = module.EnumResourceLanguages( + handle, resource_type, resource_name)[-1] + resource = u"\N{GREEK CAPITAL LETTER DELTA}" + + # when + with self.resource_update(module, filename) as handle: + with self.assertRaises(TypeError): + module.UpdateResource( + handle, resource_type, resource_name, resource, + resource_language) + + def test_get_windows_directory(self): + # given + expected = win32api.GetWindowsDirectory() + + # when + result = self.module.GetWindowsDirectory() + + # then + # note: pywin32 returns str on py27, unicode (which is str) on py3 + self.assertIsInstance(result, str) + self.assertEqual(result.lower(), r"c:\windows") + self.assertEqual(result, expected) + + def test_get_system_directory(self): + # given + expected = win32api.GetSystemDirectory() + + # when + result = self.module.GetSystemDirectory() + + # then + # note: pywin32 returns str on py27, unicode (which is str) on py3 + self.assertIsInstance(result, str) + self.assertEqual(result.lower(), r"c:\windows\system32") + self.assertEqual(result, expected) + + def _id2str(self, type_id): + if hasattr(type_id, 'index'): + return type_id + else: + return u'#{0}'.format(type_id) + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/win32ctypes/tests/test_win32cred.py b/venv/Lib/site-packages/win32ctypes/tests/test_win32cred.py new file mode 100644 index 0000000..b34506a --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/tests/test_win32cred.py @@ -0,0 +1,230 @@ +# +# (C) Copyright 2014 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +import os +import sys +import unittest + +import win32cred + +from win32ctypes.core._winerrors import ERROR_NOT_FOUND +from win32ctypes.pywin32.pywintypes import error +from win32ctypes.pywin32.win32cred import ( + CredDelete, CredRead, CredWrite, CredEnumerate, + CRED_PERSIST_ENTERPRISE, CRED_TYPE_GENERIC, + CRED_ENUMERATE_ALL_CREDENTIALS) + +# find the pywin32 version +version_file = os.path.join( + os.path.dirname( + os.path.dirname(win32cred.__file__)), 'pywin32.version.txt') +if os.path.exists(version_file): + with open(version_file) as handle: + pywin32_build = handle.read().strip() +else: + pywin32_build = None + + +class TestCred(unittest.TestCase): + + def setUp(self): + from pywintypes import error + try: + win32cred.CredDelete(u'jone@doe', CRED_TYPE_GENERIC) + except error: + pass + + def _demo_credentials(self, UserName=u'jone'): + return { + "Type": CRED_TYPE_GENERIC, + "TargetName": u'jone@doe', + "UserName": UserName, + "CredentialBlob": u"doefsajfsakfj", + "Comment": u"Created by MiniPyWin32Cred test suite", + "Persist": CRED_PERSIST_ENTERPRISE} + + @unittest.skipIf( + pywin32_build == "223" and sys.version_info[:2] == (3, 7), + "pywin32 version 223 bug with CredRead (mhammond/pywin32#1232)") + def test_write_to_pywin32(self): + # given + target = u'jone@doe' + r_credentials = self._demo_credentials() + CredWrite(r_credentials) + + # when + credentials = win32cred.CredRead( + TargetName=target, Type=CRED_TYPE_GENERIC) + + # then + self.assertEqual(credentials["Type"], CRED_TYPE_GENERIC) + self.assertEqual(credentials["UserName"], u"jone") + self.assertEqual(credentials["TargetName"], u'jone@doe') + self.assertEqual( + credentials["Comment"], u"Created by MiniPyWin32Cred test suite") + # XXX: the fact that we have to decode the password when reading, but + # not encode when writing is a bit strange, but that's what pywin32 + # seems to do and we try to be backward compatible here. + self.assertEqual( + credentials["CredentialBlob"].decode('utf-16'), u"doefsajfsakfj") + + def test_read_from_pywin32(self): + # given + target = u'jone@doe' + r_credentials = self._demo_credentials() + win32cred.CredWrite(r_credentials) + + # when + credentials = CredRead(target, CRED_TYPE_GENERIC) + + # then + self.assertEqual(credentials["UserName"], u"jone") + self.assertEqual(credentials["TargetName"], u'jone@doe') + self.assertEqual( + credentials["Comment"], u"Created by MiniPyWin32Cred test suite") + self.assertEqual( + credentials["CredentialBlob"].decode('utf-16'), u"doefsajfsakfj") + + def test_read_from_pywin32_with_none_usename(self): + # given + target = u'jone@doe' + r_credentials = self._demo_credentials(None) + win32cred.CredWrite(r_credentials) + + # when + credentials = CredRead(target, CRED_TYPE_GENERIC) + + self.assertEqual(credentials["UserName"], None) + self.assertEqual(credentials["TargetName"], u'jone@doe') + self.assertEqual( + credentials["Comment"], u"Created by MiniPyWin32Cred test suite") + self.assertEqual( + credentials["CredentialBlob"].decode('utf-16'), u"doefsajfsakfj") + + def test_write_to_pywin32_with_none_usename(self): + # given + target = u'jone@doe' + r_credentials = self._demo_credentials(None) + CredWrite(r_credentials) + + # when + credentials = win32cred.CredRead(target, CRED_TYPE_GENERIC) + + self.assertEqual(credentials["UserName"], None) + self.assertEqual(credentials["TargetName"], u'jone@doe') + self.assertEqual( + credentials["Comment"], u"Created by MiniPyWin32Cred test suite") + self.assertEqual( + credentials["CredentialBlob"].decode('utf-16'), u"doefsajfsakfj") + + def test_read_write(self): + # given + target = u'jone@doe' + r_credentials = self._demo_credentials() + + # when + CredWrite(r_credentials) + credentials = CredRead(target, CRED_TYPE_GENERIC) + + self.assertEqual(credentials["UserName"], u"jone") + self.assertEqual(credentials["TargetName"], u'jone@doe') + self.assertEqual( + credentials["Comment"], u"Created by MiniPyWin32Cred test suite") + self.assertEqual( + credentials["CredentialBlob"].decode('utf-16'), u"doefsajfsakfj") + + def test_read_write_with_none_username(self): + # given + target = u'jone@doe' + r_credentials = self._demo_credentials(None) + + # when + CredWrite(r_credentials) + credentials = CredRead(target, CRED_TYPE_GENERIC) + + # then + self.assertEqual(credentials["UserName"], None) + self.assertEqual(credentials["TargetName"], u'jone@doe') + self.assertEqual( + credentials["Comment"], u"Created by MiniPyWin32Cred test suite") + self.assertEqual( + credentials["CredentialBlob"].decode('utf-16'), u"doefsajfsakfj") + + def test_enumerate_filter(self): + # given + r_credentials = self._demo_credentials() + CredWrite(r_credentials) + + # when + credentials = CredEnumerate('jone*')[0] + + # then + self.assertEqual(credentials["UserName"], u"jone") + self.assertEqual(credentials["TargetName"], u'jone@doe') + self.assertEqual( + credentials["Comment"], u"Created by MiniPyWin32Cred test suite") + self.assertEqual( + credentials["CredentialBlob"].decode('utf-16'), u"doefsajfsakfj") + + def test_enumerate_no_filter(self): + # given + r_credentials = self._demo_credentials() + CredWrite(r_credentials) + + # when + pywin32_result = win32cred.CredEnumerate() + credentials = CredEnumerate() + + # then + self.assertEqual(len(credentials), len(pywin32_result)) + + def test_enumerate_all(self): + # when + credentials = CredEnumerate(Flags=CRED_ENUMERATE_ALL_CREDENTIALS) + + # then + self.assertGreater(len(credentials), 1) + + def test_read_doesnt_exists(self): + # given + target = "Floupi_dont_exists@MiniPyWin" + + # when/then + with self.assertRaises(error) as ctx: + CredRead(target, CRED_TYPE_GENERIC) + self.assertTrue(ctx.exception.winerror, ERROR_NOT_FOUND) + + def test_delete_simple(self): + # given + target = u'jone@doe' + r_credentials = self._demo_credentials() + CredWrite(r_credentials, 0) + credentials = CredRead(target, CRED_TYPE_GENERIC) + self.assertTrue(credentials is not None) + + # when + CredDelete(target, CRED_TYPE_GENERIC) + + # then + with self.assertRaises(error) as ctx: + CredRead(target, CRED_TYPE_GENERIC) + self.assertEqual(ctx.exception.winerror, ERROR_NOT_FOUND) + self.assertEqual(ctx.exception.funcname, "CredRead") + + def test_delete_doesnt_exists(self): + # given + target = u"Floupi_doesnt_exists@MiniPyWin32" + + # when/then + with self.assertRaises(error) as ctx: + CredDelete(target, CRED_TYPE_GENERIC) + self.assertEqual(ctx.exception.winerror, ERROR_NOT_FOUND) + self.assertEqual(ctx.exception.funcname, "CredDelete") + + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/win32ctypes/version.py b/venv/Lib/site-packages/win32ctypes/version.py new file mode 100644 index 0000000..d31c31e --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/version.py @@ -0,0 +1 @@ +__version__ = "0.2.3" diff --git a/venv/Lib/site-packages/win32ctypes/win32api.py b/venv/Lib/site-packages/win32ctypes/win32api.py new file mode 100644 index 0000000..493974b --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/win32api.py @@ -0,0 +1,13 @@ +# +# (C) Copyright 2014 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +import warnings +from win32ctypes.pywin32.win32api import * # noqa + +warnings.warn( + "Please use 'from win32ctypes.pywin32 import win32api'", + DeprecationWarning) diff --git a/venv/Lib/site-packages/win32ctypes/win32cred.py b/venv/Lib/site-packages/win32ctypes/win32cred.py new file mode 100644 index 0000000..de4cd66 --- /dev/null +++ b/venv/Lib/site-packages/win32ctypes/win32cred.py @@ -0,0 +1,13 @@ +# +# (C) Copyright 2014 Enthought, Inc., Austin, TX +# All right reserved. +# +# This file is open source software distributed according to the terms in +# LICENSE.txt +# +import warnings +from win32ctypes.pywin32.win32cred import * # noqa + +warnings.warn( + "Please use 'from win32ctypes.pywin32 import win32cred'", + DeprecationWarning) diff --git a/venv/Scripts/pip.exe b/venv/Scripts/pip.exe index 2f931cf608f58eef2eceb898158f674d8a75e43a..d42331a90d10625d15310586fec3aa2428bd0492 100644 GIT binary patch delta 29 icmex)j_v0;wuUW?j?0+OH#AOnS;qJY%&=U}=l}rQj}3_c delta 29 icmex)j_v0;wuUW?j?0)cCqzznS;qJY%&=U}=l}rE!3>Q6 diff --git a/venv/Scripts/pip3.11.exe b/venv/Scripts/pip3.11.exe index 2f931cf608f58eef2eceb898158f674d8a75e43a..d42331a90d10625d15310586fec3aa2428bd0492 100644 GIT binary patch delta 29 icmex)j_v0;wuUW?j?0+OH#AOnS;qJY%&=U}=l}rQj}3_c delta 29 icmex)j_v0;wuUW?j?0)cCqzznS;qJY%&=U}=l}rE!3>Q6 diff --git a/venv/Scripts/pip3.exe b/venv/Scripts/pip3.exe index 2f931cf608f58eef2eceb898158f674d8a75e43a..d42331a90d10625d15310586fec3aa2428bd0492 100644 GIT binary patch delta 29 icmex)j_v0;wuUW?j?0+OH#AOnS;qJY%&=U}=l}rQj}3_c delta 29 icmex)j_v0;wuUW?j?0)cCqzznS;qJY%&=U}=l}rE!3>Q6 diff --git a/venv/Scripts/pyi-archive_viewer.exe b/venv/Scripts/pyi-archive_viewer.exe new file mode 100644 index 0000000000000000000000000000000000000000..03c132964a3b8a60babc52c8372a9b089253587b GIT binary patch literal 108426 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 tCi%8)3m&-LaGQQZ2VR+84Hquk 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 literal 0 HcmV?d00001 diff --git a/venv/Scripts/pyi-grab_version.exe b/venv/Scripts/pyi-grab_version.exe new file mode 100644 index 0000000000000000000000000000000000000000..fbee720c1e9a442c850e2d0df70d0986915c682f GIT binary patch literal 108424 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
CNpgwb&k4CIw@m3zr(W^_+Egv z57$UH`)2YY{nh#I%72alGi@(zAIBN*grNML!G72yXoLGF*P8fU6OU`m)UT`Ax69&H z;f3$)x>bH(*DDjeKz2h`waBbzV7vgr9E^J=XW%olWY+KwmdxLMZ`YzOmvB~#ZP%C} zk6~-ptl5Yd%>~$~?{O~VpU*w_Tot>67(gl7n3|WDr|+Xq-Q3*VNbF~C&(F`-<7wtF zjx%ifhpwG5o`&Vrfeb4#l zJj%_qP1GaeO5cI9z5lg!k~P)g8%}Vp-?)C{`ju-1u2llCR(cwEG1kg8IdP}_v)>oy zMQR`CEY@Hvfiv6STAXVy?nQ9j$8~2Q)}7p=rcXt@X}6fThT$6O<$tFN+i*>%VPd(b z!+iv<*~mYR6XziMK}_2oiqQTR*B@MaaP321m+KAtsz-!va2-AvcyRpi?in5DrVS$> zj_uBt&6z=ZJxSl4emmCIUfSt7C?>soxzTQV{-^cfMx)i{=v7sG#D8GrWg zEYyDgT&#VZiNtOq|1d9TyTzCs&kqpR$lQi`{pHlLLz(&xEX&l)0oUwxk4Z!+-s?uz!+Xul{owA=K#I3Bd8uDI|s z=W+wflJ(8_lXu4ND#1L-{y86UoxrwfmofKexWdy;6K}RdUf{XbC(ha2Pa-VW*_^u( zi>U(3cIMT$hk78ZI?k+6UM`zDtk2w-b=|O$X|Z^qtgGL^hId(dIIj5qwd?SVb=>va z*XrPzsZyJ6rD?ufziD)eWzo-?5 zmXlSynu^*3be#Ydi0#te$ldWC8X&Kt;EuSdFw{xH+g)N&e>Sj*#Z{c{VQ>ozIPRyTCUHsuZVBikxmImP;QcspfSeAf zSm4RNnY!YazAm*tTKAjo(ry>LX`MMhm*h7$hur}~K1|c~lhIaxbPt#tHM|3W=*{0=C&K8Hx@k`EH6nIH{t1S{1s0r zN9mv?7MNWc_Xc$f>-LLHPmfC)pE%nxD=9HKJ;-}{T5_NC36tWIV$(Y%B}_=0nm#pt zTBiw9llsJ_Cv~3D#oLk;o173Imu`MZH^{q7=K$~iH#M|a`b|rlp00m$x0bDSbHD*I zJ#NBu{G9D<-HrvRUs_!1bo3H;UrbuU4E$Q^#JKdzhpvw!W&xDHPdqekMqHvLk$;1{ zW78v(XH1xW8xZk+mn+ zmalcs_RRLp4$K~$Jtlin_N?s1*~_!nXK&5klYJ!nWOjMBdyZ!gf4Si>VANWVwV5w0 z%UhneHgA1iVcyof9eI25_U9eRJC=7cuPm=TPubjU9yU*##pY`Zum##eY=dnvwlTJQ zZIf&%wpq4J+hW@?+j84l+j?7}ZL4jEZI5lg?TGD|t=y*U?sgBmr`=-rwFlS(?IHHT z_89vZ`@Qx__7wXpd!~J{eVKi^eXV`Hz0khZzQex9zTbYte$0N-US==1t9+Z-TuZKRZa{8e?qJQwdvhn{rsU4b&CDfZ z{+s^Gf&X0`Xw!O7pK-~tN#kHGX2&I`rgp;5a8H=jY1-7OiQ{I(CC?Z)aza`{%Cz)x zDYK_dnws1>ZdP2wn;OOpsZ;kBO-Wwn{JT0d{Vd~STrqPcYPBZCCM4q>X(_YYSUPp= zWWjH)l?-a;84HJ@5rlw7^q{W#}>9f-t#-~k9vc$}eOirH`o0u4v)*1FQ zF}?GI#01BOiD|Lptuq`ylx{ICOiyl@5O1+sK}4L@Y6%Lm_?Z5E`oQ>GENHrOY}&*b zV*~E71fk2$>C?yiruq1GO4p=~1DZ4Ej3Z?og4_DsVevtBf$31$NZhQ1X})RGlYKjM p00-QzyG6gB120Ukfd`s7_>-xuk zDk#k~{i~yk?|JX1Bd28lkG=4tDesa#KJ3?1I@I&=Dc@7ibyGgz`N6)QPkD>ydq35t zw5a^YGUb1mdHz5>zj9mcQfc#FjbLurNVL)nYxs88p%GSZYD=wU2mVCNzLw{@99Q)S$;kf8bu9yca(9kvVm9ml^vrR!I-q`G>GNZ^tcvmFj1Tw`fDZD% z5W|pvewS(+{hSy`MGklppb3cC_!< z@h|$MW%{fb(kD6pOP~L^oj#w3zJ~Vs2kG-#R!FALiJ3n2#KKaqo`{tee@!>``%TYZ zAvWDSs+)%@UX7YtqsdvvwN2d-bF206snTti-qaeKWO__hZf7u%6VXC1N9?vp8HGbt z$J5=q87r;S&34^f$e4|1{5Q7m80e=&PpmHW&kxQE&JTVy_%+?!PrubsGZjsG&H_mA zQ+};HYAVAOZ$}fiR9ee5mn&%QXlmtKAw{$wwpraLZCf`f17340_E;ehEotl68O}?z z_Fyo%={Uuj?4YI}4_CCBFIkf)7FE?&m*#BB1OGwurHJ`#$n3Cu6PQBtS>5cm-c_yd zm7$&vBt6p082K;-_NUj{k+KuI`&jBbOy5(mhdgt;_4`wte(4luajXgG4i5JF>$9DH zLuPx#d`UNVTE7`D<#$S>tLTmKF}kZpFmlFe?$sV{v-Y20jP$OX&jnkAUs(V7XVtyb zD?14U)*?`&hGB*eDs)t|y2JbRvVO)oJ=15@?4VCZW>wIq(@~Mrk@WIydI@Ul!>+o3 z=M=Kzo*MI=be*)8{ISB{9>(!J__N-a=8R&n#W%-gTYRcuDCpB^^s3~-GP@@5&-(G& zdQS_V>w;D8SV2wM8)U9HoOaik`_z>Ep^Rpe3rnjb<}(rV`tpdmg4g@>h`BF#WAKLH zqTs?sEDwi<=6_WPwY&oS9!h@ge4(br)-Q{|OY*#YAspuHyx;~|kASS3FIH@oGSl?L zvQoe8yKukD)zqprHiFKlW%;G=hwx4l;FI%8m&(#zU|j&_bW@ThNpr9D0V}xa)%aIb zI$i2CA2mPU{0nJmK0dxe)dY-`z>ln($ z;r!UXuLDDi42|Zd3Erx&m8GqlFWbIX0V<*Gn6lVNq%gD>gw}da}r}ZQB~ns?p8uy4i0%1Ti$Vt|~OUth4=+yEmPu8{3(w zUDkd@?w?`_J9HBkx&ZF8v{+9phcT@3J8VI~wN7Ez)oJS6^dhb2N;;{RTXB`K*E$64 z3rDqRtY&&*}9yq2oUcvD7K)=@bWqC1X%l0jk)W<5-WBYC(#rn4H5)gp#eHMmwlLJq=^%|*gMQ*pq4VV(QhHA4CGj<;!d8i*#Z8CaN#*>VcCnj~;kkeUa{LUoKxFCaoQ) z(Lz++&x3Lwz;=6UnhwM!MvN17>{Qmb?dwgsTmzkLB~jD#wiGz73hc0bFE|C9KA#|= zH}%FQ>c&Y5z*TJD-<$$Y*WZx>5NNe-E-TfAt1!)%Wc@I;ZuNwxDGGasDIMyUNiVvG zq;Q70PYHcLO=Xgv2698@cJrkun-^>P2}|fMHlm7xaZmE<{&cQtb`{N9zj0bRmpW^T zzQV7oTs0ENHe&mxQ6DI7qd0SU4;3o*2qRd`X1>(=ew})X5Dx zx$lyzZM^emtdsbk^u+xwdSX$lp7h*2CkHCqDohShL)V4hM9k+UQLP(GN-H7!C8gyq zex`xuPQ(!g4}S>0r+CyH+xIAMP9Z&+?BT1!*kA<}dqRn*FwJPGe}l-sw(lGYN1b8} zWQQjQN`9tdtF?#aqMN?wu4E3)qGxzOhwr*vb;kX_%&U*-=KLr0raiGc^x8|=Wqt`N z?L0luR(~BF;DS@~yKDN7|*TJkj*-B%s1{65$`jY_(C#P&^rVi0?Ro4iaFbR)Z2NLxS0 zTL;%Kt22(A8JiL`U$i!iR&zLxx^E%H=*c-=+h@sisygu-_#m4J4LQqB?~vXvP4@yQo0-^oki(PiH+=FZl}&W)S-qI zk>W;2Zl-vl6rbe4X6feZb)l-Mv2oh^5t8q5@(Y-SPoUZ;N<5Tdl!h|=x!1}5)E;}=RcAXJ8(<$^13IV==^rU>wwq$hX3V4iuA0>h< zuxK^)myr=p7a)oeZ+g4u^9(OmpFl8J@{{UJfy=DjAf8lTTD00iSF3Kb9|GdM-PQp)0<* zZkW*V-TPpIXEKDks>&FQ?qoV&Tfa*;TJyB^yJa8xcch+*-cYj6E7HdBX!5)TIXSNM z4C2L57KVd0rioelfI{ELMrb&Y}?h%mk5iSTXrmJ zwlk6qsS{}3<}Uc!G}Wr;Tek1Tym8$SrWokvCzU(FVIAWTEa1pwE zBJ6JdS@$4RFBV*~g^Eo9MAFafx2rt|uRsR%xpNVyj8!g>2u0v=>eO zS~4nHBgR%cVxB-_OwP@%JN(CpY3qHvqsbt-TUGivY2Dr$b+=`6PJSkbWF)!Jn=iZJ zMt}mOG~-m{)L*SV+yRH!c@XR%)K^BqVRh zq&wib)2#d0V3BD*|F5o2J6$vbdJGh`O-30SrMI;e*Y&m8c0Bi^cD-$Daq1haK*i4o zS^0dLE!U;Du-W5i&*6##L30bjy7q7@lQPyCc8<%{>0)|vQlrFG_D_+v^1uh+p+bhA?!)dFEqi$(hoT?=hJt20DQXmOiJ``9LY)@=HE zO1esvSjV70vmITir9t{Om5D&<%?UTa#`5Sp-x@^?6JCK@(Y_-+ye_agHcB_zSUEYe zay}#@o~N5_?G>%q2t<~g3s!Y+G*Mj=P3Zn>mA2=HCm`lzap|)*f|(31R{)36WvAyz zfea$wK&B|2YxO{n>twI{fk3f0YVK4T;XDy#cUe=*$V6#=30zz**pkdJOUUdHcyGKx z={=%tU83}-sM&@LFz=EaBy8m5*VS4ZYhB<>lI{BnIk4cD&H_E|%!spiL(( z$1W0V$;KX^P(?<}XYHqoplpQo7H>!m)d{bdPaLde+h7(tf+ZB(6MxWZnoX6&>|)(q z*DB~wjMmL&u~F-ZIbJ>BJ5ZM6ik)gUbdlBM`Quqove#M~lf*ebB4nBg}NN8q8e!? zVj>HOMJZ@LQzOdvHUSih8gCt%IxvyHLmO^Ea(*!Nd-Zuw>`f87{SkAwbrcIp6hiff zt7^x@FVoBVwDl9eTxT2$))(-5-O9W=qunp;*yvYT{VJ=~FI-x;pN&=5ArA%W0()Z} z=?f87g#Y@j2_ct@T|gzY^?R)mq?NdksZ}7gJW^{18>hCuy{s)%iDWGzC?-DRKLl?l zlnO5zQf3*!v6nJ;)xm`Sjm!6zf=o%-07p#e5?cL}gBtB`Nq!dTtt@<7#(o8m8xm*XOvN65AL(=C_D} zJM9UyYteSSwriu8{DkKl6tSk&09e8kMrjh@N|SS;@9l|6^W@_Q=i{`@$NUzI6|VF> zN{Rev95oVSa&%)ew#+uKZf{3cFg?f64ASokLt$^COgO2#BW71L>H7~o2Zg;=Z|nCM zZ=N18^ET^uY+VpF$K*teqc&2xaTF!LhIKrwGne_WBX+B_9vi@rt2GKHy|kQxSUJ18@{fEswY{>va~$3%JGyYfr29k%@bck16c zdf9Hh?|r@PC`@3R-j=#7868z@m3)O|u0`Iw|bd&(6~U$UMGD@Vncn>Lm}{NqU9US&{gYu`~lU+m1n zi1g$#vC1#v|9B;ObTzhRor!#90$^5b(Gy`buihHrRfjV>-l^6#?Dg3lZ}@PRD|I(> zVcp1Kiyr8xABHMWk$xp&hFzvUhIKbDi1339ve8Ac5ON73NDM}^^I8O?+8zk+GVA0S zG|7G=o9JQQO;-x!z=zz5c@^<{-AWi)tG`b65v40t#CwnzKA}>?+z|q4`eNlNfRXZK%L4$WHQ)8Sgo0 zwE~@9)+4fUIf8fW?9TihJ6Hgttrta)MqB{FTBqxu|CDLzEKWn{Cn*>&wx$DtvzSvC z(4Jr-g8~qe!NL-;BVhBlx}Y;!It5;VT~^q_HdZcH!a^(MA3%zpy!zmpD(NfkvF=9= z6p^lmDSFnrRVn4npverH%%I5(CT}SgTNGB)0sCY%@`7%@lG#4Gt*2;3c3;0E8(QyS zoo-l-h2)DEIh-3t!@^Gefe~>Aq|Sbf{goW=Op7FDAB-5amdpAhatG_BQh1V>p|DF2 zoM~XblmiX(kl0U_veatKBQ+uz9@Z1{N|y`0j<11Sd^JtI@w2S`$mW?%;MWLc4%=HL zi!p2d7Nf9k{=Kw;xt19k$vh+UMEX9C2D?jRP0wn3ihvj zIKqjR_QyB+t|%#l=^@PkY$HlM{<4z$Jve9n{#ZUhYv#%_q#uJnen z7S7e0{d|oCJ_u>EJ_(yUqk*m3cisoGsENRi9?F=l*A~&-*(<$4vm*-sUaFT_dJdnX zrOQM7ERMPl>SbN2|4`NV9yZ$|0jqv#7_|5qM&SK>FdA$Qn}>sahte?IEg|!hNZ-Lw z+2M47yawJ6YgZhmd7`)o7cpN%77HvCf^&@h2FBhy;L2rI>K+Cp6&?pq zlFhyiSR(126>L@rL1c*79q1?uBeI5<%2ZP3K!*8bJ8n5Vkdy&9Re{a#rI- z6fv$Y@#|&(1pg>!eIKW$IeEqD_akO!YCNey`?q5Uh$a^MgG!T#n1>V}I*O@Oh-I-5 z%k{Du%Iw6?)MXzjh?<)@`1%M|Z2fN100q^u)YBKp;(8NX!a7BpNWL}bB60|{!@3IM z&!_-j!}^5^fVs3)8n2d}7M6&L95t6HGcO7O>k8tJiY2gy{mtC0V*s z;mM4hWAvYlP0?$+)i!p-gT`AH%yAiSovz=pXFBCU*-y1#y_wmwf!PgMrEDEyp_Y+h-3$ZW$Ny$8H)g+M&odOm3D+qCuDCyTVF4s8_v zmEyLRLz)cEXCoqszT`H8*!|T3k)9}efv(zxR?xmMPtJ#z>B&Eo77PE!jE`0XJbxM^ zJEbz?Lu5g--#l!-Y#gzXP3G6p>XOps?99>9SjC=T%MY0{>#J9bVPGK(CmAlr@LDVu zdtE8Cwy$lsu#8`O8L={lK%5}c`pb6GjOmh$5gX((WMNF8jU#kU?6HQLb+0+w?hE$3nE@wxIvFA6~zB7QMVyoEeHQuBH-S!>tRw89F zyIi51ALX;4mfyl>Gbw7NUa`Y^`9s-NepV{j;n;E-$Ceyj?qimR?nQpJ7Zt@YCfL5$ zX%(74|FeDDa8Ol;N-078H81eqW|LX(_9$cc`%a*!#=7{V2=)|lNG5a40)v6g4t z01XUUv68UZ2|@vkl?ceW7{YVw!nCy? z+sAnJ?mvd`Ab`J#GpRgV_N#doE}<~&Z?VHb%c3L;ua)NW2qzfhmeh>}dH zGKiE|U&0iVSyyQ$NO;+GkhAqI3{1v-UXl6k&ogShm<+H}bDWf8ZLbv`!7=F`^V*WW z%|fH`g0dA}vmj?dt{;}&QQW)P9h)H{A4EQ&PP7V>>J53l4KOcs^mIW( zWkEdG-lC&N1l;w9;87FIEh#42)wpNXA?u;BStwK2f%x9dIa=c%`6v*^^D7Rdeo3P2 zK9dB;uN>7oyTltCA%$60W`E3W-dBpg zuqcq@x{}^i&v~(2yR)n>8M=s-@@eAy%xR>v4&Y%h*z7^|kj=+ut-*SgnXpUQ2Za%i zw_32)!m77h`9S6v$7W)#c5Gu%xh%>rSYMFAD@|Kh-5MzR0ebF=8}-^F_#pg>cMe^Q z_fFTrqJD?X&Jg+pQE^7T9S;~YZ`N{LIq@lM=%?CSV`D_iRT3c{J=yaikxU5%rHT=TI9ln9_p;9*QY6sX)@dJei;QU6QC|w1dx9PPU z-k*1jcMjN$eZXl0=c@we30H5Z#G4Zf18#{O`?4|fubhbI#LpT6?u0J@S5*J&gl|g| zx>4w6bp!F}L5Qb)5yTF=Q~b_2auNe$u2af-1--x-Y8ugJ)$~A7xqyDQUb~z9yjp?2 zS$2CCh3xpcnb+1EDhBdlycVY?TH-GQhOBi1Em;xS%mih!zz5d%5ZTK)kgI(;YVM1) z9Y?6R=*3Ee3NQqA=9m}0tBfPY>WV^F{KDkb!>u=FvBx{<@$4HF#Ty?(D_|c16@7ar z?3sMj4pkIxD3B@pYY^(UW7-_E@LkG|E4F$T>^}02mQUF3kyHzn_+N+p{xB`ffEMeA9vW5-D%{ zZltI*4Xan_uaQoJoSn85x~zjwdZGe`c|L&8DFe`!Uzz7`w0>!xulJ>+=37i-p5mR> zWl?vJ+1b|P3AuYhVyI7#LAPEYZ87i$tRpmE}@el^F1lN0erixJ1-N#3v0fp0!puf z11^VLsS9qh<=8A zl(KovC21r`^>K0LV;-uDR<&qv-K@mIx|7<^+mo|TDsK^_F=k^064`x9BFi|CeU^vI zA`v->wGlB>5s}S`2Vld*+LS4GWdW#Z9=Ld+EhF-ng5iU)X7A68`i# zO|AEyO~DJK*d*(2vK_TGJ;J(KCFF$1nt-h(v%kz8V%#2jMxD`gWt|!-@k5${77Q@!{4z;ze=7&BScC z{l96Ke7GeU{#P5P(1-)>pb!x>_limI(??L33;=E&UU`S^Xg(o6V~Xzp2+b869oyFB~+oK91m(zDG}-Ce|yro;clXhx0fm zqA!a1;w8|CgOIS{tHtHPM)Qnv&@IQrVjZ>Cz6}8;hEX6s#`+#jXAT>_&8rE)U3h@u(3Rj2wHPF8HLr_+u|u2h!@v|soMqnSEk8Zd`9UErc zRN_h>v@U-yBXM8Ej^Rk$+sR6^P!=M|4(TT&#@8NU-8`?Hjo1~wjxi#DFXslCbHj#H zR5!NB>1Vtka3nsdw|a3-Y^?Qbif>?ajCQZ}h|~?V$4;Z2hvePt!VjWV5kP_Mdzd#2 z(Ya9OE~}OG95vq%MZN6^iVy-|(zl&p4c#oK!g~#g9ul0wCtz5||XBmlcb|@y+~5^oMA2 z%2&t|Z30b#v!su;P0>oP@n%l!68gTFk*t&4-cTiC(g?CTh0XM*M_NA`XrI~P!(S-N zL`<-L&IbV?K2X3qpYwnLW)JqoQsvmwRaiiIOAWlUuFCW7CR}XuDqc-j>a`x<)1Wa~ zw1+(1-L|GuLWkn}HjH3W>Zkjq4e-!WA;hn0iSIXW`S*t~{JgUpYShtg%LoE=slzv~<=K*WA*ElMAxu<+e5ER>PXppG$|uZeA(Temu%&q(p;3AFN2!kq zm=?vfxfpqDEN!LF)Xm0H1wg{HMEXo-l13}ryyuWqH$7J>Xgp69ORBMSo%EOR{GE@T zp6`=69Ftb3=ONylwdwgfFVgK&D$mcnFSmVb{~?FB$0_H`z~O7eOlSLUCm#&_o;kIB z^GO&pU!)Lg-zm3^a<;FL4;!T`wb1X9I%}R0*ioufT+j91NaBu?NMeOwVtj_4-Bj0@ z_j+s0>1Gh!;oi!cvc4Mg&8Yc4=Cmj3w59_z5~=-$9!bpUA~dL*qwByWnz05DbT{~4 z*jZ@K?vDlzYTtT-qUP-5@^1W$cjLZ1m)7`wc?;yk#>sw)Ni$-;5OH_f-AMb*3BElL zTXVmwcEz1Nab&8Q-#V9uW2Z6VdwH||2KhpVBR4w8!{_^EvduYpj=@m1wadC|nCyj2 zt$A%;w3fp&nPJJ87ID86l?_lyq<-5M`#ZFGH^n*bFxrb{B4*!>glHD=IX zaR4E?rmXV`e=Jb3r)umy9O_=}HG_<;wLag>;c-u)&Cx(xabWC&VP!^jmFM&Ib z$EM)|j1Ueju0pu}b54-q=pis$~y&T*+xHtN5ij^Dv z^%7mNlKsbrMJuxz??mDQn__!^I>*gYDhiq>gCh>6y-yP!!np!os_nT!v)geY)f(H$ zMdxVz82saUVjQ{l!Fyx32g`P8jl0P*QX^tlU_Sb?kt&IuWuyvXIfW6 zvj(<2h5p+D2H`EwSwH=TECv*ISR}=U4K0jI?@X;}rSnDnja37_hg1U|)xdV^hSx;N zR_l)tW>JcPb8F@5C~uO{c@SQX_Wc-vx12+X_zdyQjX9DVg;djzhq7W0o z))<;YTY1Kqwi$lJ9G%8d#&=Y2g-5J9EDiLvQu;DVkGayNG;o{qwO{JmzR6Uh$UG@x zPCO=Jtf)bg*6_lp#3+w^Tg=a7c|p*fGtm(jE${gPmO7HD77SR?ytQ3_Bxr`(@-qAT zWfSOxaSdnVed(w}=&i-FC`!Pi=?<=yrTgx#ws#DU@R`1IyXR+k0R7~IY6mXQnIYJ=|Dqf4+{O?83Q*D35 zm~q?{FH`;v)-R{BFDCMi3*t-k>{7fQ)8nw?9TyWqG3`Ursw{KR7s%pMMe3iM)dT*M`1?|}%AZgc@ zX30+IPfbP!7X!AEjBUyvWF0|-nESBQh0Mtj(=rdU9mNVG#;RgmWP&-P(zBuAracc- zp+(j}^q7=iuyEi?+-C&NiI3TU^)U0@n#|Xx-UoNc*6NmU3HqR;Wl%dL zkIaY`kZ}eU*h+@_w{SA-$LNPRs?I`9&yRXRk~$gghBqUHqL4xmtMtVD2F!n`DBU&Y zA@L!Y3w6XoW)F{rN=O!R5%FX>|1Ypcy+BCeYqX6PttY}QV(d8A+D=AhCvAj2I9Ci+ zE_xz1LN~*Y8IN@_s1s-}DbcJjI5vpO#CDDjrv=T!AxN@1Y#t5bfti^9CyoyfXpL_T z2V8Sei{e7KzA*ct9Fu(Nld9;CL z?d=gOO0=h4Y+4Jb!Gh3(cScOi?2L8L!@ zXRz-XiI$JM!z1>gk%aITI}Ha2`#~+lD$VpAZrrCeDp|VeRi;hXLX+MU&wulyCi{V@ zp~_QZXJ}92zB_-Nbp#$k+W_m_M`OPZC+5?&W-o>zKXw6;Mw zPZVMo6>O;(y{(rJ))j>Jj--v{g0^&C9d>R#xu`p+I!;{+20Fvd@~tlHPH#Z}#D#80 zwJKsBYO=M&SD3rt(@+KWTkw{8Sk2`v+CyWht11NA9@xI&HVQx{ji8>XzDsLtBV)te zncQFSH2RmvZZP^+XpO58RW`&kpI(%5tDHnrJ71E)Kc>S>es<7(F(N@%94gfc zt}u%Qr8lQ*gBzd@RpP2l;SukoBN6k<1H@t7b$bS(TH|}1=7p2j`DH3Rgr=l(6PIL> zoLb8o5hMoHL6p-P+JoNWY5<8%Jy_)&dQZbMH@;n1k5gZVSDG59CRwN@mS3YieR+R+ zBAkSWPvs4(spUN{Y+l|!Sg;6&bFUYtQyI6H=HmrUtM0Jb+GO9GuVy+uB51tb7Yv*T zYFD3tL}TJ3oc#GNW=rR=aO>o4-~yYIy{l>KgSZEC^?)4Dv_{}AeTN7(PtHQSsCppR z-O&ueZ%;ojbgn0xqy?c1=D}`fMTVQ+(Hf7#GMidk%E4&NTj|ys)55Ur?JSdKcj|Q# z@lkkIq~gI09sUQhXE1Oi`1G%+0*FVX$zZ^K;H)*Biv-5nT~_VsJQLwR!63B8U?hW)?=-Hdlqq`a)%WG*cKqMfqu&U6`6B@bTa*hHb`MGTvKIJRjs3NL+*6oUu`f zPz-+a;yzVqgUnl|_Ft%7(MqVuf;hXE{lHCF2ZJV3dw8A0ZK9=1GTeu=CHDQBU?IYD zYb`v2rzovi+{2bQ@h4?87jd5uw$%IJMg@8LZ1vzM6o{&c7{V%n5d_#@0$C223kja0 zjv%e6ch#8!Yiyzet6(Ps>o6M6;8nan=LVmWkAUisOgL8(UDj`QAml+b0wtTWQz})) zSJ`rn{zz=D(Z4h{djmEwSX!(^ZPaMhTGKdHXyg77DUCNG*u3gne57pNGR1|dUZ|DD zUz|F?3wuqfM>2#Z)dh{pi{q#ASe1LBs*PR_05B!hk@A>Ki}d9}v5yvdfiOihrQ8wUSumgQPT z^#CeUufkXX@5DLrvx5#hRD)I=NS3K=5*W_V>qWl{rNnBGEPPs!nOv=RtGrjq3z|oz z%TQ`338%qxgAOAc(jbx<>pSsBsbK8L>)Xq6SeSZ@BwFdhWMPA9H$=OVZ%8pZ3SwOU zve7>|_N5K7hM2X<8_siH#wcItPcL%K1u0ta&UGs3R;U zDFUi^?@j0u_Vu&Ua)bjE8WCg%lxXp`R{m?P8%2g!!Sm&i8ysliZz-Pe)W~iKi$2@- z%_3*UuodHBQkRe`Gg%(oKyxZiY$9Kkf}%9HjO|Gs??vP=@Th3JlaO^YUi*R06`J)L zM<&jp6-PabbnTBvoEC@yMN~q%Hte32CG^+Hq!Y-3#Bck`o&Ye^n)8gAcjrS3G3;f# ztlv78_U$6c{iV}g2vq6cNn)6j5UD?NVll)n<{W@3DD~vmQD0afGzl}{o*aCRADki_ z=2bm;e{nE5XBgAp9!e}Kj3yT4)qV7PJvnnErUkw1#M->mWvgOe+8O_dh*2zSE)^88 zHm|BVM?!u%g)5yXB(SvQ%{h1(*lmIK`cKw|O268HNamNIhp(p3)}H)Y zPDp#QH5Ayq^3-4%J5cMD$!OkkaoPKe-}-JTT@VzuHovho{+xMvA)b$wYN|zTDK{_A z!=;ipwz8(>5Q?(SiryT8!!Lqar~p8UnO`j=uM&6I*a>7SB%*^ANS&jk`adDWz7Sx2zfof8}0FuZtes9;}u zB+1-Zal>$baBaxDuX&9iE1ln=o-T=^!RCgr5bsJ~CbW6gB=GQPFj?(4`p2#G(oAxe zKV8Tn{kWAQX$9i_OdFVjLG*L=sG>-tI9wRH1Q$&*H~5=?sf z00n0WnNK)qk3fD%dRC{TQE?y+baCD^r9)P~=SLLO6W>vFO;58*F`ox*%F>k6!x3eP zc{T1$&hc9d;0GDo(7-vRvd2`T@-mUcE?7|-H>ONK0Yq}-H>J~aChwpa{&C^2T`ni| zz*%QM45LVV0&)-tQ>Q{NTp92^7BAbrnT{X= z{9VAVs&sD53A%Sg-2258V;u3+r`FgO<8l;^HMYd#YmI#r=S~9KckScO`lDlr5YJ*H zTi?`7<`$KC)kJX=7tUgxcLwDBKwjd8!cf(cQor`?hg6AB>D0=FrBh?)RW8VhP1ByN z)SlFH0!LQ*%68G_C6fTCp&&2fem+vRBmRkKB$Xxc=k(;|r)@Y%0}Wnp#Qlu=W?q%I zCiOVHU(Drsu?a?sn+Gsw=b_S!Z^?s&q(`@$B9FqBJoJ#Xr)3nW#N~ydM4dP7PTb(t zlMfWb={ATW2Afk+3ssZm9Am&uE$q-@f_UMx1Dod;oX)$GpGoCu2*2&EynoQJ>*{3a zoZ^Vt6|5|YO|SfVPV8Lm$x+&q!JI(%%5kuSFHH)rbqC$g2l1>Ux5m8#4#{F8PY=8VI@V4ed8Ja-K;lqb{X!#!&;aj>ZKK?0ZXiqsqd&(KwQ!=z@*^8i? z#a%onx%!-sH_EUGHPGr3#5%U+M#`Q?w}Uk52@(;DP87;v74K_x_RR*0!>X&5ktlO# zmEzeP1rG74R6Zc)k)ZLcZFSRy+?rG@s)+duS#@ktn@C|03e3*a8spHy20vtI^`9bT z_u`f)O#Ei@b@NBgI_(O!s3JdE!u(*Tcut&)y=WsL6Nwiyyej-%DU2D=c!%rQ?BN9R zn<^_3*dgnGGaw`s2nTI<@3*@soU1iqFLm{L9%O65oe^%}+Em03Ncf~gPHAW7B|LXy z0XAoQ6Q0}EOJTxui@bz$6>16rPWHPuQ*dpY}NlQP&(W~Yj6k}hp_|woF2JBV+Dt3<`-hr%Ezr=pxxW7j1 zQwQya#XN8`!r~?-DhW$G7|LP$7=SE~H0T%rEt}55mQ81YbJ9bhyDkeI2OSDJDZ<&H zfCpc7z{})0@Nt=f179eoSpdWVRPk$8P4*5(N=#E;;=Ie`upgiM9uKzS z@x}&0gFt?wmMqhh0#=h0PTsd*lS2lcL+|pf>WYJ00cC2+LrF&Ku@*@=<3Z4k@6y#! z1HMbnm)Yt|r(a~xO`^ssNf!ar*|t-Y`Oe|QKy0%RQc&v8h?=9KfjzMc^aKlRn{_^f zPOx^2NbYUce~}0pm&&~$NzXK7ifEu4c5>-SK}EYd6hM6C<_M=<>z^`Oj3k*G7N#-` zxyvde%Z#-Cp}s%T3I@_;8$>*}*5a{_4bhZ5PS`}wwZ3Xg`+J=Nw~gilc5$!BBVGAY zD&t7Tcn~`6DR*<+%e&|>X3_gVDM4CAw(lkKjiS9|fHYi7ehib9a)?dYa0xv1kYhY| zK1s8QHID&!cPqsnt$usgt_PNiBC$i=EUeC-oJTG8+^^rP-j9@t9;JJwN>$ z4<-AaP5#qrU)yC(0;$ZBDYK-ka?;jB*)PXZ=Ze?K%?i!Ktb-ew40db_8Q7VV*EtTO zdUh6LWukK?5E%5p%-dPvF~TA|IkI*G{jrh8Wn3>JB}N<@nAM*td3w9`L)w-lniZ-u zc$M{GEz?Alj4g%}{#i}WSxk1qGl~wxM_gCa>p1@eM+n3+@v-S<(TCEr%<+pqQ7xQ? zGQ;jyC|j5B74kB3+(IwtKkA%G?O`f>Qqfnj3f7$OTvI!j;|gTIK$q6|JB8Jn9_vO0 z_@W-;zA>)&S=##f=tfTy!#_^$B-!k5xF6oc-c@rjBk6M~M|wHubj3;$=AMofQ<_AOs>}JJ5>u%(%)41kNIq1IvFKc1K))za8*eVg&hY`m|wpzYQxnde<~ z0>F0FV=72u2bV~!IPY^z3hyaE&K20W0xTUoB(F?-BcLgo=QC)WAQ$vR`^$PY!pZ4@cA({mL4nip57 zdCG^p;&{{ayb!lpWN|AY_dYVga-|DRmxFPw@mJ2*&FX8R`r5DPFlu7wmpdZSrh4hXG*R{@B@?OJgoIBda|NU)=bHI zoUCH*`Sx;vs` zPpS@9wL>DBnYNtN0#XtqD+Z<19QA2O#!3`2H>av3C%Z1K->_Y=GO9r|_0?TF(ug(M zsfVgD>2Z;^IabF9Wh7QDV{@_5e`@_9uF=vT!SfDZzgBP77YHt~taOO48%DIb^uUh$ z`infoEYMh5Eqxxb9)of#dL0(3HGTkLB(HK?r`|5C7LpMKO)@-WK;T8j%OIznZiwbB>UnP8=V#ywX^ z#w%pd#G^D3+yFp;7Y+X%**j9Ug~Lnk%jW3BS_}vJqIQ=_yHuY?brm}Bto2{Fs__T8 z>m`%(QzwTF&)35W3APj?m@{JQo40Vp&ghxSY@oCQu1}i%Y^G~yrc>?!%GwSUbZPtE z`JSM$UpOC{HJjhnCYC-NJ=cy1Hhb%;Dq^GT&FVg(_S`i`KL)?`?}%Bdy1Myqr4=Ft z)m|;AP?7ZW#NlI?Tw^Wh|f_hvJC4dygPAxw|6lgr!oKdcOn%DRBs|th9xAZWd^SbKBpPvt@oi4p4n^m-7BH#T&!dE0YfwmPv zJvr9_xZ&mt8a@SddBG5X^FI&lR@2vs84pvpH}Kr*=JYUg(t6T3t2Vv*z-nBnO6}NE zd7O;h6zmPVa$?uX!^?4*Sy;-w*#D+hP*|`1P)`;;LRIC&r<+@dCU=5$4=m8#=W_95 z9$r6TS8#2ZQPdPShq=FYud1yz-Ugeq!-aNd#NHAyp792bt!@mP??z0FA2Vkw_-1e$ zFc%5V;5y)fhG@XskZJ;5K~{qJfOyyR?QP)%$eys(X!`_~u7!y9`0aNY8C#Pqn;O9) zHV(3XM>dH7)_*;5Za{8E&zB~v(*;JqJMNKpY=6-}Hh^_{2F%S6Fae{5=^|BJ@5~Db z;0P59g7!1|nqyvOS9?e&k39|Qw|(EGD!0KUe^x5=>4YiXF%YJxZn}qQ55!Upy%(K@ z<~L{lgng+3LFW)>Wk^rl5&0K-bTpl5L`;>+E#Q^(V$QsaqM_u^Eyz6-cq3@0gW47Q zgMs~Vq_Bar7K}V#VNjuQ?ySq&@jlx>);I}-OG)PvYaoGb&st}{GXTOlRh~YW`8{XK zCi!O&8%jRv05ItdVe*_@YgZf(29C$6{J#S6FL59%7jaI(AhDDH&{8WCD?)$#0*U1U zif=ejaG`mbg5nn$D88S>9m1==H>n7{S z-m<4;{-#Kz1XZOyO--#9yrgMw?PQ#+F}XR?6Uq7(IU_p z*UZ@^jji`;M$ZZU{z^LEm{a1HU~O|wvH0%FS+3Y}66jWgl5kevkUa$Fb1ZQfV^SBg z)~s7uhAeXr{66iM`zERZg8MVJTQ8v1(eKDRRM39wpb=*f=Yuiz3j0JdaH)}79jJ^bPd-8#dQb7oZ4CAoR2{*B&Yq;uo2y@+8FZ| z&34nQ-JV*`uQN$pq=D`8L=KVU&RjtdF$wI!^$qlh=Qw+LyDFS2pxOY(1!G1jS^{~Dde#<9}X zTh;FEOqiNIfN*GhA@?=5i`;6IJ_CnLzdCeZm;2I%{XJa@R#BtYy#(Fi08_?wT%6?G zN8}q53FEtj9)%%X@jGF|;@92I{Rlhb&r_+EN)QjC6Sr;n9EP5^1?f3rtY%N+B&s8Q?}lkqvyO=}aXDxXS++z+i%7g{o)&7W4e~2kZ8xiz11ICtT@a)-*m*yU3z*{=Nj2(#97} ziWm#jI2HEQwIMUdP)B#a3U7HsY_^}U<6QPH`N6RFKJh_Az5^He)_fo?j;zw zh@gUt2+okp1-!bth#+0e5xU$yV6&)&Ps#-YBe`H;R`bHC_W$92fq$`YA~b*Ib^&%F zE>!r`?E){8MTpQlJRni6ajSa4eYlkuxm}>fdS;i%iRaJzu` zVoHGjGV8n4Qnw3;Kxs9QN|dA@uvYS-CyNe3N`qGm&={u?;>Uo9I@p-VH65YTZICi} zv%tkpyYUL^T;4+5EO0h%kkdNyRjEnVspJk^EHGRpP8A3?|BsqLp_1yMJD&4*Matnt zEF})9GZ#)x%iJsQC@{dU(;I~T8|sCze8 zyG1AOj?}ipd5hImMY>ma&++yK-CC@WV^ufTU+RxU-Cfa&ZQMofY!^9?!vuk08i8-X z!H3;e0@8Arm(o~<@<_EKL~0Rf_nJq|Lj*lNz@F4CYw!}rE4LjkRbiCiR@v?34oJWG zQpoHQk>Cdit{Gem*+P}w0L6@Rhf`1;E(NGG$tfH&5ybcVbQndp_T|1j6XbW!L{L z5{)Z8}}E{XmeqjG2}{hcnqYd6KY8b0_hg z==3`dGPXA}I?Psdn8MBJeAdt7-HbEn^~c8I9Jv$g4tHbS&8T1>TH}X8vj{AB8kt=EsIb%i8orF&A`kcVoopxh&F_8Wyi|68R+Du~Bt( zb?es2VHdX>%N@iYi|=tk^C42IYA$M>dxn28V4+DGYHJ2m)ms_?Q`QmPV9OA-g=r$63(u%WQjm72$7 ze0Ht*G8#Mw+($ej>mYBcEOevu~(tx*WziE6D$ESpc{vf+36xm6@}2>cse zIlMZgm2b_sODzAo8N^7&sr4?a^S{NB;0ipkzgCP?*q_f)!xi4F-BV2~rw=afrTkX> zMyc>4D#&IrLlOydA|~`vLP_yH{^J=CSHj2YcmO0l7;c>Yn&|Iv?+l z>vkfjt)1;H{nm_c#XZ`_yGx4JJg6=*iBF(6Z_Ec&+{x-f=vUE9TBt1{aBB9|UhPTc zPM6TqWAG(!HF}DT*5ct;lo+>qhujjDJ^YmQ4HGKH`Pw_5EA~aH8T?~>3-sDHt~}`s z_dt|(V$s{e^~YItTQS?&iArlGFPV!AwhUv_ve~YhALlLLS&Po88ISOe#h9QEBIf@3 z0M`O@!p0Spjmg(R%Tr-_{P2I?6 zE)41(~C3dM|P)!0etmm?S)~ig9%2R3(F^1wW{Mn8njlaS1+%r9>fqN3|z(K z{=R=hJz-d{-7od_&M_O+kYKyz)!77>&jwoxgh)c=(0e0?hOV{I^5MZtIXFTc6&riw zw|NGeM`r5;xl}diekGFpYEC%0xG&TkDjyzhJP^A%TYv_tXdreCUTrna1=(!s==Nr+ z^h=ehU<3NY`Pq-uxm4;*qRzO%I!=WnRFyiHW~T*j^4D-fM1-5JtoF9gen2=YQAFTa zubuxI(M-*&d8bgITl>y8c*QKbdo?S@{T7|}%k0Xa8??rY_y{z)TH`}VQ_NRUu;I%E zVp=Kp=A}IiOUk{+BDK$8)R8}k=I+oFVM_(da~(Hk<03&1#-SPGwZ`}5{nBS*Mar2J zqflxGImm35Zg+7SuwrZ^8P1VQ5DC}WlAC^j!+_MUD8k4TNHQ`+y9F{dCsvzAGGm;e z#u(=gkngQl`$%2Y{jbGtVq8b=v+bdS(qrQr?q5(4J3Z7qIotBu@Pg*h^x^41gumG~ zLO#bm9qxj383g0>q;AW-ZYj=ae5BQ1(P~VS74Lb3SK7isHX69o(!N#5GDx#Z2Ju+! z;43#hTyUX=A2Roa%ie9ce=#0PyTPnjw;JVq8-LAScSGDubE!Wwcy+pv){LWh4~_-8 z`co)iZ`Pi4&#L^pYxy-?9`v^Mj?mr6@zd()%APv0vU4At(j zlsp@LJ8IrJH(2)iZVPwX8nZ(rQU08rcoxcEdcl^v<(t9}dPH=#eLW;#(FgD=6>zsf zIDvL^Q4b2+%x~KEl^H~G;ZtYW{dQt?xt{t@$~5iSD2p>zgd_f`|0_W*Rs?y=AVG4t z%HK8XhbGS_vo08TCdL7=8yzxNC@&@Q3Us*`VdbO{=6DE`KPprlAI|5z)PK>f(B?mR zX0er_&Akq7f^qc0Ex8%ueBeGsk|S;3$M?#c*7PF^K%kCr0}ai)_p?MAP@}7>n!lI7 zdO=|4+Av(oSqDO@Yr`)ONmgZNw0U0nrRk_paq&R?IB`{@)0Z$+dgo@@3t)h5>$|r= zTY^A(e{mIo3DVQ4>B4N@X33L)Qjh{&FV?;#!cF?jY)`@;2I#sF-*HgtpwJ<0CQ!(r zCh$qj8$mw%=D#z&$4+AIcnuGmuiL)VD#)|n6Q5xHmBSKeC$hTKE1cSu3SyTv`tOYA znQx^32l{xHPpNas#I7*jdXyA<%&Nhv(|=2ObuHwAfkV6-uFu@zi&%j9K{m?4T@p<{ zDBIin-1uqOvNv8yYZb2&czwn|v#CwMQt_(njX&otF!Qc=WpCs_0}^;IYWB$`tI_1l z6=V|_hAi+lcTDE>u^^*V8{WZjl>Hmc~ zud4Qj{MbT9;iS(A8eio8K7#Ij)>>6V0jP_R@5p5JLX8(S|R^)bin<3&Qf2Q-fdM;3B zw|UX(z7!dZ8;RvQ^HOdplAFr5@OL~{6k5CSHg&GO+N5IX1s-JNK|#jR1+l7Cqko|# z8Q)Yv(Y7l+#lF(J3MahWW>{jb_GDYyt8Ln9O~y)rxE9YF?oQ|0EL|rSp781D7ulSM zx@KVJE7fbc&mV907pvDkYj3xjm=@zQECfxjKKNb+r~yl|V>ud-TmRo;y1(qibYB=; zJ0zrgB;B%g(R2J1iRd2X*q#4;ne{PijDW7)|A%mHWz)&}hbyr!`G?YS>T@pKEgOmH z>1g3m!MSi#7aUD2{VJY&xk!ymv8psU0p0NDB{<#kSTGRF9VNAp|L0lZA7gh`7jv*A0o~-iX{SMpf8n=K!@o0r=sbuuu`oJEe|29ViRx#awqL9&lx8u_+ z@!Yj4o;zRoQGeXIi`3{}r8TwFP|I1APS3TwFd@mG$H9KYK0?Iyc76Aev>!wW0@k!E ze5MQRt`L7kCm+3^Qisd7v+L=p`)DT{)O}zesC$VM)QyI6@4~!mh@_fZ9!y?yn2`8u z(pP5#xewf19UhTJHg;kbtv{WcK^UYUo;1B%{6j;x6$VrC2PFkTPUyBduQZwo+P32P zLLY@I24c6*S5qskaR29)fq?C?PQZ4t${P}}t2&wPgk`pVIM41Y*2O-h)C~|XSs)#>ramEx4ajCWvW0r@? zme6R~dlbpWX){LLlK$+s`iXI78+uHIHOn%e%O{D`4wd??3y`I#f>bf<52 z4x;$**dbn0)ln)#D3V@-my3;s=YC4t$DD5SPBmf>P&mty~Xa~TEJa`D33TGJJrR1s&Z z_V1c?L*r~ka1bY=zdj^L{aLA>bxoYD2pEG>_M&#^BND6RcWLZwewT@v;P}e;ql%TM z9|<;8E{hkiHA=cL-3(_aPJfGEzq&>$xK{Rz1KNy>yCkG(g6kFvTN|L83hX(Ot6G8mRfCXYg@Ff(rQ~?S8!`sgy0Ie;ZjYlZJ!vmu~op0{J-bk z=b21Gu=ag_{q^(y{vEhE=ehemcR%;sa~WJG3uH(gFOV^Gq`*~lOM&Q4@c?B8DwJ03 z^E~v7o{p^5r?NCU4B22Yb6441;okU+RW3_dY|64Xj)v8u*Gzi8M>!<(SESc-@M_mV z+jm)kQTEeDaavkCyd7 zcv*PIk9h4jBY0cePdGc}9;KX&9d}2j_*L`%%+uBrKZV?~qEEJdrX%T#f3_~|^BKsH zQV}5)#C$R<7*~#pKO~Jr#z4;bWzeO`-$S@|jy#?gxeMg?IOlfW1F~Q5t1EH4zcAZ{>yl zn!Do*d3B%=tMID>F(0rYOw}909JXxPlvXx-9~{;XHOO9%?u>)z2w<-_*!s!+;Z5=V zpd@TId-oBN?HBrAjja{z@;FKM*v@W`?Tb++FFIgPyuTW3Z5a(G+DOFj2*%c!I6gm&sPu)rv`%3$%p8J;WdZ_xb#PsWZ%U97u#ii?3=^c9SA|t1)zbi1= zR^vw6lx8C(oErmNGnh9hBVC$heh%Td?&{Hy~(g(7P z8mdwFWBuQZSWDA|mt;46eN?WafeJ?JQQEO6R*2L+!KbW-h*{wX@CWN9fnspe^& zRJUt)wh5y_vN-|E*1B6{0Z`#tf0^t{v<|1qFnJhi-a&`c;TV{342w&{bAMY3u03^G z&2aV@={iOUoKQQM{YG|E)r&unHz=}gWmfIq5lvQ%P%<)Qi&VsjV%Z9_E}1aa-q{^( zyPU=vsV54_PIQc(K$q15N<-_hby=n8*ksv%(@YT z`^ywm-NQ`d>}6~PRc0SUpRayGHsLu<<+89@y+-s?!Nsf?yHxfyLf)^pU+HXY-dTN- z_MM&ZXLzQO3aXwRX;akGP)Cbpp3RC-QWb}isyJ5S70^JnZKBf%Da}qtN9cQ;J*{Gi z;B0#SJ({Zeil(Z}W1e|DJ`xyP-J7DSZkr#J9`vH9iree9rm7dTG9Z6gRh6g=)2gbn z*Z-OJ&t6a_;_QqG=n~+Ag9_ACWp9|!_VH(7Jyqx0daAxp9cCUiYN|Z*j?(-6J+xFk z{vuI0TB^$MuD3vd;ma1=P zPcKAz(&N%`TB^30#)O8d_E<9(%Ba}(?x&0d-L+LMZTr+%Mrx~CYP415X>C<`+q|?a zsZPBQ>P=gf-pssg&1R#+u+gQh3iVduUC<&p#-!bgwkkVx4539>@kFYs3cIPQdI(tp zVVCt#RaL0h(pDWilrB|O!u4I%K2ZY>OJy2u9}~`~PTr`ik{!^m@6}T`Jt=Gb!Bv-Q zbyb(>ZPj+6gPqyMB%qrnc`!<-Bmi;BZphQHfB`{vL`T=La-#J}PMN@&uEm?JwQ4$^ zB6MA~?~pnBOI29)Cj@iQdkJlEV4@AmC`Rfhv%febwtc_=!O)Q0_9qZgVRc9>aPo+j zs$NxCJ%o=Fs<8S2ju9%XHp*u?bTCS(zA2w<%I!}Xow}>Ax*VG(pV#=F&xd5%=$({_ zQj0gOGW#E+!b)=~tY&sM(5&q_hI6BBimj{O+UNp1>Z=g(^E4t|tU|{)Yw>F#jqcj3 z{B5j=S-a>hj=$|`omEkX)vNX@z1v|SC=@i>tCqCM5lnc~gH|kO(^Dtj{u%96i;2|T zevw4oK9|3)_AIHFI9M{Gy=tnXx~f75<7{}|HYGEQieza@v>`1RCd))kj4stxM}=w# zsrF&j78jg#ycVmS{w^(6i`GhKz5PU5tgP>F=3=i{&%a4(v@<*Xu3alFDHqJ@ygTo2yml~HLyoN zi`qP4NBeo%JU|@U`-m$U#u|4IzHmkPN+?rb4zm^~w@>OpvOs|-EHhf}gz zVR>kJ5Cm<`uy(rWkvHKW?JZ`&@x_imzSujX5WtEk_LEMrO~l0BmQCN{9-HT3WUA!l zn1jKO{D^#Ur>(O^;^oMCeRPs=HaFl82l+K3mKgzOurL9Q@horcg_$yhIQ#Isxp zle>zYDHmUguVSBeTdmXpNL@+6XqXZI93pA@MAEIZ{^duL_x(md=SX3igA4Y&y^N2zwh!*J33~ ziMY+t82jA)*pPFs297w$X+3=NF@XgV!EG{zp;Er7+7+1OFaAK&LS)UKe@4g=C!ye$ z!oqw>ri>52ujQgIlABaW$@`mz&yl!-4-m1|Pf3(_ApVipIPMD4;qjrpv87L$JEw*+ zS-s1~cHI}uYoxZU{f#258cG^O&aHVSMmKodVKQvjKT>+(Ge}`ibf%m`1);yqTqMj} zK4T;YveJBJqy~>T$OjYlV&yNkq?F}P3yC_Ul$<%DCWfiD#Tqg~8WFd$xb5@DuL(~1 z^#Sd1XQ4J9fyanAOAL(WDuY|}V&^7XKfI>16UEp^Sn5%7Bmo-dBqN|nn~+=h(%<|c z*SZY-AjX9HRjDz-aiJ{lEHCQC11Ymc3FtR#w1Bu-D(eRb_FI49+~XM{lkO)pkT}pC zKu_mB&?WjnQ};|G!{3cITyWwR?46IxSc$y9Tq;6>i7C$?+O%2POX#T?Gq{h~bbYgY z@!o}8@_Wzu=H=!X+@nR9SoYa6S>}a&Zdd_mALaw;%-CR3USqBsb!wk$Fd?$c(z*ZgJO4CKn1LyvCd zE9lu1~A_lJqhsi*}FsNpRhl#m^Aa2vrXxGMQ6#e}ra*+570)b|b_`z@SL`P^QwqFoi zU8V{Y$Qa=!bX~*{L2XiF&sz6NP%}i-b`23%jn;G215qjF~p89@W=ICI5n5pk)Jv7>LOEX)$ zki~kaGY5aXoV_u6L!7^Jujiqu;_{sJQm&pI2KMxTYgWVIz%X_Xzs{;V<_+}WZ{Oe@ z5=q}Z=ONMoPvq&Thar=v;g95^E|c@ay3D>o9!uNR{-L&)wV~V$;dP&xVag&`kP$ z_QWlv43cHmF747h0`quh**()6IB#a(z#Is2mgfof3VxwZC#B$#o{eO9moB^nwCT{E zfD;7SC3czy2<%-V)nU>>kWZ)6HV8X?$%RW%WATY@# zgvUbDp9A9=t(>>9Trv0TWoUb4PwYncChS);7D;;>F$&-Q##yfk4;6t?D2uLk7}N4b zlwa?i;HJY4bxxTcm#uYifH@l`u>OtoXMR|_)L+cGu^*K~wHKil|3iP~ff}ayr>t>L z;@?a;8F@{-AsdcYPbc=-)e2(G)&*^xHIl6OsPg9Q#t|Oy_Gr4SP=W3y8(H1xPrNqB z;(e%vdTC&i^)%?76gtFI%$cz)EA^y&IE=j~lWGP6iUQO92R_p)p={nyL30CEX?oJ_ zOzB6o%#2jzMbg19KmyU89ep|m9bAI3G}UXPityU#g$26XC&=a9pVo@7%13(s{2BIK zHE73y+4NSv%qT}uD;yClb`E6}I!o@z$lN8>?B#CTw*rK1npFqrU9X6ql$lUjzea|; z+=N^56~mcZc>YlA-M5e)V@kbr|-c!U+6=&ZF_U9RBW=FR=671 z9?IIVc8R}nZAVVSvjKPG+M~XQliTC68%vL7Z)9x9KV&^JR~n{g{i(3}waCT#j$rbU zJt`}XA!J6*p+Iy_{1>6;jQ$MR*s9q#W*({j_BWW z*U8zFY*btD&oOWvAo3VEJJiuWH0$slcfd`OiX`9ni2!9*J8~Hvq5MLgL2C9rP8IR? zRdQgW{23#EhRPpL{U=$$hMdff&?}x>c5?n7I)HZC&`a%coQ<_dgF19Xj+6|+v?ogovVvn4w9_vgQoKGHGtTB|qdh>e}B%|#|&{rSa#^c6@@d6V~_LoKT zJllS5)g7{4BMwU6+L`hWR;=}YX?+W;y()>)wBPQ_d@|U_SND8YdtXuU5CiJ=hZePl z60AXWgwz>+jXk8vuq~#}Tk|>bM5XB7Fy_6}V&bM*zSpSBc{hsx* z49{tR#q|rCny=yGKrob$gF=j_I<4^t>NMuGNUaXF`jEkO8R9#TPewX9fozitWN52u zTJ)mH!}7+pFIql!oDgKl^7^$eo)k>xVnz%8zndlJDxHDd#4gjc^;9d24J__AL3I{J zlZ8j5M{ienU;npYQYh!pn4Q6xgb&-J5;~~#oiz73vt*SSIF;=bU^HJ*x;tb6M)4J+ z^j0fI1xI9W$XU`pWV^g+XSbMmZs06wkCEZV^kjs+XhS|8pUV!dZEjrK;#vPwu|PtP zvNn&|L5wQP(;#Akg4PA9IrdpEOi6vWp+=C*KV6mVtN%Ras)_uKY_0zn>GhUb$C#XgCs79%uo<^bz9l^Fg+6P0 zkzCA@`~*kpv>BDG^tbF3Qb<9_rMF{F)&>~Y_F0rZu!@pzK|h&4)t8 znnHOR{%$OFt#?c}1q+_jCK|6GhUD7!xD+jvkXyW)u-rh5ZONIi+sZsuw;49LvgnF# z&B=W4y4Tv#WxlrAZu7+n*&9naF_1Ryt9$1`PHihPR$HW4OMwAJ^|yYtp<*SF4w>HypQ?1Xw6K*2b{e%eZ(gGp%9@*K#HV|)tS9v38 z6?#p5M|NCC1S!lD|lnbb=G&6jm9m2FO z|1J4Hi0IFlx*AaeiTaCu510{lIxBQ*GfpBn4s+^x>$~C)sY&~WX9J%sWt|(I z`O(AQXphbd{hr&M8Dp=T$(1-6>m=aUbS#|#9c6xGlv&-QJmbrwr)avT&b;tHG?u8DGWYjHP3}*Pi2Vsu(+#OQ@>`a~W0csd14u&hrowoz1X4+WRq3 zleJf@EnEf(wTLd-$C35yd@_^JYxa5`-qW7tFPd>+=# z$Mg-{RW#$c<&Ek7`Z(CQdZ+XX*|W}=DJ7@*i@0HSi4;;R=HpEsvsrT9vJUT;e)~OS zni0MsSORjdIUxE55;=Z8*e=0IM63T0*6Q|e>AhI}K9_$+QVFX&dLe6Bn|IQs>wJ-| zBotP(xeKGU&>Rd56gi-N*)SN!(YXULh!u=7d%Hr}#+K>PArA>v$u1f?S&g^KiAn5o zIWf7cHD^Zgpx_wUlK1gE1OcM6GfI!@3lkmoA%Z+hlDhBNvOp%jXDb@>}V@1N_D7B(R?s zdU<|rg)86f-V+^Gk0$Gi}*&?0`6a2LTD zJI}x4-DL0?;FE296!;Kh9p7*`xE-d7i_XR0WBTtG`tRrZ?`Qh&r~2yHO~#8%uPK1HsL%_q6bS${OZwaRKaA&}0M`Jw0AF+etMWz42&;qb&| zAE{LkPg^VWqTnk`!Tm>ITv2co4(6SioSWHlHIH(eLdW~Vgwkby^HIC(!a$UHo&iwp zjdsdkEMuk|bp-l3<=>SI=izl3bSfir6Fy=^e=-CRHJ*W)p`2=RM8;v@a2N}ZiNTm! zOOUeYt+begR$1P3&}{+ye^Atu?V5*E8p#(`m9y< zb;&1akruWdkk}f=%1SC5Rzx#UJ7+W8 zWRbxP9OV!KG~Exr1w7AiJJa~w%%`X*dl`4H)&cJVs0qWhQ%12|Oi_Q6urY=k4K4ZstiwB^m>oh`)LT*Z%PWU>!~~LzRg8X%B}UY>>}ZP(USyDH zc-Od#!V+6$3(r@!#>sM<8`HbAz82EZ35W)lzl$XbT;%5&$#BjO)Y0eSWpzDUBFqad zjF(lI*Wc)C%@Z{)q3n3>IWL6kA$nbW9atU>zDQyt+rGgl92wsx&LZWpw3-LE5ux&= z#>9J4v*WY;>vq)fO*UXrwuz5zS$yY(5>0w}o?U%0GXLkrCre_feC8&LU8>l5#V(C( zWr=;O*jr+6GKK;OY&*pEXz*9L>nuqD=@S8-ddZ~GB(t5$Jih$UU{h{1igCJEkiT=E zQ%Aaj{Pk^75tXDX2)meYB{>yT&{aY8ZEm5dCY&o6uAn$mK^*dgllY4DlO2ClDA7T} zQbDQIMY2>7gd1d%@gdCEKlqZa9v1iA%d6{$+4E{sKh%X(OSqa${p^USpFBG~q3=br=F%riMN739XU|CiOzBh-&#iTr zmeq48*KJ+%HR=5qBwODwNUBw45U+K)LDH;?4U%rtyF`QSssIASbYpqZGCZxPJEU1kw!v7Gs`mg2EpGj_$I;k8(hX0Yq!BS3%7<|9r)doK#c!|MV1z%!tOYl5{cL<(k@S}oH zGq`Yrtu%wX1s`s3{Qyj|!BfRP#^7GTk1i1+m?vf4Gq`@yrPbgW;^#$!%fj1gF}U1; zwH`CLJP2cLHF&k)KR5U)!EZBoo!~bbe1qV12Hzxjz~HwDUS{wz!Iv6*i{J$Y-zs>v z!M6#XVen?bPd9jr;9i687krSxHw*4I_#weRU#!dCDtL#%Ey3S0c!%JJ41QGbXABO< zR9VdimuI`J2MnGp_!fhw3Vyr6y@GEtc$(l122U4!mBBLvuP`{QSY;I&+%Nb-gBJ+y zH~134XBxav@N|Qh2|m`~)q#8tO_fHx-Y=jmH!d)QimkV-sy`(y(zG zn-3RBu`l2S!K7n1=xn}aY%;L<$k;q-j?C1ieG>kSq|d7-Cd4K!?{Yxc%Leb3$*yqKHjM77v|WJerfgMZ%CwH-dc zX;9zg>)!74EMNEOQP0&+vj|3sBTZyy@OQb7INRsE=!5?H4hn|mx~V&J*Y67KZTI+x zvEe(^xeLytta8{ek7tuS#@;XwlMS}Dio_aWRp#ELByibxJkiatelP`ak)V~`YSWy3NOkh&|yL|$KJD&j$KjJV1E{YqKx(^^OzN!8*cc6d$ zX9M8|1H0p*>bEuoQ~p zj8IY|M?0Yd@EE+I*mdC1Etv<_p2nk!T2u24n+brBN{gG97m>yHhLV=xsr?1(RnC8M z8)L?jvp8~g5`x>mbK^PlEsjIKCuxPAM@MjbY=~<}FJ->P!&PLtFIo1iPo)XvHR}9k zzU9$u$?Qg*%eF6M19?>Mfc>7?`~A`TQ2|)fU;JD|-i1}v96U+$jG8WH8hyDYSKOvcxr9gL-+`{B zrr}5Rk^b`&iM26S6l0;`t20F|H~HbfH}T?H%6-PMSUbKcFR z81cflrNl=)>t7PGG$sAaFZ9dT^pfu7Y51;mt)`S~aL}c>LozH5*XTaSUGu-5u6_8m z4>)+S*Ai)G$|~_FchR3W?#W^I<=TCTohiwVzZDWsV{9s(&}|)x^$5}rqz?!>{o^Dwa$C!grV3o9vo=$Lgp%IBNkB(u z%IP|(R#C|{QxZC>^JM|BSK;yb^eb?3@h3yG`C#LJOf0_67x5Bzm^%VUW1|%yg#(^Y z(mIJV^ZCFu-pvw$G5nm0T(4m~j>JQm?O|YN%7eBC_R#YB7=A)YBI4Yc@*~?NnQI5I znNW15z0gjY9ahiv48usxvYph53A*~8(9C(zhxUuAG_s-p91ME#!0Q$JSe%fv0pf`Iy`k-vUY&tiPqL?X zvbdHFYS-%QRTNw0a;_E}ofZE#A@+KUZ!$4dp*1|c4o(ssj&>wkjNm~aX$iNMcV14@ZI|{H zteO#9yn&@U{r+j|$KTficN6^epS51~xY&fSu_`(9-m4Oc$sEe1%lMrkgUjW+tc!5e zgK{8^X`#jX1dbAKLcU~WI1ZN@hgR(%0-TSU^Zzg(+AFW7aED6TPGE$v?$2xWANhN3 zW^=8_`jB8w;_b6g-wYRiU%+k67$s$3wB$Xs=d4%s)FPu#V6f=L>+hd{RBmFN6nK~Q zA^ONfNwq$`Yr+CA|pKr0h>E5yX|AZ((`Y_fSPl*yW&O<`6hpr$o84=fePl5_C zaAEblI|_9p=={%tjKW&}Qy)B05hJb3$n&TS>r9<>y=?g_8$~(U+kv0F5JIzmL=C|Y zZ)J4f@p-JT{x2itfeVp|Ey%yJbBS+bz>^`fePLGA;jI0~kn)bwvfi#>U*yiT&fXvT z4rhDNs-1*Z?WeU??I8oHfTyh&-;zr7G(5#-l0>GH$oZj|R=mf_>Gl0sTV>q8Vl3wn zdnv2JW@#f$u?hH`amgUb2{IfW&n>$;Q@%~zNn~pY1t+^N;^&?Q*%BichZ7V)-sAVM z`bpKsGH=pT&i!vuH0x=%)GL8)31qNbEr*FT7eaVPc5%> zpSU6JKHQejp@j%9+xp|%wukSC2Lw+t^xt&FptzLtz_Eqqf~G!ooqABDH)4e{92UxX zMrX>|0LWzQKOtB?ny+XZb^=4+M+5=f4>c;9Ej z7tu5vdBuH+=f+sr}mV#cafb!(7!3=m#mFD z_fnX*eH*epc{IzneS5Rx3ZQ|aZ|1dqqFdH!WBEMP_8uSFwjBftUrA^ogl_n>2W*^$!WUD&UoL(n6bH?yJyA+6E+Oy7Cl-d z*t+q5LmxrcebPxks(H>oiW7E!(|QSy3YqK)OrF`)cT>_IS*7|zi958qAz7j8nwEO^ z`gOEPNKGP&=L73boh(8E8x%Eb4b zzCsCqKgN_WpON=OB|MFS^ekbfl(0Vzx?I)bW1CPw`Y4B_T@^LCdx;WhZE~8UMWaMK z%03I?P-P1wuh|pXqop@jPoOUXq#rLL1;pD$P4W*WphWe+QQnqt>cn*J%P0?e1f6Rp^+8hqunvz;&Sx6HQKa3hu^Pxm{_Jlp?Umh)V2_!_b2+z(u zcHOpiR_segNsE@x6z*V}0y7Ty&>(SrGz8JD28qn_-zOuCpD~#2Ct1kRYrW2tIXVZ7^q;c=qU}w6z5VCR3nEV6wuJZbuMb_Fh^uaF_0jc?m?bbGyY)f%N3*m#X-rb81yl(n$b5OyH4h^jj z?;S>*F8#NTsyxwu`zS6w^xr;oqkHS{Nd33A(yL}}@yzu+)X;Z7uD%@>8n5(9>nI8; zWWMo*T3Et*8j8u8h>G9nHgK8^|8CpAX~WxX*gzIUq%yV^w8t3upxNUace9#R_-3US>Dy7DPR zH-)(8{clrsI!>Z{|SY-y7{zE zl2~;tT?%o}JK8P^aRFh4xZp84q4Rh&3#GaLe^7{f&ql_}6Dq_-9x>@zw!oTrkqU9s zhtdxIM+$LoB3j;6PL+6iQ;54@oX!^J)DhX;)xaF))?PH z#uF>V{p6=%Li-~X;(l_LPRdb;YgD_+(m1RU_xThA%r=hJ8gZwykYvIM#QW-x#-WCr zrP-G&$h~>GS!8~hg4|gsU@Z$w;;*A1cN5oL-cM+6tUJ4cI~AQfkN}=GnIX}UEB2_!we3-nJ4x(IQ1C9W+|zKfKvd)o z7Kn=6egaXE+eaX(9OYh;s5dHBKPasgRLU>A}1PDexrbo}5QDqzeS^fby<-qp+v|cr^tiSI#wx0<1w^RUtBPDx8gX9O_ES7s zPhJ*YIbNG>tH}N4;mG?&EYL;JRWuG~upaoiA1cE%;+@V$9agpqUSN2^Q-L6iU zbJBmXKT0Ncwkei{jHg-6x4{Sz-MCj}&dMaM+RARaakH`NZGR*eT+%3S#Qtc2eh0L$EcL`h|cCwTyo7meir45qW_ypeM~7y_JZ z!o4-OO5no44Mw7whm8*g&6N^i6-SLi^G4f7iHoo3`o5hAKhi0$yDG)Hg>ww&z#wln z-Dp=k3PBe!lIOQtcTY99OMLa;9Hcz!g{{VA#ti*NEh@III$w@_28a+m&$Pf=7e4g2 zzD+Ychgi++4r?lC-P)rnq~tnE_!fw4nd>A+^}7o%mwhrZr4v)|RLez(rprgOeS6d= zO?WMLNMwkL2;H`bZ@5+L_4@3MX8XmI5|qfxsj}$AfKM?%H|l})Yttw(<>zSf^}rqQ^MA}coYYVK(Q7>GhiUuc z${xCjvd`w&MIU}pfKRhb;XMsMXINmy2i-}^sUw=|1pn$$98FRi2rB9+R;a;6~fxl?~TJ;rMl$xRda5T${3Oy zd3HcHr@kNhl%wU)@8x_Z#hQLecs%;xTy`Fx5_w)|6e>%MdX`6KVIhaWG3nCOEP4Zc zd-0UnYP0|^pHUX&4^3ZECd?_G@4IEMKXdwgzJgU;s0@9;twqtX(*89#du}e1&FB~W zxU)H|w`<`#p%2|cPDbPn;=b1QYjjo68JYvb{1g7l*k-L~rzh%nWP=ro;f$?0Xia_J z-#8hPuJSide|3d)9@zT7Aa5Lph|XG?eXhijZ9Vz`F*e5TE`nKf_5H%GU%lG8>pso5 zueQ!u;?O`358-y-b@osD&mp!Lj`!Y@q{lS*-PTEUI?{PM<>mmKq%`PIU@{W)YAs0C z$Jc33XWO2BVmwWd&(H_br*8Cz`s7b|&mTILd*BOsAgwyT7?G^zK+Y3F`h3yTwO=aW zy#Hbv=Bh?;sNA5NJ!4v#r{NBKfF^>lzq zb$pN|ZU^7_g)Bk$*;kFFs=e0BnN0oS?Gody?T2{karT%c2aoy=41CE?U`<+E@hn+O zlbdqBhBeV6f+J~4DPrg4v@DAOSKpi)vqz59DP*iZW$o<_9b-s=3?DLb$R**>0pE6R zH?fFs=9V4@q$r^4b<9J@lzrO!?$l0sSMxj<5-Zb>m|=n?NT2|_D0xvAH7I0QtdNQO zJ(_tKvOPELAeGLPRQL_P-^s+nJ=g@#ux^GYXpUE{ZwY%4mtMy` zdD-kT#=b{X9jwOZtT&0DvoK!6%*}kuA9^XrlfM`1d(0Ud7u{|%Ik|RN`|DOdG1q6r z1{16?I=LhQ`+2%b^zuJvamYnhSH{cONPldZdayI)YQEYRt-cIG5jmdDW*H}iH2NvA zXgf!$iFMgbydF8^ABJ4ZTij0d*P{@5ob|{8DVHQnpw}3AsEltK@!{1nR%n)CuKi>d2T@PY-k9ymfU~yL<&J9ht@~pg zsbzbf*zY^=DK|Z`I8|Q)#5N!|KM<`AqzObvgjXQiA^fxJ@?7pZ4#J-1X1&T-$G6IG zwWs&6zh2u%wWs3C<-V>x*>NWm*ksh9a3>h2b<*&_(vjDOHIGxx3MDOMLMqg4%m2u< zG{pMJd}m0u7SG_YTUf2_@uAq!aCI78P`uu`56<9JF*em1t$8(4-nZr^QMU)K7yX6e z$OG3;c^em`w#}qp_VU1WdywMw^1$`3MHICA1J`3eavIco(vn!eGQfG;himmbayZOd zF+21mmL+5T*2{mEFA5+U{qO65&=u9G-(S%t(!U9u$k=_u#4Agc&UD^ zGa+fiXkX27H zll;60td$0~ShuqcVcI}V-QM<8lXBOjVC{hjqV&=bm-9K2MXRc$TmK#(B`Ad84-00! zBIKOUPopJ*M<^S2;j|FIWpNa_G4`${Qu5t?qnCl{`BrVg&HY3nNT5$=N+?!)N!!&q z&I0Wm_pbgc>~fOi&LgRM{h@bR*%w$JOb}s2b~jwpjC9GeUhL@tStLxM^@#0~9vNmk z!=bWPtm!2>Ct{ZaWhL_dg=sbxtI`?UY(s{cWdi36hm`YjV#_nu1YR2SRS^ z!Fzhk4da8dp7>^OPI}yycYu#0iI%6cHuUPGL#>Q(>QOw_6w1nva1Rr@{_#58*rSS#BR!2%5`H^JUW8LYM5t6CBi-t*er=)B!pCRzmQ8EXmAzy>l%Hj7up{f%TBR9RMK}mW|MUBQmIAG3NCQ{u z0~@L-=DVK_(`hN3LD;F!`p258yoJnVXF-f+t5AL#Gh)z(``7@hIuwzYQrmR zc)bmOXu~vFnD85H!#*~A?<`~gk?l`SGvA3e9BadwHoVY=SJ-fa4R5#MRvSKL!#8dC zfenw@aKLnv&M7v$(1wLJth8Z+4R5yLW*gpX!-s6R(}pkF@NFA**zi*u#-C}@_1f@s z8=hms`8NEz4XbUq!G@b`xY>sH+VBY*9d$J8PZ0NV)*KN4UhBw&odp7*J z4Ii-K9vi-9!)bOs>dNKMGj=^bWWz&Fy*eIF05^{lrEW?MDl)L}pn=caZD7w}?$3;U z-6_4hNBVaqeXvZvWhs-7X+5lf9K$B+5tt0KOO70fdIn~UFN*aWqGWIRR0(`9SQqm;?N zf}WCJu0`s6O4%h}PJRrmb5 z_^R#UZ!!5O(IxNhvJl^;5x(=Gab-l<1-N(rmV7wrDq5MOr<93bz9l{>hr}cKmhh~6 z{AaIRd3J5ML6z`3-J8$PE68eo_##~X9U$&QBAml&o8Rf zpQNiuOA)`st%y_N!&DM}wIVKwN6jr=rU;`J6a|7cB{=Y#TT^ah(4{O`Qycz*UZo|K zr4bejgXSy0s#5z}5VT=YK;n_`5=P-q;YZ;vNhnuTbWCiYICtOpgv6wNp5*=m1`bLY zJS27KNyCPZIC-RZ)aWr|$DJ}h?bOpIoIY{Vz5Z6Eh{c5UB05M{E90pR#sM3f1{>0 z5WMQ@RjaT0=9;zFUZ>_%)#R)y4;0i?6_-lwuB0s$Q};Erf>Je!mQ1^kQj$ap5>jf{=b z56da_3cf0J|1H;JTV!0~UQU|jxL5G^8rz@ro_O86O#I@n1ovX?Ek%|D6Jgeb?QlKSvM87ZZSbtSekQhK$|E6Kmfdw^aorI%W)CB_Qvr%Ely zPU4d~bxJ1VQx}~kYC5eXZ5dN#%<-x;W`ttCYSgKGEhoN8zNO5PC$W*1AoP?H9Z#uB zokwXwW)6_@Nehb%nXU6Aqp9R;lCE88PfmSL3DqbeZN0_i)ooDPv6H7R z`c6@2h2wMb^VRC}YSQXG#op`G&|wOrhLiuVo}Tn9>9hZx^rnZ?tEP>bHgFYj)extw zIx3*r@jc1un_U!h@;@yc-&fE7<>Xw}N~=gWKpz$gIbYHuom%Wl&8hD*)QoU?z14RW zwJP;xMndV|ReH3LQL~gWQbw&(9fQ-39B9gOMvwL+xsn)Vd@y5MC@_T%IE1|lKfkF|&gSBdxJJjbsld zzrtj*-;$G6{j?eC%Xx7YqY$^PD&X#8`vLjSVtZ@HWyzm5ds&J_Ut+hTu@w7*;9jl0+WuC~8N z+23_;()`k9?#x3GPbjc&-~JeK}L)U`k?&MDuWdjps?}#aHhxMYIGmf zCn`B6CnqOXe$&&5OFVir3YNsV)miE3iwoeNd%e1exeLn*`6;!kdKEu6K6rV-?FP8{ zC!hcMK>_b^|I!!-&A;Q_j<@ksGhgz_+~wSSQ@T(7$RMZxp=D*v4D z-v6|L>tB@XtNnArAK#+?S(|^<10RkcF}imB>egLf-?09MZ*6GY7`n0Prf+Zh&duMw z<<{?g|F$3e@JF}*_$NQze8-(X`}r^Kx_iqne|68jzy8f{xBl0C_doF9Ll1A;{>Y<` zJ^sY+ns@Bnwfo6Edt3HB_4G5(KKK0o0|#Gt@uinvIrQplufOs8H{WXg!`pv+=TCqB zi`DjS`+M(y@YjwH|MvHfK0bWp=qI0k_BpC+{>KcO6Ek4G5`*U7UH*S}`u}74|04$3 ziQP4W?B8AfSk8mxfZq9y;9F$LoF6iZ-M*Xnj$BLJ)Z?4mzunw7_4wuvcsKW(dwhSl z$G1FL8JV6uYZ>`1(kHT}ZpO$-{CTAguW@mCWl7c53j#%fa`>UxFRCrAnYZkU(&9jF z*`q0Mc+_&!}WE8Vq;m+tzW+$!l$R#71V7|Zk0AZqhN6z z>opd21qB-j>P@TLP)8`mvaYPG%X6^@^t?zN?XK!meeS#+g*)&@!_eR(BCFW1F#!gsk>1p~c#u=CgD4_bbS zzeUuG!zXcg%f-};a3_RUA-hr8K?uJ?ILLQ+pNIj<;)4aPup!stnXrRd~ya zDoZL#YrH+n*;RilN&{41dB9s-RZ{A$TJEiOc=Zy~B+^}laek9&Kegm&GVMTeF&Q`6 z)jPkORn>Gb(=trW6Yt8E6X0`$Usb$wOqb8}>qxrm+(r5?Db-CO(vLS-D}-6JaPCBN zVjSsTr#yblcyEzi3TZ`=p-JI*|D(o3+KP&*t0iIy-J>}eq8%5mdyV!;rI&PyYE}fL z!fU;0rB^Xhl`r>}uB;BMKJ_1`w~VG{4`M}Rw77`Y;524wu-=uWE351y!O?b49IZ!G z>4#o*ydC_r1=$O3T{GeF-?yBX^Mk`lj~;vLYw0eEI_K=AGC$QWy_iP0dMW2+GEvno ztu0?!T~T_uGY&5;DX$GI4V*b`Qgw+Lhz*%e_*dfYKhUiPmL#fy(-PFc`JVkr%?Z_S z%rWu;cY2k25|bqY{rsNtD)lDD`R;#Gj5=w`;OdmZLFp1k;@dY$slQ{sW`}VNjaNeh zNopu*3|*L@hEC(VCZ&1k#H8sXcYD;ZKtDC4B#HDBm1k;vO`q17{ZYcqSi>9$aK*={ zc*5XP?MiT|1WM)_6t4zN^Qb{nk~{jfChm`Kc2~z0_9^HuY3(MB0I;MlX}Q(V`6>II zytSOJ)E_VbCvUv(5kq|ahsUbnvs0T*NtAN@Z|uz2brSq&?pKBo0k!)_k5e?W6`fh#p$rBZLH)LSZbkUC%6 zSN9*(M-3`*QwMQU2fDpTxpHSJwFDC`SDz@=XMWU|){ErtGH%9vgn7r#PZaF4AsFYo zHyRe7%Xu-zNvnVVKB_-?>_0_XaD1Udt9!DPdLHxFFGz@AU)`Sis`&YR!uj6j<4k?F zQbRvC(1o6)L|1?1@+K;8Nq^;Cn5?|e#alDHMYWcpDQj(#kqc@`;E{~o8&%x%-G@%@t4 zZify%esd{8`b!yWoIFS!)kLKa9qA@b_Tn{N{Ym@RUni3*Pi z*Oe%BD`usgrpcG-A5I&c%QB(>v%&UL3NH6Iw?yW13TrdLxd&{Xi z1Z14Bavf_KCLDG^j2bX4Ne#F;p}?j4qutMj$D2B&Zim-&)t^JF*RMb`(3L2N?VgA9 zp%WA6D;KF@3k&Ek^VBfc`O4HhnOVblL8e^86V&iPD(zzk?PIVS?i!#>uf$D{iS%#k zb13y`_wVNZCuldnLJs9*1ZA9dWBNP&yu=<)=cjZ;_V?v1xqgNDi=FR@;JYwG>^|U1 zajO)@mK4U86xveCl>W{AkGI?J(BWq=>i>Y5;)K`vC+!l(*@fY8w%OGq|1KF{Ih1e> zaWlsERYMj6skoRm1Nj|E>M^dzzD~6AKg4<7vbFWlUo18OFRcY|4-h zLpxLF(oeRs6M7rtJ|-~{mmaGaqsUL{G`C8fV)sQU7jaO=Rx`VGjSWBk9%BQhD-Oa@ zC#lp)Ds&-^>Y?cgYUH%L)JWIus{3q1qSW>N7}6djeX}2ZGl{;Ls0Q7fT&-!bFrG1h zaey(v_+j26e}l;1p!v2R>d?curTyss>el_Wuh5P$$*F_ITTyR_DWDDny2i$Lh+95aM;2Ttu*(=%LpIGl%Y{gmgvglZ>USHCFLZ%Vv)(e0)u>`AZ3pI2%J zM%s$N{zKwvgRC_e2Zqca*x|GWhenGIDD_9oqc)99AB$K=F#kGzOyb;gkn!mSrCxPt zdNO1E%?Yi2_s2EIR>u@Z7eu8CO}l8(HNOu%GeM1;_KoOquI16awJGl~^7|$2_6My> zJ&keN?TO~TEB~O>Z!yl?XWDWJZTV}xw&fPatuIS=`}<10k8#pVm~)T#81>lyP;k5VVO8qHdferUe&1l`l!_)F}g66srs z^UeCuH8N3+4D?qcOOol+{nW^=G2dS6bQ?cfSp%IYudR~Tp;Hso=s>A!bV-S8^t58v zXxGz7)@6QM zrV8#-&5pb~Ulw+oqq_XqUN!iSe7vE{f8^s09sak;$B%SHii0+};JeN-{GmK{)Qi=G zm<6T6AS@^flr2`*@)gOgg?nc>xN3`{{{b*X*tc{w}+L*u_QVfw@&R z3t%)y6x>0Nv!l^KXP`BFU4aekD>Pi!;#1xt_TfT*hog?g9rEU?5EC__%Kb0~_J{PX8 zE>)T0I;X0#wyL6ZPN1g3#8RU!)%L-f8ki>83 zj#*S$rkg}b&Z=TWzX=Zkh*YWjrJN^pj*8B$%`ROQT(P3Grl6*@7GkJVV&(@bE-t5% ziYgXW!nb0-Gg9pGs;aIGR?mf1E(wrnVG5;+%bcQWO89(N@`42punm8KtTHlJ;YI8{#E8#scxLDh2n=VTL+@7t?@rvs7y&4dY@6qz+O86{UfmROHZWK}9L@ z{F9^e=HwSu(~4eHm z>RPTqEG#FTT1inb^=*565sSsj7oAsCRFYS|tcEKOl=?N@2IiLO_3<~_LlMN!&ee&RkDtBlgoV z^39a1zd26P-%M*d%zWE^femGLk@zpcNZKrZb-0y4FNUc}4acy+)cKcki2pi_M`QpfRX$lAEPCLe`0^%0hIjx93$!7jS+tjW28*aVZ{9vjJT&l6rqn8q07Ja zmwdvXN!NSA-@i6r|F>d4vGASA!HI>x{%_^*U!Tqin}9t_pRfsd|MhwMH>B{tyh#+~ znDv({Dn<_=`)vOY;s5zN-?{T7^`|?nJ2~j=@e9X)?HxMAMNB9cz4rCjyz27Tu6S)q z58sT(FC2Qa^%JGexYmS3RaWPm2w#5t-buC%vurrih8Z@TX2WzFrrFSI!&Do(ZFsbg zq4Rq-Y_;JVHauj*7j3xThR@ir#fH0W*lfecY`D#a57=<44Y%0vHXGh(!v-5V@vpJJ z12(L%VWAC|*wAmo3>&7~@N^q`ZRob)(O6UNzD)S82s(Gz_LdD>ZFtCr`)$}_!)6<9 zwc%zPZnEJj8y4EIz=jz%Ot)d04ZSu@wPCUi-8NJ67^?HGPnht$A)*?=`K|O{LVnuoY>z2TssI^0Ps5CKFk~7 z&j6E9R9ctjQiFiYFk8mDR0%L`2)ujz2%N`-=uO}Sz@=>5mx2pCG*YPtzy-dIkvNr? z^BzpW7?<(_zrZX6SED%3!bn;HVC-n(#NG|e!PJqi==^LH96vV#Cyp_AI&kh-(!#$V z*ou*~1b%OvDeq<=dcbs8fp=rX&lX_9cw?UkoMq!J!23@{R~d0W0PMtkB>6c_snalu z{G1LfJ{=x`&;*z;k>Y_T0#C&hh#%nBXaq~ZmjZWUq%6CE?_wkm9|6xzM=lThEZ{dW zLgzKWUt`42R^Z4plzNPp8@<4DFcNWNV zux2J@!A}4;->+am1XP&M*H9i5q}Ku zo3qhD1il7%6GrmC3HTbDjxy{;R_WCo@+mlQyB`@O@W+4y&nHgsrNA{92`lh+8yEOC zM)IaEpqerJ@t+R#V-A5A058J40bU3!!nA^y0H^06j|-jwtipT*UJZ=TC;!x4B9Lo1 zDj+X#0x!l$9+m+AhLL*z2v`SmOz0`F`cmq0Jn;ZeTS`9#KOOiOW+Ax1GcKp!flmVt zDB_F}96fnzCPw0~SfPi2)u3u>axM>fUYuQ9|L?9lY#vkz?5=hp9-90<9=Ys#%~1v4wH@lX5c3np~L6E zd#*6}y}-;0+8cfXz#n2H4=uoPRkSzoG~ksO$$tQNH%9zy0bT<$@m}yXz)vwP;GYAp zt2KBXFg9RtH*gb1>Pz6+LFyO(Gl36cWc=I)jJe7#FR%mSK9xAd?rPc!xWKqorXIb( zKC7uC?A^dTjFeH}6cji}|C$C|^G(WvAAvu_NdLMW*ol#{h`iJYjFiy}T#MO^|E<7d zn62PyEn4NTC7csuorkQM#|U%Z2AS?*lz+pd6%J23o!p~L)!x2w=fd_2H-x7ghel;ddJ2E zKJZK9U*J2xGGnR0`|mYl<^#ZA{Tf=4*1f>ZzcF))z(W|RFM-LwHMqcCm{$B3Y^7Y7 z_rPxf&fEt7cmiz(*l#=I2zWAZHb&~S8u&a$^0{B|M`<(o*$?dVn2FyDy!CNTeX-vR z{1Zm{y9J#5gu%0b7N!nA0`J=a9~}Gv;Q2eD8+ab@SGy=L_`Sf>c2j=vEMQI>x7rku!F9D8!#o%ec zGK}~an0d&w!A)nZ<0X~Kidx0O@_)*|RpHd&#F9hzx$e8d9Fzz$z2zzv)s?#tM zR_^J@y`#@*O9JJdkKh93uFO`(B7t%bM(hRdwsE-&Blk_jUZC775&r^*es1gqiVVK^ z5h(W^1Q#fG8w3|9_YedZ_%j=qy9jcRK4*h{2a#nJvb@yloP3GDZuz`pea_8lj%S3(5)7nyGI3GBTmuut#BUii0J*caT% z*bRKgB%m^W!5Bk+obSTB7)#w<-|pWs#!(55d-VgjkL&tQeT{D_*>P`v7yrcVe5d`D zZ_4C+Z{picB|G1@{f%)UBKlQ|tu!Zy>C;)ENDh=1$bl<({0^?&aZvoWy-?Z3XpT~Y4% zQzWHv`uUXU#qQq%Sl)JCPbqLOA$(jM+Gk2*{R0JYaRumKU+ebc;>P1X>ZGy#Qaoou z9bKRBOyjTMx)l8vysfX%3EMAZ|2kbk|M+o{0^o<%;^K&3X~9p0xVp>=8vog)&m1T{ zaG7oJ`nLy0M4&?Hc(jk}8av*-tL5?o1t1}g{Bb{)JF7k!fKRz zX#bU^?E)MX^mWPm1*^U72XtLN2i&(IJ){KSx9j=^2R_LD>w%Keg7jUy27lz&A^9bx z`Z4Q+zh{@1h<>d3&nC_|9<#pw?S*5G$GUxu8yjbP^PFjyzEq`NyV6cnOAktiJL;0F z;jh$T;WpbXxV+MIx*X3=kNlAY^>2cW-m#@nGiIpFNkPi?SfJWCv%8uzI$X^k7pk6{ z5Tcf)1gq_{x~bgs2(@(9NVRowl6re#KXovBobuf%>i#{V+Py6*Xs@VF`$hHmK-7r$ zMTH*4w%c)0g9=5ZA`dw!YWO#zMx78f@>@}}X3bJhKmD}I$jDGHyzqirvSf)`zI?e_ zwQ7}m>7|$S_~zy1sm+@=Yg@Ks#}0Mm%{(>xdr_N0|2152C*O@=GljXV0Eh7mLoRuYM9$TwJWKT)CoUg>1dWAM4C$ ztO+1A?u)RGkO$#`vezkwoXVXl5Su^4WssUC$!f7=sLiro9hF1Io~pY5?;VZ#KMB73 zBCI>}aP9{1ql@7SNImro;Fkk_9pHBX{xINAxxlvod~h`U#U%KNi{KyT!7l{-o?@jA z0sa`^zX1GKfIkcPBEVmEf%k8L`7Ok;hrzXU-U6(3u>LB36H0ivo|0qjlzcu&$*E)| z=Q5NOuUB&UP#OOIcLClT@NMC<^aOkq;D-Y~9`MuZDS4)yk`;rLyqc_JcLv&AujKTh ztMHiDqN@Y`R>0Q+d~LwP{uIL*63d-RdbU$CVvv%@l9jxWp=8T?B}Wfkg;#a({*(qd zlhg!0lONQ!vnqh(7vmkzQtu(`y(K9b^rVvHXXHQ+Y_ekb7H0X+K5_zdu;0bg7Oe?Q(1(hn`fqlKr?!b@mjFIxB#Efm)i^+P*R z7YB*DoGj`}hNz#`i~8k|l)>Kv_|||A0{jDj9|icyfS(8WCG|wDX(wvaAW?ggMHOU- z`fRA#rZrkDl|MY2+fCwh6MErvEI)L&6|5SaXycT3J!@32@MMc zJTYr?zn@=ECyuNV85L<#?|VEOSlgfiTWIFp#L^T%H|Gdg3`M_&O`J zumV0Pgbjp7TJNb}zoFx~#<7{V1xQAewQs%quKM-+1?mR;G?h*89QcP3J|q&)@2Y=q zKPPVeTM-4oTZ2NP21G`NM_L=Pfrg$98vNz<+i!2&pE&Y4U;ZD3UaXDERj`r`d>$Ge z6%iR36&~ePt^%I>w9@VOiVBMij|z+GeP5%yon4>@YfInO{Xsw557k{5u339{0tH@y zf4cp4-J`(bsPM=rO@zkL@E`bF!`cNCg~+HVYop%1>({RjBFdgyJKt&z_76uF1MvL5 z-n})Ijmw^g)~!)DpibNH$gn7Ixwn_5^4{J~@d)Y`64Jg}-5PC!tWnmei0~)}mM|fX z6cO67SEzq=x7q`o56G*CFqkXnb8Ahq8;o!WM&Rn7g* z2s{k!1zGOcF*Nk*bE~yi$iVJ(YS!qC9zv~bJtFLC|JG2--N5d5+)^``&qISCu8{^D z{3CxLV8OT5t259V8Wq$XvR3vO&rRy2M`@|gS&(=~9vONY?zP!-q5x_yjq zWEcc7BD_<#3Xfgd$3RDfbSn=H{V1QJ$~6xAD!bB3>ZS*sfOD}6Io*-}j6au#HY#SR z%$G}7K^6SD>-#CjpL^he2edyjGqz8e@A2}~o@!ovxLTYNsy59IS9wcksxJHBQ^3yk z{aDmc_zv_LrlNfQ`RCQLWy{ox6)RL`W~N%bdbRcyHg4Rg{lV8?e_hd6_;AW~SKog7t@`2nBJCSox^zkX`s=SMwj-;|9YrU=Z-t>Yuu!{um5eeeeZMLuvmOs`MbN{ z?hBZfch}3y4Z`aiHh)*b#_BpS>keF2p)o^7HfMn{U1m%%_5V7j95VVPTkncrqfW3+iB_$<@wqRLQ zb^IHG-v!XYj%=e#mo6=cAMn!n@87>)utzGuPquB_rt!uel6?L3*K+XSLBXDau16U7 z2)us^Fe}%uUq55()~z$(_Jz-xGiP8@Qc~E01q-6#R};6E$bJnPH0Xf6jfdK|Z%^KN zhJ}UsvR!=sL-_yrDsAa}o@%`-p${ImSh3M-i!hp_y zLEkz7hXsWFqxi$067*G;iNDF@tH~S_lZiih#nOD{HM60ECGjyCIE%>`b1~W6Gv&?T z|K^)-&c`@4+scoK{;mT7+~K_ zwr}4q7;}NotaX@Uz%jwTn$E<1-@bi9T{(8_nEp%}Xagv3)Dw;oaoh5pNbGTupbtbk zzANJYmWbbOkv6+T9@sCEb6Vum<;zE)E7bq0B#r;hojWs{HEY%hKKugMOTl<(8fbGk z2IMR0;aCuNe&+ap@x>Q9^D}u)eiL8H0%;-Msyg9{Dye&VUh0Gg71QuL5F>y zVXsIl(9q%y5%1SU7JP=-KxygnsvwU#8h_Y&F`4+AY{tTrH=`%i1Io+az7Xki4BrX) z5d0?%7=zC5iL?g|i60~0QHuTULn3W=YO%u3VwF-u?2}TK=XdDP!5gwLmvmqpG(Cn6 zmgFVni2SdN4)UEm=NM6LDF3v(ShHz_1_J+npE_vhh3{eZ1g_mc1NM_833L(v_#-0C zb~x0cO4x({m@~xKf671RBVjh%dcidKOOXMf zArkW68~i2>fd@spzVD!+Ep!3<vJtJ98FC29O&i!-pt-wETefObJT=X1^rgr%KvO+!yXM@hryA`ze=95m!zaIJC8&)?(8(rXaY@TZ@C63jE@GHEc` z&{5f#7+PHE_~n;hN8}fhtX%+ zB|Vi8}oo;%t@Bpz+6e&&S?{H|+Xc(n5R4($K(?a!`8p`yUG&uFS4Q&!^YIE46CZNG< zo5QxEnOPNR(D-|MdzaaN%<-J(e>Wb~U(N?+Jg5)6HhMz*VfSR$3y+FzS`S$>B~Y?J z!wS&A6a)J?0yGSRjsNRO5z=7vnKT%ErcG-14*342NK4WH{##xX83;Rt^g(6#!`^H8 zhpsK4KSZ4~bQoGV2AmIE$HdUWlK9h3Zk`n)>mKheIiTSs(2zONfq!a|$Rp=L!x@pk zfd=X`ZBis`lF?_FGu1JT`6<0d=nKUqM zP3tNfrgxKdk9C()j&;{D00N5nX&&DSC znxuk=3ktJn@bkOHvNm_W1bFJ~q_>A){eFmo2)4R%+ znO$W)XvhT(YeB<~B@^Ug5rn4-=`83>z?cMZeg+N3$MD(d04~RU*nip!BmdpHb!)+~ zFq!&FyonoeH?+|9)82DkL%YejigO#&&e;L-8fe%&vzz2i?=E)GP*I=%4V#pa5F+!( z^^$q^ppXVvA4BUiY!Xvt_`}|7`3F7=h&%CONt}o`^?`gg zV?rD6>L1e|B8`;)H|O<~H$cNS(6DI+Xn-zIpGgDtnKo$&>?&zkL>k8SlBdRihPW`9 z`DnPNfq2r#;QVZSj82%}kbWosv>BX(=|?cHUAtCnHk;5dHQ9^@%j@Y0_GRVZi!ri$ zP8ZoR3p79%HiCv%o%&3hlsT!VtVro8i<5%nxx`>uI6g$41r1MvhS{KD254Za=wtjH zx`FgN`$PO83tIjm*KSJZO$u@GF*ZW)k$z|YiNBHm?%lh$ zAP&S6r$WkT;JCQbaXngo{k2rS+`UxZnjb3pa{^?$Q=e&*j6Sc1O(G4;oHYCsaLYbv=FFLz23Ps2 zNK3^r;Wcdnb>T+ot7=(ygP5Fgs4O|(fj(r3`XR0*#uyVa0d9Aq4Cn%V4C*s& z($c9>ME{2CFYNt2jZo+;$`52c1MB`yI0s{g4hx!1>weGi{QqJ|Eb+l78Sa!|UsnUAuOD4rhAw zJ_!4E>ayUBqTo!DU{6b0wrnZztu-#hgZ`3hCJiPVI#{wjX3CUlo3{1+6(eQG6Tz6D z9X6DfpZ3Bp1zNvgZL7E$~@`h+JGhXfjUBc zFk`}!GDzRV%spItbNvi?`9u4k)Gf+CWGNHp#g0->5fPW^)2HikAPuyu*jtui!-nbm z90Sr|GHEdDUal$WV^i*lCrio@X*2T0`}C>kbHkSW6MIjcan5id*AO>@Kjog8vc&yn z(nQ?2=Zv#=T7N@BLnSykSa3Q;j{~0*#?Zjh$dwrrqbJl4;%-XH5!VcqEBb*PJF~w5 z{26Y$9l0t=+fUFvA0Ys5@Nh2m`HeT;&@_-g+&6@NXc}T-Vx)in{#v#Wlh^o@*W@{A zA>Pyj+8^HM8iDddUppUqKpmh?uwB|<;Qkxhnd|B48H{ny!oJfPAkCN$<2qGI+J7)I zNdL$1mG~4E7HWJjwgTURr;4>cV7vwLre%P06#2~h%)BNIw4>xH?f-@i8)V(Ob$Skb z_0?B39QO#or!%l^4`Ys;4&3+P-cvxDagVCTZyFL``aiV)(8mS5roOQxE*y8-1<0xP zB@idkwiUXr=Qr9K$~R?>_)`z4mmCwy3CDo@S$u91KeJtq5yyk`Ip}=}c++k&PFU5X z@i%hH(p82@gUQ5=bWw(=3r{`ul)z>Q=V{kO+)O46?F?-Z6Xl0%B4*-Fx>l}S$vwtZ z_x#ho;2{Ehz)e$OQh#x5FK3=J&FZ`vlz-Flrsnc`gQ%3tEjYvRwbF+K$2I+T0L z5_wJ?g3VYAJZ=W}GW=cTpEkmEJSrO#(#1XY5hF$j&gE+PHavGNS&y9w0fO5$>h;&c~$tT(m+B(ihu46*pZrQR$mM&eY<(d38nRHWj zs5|tVcukpMdz=ekGhfCl7;cvD#GOg+Ke*0|#NTAnVDk0Ggf!tyw4SdhV}v1X#Fw&_ z58Fvv4DRqx*W9GMJFvd`SMUEozx4VS^Y>iRLjJQfbg(pZuq01uU#JVr92?%_IM8-d zPdR3^MT{jd21Q!Pcl2>HcIGO^JSXG$cRG{wM52+5Qh{;M__7h4znf!1;)CCwa^@Cwb3t zpf6y?f!DP8w6(NjSX1b@25A0I<4!uX{JY9VML9RuMsHn9$~v!EhhssRC!a|pWgT+# z8+?Q_7%R@JJY(@k<|g8IqjV=K@C?HL%gjD__JQX#{&bRbOfLCTrj)9h@>|f9DJSs# zoMK0bPx|^lS5|Yj=jJT&?HBZi^e0Qxo@w6&?{qeg>s`+B#GfhCoOp_(baR%~oMlaC zS=U*5Im;ktndU6TQM$3@IV}rvF!D{F)2a?o`nSxK=WF_k80lHa*aer%$gYXkjHp!H z4@7g7CidltwP0J!`H``)v4i06hhfh@1ozt_)91b$xlB&k_U9!clM(Cb`;jBY#=T(1 z6xt)UGXi_VAN`KhMHG*;x3% zVW^Kcu_$l&8%3iL<6xYOd!fPDzh%su@#3RDiWFd14&O&&`VRH4mF|TN&qkjmw4bz* zTrUv^W)s73`uxAauKoy{djxj#bvDeHDdUZdb1}ZcJ#of|KD;P$5VThz*6T$(jeUg} z>^%)74)mS4_T>CXyUw|Ywwk^y{S-dqXQttZRWattSQ}$JJiovg72`XM`!mMIbS>g> z--~MitU(j8UKq>ym-8Cex$KvIGXFM9}kw~Y5OR<^0w^=YM_8N_mx z2i-r{gY*%Yi32n3J2QF0`Rl^z&52M&yT zGJdY*5jZf`#uyLfkufU9IvFQ?5ITai&p9SuoX4^6l8Eo$jpf|TY;d5@L7vdJUN7Ra(i7#?qrJrW}H-ify zxUbB;z-;ViGUki#(#b67m@5vH$DtME5$E@{PVg)Z<*`DX&Wrsco)Uw7g`uu^uy4va zOD4wK7$af4ka4OlFC^VCW_a#rk(5HjJb?qx^H3)kvt=^$)32B|ZCYYlTH09ppv(pj z?wgPoOx#~*tcfuW#>yCHVtj*fGRBw~+hB~0@ulgb9Qpa#@j@K5JRQm$UyFkM?F)S|^M=27(Vr zW#doZ3~`7UeD887Z2{N&^v_8*aUl;_9?p)}aYM$d7`tW6kg?~L&Uhhpg7Fc?3eypz zGCW{st~Q#nTck4ir*7f9y@{~@W2uX@J6soVZAYHa_K+VJ&wL{L{}rv{1l*sdJTivQ zy=kKpj59IT$2eJ<69;w{UFeA8k3ip_UE!TF8{|d*k}^m=q|eWicrcS6%*2Cy;y7F{ z9oh4$j+ru6Hy1cCURojj&i=9gXPd&Fl< zjNkGcfYFJ{^E+1r$lh@{i=(7Mu9Hz@-s^QB=X%Cv7+Zp$B{=u3={D;x;=xRQ5RZyuL;N^z(ROfMism~b)4#i3^5Pm4 z{>M4S5*e4k_e_QRuf!oaIa%|a_JH#s+cq-5zGxSWu40}jMOKh8&ZM}oEuJgZ9DDRUez@|twhCS&hq%^&Pr_s@P{Yqb5Z3=iW2 z<2wg}?>p+fV)}*LbD}){iN1CJq}R;9lqJ&3HkoPjsB_e9(n%TP`5m6U!1n^QeYi=w z**B9H>95FlSN?Mhm}z@y`#8>cCj{m10`|k6MjPBex!J_;nt0q~rheVXzFiZqQZIaG z*RAaPx?btv1+p8mszPQx1LFk{<{;cNISrqgCB2e&u%!R)d%G5Ot%S2$Y`f9~c??~- za^)t(XfDG>eTQ=)|6H?XO*y-R7(fx)n2?i`qwk|m_3Z5I2<&I?%+1Z!<7wtFjx%if zN3NYQo`&7A4kL%6=tUI|!O`nQ*({3?w4Z}6m#(yUZ+i*?iVPd(b!+iv< z*~mYR6XziMK}_494A=e^*B@MaaP321m+KAt@~4Gua2?(kcyRpi?in5DrVS$>PVCK; zE$M-JJxSl4emmC@>soxzThh|f^cfMx)i{=v7sG#D8GjD$&eMMX z46J>eiNtOu|1d9TyTzCs&kqpR$lUswJ>}eqBbuLFLp>3%`@d-9hq6aoPrJjh#CO*< zPid<;mS612k`1%_==0nwruLKlufNRhHye0-cSZYZv|p4P+HLw=91q%4S6uj+bGd8X&JC;f}beP}E7l+g)N%e;Tlf!Bwp8V=!9c6Sii-`)gv< zB-9y&cgMw|H;WpgQuQZR{yVQ>fw81AQ{CUHsvZt>_Nu}W=*s$Lc=uUToDA z_50&`w600cB!MTSVl=3ph&F$J&jM#U6kn{gU=*s(uKlbOXKHwQ1|!^N!jUOOJ^ulT!6>?pCq24h}d#rpAt% zgrBpWrrWU~^+<_Lo`havAB|3lpNwBi9UYrm_R#fl_*8)M_lf(*PL3UK8PC6g-Z7~W ziIXRci%s#iOo|T~H3~nY8|WPuGd?xeyJrvovbM_um$mOw<9EIH@GpmJ5C1Zv0p7#k z@Uv%hNOVY8Sj2!n!-nAlM~Yv{K9+R?zwcC><(}=49i2TaTY2Ce)40EH)v;A)R+X%B z&-Bdn%?!xwn>j3VOy<5@CqHV)$kJ!f8 zl5A6L>9%>cMYhGZRkpRZJli(gF55oaLEACg30sLx+1>3Pc2B#-?rU#r53mQ@``V-J z!|adP$JmqXQ|;;YdGvpXJEz#6+yy_%tYF2vIysSl8 zi?dc`t=I*7zCjQDa(9oG@Yhh{>^ulSd35l@gycF?B@J zw25OTB({m28e990+R^>0RliG9l9N8`!4CC${q`ZQn7Iuk zDk#k~{i~yk?|JX1Bd28lkG=4tDesa#KJ3?1I@I&=Dc@7ibyGgz`N6)QPkD>ydq35t zw5a^YGUb1mdHz5>zj9mcQfc#FjbLurNVL)nYxs88p%GSZYD=wU2mVCNzLw{@99Q)S$;kf8bu9yca(9kvVm9ml^vrR!I-q`G>GNZ^tcvmFj1Tw`fDZD% z5W|pvewS(+{hSy`MGklppb3cC_!< z@h|$MW%{fb(kD6pOP~L^oj#w3zJ~Vs2kG-#R!FALiJ3n2#KKaqo`{tee@!>``%TYZ zAvWDSs+)%@UX7YtqsdvvwN2d-bF206snTti-qaeKWO__hZf7u%6VXC1N9?vp8HGbt z$J5=q87r;S&34^f$e4|1{5Q7m80e=&PpmHW&kxQE&JTVy_%+?!PrubsGZjsG&H_mA zQ+};HYAVAOZ$}fiR9ee5mn&%QXlmtKAw{$wwpraLZCf`f17340_E;ehEotl68O}?z z_Fyo%={Uuj?4YI}4_CCBFIkf)7FE?&m*#BB1OGwurHJ`#$n3Cu6PQBtS>5cm-c_yd zm7$&vBt6p082K;-_NUj{k+KuI`&jBbOy5(mhdgt;_4`wte(4luajXgG4i5JF>$9DH zLuPx#d`UNVTE7`D<#$S>tLTmKF}kZpFmlFe?$sV{v-Y20jP$OX&jnkAUs(V7XVtyb zD?14U)*?`&hGB*eDs)t|y2JbRvVO)oJ=15@?4VCZW>wIq(@~Mrk@WIydI@Ul!>+o3 z=M=Kzo*MI=be*)8{ISB{9>(!J__N-a=8R&n#W%-gTYRcuDCpB^^s3~-GP@@5&-(G& zdQS_V>w;D8SV2wM8)U9HoOaik`_z>Ep^Rpe3rnjb<}(rV`tpdmg4g@>h`BF#WAKLH zqTs?sEDwi<=6_WPwY&oS9!h@ge4(br)-Q{|OY*#YAspuHyx;~|kASS3FIH@oGSl?L zvQoe8yKukD)zqprHiFKlW%;G=hwx4l;FI%8m&(#zU|j&_bW@ThNpr9D0V}xa)%aIb zI$i2CA2mPU{0nJmK0dxe)dY-`z>ln($ z;r!UXuLDDi42|Zd3Erx&m8GqlFWbIX0V<*Gn6lVNq%gD>gw}da}r}ZQB~ns?p8uy4i0%1Ti$Vt|~OUth4=+yEmPu8{3(w zUDkd@?w?`_J9HBkx&ZF8v{+9phcT@3J8VI~wN7Ez)oJS6^dhb2N;;{RTXB`K*E$64 z3rDqRtY&&*}9yq2oUcvD7K)=@bWqC1X%l0jk)W<5-WBYC(#rn4H5)gp#eHMmwlLJq=^%|*gMQ*pq4VV(QhHA4CGj<;!d8i*#Z8CaN#*>VcCnj~;kkeUa{LUoKxFCaoQ) z(Lz++&x3Lwz;=6UnhwM!MvN17>{Qmb?dwgsTmzkLB~jD#wiGz73hc0bFE|C9KA#|= zH}%FQ>c&Y5z*TJD-<$$Y*WZx>5NNe-E-TfAt1!)%Wc@I;ZuNwxDGGasDIMyUNiVvG zq;Q70PYHcLO=Xgv2698@cJrkun-^>P2}|fMHlm7xaZmE<{&cQtb`{N9zj0bRmpW^T zzQV7oTs0ENHe&mxQ6DI7qd0SU4;3o*2qRd`X1>(=ew})X5Dx zx$lyzZM^emtdsbk^u+xwdSX$lp7h*2CkHCqDohShL)V4hM9k+UQLP(GN-H7!C8gyq zex`xuPQ(!g4}S>0r+CyH+xIAMP9Z&+?BT1!*kA<}dqRn*FwJPGe}l-sw(lGYN1b8} zWQQjQN`9tdtF?#aqMN?wu4E3)qGxzOhwr*vb;kX_%&U*-=KLr0raiGc^x8|=Wqt`N z?L0luR(~BF;DS@~yKDN7|*TJkj*-B%s1{65$`jY_(C#P&^rVi0?Ro4iaFbR)Z2NLxS0 zTL;%Kt22(A8JiL`U$i!iR&zLxx^E%H=*c-=+h@sisygu-_#m4J4LQqB?~vXvP4@yQo0-^oki(PiH+=FZl}&W)S-qI zk>W;2Zl-vl6rbe4X6feZb)l-Mv2oh^5t8q5@(Y-SPoUZ;N<5Tdl!h|=x!1}5)E;}=RcAXJ8(<$^13IV==^rU>wwq$hX3V4iuA0>h< zuxK^)myr=p7a)oeZ+g4u^9(OmpFl8J@{{UJfy=DjAf8lTTD00iSF3Kb9|GdM-PQp)0<* zZkW*V-TPpIXEKDks>&FQ?qoV&Tfa*;TJyB^yJa8xcch+*-cYj6E7HdBX!5)TIXSNM z4C2L57KVd0rioelfI{ELMrb&Y}?h%mk5iSTXrmJ zwlk6qsS{}3<}Uc!G}Wr;Tek1Tym8$SrWokvCzU(FVIAWTEa1pwE zBJ6JdS@$4RFBV*~g^Eo9MAFafx2rt|uRsR%xpNVyj8!g>2u0v=>eO zS~4nHBgR%cVxB-_OwP@%JN(CpY3qHvqsbt-TUGivY2Dr$b+=`6PJSkbWF)!Jn=iZJ zMt}mOG~-m{)L*SV+yRH!c@XR%)K^BqVRh zq&wib)2#d0V3BD*|F5o2J6$vbdJGh`O-30SrMI;e*Y&m8c0Bi^cD-$Daq1haK*i4o zS^0dLE!U;Du-W5i&*6##L30bjy7q7@lQPyCc8<%{>0)|vQlrFG_D_+v^1uh+p+bhA?!)dFEqi$(hoT?=hJt20DQXmOiJ``9LY)@=HE zO1esvSjV70vmITir9t{Om5D&<%?UTa#`5Sp-x@^?6JCK@(Y_-+ye_agHcB_zSUEYe zay}#@o~N5_?G>%q2t<~g3s!Y+G*Mj=P3Zn>mA2=HCm`lzap|)*f|(31R{)36WvAyz zfea$wK&B|2YxO{n>twI{fk3f0YVK4T;XDy#cUe=*$V6#=30zz**pkdJOUUdHcyGKx z={=%tU83}-sM&@LFz=EaBy8m5*VS4ZYhB<>lI{BnIk4cD&H_E|%!spiL(( z$1W0V$;KX^P(?<}XYHqoplpQo7H>!m)d{bdPaLde+h7(tf+ZB(6MxWZnoX6&>|)(q z*DB~wjMmL&u~F-ZIbJ>BJ5ZM6ik)gUbdlBM`Quqove#M~lf*ebB4nBg}NN8q8e!? zVj>HOMJZ@LQzOdvHUSih8gCt%IxvyHLmO^Ea(*!Nd-Zuw>`f87{SkAwbrcIp6hiff zt7^x@FVoBVwDl9eTxT2$))(-5-O9W=qunp;*yvYT{VJ=~FI-x;pN&=5ArA%W0()Z} z=?f87g#Y@j2_ct@T|gzY^?R)mq?NdksZ}7gJW^{18>hCuy{s)%iDWGzC?-DRKLl?l zlnO5zQf3*!v6nJ;)xm`Sjm!6zf=o%-07p#e5?cL}gBtB`Nq!dTtt@<7#(o8m8xm*XOvN65AL(=C_D} zJM9UyYteSSwriu8{DkKl6tSk&09e8kMrjh@N|SS;@9l|6^W@_Q=i{`@$NUzI6|VF> zN{Rev95oVSa&%)ew#+uKZf{3cFg?f64ASokLt$^COgO2#BW71L>H7~o2Zg;=Z|nCM zZ=N18^ET^uY+VpF$K*teqc&2xaTF!LhIKrwGne_WBX+B_9vi@rt2GKHy|kQxSUJ18@{fEswY{>va~$3%JGyYfr29k%@bck16c zdf9Hh?|r@PC`@3R-j=#7868z@m3)O|u0`Iw|bd&(6~U$UMGD@Vncn>Lm}{NqU9US&{gYu`~lU+m1n zi1g$#vC1#v|9B;ObTzhRor!#90$^5b(Gy`buihHrRfjV>-l^6#?Dg3lZ}@PRD|I(> zVcp1Kiyr8xABHMWk$xp&hFzvUhIKbDi1339ve8Ac5ON73NDM}^^I8O?+8zk+GVA0S zG|7G=o9JQQO;-x!z=zz5c@^<{-AWi)tG`b65v40t#CwnzKA}>?+z|q4`eNlNfRXZK%L4$WHQ)8Sgo0 zwE~@9)+4fUIf8fW?9TihJ6Hgttrta)MqB{FTBqxu|CDLzEKWn{Cn*>&wx$DtvzSvC z(4Jr-g8~qe!NL-;BVhBlx}Y;!It5;VT~^q_HdZcH!a^(MA3%zpy!zmpD(NfkvF=9= z6p^lmDSFnrRVn4npverH%%I5(CT}SgTNGB)0sCY%@`7%@lG#4Gt*2;3c3;0E8(QyS zoo-l-h2)DEIh-3t!@^Gefe~>Aq|Sbf{goW=Op7FDAB-5amdpAhatG_BQh1V>p|DF2 zoM~XblmiX(kl0U_veatKBQ+uz9@Z1{N|y`0j<11Sd^JtI@w2S`$mW?%;MWLc4%=HL zi!p2d7Nf9k{=Kw;xt19k$vh+UMEX9C2D?jRP0wn3ihvj zIKqjR_QyB+t|%#l=^@PkY$HlM{<4z$Jve9n{#ZUhYv#%_q#uJnen z7S7e0{d|oCJ_u>EJ_(yUqk*m3cisoGsENRi9?F=l*A~&-*(<$4vm*-sUaFT_dJdnX zrOQM7ERMPl>SbN2|4`NV9yZ$|0jqv#7_|5qM&SK>FdA$Qn}>sahte?IEg|!hNZ-Lw z+2M47yawJ6YgZhmd7`)o7cpN%77HvCf^&@h2FBhy;L2rI>K+Cp6&?pq zlFhyiSR(126>L@rL1c*79q1?uBeI5<%2ZP3K!*8bJ8n5Vkdy&9Re{a#rI- z6fv$Y@#|&(1pg>!eIKW$IeEqD_akO!YCNey`?q5Uh$a^MgG!T#n1>V}I*O@Oh-I-5 z%k{Du%Iw6?)MXzjh?<)@`1%M|Z2fN100q^u)YBKp;(8NX!a7BpNWL}bB60|{!@3IM z&!_-j!}^5^fVs3)8n2d}7M6&L95t6HGcO7O>k8tJiY2gy{mtC0V*s z;mM4hWAvYlP0?$+)i!p-gT`AH%yAiSovz=pXFBCU*-y1#y_wmwf!PgMrEDEyp_Y+h-3$ZW$Ny$8H)g+M&odOm3D+qCuDCyTVF4s8_v zmEyLRLz)cEXCoqszT`H8*!|T3k)9}efv(zxR?xmMPtJ#z>B&Eo77PE!jE`0XJbxM^ zJEbz?Lu5g--#l!-Y#gzXP3G6p>XOps?99>9SjC=T%MY0{>#J9bVPGK(CmAlr@LDVu zdtE8Cwy$lsu#8`O8L={lK%5}c`pb6GjOmh$5gX((WMNF8jU#kU?6HQLb+0+w?hE$3nE@wxIvFA6~zB7QMVyoEeHQuBH-S!>tRw89F zyIi51ALX;4mfyl>Gbw7NUa`Y^`9s-NepV{j;n;E-$Ceyj?qimR?nQpJ7Zt@YCfL5$ zX%(74|FeDDa8Ol;N-078H81eqW|LX(_9$cc`%a*!#=7{V2=)|lNG5a40)v6g4t z01XUUv68UZ2|@vkl?ceW7{YVw!nCy? z+sAnJ?mvd`Ab`J#GpRgV_N#doE}<~&Z?VHb%c3L;ua)NW2qzfhmeh>}dH zGKiE|U&0iVSyyQ$NO;+GkhAqI3{1v-UXl6k&ogShm<+H}bDWf8ZLbv`!7=F`^V*WW z%|fH`g0dA}vmj?dt{;}&QQW)P9h)H{A4EQ&PP7V>>J53l4KOcs^mIW( zWkEdG-lC&N1l;w9;87FIEh#42)wpNXA?u;BStwK2f%x9dIa=c%`6v*^^D7Rdeo3P2 zK9dB;uN>7oyTltCA%$60W`E3W-dBpg zuqcq@x{}^i&v~(2yR)n>8M=s-@@eAy%xR>v4&Y%h*z7^|kj=+ut-*SgnXpUQ2Za%i zw_32)!m77h`9S6v$7W)#c5Gu%xh%>rSYMFAD@|Kh-5MzR0ebF=8}-^F_#pg>cMe^Q z_fFTrqJD?X&Jg+pQE^7T9S;~YZ`N{LIq@lM=%?CSV`D_iRT3c{J=yaikxU5%rHT=TI9ln9_p;9*QY6sX)@dJei;QU6QC|w1dx9PPU z-k*1jcMjN$eZXl0=c@we30H5Z#G4Zf18#{O`?4|fubhbI#LpT6?u0J@S5*J&gl|g| zx>4w6bp!F}L5Qb)5yTF=Q~b_2auNe$u2af-1--x-Y8ugJ)$~A7xqyDQUb~z9yjp?2 zS$2CCh3xpcnb+1EDhBdlycVY?TH-GQhOBi1Em;xS%mih!zz5d%5ZTK)kgI(;YVM1) z9Y?6R=*3Ee3NQqA=9m}0tBfPY>WV^F{KDkb!>u=FvBx{<@$4HF#Ty?(D_|c16@7ar z?3sMj4pkIxD3B@pYY^(UW7-_E@LkG|E4F$T>^}02mQUF3kyHzn_+N+p{xB`ffEMeA9vW5-D%{ zZltI*4Xan_uaQoJoSn85x~zjwdZGe`c|L&8DFe`!Uzz7`w0>!xulJ>+=37i-p5mR> zWl?vJ+1b|P3AuYhVyI7#LAPEYZ87i$tRpmE}@el^F1lN0erixJ1-N#3v0fp0!puf z11^VLsS9qh<=8A zl(KovC21r`^>K0LV;-uDR<&qv-K@mIx|7<^+mo|TDsK^_F=k^064`x9BFi|CeU^vI zA`v->wGlB>5s}S`2Vld*+LS4GWdW#Z9=Ld+EhF-ng5iU)X7A68`i# zO|AEyO~DJK*d*(2vK_TGJ;J(KCFF$1nt-h(v%kz8V%#2jMxD`gWt|!-@k5${77Q@!{4z;ze=7&BScC z{l96Ke7GeU{#P5P(1-)>pb!x>_limI(??L33;=E&UU`S^Xg(o6V~Xzp2+b869oyFB~+oK91m(zDG}-Ce|yro;clXhx0fm zqA!a1;w8|CgOIS{tHtHPM)Qnv&@IQrVjZ>Cz6}8;hEX6s#`+#jXAT>_&8rE)U3h@u(3Rj2wHPF8HLr_+u|u2h!@v|soMqnSEk8Zd`9UErc zRN_h>v@U-yBXM8Ej^Rk$+sR6^P!=M|4(TT&#@8NU-8`?Hjo1~wjxi#DFXslCbHj#H zR5!NB>1Vtka3nsdw|a3-Y^?Qbif>?ajCQZ}h|~?V$4;Z2hvePt!VjWV5kP_Mdzd#2 z(Ya9OE~}OG95vq%MZN6^iVy-|(zl&p4c#oK!g~#g9ul0wCtz5||XBmlcb|@y+~5^oMA2 z%2&t|Z30b#v!su;P0>oP@n%l!68gTFk*t&4-cTiC(g?CTh0XM*M_NA`XrI~P!(S-N zL`<-L&IbV?K2X3qpYwnLW)JqoQsvmwRaiiIOAWlUuFCW7CR}XuDqc-j>a`x<)1Wa~ zw1+(1-L|GuLWkn}HjH3W>Zkjq4e-!WA;hn0iSIXW`S*t~{JgUpYShtg%LoE=slzv~<=K*WA*ElMAxu<+e5ER>PXppG$|uZeA(Temu%&q(p;3AFN2!kq zm=?vfxfpqDEN!LF)Xm0H1wg{HMEXo-l13}ryyuWqH$7J>Xgp69ORBMSo%EOR{GE@T zp6`=69Ftb3=ONylwdwgfFVgK&D$mcnFSmVb{~?FB$0_H`z~O7eOlSLUCm#&_o;kIB z^GO&pU!)Lg-zm3^a<;FL4;!T`wb1X9I%}R0*ioufT+j91NaBu?NMeOwVtj_4-Bj0@ z_j+s0>1Gh!;oi!cvc4Mg&8Yc4=Cmj3w59_z5~=-$9!bpUA~dL*qwByWnz05DbT{~4 z*jZ@K?vDlzYTtT-qUP-5@^1W$cjLZ1m)7`wc?;yk#>sw)Ni$-;5OH_f-AMb*3BElL zTXVmwcEz1Nab&8Q-#V9uW2Z6VdwH||2KhpVBR4w8!{_^EvduYpj=@m1wadC|nCyj2 zt$A%;w3fp&nPJJ87ID86l?_lyq<-5M`#ZFGH^n*bFxrb{B4*!>glHD=IX zaR4E?rmXV`e=Jb3r)umy9O_=}HG_<;wLag>;c-u)&Cx(xabWC&VP!^jmFM&Ib z$EM)|j1Ueju0pu}b54-q=pis$~y&T*+xHtN5ij^Dv z^%7mNlKsbrMJuxz??mDQn__!^I>*gYDhiq>gCh>6y-yP!!np!os_nT!v)geY)f(H$ zMdxVz82saUVjQ{l!Fyx32g`P8jl0P*QX^tlU_Sb?kt&IuWuyvXIfW6 zvj(<2h5p+D2H`EwSwH=TECv*ISR}=U4K0jI?@X;}rSnDnja37_hg1U|)xdV^hSx;N zR_l)tW>JcPb8F@5C~uO{c@SQX_Wc-vx12+X_zdyQjX9DVg;djzhq7W0o z))<;YTY1Kqwi$lJ9G%8d#&=Y2g-5J9EDiLvQu;DVkGayNG;o{qwO{JmzR6Uh$UG@x zPCO=Jtf)bg*6_lp#3+w^Tg=a7c|p*fGtm(jE${gPmO7HD77SR?ytQ3_Bxr`(@-qAT zWfSOxaSdnVed(w}=&i-FC`!Pi=?<=yrTgx#ws#DU@R`1IyXR+k0R7~IY6mXQnIYJ=|Dqf4+{O?83Q*D35 zm~q?{FH`;v)-R{BFDCMi3*t-k>{7fQ)8nw?9TyWqG3`Ursw{KR7s%pMMe3iM)dT*M`1?|}%AZgc@ zX30+IPfbP!7X!AEjBUyvWF0|-nESBQh0Mtj(=rdU9mNVG#;RgmWP&-P(zBuAracc- zp+(j}^q7=iuyEi?+-C&NiI3TU^)U0@n#|Xx-UoNc*6NmU3HqR;Wl%dL zkIaY`kZ}eU*h+@_w{SA-$LNPRs?I`9&yRXRk~$gghBqUHqL4xmtMtVD2F!n`DBU&Y zA@L!Y3w6XoW)F{rN=O!R5%FX>|1Ypcy+BCeYqX6PttY}QV(d8A+D=AhCvAj2I9Ci+ zE_xz1LN~*Y8IN@_s1s-}DbcJjI5vpO#CDDjrv=T!AxN@1Y#t5bfti^9CyoyfXpL_T z2V8Sei{e7KzA*ct9Fu(Nld9;CL z?d=gOO0=h4Y+4Jb!Gh3(cScOi?2L8L!@ zXRz-XiI$JM!z1>gk%aITI}Ha2`#~+lD$VpAZrrCeDp|VeRi;hXLX+MU&wulyCi{V@ zp~_QZXJ}92zB_-Nbp#$k+W_m_M`OPZC+5?&W-o>zKXw6;Mw zPZVMo6>O;(y{(rJ))j>Jj--v{g0^&C9d>R#xu`p+I!;{+20Fvd@~tlHPH#Z}#D#80 zwJKsBYO=M&SD3rt(@+KWTkw{8Sk2`v+CyWht11NA9@xI&HVQx{ji8>XzDsLtBV)te zncQFSH2RmvZZP^+XpO58RW`&kpI(%5tDHnrJ71E)Kc>S>es<7(F(N@%94gfc zt}u%Qr8lQ*gBzd@RpP2l;SukoBN6k<1H@t7b$bS(TH|}1=7p2j`DH3Rgr=l(6PIL> zoLb8o5hMoHL6p-P+JoNWY5<8%Jy_)&dQZbMH@;n1k5gZVSDG59CRwN@mS3YieR+R+ zBAkSWPvs4(spUN{Y+l|!Sg;6&bFUYtQyI6H=HmrUtM0Jb+GO9GuVy+uB51tb7Yv*T zYFD3tL}TJ3oc#GNW=rR=aO>o4-~yYIy{l>KgSZEC^?)4Dv_{}AeTN7(PtHQSsCppR z-O&ueZ%;ojbgn0xqy?c1=D}`fMTVQ+(Hf7#GMidk%E4&NTj|ys)55Ur?JSdKcj|Q# z@lkkIq~gI09sUQhXE1Oi`1G%+0*FVX$zZ^K;H)*Biv-5nT~_VsJQLwR!63B8U?hW)?=-Hdlqq`a)%WG*cKqMfqu&U6`6B@bTa*hHb`MGTvKIJRjs3NL+*6oUu`f zPz-+a;yzVqgUnl|_Ft%7(MqVuf;hXE{lHCF2ZJV3dw8A0ZK9=1GTeu=CHDQBU?IYD zYb`v2rzovi+{2bQ@h4?87jd5uw$%IJMg@8LZ1vzM6o{&c7{V%n5d_#@0$C223kja0 zjv%e6ch#8!Yiyzet6(Ps>o6M6;8nan=LVmWkAUisOgL8(UDj`QAml+b0wtTWQz})) zSJ`rn{zz=D(Z4h{djmEwSX!(^ZPaMhTGKdHXyg77DUCNG*u3gne57pNGR1|dUZ|DD zUz|F?3wuqfM>2#Z)dh{pi{q#ASe1LBs*PR_05B!hk@A>Ki}d9}v5yvdfiOihrQ8wUSumgQPT z^#CeUufkXX@5DLrvx5#hRD)I=NS3K=5*W_V>qWl{rNnBGEPPs!nOv=RtGrjq3z|oz z%TQ`338%qxgAOAc(jbx<>pSsBsbK8L>)Xq6SeSZ@BwFdhWMPA9H$=OVZ%8pZ3SwOU zve7>|_N5K7hM2X<8_siH#wcItPcL%K1u0ta&UGs3R;U zDFUi^?@j0u_Vu&Ua)bjE8WCg%lxXp`R{m?P8%2g!!Sm&i8ysliZz-Pe)W~iKi$2@- z%_3*UuodHBQkRe`Gg%(oKyxZiY$9Kkf}%9HjO|Gs??vP=@Th3JlaO^YUi*R06`J)L zM<&jp6-PabbnTBvoEC@yMN~q%Hte32CG^+Hq!Y-3#Bck`o&Ye^n)8gAcjrS3G3;f# ztlv78_U$6c{iV}g2vq6cNn)6j5UD?NVll)n<{W@3DD~vmQD0afGzl}{o*aCRADki_ z=2bm;e{nE5XBgAp9!e}Kj3yT4)qV7PJvnnErUkw1#M->mWvgOe+8O_dh*2zSE)^88 zHm|BVM?!u%g)5yXB(SvQ%{h1(*lmIK`cKw|O268HNamNIhp(p3)}H)Y zPDp#QH5Ayq^3-4%J5cMD$!OkkaoPKe-}-JTT@VzuHovho{+xMvA)b$wYN|zTDK{_A z!=;ipwz8(>5Q?(SiryT8!!Lqar~p8UnO`j=uM&6I*a>7SB%*^ANS&jk`adDWz7Sx2zfof8}0FuZtes9;}u zB+1-Zal>$baBaxDuX&9iE1ln=o-T=^!RCgr5bsJ~CbW6gB=GQPFj?(4`p2#G(oAxe zKV8Tn{kWAQX$9i_OdFVjLG*L=sG>-tI9wRH1Q$&*H~5=?sf z00n0WnNK)qk3fD%dRC{TQE?y+baCD^r9)P~=SLLO6W>vFO;58*F`ox*%F>k6!x3eP zc{T1$&hc9d;0GDo(7-vRvd2`T@-mUcE?7|-H>ONK0Yq}-H>J~aChwpa{&C^2T`ni| zz*%QM45LVV0&)-tQ>Q{NTp92^7BAbrnT{X= z{9VAVs&sD53A%Sg-2258V;u3+r`FgO<8l;^HMYd#YmI#r=S~9KckScO`lDlr5YJ*H zTi?`7<`$KC)kJX=7tUgxcLwDBKwjd8!cf(cQor`?hg6AB>D0=FrBh?)RW8VhP1ByN z)SlFH0!LQ*%68G_C6fTCp&&2fem+vRBmRkKB$Xxc=k(;|r)@Y%0}Wnp#Qlu=W?q%I zCiOVHU(Drsu?a?sn+Gsw=b_S!Z^?s&q(`@$B9FqBJoJ#Xr)3nW#N~ydM4dP7PTb(t zlMfWb={ATW2Afk+3ssZm9Am&uE$q-@f_UMx1Dod;oX)$GpGoCu2*2&EynoQJ>*{3a zoZ^Vt6|5|YO|SfVPV8Lm$x+&q!JI(%%5kuSFHH)rbqC$g2l1>Ux5m8#4#{F8PY=8VI@V4ed8Ja-K;lqb{X!#!&;aj>ZKK?0ZXiqsqd&(KwQ!=z@*^8i? z#a%onx%!-sH_EUGHPGr3#5%U+M#`Q?w}Uk52@(;DP87;v74K_x_RR*0!>X&5ktlO# zmEzeP1rG74R6Zc)k)ZLcZFSRy+?rG@s)+duS#@ktn@C|03e3*a8spHy20vtI^`9bT z_u`f)O#Ei@b@NBgI_(O!s3JdE!u(*Tcut&)y=WsL6Nwiyyej-%DU2D=c!%rQ?BN9R zn<^_3*dgnGGaw`s2nTI<@3*@soU1iqFLm{L9%O65oe^%}+Em03Ncf~gPHAW7B|LXy z0XAoQ6Q0}EOJTxui@bz$6>16rPWHPuQ*dpY}NlQP&(W~Yj6k}hp_|woF2JBV+Dt3<`-hr%Ezr=pxxW7j1 zQwQya#XN8`!r~?-DhW$G7|LP$7=SE~H0T%rEt}55mQ81YbJ9bhyDkeI2OSDJDZ<&H zfCpc7z{})0@Nt=f179eoSpdWVRPk$8P4*5(N=#E;;=Ie`upgiM9uKzS z@x}&0gFt?wmMqhh0#=h0PTsd*lS2lcL+|pf>WYJ00cC2+LrF&Ku@*@=<3Z4k@6y#! z1HMbnm)Yt|r(a~xO`^ssNf!ar*|t-Y`Oe|QKy0%RQc&v8h?=9KfjzMc^aKlRn{_^f zPOx^2NbYUce~}0pm&&~$NzXK7ifEu4c5>-SK}EYd6hM6C<_M=<>z^`Oj3k*G7N#-` zxyvde%Z#-Cp}s%T3I@_;8$>*}*5a{_4bhZ5PS`}wwZ3Xg`+J=Nw~gilc5$!BBVGAY zD&t7Tcn~`6DR*<+%e&|>X3_gVDM4CAw(lkKjiS9|fHYi7ehib9a)?dYa0xv1kYhY| zK1s8QHID&!cPqsnt$usgt_PNiBC$i=EUeC-oJTG8+^^rP-j9@t9;JJwN>$ z4<-AaP5#qrU)yC(0;$ZBDYK-ka?;jB*)PXZ=Ze?K%?i!Ktb-ew40db_8Q7VV*EtTO zdUh6LWukK?5E%5p%-dPvF~TA|IkI*G{jrh8Wn3>JB}N<@nAM*td3w9`L)w-lniZ-u zc$M{GEz?Alj4g%}{#i}WSxk1qGl~wxM_gCa>p1@eM+n3+@v-S<(TCEr%<+pqQ7xQ? zGQ;jyC|j5B74kB3+(IwtKkA%G?O`f>Qqfnj3f7$OTvI!j;|gTIK$q6|JB8Jn9_vO0 z_@W-;zA>)&S=##f=tfTy!#_^$B-!k5xF6oc-c@rjBk6M~M|wHubj3;$=AMofQ<_AOs>}JJ5>u%(%)41kNIq1IvFKc1K))za8*eVg&hY`m|wpzYQxnde<~ z0>F0FV=72u2bV~!IPY^z3hyaE&K20W0xTUoB(F?-BcLgo=QC)WAQ$vR`^$PY!pZ4@cA({mL4nip57 zdCG^p;&{{ayb!lpWN|AY_dYVga-|DRmxFPw@mJ2*&FX8R`r5DPFlu7wmpdZSrh4hXG*R{@B@?OJgoIBda|NU)=bHI zoUCH*`Sx;vs` zPpS@9wL>DBnYNtN0#XtqD+Z<19QA2O#!3`2H>av3C%Z1K->_Y=GO9r|_0?TF(ug(M zsfVgD>2Z;^IabF9Wh7QDV{@_5e`@_9uF=vT!SfDZzgBP77YHt~taOO48%DIb^uUh$ z`infoEYMh5Eqxxb9)of#dL0(3HGTkLB(HK?r`|5C7LpMKO)@-WK;T8j%OIznZiwbB>UnP8=V#ywX^ z#w%pd#G^D3+yFp;7Y+X%**j9Ug~Lnk%jW3BS_}vJqIQ=_yHuY?brm}Bto2{Fs__T8 z>m`%(QzwTF&)35W3APj?m@{JQo40Vp&ghxSY@oCQu1}i%Y^G~yrc>?!%GwSUbZPtE z`JSM$UpOC{HJjhnCYC-NJ=cy1Hhb%;Dq^GT&FVg(_S`i`KL)?`?}%Bdy1Myqr4=Ft z)m|;AP?7ZW#NlI?Tw^Wh|f_hvJC4dygPAxw|6lgr!oKdcOn%DRBs|th9xAZWd^SbKBpPvt@oi4p4n^m-7BH#T&!dE0YfwmPv zJvr9_xZ&mt8a@SddBG5X^FI&lR@2vs84pvpH}Kr*=JYUg(t6T3t2Vv*z-nBnO6}NE zd7O;h6zmPVa$?uX!^?4*Sy;-w*#D+hP*|`1P)`;;LRIC&r<+@dCU=5$4=m8#=W_95 z9$r6TS8#2ZQPdPShq=FYud1yz-Ugeq!-aNd#NHAyp792bt!@mP??z0FA2Vkw_-1e$ zFc%5V;5y)fhG@XskZJ;5K~{qJfOyyR?QP)%$eys(X!`_~u7!y9`0aNY8C#Pqn;O9) zHV(3XM>dH7)_*;5Za{8E&zB~v(*;JqJMNKpY=6-}Hh^_{2F%S6Fae{5=^|BJ@5~Db z;0P59g7!1|nqyvOS9?e&k39|Qw|(EGD!0KUe^x5=>4YiXF%YJxZn}qQ55!Upy%(K@ z<~L{lgng+3LFW)>Wk^rl5&0K-bTpl5L`;>+E#Q^(V$QsaqM_u^Eyz6-cq3@0gW47Q zgMs~Vq_Bar7K}V#VNjuQ?ySq&@jlx>);I}-OG)PvYaoGb&st}{GXTOlRh~YW`8{XK zCi!O&8%jRv05ItdVe*_@YgZf(29C$6{J#S6FL59%7jaI(AhDDH&{8WCD?)$#0*U1U zif=ejaG`mbg5nn$D88S>9m1==H>n7{S z-m<4;{-#Kz1XZOyO--#9yrgMw?PQ#+F}XR?6Uq7(IU_p z*UZ@^jji`;M$ZZU{z^LEm{a1HU~O|wvH0%FS+3Y}66jWgl5kevkUa$Fb1ZQfV^SBg z)~s7uhAeXr{66iM`zERZg8MVJTQ8v1(eKDRRM39wpb=*f=Yuiz3j0JdaH)}79jJ^bPd-8#dQb7oZ4CAoR2{*B&Yq;uo2y@+8FZ| z&34nQ-JV*`uQN$pq=D`8L=KVU&RjtdF$wI!^$qlh=Qw+LyDFS2pxOY(1!G1jS^{~Dde#<9}X zTh;FEOqiNIfN*GhA@?=5i`;6IJ_CnLzdCeZm;2I%{XJa@R#BtYy#(Fi08_?wT%6?G zN8}q53FEtj9)%%X@jGF|;@92I{Rlhb&r_+EN)QjC6Sr;n9EP5^1?f3rtY%N+B&s8Q?}lkqvyO=}aXDxXS++z+i%7g{o)&7W4e~2kZ8xiz11ICtT@a)-*m*yU3z*{=Nj2(#97} ziWm#jI2HEQwIMUdP)B#a3U7HsY_^}U<6QPH`N6RFKJh_Az5^He)_fo?j;zw zh@gUt2+okp1-!bth#+0e5xU$yV6&)&Ps#-YBe`H;R`bHC_W$92fq$`YA~b*Ib^&%F zE>!r`?E){8MTpQlJRni6ajSa4eYlkuxm}>fdS;i%iRaJzu` zVoHGjGV8n4Qnw3;Kxs9QN|dA@uvYS-CyNe3N`qGm&={u?;>Uo9I@p-VH65YTZICi} zv%tkpyYUL^T;4+5EO0h%kkdNyRjEnVspJk^EHGRpP8A3?|BsqLp_1yMJD&4*Matnt zEF})9GZ#)x%iJsQC@{dU(;I~T8|sCze8 zyG1AOj?}ipd5hImMY>ma&++yK-CC@WV^ufTU+RxU-Cfa&ZQMofY!^9?!vuk08i8-X z!H3;e0@8Arm(o~<@<_EKL~0Rf_nJq|Lj*lNz@F4CYw!}rE4LjkRbiCiR@v?34oJWG zQpoHQk>Cdit{Gem*+P}w0L6@Rhf`1;E(NGG$tfH&5ybcVbQndp_T|1j6XbW!L{L z5{)Z8}}E{XmeqjG2}{hcnqYd6KY8b0_hg z==3`dGPXA}I?Psdn8MBJeAdt7-HbEn^~c8I9Jv$g4tHbS&8T1>TH}X8vj{AB8kt=EsIb%i8orF&A`kcVoopxh&F_8Wyi|68R+Du~Bt( zb?es2VHdX>%N@iYi|=tk^C42IYA$M>dxn28V4+DGYHJ2m)ms_?Q`QmPV9OA-g=r$63(u%WQjm72$7 ze0Ht*G8#Mw+($ej>mYBcEOevu~(tx*WziE6D$ESpc{vf+36xm6@}2>cse zIlMZgm2b_sODzAo8N^7&sr4?a^S{NB;0ipkzgCP?*q_f)!xi4F-BV2~rw=afrTkX> zMyc>4D#&IrLlOydA|~`vLP_yH{^J=CSHj2YcmO0l7;c>Yn&|Iv?+l z>vkfjt)1;H{nm_c#XZ`_yGx4JJg6=*iBF(6Z_Ec&+{x-f=vUE9TBt1{aBB9|UhPTc zPM6TqWAG(!HF}DT*5ct;lo+>qhujjDJ^YmQ4HGKH`Pw_5EA~aH8T?~>3-sDHt~}`s z_dt|(V$s{e^~YItTQS?&iArlGFPV!AwhUv_ve~YhALlLLS&Po88ISOe#h9QEBIf@3 z0M`O@!p0Spjmg(R%Tr-_{P2I?6 zE)41(~C3dM|P)!0etmm?S)~ig9%2R3(F^1wW{Mn8njlaS1+%r9>fqN3|z(K z{=R=hJz-d{-7od_&M_O+kYKyz)!77>&jwoxgh)c=(0e0?hOV{I^5MZtIXFTc6&riw zw|NGeM`r5;xl}diekGFpYEC%0xG&TkDjyzhJP^A%TYv_tXdreCUTrna1=(!s==Nr+ z^h=ehU<3NY`Pq-uxm4;*qRzO%I!=WnRFyiHW~T*j^4D-fM1-5JtoF9gen2=YQAFTa zubuxI(M-*&d8bgITl>y8c*QKbdo?S@{T7|}%k0Xa8??rY_y{z)TH`}VQ_NRUu;I%E zVp=Kp=A}IiOUk{+BDK$8)R8}k=I+oFVM_(da~(Hk<03&1#-SPGwZ`}5{nBS*Mar2J zqflxGImm35Zg+7SuwrZ^8P1VQ5DC}WlAC^j!+_MUD8k4TNHQ`+y9F{dCsvzAGGm;e z#u(=gkngQl`$%2Y{jbGtVq8b=v+bdS(qrQr?q5(4J3Z7qIotBu@Pg*h^x^41gumG~ zLO#bm9qxj383g0>q;AW-ZYj=ae5BQ1(P~VS74Lb3SK7isHX69o(!N#5GDx#Z2Ju+! z;43#hTyUX=A2Roa%ie9ce=#0PyTPnjw;JVq8-LAScSGDubE!Wwcy+pv){LWh4~_-8 z`co)iZ`Pi4&#L^pYxy-?9`v^Mj?mr6@zd()%APv0vU4At(j zlsp@LJ8IrJH(2)iZVPwX8nZ(rQU08rcoxcEdcl^v<(t9}dPH=#eLW;#(FgD=6>zsf zIDvL^Q4b2+%x~KEl^H~G;ZtYW{dQt?xt{t@$~5iSD2p>zgd_f`|0_W*Rs?y=AVG4t z%HK8XhbGS_vo08TCdL7=8yzxNC@&@Q3Us*`VdbO{=6DE`KPprlAI|5z)PK>f(B?mR zX0er_&Akq7f^qc0Ex8%ueBeGsk|S;3$M?#c*7PF^K%kCr0}ai)_p?MAP@}7>n!lI7 zdO=|4+Av(oSqDO@Yr`)ONmgZNw0U0nrRk_paq&R?IB`{@)0Z$+dgo@@3t)h5>$|r= zTY^A(e{mIo3DVQ4>B4N@X33L)Qjh{&FV?;#!cF?jY)`@;2I#sF-*HgtpwJ<0CQ!(r zCh$qj8$mw%=D#z&$4+AIcnuGmuiL)VD#)|n6Q5xHmBSKeC$hTKE1cSu3SyTv`tOYA znQx^32l{xHPpNas#I7*jdXyA<%&Nhv(|=2ObuHwAfkV6-uFu@zi&%j9K{m?4T@p<{ zDBIin-1uqOvNv8yYZb2&czwn|v#CwMQt_(njX&otF!Qc=WpCs_0}^;IYWB$`tI_1l z6=V|_hAi+lcTDE>u^^*V8{WZjl>Hmc~ zud4Qj{MbT9;iS(A8eio8K7#Ij)>>6V0jP_R@5p5JLX8(S|R^)bin<3&Qf2Q-fdM;3B zw|UX(z7!dZ8;RvQ^HOdplAFr5@OL~{6k5CSHg&GO+N5IX1s-JNK|#jR1+l7Cqko|# z8Q)Yv(Y7l+#lF(J3MahWW>{jb_GDYyt8Ln9O~y)rxE9YF?oQ|0EL|rSp781D7ulSM zx@KVJE7fbc&mV907pvDkYj3xjm=@zQECfxjKKNb+r~yl|V>ud-TmRo;y1(qibYB=; zJ0zrgB;B%g(R2J1iRd2X*q#4;ne{PijDW7)|A%mHWz)&}hbyr!`G?YS>T@pKEgOmH z>1g3m!MSi#7aUD2{VJY&xk!ymv8psU0p0NDB{<#kSTGRF9VNAp|L0lZA7gh`7jv*A0o~-iX{SMpf8n=K!@o0r=sbuuu`oJEe|29ViRx#awqL9&lx8u_+ z@!Yj4o;zRoQGeXIi`3{}r8TwFP|I1APS3TwFd@mG$H9KYK0?Iyc76Aev>!wW0@k!E ze5MQRt`L7kCm+3^Qisd7v+L=p`)DT{)O}zesC$VM)QyI6@4~!mh@_fZ9!y?yn2`8u z(pP5#xewf19UhTJHg;kbtv{WcK^UYUo;1B%{6j;x6$VrC2PFkTPUyBduQZwo+P32P zLLY@I24c6*S5qskaR29)fq?C?PQZ4t${P}}t2&wPgk`pVIM41Y*2O-h)C~|XSs)#>ramEx4ajCWvW0r@? zme6R~dlbpWX){LLlK$+s`iXI78+uHIHOn%e%O{D`4wd??3y`I#f>bf<52 z4x;$**dbn0)ln)#D3V@-my3;s=YC4t$DD5SPBmf>P&mty~Xa~TEJa`D33TGJJrR1s&Z z_V1c?L*r~ka1bY=zdj^L{aLA>bxoYD2pEG>_M&#^BND6RcWLZwewT@v;P}e;ql%TM z9|<;8E{hkiHA=cL-3(_aPJfGEzq&>$xK{Rz1KNy>yCkG(g6kFvTN|L83hX(Ot6G8mRfCXYg@Ff(rQ~?S8!`sgy0Ie;ZjYlZJ!vmu~op0{J-bk z=b21Gu=ag_{q^(y{vEhE=ehemcR%;sa~WJG3uH(gFOV^Gq`*~lOM&Q4@c?B8DwJ03 z^E~v7o{p^5r?NCU4B22Yb6441;okU+RW3_dY|64Xj)v8u*Gzi8M>!<(SESc-@M_mV z+jm)kQTEeDaavkCyd7 zcv*PIk9h4jBY0cePdGc}9;KX&9d}2j_*L`%%+uBrKZV?~qEEJdrX%T#f3_~|^BKsH zQV}5)#C$R<7*~#pKO~Jr#z4;bWzeO`-$S@|jy#?gxeMg?IOlfW1F~Q5t1EH4zcAZ{>yl zn!Do*d3B%=tMID>F(0rYOw}909JXxPlvXx-9~{;XHOO9%?u>)z2w<-_*!s!+;Z5=V zpd@TId-oBN?HBrAjja{z@;FKM*v@W`?Tb++FFIgPyuTW3Z5a(G+DOFj2*%c!I6gm&sPu)rv`%3$%p8J;WdZ_xb#PsWZ%U97u#ii?3=^c9SA|t1)zbi1= zR^vw6lx8C(oErmNGnh9hBVC$heh%Td?&{Hy~(g(7P z8mdwFWBuQZSWDA|mt;46eN?WafeJ?JQQEO6R*2L+!KbW-h*{wX@CWN9fnspe^& zRJUt)wh5y_vN-|E*1B6{0Z`#tf0^t{v<|1qFnJhi-a&`c;TV{342w&{bAMY3u03^G z&2aV@={iOUoKQQM{YG|E)r&unHz=}gWmfIq5lvQ%P%<)Qi&VsjV%Z9_E}1aa-q{^( zyPU=vsV54_PIQc(K$q15N<-_hby=n8*ksv%(@YT z`^ywm-NQ`d>}6~PRc0SUpRayGHsLu<<+89@y+-s?!Nsf?yHxfyLf)^pU+HXY-dTN- z_MM&ZXLzQO3aXwRX;akGP)Cbpp3RC-QWb}isyJ5S70^JnZKBf%Da}qtN9cQ;J*{Gi z;B0#SJ({Zeil(Z}W1e|DJ`xyP-J7DSZkr#J9`vH9iree9rm7dTG9Z6gRh6g=)2gbn z*Z-OJ&t6a_;_QqG=n~+Ag9_ACWp9|!_VH(7Jyqx0daAxp9cCUiYN|Z*j?(-6J+xFk z{vuI0TB^$MuD3vd;ma1=P zPcKAz(&N%`TB^30#)O8d_E<9(%Ba}(?x&0d-L+LMZTr+%Mrx~CYP415X>C<`+q|?a zsZPBQ>P=gf-pssg&1R#+u+gQh3iVduUC<&p#-!bgwkkVx4539>@kFYs3cIPQdI(tp zVVCt#RaL0h(pDWilrB|O!u4I%K2ZY>OJy2u9}~`~PTr`ik{!^m@6}T`Jt=Gb!Bv-Q zbyb(>ZPj+6gPqyMB%qrnc`!<-Bmi;BZphQHfB`{vL`T=La-#J}PMN@&uEm?JwQ4$^ zB6MA~?~pnBOI29)Cj@iQdkJlEV4@AmC`Rfhv%febwtc_=!O)Q0_9qZgVRc9>aPo+j zs$NxCJ%o=Fs<8S2ju9%XHp*u?bTCS(zA2w<%I!}Xow}>Ax*VG(pV#=F&xd5%=$({_ zQj0gOGW#E+!b)=~tY&sM(5&q_hI6BBimj{O+UNp1>Z=g(^E4t|tU|{)Yw>F#jqcj3 z{B5j=S-a>hj=$|`omEkX)vNX@z1v|SC=@i>tCqCM5lnc~gH|kO(^Dtj{u%96i;2|T zevw4oK9|3)_AIHFI9M{Gy=tnXx~f75<7{}|HYGEQieza@v>`1RCd))kj4stxM}=w# zsrF&j78jg#ycVmS{w^(6i`GhKz5PU5tgP>F=3=i{&%a4(v@<*Xu3alFDHqJ@ygTo2yml~HLyoN zi`qP4NBeo%JU|@U`-m$U#u|4IzHmkPN+?rb4zm^~w@>OpvOs|-EHhf}gz zVR>kJ5Cm<`uy(rWkvHKW?JZ`&@x_imzSujX5WtEk_LEMrO~l0BmQCN{9-HT3WUA!l zn1jKO{D^#Ur>(O^;^oMCeRPs=HaFl82l+K3mKgzOurL9Q@horcg_$yhIQ#Isxp zle>zYDHmUguVSBeTdmXpNL@+6XqXZI93pA@MAEIZ{^duL_x(md=SX3igA4Y&y^N2zwh!*J33~ ziMY+t82jA)*pPFs297w$X+3=NF@XgV!EG{zp;Er7+7+1OFaAK&LS)UKe@4g=C!ye$ z!oqw>ri>52ujQgIlABaW$@`mz&yl!-4-m1|Pf3(_ApVipIPMD4;qjrpv87L$JEw*+ zS-s1~cHI}uYoxZU{f#258cG^O&aHVSMmKodVKQvjKT>+(Ge}`ibf%m`1);yqTqMj} zK4T;YveJBJqy~>T$OjYlV&yNkq?F}P3yC_Ul$<%DCWfiD#Tqg~8WFd$xb5@DuL(~1 z^#Sd1XQ4J9fyanAOAL(WDuY|}V&^7XKfI>16UEp^Sn5%7Bmo-dBqN|nn~+=h(%<|c z*SZY-AjX9HRjDz-aiJ{lEHCQC11Ymc3FtR#w1Bu-D(eRb_FI49+~XM{lkO)pkT}pC zKu_mB&?WjnQ};|G!{3cITyWwR?46IxSc$y9Tq;6>i7C$?+O%2POX#T?Gq{h~bbYgY z@!o}8@_Wzu=H=!X+@nR9SoYa6S>}a&Zdd_mALaw;%-CR3USqBsb!wk$Fd?$c(z*ZgJO4CKn1LyvCd zE9lu1~A_lJqhsi*}FsNpRhl#m^Aa2vrXxGMQ6#e}ra*+570)b|b_`z@SL`P^QwqFoi zU8V{Y$Qa=!bX~*{L2XiF&sz6NP%}i-b`23%jn;G215qjF~p89@W=ICI5n5pk)Jv7>LOEX)$ zki~kaGY5aXoV_u6L!7^Jujiqu;_{sJQm&pI2KMxTYgWVIz%X_Xzs{;V<_+}WZ{Oe@ z5=q}Z=ONMoPvq&Thar=v;g95^E|c@ay3D>o9!uNR{-L&)wV~V$;dP&xVag&`kP$ z_QWlv43cHmF747h0`quh**()6IB#a(z#Is2mgfof3VxwZC#B$#o{eO9moB^nwCT{E zfD;7SC3czy2<%-V)nU>>kWZ)6HV8X?$%RW%WATY@# zgvUbDp9A9=t(>>9Trv0TWoUb4PwYncChS);7D;;>F$&-Q##yfk4;6t?D2uLk7}N4b zlwa?i;HJY4bxxTcm#uYifH@l`u>OtoXMR|_)L+cGu^*K~wHKil|3iP~ff}ayr>t>L z;@?a;8F@{-AsdcYPbc=-)e2(G)&*^xHIl6OsPg9Q#t|Oy_Gr4SP=W3y8(H1xPrNqB z;(e%vdTC&i^)%?76gtFI%$cz)EA^y&IE=j~lWGP6iUQO92R_p)p={nyL30CEX?oJ_ zOzB6o%#2jzMbg19KmyU89ep|m9bAI3G}UXPityU#g$26XC&=a9pVo@7%13(s{2BIK zHE73y+4NSv%qT}uD;yClb`E6}I!o@z$lN8>?B#CTw*rK1npFqrU9X6ql$lUjzea|; z+=N^56~mcZc>YlA-M5e)V@kbr|-c!U+6=&ZF_U9RBW=FR=671 z9?IIVc8R}nZAVVSvjKPG+M~XQliTC68%vL7Z)9x9KV&^JR~n{g{i(3}waCT#j$rbU zJt`}XA!J6*p+Iy_{1>6;jQ$MR*s9q#W*({j_BWW z*U8zFY*btD&oOWvAo3VEJJiuWH0$slcfd`OiX`9ni2!9*J8~Hvq5MLgL2C9rP8IR? zRdQgW{23#EhRPpL{U=$$hMdff&?}x>c5?n7I)HZC&`a%coQ<_dgF19Xj+6|+v?ogovVvn4w9_vgQoKGHGtTB|qdh>e}B%|#|&{rSa#^c6@@d6V~_LoKT zJllS5)g7{4BMwU6+L`hWR;=}YX?+W;y()>)wBPQ_d@|U_SND8YdtXuU5CiJ=hZePl z60AXWgwz>+jXk8vuq~#}Tk|>bM5XB7Fy_6}V&bM*zSpSBc{hsx* z49{tR#q|rCny=yGKrob$gF=j_I<4^t>NMuGNUaXF`jEkO8R9#TPewX9fozitWN52u zTJ)mH!}7+pFIql!oDgKl^7^$eo)k>xVnz%8zndlJDxHDd#4gjc^;9d24J__AL3I{J zlZ8j5M{ienU;npYQYh!pn4Q6xgb&-J5;~~#oiz73vt*SSIF;=bU^HJ*x;tb6M)4J+ z^j0fI1xI9W$XU`pWV^g+XSbMmZs06wkCEZV^kjs+XhS|8pUV!dZEjrK;#vPwu|PtP zvNn&|L5wQP(;#Akg4PA9IrdpEOi6vWp+=C*KV6mVtN%Ras)_uKY_0zn>GhUb$C#XgCs79%uo<^bz9l^Fg+6P0 zkzCA@`~*kpv>BDG^tbF3Qb<9_rMF{F)&>~Y_F0rZu!@pzK|h&4)t8 znnHOR{%$OFt#?c}1q+_jCK|6GhUD7!xD+jvkXyW)u-rh5ZONIi+sZsuw;49LvgnF# z&B=W4y4Tv#WxlrAZu7+n*&9naF_1Ryt9$1`PHihPR$HW4OMwAJ^|yYtp<*SF4w>HypQ?1Xw6K*2b{e%eZ(gGp%9@*K#HV|)tS9v38 z6?#p5M|NCC1S!lD|lnbb=G&6jm9m2FO z|1J4Hi0IFlx*AaeiTaCu510{lIxBQ*GfpBn4s+^x>$~C)sY&~WX9J%sWt|(I z`O(AQXphbd{hr&M8Dp=T$(1-6>m=aUbS#|#9c6xGlv&-QJmbrwr)avT&b;tHG?u8DGWYjHP3}*Pi2Vsu(+#OQ@>`a~W0csd14u&hrowoz1X4+WRq3 zleJf@EnEf(wTLd-$C35yd@_^JYxa5`-qW7tFPd>+=# z$Mg-{RW#$c<&Ek7`Z(CQdZ+XX*|W}=DJ7@*i@0HSi4;;R=HpEsvsrT9vJUT;e)~OS zni0MsSORjdIUxE55;=Z8*e=0IM63T0*6Q|e>AhI}K9_$+QVFX&dLe6Bn|IQs>wJ-| zBotP(xeKGU&>Rd56gi-N*)SN!(YXULh!u=7d%Hr}#+K>PArA>v$u1f?S&g^KiAn5o zIWf7cHD^Zgpx_wUlK1gE1OcM6GfI!@3lkmoA%Z+hlDhBNvOp%jXDb@>}V@1N_D7B(R?s zdU<|rg)86f-V+^Gk0$Gi}*&?0`6a2LTD zJI}x4-DL0?;FE296!;Kh9p7*`xE-d7i_XR0WBTtG`tRrZ?`Qh&r~2yHO~#8%uPK1HsL%_q6bS${OZwaRKaA&}0M`Jw0AF+etMWz42&;qb&| zAE{LkPg^VWqTnk`!Tm>ITv2co4(6SioSWHlHIH(eLdW~Vgwkby^HIC(!a$UHo&iwp zjdsdkEMuk|bp-l3<=>SI=izl3bSfir6Fy=^e=-CRHJ*W)p`2=RM8;v@a2N}ZiNTm! zOOUeYt+begR$1P3&}{+ye^Atu?V5*E8p#(`m9y< zb;&1akruWdkk}f=%1SC5Rzx#UJ7+W8 zWRbxP9OV!KG~Exr1w7AiJJa~w%%`X*dl`4H)&cJVs0qWhQ%12|Oi_Q6urY=k4K4ZstiwB^m>oh`)LT*Z%PWU>!~~LzRg8X%B}UY>>}ZP(USyDH zc-Od#!V+6$3(r@!#>sM<8`HbAz82EZ35W)lzl$XbT;%5&$#BjO)Y0eSWpzDUBFqad zjF(lI*Wc)C%@Z{)q3n3>IWL6kA$nbW9atU>zDQyt+rGgl92wsx&LZWpw3-LE5ux&= z#>9J4v*WY;>vq)fO*UXrwuz5zS$yY(5>0w}o?U%0GXLkrCre_feC8&LU8>l5#V(C( zWr=;O*jr+6GKK;OY&*pEXz*9L>nuqD=@S8-ddZ~GB(t5$Jih$UU{h{1igCJEkiT=E zQ%Aaj{Pk^75tXDX2)meYB{>yT&{aY8ZEm5dCY&o6uAn$mK^*dgllY4DlO2ClDA7T} zQbDQIMY2>7gd1d%@gdCEKlqZa9v1iA%d6{$+4E{sKh%X(OSqa${p^USpFBG~q3=br=F%riMN739XU|CiOzBh-&#iTr zmeq48*KJ+%HR=5qBwODwNUBw45U+K)LDH;?4U%rtyF`QSssIASbYpqZGCZxPJEU1kw!v7Gs`mg2EpGj_$I;k8(hX0Yq!BS3%7<|9r)doK#c!|MV1z%!tOYl5{cL<(k@S}oH zGq`Yrtu%wX1s`s3{Qyj|!BfRP#^7GTk1i1+m?vf4Gq`@yrPbgW;^#$!%fj1gF}U1; zwH`CLJP2cLHF&k)KR5U)!EZBoo!~bbe1qV12Hzxjz~HwDUS{wz!Iv6*i{J$Y-zs>v z!M6#XVen?bPd9jr;9i687krSxHw*4I_#weRU#!dCDtL#%Ey3S0c!%JJ41QGbXABO< zR9VdimuI`J2MnGp_!fhw3Vyr6y@GEtc$(l122U4!mBBLvuP`{QSY;I&+%Nb-gBJ+y zH~134XBxav@N|Qh2|m`~)q#8tO_fHx-Y=jmH!d)QimkV-sy`(y(zG zn-3RBu`l2S!K7n1=xn}aY%;L<$k;q-j?C1ieG>kSq|d7-Cd4K!?{Yxc%Leb3$*yqKHjM77v|WJerfgMZ%CwH-dc zX;9zg>)!74EMNEOQP0&+vj|3sBTZyy@OQb7INRsE=!5?H4hn|mx~V&J*Y67KZTI+x zvEe(^xeLytta8{ek7tuS#@;XwlMS}Dio_aWRp#ELByibxJkiatelP`ak)V~`YSWy3NOkh&|yL|$KJD&j$KjJV1E{YqKx(^^OzN!8*cc6d$ zX9M8|1H0p*>bEuoQ~p zj8IY|M?0Yd@EE+I*mdC1Etv<_p2nk!T2u24n+brBN{gG97m>yHhLV=xsr?1(RnC8M z8)L?jvp8~g5`x>mbK^PlEsjIKCuxPAM@MjbY=~<}FJ->P!&PLtFIo1iPo)XvHR}9k zzU9$u$?Qg*%eF6M19?>Mfc>7?`~A`TQ2|)fU;JD|-i1}v96U+$jG8WH8hyDYSKOvcxr9gL-+`{B zrr}5Rk^b`&iM26S6l0;`t20F|H~HbfH}T?H%6-PMSUbKcFR z81cflrNl=)>t7PGG$sAaFZ9dT^pfu7Y51;mt)`S~aL}c>LozH5*XTaSUGu-5u6_8m z4>)+S*Ai)G$|~_FchR3W?#W^I<=TCTohiwVzZDWsV{9s(&}|)x^$5}rqz?!>{o^Dwa$C!grV3o9vo=$Lgp%IBNkB(u z%IP|(R#C|{QxZC>^JM|BSK;yb^eb?3@h3yG`C#LJOf0_67x5Bzm^%VUW1|%yg#(^Y z(mIJV^ZCFu-pvw$G5nm0T(4m~j>JQm?O|YN%7eBC_R#YB7=A)YBI4Yc@*~?NnQI5I znNW15z0gjY9ahiv48usxvYph53A*~8(9C(zhxUuAG_s-p91ME#!0Q$JSe%fv0pf`Iy`k-vUY&tiPqL?X zvbdHFYS-%QRTNw0a;_E}ofZE#A@+KUZ!$4dp*1|c4o(ssj&>wkjNm~aX$iNMcV14@ZI|{H zteO#9yn&@U{r+j|$KTficN6^epS51~xY&fSu_`(9-m4Oc$sEe1%lMrkgUjW+tc!5e zgK{8^X`#jX1dbAKLcU~WI1ZN@hgR(%0-TSU^Zzg(+AFW7aED6TPGE$v?$2xWANhN3 zW^=8_`jB8w;_b6g-wYRiU%+k67$s$3wB$Xs=d4%s)FPu#V6f=L>+hd{RBmFN6nK~Q zA^ONfNwq$`Yr+CA|pKr0h>E5yX|AZ((`Y_fSPl*yW&O<`6hpr$o84=fePl5_C zaAEblI|_9p=={%tjKW&}Qy)B05hJb3$n&TS>r9<>y=?g_8$~(U+kv0F5JIzmL=C|Y zZ)J4f@p-JT{x2itfeVp|Ey%yJbBS+bz>^`fePLGA;jI0~kn)bwvfi#>U*yiT&fXvT z4rhDNs-1*Z?WeU??I8oHfTyh&-;zr7G(5#-l0>GH$oZj|R=mf_>Gl0sTV>q8Vl3wn zdnv2JW@#f$u?hH`amgUb2{IfW&n>$;Q@%~zNn~pY1t+^N;^&?Q*%BichZ7V)-sAVM z`bpKsGH=pT&i!vuH0x=%)GL8)31qNbEr*FT7eaVPc5%> zpSU6JKHQejp@j%9+xp|%wukSC2Lw+t^xt&FptzLtz_Eqqf~G!ooqABDH)4e{92UxX zMrX>|0LWzQKOtB?ny+XZb^=4+M+5=f4>c;9Ej z7tu5vdBuH+=f+sr}mV#cafb!(7!3=m#mFD z_fnX*eH*epc{IzneS5Rx3ZQ|aZ|1dqqFdH!WBEMP_8uSFwjBftUrA^ogl_n>2W*^$!WUD&UoL(n6bH?yJyA+6E+Oy7Cl-d z*t+q5LmxrcebPxks(H>oiW7E!(|QSy3YqK)OrF`)cT>_IS*7|zi958qAz7j8nwEO^ z`gOEPNKGP&=L73boh(8E8x%Eb4b zzCsCqKgN_WpON=OB|MFS^ekbfl(0Vzx?I)bW1CPw`Y4B_T@^LCdx;WhZE~8UMWaMK z%03I?P-P1wuh|pXqop@jPoOUXq#rLL1;pD$P4W*WphWe+QQnqt>cn*J%P0?e1f6Rp^+8hqunvz;&Sx6HQKa3hu^Pxm{_Jlp?Umh)V2_!_b2+z(u zcHOpiR_segNsE@x6z*V}0y7Ty&>(SrGz8JD28qn_-zOuCpD~#2Ct1kRYrW2tIXVZ7^q;c=qU}w6z5VCR3nEV6wuJZbuMb_Fh^uaF_0jc?m?bbGyY)f%N3*m#X-rb81yl(n$b5OyH4h^jj z?;S>*F8#NTsyxwu`zS6w^xr;oqkHS{Nd33A(yL}}@yzu+)X;Z7uD%@>8n5(9>nI8; zWWMo*T3Et*8j8u8h>G9nHgK8^|8CpAX~WxX*gzIUq%yV^w8t3upxNUace9#R_-3US>Dy7DPR zH-)(8{clrsI!>Z{|SY-y7{zE zl2~;tT?%o}JK8P^aRFh4xZp84q4Rh&3#GaLe^7{f&ql_}6Dq_-9x>@zw!oTrkqU9s zhtdxIM+$LoB3j;6PL+6iQ;54@oX!^J)DhX;)xaF))?PH z#uF>V{p6=%Li-~X;(l_LPRdb;YgD_+(m1RU_xThA%r=hJ8gZwykYvIM#QW-x#-WCr zrP-G&$h~>GS!8~hg4|gsU@Z$w;;*A1cN5oL-cM+6tUJ4cI~AQfkN}=GnIX}UEB2_!we3-nJ4x(IQ1C9W+|zKfKvd)o z7Kn=6egaXE+eaX(9OYh;s5dHBKPasgRLU>A}1PDexrbo}5QDqzeS^fby<-qp+v|cr^tiSI#wx0<1w^RUtBPDx8gX9O_ES7s zPhJ*YIbNG>tH}N4;mG?&EYL;JRWuG~upaoiA1cE%;+@V$9agpqUSN2^Q-L6iU zbJBmXKT0Ncwkei{jHg-6x4{Sz-MCj}&dMaM+RARaakH`NZGR*eT+%3S#Qtc2eh0L$EcL`h|cCwTyo7meir45qW_ypeM~7y_JZ z!o4-OO5no44Mw7whm8*g&6N^i6-SLi^G4f7iHoo3`o5hAKhi0$yDG)Hg>ww&z#wln z-Dp=k3PBe!lIOQtcTY99OMLa;9Hcz!g{{VA#ti*NEh@III$w@_28a+m&$Pf=7e4g2 zzD+Ychgi++4r?lC-P)rnq~tnE_!fw4nd>A+^}7o%mwhrZr4v)|RLez(rprgOeS6d= zO?WMLNMwkL2;H`bZ@5+L_4@3MX8XmI5|qfxsj}$AfKM?%H|l})Yttw(<>zSf^}rqQ^MA}coYYVK(Q7>GhiUuc z${xCjvd`w&MIU}pfKRhb;XMsMXINmy2i-}^sUw=|1pn$$98FRi2rB9+R;a;6~fxl?~TJ;rMl$xRda5T${3Oy zd3HcHr@kNhl%wU)@8x_Z#hQLecs%;xTy`Fx5_w)|6e>%MdX`6KVIhaWG3nCOEP4Zc zd-0UnYP0|^pHUX&4^3ZECd?_G@4IEMKXdwgzJgU;s0@9;twqtX(*89#du}e1&FB~W zxU)H|w`<`#p%2|cPDbPn;=b1QYjjo68JYvb{1g7l*k-L~rzh%nWP=ro;f$?0Xia_J z-#8hPuJSide|3d)9@zT7Aa5Lph|XG?eXhijZ9Vz`F*e5TE`nKf_5H%GU%lG8>pso5 zueQ!u;?O`358-y-b@osD&mp!Lj`!Y@q{lS*-PTEUI?{PM<>mmKq%`PIU@{W)YAs0C z$Jc33XWO2BVmwWd&(H_br*8Cz`s7b|&mTILd*BOsAgwyT7?G^zK+Y3F`h3yTwO=aW zy#Hbv=Bh?;sNA5NJ!4v#r{NBKfF^>lzq zb$pN|ZU^7_g)Bk$*;kFFs=e0BnN0oS?Gody?T2{karT%c2aoy=41CE?U`<+E@hn+O zlbdqBhBeV6f+J~4DPrg4v@DAOSKpi)vqz59DP*iZW$o<_9b-s=3?DLb$R**>0pE6R zH?fFs=9V4@q$r^4b<9J@lzrO!?$l0sSMxj<5-Zb>m|=n?NT2|_D0xvAH7I0QtdNQO zJ(_tKvOPELAeGLPRQL_P-^s+nJ=g@#ux^GYXpUE{ZwY%4mtMy` zdD-kT#=b{X9jwOZtT&0DvoK!6%*}kuA9^XrlfM`1d(0Ud7u{|%Ik|RN`|DOdG1q6r z1{16?I=LhQ`+2%b^zuJvamYnhSH{cONPldZdayI)YQEYRt-cIG5jmdDW*H}iH2NvA zXgf!$iFMgbydF8^ABJ4ZTij0d*P{@5ob|{8DVHQnpw}3AsEltK@!{1nR%n)CuKi>d2T@PY-k9ymfU~yL<&J9ht@~pg zsbzbf*zY^=DK|Z`I8|Q)#5N!|KM<`AqzObvgjXQiA^fxJ@?7pZ4#J-1X1&T-$G6IG zwWs&6zh2u%wWs3C<-V>x*>NWm*ksh9a3>h2b<*&_(vjDOHIGxx3MDOMLMqg4%m2u< zG{pMJd}m0u7SG_YTUf2_@uAq!aCI78P`uu`56<9JF*em1t$8(4-nZr^QMU)K7yX6e z$OG3;c^em`w#}qp_VU1WdywMw^1$`3MHICA1J`3eavIco(vn!eGQfG;himmbayZOd zF+21mmL+5T*2{mEFA5+U{qO65&=u9G-(S%t(!U9u$k=_u#4Agc&UD^ zGa+fiXkX27H zll;60td$0~ShuqcVcI}V-QM<8lXBOjVC{hjqV&=bm-9K2MXRc$TmK#(B`Ad84-00! zBIKOUPopJ*M<^S2;j|FIWpNa_G4`${Qu5t?qnCl{`BrVg&HY3nNT5$=N+?!)N!!&q z&I0Wm_pbgc>~fOi&LgRM{h@bR*%w$JOb}s2b~jwpjC9GeUhL@tStLxM^@#0~9vNmk z!=bWPtm!2>Ct{ZaWhL_dg=sbxtI`?UY(s{cWdi36hm`YjV#_nu1YR2SRS^ z!Fzhk4da8dp7>^OPI}yycYu#0iI%6cHuUPGL#>Q(>QOw_6w1nva1Rr@{_#58*rSS#BR!2%5`H^JUW8LYM5t6CBi-t*er=)B!pCRzmQ8EXmAzy>l%Hj7up{f%TBR9RMK}mW|MUBQmIAG3NCQ{u z0~@L-=DVK_(`hN3LD;F!`p258yoJnVXF-f+t5AL#Gh)z(``7@hIuwzYQrmR zc)bmOXu~vFnD85H!#*~A?<`~gk?l`SGvA3e9BadwHoVY=SJ-fa4R5#MRvSKL!#8dC zfenw@aKLnv&M7v$(1wLJth8Z+4R5yLW*gpX!-s6R(}pkF@NFA**zi*u#-C}@_1f@s z8=hms`8NEz4XbUq!G@b`xY>sH+VBY*9d$J8PZ0NV)*KN4UhBw&odp7*J z4Ii-K9vi-9!)bOs>dNKMGj=^bWWz&Fy*eIF05^{lrEW?MDl)L}pn=caZD7w}?$3;U z-6_4hNBVaqeXvZvWhs-7X+5lf9K$B+5tt0KOO70fdIn~UFN*aWqGWIRR0(`9SQqm;?N zf}WCJu0`s6O4%h}PJRrmb5 z_^R#UZ!!5O(IxNhvJl^;5x(=Gab-l<1-N(rmV7wrDq5MOr<93bz9l{>hr}cKmhh~6 z{AaIRd3J5ML6z`3-J8$PE68eo_##~X9U$&QBAml&o8Rf zpQNiuOA)`st%y_N!&DM}wIVKwN6jr=rU;`J6a|7cB{=Y#TT^ah(4{O`Qycz*UZo|K zr4bejgXSy0s#5z}5VT=YK;n_`5=P-q;YZ;vNhnuTbWCiYICtOpgv6wNp5*=m1`bLY zJS27KNyCPZIC-RZ)aWr|$DJ}h?bOpIoIY{Vz5Z6Eh{c5UB05M{E90pR#sM3f1{>0 z5WMQ@RjaT0=9;zFUZ>_%)#R)y4;0i?6_-lwuB0s$Q};Erf>Je!mQ1^kQj$ap5>jf{=b z56da_3cf0J|1H;JTV!0~UQU|jxL5G^8rz@ro_O86O#I@n1ovX?Ek%|D6Jgeb?QlKSvM87ZZSbtSekQhK$|E6Kmfdw^aorI%W)CB_Qvr%Ely zPU4d~bxJ1VQx}~kYC5eXZ5dN#%<-x;W`ttCYSgKGEhoN8zNO5PC$W*1AoP?H9Z#uB zokwXwW)6_@Nehb%nXU6Aqp9R;lCE88PfmSL3DqbeZN0_i)ooDPv6H7R z`c6@2h2wMb^VRC}YSQXG#op`G&|wOrhLiuVo}Tn9>9hZx^rnZ?tEP>bHgFYj)extw zIx3*r@jc1un_U!h@;@yc-&fE7<>Xw}N~=gWKpz$gIbYHuom%Wl&8hD*)QoU?z14RW zwJP;xMndV|ReH3LQL~gWQbw&(9fQ-39B9gOMvwL+xsn)Vd@y5MC@_T%IE1|lKfkF|&gSBdxJJjbsld zzrtj*-;$G6{j?eC%Xx7YqY$^PD&X#8`vLjSVtZ@HWyzm5ds&J_Ut+hTu@w7*;9jl0+WuC~8N z+23_;()`k9?#x3GPbjc&-~JeK}L)U`k?&MDuWdjps?}#aHhxMYIGmf zCn`B6CnqOXe$&&5OFVir3YNsV)miE3iwoeNd%e1exeLn*`6;!kdKEu6K6rV-?FP8{ zC!hcMK>_b^|I!!-&A;Q_j<@ksGhgz_+~wSSQ@T(7$RMZxp=D*v4D z-v6|L>tB@XtNnArAK#+?S(|^<10RkcF}imB>egLf-?09MZ*6GY7`n0Prf+Zh&duMw z<<{?g|F$3e@JF}*_$NQze8-(X`}r^Kx_iqne|68jzy8f{xBl0C_doF9Ll1A;{>Y<` zJ^sY+ns@Bnwfo6Edt3HB_4G5(KKK0o0|#Gt@uinvIrQplufOs8H{WXg!`pv+=TCqB zi`DjS`+M(y@YjwH|MvHfK0bWp=qI0k_BpC+{>KcO6Ek4G5`*U7UH*S}`u}74|04$3 ziQP4W?B8AfSk8mxfZq9y;9F$LoF6iZ-M*Xnj$BLJ)Z?4mzunw7_4wuvcsKW(dwhSl z$G1FL8JV6uYZ>`1(kHT}ZpO$-{CTAguW@mCWl7c53j#%fa`>UxFRCrAnYZkU(&9jF z*`q0Mc+_&!}WE8Vq;m+tzW+$!l$R#71V7|Zk0AZqhN6z z>opd21qB-j>P@TLP)8`mvaYPG%X6^@^t?zN?XK!meeS#+g*)&@!_eR(BCFW1F#!gsk>1p~c#u=CgD4_bbS zzeUuG!zXcg%f-};a3_RUA-hr8K?uJ?ILLQ+pNIj<;)4aPup!stnXrRd~ya zDoZL#YrH+n*;RilN&{41dB9s-RZ{A$TJEiOc=Zy~B+^}laek9&Kegm&GVMTeF&Q`6 z)jPkORn>Gb(=trW6Yt8E6X0`$Usb$wOqb8}>qxrm+(r5?Db-CO(vLS-D}-6JaPCBN zVjSsTr#yblcyEzi3TZ`=p-JI*|D(o3+KP&*t0iIy-J>}eq8%5mdyV!;rI&PyYE}fL z!fU;0rB^Xhl`r>}uB;BMKJ_1`w~VG{4`M}Rw77`Y;524wu-=uWE351y!O?b49IZ!G z>4#o*ydC_r1=$O3T{GeF-?yBX^Mk`lj~;vLYw0eEI_K=AGC$QWy_iP0dMW2+GEvno ztu0?!T~T_uGY&5;DX$GI4V*b`Qgw+Lhz*%e_*dfYKhUiPmL#fy(-PFc`JVkr%?Z_S z%rWu;cY2k25|bqY{rsNtD)lDD`R;#Gj5=w`;OdmZLFp1k;@dY$slQ{sW`}VNjaNeh zNopu*3|*L@hEC(VCZ&1k#H8sXcYD;ZKtDC4B#HDBm1k;vO`q17{ZYcqSi>9$aK*={ zc*5XP?MiT|1WM)_6t4zN^Qb{nk~{jfChm`Kc2~z0_9^HuY3(MB0I;MlX}Q(V`6>II zytSOJ)E_VbCvUv(5kq|ahsUbnvs0T*NtAN@Z|uz2brSq&?pKBo0k!)_k5e?W6`fh#p$rBZLH)LSZbkUC%6 zSN9*(M-3`*QwMQU2fDpTxpHSJwFDC`SDz@=XMWU|){ErtGH%9vgn7r#PZaF4AsFYo zHyRe7%Xu-zNvnVVKB_-?>_0_XaD1Udt9!DPdLHxFFGz@AU)`Sis`&YR!uj6j<4k?F zQbRvC(1o6)L|1?1@+K;8Nq^;Cn5?|e#alDHMYWcpDQj(#kqc@`;E{~o8&%x%-G@%@t4 zZify%esd{8`b!yWoIFS!)kLKa9qA@b_Tn{N{Ym@RUni3*Pi z*Oe%BD`usgrpcG-A5I&c%QB(>v%&UL3NH6Iw?yW13TrdLxd&{Xi z1Z14Bavf_KCLDG^j2bX4Ne#F;p}?j4qutMj$D2B&Zim-&)t^JF*RMb`(3L2N?VgA9 zp%WA6D;KF@3k&Ek^VBfc`O4HhnOVblL8e^86V&iPD(zzk?PIVS?i!#>uf$D{iS%#k zb13y`_wVNZCuldnLJs9*1ZA9dWBNP&yu=<)=cjZ;_V?v1xqgNDi=FR@;JYwG>^|U1 zajO)@mK4U86xveCl>W{AkGI?J(BWq=>i>Y5;)K`vC+!l(*@fY8w%OGq|1KF{Ih1e> zaWlsERYMj6skoRm1Nj|E>M^dzzD~6AKg4<7vbFWlUo18OFRcY|4-h zLpxLF(oeRs6M7rtJ|-~{mmaGaqsUL{G`C8fV)sQU7jaO=Rx`VGjSWBk9%BQhD-Oa@ zC#lp)Ds&-^>Y?cgYUH%L)JWIus{3q1qSW>N7}6djeX}2ZGl{;Ls0Q7fT&-!bFrG1h zaey(v_+j26e}l;1p!v2R>d?curTyss>el_Wuh5P$$*F_ITTyR_DWDDny2i$Lh+95aM;2Ttu*(=%LpIGl%Y{gmgvglZ>USHCFLZ%Vv)(e0)u>`AZ3pI2%J zM%s$N{zKwvgRC_e2Zqca*x|GWhenGIDD_9oqc)99AB$K=F#kGzOyb;gkn!mSrCxPt zdNO1E%?Yi2_s2EIR>u@Z7eu8CO}l8(HNOu%GeM1;_KoOquI16awJGl~^7|$2_6My> zJ&keN?TO~TEB~O>Z!yl?XWDWJZTV}xw&fPatuIS=`}<10k8#pVm~)T#81>lyP;k5VVO8qHdferUe&1l`l!_)F}g66srs z^UeCuH8N3+4D?qcOOol+{nW^=G2dS6bQ?cfSp%IYudR~Tp;Hso=s>A!bV-S8^t58v zXxGz7)@6QM zrV8#-&5pb~Ulw+oqq_XqUN!iSe7vE{f8^s09sak;$B%SHii0+};JeN-{GmK{)Qi=G zm<6T6AS@^flr2`*@)gOgg?nc>xN3`{{{b*X*tc{w}+L*u_QVfw@&R z3t%)y6x>0Nv!l^KXP`BFU4aekD>Pi!;#1xt_TfT*hog?g9rEU?5EC__%Kb0~_J{PX8 zE>)T0I;X0#wyL6ZPN1g3#8RU!)%L-f8ki>83 zj#*S$rkg}b&Z=TWzX=Zkh*YWjrJN^pj*8B$%`ROQT(P3Grl6*@7GkJVV&(@bE-t5% ziYgXW!nb0-Gg9pGs;aIGR?mf1E(wrnVG5;+%bcQWO89(N@`42punm8KtTHlJ;YI8{#E8#scxLDh2n=VTL+@7t?@rvs7y&4dY@6qz+O86{UfmROHZWK}9L@ z{F9^e=HwSu(~4eHm z>RPTqEG#FTT1inb^=*565sSsj7oAsCRFYS|tcEKOl=?N@2IiLO_3<~_LlMN!&ee&RkDtBlgoV z^39a1zd26P-%M*d%zWE^femGLk@zpcNZKrZb-0y4FNUc}4acy+)cKcki2pi_M`QpfRX$lAEPCLe`0^%0hIjx93$!7jS+tjW28*aVZ{9vjJT&l6rqn8q07Ja zmwdvXN!NSA-@i6r|F>d4vGASA!HI>x{%_^*U!Tqin}9t_pRfsd|MhwMH>B{tyh#+~ znDv({Dn<_=`)vOY;s5zN-?{T7^`|?nJ2~j=@e9X)?HxMAMNB9cz4rCjyz27Tu6S)q z58sT(FC2Qa^%JGexYmS3RaWPm2w#5t-buC%vurrih8Z@TX2WzFrrFSI!&Do(ZFsbg zq4Rq-Y_;JVHauj*7j3xThR@ir#fH0W*lfecY`D#a57=<44Y%0vHXGh(!v-5V@vpJJ z12(L%VWAC|*wAmo3>&7~@N^q`ZRob)(O6UNzD)S82s(Gz_LdD>ZFtCr`)$}_!)6<9 zwc%zPZnEJj8y4EIz=jz%Ot)d04ZSu@wPCUi-8NJ67^?HGPnht$A)*?=`K|O{LVnuoY>z2TssI^0Ps5CKFk~7 z&j6E9R9ctjQiFiYFk8mDR0%L`2)ujz2%N`-=uO}Sz@=>5mx2pCG*YPtzy-dIkvNr? z^BzpW7?<(_zrZX6SED%3!bn;HVC-n(#NG|e!PJqi==^LH96vV#Cyp_AI&kh-(!#$V z*ou*~1b%OvDeq<=dcbs8fp=rX&lX_9cw?UkoMq!J!23@{R~d0W0PMtkB>6c_snalu z{G1LfJ{=x`&;*z;k>Y_T0#C&hh#%nBXaq~ZmjZWUq%6CE?_wkm9|6xzM=lThEZ{dW zLgzKWUt`42R^Z4plzNPp8@<4DFcNWNV zux2J@!A}4;->+am1XP&M*H9i5q}Ku zo3qhD1il7%6GrmC3HTbDjxy{;R_WCo@+mlQyB`@O@W+4y&nHgsrNA{92`lh+8yEOC zM)IaEpqerJ@t+R#V-A5A058J40bU3!!nA^y0H^06j|-jwtipT*UJZ=TC;!x4B9Lo1 zDj+X#0x!l$9+m+AhLL*z2v`SmOz0`F`cmq0Jn;ZeTS`9#KOOiOW+Ax1GcKp!flmVt zDB_F}96fnzCPw0~SfPi2)u3u>axM>fUYuQ9|L?9lY#vkz?5=hp9-90<9=Ys#%~1v4wH@lX5c3np~L6E zd#*6}y}-;0+8cfXz#n2H4=uoPRkSzoG~ksO$$tQNH%9zy0bT<$@m}yXz)vwP;GYAp zt2KBXFg9RtH*gb1>Pz6+LFyO(Gl36cWc=I)jJe7#FR%mSK9xAd?rPc!xWKqorXIb( zKC7uC?A^dTjFeH}6cji}|C$C|^G(WvAAvu_NdLMW*ol#{h`iJYjFiy}T#MO^|E<7d zn62PyEn4NTC7csuorkQM#|U%Z2AS?*lz+pd6%J23o!p~L)!x2w=fd_2H-x7ghel;ddJ2E zKJZK9U*J2xGGnR0`|mYl<^#ZA{Tf=4*1f>ZzcF))z(W|RFM-LwHMqcCm{$B3Y^7Y7 z_rPxf&fEt7cmiz(*l#=I2zWAZHb&~S8u&a$^0{B|M`<(o*$?dVn2FyDy!CNTeX-vR z{1Zm{y9J#5gu%0b7N!nA0`J=a9~}Gv;Q2eD8+ab@SGy=L_`Sf>c2j=vEMQI>x7rku!F9D8!#o%ec zGK}~an0d&w!A)nZ<0X~Kidx0O@_)*|RpHd&#F9hzx$e8d9Fzz$z2zzv)s?#tM zR_^J@y`#@*O9JJdkKh93uFO`(B7t%bM(hRdwsE-&Blk_jUZC775&r^*es1gqiVVK^ z5h(W^1Q#fG8w3|9_YedZ_%j=qy9jcRK4*h{2a#nJvb@yloP3GDZuz`pea_8lj%S3(5)7nyGI3GBTmuut#BUii0J*caT% z*bRKgB%m^W!5Bk+obSTB7)#w<-|pWs#!(55d-VgjkL&tQeT{D_*>P`v7yrcVe5d`D zZ_4C+Z{picB|G1@{f%)UBK-+s?@4*eBlAZtm`M&2lqr>d?eP_+AwPvj~Yi7-U z_mnA^I&fJaMWyMtmrj{7eL5=?$$`=WIdBD!-@&yzE{Xt)>nT%seWn1f{nyvHE6N>z zilj77Kc6za*!?>I%iGTDDFyB&gpZ3u`%G!9f1n^Pt^ob(Yu$ca+<4qaoiw&ziswwI zqw5o%Y5Wyjm!kiIxAiqTVf%&bU#BbRA3rWq0Q}HeTpaN$E%>PrSC?5q<3GFfnFFN< zF0&0@|MtL$2vjH?kM?n0W5>I9wOoFn03^hbKkmnJXVoVIkV<&{>l5wk^*>O68uL*d z?Z2|LU4Wy4zAkycV70gXfUe8ufcq|_hm-*Pc3r>Vzz5lXJy23wkiLu8;E((|B)_Co zKW2UK_w4c#(T_F%*~A&gW7gNdy>QI&ShufnW8-XZo-^&zm#WljSK5hc=|SmmM_qC? ze0D?DqH&Fq&sonEj_p*I({NwXl^b$3N=X zQGOg2FliW~xP1H$V*a;QNW!?Z?=M-m;6vJrr-zID5;x=B(?f;~$&c&b(T37GE;4zb z$Y!g|eA*{}_zL)hMH_~E}|T+8_@SMrpW;>VSm>E$IJHN8Ytb7s&E)>WQO z9oA>A>);c46s-9K!*re0ym@ow=jVs_bhK50fq^O{1n&)wh|s(nG-!|-I&`Rd@WBVw z!w)~KW5H;d` zQK3h%?RH$$ph8ip$U{zw8vc!_Q71%={7%%YS+msBPd}|PGBVT)FT9|ZELozKFJG=! zty-mCdg&!SzIl0hYV+pJ+LrCuu|pksGf&O_LDc4AQE$EVmU{Qych&pvzpoA*I;4&s zJ*ti$KdwIi{Bu=w`j|TMqo^;x{8G!s*|TTW#iDcStDi&_7Z~)GEr*fwX#OBX%8KkC3vRW(|YO}0YN9B;Qr|K@idq-pbPlE5h z2y=zSREEF*U4Zund|UV|JpmsD_~C$$2mG{pN}g$_WW^vQuO=(moq;yjD>;4W zDm>=3=<0yK74WqHUmNhSKgDo{#B!&Sp6!&37^LK}WF;?TDA}@J$_ z#X+JjCyTn0A?l~~qJB9fW$^a^zBS;30RI5sM*)5^;O7B;Nj*_(+KJjUNYtKWQ3V;I zK3gy9+e263-2qPy+zt490N(`gEdYN%;Ct2+HLRVeX|JZqcW#LP)R3h={PT$k3pmkT7d&Umu_5&HD6dYIRl! zi@;<2kHCkpFsolnR_N2m;(Q(%6&fBHgyzFTLxOsRSnp?r=FPpEIG;yE1&2h2gocFz zo|v_{-_Nh76Gv8wjEXd=_dT8stZh(%Ej06PVrdE_BiMdqWJFM;wQ>E1o_LN5zRn6Q ztbh*+VFRI&)_dyLZ|Hcgact&o0g@4A?OX4@tA71{fw}=dO=S~22mWD%4~fL{yXrUY z=ftglE202+YfwnkfXK-3NNXcD(9p9%gTLH<`|bDkCysp1m;Xnh7i*((6|7_fpNED= zMMOqMg-3antAOV|t#tdnqQWA>qr#$k-`D7FXBX(f+S0dmf6&kNLv(;0nP^WEpWLOlq+}lf2*|@h;Jc7D~gtV_#w?^9_Ym_xAB0S20B}|AT zMTBl%ZuR;CL!uZJ83aMP`aGmdr?wqxRdc^H z0uMubL6$pq3=O^d+-mI=GO&A{nl(D3hfph9j|jWkzcrL{H?aF1x6};g^UxrOYoq}O z|HvN*SnzH2>I}4oMg?_;td%{+bCddd)ax1*0zO8#JSP9cbPe3^(jl}vRK@kNZXe?t z83sX&2=COb!ef{AG0+hq-O58lKgy@5a*e~j%C5AMy6HhD;9TrNPIu%#=N@?A0qu{>jO|nAd%QfgrE>s>?q36tHuB zKNd9~nWd`{ zN+ab+jT$wA5@8>+A^$e=Z0_&x--@3sjT(72YSPNfqfVXs;14(S_HEwWr@4PUkGd`I zz;&Z0O?`Y&x1NWWzn{OKy4SmvuYcp({`F9y&K-B$cW;yCzW%q>_Px(}!(#Dmflo_itRQ z2HXFO=PmVdbz9TgwQBic9nhrtJ=N~TQ-CzaHTw6v_b#8Ne*XS`KENOSxAOCA=I7VM zPt$iVk_D+r6Md=D>S8axCMv>L*4YhZWr_Dq9o7e&@AG>2(p{9;P0PGw*VR* zyZ-tDymnpIK*^r}f23^LCM?(W!7efHV(QeJBwy2nNkg}T)s-H%Kf*tbH7DjfTeN7=6eW4ZZR)Bd z&*8&|2X#h5<$JJ?xDe}T$AAJU);TWcUrGry*i*Bj?=x!4Up?06BmwaZD;0Z@|e&5g4`In0ro07l$4Yp+Ja?K z)$wl#eiuLoJF<-~UAnX&e!xrPzkmOJ!5*mqKiRfzo5mY^Nb>d9U(3OR2L*cyx*lQR zBk=wyz^q)qe*KKCTer@D+ZR4(&YXcsNl9S~7A%N{UrpRvBKtLH(4YhMHXdrAfJ5liN+J-qjBfhoH%hp zKK=AleNCE7hR>rvL*_32@WT%!kh@>d=9!;={#kzf@y81ve)!>QUw!peA^Q4>Frf2a z(6>&&VF6+PDE{!L1bvld;%_qfYBI;fWa3X=u{57~&1~pkNqkHO&SEmgTue6iOnEc- zzxn2y^D&OzkcqjZWzU{Hng+@T_M3!bfPE${FT{~L0Ug%mkt0WhnYzL8U`hR;?hxj^ z_ukVqa15dU!g0V}J-2Yn60U#2{Zc-M4z~vlRn^~ymoHxyOha1!0|EkCP>z{72G}=~ z?c28t#$4btYaQkoa7?hTrZaKhw{M?NSB@P!razMg+5pNM^@L+Y+_ro#5_?=E=mU|C z?~3@pCE~YRq|Gjo2lk8PoEEus`SKCy3iZD#N#nnB=gy2~&6;(B55EBRQZOEx2HG5s z0r^ULI2Od6pE>?teDQ_O{7jyc-^7=)Kw5}5`A-?m`c5PazabucSfo3);JYAZ&|x2F z*elWsG_-g_#QSxT1)m`{P+GdYD#)Xb#vis`OeX#&o3SwE&FBgBfb#OUFGTtr!*@bH z1pi3`#-Q_iBJDv#;>U=0lw!a8kVxB|TCA|MSf$hu`=pfR`5iiR@P;hRB^?+CO^>02 zC3#6XBL6F+gM25?IYyKl%0KNc)@&M~fxy4trw$r=;d_`pfonI=fc<1i0$s#E{)kAk z9S*gq687Lf<_t0RpYo6SNSMuduq6IQ&ME&K56Tr~!_YzlH{3thlIx%lSm>a?R(Ng99H;tcHZcfvR1G&HcJ+*7VA(qZI_vQAkl zJg`Y#p3+0ICk4ujsXa9fB;et*A`d!gh%OZA51jgfhBAF74NiS-Lz@Jf+8j2i325-z z=CG}3W>y6nH2&V+-evY5b3Ety-;D?Lm-B%c59$N2jh+yH*ge_x!lPoF)uFMn`ec{y2raq4rq7@G-OV6;GbF~^2oQK;f%=N zKm+xeHYpM|$>=j_F#1dyj6TyQ`EJ+v<0MhJ)R20{`2~JfStbo8SER$}iYp!bOd6QB zrgfDK)4R#K$GXcaQ$fSzK)FH2(1K=XdJV$s0b(T+%_i$dWQcI_UGTBrUwhxz_k)e8%~fJ_FP1>0M>Z z%&xK?G~|MYwV+|gk_mFL2*Oi^bQW|bU`zryKZ6G2WBBZJ0GH!F>_6>=k^gSpy0zd~ zm`r^o-o%Z#8(L`lY45qNq21(M#kq}X=j;G^4K!??*-i4McNaTosHo5XhE2*y2$A{Y zdda-_P?MABwu`dP)LKTkD>J$Hi@Y+{9*64`~#l_#GQDtBu>Pe`anLL zF`c9k?NA`N4E$x~xMLtL25 zd^B9sKs@PVaDFyEMkmZ~NWYVR+6>OY^dp$pu3alOn@#AKnry~{<@NLg`?7NI#TeN= zr;F^E1sb3W8$rXXPJO0L%AC|wR;2Wl#YsW(Tw<^+93LXjf`%tS!)(wn12iyI^fCSp z-9Y-C{UQF41ug%O>$#-m$tRx_yWOtoF*LBe79FICvPIZ4hc?Qdxm{!zXxI)Kv_69d z+9adTt6-Csrv%9hNx||j(69hBJOdh@fE>+=4bzCyCWW~87#pGYNWZiH#NWt&_wL7 zy1-N!vgRK4D(b@5|0}LF{;gZL?u?^7iTJ7ZZ{bJlamdQbl7RyU3eFbEKmPF#K}<=W zd+s@n57+nPH)-Hpzd9Aq4Cn%V4C*s& z($c9>ME{2CFYNt2jZo+;$`52c1MB`yI0s{g4hx!1>weGi{QqJ|Eb+l78Sa!|UsnUAuOD4rhAw zJ_!4E>ayUBqTo!DU{6b0wrnZztu-#hgZ`3hCJiPVI#{wjX3CUlo3{1+6(eQG6Tz6D z9XP6Lty;AboL$r7z&V35Pv6JTL41inWuA0$ZNQTHKpmkz zm@#2V8KiGw<{qxSxqgPc{Gt6%>K5f6vXqJQVn?Z`h=|Md>C^Q%kOtaS>@CZ%VZ-!& zjsa;fnKYPnFV~dxu_^b&lO<({v>Ey0efm`NxnWEGiM^-JIA^$!Ylxe{pK{MkS>k>( zX(DdibH>>_t-qn6p%NS%EI6H_$AQlYV`yM$j$Dx$!q+{Yx115 z5O3-M?GNvBjX?RKubmG)pbk(c*e-1_aQ_YM%=Ps2492);Vc+QtkY>z>ah<9p?LQb9 zr2k|1N_+|n3pG9%TY+!EQ^i^zFx~=r(=xz0ihO2$W?qv9+EMb9_J6~M4YF?CIz0!z z`s%A1j(Y^)(;3*dhcQP^2kv`t?J|Yzvq$$V;2oAh6a}8H*FKEa&yh!G>0DuQw+2@9F=LF2?1UDO)Vxe*0~0 zcgX|lE9IT|Qx71ItI_?Rl^ItG8j_!8{}XniZ2yNeaPFl4Liulh34)vJN@= z4L-sdj1}iqp0W5Na})8qQMwZqcn0DBWo92d`@nM=e>zDzCYSsvQ%Y4$`7LP5loR-V zPO+oJCw={&E2}x%b90vX_6zz$`je$;&$RD?cRHKL^)6?5;?I<6PCUg?x;e{g&a$Sn ztm`bjoMn)+OmmjvDBW1{oR$SS82Kj8X;lX({aa?r^EG`%jPxvI?1IZ>WY@%NMpP>9 z2co%36Z`VSTCgqV{K(kY*g^33!?5Qcg8OZe>2u$WTqdV%`|}c!$%ysz{m2nx<6bah z3hfcw8G*gwkABoBT@MG+dT)&yHM(GJmkgaQp*@4oc?tIREarmmV3&@=KhMHG*;x3% zVW^Kcu_$l&8%3iL<6xYOd!fPDzh%su@#3QwL<+DghwmdXeUJLrN{wN|v(aY>?I&#{ z*Gt5K*~BoMKL2m9s~2E%kHBue&W0H?WxSDbF2+~5C(iiLhZjW-g7zxJdcA0;v9Az= zy{DnXfxZ*ho}3?P*Etu_R@0ZIpTcMS%rqRaD#kn+Yh#Ru=NA~GVtj{jf5zCDu0=fV zdvOhbHE1H%3u8I|a$e&)m;KU@CQqF7Yv0MyqT?^)We;KRmhnEu$~G0dKCSdKgIKQe zp!?@~kUj!4abTu>XC_ZLf1N*lTwb0tRL3Q_AI>!LJmOvF9C6dZz=3gJo`K-rK4ZQ{ z9vSatoUsSW56jD>7v~hLUt{3s4kaE27mh!DVB*60XZw-_y{FBXGxy|8|HR?%z=3g3 z#?Q4p0td$07~`QlGDgK%C*y<t=@P zSRdmv+(%?$-^`4?GJedMpQ}9bEDK{ajP)_bM0xakLxWy6{nHOJ@kP$7^wW(0W^f?{ z_m#O9n2r5R#(eQzI++C>bH#!3IJAO1;{3kW37(~)JXVO)d9i=QQ(~~MFw_+f_Dwlw z$;5aYV6l2VA6Cvf0-9_j>RwoHb8`W4frO-oEmOB+icl-c0H zeG~G6iTmq}H8IA)SQ+C?jBhYb#uyW08;p@LzBGN5BR@YoUWkL1N5oxC?3?Ym_D>tY zOy7pt6%XRV@!$PakTBl00XT3^lY8Tgu}~fv=VE+?u|^%^a`r#t(cbJz>x7ZVK=1*n zZ2ak)Ar29P?_Cb1E#P{e{yFI;F605r!`bmVZpe5QW4DYMGWNXE884(xFh0UqVLD<| zh6n7-)kZURi&Q56)Gd6sHxc%KEOn7~hwB2a?Z^|_9`fVjnNMW@zoK=Vfcw*wN5=5E zH*Iu+aVEz47$-|};=s$RFG$$c}B1Ah!gE1 z^?-Pg2OJ;r=E9ld@6|H+3@cq`Sui?ldG~;jtxC~_UwTD-f5%* zam)!LM~-|4-`|#TBmh|7$IET_Up!dqq(&ph2| zP31*if%l8Xj2ZJbV?5lW#~1#EW5M_u=4IUv{Q>fw{WH@iqmO1v%vC>wpO2%hm55iI zN8elu+$d@JqYkny`gY_u_i`zN+)HO%gZe={&E6HqfOdg!#D%<|-KNbXp85It3(;|% z8+DH7TK^HhjluWmhO%$A$#EtQcu#=fy#g{|zyOUKabRX0>HzCeZs;e`UhrHZ_QEsK zF4qcGN!tF>{@@(_ShiP)J$cUgv^k6|;GG3J#!S5+eoW+p+2f_Z%$N%OcF?dKomRDP z;-~vJ@=U%m6Axzg$N32FNYJ){XH`i%Wsc)TUXyOxWbD1H`GbAy{@D*~jkf=l;bDAW zeCI&$eMh}lOuvwOPL#(#(YNlO^qTpXvP62>CNpgwb&k4CIw@m3zr(W^_+Egv4>w6S z`)2YY{T2D{%72alGi@(zAIBN*grNML$9~w;XoLGFH=Fof6OWtB)UO-aw`<~6>V@y@ zx|Mxj*DD>oKz2h`RmiMoV7vgr9E5u&r{OcRq*w9|mh|6!Z`Y!(m2g&zZC9EgkD)79 zuH1we&1KlA?{O~VpKI2vDQ9;O11Lfp6LNBL^nKK+o}HZ?f&J{Axw*M|Jk1=&afVI* z$h9-Z({TQo`>em9jT4Z+i_}A|jVZ6|um%|nzmDe`gRr(*hIJs)R?`OSQl{y{8Gpv; z6m6Lm>n5(5xQB2UZcRs=>qIjCv10syeNoqFmzXK9gk_4s@`P*Ptqzw=-*f)CgmMdQ z6ZMF=(s!V2AKbB8GA1~D!%@!l8`qCqzjCd>wMtv8m6iZ6##*^1C+?Jg_WR1r2<_us zz#42BaAq4^i*xP8y$G)Rxb6(Vx|4g<^r?t9?G_W)FkC}z{CBdj4cGK7Of2_wxR1a! z8~Mj^;v7Ujh-v$i;o9Hg`h#l^u6^k1a=l?+{Z|Ay!Yo{5peRLm#3q{sqU5oE|OIli*J|n`o8po3IV)(BsKF5d1w5tLd=uwpYsvd32d8o8FPP{D?IHq@n$>Z1)ght;+)O>B*Jo?&AA(~m~yae zXJ$=%hzGK&=FAG^wX&(h`pk7%*9{w)7K;bU>iP|Ac$cMzUg6OuPpk_Yc-rTafLd!I%`_=Ti0sh-D-6AhN{8JiofA_56fV@J!YU9fa?hS z?Tyb&Z&WXWZ|J7~(ID{?%OE~Ps*Zm^t6YkM7wLxfCgRt!;#Hy=jn?Avi(0X0IZ?%_ z38>vm*J-N)uwB{}xg*{~1LRdC+z~ewiaH5+yGsn}PXjhFxQf+%3`R?Q!qzN!e@%>< zggT?}?zmX=W>G^_s{X{vf5%r_-OBn7!~Im$Bu+`dEgpR&R;kT!ydNhPkdpuv13cL` zQ+xc<*VXoi>V8vQ+HHq7tuwdPCHc+GVRyig4-<9$M6@{Gg~Ewg26ROISluVyi>;cX zet%q#)-}nQB=Ce(j0V*c(dO^(S>Q~E;)|6Qj6&7<6`*k&=xm!KN8HTV@yam@6>$uP zOMo|B0&aqO6kHkwtg1d{T=4!GvocWYM}R|l*DeSqsGK0#H6-Ph#!?QA$3CB#MYxG zBy@{OO=vT@owp?+CNVxPHr4!+ZlHI&Hf_Co-cj3P=`k^7QmX#V-72=$!2t)z)Ywsz z@N>4)bUPNL9x1WOlh8}-qtPkxlksb*qhnLc9=bjbp9)a^K5_rp$+6=t+E zaq@(5u_@k`N%0}0M&W041HI#7#;3-5_w3T|vi4nS{I2&N{^fA(;a^5Hz)XWM4mW!q;vXgg**VJopIySv@P?rFE!eeG@S0rp^fUwgED znEes^7<-a^sy*F4&%VgM*uKiX)}CkIX5VGsXFq5^W0L?aMltbxiZEBuizJcb?gnY~Sp**#X&oH6I_z9+RDvJvBQ$n~eEy z`Y#9mcX6O;lRn)>B*r9+fVG$wo0y#38b8B5YE0{i6DEuwF*!DI@`%BsQsR>)rjAIO zHgU{^#5S>0V{6}0JGx)B>UU{Ma?)o#7`ip;rDM2a=1SCRO^At4#5>ZGrZu&+Zq?d? z-(1Jfd3Uo+ni$tQfOl%gCnQZsnP^FgHJ?(arPhv1nUG+Ko)(dqIx%Ma_}G*-u%F{o z+l(3?@A!}!JJCAX@jK}j)4-&}+VOD~s}(fFTCJAAK#Py*-lrREzr})<+r*@do;?%JdN=tYuI$pZhI7$SyD~%NmKD8b8rDWm2MV%a&k( n+bwtL*K^=~>6NfR^9Fy?wG(DALRZnwA8?_=))f`pbcO!`l4Uuk zDk#k~{i~yk?|JX1Bd28lkG=4tDesa#KJ3?1I@I&=Dc@7ibyGgz`N6)QPkD>ydq35t zw5a^YGUb1mdHz5>zj9mcQfc#FjbLurNVL)nYxs88p%GSZYD=wU2mVCNzLw{@99Q)S$;kf8bu9yca(9kvVm9ml^vrR!I-q`G>GNZ^tcvmFj1Tw`fDZD% z5W|pvewS(+{hSy`MGklppb3cC_!< z@h|$MW%{fb(kD6pOP~L^oj#w3zJ~Vs2kG-#R!FALiJ3n2#KKaqo`{tee@!>``%TYZ zAvWDSs+)%@UX7YtqsdvvwN2d-bF206snTti-qaeKWO__hZf7u%6VXC1N9?vp8HGbt z$J5=q87r;S&34^f$e4|1{5Q7m80e=&PpmHW&kxQE&JTVy_%+?!PrubsGZjsG&H_mA zQ+};HYAVAOZ$}fiR9ee5mn&%QXlmtKAw{$wwpraLZCf`f17340_E;ehEotl68O}?z z_Fyo%={Uuj?4YI}4_CCBFIkf)7FE?&m*#BB1OGwurHJ`#$n3Cu6PQBtS>5cm-c_yd zm7$&vBt6p082K;-_NUj{k+KuI`&jBbOy5(mhdgt;_4`wte(4luajXgG4i5JF>$9DH zLuPx#d`UNVTE7`D<#$S>tLTmKF}kZpFmlFe?$sV{v-Y20jP$OX&jnkAUs(V7XVtyb zD?14U)*?`&hGB*eDs)t|y2JbRvVO)oJ=15@?4VCZW>wIq(@~Mrk@WIydI@Ul!>+o3 z=M=Kzo*MI=be*)8{ISB{9>(!J__N-a=8R&n#W%-gTYRcuDCpB^^s3~-GP@@5&-(G& zdQS_V>w;D8SV2wM8)U9HoOaik`_z>Ep^Rpe3rnjb<}(rV`tpdmg4g@>h`BF#WAKLH zqTs?sEDwi<=6_WPwY&oS9!h@ge4(br)-Q{|OY*#YAspuHyx;~|kASS3FIH@oGSl?L zvQoe8yKukD)zqprHiFKlW%;G=hwx4l;FI%8m&(#zU|j&_bW@ThNpr9D0V}xa)%aIb zI$i2CA2mPU{0nJmK0dxe)dY-`z>ln($ z;r!UXuLDDi42|Zd3Erx&m8GqlFWbIX0V<*Gn6lVNq%gD>gw}da}r}ZQB~ns?p8uy4i0%1Ti$Vt|~OUth4=+yEmPu8{3(w zUDkd@?w?`_J9HBkx&ZF8v{+9phcT@3J8VI~wN7Ez)oJS6^dhb2N;;{RTXB`K*E$64 z3rDqRtY&&*}9yq2oUcvD7K)=@bWqC1X%l0jk)W<5-WBYC(#rn4H5)gp#eHMmwlLJq=^%|*gMQ*pq4VV(QhHA4CGj<;!d8i*#Z8CaN#*>VcCnj~;kkeUa{LUoKxFCaoQ) z(Lz++&x3Lwz;=6UnhwM!MvN17>{Qmb?dwgsTmzkLB~jD#wiGz73hc0bFE|C9KA#|= zH}%FQ>c&Y5z*TJD-<$$Y*WZx>5NNe-E-TfAt1!)%Wc@I;ZuNwxDGGasDIMyUNiVvG zq;Q70PYHcLO=Xgv2698@cJrkun-^>P2}|fMHlm7xaZmE<{&cQtb`{N9zj0bRmpW^T zzQV7oTs0ENHe&mxQ6DI7qd0SU4;3o*2qRd`X1>(=ew})X5Dx zx$lyzZM^emtdsbk^u+xwdSX$lp7h*2CkHCqDohShL)V4hM9k+UQLP(GN-H7!C8gyq zex`xuPQ(!g4}S>0r+CyH+xIAMP9Z&+?BT1!*kA<}dqRn*FwJPGe}l-sw(lGYN1b8} zWQQjQN`9tdtF?#aqMN?wu4E3)qGxzOhwr*vb;kX_%&U*-=KLr0raiGc^x8|=Wqt`N z?L0luR(~BF;DS@~yKDN7|*TJkj*-B%s1{65$`jY_(C#P&^rVi0?Ro4iaFbR)Z2NLxS0 zTL;%Kt22(A8JiL`U$i!iR&zLxx^E%H=*c-=+h@sisygu-_#m4J4LQqB?~vXvP4@yQo0-^oki(PiH+=FZl}&W)S-qI zk>W;2Zl-vl6rbe4X6feZb)l-Mv2oh^5t8q5@(Y-SPoUZ;N<5Tdl!h|=x!1}5)E;}=RcAXJ8(<$^13IV==^rU>wwq$hX3V4iuA0>h< zuxK^)myr=p7a)oeZ+g4u^9(OmpFl8J@{{UJfy=DjAf8lTTD00iSF3Kb9|GdM-PQp)0<* zZkW*V-TPpIXEKDks>&FQ?qoV&Tfa*;TJyB^yJa8xcch+*-cYj6E7HdBX!5)TIXSNM z4C2L57KVd0rioelfI{ELMrb&Y}?h%mk5iSTXrmJ zwlk6qsS{}3<}Uc!G}Wr;Tek1Tym8$SrWokvCzU(FVIAWTEa1pwE zBJ6JdS@$4RFBV*~g^Eo9MAFafx2rt|uRsR%xpNVyj8!g>2u0v=>eO zS~4nHBgR%cVxB-_OwP@%JN(CpY3qHvqsbt-TUGivY2Dr$b+=`6PJSkbWF)!Jn=iZJ zMt}mOG~-m{)L*SV+yRH!c@XR%)K^BqVRh zq&wib)2#d0V3BD*|F5o2J6$vbdJGh`O-30SrMI;e*Y&m8c0Bi^cD-$Daq1haK*i4o zS^0dLE!U;Du-W5i&*6##L30bjy7q7@lQPyCc8<%{>0)|vQlrFG_D_+v^1uh+p+bhA?!)dFEqi$(hoT?=hJt20DQXmOiJ``9LY)@=HE zO1esvSjV70vmITir9t{Om5D&<%?UTa#`5Sp-x@^?6JCK@(Y_-+ye_agHcB_zSUEYe zay}#@o~N5_?G>%q2t<~g3s!Y+G*Mj=P3Zn>mA2=HCm`lzap|)*f|(31R{)36WvAyz zfea$wK&B|2YxO{n>twI{fk3f0YVK4T;XDy#cUe=*$V6#=30zz**pkdJOUUdHcyGKx z={=%tU83}-sM&@LFz=EaBy8m5*VS4ZYhB<>lI{BnIk4cD&H_E|%!spiL(( z$1W0V$;KX^P(?<}XYHqoplpQo7H>!m)d{bdPaLde+h7(tf+ZB(6MxWZnoX6&>|)(q z*DB~wjMmL&u~F-ZIbJ>BJ5ZM6ik)gUbdlBM`Quqove#M~lf*ebB4nBg}NN8q8e!? zVj>HOMJZ@LQzOdvHUSih8gCt%IxvyHLmO^Ea(*!Nd-Zuw>`f87{SkAwbrcIp6hiff zt7^x@FVoBVwDl9eTxT2$))(-5-O9W=qunp;*yvYT{VJ=~FI-x;pN&=5ArA%W0()Z} z=?f87g#Y@j2_ct@T|gzY^?R)mq?NdksZ}7gJW^{18>hCuy{s)%iDWGzC?-DRKLl?l zlnO5zQf3*!v6nJ;)xm`Sjm!6zf=o%-07p#e5?cL}gBtB`Nq!dTtt@<7#(o8m8xm*XOvN65AL(=C_D} zJM9UyYteSSwriu8{DkKl6tSk&09e8kMrjh@N|SS;@9l|6^W@_Q=i{`@$NUzI6|VF> zN{Rev95oVSa&%)ew#+uKZf{3cFg?f64ASokLt$^COgO2#BW71L>H7~o2Zg;=Z|nCM zZ=N18^ET^uY+VpF$K*teqc&2xaTF!LhIKrwGne_WBX+B_9vi@rt2GKHy|kQxSUJ18@{fEswY{>va~$3%JGyYfr29k%@bck16c zdf9Hh?|r@PC`@3R-j=#7868z@m3)O|u0`Iw|bd&(6~U$UMGD@Vncn>Lm}{NqU9US&{gYu`~lU+m1n zi1g$#vC1#v|9B;ObTzhRor!#90$^5b(Gy`buihHrRfjV>-l^6#?Dg3lZ}@PRD|I(> zVcp1Kiyr8xABHMWk$xp&hFzvUhIKbDi1339ve8Ac5ON73NDM}^^I8O?+8zk+GVA0S zG|7G=o9JQQO;-x!z=zz5c@^<{-AWi)tG`b65v40t#CwnzKA}>?+z|q4`eNlNfRXZK%L4$WHQ)8Sgo0 zwE~@9)+4fUIf8fW?9TihJ6Hgttrta)MqB{FTBqxu|CDLzEKWn{Cn*>&wx$DtvzSvC z(4Jr-g8~qe!NL-;BVhBlx}Y;!It5;VT~^q_HdZcH!a^(MA3%zpy!zmpD(NfkvF=9= z6p^lmDSFnrRVn4npverH%%I5(CT}SgTNGB)0sCY%@`7%@lG#4Gt*2;3c3;0E8(QyS zoo-l-h2)DEIh-3t!@^Gefe~>Aq|Sbf{goW=Op7FDAB-5amdpAhatG_BQh1V>p|DF2 zoM~XblmiX(kl0U_veatKBQ+uz9@Z1{N|y`0j<11Sd^JtI@w2S`$mW?%;MWLc4%=HL zi!p2d7Nf9k{=Kw;xt19k$vh+UMEX9C2D?jRP0wn3ihvj zIKqjR_QyB+t|%#l=^@PkY$HlM{<4z$Jve9n{#ZUhYv#%_q#uJnen z7S7e0{d|oCJ_u>EJ_(yUqk*m3cisoGsENRi9?F=l*A~&-*(<$4vm*-sUaFT_dJdnX zrOQM7ERMPl>SbN2|4`NV9yZ$|0jqv#7_|5qM&SK>FdA$Qn}>sahte?IEg|!hNZ-Lw z+2M47yawJ6YgZhmd7`)o7cpN%77HvCf^&@h2FBhy;L2rI>K+Cp6&?pq zlFhyiSR(126>L@rL1c*79q1?uBeI5<%2ZP3K!*8bJ8n5Vkdy&9Re{a#rI- z6fv$Y@#|&(1pg>!eIKW$IeEqD_akO!YCNey`?q5Uh$a^MgG!T#n1>V}I*O@Oh-I-5 z%k{Du%Iw6?)MXzjh?<)@`1%M|Z2fN100q^u)YBKp;(8NX!a7BpNWL}bB60|{!@3IM z&!_-j!}^5^fVs3)8n2d}7M6&L95t6HGcO7O>k8tJiY2gy{mtC0V*s z;mM4hWAvYlP0?$+)i!p-gT`AH%yAiSovz=pXFBCU*-y1#y_wmwf!PgMrEDEyp_Y+h-3$ZW$Ny$8H)g+M&odOm3D+qCuDCyTVF4s8_v zmEyLRLz)cEXCoqszT`H8*!|T3k)9}efv(zxR?xmMPtJ#z>B&Eo77PE!jE`0XJbxM^ zJEbz?Lu5g--#l!-Y#gzXP3G6p>XOps?99>9SjC=T%MY0{>#J9bVPGK(CmAlr@LDVu zdtE8Cwy$lsu#8`O8L={lK%5}c`pb6GjOmh$5gX((WMNF8jU#kU?6HQLb+0+w?hE$3nE@wxIvFA6~zB7QMVyoEeHQuBH-S!>tRw89F zyIi51ALX;4mfyl>Gbw7NUa`Y^`9s-NepV{j;n;E-$Ceyj?qimR?nQpJ7Zt@YCfL5$ zX%(74|FeDDa8Ol;N-078H81eqW|LX(_9$cc`%a*!#=7{V2=)|lNG5a40)v6g4t z01XUUv68UZ2|@vkl?ceW7{YVw!nCy? z+sAnJ?mvd`Ab`J#GpRgV_N#doE}<~&Z?VHb%c3L;ua)NW2qzfhmeh>}dH zGKiE|U&0iVSyyQ$NO;+GkhAqI3{1v-UXl6k&ogShm<+H}bDWf8ZLbv`!7=F`^V*WW z%|fH`g0dA}vmj?dt{;}&QQW)P9h)H{A4EQ&PP7V>>J53l4KOcs^mIW( zWkEdG-lC&N1l;w9;87FIEh#42)wpNXA?u;BStwK2f%x9dIa=c%`6v*^^D7Rdeo3P2 zK9dB;uN>7oyTltCA%$60W`E3W-dBpg zuqcq@x{}^i&v~(2yR)n>8M=s-@@eAy%xR>v4&Y%h*z7^|kj=+ut-*SgnXpUQ2Za%i zw_32)!m77h`9S6v$7W)#c5Gu%xh%>rSYMFAD@|Kh-5MzR0ebF=8}-^F_#pg>cMe^Q z_fFTrqJD?X&Jg+pQE^7T9S;~YZ`N{LIq@lM=%?CSV`D_iRT3c{J=yaikxU5%rHT=TI9ln9_p;9*QY6sX)@dJei;QU6QC|w1dx9PPU z-k*1jcMjN$eZXl0=c@we30H5Z#G4Zf18#{O`?4|fubhbI#LpT6?u0J@S5*J&gl|g| zx>4w6bp!F}L5Qb)5yTF=Q~b_2auNe$u2af-1--x-Y8ugJ)$~A7xqyDQUb~z9yjp?2 zS$2CCh3xpcnb+1EDhBdlycVY?TH-GQhOBi1Em;xS%mih!zz5d%5ZTK)kgI(;YVM1) z9Y?6R=*3Ee3NQqA=9m}0tBfPY>WV^F{KDkb!>u=FvBx{<@$4HF#Ty?(D_|c16@7ar z?3sMj4pkIxD3B@pYY^(UW7-_E@LkG|E4F$T>^}02mQUF3kyHzn_+N+p{xB`ffEMeA9vW5-D%{ zZltI*4Xan_uaQoJoSn85x~zjwdZGe`c|L&8DFe`!Uzz7`w0>!xulJ>+=37i-p5mR> zWl?vJ+1b|P3AuYhVyI7#LAPEYZ87i$tRpmE}@el^F1lN0erixJ1-N#3v0fp0!puf z11^VLsS9qh<=8A zl(KovC21r`^>K0LV;-uDR<&qv-K@mIx|7<^+mo|TDsK^_F=k^064`x9BFi|CeU^vI zA`v->wGlB>5s}S`2Vld*+LS4GWdW#Z9=Ld+EhF-ng5iU)X7A68`i# zO|AEyO~DJK*d*(2vK_TGJ;J(KCFF$1nt-h(v%kz8V%#2jMxD`gWt|!-@k5${77Q@!{4z;ze=7&BScC z{l96Ke7GeU{#P5P(1-)>pb!x>_limI(??L33;=E&UU`S^Xg(o6V~Xzp2+b869oyFB~+oK91m(zDG}-Ce|yro;clXhx0fm zqA!a1;w8|CgOIS{tHtHPM)Qnv&@IQrVjZ>Cz6}8;hEX6s#`+#jXAT>_&8rE)U3h@u(3Rj2wHPF8HLr_+u|u2h!@v|soMqnSEk8Zd`9UErc zRN_h>v@U-yBXM8Ej^Rk$+sR6^P!=M|4(TT&#@8NU-8`?Hjo1~wjxi#DFXslCbHj#H zR5!NB>1Vtka3nsdw|a3-Y^?Qbif>?ajCQZ}h|~?V$4;Z2hvePt!VjWV5kP_Mdzd#2 z(Ya9OE~}OG95vq%MZN6^iVy-|(zl&p4c#oK!g~#g9ul0wCtz5||XBmlcb|@y+~5^oMA2 z%2&t|Z30b#v!su;P0>oP@n%l!68gTFk*t&4-cTiC(g?CTh0XM*M_NA`XrI~P!(S-N zL`<-L&IbV?K2X3qpYwnLW)JqoQsvmwRaiiIOAWlUuFCW7CR}XuDqc-j>a`x<)1Wa~ zw1+(1-L|GuLWkn}HjH3W>Zkjq4e-!WA;hn0iSIXW`S*t~{JgUpYShtg%LoE=slzv~<=K*WA*ElMAxu<+e5ER>PXppG$|uZeA(Temu%&q(p;3AFN2!kq zm=?vfxfpqDEN!LF)Xm0H1wg{HMEXo-l13}ryyuWqH$7J>Xgp69ORBMSo%EOR{GE@T zp6`=69Ftb3=ONylwdwgfFVgK&D$mcnFSmVb{~?FB$0_H`z~O7eOlSLUCm#&_o;kIB z^GO&pU!)Lg-zm3^a<;FL4;!T`wb1X9I%}R0*ioufT+j91NaBu?NMeOwVtj_4-Bj0@ z_j+s0>1Gh!;oi!cvc4Mg&8Yc4=Cmj3w59_z5~=-$9!bpUA~dL*qwByWnz05DbT{~4 z*jZ@K?vDlzYTtT-qUP-5@^1W$cjLZ1m)7`wc?;yk#>sw)Ni$-;5OH_f-AMb*3BElL zTXVmwcEz1Nab&8Q-#V9uW2Z6VdwH||2KhpVBR4w8!{_^EvduYpj=@m1wadC|nCyj2 zt$A%;w3fp&nPJJ87ID86l?_lyq<-5M`#ZFGH^n*bFxrb{B4*!>glHD=IX zaR4E?rmXV`e=Jb3r)umy9O_=}HG_<;wLag>;c-u)&Cx(xabWC&VP!^jmFM&Ib z$EM)|j1Ueju0pu}b54-q=pis$~y&T*+xHtN5ij^Dv z^%7mNlKsbrMJuxz??mDQn__!^I>*gYDhiq>gCh>6y-yP!!np!os_nT!v)geY)f(H$ zMdxVz82saUVjQ{l!Fyx32g`P8jl0P*QX^tlU_Sb?kt&IuWuyvXIfW6 zvj(<2h5p+D2H`EwSwH=TECv*ISR}=U4K0jI?@X;}rSnDnja37_hg1U|)xdV^hSx;N zR_l)tW>JcPb8F@5C~uO{c@SQX_Wc-vx12+X_zdyQjX9DVg;djzhq7W0o z))<;YTY1Kqwi$lJ9G%8d#&=Y2g-5J9EDiLvQu;DVkGayNG;o{qwO{JmzR6Uh$UG@x zPCO=Jtf)bg*6_lp#3+w^Tg=a7c|p*fGtm(jE${gPmO7HD77SR?ytQ3_Bxr`(@-qAT zWfSOxaSdnVed(w}=&i-FC`!Pi=?<=yrTgx#ws#DU@R`1IyXR+k0R7~IY6mXQnIYJ=|Dqf4+{O?83Q*D35 zm~q?{FH`;v)-R{BFDCMi3*t-k>{7fQ)8nw?9TyWqG3`Ursw{KR7s%pMMe3iM)dT*M`1?|}%AZgc@ zX30+IPfbP!7X!AEjBUyvWF0|-nESBQh0Mtj(=rdU9mNVG#;RgmWP&-P(zBuAracc- zp+(j}^q7=iuyEi?+-C&NiI3TU^)U0@n#|Xx-UoNc*6NmU3HqR;Wl%dL zkIaY`kZ}eU*h+@_w{SA-$LNPRs?I`9&yRXRk~$gghBqUHqL4xmtMtVD2F!n`DBU&Y zA@L!Y3w6XoW)F{rN=O!R5%FX>|1Ypcy+BCeYqX6PttY}QV(d8A+D=AhCvAj2I9Ci+ zE_xz1LN~*Y8IN@_s1s-}DbcJjI5vpO#CDDjrv=T!AxN@1Y#t5bfti^9CyoyfXpL_T z2V8Sei{e7KzA*ct9Fu(Nld9;CL z?d=gOO0=h4Y+4Jb!Gh3(cScOi?2L8L!@ zXRz-XiI$JM!z1>gk%aITI}Ha2`#~+lD$VpAZrrCeDp|VeRi;hXLX+MU&wulyCi{V@ zp~_QZXJ}92zB_-Nbp#$k+W_m_M`OPZC+5?&W-o>zKXw6;Mw zPZVMo6>O;(y{(rJ))j>Jj--v{g0^&C9d>R#xu`p+I!;{+20Fvd@~tlHPH#Z}#D#80 zwJKsBYO=M&SD3rt(@+KWTkw{8Sk2`v+CyWht11NA9@xI&HVQx{ji8>XzDsLtBV)te zncQFSH2RmvZZP^+XpO58RW`&kpI(%5tDHnrJ71E)Kc>S>es<7(F(N@%94gfc zt}u%Qr8lQ*gBzd@RpP2l;SukoBN6k<1H@t7b$bS(TH|}1=7p2j`DH3Rgr=l(6PIL> zoLb8o5hMoHL6p-P+JoNWY5<8%Jy_)&dQZbMH@;n1k5gZVSDG59CRwN@mS3YieR+R+ zBAkSWPvs4(spUN{Y+l|!Sg;6&bFUYtQyI6H=HmrUtM0Jb+GO9GuVy+uB51tb7Yv*T zYFD3tL}TJ3oc#GNW=rR=aO>o4-~yYIy{l>KgSZEC^?)4Dv_{}AeTN7(PtHQSsCppR z-O&ueZ%;ojbgn0xqy?c1=D}`fMTVQ+(Hf7#GMidk%E4&NTj|ys)55Ur?JSdKcj|Q# z@lkkIq~gI09sUQhXE1Oi`1G%+0*FVX$zZ^K;H)*Biv-5nT~_VsJQLwR!63B8U?hW)?=-Hdlqq`a)%WG*cKqMfqu&U6`6B@bTa*hHb`MGTvKIJRjs3NL+*6oUu`f zPz-+a;yzVqgUnl|_Ft%7(MqVuf;hXE{lHCF2ZJV3dw8A0ZK9=1GTeu=CHDQBU?IYD zYb`v2rzovi+{2bQ@h4?87jd5uw$%IJMg@8LZ1vzM6o{&c7{V%n5d_#@0$C223kja0 zjv%e6ch#8!Yiyzet6(Ps>o6M6;8nan=LVmWkAUisOgL8(UDj`QAml+b0wtTWQz})) zSJ`rn{zz=D(Z4h{djmEwSX!(^ZPaMhTGKdHXyg77DUCNG*u3gne57pNGR1|dUZ|DD zUz|F?3wuqfM>2#Z)dh{pi{q#ASe1LBs*PR_05B!hk@A>Ki}d9}v5yvdfiOihrQ8wUSumgQPT z^#CeUufkXX@5DLrvx5#hRD)I=NS3K=5*W_V>qWl{rNnBGEPPs!nOv=RtGrjq3z|oz z%TQ`338%qxgAOAc(jbx<>pSsBsbK8L>)Xq6SeSZ@BwFdhWMPA9H$=OVZ%8pZ3SwOU zve7>|_N5K7hM2X<8_siH#wcItPcL%K1u0ta&UGs3R;U zDFUi^?@j0u_Vu&Ua)bjE8WCg%lxXp`R{m?P8%2g!!Sm&i8ysliZz-Pe)W~iKi$2@- z%_3*UuodHBQkRe`Gg%(oKyxZiY$9Kkf}%9HjO|Gs??vP=@Th3JlaO^YUi*R06`J)L zM<&jp6-PabbnTBvoEC@yMN~q%Hte32CG^+Hq!Y-3#Bck`o&Ye^n)8gAcjrS3G3;f# ztlv78_U$6c{iV}g2vq6cNn)6j5UD?NVll)n<{W@3DD~vmQD0afGzl}{o*aCRADki_ z=2bm;e{nE5XBgAp9!e}Kj3yT4)qV7PJvnnErUkw1#M->mWvgOe+8O_dh*2zSE)^88 zHm|BVM?!u%g)5yXB(SvQ%{h1(*lmIK`cKw|O268HNamNIhp(p3)}H)Y zPDp#QH5Ayq^3-4%J5cMD$!OkkaoPKe-}-JTT@VzuHovho{+xMvA)b$wYN|zTDK{_A z!=;ipwz8(>5Q?(SiryT8!!Lqar~p8UnO`j=uM&6I*a>7SB%*^ANS&jk`adDWz7Sx2zfof8}0FuZtes9;}u zB+1-Zal>$baBaxDuX&9iE1ln=o-T=^!RCgr5bsJ~CbW6gB=GQPFj?(4`p2#G(oAxe zKV8Tn{kWAQX$9i_OdFVjLG*L=sG>-tI9wRH1Q$&*H~5=?sf z00n0WnNK)qk3fD%dRC{TQE?y+baCD^r9)P~=SLLO6W>vFO;58*F`ox*%F>k6!x3eP zc{T1$&hc9d;0GDo(7-vRvd2`T@-mUcE?7|-H>ONK0Yq}-H>J~aChwpa{&C^2T`ni| zz*%QM45LVV0&)-tQ>Q{NTp92^7BAbrnT{X= z{9VAVs&sD53A%Sg-2258V;u3+r`FgO<8l;^HMYd#YmI#r=S~9KckScO`lDlr5YJ*H zTi?`7<`$KC)kJX=7tUgxcLwDBKwjd8!cf(cQor`?hg6AB>D0=FrBh?)RW8VhP1ByN z)SlFH0!LQ*%68G_C6fTCp&&2fem+vRBmRkKB$Xxc=k(;|r)@Y%0}Wnp#Qlu=W?q%I zCiOVHU(Drsu?a?sn+Gsw=b_S!Z^?s&q(`@$B9FqBJoJ#Xr)3nW#N~ydM4dP7PTb(t zlMfWb={ATW2Afk+3ssZm9Am&uE$q-@f_UMx1Dod;oX)$GpGoCu2*2&EynoQJ>*{3a zoZ^Vt6|5|YO|SfVPV8Lm$x+&q!JI(%%5kuSFHH)rbqC$g2l1>Ux5m8#4#{F8PY=8VI@V4ed8Ja-K;lqb{X!#!&;aj>ZKK?0ZXiqsqd&(KwQ!=z@*^8i? z#a%onx%!-sH_EUGHPGr3#5%U+M#`Q?w}Uk52@(;DP87;v74K_x_RR*0!>X&5ktlO# zmEzeP1rG74R6Zc)k)ZLcZFSRy+?rG@s)+duS#@ktn@C|03e3*a8spHy20vtI^`9bT z_u`f)O#Ei@b@NBgI_(O!s3JdE!u(*Tcut&)y=WsL6Nwiyyej-%DU2D=c!%rQ?BN9R zn<^_3*dgnGGaw`s2nTI<@3*@soU1iqFLm{L9%O65oe^%}+Em03Ncf~gPHAW7B|LXy z0XAoQ6Q0}EOJTxui@bz$6>16rPWHPuQ*dpY}NlQP&(W~Yj6k}hp_|woF2JBV+Dt3<`-hr%Ezr=pxxW7j1 zQwQya#XN8`!r~?-DhW$G7|LP$7=SE~H0T%rEt}55mQ81YbJ9bhyDkeI2OSDJDZ<&H zfCpc7z{})0@Nt=f179eoSpdWVRPk$8P4*5(N=#E;;=Ie`upgiM9uKzS z@x}&0gFt?wmMqhh0#=h0PTsd*lS2lcL+|pf>WYJ00cC2+LrF&Ku@*@=<3Z4k@6y#! z1HMbnm)Yt|r(a~xO`^ssNf!ar*|t-Y`Oe|QKy0%RQc&v8h?=9KfjzMc^aKlRn{_^f zPOx^2NbYUce~}0pm&&~$NzXK7ifEu4c5>-SK}EYd6hM6C<_M=<>z^`Oj3k*G7N#-` zxyvde%Z#-Cp}s%T3I@_;8$>*}*5a{_4bhZ5PS`}wwZ3Xg`+J=Nw~gilc5$!BBVGAY zD&t7Tcn~`6DR*<+%e&|>X3_gVDM4CAw(lkKjiS9|fHYi7ehib9a)?dYa0xv1kYhY| zK1s8QHID&!cPqsnt$usgt_PNiBC$i=EUeC-oJTG8+^^rP-j9@t9;JJwN>$ z4<-AaP5#qrU)yC(0;$ZBDYK-ka?;jB*)PXZ=Ze?K%?i!Ktb-ew40db_8Q7VV*EtTO zdUh6LWukK?5E%5p%-dPvF~TA|IkI*G{jrh8Wn3>JB}N<@nAM*td3w9`L)w-lniZ-u zc$M{GEz?Alj4g%}{#i}WSxk1qGl~wxM_gCa>p1@eM+n3+@v-S<(TCEr%<+pqQ7xQ? zGQ;jyC|j5B74kB3+(IwtKkA%G?O`f>Qqfnj3f7$OTvI!j;|gTIK$q6|JB8Jn9_vO0 z_@W-;zA>)&S=##f=tfTy!#_^$B-!k5xF6oc-c@rjBk6M~M|wHubj3;$=AMofQ<_AOs>}JJ5>u%(%)41kNIq1IvFKc1K))za8*eVg&hY`m|wpzYQxnde<~ z0>F0FV=72u2bV~!IPY^z3hyaE&K20W0xTUoB(F?-BcLgo=QC)WAQ$vR`^$PY!pZ4@cA({mL4nip57 zdCG^p;&{{ayb!lpWN|AY_dYVga-|DRmxFPw@mJ2*&FX8R`r5DPFlu7wmpdZSrh4hXG*R{@B@?OJgoIBda|NU)=bHI zoUCH*`Sx;vs` zPpS@9wL>DBnYNtN0#XtqD+Z<19QA2O#!3`2H>av3C%Z1K->_Y=GO9r|_0?TF(ug(M zsfVgD>2Z;^IabF9Wh7QDV{@_5e`@_9uF=vT!SfDZzgBP77YHt~taOO48%DIb^uUh$ z`infoEYMh5Eqxxb9)of#dL0(3HGTkLB(HK?r`|5C7LpMKO)@-WK;T8j%OIznZiwbB>UnP8=V#ywX^ z#w%pd#G^D3+yFp;7Y+X%**j9Ug~Lnk%jW3BS_}vJqIQ=_yHuY?brm}Bto2{Fs__T8 z>m`%(QzwTF&)35W3APj?m@{JQo40Vp&ghxSY@oCQu1}i%Y^G~yrc>?!%GwSUbZPtE z`JSM$UpOC{HJjhnCYC-NJ=cy1Hhb%;Dq^GT&FVg(_S`i`KL)?`?}%Bdy1Myqr4=Ft z)m|;AP?7ZW#NlI?Tw^Wh|f_hvJC4dygPAxw|6lgr!oKdcOn%DRBs|th9xAZWd^SbKBpPvt@oi4p4n^m-7BH#T&!dE0YfwmPv zJvr9_xZ&mt8a@SddBG5X^FI&lR@2vs84pvpH}Kr*=JYUg(t6T3t2Vv*z-nBnO6}NE zd7O;h6zmPVa$?uX!^?4*Sy;-w*#D+hP*|`1P)`;;LRIC&r<+@dCU=5$4=m8#=W_95 z9$r6TS8#2ZQPdPShq=FYud1yz-Ugeq!-aNd#NHAyp792bt!@mP??z0FA2Vkw_-1e$ zFc%5V;5y)fhG@XskZJ;5K~{qJfOyyR?QP)%$eys(X!`_~u7!y9`0aNY8C#Pqn;O9) zHV(3XM>dH7)_*;5Za{8E&zB~v(*;JqJMNKpY=6-}Hh^_{2F%S6Fae{5=^|BJ@5~Db z;0P59g7!1|nqyvOS9?e&k39|Qw|(EGD!0KUe^x5=>4YiXF%YJxZn}qQ55!Upy%(K@ z<~L{lgng+3LFW)>Wk^rl5&0K-bTpl5L`;>+E#Q^(V$QsaqM_u^Eyz6-cq3@0gW47Q zgMs~Vq_Bar7K}V#VNjuQ?ySq&@jlx>);I}-OG)PvYaoGb&st}{GXTOlRh~YW`8{XK zCi!O&8%jRv05ItdVe*_@YgZf(29C$6{J#S6FL59%7jaI(AhDDH&{8WCD?)$#0*U1U zif=ejaG`mbg5nn$D88S>9m1==H>n7{S z-m<4;{-#Kz1XZOyO--#9yrgMw?PQ#+F}XR?6Uq7(IU_p z*UZ@^jji`;M$ZZU{z^LEm{a1HU~O|wvH0%FS+3Y}66jWgl5kevkUa$Fb1ZQfV^SBg z)~s7uhAeXr{66iM`zERZg8MVJTQ8v1(eKDRRM39wpb=*f=Yuiz3j0JdaH)}79jJ^bPd-8#dQb7oZ4CAoR2{*B&Yq;uo2y@+8FZ| z&34nQ-JV*`uQN$pq=D`8L=KVU&RjtdF$wI!^$qlh=Qw+LyDFS2pxOY(1!G1jS^{~Dde#<9}X zTh;FEOqiNIfN*GhA@?=5i`;6IJ_CnLzdCeZm;2I%{XJa@R#BtYy#(Fi08_?wT%6?G zN8}q53FEtj9)%%X@jGF|;@92I{Rlhb&r_+EN)QjC6Sr;n9EP5^1?f3rtY%N+B&s8Q?}lkqvyO=}aXDxXS++z+i%7g{o)&7W4e~2kZ8xiz11ICtT@a)-*m*yU3z*{=Nj2(#97} ziWm#jI2HEQwIMUdP)B#a3U7HsY_^}U<6QPH`N6RFKJh_Az5^He)_fo?j;zw zh@gUt2+okp1-!bth#+0e5xU$yV6&)&Ps#-YBe`H;R`bHC_W$92fq$`YA~b*Ib^&%F zE>!r`?E){8MTpQlJRni6ajSa4eYlkuxm}>fdS;i%iRaJzu` zVoHGjGV8n4Qnw3;Kxs9QN|dA@uvYS-CyNe3N`qGm&={u?;>Uo9I@p-VH65YTZICi} zv%tkpyYUL^T;4+5EO0h%kkdNyRjEnVspJk^EHGRpP8A3?|BsqLp_1yMJD&4*Matnt zEF})9GZ#)x%iJsQC@{dU(;I~T8|sCze8 zyG1AOj?}ipd5hImMY>ma&++yK-CC@WV^ufTU+RxU-Cfa&ZQMofY!^9?!vuk08i8-X z!H3;e0@8Arm(o~<@<_EKL~0Rf_nJq|Lj*lNz@F4CYw!}rE4LjkRbiCiR@v?34oJWG zQpoHQk>Cdit{Gem*+P}w0L6@Rhf`1;E(NGG$tfH&5ybcVbQndp_T|1j6XbW!L{L z5{)Z8}}E{XmeqjG2}{hcnqYd6KY8b0_hg z==3`dGPXA}I?Psdn8MBJeAdt7-HbEn^~c8I9Jv$g4tHbS&8T1>TH}X8vj{AB8kt=EsIb%i8orF&A`kcVoopxh&F_8Wyi|68R+Du~Bt( zb?es2VHdX>%N@iYi|=tk^C42IYA$M>dxn28V4+DGYHJ2m)ms_?Q`QmPV9OA-g=r$63(u%WQjm72$7 ze0Ht*G8#Mw+($ej>mYBcEOevu~(tx*WziE6D$ESpc{vf+36xm6@}2>cse zIlMZgm2b_sODzAo8N^7&sr4?a^S{NB;0ipkzgCP?*q_f)!xi4F-BV2~rw=afrTkX> zMyc>4D#&IrLlOydA|~`vLP_yH{^J=CSHj2YcmO0l7;c>Yn&|Iv?+l z>vkfjt)1;H{nm_c#XZ`_yGx4JJg6=*iBF(6Z_Ec&+{x-f=vUE9TBt1{aBB9|UhPTc zPM6TqWAG(!HF}DT*5ct;lo+>qhujjDJ^YmQ4HGKH`Pw_5EA~aH8T?~>3-sDHt~}`s z_dt|(V$s{e^~YItTQS?&iArlGFPV!AwhUv_ve~YhALlLLS&Po88ISOe#h9QEBIf@3 z0M`O@!p0Spjmg(R%Tr-_{P2I?6 zE)41(~C3dM|P)!0etmm?S)~ig9%2R3(F^1wW{Mn8njlaS1+%r9>fqN3|z(K z{=R=hJz-d{-7od_&M_O+kYKyz)!77>&jwoxgh)c=(0e0?hOV{I^5MZtIXFTc6&riw zw|NGeM`r5;xl}diekGFpYEC%0xG&TkDjyzhJP^A%TYv_tXdreCUTrna1=(!s==Nr+ z^h=ehU<3NY`Pq-uxm4;*qRzO%I!=WnRFyiHW~T*j^4D-fM1-5JtoF9gen2=YQAFTa zubuxI(M-*&d8bgITl>y8c*QKbdo?S@{T7|}%k0Xa8??rY_y{z)TH`}VQ_NRUu;I%E zVp=Kp=A}IiOUk{+BDK$8)R8}k=I+oFVM_(da~(Hk<03&1#-SPGwZ`}5{nBS*Mar2J zqflxGImm35Zg+7SuwrZ^8P1VQ5DC}WlAC^j!+_MUD8k4TNHQ`+y9F{dCsvzAGGm;e z#u(=gkngQl`$%2Y{jbGtVq8b=v+bdS(qrQr?q5(4J3Z7qIotBu@Pg*h^x^41gumG~ zLO#bm9qxj383g0>q;AW-ZYj=ae5BQ1(P~VS74Lb3SK7isHX69o(!N#5GDx#Z2Ju+! z;43#hTyUX=A2Roa%ie9ce=#0PyTPnjw;JVq8-LAScSGDubE!Wwcy+pv){LWh4~_-8 z`co)iZ`Pi4&#L^pYxy-?9`v^Mj?mr6@zd()%APv0vU4At(j zlsp@LJ8IrJH(2)iZVPwX8nZ(rQU08rcoxcEdcl^v<(t9}dPH=#eLW;#(FgD=6>zsf zIDvL^Q4b2+%x~KEl^H~G;ZtYW{dQt?xt{t@$~5iSD2p>zgd_f`|0_W*Rs?y=AVG4t z%HK8XhbGS_vo08TCdL7=8yzxNC@&@Q3Us*`VdbO{=6DE`KPprlAI|5z)PK>f(B?mR zX0er_&Akq7f^qc0Ex8%ueBeGsk|S;3$M?#c*7PF^K%kCr0}ai)_p?MAP@}7>n!lI7 zdO=|4+Av(oSqDO@Yr`)ONmgZNw0U0nrRk_paq&R?IB`{@)0Z$+dgo@@3t)h5>$|r= zTY^A(e{mIo3DVQ4>B4N@X33L)Qjh{&FV?;#!cF?jY)`@;2I#sF-*HgtpwJ<0CQ!(r zCh$qj8$mw%=D#z&$4+AIcnuGmuiL)VD#)|n6Q5xHmBSKeC$hTKE1cSu3SyTv`tOYA znQx^32l{xHPpNas#I7*jdXyA<%&Nhv(|=2ObuHwAfkV6-uFu@zi&%j9K{m?4T@p<{ zDBIin-1uqOvNv8yYZb2&czwn|v#CwMQt_(njX&otF!Qc=WpCs_0}^;IYWB$`tI_1l z6=V|_hAi+lcTDE>u^^*V8{WZjl>Hmc~ zud4Qj{MbT9;iS(A8eio8K7#Ij)>>6V0jP_R@5p5JLX8(S|R^)bin<3&Qf2Q-fdM;3B zw|UX(z7!dZ8;RvQ^HOdplAFr5@OL~{6k5CSHg&GO+N5IX1s-JNK|#jR1+l7Cqko|# z8Q)Yv(Y7l+#lF(J3MahWW>{jb_GDYyt8Ln9O~y)rxE9YF?oQ|0EL|rSp781D7ulSM zx@KVJE7fbc&mV907pvDkYj3xjm=@zQECfxjKKNb+r~yl|V>ud-TmRo;y1(qibYB=; zJ0zrgB;B%g(R2J1iRd2X*q#4;ne{PijDW7)|A%mHWz)&}hbyr!`G?YS>T@pKEgOmH z>1g3m!MSi#7aUD2{VJY&xk!ymv8psU0p0NDB{<#kSTGRF9VNAp|L0lZA7gh`7jv*A0o~-iX{SMpf8n=K!@o0r=sbuuu`oJEe|29ViRx#awqL9&lx8u_+ z@!Yj4o;zRoQGeXIi`3{}r8TwFP|I1APS3TwFd@mG$H9KYK0?Iyc76Aev>!wW0@k!E ze5MQRt`L7kCm+3^Qisd7v+L=p`)DT{)O}zesC$VM)QyI6@4~!mh@_fZ9!y?yn2`8u z(pP5#xewf19UhTJHg;kbtv{WcK^UYUo;1B%{6j;x6$VrC2PFkTPUyBduQZwo+P32P zLLY@I24c6*S5qskaR29)fq?C?PQZ4t${P}}t2&wPgk`pVIM41Y*2O-h)C~|XSs)#>ramEx4ajCWvW0r@? zme6R~dlbpWX){LLlK$+s`iXI78+uHIHOn%e%O{D`4wd??3y`I#f>bf<52 z4x;$**dbn0)ln)#D3V@-my3;s=YC4t$DD5SPBmf>P&mty~Xa~TEJa`D33TGJJrR1s&Z z_V1c?L*r~ka1bY=zdj^L{aLA>bxoYD2pEG>_M&#^BND6RcWLZwewT@v;P}e;ql%TM z9|<;8E{hkiHA=cL-3(_aPJfGEzq&>$xK{Rz1KNy>yCkG(g6kFvTN|L83hX(Ot6G8mRfCXYg@Ff(rQ~?S8!`sgy0Ie;ZjYlZJ!vmu~op0{J-bk z=b21Gu=ag_{q^(y{vEhE=ehemcR%;sa~WJG3uH(gFOV^Gq`*~lOM&Q4@c?B8DwJ03 z^E~v7o{p^5r?NCU4B22Yb6441;okU+RW3_dY|64Xj)v8u*Gzi8M>!<(SESc-@M_mV z+jm)kQTEeDaavkCyd7 zcv*PIk9h4jBY0cePdGc}9;KX&9d}2j_*L`%%+uBrKZV?~qEEJdrX%T#f3_~|^BKsH zQV}5)#C$R<7*~#pKO~Jr#z4;bWzeO`-$S@|jy#?gxeMg?IOlfW1F~Q5t1EH4zcAZ{>yl zn!Do*d3B%=tMID>F(0rYOw}909JXxPlvXx-9~{;XHOO9%?u>)z2w<-_*!s!+;Z5=V zpd@TId-oBN?HBrAjja{z@;FKM*v@W`?Tb++FFIgPyuTW3Z5a(G+DOFj2*%c!I6gm&sPu)rv`%3$%p8J;WdZ_xb#PsWZ%U97u#ii?3=^c9SA|t1)zbi1= zR^vw6lx8C(oErmNGnh9hBVC$heh%Td?&{Hy~(g(7P z8mdwFWBuQZSWDA|mt;46eN?WafeJ?JQQEO6R*2L+!KbW-h*{wX@CWN9fnspe^& zRJUt)wh5y_vN-|E*1B6{0Z`#tf0^t{v<|1qFnJhi-a&`c;TV{342w&{bAMY3u03^G z&2aV@={iOUoKQQM{YG|E)r&unHz=}gWmfIq5lvQ%P%<)Qi&VsjV%Z9_E}1aa-q{^( zyPU=vsV54_PIQc(K$q15N<-_hby=n8*ksv%(@YT z`^ywm-NQ`d>}6~PRc0SUpRayGHsLu<<+89@y+-s?!Nsf?yHxfyLf)^pU+HXY-dTN- z_MM&ZXLzQO3aXwRX;akGP)Cbpp3RC-QWb}isyJ5S70^JnZKBf%Da}qtN9cQ;J*{Gi z;B0#SJ({Zeil(Z}W1e|DJ`xyP-J7DSZkr#J9`vH9iree9rm7dTG9Z6gRh6g=)2gbn z*Z-OJ&t6a_;_QqG=n~+Ag9_ACWp9|!_VH(7Jyqx0daAxp9cCUiYN|Z*j?(-6J+xFk z{vuI0TB^$MuD3vd;ma1=P zPcKAz(&N%`TB^30#)O8d_E<9(%Ba}(?x&0d-L+LMZTr+%Mrx~CYP415X>C<`+q|?a zsZPBQ>P=gf-pssg&1R#+u+gQh3iVduUC<&p#-!bgwkkVx4539>@kFYs3cIPQdI(tp zVVCt#RaL0h(pDWilrB|O!u4I%K2ZY>OJy2u9}~`~PTr`ik{!^m@6}T`Jt=Gb!Bv-Q zbyb(>ZPj+6gPqyMB%qrnc`!<-Bmi;BZphQHfB`{vL`T=La-#J}PMN@&uEm?JwQ4$^ zB6MA~?~pnBOI29)Cj@iQdkJlEV4@AmC`Rfhv%febwtc_=!O)Q0_9qZgVRc9>aPo+j zs$NxCJ%o=Fs<8S2ju9%XHp*u?bTCS(zA2w<%I!}Xow}>Ax*VG(pV#=F&xd5%=$({_ zQj0gOGW#E+!b)=~tY&sM(5&q_hI6BBimj{O+UNp1>Z=g(^E4t|tU|{)Yw>F#jqcj3 z{B5j=S-a>hj=$|`omEkX)vNX@z1v|SC=@i>tCqCM5lnc~gH|kO(^Dtj{u%96i;2|T zevw4oK9|3)_AIHFI9M{Gy=tnXx~f75<7{}|HYGEQieza@v>`1RCd))kj4stxM}=w# zsrF&j78jg#ycVmS{w^(6i`GhKz5PU5tgP>F=3=i{&%a4(v@<*Xu3alFDHqJ@ygTo2yml~HLyoN zi`qP4NBeo%JU|@U`-m$U#u|4IzHmkPN+?rb4zm^~w@>OpvOs|-EHhf}gz zVR>kJ5Cm<`uy(rWkvHKW?JZ`&@x_imzSujX5WtEk_LEMrO~l0BmQCN{9-HT3WUA!l zn1jKO{D^#Ur>(O^;^oMCeRPs=HaFl82l+K3mKgzOurL9Q@horcg_$yhIQ#Isxp zle>zYDHmUguVSBeTdmXpNL@+6XqXZI93pA@MAEIZ{^duL_x(md=SX3igA4Y&y^N2zwh!*J33~ ziMY+t82jA)*pPFs297w$X+3=NF@XgV!EG{zp;Er7+7+1OFaAK&LS)UKe@4g=C!ye$ z!oqw>ri>52ujQgIlABaW$@`mz&yl!-4-m1|Pf3(_ApVipIPMD4;qjrpv87L$JEw*+ zS-s1~cHI}uYoxZU{f#258cG^O&aHVSMmKodVKQvjKT>+(Ge}`ibf%m`1);yqTqMj} zK4T;YveJBJqy~>T$OjYlV&yNkq?F}P3yC_Ul$<%DCWfiD#Tqg~8WFd$xb5@DuL(~1 z^#Sd1XQ4J9fyanAOAL(WDuY|}V&^7XKfI>16UEp^Sn5%7Bmo-dBqN|nn~+=h(%<|c z*SZY-AjX9HRjDz-aiJ{lEHCQC11Ymc3FtR#w1Bu-D(eRb_FI49+~XM{lkO)pkT}pC zKu_mB&?WjnQ};|G!{3cITyWwR?46IxSc$y9Tq;6>i7C$?+O%2POX#T?Gq{h~bbYgY z@!o}8@_Wzu=H=!X+@nR9SoYa6S>}a&Zdd_mALaw;%-CR3USqBsb!wk$Fd?$c(z*ZgJO4CKn1LyvCd zE9lu1~A_lJqhsi*}FsNpRhl#m^Aa2vrXxGMQ6#e}ra*+570)b|b_`z@SL`P^QwqFoi zU8V{Y$Qa=!bX~*{L2XiF&sz6NP%}i-b`23%jn;G215qjF~p89@W=ICI5n5pk)Jv7>LOEX)$ zki~kaGY5aXoV_u6L!7^Jujiqu;_{sJQm&pI2KMxTYgWVIz%X_Xzs{;V<_+}WZ{Oe@ z5=q}Z=ONMoPvq&Thar=v;g95^E|c@ay3D>o9!uNR{-L&)wV~V$;dP&xVag&`kP$ z_QWlv43cHmF747h0`quh**()6IB#a(z#Is2mgfof3VxwZC#B$#o{eO9moB^nwCT{E zfD;7SC3czy2<%-V)nU>>kWZ)6HV8X?$%RW%WATY@# zgvUbDp9A9=t(>>9Trv0TWoUb4PwYncChS);7D;;>F$&-Q##yfk4;6t?D2uLk7}N4b zlwa?i;HJY4bxxTcm#uYifH@l`u>OtoXMR|_)L+cGu^*K~wHKil|3iP~ff}ayr>t>L z;@?a;8F@{-AsdcYPbc=-)e2(G)&*^xHIl6OsPg9Q#t|Oy_Gr4SP=W3y8(H1xPrNqB z;(e%vdTC&i^)%?76gtFI%$cz)EA^y&IE=j~lWGP6iUQO92R_p)p={nyL30CEX?oJ_ zOzB6o%#2jzMbg19KmyU89ep|m9bAI3G}UXPityU#g$26XC&=a9pVo@7%13(s{2BIK zHE73y+4NSv%qT}uD;yClb`E6}I!o@z$lN8>?B#CTw*rK1npFqrU9X6ql$lUjzea|; z+=N^56~mcZc>YlA-M5e)V@kbr|-c!U+6=&ZF_U9RBW=FR=671 z9?IIVc8R}nZAVVSvjKPG+M~XQliTC68%vL7Z)9x9KV&^JR~n{g{i(3}waCT#j$rbU zJt`}XA!J6*p+Iy_{1>6;jQ$MR*s9q#W*({j_BWW z*U8zFY*btD&oOWvAo3VEJJiuWH0$slcfd`OiX`9ni2!9*J8~Hvq5MLgL2C9rP8IR? zRdQgW{23#EhRPpL{U=$$hMdff&?}x>c5?n7I)HZC&`a%coQ<_dgF19Xj+6|+v?ogovVvn4w9_vgQoKGHGtTB|qdh>e}B%|#|&{rSa#^c6@@d6V~_LoKT zJllS5)g7{4BMwU6+L`hWR;=}YX?+W;y()>)wBPQ_d@|U_SND8YdtXuU5CiJ=hZePl z60AXWgwz>+jXk8vuq~#}Tk|>bM5XB7Fy_6}V&bM*zSpSBc{hsx* z49{tR#q|rCny=yGKrob$gF=j_I<4^t>NMuGNUaXF`jEkO8R9#TPewX9fozitWN52u zTJ)mH!}7+pFIql!oDgKl^7^$eo)k>xVnz%8zndlJDxHDd#4gjc^;9d24J__AL3I{J zlZ8j5M{ienU;npYQYh!pn4Q6xgb&-J5;~~#oiz73vt*SSIF;=bU^HJ*x;tb6M)4J+ z^j0fI1xI9W$XU`pWV^g+XSbMmZs06wkCEZV^kjs+XhS|8pUV!dZEjrK;#vPwu|PtP zvNn&|L5wQP(;#Akg4PA9IrdpEOi6vWp+=C*KV6mVtN%Ras)_uKY_0zn>GhUb$C#XgCs79%uo<^bz9l^Fg+6P0 zkzCA@`~*kpv>BDG^tbF3Qb<9_rMF{F)&>~Y_F0rZu!@pzK|h&4)t8 znnHOR{%$OFt#?c}1q+_jCK|6GhUD7!xD+jvkXyW)u-rh5ZONIi+sZsuw;49LvgnF# z&B=W4y4Tv#WxlrAZu7+n*&9naF_1Ryt9$1`PHihPR$HW4OMwAJ^|yYtp<*SF4w>HypQ?1Xw6K*2b{e%eZ(gGp%9@*K#HV|)tS9v38 z6?#p5M|NCC1S!lD|lnbb=G&6jm9m2FO z|1J4Hi0IFlx*AaeiTaCu510{lIxBQ*GfpBn4s+^x>$~C)sY&~WX9J%sWt|(I z`O(AQXphbd{hr&M8Dp=T$(1-6>m=aUbS#|#9c6xGlv&-QJmbrwr)avT&b;tHG?u8DGWYjHP3}*Pi2Vsu(+#OQ@>`a~W0csd14u&hrowoz1X4+WRq3 zleJf@EnEf(wTLd-$C35yd@_^JYxa5`-qW7tFPd>+=# z$Mg-{RW#$c<&Ek7`Z(CQdZ+XX*|W}=DJ7@*i@0HSi4;;R=HpEsvsrT9vJUT;e)~OS zni0MsSORjdIUxE55;=Z8*e=0IM63T0*6Q|e>AhI}K9_$+QVFX&dLe6Bn|IQs>wJ-| zBotP(xeKGU&>Rd56gi-N*)SN!(YXULh!u=7d%Hr}#+K>PArA>v$u1f?S&g^KiAn5o zIWf7cHD^Zgpx_wUlK1gE1OcM6GfI!@3lkmoA%Z+hlDhBNvOp%jXDb@>}V@1N_D7B(R?s zdU<|rg)86f-V+^Gk0$Gi}*&?0`6a2LTD zJI}x4-DL0?;FE296!;Kh9p7*`xE-d7i_XR0WBTtG`tRrZ?`Qh&r~2yHO~#8%uPK1HsL%_q6bS${OZwaRKaA&}0M`Jw0AF+etMWz42&;qb&| zAE{LkPg^VWqTnk`!Tm>ITv2co4(6SioSWHlHIH(eLdW~Vgwkby^HIC(!a$UHo&iwp zjdsdkEMuk|bp-l3<=>SI=izl3bSfir6Fy=^e=-CRHJ*W)p`2=RM8;v@a2N}ZiNTm! zOOUeYt+begR$1P3&}{+ye^Atu?V5*E8p#(`m9y< zb;&1akruWdkk}f=%1SC5Rzx#UJ7+W8 zWRbxP9OV!KG~Exr1w7AiJJa~w%%`X*dl`4H)&cJVs0qWhQ%12|Oi_Q6urY=k4K4ZstiwB^m>oh`)LT*Z%PWU>!~~LzRg8X%B}UY>>}ZP(USyDH zc-Od#!V+6$3(r@!#>sM<8`HbAz82EZ35W)lzl$XbT;%5&$#BjO)Y0eSWpzDUBFqad zjF(lI*Wc)C%@Z{)q3n3>IWL6kA$nbW9atU>zDQyt+rGgl92wsx&LZWpw3-LE5ux&= z#>9J4v*WY;>vq)fO*UXrwuz5zS$yY(5>0w}o?U%0GXLkrCre_feC8&LU8>l5#V(C( zWr=;O*jr+6GKK;OY&*pEXz*9L>nuqD=@S8-ddZ~GB(t5$Jih$UU{h{1igCJEkiT=E zQ%Aaj{Pk^75tXDX2)meYB{>yT&{aY8ZEm5dCY&o6uAn$mK^*dgllY4DlO2ClDA7T} zQbDQIMY2>7gd1d%@gdCEKlqZa9v1iA%d6{$+4E{sKh%X(OSqa${p^USpFBG~q3=br=F%riMN739XU|CiOzBh-&#iTr zmeq48*KJ+%HR=5qBwODwNUBw45U+K)LDH;?4U%rtyF`QSssIASbYpqZGCZxPJEU1kw!v7Gs`mg2EpGj_$I;k8(hX0Yq!BS3%7<|9r)doK#c!|MV1z%!tOYl5{cL<(k@S}oH zGq`Yrtu%wX1s`s3{Qyj|!BfRP#^7GTk1i1+m?vf4Gq`@yrPbgW;^#$!%fj1gF}U1; zwH`CLJP2cLHF&k)KR5U)!EZBoo!~bbe1qV12Hzxjz~HwDUS{wz!Iv6*i{J$Y-zs>v z!M6#XVen?bPd9jr;9i687krSxHw*4I_#weRU#!dCDtL#%Ey3S0c!%JJ41QGbXABO< zR9VdimuI`J2MnGp_!fhw3Vyr6y@GEtc$(l122U4!mBBLvuP`{QSY;I&+%Nb-gBJ+y zH~134XBxav@N|Qh2|m`~)q#8tO_fHx-Y=jmH!d)QimkV-sy`(y(zG zn-3RBu`l2S!K7n1=xn}aY%;L<$k;q-j?C1ieG>kSq|d7-Cd4K!?{Yxc%Leb3$*yqKHjM77v|WJerfgMZ%CwH-dc zX;9zg>)!74EMNEOQP0&+vj|3sBTZyy@OQb7INRsE=!5?H4hn|mx~V&J*Y67KZTI+x zvEe(^xeLytta8{ek7tuS#@;XwlMS}Dio_aWRp#ELByibxJkiatelP`ak)V~`YSWy3NOkh&|yL|$KJD&j$KjJV1E{YqKx(^^OzN!8*cc6d$ zX9M8|1H0p*>bEuoQ~p zj8IY|M?0Yd@EE+I*mdC1Etv<_p2nk!T2u24n+brBN{gG97m>yHhLV=xsr?1(RnC8M z8)L?jvp8~g5`x>mbK^PlEsjIKCuxPAM@MjbY=~<}FJ->P!&PLtFIo1iPo)XvHR}9k zzU9$u$?Qg*%eF6M19?>Mfc>7?`~A`TQ2|)fU;JD|-i1}v96U+$jG8WH8hyDYSKOvcxr9gL-+`{B zrr}5Rk^b`&iM26S6l0;`t20F|H~HbfH}T?H%6-PMSUbKcFR z81cflrNl=)>t7PGG$sAaFZ9dT^pfu7Y51;mt)`S~aL}c>LozH5*XTaSUGu-5u6_8m z4>)+S*Ai)G$|~_FchR3W?#W^I<=TCTohiwVzZDWsV{9s(&}|)x^$5}rqz?!>{o^Dwa$C!grV3o9vo=$Lgp%IBNkB(u z%IP|(R#C|{QxZC>^JM|BSK;yb^eb?3@h3yG`C#LJOf0_67x5Bzm^%VUW1|%yg#(^Y z(mIJV^ZCFu-pvw$G5nm0T(4m~j>JQm?O|YN%7eBC_R#YB7=A)YBI4Yc@*~?NnQI5I znNW15z0gjY9ahiv48usxvYph53A*~8(9C(zhxUuAG_s-p91ME#!0Q$JSe%fv0pf`Iy`k-vUY&tiPqL?X zvbdHFYS-%QRTNw0a;_E}ofZE#A@+KUZ!$4dp*1|c4o(ssj&>wkjNm~aX$iNMcV14@ZI|{H zteO#9yn&@U{r+j|$KTficN6^epS51~xY&fSu_`(9-m4Oc$sEe1%lMrkgUjW+tc!5e zgK{8^X`#jX1dbAKLcU~WI1ZN@hgR(%0-TSU^Zzg(+AFW7aED6TPGE$v?$2xWANhN3 zW^=8_`jB8w;_b6g-wYRiU%+k67$s$3wB$Xs=d4%s)FPu#V6f=L>+hd{RBmFN6nK~Q zA^ONfNwq$`Yr+CA|pKr0h>E5yX|AZ((`Y_fSPl*yW&O<`6hpr$o84=fePl5_C zaAEblI|_9p=={%tjKW&}Qy)B05hJb3$n&TS>r9<>y=?g_8$~(U+kv0F5JIzmL=C|Y zZ)J4f@p-JT{x2itfeVp|Ey%yJbBS+bz>^`fePLGA;jI0~kn)bwvfi#>U*yiT&fXvT z4rhDNs-1*Z?WeU??I8oHfTyh&-;zr7G(5#-l0>GH$oZj|R=mf_>Gl0sTV>q8Vl3wn zdnv2JW@#f$u?hH`amgUb2{IfW&n>$;Q@%~zNn~pY1t+^N;^&?Q*%BichZ7V)-sAVM z`bpKsGH=pT&i!vuH0x=%)GL8)31qNbEr*FT7eaVPc5%> zpSU6JKHQejp@j%9+xp|%wukSC2Lw+t^xt&FptzLtz_Eqqf~G!ooqABDH)4e{92UxX zMrX>|0LWzQKOtB?ny+XZb^=4+M+5=f4>c;9Ej z7tu5vdBuH+=f+sr}mV#cafb!(7!3=m#mFD z_fnX*eH*epc{IzneS5Rx3ZQ|aZ|1dqqFdH!WBEMP_8uSFwjBftUrA^ogl_n>2W*^$!WUD&UoL(n6bH?yJyA+6E+Oy7Cl-d z*t+q5LmxrcebPxks(H>oiW7E!(|QSy3YqK)OrF`)cT>_IS*7|zi958qAz7j8nwEO^ z`gOEPNKGP&=L73boh(8E8x%Eb4b zzCsCqKgN_WpON=OB|MFS^ekbfl(0Vzx?I)bW1CPw`Y4B_T@^LCdx;WhZE~8UMWaMK z%03I?P-P1wuh|pXqop@jPoOUXq#rLL1;pD$P4W*WphWe+QQnqt>cn*J%P0?e1f6Rp^+8hqunvz;&Sx6HQKa3hu^Pxm{_Jlp?Umh)V2_!_b2+z(u zcHOpiR_segNsE@x6z*V}0y7Ty&>(SrGz8JD28qn_-zOuCpD~#2Ct1kRYrW2tIXVZ7^q;c=qU}w6z5VCR3nEV6wuJZbuMb_Fh^uaF_0jc?m?bbGyY)f%N3*m#X-rb81yl(n$b5OyH4h^jj z?;S>*F8#NTsyxwu`zS6w^xr;oqkHS{Nd33A(yL}}@yzu+)X;Z7uD%@>8n5(9>nI8; zWWMo*T3Et*8j8u8h>G9nHgK8^|8CpAX~WxX*gzIUq%yV^w8t3upxNUace9#R_-3US>Dy7DPR zH-)(8{clrsI!>Z{|SY-y7{zE zl2~;tT?%o}JK8P^aRFh4xZp84q4Rh&3#GaLe^7{f&ql_}6Dq_-9x>@zw!oTrkqU9s zhtdxIM+$LoB3j;6PL+6iQ;54@oX!^J)DhX;)xaF))?PH z#uF>V{p6=%Li-~X;(l_LPRdb;YgD_+(m1RU_xThA%r=hJ8gZwykYvIM#QW-x#-WCr zrP-G&$h~>GS!8~hg4|gsU@Z$w;;*A1cN5oL-cM+6tUJ4cI~AQfkN}=GnIX}UEB2_!we3-nJ4x(IQ1C9W+|zKfKvd)o z7Kn=6egaXE+eaX(9OYh;s5dHBKPasgRLU>A}1PDexrbo}5QDqzeS^fby<-qp+v|cr^tiSI#wx0<1w^RUtBPDx8gX9O_ES7s zPhJ*YIbNG>tH}N4;mG?&EYL;JRWuG~upaoiA1cE%;+@V$9agpqUSN2^Q-L6iU zbJBmXKT0Ncwkei{jHg-6x4{Sz-MCj}&dMaM+RARaakH`NZGR*eT+%3S#Qtc2eh0L$EcL`h|cCwTyo7meir45qW_ypeM~7y_JZ z!o4-OO5no44Mw7whm8*g&6N^i6-SLi^G4f7iHoo3`o5hAKhi0$yDG)Hg>ww&z#wln z-Dp=k3PBe!lIOQtcTY99OMLa;9Hcz!g{{VA#ti*NEh@III$w@_28a+m&$Pf=7e4g2 zzD+Ychgi++4r?lC-P)rnq~tnE_!fw4nd>A+^}7o%mwhrZr4v)|RLez(rprgOeS6d= zO?WMLNMwkL2;H`bZ@5+L_4@3MX8XmI5|qfxsj}$AfKM?%H|l})Yttw(<>zSf^}rqQ^MA}coYYVK(Q7>GhiUuc z${xCjvd`w&MIU}pfKRhb;XMsMXINmy2i-}^sUw=|1pn$$98FRi2rB9+R;a;6~fxl?~TJ;rMl$xRda5T${3Oy zd3HcHr@kNhl%wU)@8x_Z#hQLecs%;xTy`Fx5_w)|6e>%MdX`6KVIhaWG3nCOEP4Zc zd-0UnYP0|^pHUX&4^3ZECd?_G@4IEMKXdwgzJgU;s0@9;twqtX(*89#du}e1&FB~W zxU)H|w`<`#p%2|cPDbPn;=b1QYjjo68JYvb{1g7l*k-L~rzh%nWP=ro;f$?0Xia_J z-#8hPuJSide|3d)9@zT7Aa5Lph|XG?eXhijZ9Vz`F*e5TE`nKf_5H%GU%lG8>pso5 zueQ!u;?O`358-y-b@osD&mp!Lj`!Y@q{lS*-PTEUI?{PM<>mmKq%`PIU@{W)YAs0C z$Jc33XWO2BVmwWd&(H_br*8Cz`s7b|&mTILd*BOsAgwyT7?G^zK+Y3F`h3yTwO=aW zy#Hbv=Bh?;sNA5NJ!4v#r{NBKfF^>lzq zb$pN|ZU^7_g)Bk$*;kFFs=e0BnN0oS?Gody?T2{karT%c2aoy=41CE?U`<+E@hn+O zlbdqBhBeV6f+J~4DPrg4v@DAOSKpi)vqz59DP*iZW$o<_9b-s=3?DLb$R**>0pE6R zH?fFs=9V4@q$r^4b<9J@lzrO!?$l0sSMxj<5-Zb>m|=n?NT2|_D0xvAH7I0QtdNQO zJ(_tKvOPELAeGLPRQL_P-^s+nJ=g@#ux^GYXpUE{ZwY%4mtMy` zdD-kT#=b{X9jwOZtT&0DvoK!6%*}kuA9^XrlfM`1d(0Ud7u{|%Ik|RN`|DOdG1q6r z1{16?I=LhQ`+2%b^zuJvamYnhSH{cONPldZdayI)YQEYRt-cIG5jmdDW*H}iH2NvA zXgf!$iFMgbydF8^ABJ4ZTij0d*P{@5ob|{8DVHQnpw}3AsEltK@!{1nR%n)CuKi>d2T@PY-k9ymfU~yL<&J9ht@~pg zsbzbf*zY^=DK|Z`I8|Q)#5N!|KM<`AqzObvgjXQiA^fxJ@?7pZ4#J-1X1&T-$G6IG zwWs&6zh2u%wWs3C<-V>x*>NWm*ksh9a3>h2b<*&_(vjDOHIGxx3MDOMLMqg4%m2u< zG{pMJd}m0u7SG_YTUf2_@uAq!aCI78P`uu`56<9JF*em1t$8(4-nZr^QMU)K7yX6e z$OG3;c^em`w#}qp_VU1WdywMw^1$`3MHICA1J`3eavIco(vn!eGQfG;himmbayZOd zF+21mmL+5T*2{mEFA5+U{qO65&=u9G-(S%t(!U9u$k=_u#4Agc&UD^ zGa+fiXkX27H zll;60td$0~ShuqcVcI}V-QM<8lXBOjVC{hjqV&=bm-9K2MXRc$TmK#(B`Ad84-00! zBIKOUPopJ*M<^S2;j|FIWpNa_G4`${Qu5t?qnCl{`BrVg&HY3nNT5$=N+?!)N!!&q z&I0Wm_pbgc>~fOi&LgRM{h@bR*%w$JOb}s2b~jwpjC9GeUhL@tStLxM^@#0~9vNmk z!=bWPtm!2>Ct{ZaWhL_dg=sbxtI`?UY(s{cWdi36hm`YjV#_nu1YR2SRS^ z!Fzhk4da8dp7>^OPI}yycYu#0iI%6cHuUPGL#>Q(>QOw_6w1nva1Rr@{_#58*rSS#BR!2%5`H^JUW8LYM5t6CBi-t*er=)B!pCRzmQ8EXmAzy>l%Hj7up{f%TBR9RMK}mW|MUBQmIAG3NCQ{u z0~@L-=DVK_(`hN3LD;F!`p258yoJnVXF-f+t5AL#Gh)z(``7@hIuwzYQrmR zc)bmOXu~vFnD85H!#*~A?<`~gk?l`SGvA3e9BadwHoVY=SJ-fa4R5#MRvSKL!#8dC zfenw@aKLnv&M7v$(1wLJth8Z+4R5yLW*gpX!-s6R(}pkF@NFA**zi*u#-C}@_1f@s z8=hms`8NEz4XbUq!G@b`xY>sH+VBY*9d$J8PZ0NV)*KN4UhBw&odp7*J z4Ii-K9vi-9!)bOs>dNKMGj=^bWWz&Fy*eIF05^{lrEW?MDl)L}pn=caZD7w}?$3;U z-6_4hNBVaqeXvZvWhs-7X+5lf9K$B+5tt0KOO70fdIn~UFN*aWqGWIRR0(`9SQqm;?N zf}WCJu0`s6O4%h}PJRrmb5 z_^R#UZ!!5O(IxNhvJl^;5x(=Gab-l<1-N(rmV7wrDq5MOr<93bz9l{>hr}cKmhh~6 z{AaIRd3J5ML6z`3-J8$PE68eo_##~X9U$&QBAml&o8Rf zpQNiuOA)`st%y_N!&DM}wIVKwN6jr=rU;`J6a|7cB{=Y#TT^ah(4{O`Qycz*UZo|K zr4bejgXSy0s#5z}5VT=YK;n_`5=P-q;YZ;vNhnuTbWCiYICtOpgv6wNp5*=m1`bLY zJS27KNyCPZIC-RZ)aWr|$DJ}h?bOpIoIY{Vz5Z6Eh{c5UB05M{E90pR#sM3f1{>0 z5WMQ@RjaT0=9;zFUZ>_%)#R)y4;0i?6_-lwuB0s$Q};Erf>Je!mQ1^kQj$ap5>jf{=b z56da_3cf0J|1H;JTV!0~UQU|jxL5G^8rz@ro_O86O#I@n1ovX?Ek%|D6Jgeb?QlKSvM87ZZSbtSekQhK$|E6Kmfdw^aorI%W)CB_Qvr%Ely zPU4d~bxJ1VQx}~kYC5eXZ5dN#%<-x;W`ttCYSgKGEhoN8zNO5PC$W*1AoP?H9Z#uB zokwXwW)6_@Nehb%nXU6Aqp9R;lCE88PfmSL3DqbeZN0_i)ooDPv6H7R z`c6@2h2wMb^VRC}YSQXG#op`G&|wOrhLiuVo}Tn9>9hZx^rnZ?tEP>bHgFYj)extw zIx3*r@jc1un_U!h@;@yc-&fE7<>Xw}N~=gWKpz$gIbYHuom%Wl&8hD*)QoU?z14RW zwJP;xMndV|ReH3LQL~gWQbw&(9fQ-39B9gOMvwL+xsn)Vd@y5MC@_T%IE1|lKfkF|&gSBdxJJjbsld zzrtj*-;$G6{j?eC%Xx7YqY$^PD&X#8`vLjSVtZ@HWyzm5ds&J_Ut+hTu@w7*;9jl0+WuC~8N z+23_;()`k9?#x3GPbjc&-~JeK}L)U`k?&MDuWdjps?}#aHhxMYIGmf zCn`B6CnqOXe$&&5OFVir3YNsV)miE3iwoeNd%e1exeLn*`6;!kdKEu6K6rV-?FP8{ zC!hcMK>_b^|I!!-&A;Q_j<@ksGhgz_+~wSSQ@T(7$RMZxp=D*v4D z-v6|L>tB@XtNnArAK#+?S(|^<10RkcF}imB>egLf-?09MZ*6GY7`n0Prf+Zh&duMw z<<{?g|F$3e@JF}*_$NQze8-(X`}r^Kx_iqne|68jzy8f{xBl0C_doF9Ll1A;{>Y<` zJ^sY+ns@Bnwfo6Edt3HB_4G5(KKK0o0|#Gt@uinvIrQplufOs8H{WXg!`pv+=TCqB zi`DjS`+M(y@YjwH|MvHfK0bWp=qI0k_BpC+{>KcO6Ek4G5`*U7UH*S}`u}74|04$3 ziQP4W?B8AfSk8mxfZq9y;9F$LoF6iZ-M*Xnj$BLJ)Z?4mzunw7_4wuvcsKW(dwhSl z$G1FL8JV6uYZ>`1(kHT}ZpO$-{CTAguW@mCWl7c53j#%fa`>UxFRCrAnYZkU(&9jF z*`q0Mc+_&!}WE8Vq;m+tzW+$!l$R#71V7|Zk0AZqhN6z z>opd21qB-j>P@TLP)8`mvaYPG%X6^@^t?zN?XK!meeS#+g*)&@!_eR(BCFW1F#!gsk>1p~c#u=CgD4_bbS zzeUuG!zXcg%f-};a3_RUA-hr8K?uJ?ILLQ+pNIj<;)4aPup!stnXrRd~ya zDoZL#YrH+n*;RilN&{41dB9s-RZ{A$TJEiOc=Zy~B+^}laek9&Kegm&GVMTeF&Q`6 z)jPkORn>Gb(=trW6Yt8E6X0`$Usb$wOqb8}>qxrm+(r5?Db-CO(vLS-D}-6JaPCBN zVjSsTr#yblcyEzi3TZ`=p-JI*|D(o3+KP&*t0iIy-J>}eq8%5mdyV!;rI&PyYE}fL z!fU;0rB^Xhl`r>}uB;BMKJ_1`w~VG{4`M}Rw77`Y;524wu-=uWE351y!O?b49IZ!G z>4#o*ydC_r1=$O3T{GeF-?yBX^Mk`lj~;vLYw0eEI_K=AGC$QWy_iP0dMW2+GEvno ztu0?!T~T_uGY&5;DX$GI4V*b`Qgw+Lhz*%e_*dfYKhUiPmL#fy(-PFc`JVkr%?Z_S z%rWu;cY2k25|bqY{rsNtD)lDD`R;#Gj5=w`;OdmZLFp1k;@dY$slQ{sW`}VNjaNeh zNopu*3|*L@hEC(VCZ&1k#H8sXcYD;ZKtDC4B#HDBm1k;vO`q17{ZYcqSi>9$aK*={ zc*5XP?MiT|1WM)_6t4zN^Qb{nk~{jfChm`Kc2~z0_9^HuY3(MB0I;MlX}Q(V`6>II zytSOJ)E_VbCvUv(5kq|ahsUbnvs0T*NtAN@Z|uz2brSq&?pKBo0k!)_k5e?W6`fh#p$rBZLH)LSZbkUC%6 zSN9*(M-3`*QwMQU2fDpTxpHSJwFDC`SDz@=XMWU|){ErtGH%9vgn7r#PZaF4AsFYo zHyRe7%Xu-zNvnVVKB_-?>_0_XaD1Udt9!DPdLHxFFGz@AU)`Sis`&YR!uj6j<4k?F zQbRvC(1o6)L|1?1@+K;8Nq^;Cn5?|e#alDHMYWcpDQj(#kqc@`;E{~o8&%x%-G@%@t4 zZify%esd{8`b!yWoIFS!)kLKa9qA@b_Tn{N{Ym@RUni3*Pi z*Oe%BD`usgrpcG-A5I&c%QB(>v%&UL3NH6Iw?yW13TrdLxd&{Xi z1Z14Bavf_KCLDG^j2bX4Ne#F;p}?j4qutMj$D2B&Zim-&)t^JF*RMb`(3L2N?VgA9 zp%WA6D;KF@3k&Ek^VBfc`O4HhnOVblL8e^86V&iPD(zzk?PIVS?i!#>uf$D{iS%#k zb13y`_wVNZCuldnLJs9*1ZA9dWBNP&yu=<)=cjZ;_V?v1xqgNDi=FR@;JYwG>^|U1 zajO)@mK4U86xveCl>W{AkGI?J(BWq=>i>Y5;)K`vC+!l(*@fY8w%OGq|1KF{Ih1e> zaWlsERYMj6skoRm1Nj|E>M^dzzD~6AKg4<7vbFWlUo18OFRcY|4-h zLpxLF(oeRs6M7rtJ|-~{mmaGaqsUL{G`C8fV)sQU7jaO=Rx`VGjSWBk9%BQhD-Oa@ zC#lp)Ds&-^>Y?cgYUH%L)JWIus{3q1qSW>N7}6djeX}2ZGl{;Ls0Q7fT&-!bFrG1h zaey(v_+j26e}l;1p!v2R>d?curTyss>el_Wuh5P$$*F_ITTyR_DWDDny2i$Lh+95aM;2Ttu*(=%LpIGl%Y{gmgvglZ>USHCFLZ%Vv)(e0)u>`AZ3pI2%J zM%s$N{zKwvgRC_e2Zqca*x|GWhenGIDD_9oqc)99AB$K=F#kGzOyb;gkn!mSrCxPt zdNO1E%?Yi2_s2EIR>u@Z7eu8CO}l8(HNOu%GeM1;_KoOquI16awJGl~^7|$2_6My> zJ&keN?TO~TEB~O>Z!yl?XWDWJZTV}xw&fPatuIS=`}<10k8#pVm~)T#81>lyP;k5VVO8qHdferUe&1l`l!_)F}g66srs z^UeCuH8N3+4D?qcOOol+{nW^=G2dS6bQ?cfSp%IYudR~Tp;Hso=s>A!bV-S8^t58v zXxGz7)@6QM zrV8#-&5pb~Ulw+oqq_XqUN!iSe7vE{f8^s09sak;$B%SHii0+};JeN-{GmK{)Qi=G zm<6T6AS@^flr2`*@)gOgg?nc>xN3`{{{b*X*tc{w}+L*u_QVfw@&R z3t%)y6x>0Nv!l^KXP`BFU4aekD>Pi!;#1xt_TfT*hog?g9rEU?5EC__%Kb0~_J{PX8 zE>)T0I;X0#wyL6ZPN1g3#8RU!)%L-f8ki>83 zj#*S$rkg}b&Z=TWzX=Zkh*YWjrJN^pj*8B$%`ROQT(P3Grl6*@7GkJVV&(@bE-t5% ziYgXW!nb0-Gg9pGs;aIGR?mf1E(wrnVG5;+%bcQWO89(N@`42punm8KtTHlJ;YI8{#E8#scxLDh2n=VTL+@7t?@rvs7y&4dY@6qz+O86{UfmROHZWK}9L@ z{F9^e=HwSu(~4eHm z>RPTqEG#FTT1inb^=*565sSsj7oAsCRFYS|tcEKOl=?N@2IiLO_3<~_LlMN!&ee&RkDtBlgoV z^39a1zd26P-%M*d%zWE^femGLk@zpcNZKrZb-0y4FNUc}4acy+)cKcki2pi_M`QpfRX$lAEPCLe`0^%0hIjx93$!7jS+tjW28*aVZ{9vjJT&l6rqn8q07Ja zmwdvXN!NSA-@i6r|F>d4vGASA!HI>x{%_^*U!Tqin}9t_pRfsd|MhwMH>B{tyh#+~ znDv({Dn<_=`)vOY;s5zN-?{T7^`|?nJ2~j=@e9X)?HxMAMNB9cz4rCjyz27Tu6S)q z58sT(FC2Qa^%JGexYmS3RaWPm2w#5t-buC%vurrih8Z@TX2WzFrrFSI!&Do(ZFsbg zq4Rq-Y_;JVHauj*7j3xThR@ir#fH0W*lfecY`D#a57=<44Y%0vHXGh(!v-5V@vpJJ z12(L%VWAC|*wAmo3>&7~@N^q`ZRob)(O6UNzD)S82s(Gz_LdD>ZFtCr`)$}_!)6<9 zwc%zPZnEJj8y4EIz=jz%Ot)d04ZSu@wPCUi-8NJ67^?HGPnht$A)*?=`K|O{LVnuoY>z2TssI^0Ps5CKFk~7 z&j6E9R9ctjQiFiYFk8mDR0%L`2)ujz2%N`-=uO}Sz@=>5mx2pCG*YPtzy-dIkvNr? z^BzpW7?<(_zrZX6SED%3!bn;HVC-n(#NG|e!PJqi==^LH96vV#Cyp_AI&kh-(!#$V z*ou*~1b%OvDeq<=dcbs8fp=rX&lX_9cw?UkoMq!J!23@{R~d0W0PMtkB>6c_snalu z{G1LfJ{=x`&;*z;k>Y_T0#C&hh#%nBXaq~ZmjZWUq%6CE?_wkm9|6xzM=lThEZ{dW zLgzKWUt`42R^Z4plzNPp8@<4DFcNWNV zux2J@!A}4;->+am1XP&M*H9i5q}Ku zo3qhD1il7%6GrmC3HTbDjxy{;R_WCo@+mlQyB`@O@W+4y&nHgsrNA{92`lh+8yEOC zM)IaEpqerJ@t+R#V-A5A058J40bU3!!nA^y0H^06j|-jwtipT*UJZ=TC;!x4B9Lo1 zDj+X#0x!l$9+m+AhLL*z2v`SmOz0`F`cmq0Jn;ZeTS`9#KOOiOW+Ax1GcKp!flmVt zDB_F}96fnzCPw0~SfPi2)u3u>axM>fUYuQ9|L?9lY#vkz?5=hp9-90<9=Ys#%~1v4wH@lX5c3np~L6E zd#*6}y}-;0+8cfXz#n2H4=uoPRkSzoG~ksO$$tQNH%9zy0bT<$@m}yXz)vwP;GYAp zt2KBXFg9RtH*gb1>Pz6+LFyO(Gl36cWc=I)jJe7#FR%mSK9xAd?rPc!xWKqorXIb( zKC7uC?A^dTjFeH}6cji}|C$C|^G(WvAAvu_NdLMW*ol#{h`iJYjFiy}T#MO^|E<7d zn62PyEn4NTC7csuorkQM#|U%Z2AS?*lz+pd6%J23o!p~L)!x2w=fd_2H-x7ghel;ddJ2E zKJZK9U*J2xGGnR0`|mYl<^#ZA{Tf=4*1f>ZzcF))z(W|RFM-LwHMqcCm{$B3Y^7Y7 z_rPxf&fEt7cmiz(*l#=I2zWAZHb&~S8u&a$^0{B|M`<(o*$?dVn2FyDy!CNTeX-vR z{1Zm{y9J#5gu%0b7N!nA0`J=a9~}Gv;Q2eD8+ab@SGy=L_`Sf>c2j=vEMQI>x7rku!F9D8!#o%ec zGK}~an0d&w!A)nZ<0X~Kidx0O@_)*|RpHd&#F9hzx$e8d9Fzz$z2zzv)s?#tM zR_^J@y`#@*O9JJdkKh93uFO`(B7t%bM(hRdwsE-&Blk_jUZC775&r^*es1gqiVVK^ z5h(W^1Q#fG8w3|9_YedZ_%j=qy9jcRK4*h{2a#nJvb@yloP3GDZuz`pea_8lj%S3(5)7nyGI3GBTmuut#BUii0J*caT% z*bRKgB%m^W!5Bk+obSTB7)#w<-|pWs#!(55d-VgjkL&tQeT{D_*>P`v7yrcVe5d`D zZ_4C+Z{picB|G1@{f%)UBKcC~OlvZTkSTSS9?AfePDtjx6W$#5ieh1g?xF`iIu4l~P^@(D<_FrG)t|)i> zDV2(N{d~skGWYKQEN?rnXB4}a6Fxp3?K5St{@&vF_+s?0uXX$J@l$Xgbu!p~1)ejZ zj;>F5rYRS3U4j0K-`3aYgzcBGf1NI(fBd*eG4Mlc@$tm3qWGs0TwP!VjsN_L$M#n2 zy}&kj{o7q*BT=DZ3fjkYz1QEprNhd-#ULS`{Bb{=Kd&hnfK<-wUmv=&$&kIpsIeH; z(f*6ey9PKa=C9%a0_cEkwv zzyl9x+>DGbUAk1|<>jdj8#ZVe|LCKS)bZoTE9E?e#|#Rwt}EPJpOXGy%7d~gzDQ*h zl@`Tg0h56tiZ8aad@V+WteqY%v}7^W+vcJ10JKR-Xbr=yDs3=CAEp?Gg_WTfWZ@ZrPNs8OTT-FM%u z?!EV3HTV7jYQlsGYSN@hDlsuprKRD0w6Gs@=FCyq(}I=lfk5@j+`ekTgb1~Ga+rED zIaIAk3sGC=^-=kmk!tz8acc9j6!rEKgVny=$;x+|s5^Fw>iV{*;9a76>=D)P15sn& z7Zr90+istV8eSqQ9eLzYQDeRpHU5aGao>rWH*cPL^wCFER#ujJ`st_DGtWGuR<2yB z)~s2ho_p>&J-&s7g=*u*joOyI{`%|c;G2bN{tu!ymWg`nt+&*>@4l8GEnFTVIfl^#E=4*n?WtFOM&a&hwHNp-IDl=}K7QDtRi>f*(VT2{!`>-@3K zjKP`!LgT&^`v`>)9w>XGGRUditOBw5Ge(B1S(2)jNtW6u>(wFIZ|teM1@PW6nEzAY zyD!DMvk>QQ06(D&zJN4Qj{$xq;0pl19qWxP;4h}YPh1NBun>MB;CGfO zwIA?@0skf7zXtqCz?TC4f(yKVd(3a4jy(*nr3;r}t%LPf*_%+p15K11?yBUA;YyCB zDmj&^-2!yzXY!u;r%Ji za3-lWd?r7rZBJDU$uGk@o~6k>*n3M+GW=mBsVkLay{u&YZYBFmT;MH$?+N%JfFB3= znSfsc__ct41@PMd{|?~MXV&L{KMwe^O87hQc96knAptEsf)<`b3%k(5S7@QEiKrjD ziaIx3)P+=07qdkDv|iLN`=t{8Ho$iRd@$he0{nQuPY3)Wz(3PO)bm|MZ5S?UXR4^; zEK#4Y7j=67C3tthlLNN`{x-n327G(K-vRibCZa}n6_q+%)Z$dMl_jcZy{J$3UxKe{ z8mx}wdNVAne`x>EaD8h?N8fgBy}jEHtgH~)KPoaZJUl8aI5;%i+R4|)r(N5D1KU`g z6~ZI&82=;jAw1mb*MSuV4zxI*M@5H4LDnLKLE+qpd9l3~1W4DTt_iZtZ!!HN-yxT@1zZ z+XoELRJN>q9@e;CoX@Sj{XH67@8;HI5HKW)(NVz=q)X33d-dqjtwA04 zn~x$kVli=(V^gDq|0OSKU~+q{a)R|`a)G)AM5rp zzER;2#K?#qeX2cnX&(a}8QP~RH1wltimuW)?5k|gC~uq@d<4$LcH~S){xkku2HL2e zr6yl4Qw3M^=dSFh7=P}ryYABd$lSPrmA=OdGlSHkgb1}PElh2gAE64D&sDv4!>53q z8}zZLQScq;Gt5N!)KgEX6)RS#RjXF1?Cfl{cI{g2E4=c`E7~7??X}kweT5IVzo1sY z-zbEyuxr;Y^}z=pXy4%2(Gqp^=uvg-*fDkb^lA0oci*WWe<;W1^ddiS7wZbkD0MvO#r~ZECpeR;hAOWy$Aiy&T8< zeQBOi{+JMBJOPi%cIh2}?+N%2z()ao4B%4%{|Mk$0sdvczYF-1%6aC$ehS$4Uq9vl zq@U74IZ}%jEuci$$865OEj-)#`}=p~CrgVKo-JB;^zvxb=yv$S&AolwwexA`-^8PF zhnsNSqIDY|AJlE);pOk=@26UNcl7md)zH5QDm1$3rrTS#Zs+TNLqp%&oi{8N-;Vz7 z?l<}Zro+vRZffD#tfT)8?(Pj6)T?)6hsKRt)V;n%$5uDEH{=a}53gJ6yVdtbU4Q>p z4eGJ|zj$8P6jwL2Y1p8FAJze_+uc^DC7uGL6|T|0U&~v3+W7hV`}qKW^xx6XudSb7 zYd=k2OC$?Y>(=^GWi-ZKe0@}eudK5h%9;}In>wryIOT=dAPTtW>ON#QWx?M+m97Ic zJa+x{1$gbctcQ|4|Nlsrqy9>L6W<$YK@Y)Epqz?4H{qtq+l7yDY(%1`7-32 zkPXN2@jsHtAGV9tO|24n>w!%1x2#^h`fr$bww9Kbe)IkJ-+zm_=jfR;XO5#RId|?{ zDb}UOKL7ml_3ym%&f_>QsJR39C&uejvX2O`}gmLb~sKgk((hmK_)I7*M`o_&*U+m{RO!dax?5zbSp0}N3;dY zqT1u%9Q-bZ4t8f7y?XU(PyB$F#(&SAJ%T+_0e-S&%NC6{_K@V8Z@!Uz`}PU;6m&hp zz(?TyV}Mz`e*OA6n>TNs1Gg_?!GZNl1HYQMbwKuO)~s1K>}}k0=bd+w zcb?(l;l6AapZ^g4XV0D$_%c~-+O+8b9xgd`>Xcwlx027r#l`Z;C!c6MF+Li1j?IxH zN9425KGWBv$z=FE`ZHwi+z&teP!75K1#O=A`RAYI#~*(@`{9QlzWVjoUzeb-p9ljw z{{?;P0UVYP_K)HZe@f6-WhVY6ldmRoOiU*JAmP?)J391oV%59$tK z-h1yoO#{ae`Y#*@?A3D%w=&`S7u>JlbLjA$prN+<+x)_X3xa7#%YQ&XKzqtDGsgh? zX0mnbR>7DHd}gh~90QIC_SJMI?z?yI7V663!-w@}(m)$Pd83|ijELK&??vK16$$=8 zr2D%f{%?u+?GWj_UF5DkB6-I}&R@825V}JBuT9eUZ`-ylt8Lr1J>bJHfxQ%rho*rx zhhsp#k{*r)apz}_|Ce8WsWU&5=j1o>r7VyZ;!XZjMsvOs3CC}Uha3>;i!JzGh#7R- z4H|ZdbOa6U-w^SBO=QXEhz(R!tgH?4sH5?RtrwGtzsY7SOnEJOLOr0o{OwDTfrs&( zkPpFs(tt7O`JTv~pdsmF#5*dm-@RX?%Qh`m*jcPqYL0zU%JSlF-MV>078a5YjDx1f z(7}?tq#Tj|HPJ!7ljj^G$_?e8b{A_ljnFXQKln2T4gK*w%pl;}2Q*+mSyDh3@lQA? z()M+STGR@A@E>!A82eB8$9yErW;|FDe=g!ZWTlF8lchJXwAjVw(T-(@%nVrb;Fa zCL20x8WTf{D;>Z5@{8<$b(K6fJ4%+P2Fp{)AsVrJz7ZMuwaD-zBGIJb6Q@2yX8IX@ zrcHuA(ZEGhSt>*{nE`J${- zmP+<+kQZk3liX>6@@#sLrhx?9ds5_XCk-(rB13@FAka{$&!oYr&z)(LU{l+{Cbb3) zURxZt70t}6MuW!R+uOU+{$q~kJpa4#p#E|`Fylde;I+{c;t#tg+n>H)Y_s~w^D_b^ z2Q;h#4NS4HpJPG8XxR9_9u*-CMxRN8(P!GEuJ3^FZ;Esv4dB1!Rgqz^Q%E1wgg@-P zmVfBl68b~bIYWn`g=4_^z;#RvEi8#Y?c~OJp;GW*U&#Xv&w+;QsSfU~+XjjIOxS!Ox_D zX>&$zd3kmpDR`i-yf_myOb?XvWvAq0s55D>f(FFcHU&d#gZ|O5Iy_VTq zHqGrV>p??4XjlgtUVkQ8&Xq!VYLQNY&P0q!0Ox1WV0;XpZ4Tfn+=uRY4Ag_XkjdS}*;q1O*2MyKr`QNZfS&5;t zcyfPPln^EhCWJ}G{o(TXw0q>skM{{_aP={?KEoz4)r3Fny_SFAvxK-4FP6lKcvBz9 zXEP?W@vieP^`3>oJ@=u$=IhcL~^SX8G#AdSz{Zf<7c(A;Zo?u^A_B|Ub zI~Mek*XMx-=)x{0V`4?zd0va9z4G%$%=Ea3;L}`;kU3`pJp!Z0>v;V~3$ba9y zecKZU;)zosl{9c%TodaM756re|re>D%h*vMBb|=`@C$wv1Nl8h2h%5DxIxu(cTupf=VBQ`uq>4K39XgqW?quIrf7F4dOV+i!Z*YeJ}bn*dLJT z)2CO`a3wmfG$zD{HfaNG($(}CG%(e`>zZygC!cWEW(RDi`1tsU)oK--%@F!^>FMb* zb?Q`Eym+zJYi#*wyF*{7CR)gQ&JDCx^o8h;ay`IAeJ*}}npFIZ^+xV=JwLnp7|%HM zc`0;(sU~F2J?vF9hOhruTxJ*6CSE+mh3JsvIxULgJ#WY5~^mwXK90(}hX zGi}oHnbAc5s_QT8{XL3M=sd~~WIYS({vJ37V}}k4o(X%oHuYrhBQVYK}u z?!=X2L>f%yJ@T8f$8`>UJB|hQfjX`A8RNkD+2}KElB+)N-MpH9;0nX*E0w)__kI#* zdh|XB`*!NG;EbZ+Op;(vOFDGuAn>g0PJWRQ#k3?PJenb)0le|YCiSq<$sUd*{KYhvZ`lI_l zYzw-(278nx4?g(dZ^RSlMs=o68yY%x>?k<9rpJME24$YUkD-J35`W4(>EzmgCG~+i zLVYk}!jdvb-^9#4Tzhl<40-uO`=8V;%0FZ&8|TFiQBM&Om)Wyt>v13rw5!-#meHd} z>-!u7(qJ-aFza5fDd}TV?ujQ$$`ENY^2Ph~spxaVmi!ZYPd#zY@CmLVt_6R}Ju_vA z`^}_@xN*-JXYaKBhJ}SmNJxm_bc!AaJ|~Q!fu)fvGbTn)s2{}Ll$0Z`87Nou137kP ze*^e4+;$^!ZIZU1pnEYw0N&u?LhADyZ@i&tAb+@T2>sAB#Ky+TkRd~~Y#}DE@h7jz zbJ9Y*sRy(_yw5cP<%hm@5%hpMK%HQ_w86mrH?*_R)6+8qf3+9D>(57$J@#GQ1lUcH)o zjBD`q`ag<0Y1H@|{~!EbNE(b?G_)8RSd!ngO_;m&I)O69xz?4x#Ff{?pJQWu2*!0N z_mm~_oH_)Xu?%=z3+|QpyUIUpgzI?JG$y2rd+cM!juo8C)$(n4?pm@QWr?!R`&u}oR3_`guLCfX_G8pzFf;Q`E4@k zrtDC6=r{42GQ;*b7rim`qE#${{#Kf>tD>@3rP$4&(hGr($K+@Jf(f1E--U!c#q>i z+etm;n9&w7mcSSkX(8Xy$F|t9#CH?@5G;a0C`-C?*FXJxKhxZ{51QYuoIR0KcsCp1;DjU`1+*}*IbuB6Dyk;Ga1!bOmCXJMJ z$kA``5l&#NIIr@I#UGiQh~L%H&8WaL2>&lL`{3CJp40f#Nis3H6wR1Xq3X+T!82wY z!S{2@93?*K>;GI?$Jw5nv&6Sw&>zyDEKPf+eHXkl**vbdJIf<~rp$2SDUQ<3S=Mou z^_^v7XX)iEgPmoDvlK_^#**i>EXX0q*LY5=EnmcU=OJSkTrMEHCSEh5 zQhh%V&DEILmnYVOT`=cI#l^)9hrb_=J^xVL?}AL9`&Q&iIc3{ll#5J9tY^?iju;#F zf*Dh|6S1AK*c<-nM~%{za3HNM>(#5*3v0Vn=yW;l8GO$3u(u~M7kmf1^eO!F9PE=# zf)5;y`gjwI@`k@rIsq{b#>u!B8iM^>#=IFXK6F;37`t-#J`&USsDHWC3N}0!eU{UH z(nfN!n+48!U3{|38y7B=@F?B;81m@!kv8yV+fe1&`Bj1PTyPGlcwuSKlai*_3O z3bELG8buuFJ8|vF`H^;=a}jMdeOdY`e8$gAV-Txi%#*P;#&~#sfiWt^cNq6)jE(7X z#N)mf*8o_9CSkoWiSsY#HLi2nFa2op#7V#Qog6JX{xV*65B6>u?_;cNLz(N-8b33L zO*_K$csCN)Yn|4m{68onXwC$*GG4{lEn|j^J+F4g3#k)~k1$r4 zi5QjP0XuWG(Tv?9Rmwkg3*YTcg8iRFU8LRNx`1mt@`SdB{5W^w6WQ~x7#%0z{xs#0 zF?{Y#8=YXBiLpM$$ugWcu(OyFM;w1F`u_YP?^N0#FZ!31LFyrWewM_8nfzcT9^@0p z;Y#V?&X;t|l(D*nz=847YUy|OkNrRX_~Wt9KKtw_#)jyR6A$v7>uRp4xo=85$P3yd zK4W71mgfMBPShlitml-qnhG!a*x0W~!hTC4`S8ROPiVVGyUY2H_Mfsqeoz+KH*sO2 zPJDm#keoUC5p<%OJVGZZk4!anY~-Koaqe?)PnSIA`U<+J*IU$0;$+6hb!<2mZ)L?u z*|9@X`t?Vb6oLK|p<$tHh>0@wCF3DOIHUtF)b;Ew| zEYg8EX7adkZ>-xHbs-IbCT z*P!q}PBE6qxCFjuD%^i14ymcBn(wp+oCn#qkpcEayI^z`^F#&WG7})n>F|;8mKnt} zPgh%0d68G({nCjOC%(-X5BKQtg@55#FusO)S@%PKfP82F%=F3VqnQ$O)z9GPgJ^3t z;uUAmH&RZ|A^nl;(K(X*f-ncI1>lFCqVFC0U0`UsK$*rFtZMIfb}Rh^pj{WcrFop z;n`@HYlYe*ZGUNhaE^Ww+bhAIJm-Ac9L5&#&H^1{rd|*~Ci21T@zP&rOoe_sXjq9( zYuh*R)BPKHCSRF}2Q&NQe1vx-XxqTEs-&GV$MGVsNjGgW_FkUkx zh41XTReoRBD-*mxc0*RR$gF2zya2)+jC&?$;4`yi*6p-N{F;iX%%M^>{3D>}z9WI%^=lpXX zJf3J??Bn!_xf7NN_O~$0C&VoZ+b2MB9qZvEUKId$Zq<|o%s4<+dS&l&ll?9tZK?r<#e z-F3}V+G>vFmpgOh<@p2kdG1v+2g{z#o$5az@U+v!o9&Pnc&_z{b2j&r2+MUg=WfJe zs=%_Hx%KU#9>}VWGb@yr%cc(NGdE^kH*92DEFLK9>Nl|AU6vk>E53j2Iy_??cm4LY zI(X)|;=9-C;*CbUvgkLj)pORw73y5?tZC72U8|3GtI^#XrA8<#{zl+EEF@D zBo(icQMW0{Td*RhtobKTaGVrvWM! zc(QM%JMl|jm)akt`%QOgw=3SX&fGBOx5+1(Bc#q3a4Tj&>i*Tbf0)H zwrYd=LvTGo*Cc0Bz!Oq20aQ;#o4>zjfioS3FIHMG3bp4~fW~c@vu%zXaWiAbE5|5Q z$1wyh0p4^8xMX!dxHKME)qc#l@F5?o!dK^JO}ymhwi~237Cjp*FG(0T;puMt6;CNg z>7XSRm|Yt826YST_KQtVk4qdkWtL@T;*_NHK<{a3Nqy4CPmD{9P4ASLFg`6gJvn}A zr}4>&ePYuSJ5TTGZApwxN{Ek3H@~DC=-st*7w@2(8d@yVY z&)@JfC?+%}G(0?V=)lpV@qr`7FJ&LjIfCDJD$8-t^~jCM9i6K@@Q!KR-@WGWniFfv z*SKeUX8UFbWDm+7ojoyoX7-}&W!dYpw`A|mKAe3byFA-H$1{h&+;9jmYK_O5%omsD zEz4Vzw=SG@($-6$vcr(mRFvqZ0o2SiU^R;!c1=vDtgKROj(YE_+ z6KyHBnYK*ZBHL2iGTR#4I$NP_i*37Yw{4&8u zG4|2+`|K0#DfXH6O#34HQu{Ld8v8nXp?!;eyM4EPpZ&1?i2a1U%wBF+`R@51`JVZf zeBb;o`2qPM`GfMe gdwLBF(VW7cOzn~x4AFIr^XFXXzV$|h#=64)08aQtDF6Tf literal 0 HcmV?d00001 diff --git a/windows_module_compile.bat b/windows_module_compile.bat new file mode 100644 index 0000000..f2ebbdd --- /dev/null +++ b/windows_module_compile.bat @@ -0,0 +1 @@ +pyinstaller --onefile run.py \ No newline at end of file

CM&4)k)3+jCC3ekJvTAY9Ou5aC>(q$nXUc5k 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 diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc index 4712a4f00011486b9f08e524010508ad7f1af8fb..3fcc025b51095d52c89c464219dc4ebbaf3174c9 100644 GIT binary patch delta 20 acmaE4`N)!cIWI340}$}3`)uUCE&~8PYXv<3 delta 20 acmaE4`N)!cIWI340}#BelHSODT?PO|fd)PR diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc index 17811d55673b1b8f77fc49492c27d748e2682c28..d5d768115f951d0b05a7c0227cabd6e601d2f30a 100644 GIT binary patch delta 20 acmcZ=bt{T{IWI340}$}3`)uU)*98DS-~{*p delta 20 acmcZ=bt{T{IWI340}#BelHSPeuL}T1_67L> diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc index 19d55465f3484c9a14e1f09d4428053f0a246a18..a27e9b0fe2374654d635541c52a7cc4c9b4f9a79 100644 GIT binary patch delta 20 acmdn1y;qxiIWI340}$}3`)uUiBnkjEqy(z~ delta 20 acmdn1y;qxiIWI340}#BelHSO@NfZD)x&^EN diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc index 2de7c6f2020209c99e130b3734d991e6c659e255..969654f3fc4c1e1fe604c613fb23c373678622a0 100644 GIT binary patch delta 20 acmexd`?;2TIWI340}$}3`)uTXVFv(7#ReJx delta 20 acmexd`?;2TIWI340}#BelHSPu!VUmX+Xou} diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc index c2daf27542f8761fddf86325e5b554faccf62136..2c3394cb1154444b3e8bd0eead9b85b2565aca33 100644 GIT binary patch delta 20 ZcmZq6Y|G?c&dbZi00eyMJ{!5KO#n6H1fc)` delta 20 acmZq6Y|G?c&dbZi00eKVq&IR`n*abj`30f? diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py index d30d477..6617644 100644 --- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +++ b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py @@ -9,6 +9,7 @@ from pip._internal.exceptions import ( HashError, InstallationSubprocessError, + InvalidInstalledPackage, MetadataInconsistent, MetadataInvalid, ) @@ -398,8 +399,12 @@ def format_for_error(self) -> str: def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: if not with_requires: return - for r in self.dist.iter_dependencies(): - yield from self._factory.make_requirements_from_spec(str(r), self._ireq) + + try: + for r in self.dist.iter_dependencies(): + yield from self._factory.make_requirements_from_spec(str(r), self._ireq) + except InvalidRequirement as exc: + raise InvalidInstalledPackage(dist=self.dist, invalid_exc=exc) from None def get_install_requirement(self) -> Optional[InstallRequirement]: return None diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py index 145bdbf..dc6e2e1 100644 --- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +++ b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py @@ -23,13 +23,14 @@ from pip._vendor.packaging.requirements import InvalidRequirement from pip._vendor.packaging.specifiers import SpecifierSet from pip._vendor.packaging.utils import NormalizedName, canonicalize_name -from pip._vendor.packaging.version import Version +from pip._vendor.packaging.version import InvalidVersion, Version from pip._vendor.resolvelib import ResolutionImpossible from pip._internal.cache import CacheEntry, WheelCache from pip._internal.exceptions import ( DistributionNotFound, InstallationError, + InvalidInstalledPackage, MetadataInconsistent, MetadataInvalid, UnsupportedPythonVersion, @@ -283,10 +284,15 @@ def _get_installed_candidate() -> Optional[Candidate]: installed_dist = self._installed_dists[name] except KeyError: return None - # Don't use the installed distribution if its version does not fit - # the current dependency graph. - if not specifier.contains(installed_dist.version, prereleases=True): - return None + + try: + # Don't use the installed distribution if its version + # does not fit the current dependency graph. + if not specifier.contains(installed_dist.version, prereleases=True): + return None + except InvalidVersion as e: + raise InvalidInstalledPackage(dist=installed_dist, invalid_exc=e) + candidate = self._make_candidate_from_dist( dist=installed_dist, extras=extras, diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc index 8f919f72876f8a04646750065e2fffd263b4ab6e..d7becacec7fe2cf2601e8e68ca18cb1340c7e32c 100644 GIT binary patch delta 19 ZcmdnTxQ~&0IWI340}$}3`%L8C3;-)C1SJ3f delta 19 ZcmdnTxQ~&0IWI340}#BelAg%D82~Xq1ttIh diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc index 4432f85c75812777d57e37840b742c97e267275d..04eecc9c3f248aad9b18f258da5422310c0371ed 100644 GIT binary patch delta 20 acmbQJI#HE-IWI340}$}3`)uTH69ND&=>!-6 delta 20 acmbQJI#HE-IWI340}#BelHSPOCIkR9{{I78) delta 20 acmdlezEPZeIWI340}#BelHSO@j2i$r00mY6 diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc index b508e8b9b137b48d6a54342aa38c0760c28d40db..4259570591a2bced3f3b550da8952caf5322d964 100644 GIT binary patch delta 1969 zcmcgsTWl0n7@jk?-Py}@yS?meOWC%xUAJOUXc43c3Wg@&##owQ1(r?cly2Eu&P);M z^?`&&QzIV7iX8h!Qu5PrB2%0wl`1rB zdd9`*L#AMQX~Vc|YS-k^M$<31Z_U#0!BaYSz2Ccz_NA-J%JmVK#vJW4VFOb{cC@&BklWXsaeve(Foeox&Q)REvmj6Sp*12 zPeJHfnrsg+TT%5RfIk+5%|Pq@K*x`Pj+L%bAYKl{`FYQ@j1kw)%1fk=wZYbrvDPGu z!Jc&j)Y3#wH^9}-6zK4S>Q1#E6^8gZwRgVf)}_xct>jj6<&OSRV4xfrs06)XUqyHb ztXdoEK|gVX=MWMIL4Zd!BBK}Kc>pJr9-@nBgWAJz7f2w&1Vl-GfAjIU{TNR*%VMb#~!KN0vp zo)`EXUs4*J5%{;>h%RlrwES;hr#~`7O!>0FLbk?#_O*=c55?`7->cL3a)8Rh~SZjMLLx2-rYN0dPkNhVesxtM3HR zXHamRf8+1#@F>P+eQZT8)pwWcyBF0(bwdl@h_f6yQ7?*Q7Js03jnXn>Dld-ZxWq%KlBReax`DC8fF z4;Fcu|5|q%92^KOh2KF3uBC{UV9M`@+LU*JnB{+ljzEzI>kWDS9O?}LBqW%}yiHk= zQ9$;XfL%bP^dn6#!)OeBF-)BK5#B=35b&L6c&*_kU<$5(b{2Q&)zPe}VzIz%YO=u# z$VJzVFJq;~s#QJyCj3`)5Nod4nP72!Ezqo!klT1MnM}w@Scx{?8=07A_}Dm}u|lqx z$xwc;=e!!dBLyxaXP?_jQAPG#we;t?5oDx{3qj7kB@{`B+Mmz VTfRMfS97;dLd)8TXqdRq=)WPax7`2$ delta 1475 zcmcIkO>7%Q6yDiCd+pt|z5d;pG;V3yZmPN=2|t1cA`lWS!lHyC+5;;qGf5r!PqQ0Z zC2bOkUJH!|sYiMvLL87Hae)gbE`TURpsvV;6C5gX0>p{;)~GH;Ju)kOJMVqpeDmh* z*w<(GX6z3wD<#3WyINf$#Vxx+e%d}HYu(+*Qk`imM-z*(i_&<|By$#3 zYFtw<z=G=ELI;2P54p_Tur{@E6`E0zlnI1~pZ0aq55oK2U&YlO=4 zlIMzJ@;Q+-VrL;iu-;u~dMD?_J>J7?7|$uq0k+Est;YLw_S7ka^Ezv0P|zS!fP zW*8}L*7cM~u1|98U!-=M9Tq4st<^SpNzCih`WQsP8FAN`5TELY%?gB`7Fj-ciC^>s zmW7FAyq-TQ@`;(3YPcc^P#cUnUVud#3xNIrg17 zc1yi&j_;b|;=RNgsqCCjuM!>0;}hbJIYmmsv<_-dL830EtdB@V>{)K&6Nqn0SHzrA z7E4A}9Jc56@)bgrx5WqcA@Qqi`f7up09B+9I^oH@j;@aZcq*SpDiwrH9tM|M;l;Q< zj@x+J;B=3p`U!+55hefv4In-xbnC55HFXN&7m%RholITqW}b!jSwz(S7Zk-pNW&5%VpyBxAEh2m!8 zG-ts|JB&y_GMbdO!d9;v@aKWLS0j7}VLD^lX-GE2q;msW_l5Iw>gclJE1pK?;c(LHVVWF`Ny=4k z$nU4Vtxn(0&g^DqHm!YKCMUPG?FI4qBd5jj(IZEa#JQ#HOYquOx92}L;^~7>+PO69 I5EYO0H!b!%3jhEB diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc index 91776810181d39a0d08173fd476a84598db3d7a6..4e0d25c623ee19619fbd3a2c99ef72063cfb6d27 100644 GIT binary patch delta 20 acmX@idYF}aIWI340}$}3`)uUi!2|#?DFj{s delta 20 acmX@idYF}aIWI340}#BelHSO@g9!jQKLuX^ diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc index 4a2ed18e52ff4820459cdc60969463b817b87567..0375e9a0c89eb5a22425ec79e45bf448c79a8bf8 100644 GIT binary patch delta 20 acmX@9a#DqRIWI340}$}3`)uU469ND=g#Ayad+( delta 20 acmca9eN&oyIWI340}#BelHSODju!wv(goN6 diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc index 59acd4e39ae51d7200be047ac3e76b07e371a965..0c955f5056c41d70bbc2b2dfaac47c09c3763d5f 100644 GIT binary patch delta 20 acmeAa>J;K$&dbZi00eyMJ{!6JaR2}+^8`=; delta 20 acmeAa>J;K$&dbZi00eKVq&IT^;{X6M2?bFA diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc index 428bbf6a9b4b6a460700452de142724e5028d871..eb7fa1d8658f91dcad274dd11b67404505b46975 100644 GIT binary patch delta 20 ZcmeBH>{jGn&dbZi00eyMJ{!3k1OO~&1N;C0 delta 20 acmeBH>{jGn&dbZi00eKVq&IRm2mk;xeFXgg diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc index 16d81d95df3502ca26c071dc00a9b634911f46d1..207920e010001f60ad6bc3dba6af475c7884e101 100644 GIT binary patch delta 20 acmbPWKf#`RIWI340}$}3`)uTHl?MPZb_7-c delta 20 acmbPWKf#`RIWI340}#BelHSPODh~iSj0IN! diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc index 05e6736ebac5f45aa2bb44c6263f1801dc28288c..e807ebd39105401f3fdb38485173c53dd451662b 100644 GIT binary patch delta 20 acmbQmHH(XTIWI340}$}3`)uUqX9WN%cmr?% delta 20 acmbQmHH(XTIWI340}#BelHSP8&k6uBjs$T4 diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc index defeb78dbd8ad988197a544562417a5c79154444..081326fd212d7b8100f5d9b38839648a5689586d 100644 GIT binary patch delta 20 ZcmeAX?Gfc(&dbZi00eyMJ{!3kxd1BJ1K|Jw delta 20 acmeAX?Gfc(&dbZi00eKVq&IRmasdD_?*!ri diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc index 3a78b57e4690168fdcaee72754451294bb2f2e93..5dfd2c9c69c6f6edcb89a9ec1a607823a0f6731c 100644 GIT binary patch delta 20 acmbQ}HqniHIWI340}$}3`)uT9Qw9Jro&)Ou delta 20 acmbQ}HqniHIWI340}#BelHSP8rVIc$v;^z` diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc index 58326ff3b0205b84b404b04f2edb289ffee8127e..fc0a59d95941aa02b8334b058475a9a63d2eb6de 100644 GIT binary patch delta 20 acmZpyXsqB~&dbZi00eyMJ{!5eSpxt#J_R=b delta 20 acmZpyXsqB~&dbZi00eKVq&ISZvjzY^R0cQz diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc index 51f17aa0dbaebd5d2e0dbdb54af12ced0f4328c5..875e1e98b5349b11002616afce09ed850de7c45c 100644 GIT binary patch delta 3657 zcmZ`*3vg8B72f}D?(QaG3C3&)AqgAEYXf=kh(g2|AOXT)9A1GEF>I1cvasx~XYWD? zj|2(N@brKnG()fz#oB7Ub_5-*PNh=>DRg9p-j*5E!49@#gB54AQ|LMW4Ubg2lYIYq z|L1?)^PiJ1D{sA|41US&PO#B$aQ^I;FYA9jxH|>ULA>%O8~!|{3~MS9Q`af4isOpS z_6z#Ae(UYJ3oi~yNo!VCs4Rjs-QBOFVYw3{o>A_Bl3q`haN#vi0p_L#%Ye)}ZGA4A z%hP8Qs`tu}5!=+u&Ox2)uMF{SQ?Gb3E@hUUR4;fcE_y0H@l>8Lx|x?hNlTk(GYde=#@Wf zk|tI%>^H^_pJ5m88f&w@5uyVlUZ42AaoD>?IJU6ORvb36P~Ai1MPug3r$kyeOLr2O z@zrfjT0{?oLnj1m!S_aa)%_&DYiof&Rt*papMYZ|8ZcQ@2R+;v4hP{iQvKUzVBs8*{`x>O z@DVQ|(YQ6bN=f14@YzjOk41u-Xzr1*uBel^M4;4OBoW_txr(qP(~ z!oetCJa7Mbzm36?Y%v0NmrM~m@IuMk4(YQA_m+A_unU}GKQ$U?*P>Co^z5`w(Q@_T z7o~M>LmKJ+#-Ikj!hA1l+jx)@Egi{{MRnHSy zW~_MVx^S-{lG2t}>W}E3I80O;YbSP#iE?LMTBtd?I-s}u?9#-HYxGAo=pd*5Ec+K& zz`+?FH!8{(DdTrB{|v)S293asTNz%ZnF*lr*c^Z;)R5R02bbC8&v<5XzNj;9Ox~}g zwXXPf65*?>x3QlfN6EVmgB1mKF`nxIk!Gm=^OHJARI> zm09ZFh>RKCm3EOLjRkzkK6W~yU=+T@7p6Qa*5TDD^)4$GiKb1>&g>(j_SAVgX#SN8 z!5@ieP^^WT!p(tDOBZgOx@_E6WMR4@5GIwr1~w53>}7q%l}yPm{W?<&YjD`KP2#%I zGi|bP^X-wAw67=ei>j$&C;Fc)_#vis|(b4VYBTp&Q;qjA6i@jNgxsb zIz3ArLgYT<_H;!Qxrw~aH|~2;34_@riJ;wHUQ*%{rrH#ag>-UGX3c|GJTqTSBeKU> zJhM=UG~8U1?@A;ArIUL6uuUCCZB3LAQ}kr=j?K|fTXV*(`V08#_k~hcD1~ae!xM=hP80dTeW;C36|&M z2epN25s@EbUu~PnG6GK=Q_}C5yJ8Tuvglt|&fFqL7P}VX!nw25Nko2%$LF3(>OXs) zj_O!4hUR6clZm;Bd*&^6_iK43cm%(lH$tr-@;f7ae!OsV5MWzMHw#M_q&nnexj1`4 zv12O9|0A$-!5LR2krX=%=hUT%cwAohMxu1(P*8>W3v<=!L=G|LEX)(bWtMztOebiO zpub52)>8SJfzK`~QfCq4F+N=Mh;YcObpzGKMIsx=FPn|i0&>y~EKVtU3*y9_9n+!6IZ<(6QVHYqAB9=-5m)1qh%WGZ9HuCO2&N7A! z9R1{Or(|#0@ck#NCKR%2J^`(m?X3^haCxCJR6A@yNpYO)Aq5!vjntG89)klk-$uBj0J+t4Xax24U-TsLE6VPJer8jVJuSS%K-q_ZO!YDi_c*zKSLu!6GJXT9>X36 z*>&eL#jQ2;GH~B(s>_05zi#!pr&(Iaz-=&aKWMdEvX2|X?57OeKFRI{I=B-7?l^!u z2jB+5dcKR8y8B9keDC;O1b$+yLd~z4tk$xS%YqDCQlXShxO@VaMc`5hT>0do0iVj9 zH^u1PcHCY)NQ~*T5nPTR)Mw{0Gus-+m7gqovqaKY)%ZU3j-j-^VYex{pNO13g~eG$ J_s(BB{|ki>qVfO$ delta 3880 zcmaJ^dvKK172o@9zRl*b3E*xLmV{&_o3J4v5E76zNPvWwPBgs41R6HkFJa9lyPVxM zB&dY)C=^t}5ezD$K;==eEqprSqfSv7rp0N|QER`BQ)jAGiVje;?O><&ockp_M7w|d zzVp84-h1x3cV9ZFoH(Rp9CSERE%f`ccU1eyWydnMI`OsC6eU;S&zx07$*eMear+Qu zvBagzpgi4zmsA&iJ|Z1E7H8lmPFLBmYo_<74ADWQLuDFr;;tc?#d3cd7P-baZj>x> z)rxd{$~86z-0U%uz)@bF~qRnot>&N$*@~L?w(^6Z|GO@z7k>`UdZ=}Gy2Ga z9%0+eHd}DOQ=;}0`GJ1g^COY-2umL&Fj8oOS~MPtbR8D38K;dYP%qKP;>L#nS>or`}dcHyw% z-I?rXB)4nvXdo7Yop_=+Pu)kdE4op9O4!#E>9fHmJm{NJ`6Sz>E(wGaS{*C`}mD!;3HnbF#Vx%wThEh+GjP?cp@6s3~Of~3LEkL zvRW|)-Q)L_52{JN8eV4CI<{Bf75W&~)<`&}5LGa^m9OFX@g7l#j`A5|8{S?1icR`# z#LNk0Dn0wmDllEWs7+W>_M$Y32U@}!oFaPAvPN1Oc2Xq5fw%^z zNjFOWe8R(4_gXf)uBb|g2L_+sSLqkFGt9q@zp3)7XNmOdf3G?x9BbG>G0W;5{CLVp zQKw&-vQ^wB*W0dj1!LWz_)4EunixqfftUvC$Z0U6!D)}>;0z1&Ur$}COnQv@4GeP` z+6j!L&d39rkqR1rgCU5)JQDkoz+jU<6;0yH3m`2B>c}CN0GnP~vH0{<%Fx1t4SQtq$E!=kfy8eShW-W|^7U;Ye0@0`j z@W_W2Kvt{bbS(Oy5M-&toheQ4h4BmoCD%^t0eAaa-f@N7kt zWfFOgOZ1AUfnjVioS@h0FE95ALv4*Dy5i*QWQ_}-pHr;5iQK3EX-iF_9$^{YjJ z{(1dg#eL1(o`A5K#o)a5H$8^LE^M;2F5`y#%0v+!zpp{2OCvRK;LA9yah&jBbz`My!&QybY#rQgEcmO& zvJrN+xQD|kz)cyJ;)TYNTg#|UV&%m5Sw2e3+@7?>zsFKCHj)AR4JFLqV&zU;>%rH>+)%yd*hu4n_+FL$fW zWarmAmk%hJy_^i6i(aLy6V{`1h2QZ8u|9`vI?#qqE2uKCCL%ZJlRLI1-66}CuC!Q!dXQmnrYkrUZ*GRoWa6`%JI*w0VfZP-R)%d1kKnfv zkJyf$=yLsL?|3=?p~>B;lnmF^bR(^>SHLaG3X~z z%tmWbz`s7T3ZB4Yt0szPu`TYwBsfveE-T7Vr1gnK)BLxS{1 zGCzkn&J-5?k%8Y|01W(|g8SJlovz4msAYUK0Mt@)^-CMx7Jj)xoDEbkbQ2iK^v_@( zy{zB`7S%Gyj$c7hpq1Gm0e-WoXsuj}LKX!WS{O72FGCSSKZE?kP|OtnD}a3r#|R9y zEgT8N%_sV4mdaP`ai(M=9mkY>Y?d;`PeI@}o_t5aT7DA&zkPt;Fu+e0^C3~r)YbbM zYMA948u+p^FAKg`<&7aP6X2TyxYxr3Hd)0KH)q*=fqSjoMc{23y502r%?GS?!$s*u y3&Dpe=@+g1&GVSw3jc|!7s@65v6^yG9Ws>Gm#h}W`<^JgsIYjfp1SS% delta 20 acmdm&u`h#rIWI340}#BelHSN|Yytp8l?BKE diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc index dded8a42b49ebfb3668aaddf38c98b0d714d6b14..9db6c949123487e17bf37bff645d3312f24ebbbb 100644 GIT binary patch delta 20 ZcmeCJ?5*Tp&dbZi00eyMJ{!54Yyde!1l|Au delta 20 acmeCJ?5*Tp&dbZi00eKVq&IRm*#H1QSq0w! diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc index c4157586dbd80b5be724c1bb52ca834a500d1a3c..2d9c017c885758dbe90f3913441632c93a1a3323 100644 GIT binary patch delta 20 acmaDO_(qU>IWI340}$}3`)uTX$N>O3M+El( delta 20 acmaDO_(qU>IWI340}#BelHSPukOKffT?P06 diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc index 66181be062c125330c502c60a2ae1a0fb41144be..2a01c4eea8b7644d35d48b3af6cddf7cd9288295 100644 GIT binary patch delta 20 acmX@4c1VqTIWI340}$}3`)uSk7X|<{wgfH! delta 20 acmX@4c1VqTIWI340}#BelHSN|E(`!W%mpt1 diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc index 5bfaa286b7f77d57655e0cde4d3f6f42e3e01086..a35767882723246af65fab010e2d6393046bf83b 100644 GIT binary patch delta 20 acmX?VcGQe}IWI340}$}3`)uU4k_G@bb_8Dl delta 20 acmX?VcGQe}IWI340}#BelHSN|B@F;Rj0Io- diff --git a/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py b/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py index b6ed9a7..2e7b745 100644 --- a/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py +++ b/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py @@ -12,10 +12,11 @@ generic_tags, interpreter_name, interpreter_version, + ios_platforms, mac_platforms, ) -_osx_arch_pat = re.compile(r"(.+)_(\d+)_(\d+)_(.+)") +_apple_arch_pat = re.compile(r"(.+)_(\d+)_(\d+)_(.+)") def version_info_to_nodot(version_info: Tuple[int, ...]) -> str: @@ -24,7 +25,7 @@ def version_info_to_nodot(version_info: Tuple[int, ...]) -> str: def _mac_platforms(arch: str) -> List[str]: - match = _osx_arch_pat.match(arch) + match = _apple_arch_pat.match(arch) if match: name, major, minor, actual_arch = match.groups() mac_version = (int(major), int(minor)) @@ -43,6 +44,26 @@ def _mac_platforms(arch: str) -> List[str]: return arches +def _ios_platforms(arch: str) -> List[str]: + match = _apple_arch_pat.match(arch) + if match: + name, major, minor, actual_multiarch = match.groups() + ios_version = (int(major), int(minor)) + arches = [ + # Since we have always only checked that the platform starts + # with "ios", for backwards-compatibility we extract the + # actual prefix provided by the user in case they provided + # something like "ioscustom_". It may be good to remove + # this as undocumented or deprecate it in the future. + "{}_{}".format(name, arch[len("ios_") :]) + for arch in ios_platforms(ios_version, actual_multiarch) + ] + else: + # arch pattern didn't match (?!) + arches = [arch] + return arches + + def _custom_manylinux_platforms(arch: str) -> List[str]: arches = [arch] arch_prefix, arch_sep, arch_suffix = arch.partition("_") @@ -68,6 +89,8 @@ def _get_custom_platforms(arch: str) -> List[str]: arch_prefix, arch_sep, arch_suffix = arch.partition("_") if arch.startswith("macosx"): arches = _mac_platforms(arch) + elif arch.startswith("ios"): + arches = _ios_platforms(arch) elif arch_prefix in ["manylinux2014", "manylinux2010"]: arches = _custom_manylinux_platforms(arch) else: diff --git a/venv/Lib/site-packages/pip/_internal/utils/misc.py b/venv/Lib/site-packages/pip/_internal/utils/misc.py index 3707e87..c0a3e4d 100644 --- a/venv/Lib/site-packages/pip/_internal/utils/misc.py +++ b/venv/Lib/site-packages/pip/_internal/utils/misc.py @@ -129,12 +129,7 @@ def rmtree( onexc = _onerror_ignore if onexc is None: onexc = _onerror_reraise - handler: OnErr = partial( - # `[func, path, Union[ExcInfo, BaseException]] -> Any` is equivalent to - # `Union[([func, path, ExcInfo] -> Any), ([func, path, BaseException] -> Any)]`. - cast(Union[OnExc, OnErr], rmtree_errorhandler), - onexc=onexc, - ) + handler: OnErr = partial(rmtree_errorhandler, onexc=onexc) if sys.version_info >= (3, 12): # See https://docs.python.org/3.12/whatsnew/3.12.html#shutil. shutil.rmtree(dir, onexc=handler) # type: ignore @@ -555,7 +550,7 @@ def __str__(self) -> str: # This is useful for testing. def __eq__(self, other: Any) -> bool: - if type(self) != type(other): + if type(self) is not type(other): return False # The string being used for redaction doesn't also have to match, diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc index 288d7080eabfa3a5424367cdfb8176453bfafbf6..6c3428d427019ed173876296c4dcd1535ea6e081 100644 GIT binary patch delta 20 acmey!@{xsmIWI340}$}3`)uS+V*&s-H3Vh= delta 20 acmey!@{xsmIWI340}#BelHSOj#smO9O9f{D diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc index 5dd13ab9f04b2bf225cbc6b6c784ac55bdd0426f..98d5e704d7bff2953ead64e84c7432b4f9f1d309 100644 GIT binary patch delta 20 acmeyb`(KxPIWI340}$}3`)uU?A_f3JJq30E delta 20 acmeyb`(KxPIWI340}#BelHSPuMGOE(QwDbc diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc index 0a38a173c128de13b7ed186f282f2c5fbc720089..fa528263db33b47be448380535d1c4ad188a3912 100644 GIT binary patch delta 22 ccmcb#obl3fM(*Xjyj%=Gz^CrBk^6Ws08cCiA^-pY delta 22 ccmcb#obl3fM(*Xjyj%=G@U}{NBlq!O09HZ=BLDyZ diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc index 3957cb2b86930b5ac8ce367db58ea48117867011..89c14fedacc2ed01ad7091e5e5ff64911af6e528 100644 GIT binary patch delta 20 ZcmeBk>2u*;&dbZi00eyMJ{!52l>ji^1Kj`s delta 20 acmeBk>2u*;&dbZi00eKVq&IRiD**sE^90@i diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc index e28104b81e7231855a8955a50ad80bdbaa2a807f..5843d653044260e82696f1917eccb06a05d784b0 100644 GIT binary patch delta 20 acmZ2kw6chMIWI340}$}3`)uTvvjhM;qy(V= delta 20 acmZ2kw6chMIWI340}#BelHSNIX9)m8x&@*D diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc index e8066af856f32fe277de2d1d616a4bbfb3c0b80f..314f75fc82e2d69bb5d0214d302e14eb587d7251 100644 GIT binary patch delta 22 ccmeDG!Px(Uk$X8WFBbz4@TvQ308eWLqyPW_ delta 22 ccmeDG!Px(Uk$X8WFBbz4yseVn$jwp%09Jtpr2qf` diff --git a/venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc index f00620eaa02b0c58809d99d11551cc29acbf0289..e10895fc11fc5e17bf4ebe4dbf0c821e07bc5468 100644 GIT binary patch delta 20 acmZ3fwNi_FIWI340}$}3`)uTv69oVjeny;oIWI340}$}3`)uSs$PEBBA_S%Y delta 20 acmX>jeny;oIWI340}#BelHSODkQ)FzI0dHw diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc index b1f17ec9e8040a6352ddcc4b4cca26e01633e59f..9f0ffdab927098234a9e77437eaf45512c6c1181 100644 GIT binary patch delta 20 acmexh`oWZYIWI340}$}3`)uTXDg^*P2?bpM delta 20 acmexh`oWZYIWI340}#BelHSPuR0;q_9|m3k diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc index 64fbb92acf0d22d0cca41ba1872b848dc119139e..b514b52707bf249e5a964cf4ffbd5e6e9d5a7731 100644 GIT binary patch delta 20 ZcmeBG?p5Yq&dbZi00eyMJ{!541OY7o1P1^B delta 20 acmeBG?p5Yq&dbZi00eKVq&IRm2?78#76k|Z diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc index da6787e04d557668c71b357a5932785708e608e3..1de8038046c9852521b344f85cadf2cbf5a746e1 100644 GIT binary patch delta 22 ccmey>$M~y{k$X8WFBbz4@TvQ3$M~y{k$X8WFBbz4yseVn$er&F09YRe-2eap diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc index ecca770f44258c4cdc7e1b25e24d75da519d539f..14678a205aa561584ab59644113101bf368a02f8 100644 GIT binary patch delta 20 ZcmeBG?N#Mo&dbZi00eyMJ{!54ga9o`1PlNG delta 20 acmeBG?N#Mo&dbZi00eKVq&IRm2>}2!Uj+>S diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc index 7587083d451d374e579023c7946af60137714d86..6cc0d5953979a5b566b49f5c6298820d1a95321a 100644 GIT binary patch delta 20 ZcmZp$Zm{NF&dbZi00eyMJ{!49WdSZ^1RMYW delta 20 acmZp$Zm{NF&dbZi00eKVq&ISx$^rm2dIcQ- diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc index 4678493c4a4b13c9d1041b76a4f024bedd509fce..fbbcf4c786645cecc9e451a157d920dc98f54288 100644 GIT binary patch delta 20 acmZ3bw@QzDIWI340}$}3`)uTv7Y6_`8Uy+O delta 20 acmZ3bw@QzDIWI340}#BelHSNIFAe}XFa-Mm diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc index f7bea69b828a47f3fff765a799a5b85a04189f78..069a656e9c100e98462a913428ee7289afed4d07 100644 GIT binary patch delta 20 acmX@gca)ENIWI340}$}3`)uU4Vg~>*!UOvN delta 20 acmX@gca)ENIWI340}#BelHSN|#SQ>C*aZ9l diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc index 5234fdb9a804a405e70d08f15b2c3c173cab9033..ebbb7027d40762d2dc4fbcac63ac7d075ff698e0 100644 GIT binary patch delta 20 acmcb{e2tlVIWI340}$}3`)uSs%?JQ9*aVUQ delta 20 acmcb{e2tlVIWI340}#BelHSODnh^jx?gf(o diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc index 51776389ea34f850e19feb6e682c8b3715773a16..a935941b0f734630df2029781d9b5a33ff125e11 100644 GIT binary patch delta 20 acmezB_SKDhIWI340}$}3`)uUSQU(A)J_Q#5 delta 20 acmezB_SKDhIWI340}#BelHSOjr3?T_R0bFT diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc index 534a16bad9a7db70c10ed774414c517a3a742c9c..ad0f3317fce00ca45b71258a82571f188d0c90ec 100644 GIT binary patch delta 20 acmZpbXqDhz&dbZi00eyMJ{!4zaRUG=E(B8m delta 20 acmZpbXqDhz&dbZi00eKVq&IT^;syXRLsdsvoxIWI340}$}3`)uUi!3O{|l?0jq delta 20 acmX>sdsvoxIWI340}#BelHSO@gAV{Zs|A|? diff --git a/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem b/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem index a658158..3c165a1 100644 --- a/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem +++ b/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem @@ -4796,3 +4796,134 @@ PQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgLcFBTApFw hVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dG XSaQpYXFuXqUPoeovQA= -----END CERTIFICATE----- + +# Issuer: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA CYBER Root CA" +# Serial: 85076849864375384482682434040119489222 +# MD5 Fingerprint: 0b:33:a0:97:52:95:d4:a9:fd:bb:db:6e:a3:55:5b:51 +# SHA1 Fingerprint: f6:b1:1c:1a:83:38:e9:7b:db:b3:a8:c8:33:24:e0:2d:9c:7f:26:66 +# SHA256 Fingerprint: 3f:63:bb:28:14:be:17:4e:c8:b6:43:9c:f0:8d:6d:56:f0:b7:c4:05:88:3a:56:48:a3:34:42:4d:6b:3e:c5:58 +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQ +MQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290 +IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5 +WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FO +LUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1sTs6P +40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxF +avcokPFhV8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/ +34bKS1PE2Y2yHer43CdTo0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684i +JkXXYJndzk834H/nY62wuFm40AZoNWDTNq5xQwTxaWV4fPMf88oon1oglWa0zbfu +j3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK/c/WMw+f+5eesRycnupf +Xtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkHIuNZW0CP +2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDA +S9TMfAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDA +oS/xUgXJP+92ZuJF2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzC +kHDXShi8fgGwsOsVHkQGzaRP6AzRwyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW +5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83QOGt4A1WNzAd +BgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB +AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0t +tGlTITVX1olNc79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn +68xDiBaiA9a5F/gZbG0jAn/xX9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNn +TKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDRIG4kqIQnoVesqlVYL9zZyvpoBJ7t +RCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq/p1hvIbZv97Tujqx +f36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0RFxbI +Qh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz +8ppy6rBePm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4 +NxKfKjLji7gh7MMrZQzvIt6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzX +xeSDwWrruoBa3lwtcHb4yOWHh8qgnaHlIhInD0Q9HWzq1MKLL295q39QpsQZp6F6 +t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA12" +# Serial: 587887345431707215246142177076162061960426065942 +# MD5 Fingerprint: c6:89:ca:64:42:9b:62:08:49:0b:1e:7f:e9:07:3d:e8 +# SHA1 Fingerprint: 7a:22:1e:3d:de:1b:06:ac:9e:c8:47:70:16:8e:3c:e5:f7:6b:06:f4 +# SHA256 Fingerprint: 3f:03:4b:b5:70:4d:44:b2:d0:85:45:a0:20:57:de:93:eb:f3:90:5f:ce:72:1a:cb:c7:30:c0:6d:da:ee:90:4e +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgw +NTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3emhF +KxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mt +p7JIKwccJ/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zd +J1M3s6oYwlkm7Fsf0uZlfO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gur +FzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBFEaCeVESE99g2zvVQR9wsMJvuwPWW0v4J +hscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1UefNzFJM3IFTQy2VYzxV4+K +h9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsF +AAOCAQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6Ld +mmQOmFxv3Y67ilQiLUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJ +mBClnW8Zt7vPemVV2zfrPIpyMpcemik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA +8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPSvWKErI4cqc1avTc7bgoitPQV +55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhgaaaI5gdka9at/ +yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA14" +# Serial: 575790784512929437950770173562378038616896959179 +# MD5 Fingerprint: 71:0d:72:fa:92:19:65:5e:89:04:ac:16:33:f0:bc:d5 +# SHA1 Fingerprint: dd:50:c0:f7:79:b3:64:2e:74:a2:b8:9d:9f:d3:40:dd:bb:f0:f2:4f +# SHA256 Fingerprint: 4b:00:9c:10:34:49:4f:9a:b5:6b:ba:3b:a1:d6:27:31:fc:4d:20:d8:95:5a:dc:ec:10:a9:25:60:72:61:e3:38 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEM +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgw +NzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh1oq/ +FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOg +vlIfX8xnbacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy +6pJxaeQp8E+BgQQ8sqVb1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo +/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9J +kdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOEkJTRX45zGRBdAuVwpcAQ +0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSxjVIHvXib +y8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac +18izju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs +0Wq2XSqypWa9a4X0dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIAB +SMbHdPTGrMNASRZhdCyvjG817XsYAFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVL +ApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeqYR3r6/wtbyPk +86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E +rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ib +ed87hwriZLoAymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopT +zfFP7ELyk+OZpDc8h7hi2/DsHzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHS +DCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPGFrojutzdfhrGe0K22VoF3Jpf1d+4 +2kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6qnsb58Nn4DSEC5MUo +FlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/OfVy +K4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6 +dB7h7sxaOgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtl +Lor6CZpO2oYofaphNdgOpygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB +365jJ6UeTo3cKXhZ+PmhIIynJkBugnLNeLLIjzwec+fBH7/PzqUqm9tEZDKgu39c +JRNItX+S +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA15" +# Serial: 126083514594751269499665114766174399806381178503 +# MD5 Fingerprint: 13:30:fc:c4:62:a6:a9:de:b5:c1:68:af:b5:d2:31:47 +# SHA1 Fingerprint: cb:ba:83:c8:c1:5a:5d:f1:f9:73:6f:ca:d7:ef:28:13:06:4a:07:7d +# SHA256 Fingerprint: e7:78:f0:f0:95:fe:84:37:29:cd:1a:00:82:17:9e:53:14:a9:c2:91:44:28:05:e1:fb:1d:8f:b6:b8:88:6c:3a +-----BEGIN CERTIFICATE----- +MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMw +UTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBM +dGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMy +NTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJl +cnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBSb290 +IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5GdCx4 +wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSR +ZHX+AezB2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT +9DAKBggqhkjOPQQDAwNoADBlAjEA2S6Jfl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp +4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJSwdLZrWeqrqgHkHZAXQ6 +bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= +-----END CERTIFICATE----- diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py b/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py index e999438..bf0d6c6 100644 --- a/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +++ b/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py @@ -6,7 +6,7 @@ # import logging -__version__ = '0.3.8' +__version__ = '0.3.9' class DistlibException(Exception): diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc index c697416c8329d73ee61c5d6a8a284338885c19cc..969555c494b9f0697d7556baee64056230a65322 100644 GIT binary patch delta 27 hcmdnYy_uVPIWI340}$}3`)uT9WMs75%*(ip1prNx1vdZy delta 27 hcmdnYy_uVPIWI340}#BelHSP8$jE51nU`@H3jkZH1~&iz diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc index 60e341559c3982ab5836d89a64a32dabb38866ea..406c65fd27203190f9710240275adbff9765a4ab 100644 GIT binary patch delta 801 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 delta 3355 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 diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc index 0e03993a331e6082981d0c6919b4d0c1882e5ae6..f70a82ff8df03e8ad65f0c9990a5b6f935ce0049 100644 GIT binary patch delta 22 ccmZ2n+a delta 22 ccmZ2({^%K21L#zZ6HCd~jyhmTlvm*`d7&}w{$lGQ~F)?lLBMCC2{L$%5 zvwP<^_uX^OoOA9y=iYxFP+dBp(*H`Q3!%tQpHQ-CyK@xLB7*j*zf99XYMD}C3JY2dGBu4(JfNMef{pmk#ylGK zVFz~@;HT)<;n&~@+Gze6bfCxPH=z@IEP5K=M#m$*gj4vKbv_Me@SVs6hP|eEJcb@Q zUN`nP_+H|x*YQnTc|!}YZow!zfq~!R-^^(R7{gg{CBg6+K9JN3i}XOOGAHBYbDO>$ zt19}r!HBC7H{*tO_`-Z9pXtWS?tvKnWfN*mTW$wU zIgDyeM@tTu@YaR>b-pY?TPAADcx~Azx}VmSKHleEYXwaj*>3J^(n{8upuAb#m zLUPZ3DKX`&el#|vcTeA*{#KubFR$dQYxvY!A+}D8t&>tSE;OHR{x*v0da-&vnG3m1 zB4O$VF?E9+%FeOL6hRmJXkuKCX1jj~X0**c&mN{D0s=21akGvuKDM}<6S#Phi4`3`YSxU-~lCwq=+U-u%P(I6x=iV2Of zCdlcKDT1ydS&MdL*w`3jm`$F8J2DDsNX8>s=Txv1zdnDF25RsJ`RNQ)qR$IcxHw)l zOV&~*OZ)OMM_S)p!LbNs7M(U}gSL_Cm_|GLtjJ+1fFO%ZO=Ag;E`CU=0f#O(0`y?} z3l~&y8sAy*DX>U6*haLi(F!40C}(N7jign7hmY~~isfqf1Jc)LgBusrAD|%veb{gU zZldN!2ZSI`V^Vas;%R2!;l?or92hqpRI!;f@w5;vYECxw7Y!BqvUo?Cz?F+!Ij=28 z2b&*39@@Y8Em(@ew|r2Tq-dK+aHL#}jAkWC^a;m9D3iIv+-df(lG)l>Gh$90HYfIm zpS23+OwpVvQ^A^80u-^;p2>6d-O%mq(U3`RdGDUHYsjQOroZT#i%dx6T5jwk6TV_K zUs)$s)O(gnX!lkbbZA41lc7}_bfm?i3k}j)0~A4fAvwH@EzjE{l-vpY48@ucHOTaL z3uG0Ww|zuIIU3#G0W0y3cD$*A)%dHI!x`9)jr+7T?8i|*-pjCul`Kn3x_fueD}1Dz44G!p z=SN+$>6pd7@R4P;!^>*4%Auh&DT z&BC^hyCD$3fuEPNq|S;?xB-e$>&aUVtFpgS$Z;s2Q&@rRU9qL81mO1AAGq-it=wTTm>8M|75)iY1lN#yjT;b8^KwxiUjrO)^V`*`}o38{bLl zNg@KfNe)$8^qwNwL>Vm}-OfVtNVtMgOkp@`8gxMqIx?tSHRlGc(RwAJnSnnYe4xBt zcdoAk_!CaM$pUo5%_q`z~Iy{Sa|4(hvP!y&&rNkb|=|1r_Y!Cwvc zGf;>x|52u)3ZJ?g&%h>p`(AA@+omEWVJP{2OG2o|Hl__%UaYQ^-iW^J0oTwnVL_?5 zpp>_+n0mb=eCz&01N%$Gt`c1h?1x~KJMQLup?qYj5LqEcR`A*iQkU5h@{HF)I=Vmp zk6^p50Q{64jeZfugoUj;`Slk-x?3!66zpq7`&!<^`DT8?XvY5A!9p#rgBjbN-1jWxWn zW?~c>9=!%GbmY;Fw0LEcr%(#b5ELy_GZLqMc@Jm^LfXfd+5k3_D84u5|Bvp+s64dp z>ui$7^OI@(e>q0w@{Y! zo8VVg15|w5cM4_TP^M2q37)J5o`~|HYBJepvul>0QY3*%%HOb+rnq?C6gQ@_@?_Yu z`q%TSd_k4JT~y^up`0AdaArS65Kz!=kVB{ttEh=?XJvLH1EgP`P46E6q$Dtde3zD7 Qe%-2g>XgRK^nsiC5Ab9JP5=M^ delta 3204 zcmc(h3v5%@8G!G9?cBt{4t^$nB(_5m$9Xu3ofk<;1I8pI%b;mlN1=!eDo~)PFi2ns zNTQ}w3SBWftfU=VQwYLk2{<`)ODk5gwcE<0o6Wp(VPtYU&_>y$Yvia}JJPdlnorE>WB`*zFP>a!zhzfXoj`bqLqnc&6I&F9J7 z89&#Go|>2p)OB$VA#tFnBPq&mp@wPHke8K4wOX5mf@wJE+e*6}+UaF=Jr6smS+^Tt zH#wp|1^dVzHF-D;W+)kk}nfZGv5cur1b@ZsJ0Cl z1GT|z66P=uSp0cFciZx1@LM`MYa75-T9n(83^(bvqHR#82Q>AdeK!}fw|sexxd(Jd zjfafGxq(eVO;8)u4t2a)G*lGMu8L$=O{>vjS2eHtl*OJaV-6%W*;v{uhA1ASH$1uu2@Fzd=ePi#=u`N24)Ix%4^D0v^igTNT4{Xr`-c9#O!z=zzCO z22YXj0+%i)B+rnPoHo6?IchBp7KE*JMAL9gt4dHf{PJzqhZ%V zhldg}xbhI3BaLmSOxCm&*~(dvhl2*&qB5}4ea}2E7bwcN(VrH4xrPyC-as_JL#iWv)U2hjs6gfDx zL|UIY7d_~!2VlT4s7TxfS_7R!PbF?eo!see|& zW-Qy_aBy;?TuR}Dl-?zM-j{qm%l)4H72%|em_n{H#W_Ux0x6a3*sw6u#EO83$vDB# zyHeus4&W$_ZukukOGsejKKKT$-LyvzOX;sW^fK5?|F})bLpS~F_N_Ab9&Ow82ObX5 zs-8z>xVk%fKb8xp*rU%TPrq1h5lvYUlN)>5?7@O5%dud}a_musHA)V@7%_;3to}|E zEAmmI$j3)k*$*=@j6wJ zsKZB5Y4Svi?e#gY%?aqj7FWdL^83ULi+_h`v`bb_W7wZ|QSH2-c81l35p`iGaYqgaB^gStk=uJ0rOf0qJyW<;$z%RL-fg6p{g+bVHa+>nRspK1aL5hNOlBWGW3{mA zPovhx{!YV7ZG+#DLlb>9kk7+1`io=7d0`c9R-30t$8e5)h61$_VP#gI&!5|$B&J)i znN)LeNimX@BN>oPLc_MI35Vw`&&lea)sNPXd&1=nk@AMHqcP%W6dlgMtiUQMiFe@K z@D`jKgnzyyaG7>$J^lqRe49nQN$expnGcKTW<9)O#Dvkdj#&T8XvBKlL?%YMz(-b$ zHkPEZT1>;PVSgVEdSUc0fQ|Uh$#XJ+u#8*Cp0Ulgz?NXsP?uQXI$=C!3>JubWnYO;N=lJ91|=Df~!K{&;9pCi5R)|U6{ z4`v?O9PkY-4i!BT&Yu&>pA#}ZDymKWzJo2pIe{&KHSF98S*oODd3su31FpDR?=}g; z%tb3{X)~EqQj)TQw!tL)&7g-)|49ZP(w_HL0Zh=V?+XB*&>O#Mk->F3 z`^;`04CK9YSKtg8IBx}ko<4t=2M=BSJ5;Ep!3$$D?4kCLBp#O2WtZ|~u%32bS)MFB zFULg8lrZmgLKXBrWu9anG6 z6n?@SY$R*qJ8?(78h6{ox&}$cWtO6P=0a9uBr{kD*r1hB;+$L#Zqhq>GdWA;!=ojO z?EEZCrq%ck|L8L?i3RRRffwf|%g1byXp4-Jq0jqNPXISl7vtOtA55+x^QN-r%M}%D zKdtEV;rs?ygbKWUzKGHx&eTO_7Dybgs+drxA5eZ@8OrjCS=o^+5BkP%hi`Z{%Ds`|1o5o}CEF{?^?xCdPx2^y$%E^!aG1`SErNsUJkoTXWr*MGVf#y!- zS|0Gc`QJj|poW~jbEa#T9I&JhX5X4vLK44M?oBOW7Wc#d%@`Yve6^G5)i-3(qUGdocSOV+l$8Uip^fdS-Dy{99veH2#&y$LBKD`{B=zvC%k} z+jUoA5t!KR{b0%CX#6YD>?ae?`e62F#5g92Cn$Z%PM*`{g|xX*eL)DXLZ9fV#D#3A zj&*WKTmpvbs3k{I$aQ%!4uLNPy1ee0_>PupiYRQ|f+VcN7aWOuF#Vmege3kD`DP_< Qrvvgl?uf!I3xZqrFE`}r{{R30 diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc index a9dbff82fbc4ba1356fec751aae53622982862c0..b08b439ccb3231c2bba2f66a6daf87291e3a1c4b 100644 GIT binary patch delta 22 ccmey+!uX+uk$X8WFBbz4@TvQ3P-rY2trTO7KG~w#ihZ(rz3-rC_0TWfu*u zB8UvVUAXYKb7L1W3S9_hrGai{U>0>T(!D4nC>BBVje?5eJ%_{N-g_R0`)05`s60{> ziLg@phA)?%DBT=naU1sv^3FSM8lZ^d{2Xj|Uh_u*_F_($g??NV=An#faSkeIi<7Vq zzlig&AFpqm6c4b!W_A;TdxR}0NHsW!=cJ2p2;0&$zK{}lShjGNtl(q$0zQxvPEW$( zw+=AZ>{B45Nj^y=q1)EIVNWjlaxo+Z-c2qY0c8x9hL&T?W6x!;RP{^MkVL&er}k94 z8ljW_0jp!V`MRf@zHYi*=9;GCZLKP&b=NrIrXymYwV{OfQ`a&%UJuFN;`F6oa&X0Y z-<{kLzZ6CLjJ#3k;d#1B%PuWHtNWE>e&v)$M|?WsirK&!GQM&1cC@>~q)9@J<5{{4 zeOT}^ML$!#DYarPt7WYRa+*bF!#_1pH@BubdIWd07SX7Cs_CnyE1K)9LN2nf$C@BV z#VQ##0-<+Hl22;JnQy0qXd*_lDwT$Gy~qpPFz< z*D5aL22PfN-QZub;~%2#$KRu?K;%p-e`|+*-jk>=(WVf_DQF@2CC9OsW~l}{L-HS) INwNEU2VLXI*8l(j delta 651 zcmZ{gOK1~O6o&7~WFDPI9+Na_8l7emOq!uZL#FY8&zibWvry_n#g!4QT~ykx+C_pO zbm3y~q>zPTb{3=ynN1f8UFpJ20wY8r;wH<&1S*IW^p1$4;=Pye!nx=F@6Xwu{y42X zQxuWVwX>4E-FTtI85qL@%p1tqJIn%rfj8Jy$lLGPa{xt5@k?N0gRj99Muk-g2OX&i>1Gf{RX$}XX$UQD;< zyO~_eY?&MCk3G9F>oSlj4hY1}T@NmSu<3Fn62}K>SsEE_YnAqhchFI{VG`FP%fmVw zbIISZwdiXG?%Mr$*vH-RGVbACBAen^y{nsT-R#LhN7fuUJ76F^PJc^}w*{?lpBVkd zgwPYbqo@;C^|LvwXo;GS&C%pP(F-Kj=DSI~S!$MAg;s$EPiATGV2)Y^X(J5fzR=|| zRN>tm5oAwpSbpnLgKrie1+2gyE_4u{OWt!aJQu@rG5P^@{ZuEAu|H@cz*X#z-H&wr zXKC!{4A3^pHVJ*g<<#lQ6wp!p3yT|g)!pAu_kc*lYw3rEb-g3%j;PmpmrH}{l3zHF Rplf;*CSCF$EJo;rz5{DhzOVoQ diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc index 4553b53b786dc5bca3cfc9990f854e20fa0245a7..c177c323210823d6f287bd0bade026fdbcb1c92a 100644 GIT binary patch delta 2702 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 diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc index 6fc927a90cbd2ae9efacd534c90952cd94ddfecb..adf7991ed35a8c0b65e7723df6c76e3e85723c00 100644 GIT binary patch delta 22 ccmZ26g>l6cM(*Xjyj%=Gz^CrBkz3Xa07NhZ^#A|> delta 22 ccmZ26g>l6cM(*Xjyj%=G@U}{NBe$#<082&%_5c6? diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc index fa368f0f16c4905b223f086f4bc1ea57c769043b..d2b1abb24339caf1d6ca30c3516501903357a3d9 100644 GIT binary patch delta 4967 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 delta 4821 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 Zcmw3}kWTRQFTwaaR5#!np3@1H{{uBSQJw$* delta 8277 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 CbMo{6 diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc index 550f80bb8214f8ea5cc0927e1fdb63bc3bf18438..0e812d82b7b125fcf49f09fce969a32dce5c16d5 100644 GIT binary patch delta 307 zcmey?&-AsQiFY|KFBbz4@TvQxuiwa9~hW;#WpZ*=h?)wBlx0$;}ru(u+V|T6B>td4&+SUo?Ris#tPI6 zBt9}Tu<^A-d|-kJ07W-@=iFyvtl6xc&&kMGve~r2hLLgd=AyzwOpNmqb!?|aqZ+Q4c{1FZ(iNFheeB<5$HHf TVuJfekmwhLl+5OdZK;d^a&K-e delta 308 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 O;JOaWgf#xEy#EFII4n&7 delta 6224 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 CCfdXR diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/compat.py b/venv/Lib/site-packages/pip/_vendor/distlib/compat.py index e93dc27..ca561dd 100644 --- a/venv/Lib/site-packages/pip/_vendor/distlib/compat.py +++ b/venv/Lib/site-packages/pip/_vendor/distlib/compat.py @@ -217,8 +217,7 @@ def which(cmd, mode=os.F_OK | os.X_OK, path=None): # Additionally check that `file` is not a directory, as on Windows # directories pass the os.access check. def _access_check(fn, mode): - return (os.path.exists(fn) and os.access(fn, mode) - and not os.path.isdir(fn)) + return (os.path.exists(fn) and os.access(fn, mode) and not os.path.isdir(fn)) # If we're given a path with a directory part, look it up directly rather # than referring to PATH directories. This includes checking relative to the diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/database.py b/venv/Lib/site-packages/pip/_vendor/distlib/database.py index eb3765f..c0f896a 100644 --- a/venv/Lib/site-packages/pip/_vendor/distlib/database.py +++ b/venv/Lib/site-packages/pip/_vendor/distlib/database.py @@ -20,14 +20,12 @@ from . import DistlibException, resources from .compat import StringIO from .version import get_scheme, UnsupportedVersionError -from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, - LEGACY_METADATA_FILENAME) -from .util import (parse_requirement, cached_property, parse_name_and_version, - read_exports, write_exports, CSVReader, CSVWriter) +from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME) +from .util import (parse_requirement, cached_property, parse_name_and_version, read_exports, write_exports, CSVReader, + CSVWriter) __all__ = [ - 'Distribution', 'BaseInstalledDistribution', 'InstalledDistribution', - 'EggInfoDistribution', 'DistributionPath' + 'Distribution', 'BaseInstalledDistribution', 'InstalledDistribution', 'EggInfoDistribution', 'DistributionPath' ] logger = logging.getLogger(__name__) @@ -35,8 +33,7 @@ EXPORTS_FILENAME = 'pydist-exports.json' COMMANDS_FILENAME = 'pydist-commands.json' -DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', - 'RESOURCES', EXPORTS_FILENAME, 'SHARED') +DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', 'RESOURCES', EXPORTS_FILENAME, 'SHARED') DISTINFO_EXT = '.dist-info' @@ -134,13 +131,9 @@ def _yield_distributions(self): continue try: if self._include_dist and entry.endswith(DISTINFO_EXT): - possible_filenames = [ - METADATA_FILENAME, WHEEL_METADATA_FILENAME, - LEGACY_METADATA_FILENAME - ] + possible_filenames = [METADATA_FILENAME, WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME] for metadata_filename in possible_filenames: - metadata_path = posixpath.join( - entry, metadata_filename) + metadata_path = posixpath.join(entry, metadata_filename) pydist = finder.find(metadata_path) if pydist: break @@ -148,15 +141,11 @@ def _yield_distributions(self): continue with contextlib.closing(pydist.as_stream()) as stream: - metadata = Metadata(fileobj=stream, - scheme='legacy') + metadata = Metadata(fileobj=stream, scheme='legacy') logger.debug('Found %s', r.path) seen.add(r.path) - yield new_dist_class(r.path, - metadata=metadata, - env=self) - elif self._include_egg and entry.endswith( - ('.egg-info', '.egg')): + yield new_dist_class(r.path, metadata=metadata, env=self) + elif self._include_egg and entry.endswith(('.egg-info', '.egg')): logger.debug('Found %s', r.path) seen.add(r.path) yield old_dist_class(r.path, self) @@ -274,8 +263,7 @@ def provides_distribution(self, name, version=None): try: matcher = self._scheme.matcher('%s (%s)' % (name, version)) except ValueError: - raise DistlibException('invalid name or version: %r, %r' % - (name, version)) + raise DistlibException('invalid name or version: %r, %r' % (name, version)) for dist in self.get_distributions(): # We hit a problem on Travis where enum34 was installed and doesn't @@ -390,10 +378,8 @@ def provides(self): def _get_requirements(self, req_attr): md = self.metadata reqts = getattr(md, req_attr) - logger.debug('%s: got requirements %r from metadata: %r', self.name, - req_attr, reqts) - return set( - md.get_requirements(reqts, extras=self.extras, env=self.context)) + logger.debug('%s: got requirements %r from metadata: %r', self.name, req_attr, reqts) + return set(md.get_requirements(reqts, extras=self.extras, env=self.context)) @property def run_requires(self): @@ -469,8 +455,7 @@ def __eq__(self, other): if type(other) is not type(self): result = False else: - result = (self.name == other.name and self.version == other.version - and self.source_url == other.source_url) + result = (self.name == other.name and self.version == other.version and self.source_url == other.source_url) return result def __hash__(self): @@ -561,8 +546,7 @@ def __init__(self, path, metadata=None, env=None): if r is None: r = finder.find(LEGACY_METADATA_FILENAME) if r is None: - raise ValueError('no %s found in %s' % - (METADATA_FILENAME, path)) + raise ValueError('no %s found in %s' % (METADATA_FILENAME, path)) with contextlib.closing(r.as_stream()) as stream: metadata = Metadata(fileobj=stream, scheme='legacy') @@ -580,8 +564,7 @@ def __init__(self, path, metadata=None, env=None): self.modules = data.splitlines() def __repr__(self): - return '' % ( - self.name, self.version, self.path) + return '' % (self.name, self.version, self.path) def __str__(self): return "%s %s" % (self.name, self.version) @@ -703,8 +686,7 @@ def write_installed_files(self, paths, prefix, dry_run=False): size = '%d' % os.path.getsize(path) with open(path, 'rb') as fp: hash_value = self.get_hash(fp.read()) - if path.startswith(base) or (base_under_prefix - and path.startswith(prefix)): + if path.startswith(base) or (base_under_prefix and path.startswith(prefix)): path = os.path.relpath(path, base) writer.writerow((path, hash_value, size)) @@ -746,8 +728,7 @@ def check_installed_files(self): with open(path, 'rb') as f: actual_hash = self.get_hash(f.read(), hasher) if actual_hash != hash_value: - mismatches.append( - (path, 'hash', hash_value, actual_hash)) + mismatches.append((path, 'hash', hash_value, actual_hash)) return mismatches @cached_property @@ -829,9 +810,8 @@ def get_distinfo_file(self, path): # it's an absolute path? distinfo_dirname, path = path.split(os.sep)[-2:] if distinfo_dirname != self.path.split(os.sep)[-1]: - raise DistlibException( - 'dist-info file %r does not belong to the %r %s ' - 'distribution' % (path, self.name, self.version)) + raise DistlibException('dist-info file %r does not belong to the %r %s ' + 'distribution' % (path, self.name, self.version)) # The file must be relative if path not in DIST_FILES: @@ -857,8 +837,7 @@ def list_distinfo_files(self): yield path def __eq__(self, other): - return (isinstance(other, InstalledDistribution) - and self.path == other.path) + return (isinstance(other, InstalledDistribution) and self.path == other.path) # See http://docs.python.org/reference/datamodel#object.__hash__ __hash__ = object.__hash__ @@ -911,8 +890,7 @@ def parse_requires_data(data): if not line: # pragma: no cover continue if line.startswith('['): # pragma: no cover - logger.warning( - 'Unexpected line: quitting requirement scan: %r', line) + logger.warning('Unexpected line: quitting requirement scan: %r', line) break r = parse_requirement(line) if not r: # pragma: no cover @@ -954,13 +932,11 @@ def parse_requires_path(req_path): else: # FIXME handle the case where zipfile is not available zipf = zipimport.zipimporter(path) - fileobj = StringIO( - zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) + fileobj = StringIO(zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) metadata = Metadata(fileobj=fileobj, scheme='legacy') try: data = zipf.get_data('EGG-INFO/requires.txt') - tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode( - 'utf-8') + tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') requires = parse_requires_data(data.decode('utf-8')) except IOError: requires = None @@ -990,8 +966,7 @@ def parse_requires_path(req_path): return metadata def __repr__(self): - return '' % (self.name, self.version, - self.path) + return '' % (self.name, self.version, self.path) def __str__(self): return "%s %s" % (self.name, self.version) @@ -1083,8 +1058,7 @@ def list_distinfo_files(self, absolute=False): yield line def __eq__(self, other): - return (isinstance(other, EggInfoDistribution) - and self.path == other.path) + return (isinstance(other, EggInfoDistribution) and self.path == other.path) # See http://docs.python.org/reference/datamodel#object.__hash__ __hash__ = object.__hash__ @@ -1184,8 +1158,7 @@ def to_dot(self, f, skip_disconnected=True): disconnected.append(dist) for other, label in adjs: if label is not None: - f.write('"%s" -> "%s" [label="%s"]\n' % - (dist.name, other.name, label)) + f.write('"%s" -> "%s" [label="%s"]\n' % (dist.name, other.name, label)) else: f.write('"%s" -> "%s"\n' % (dist.name, other.name)) if not skip_disconnected and len(disconnected) > 0: @@ -1225,8 +1198,7 @@ def topological_sort(self): # Remove from the adjacency list of others for k, v in alist.items(): alist[k] = [(d, r) for d, r in v if d not in to_remove] - logger.debug('Moving to result: %s', - ['%s (%s)' % (d.name, d.version) for d in to_remove]) + logger.debug('Moving to result: %s', ['%s (%s)' % (d.name, d.version) for d in to_remove]) result.extend(to_remove) return result, list(alist.keys()) @@ -1261,15 +1233,13 @@ def make_graph(dists, scheme='default'): # now make the edges for dist in dists: - requires = (dist.run_requires | dist.meta_requires - | dist.build_requires | dist.dev_requires) + requires = (dist.run_requires | dist.meta_requires | dist.build_requires | dist.dev_requires) for req in requires: try: matcher = scheme.matcher(req) except UnsupportedVersionError: # XXX compat-mode if cannot read the version - logger.warning('could not read version %r - using name only', - req) + logger.warning('could not read version %r - using name only', req) name = req.split()[0] matcher = scheme.matcher(name) diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/locators.py b/venv/Lib/site-packages/pip/_vendor/distlib/locators.py index f9f0788..222c1bf 100644 --- a/venv/Lib/site-packages/pip/_vendor/distlib/locators.py +++ b/venv/Lib/site-packages/pip/_vendor/distlib/locators.py @@ -19,15 +19,12 @@ import zlib from . import DistlibException -from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, - queue, quote, unescape, build_opener, - HTTPRedirectHandler as BaseRedirectHandler, text_type, - Request, HTTPError, URLError) +from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, queue, quote, unescape, build_opener, + HTTPRedirectHandler as BaseRedirectHandler, text_type, Request, HTTPError, URLError) from .database import Distribution, DistributionPath, make_dist from .metadata import Metadata, MetadataInvalidError -from .util import (cached_property, ensure_slash, split_filename, get_project_data, - parse_requirement, parse_name_and_version, ServerProxy, - normalize_name) +from .util import (cached_property, ensure_slash, split_filename, get_project_data, parse_requirement, + parse_name_and_version, ServerProxy, normalize_name) from .version import get_scheme, UnsupportedVersionError from .wheel import Wheel, is_compatible @@ -58,6 +55,7 @@ class RedirectHandler(BaseRedirectHandler): """ A class to work around a bug in some Python 3.2.x releases. """ + # There's a bug in the base version for some 3.2.x # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header # returns e.g. /abc, it bails because it says the scheme '' @@ -80,8 +78,7 @@ def http_error_302(self, req, fp, code, msg, headers): headers.replace_header(key, newurl) else: headers[key] = newurl - return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, - headers) + return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, headers) http_error_301 = http_error_303 = http_error_307 = http_error_302 @@ -92,7 +89,7 @@ class Locator(object): """ source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') binary_extensions = ('.egg', '.exe', '.whl') - excluded_extensions = ('.pdf',) + excluded_extensions = ('.pdf', ) # A list of tags indicating which wheels you want to match. The default # value of None matches against the tags compatible with the running @@ -100,7 +97,7 @@ class Locator(object): # instance to a list of tuples (pyver, abi, arch) which you want to match. wheel_tags = None - downloadable_extensions = source_extensions + ('.whl',) + downloadable_extensions = source_extensions + ('.whl', ) def __init__(self, scheme='default'): """ @@ -200,8 +197,7 @@ def score_url(self, url): is_downloadable = basename.endswith(self.downloadable_extensions) if is_wheel: compatible = is_compatible(Wheel(basename), self.wheel_tags) - return (t.scheme == 'https', 'pypi.org' in t.netloc, - is_downloadable, is_wheel, compatible, basename) + return (t.scheme == 'https', 'pypi.org' in t.netloc, is_downloadable, is_wheel, compatible, basename) def prefer_url(self, url1, url2): """ @@ -239,14 +235,14 @@ def convert_url_to_download_info(self, url, project_name): If it is, a dictionary is returned with keys "name", "version", "filename" and "url"; otherwise, None is returned. """ + def same_project(name1, name2): return normalize_name(name1) == normalize_name(name2) result = None scheme, netloc, path, params, query, frag = urlparse(url) if frag.lower().startswith('egg='): # pragma: no cover - logger.debug('%s: version hint in fragment: %r', - project_name, frag) + logger.debug('%s: version hint in fragment: %r', project_name, frag) m = HASHER_HASH.match(frag) if m: algo, digest = m.groups() @@ -270,10 +266,8 @@ def same_project(name1, name2): 'name': wheel.name, 'version': wheel.version, 'filename': wheel.filename, - 'url': urlunparse((scheme, netloc, origpath, - params, query, '')), - 'python-version': ', '.join( - ['.'.join(list(v[2:])) for v in wheel.pyver]), + 'url': urlunparse((scheme, netloc, origpath, params, query, '')), + 'python-version': ', '.join(['.'.join(list(v[2:])) for v in wheel.pyver]), } except Exception: # pragma: no cover logger.warning('invalid path for wheel: %s', path) @@ -294,8 +288,7 @@ def same_project(name1, name2): 'name': name, 'version': version, 'filename': filename, - 'url': urlunparse((scheme, netloc, origpath, - params, query, '')), + 'url': urlunparse((scheme, netloc, origpath, params, query, '')), } if pyver: # pragma: no cover result['python-version'] = pyver @@ -371,7 +364,7 @@ def locate(self, requirement, prereleases=False): self.matcher = matcher = scheme.matcher(r.requirement) logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) versions = self.get_project(r.name) - if len(versions) > 2: # urls and digests keys are present + if len(versions) > 2: # urls and digests keys are present # sometimes, versions are invalid slist = [] vcls = matcher.version_class @@ -412,6 +405,7 @@ class PyPIRPCLocator(Locator): This locator uses XML-RPC to locate distributions. It therefore cannot be used with simple mirrors (that only mirror file content). """ + def __init__(self, url, **kwargs): """ Initialise an instance. @@ -461,6 +455,7 @@ class PyPIJSONLocator(Locator): This locator uses PyPI's JSON interface. It's very limited in functionality and probably not worth using. """ + def __init__(self, url, **kwargs): super(PyPIJSONLocator, self).__init__(**kwargs) self.base_url = ensure_slash(url) @@ -498,7 +493,7 @@ def _get_project(self, name): # Now get other releases for version, infos in d['releases'].items(): if version == md.version: - continue # already done + continue # already done omd = Metadata(scheme=self.scheme) omd.name = md.name omd.version = version @@ -511,6 +506,8 @@ def _get_project(self, name): odist.digests[url] = self._get_digest(info) result['urls'].setdefault(version, set()).add(url) result['digests'][url] = self._get_digest(info) + + # for info in urls: # md.source_url = info['url'] # dist.digest = self._get_digest(info) @@ -534,7 +531,8 @@ class Page(object): # or immediately followed by a "rel" attribute. The attribute values can be # declared with double quotes, single quotes or no quotes - which leads to # the length of the expression. - _href = re.compile(""" + _href = re.compile( + """ (rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*))\\s+)? href\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)) (\\s+rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)))? @@ -561,17 +559,16 @@ def links(self): about their "rel" attribute, for determining which ones to treat as downloads and which ones to queue for further scraping. """ + def clean(url): "Tidy up an URL." scheme, netloc, path, params, query, frag = urlparse(url) - return urlunparse((scheme, netloc, quote(path), - params, query, frag)) + return urlunparse((scheme, netloc, quote(path), params, query, frag)) result = set() for match in self._href.finditer(self.data): d = match.groupdict('') - rel = (d['rel1'] or d['rel2'] or d['rel3'] or - d['rel4'] or d['rel5'] or d['rel6']) + rel = (d['rel1'] or d['rel2'] or d['rel3'] or d['rel4'] or d['rel5'] or d['rel6']) url = d['url1'] or d['url2'] or d['url3'] url = urljoin(self.base_url, url) url = unescape(url) @@ -645,7 +642,7 @@ def _wait_threads(self): # Note that you need two loops, since you can't say which # thread will get each sentinel for t in self._threads: - self._to_fetch.put(None) # sentinel + self._to_fetch.put(None) # sentinel for t in self._threads: t.join() self._threads = [] @@ -693,7 +690,7 @@ def _process_download(self, url): info = self.convert_url_to_download_info(url, self.project_name) logger.debug('process_download: %s -> %s', url, info) if info: - with self._lock: # needed because self.result is shared + with self._lock: # needed because self.result is shared self._update_version_data(self.result, info) return info @@ -703,8 +700,7 @@ def _should_queue(self, link, referrer, rel): particular "rel" attribute should be queued for scraping. """ scheme, netloc, path, _, _, _ = urlparse(link) - if path.endswith(self.source_extensions + self.binary_extensions + - self.excluded_extensions): + if path.endswith(self.source_extensions + self.binary_extensions + self.excluded_extensions): result = False elif self.skip_externals and not link.startswith(self.base_url): result = False @@ -722,8 +718,7 @@ def _should_queue(self, link, referrer, rel): result = False else: result = True - logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, - referrer, result) + logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, referrer, result) return result def _fetch(self): @@ -738,14 +733,13 @@ def _fetch(self): try: if url: page = self.get_page(url) - if page is None: # e.g. after an error + if page is None: # e.g. after an error continue for link, rel in page.links: if link not in self._seen: try: self._seen.add(link) - if (not self._process_download(link) and - self._should_queue(link, url, rel)): + if (not self._process_download(link) and self._should_queue(link, url, rel)): logger.debug('Queueing %s from %s', link, url) self._to_fetch.put(link) except MetadataInvalidError: # e.g. invalid versions @@ -793,7 +787,7 @@ def get_page(self, url): data = resp.read() encoding = headers.get('Content-Encoding') if encoding: - decoder = self.decoders[encoding] # fail if not found + decoder = self.decoders[encoding] # fail if not found data = decoder(data) encoding = 'utf-8' m = CHARSET.search(content_type) @@ -802,7 +796,7 @@ def get_page(self, url): try: data = data.decode(encoding) except UnicodeError: # pragma: no cover - data = data.decode('latin-1') # fallback + data = data.decode('latin-1') # fallback result = Page(data, final_url) self._page_cache[final_url] = result except HTTPError as e: @@ -815,7 +809,7 @@ def get_page(self, url): except Exception as e: # pragma: no cover logger.exception('Fetch failed: %s: %s', url, e) finally: - self._page_cache[url] = result # even if None (failure) + self._page_cache[url] = result # even if None (failure) return result _distname_re = re.compile(']*>([^<]+)<') @@ -869,9 +863,7 @@ def _get_project(self, name): for fn in files: if self.should_include(fn, root): fn = os.path.join(root, fn) - url = urlunparse(('file', '', - pathname2url(os.path.abspath(fn)), - '', '', '')) + url = urlunparse(('file', '', pathname2url(os.path.abspath(fn)), '', '', '')) info = self.convert_url_to_download_info(url, name) if info: self._update_version_data(result, info) @@ -888,9 +880,7 @@ def get_distribution_names(self): for fn in files: if self.should_include(fn, root): fn = os.path.join(root, fn) - url = urlunparse(('file', '', - pathname2url(os.path.abspath(fn)), - '', '', '')) + url = urlunparse(('file', '', pathname2url(os.path.abspath(fn)), '', '', '')) info = self.convert_url_to_download_info(url, None) if info: result.add(info['name']) @@ -906,6 +896,7 @@ class JSONLocator(Locator): require archive downloads before dependencies can be determined! As you might imagine, that can be slow. """ + def get_distribution_names(self): """ Return all the distribution names known to this locator. @@ -922,9 +913,9 @@ def _get_project(self, name): # We don't store summary in project metadata as it makes # the data bigger for no benefit during dependency # resolution - dist = make_dist(data['name'], info['version'], - summary=data.get('summary', - 'Placeholder for summary'), + dist = make_dist(data['name'], + info['version'], + summary=data.get('summary', 'Placeholder for summary'), scheme=self.scheme) md = dist.metadata md.source_url = info['url'] @@ -943,6 +934,7 @@ class DistPathLocator(Locator): This locator finds installed distributions in a path. It can be useful for adding to an :class:`AggregatingLocator`. """ + def __init__(self, distpath, **kwargs): """ Initialise an instance. @@ -960,8 +952,12 @@ def _get_project(self, name): else: result = { dist.version: dist, - 'urls': {dist.version: set([dist.source_url])}, - 'digests': {dist.version: set([None])} + 'urls': { + dist.version: set([dist.source_url]) + }, + 'digests': { + dist.version: set([None]) + } } return result @@ -970,6 +966,7 @@ class AggregatingLocator(Locator): """ This class allows you to chain and/or merge a list of locators. """ + def __init__(self, *locators, **kwargs): """ Initialise an instance. @@ -1058,10 +1055,9 @@ def get_distribution_names(self): # We use a legacy scheme simply because most of the dists on PyPI use legacy # versions which don't conform to PEP 440. default_locator = AggregatingLocator( - # JSONLocator(), # don't use as PEP 426 is withdrawn - SimpleScrapingLocator('https://pypi.org/simple/', - timeout=3.0), - scheme='legacy') + # JSONLocator(), # don't use as PEP 426 is withdrawn + SimpleScrapingLocator('https://pypi.org/simple/', timeout=3.0), + scheme='legacy') locate = default_locator.locate @@ -1137,7 +1133,7 @@ def find_providers(self, reqt): :return: A set of distribution which can fulfill the requirement. """ matcher = self.get_matcher(reqt) - name = matcher.key # case-insensitive + name = matcher.key # case-insensitive result = set() provided = self.provided if name in provided: @@ -1179,8 +1175,7 @@ def try_to_replace(self, provider, other, problems): unmatched.add(s) if unmatched: # can't replace other with provider - problems.add(('cantreplace', provider, other, - frozenset(unmatched))) + problems.add(('cantreplace', provider, other, frozenset(unmatched))) result = False else: # can replace other with provider @@ -1233,8 +1228,7 @@ def find(self, requirement, meta_extras=None, prereleases=False): dist = odist = requirement logger.debug('passed %s as requirement', odist) else: - dist = odist = self.locator.locate(requirement, - prereleases=prereleases) + dist = odist = self.locator.locate(requirement, prereleases=prereleases) if dist is None: raise DistlibException('Unable to locate %r' % requirement) logger.debug('located %s', odist) @@ -1244,7 +1238,7 @@ def find(self, requirement, meta_extras=None, prereleases=False): install_dists = set([odist]) while todo: dist = todo.pop() - name = dist.key # case-insensitive + name = dist.key # case-insensitive if name not in self.dists_by_name: self.add_distribution(dist) else: @@ -1281,8 +1275,7 @@ def find(self, requirement, meta_extras=None, prereleases=False): providers.add(provider) if r in ireqts and dist in install_dists: install_dists.add(provider) - logger.debug('Adding %s to install_dists', - provider.name_and_version) + logger.debug('Adding %s to install_dists', provider.name_and_version) for p in providers: name = p.key if name not in self.dists_by_name: @@ -1297,7 +1290,6 @@ def find(self, requirement, meta_extras=None, prereleases=False): for dist in dists: dist.build_time_dependency = dist not in install_dists if dist.build_time_dependency: - logger.debug('%s is a build-time dependency only.', - dist.name_and_version) + logger.debug('%s is a build-time dependency only.', dist.name_and_version) logger.debug('find done for %s', odist) return dists, problems diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/markers.py b/venv/Lib/site-packages/pip/_vendor/distlib/markers.py index 1514d46..3f5632b 100644 --- a/venv/Lib/site-packages/pip/_vendor/distlib/markers.py +++ b/venv/Lib/site-packages/pip/_vendor/distlib/markers.py @@ -23,8 +23,7 @@ __all__ = ['interpret'] -_VERSION_PATTERN = re.compile( - r'((\d+(\.\d+)*\w*)|\'(\d+(\.\d+)*\w*)\'|\"(\d+(\.\d+)*\w*)\")') +_VERSION_PATTERN = re.compile(r'((\d+(\.\d+)*\w*)|\'(\d+(\.\d+)*\w*)\'|\"(\d+(\.\d+)*\w*)\")') _VERSION_MARKERS = {'python_version', 'python_full_version'} @@ -82,13 +81,12 @@ def evaluate(self, expr, context): elhs = expr['lhs'] erhs = expr['rhs'] if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): - raise SyntaxError('invalid comparison: %s %s %s' % - (elhs, op, erhs)) + raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) lhs = self.evaluate(elhs, context) rhs = self.evaluate(erhs, context) - if ((_is_version_marker(elhs) or _is_version_marker(erhs)) - and op in ('<', '<=', '>', '>=', '===', '==', '!=', '~=')): + if ((_is_version_marker(elhs) or _is_version_marker(erhs)) and + op in ('<', '<=', '>', '>=', '===', '==', '!=', '~=')): lhs = LV(lhs) rhs = LV(rhs) elif _is_version_marker(elhs) and op in ('in', 'not in'): @@ -111,8 +109,7 @@ def format_full_version(info): return version if hasattr(sys, 'implementation'): - implementation_version = format_full_version( - sys.implementation.version) + implementation_version = format_full_version(sys.implementation.version) implementation_name = sys.implementation.name else: implementation_version = '0' @@ -156,11 +153,9 @@ def interpret(marker, execution_context=None): try: expr, rest = parse_marker(marker) except Exception as e: - raise SyntaxError('Unable to interpret marker syntax: %s: %s' % - (marker, e)) + raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) if rest and rest[0] != '#': - raise SyntaxError('unexpected trailing data in marker: %s: %s' % - (marker, rest)) + raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) context = dict(DEFAULT_CONTEXT) if execution_context: context.update(execution_context) diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py b/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py index 7189aee..ce9a34b 100644 --- a/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py +++ b/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py @@ -15,7 +15,6 @@ import logging import re - from . import DistlibException, __version__ from .compat import StringIO, string_types, text_type from .markers import interpret @@ -40,6 +39,7 @@ class MetadataUnrecognizedVersionError(DistlibException): class MetadataInvalidError(DistlibException): """A metadata value is invalid""" + # public API of this module __all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] @@ -52,53 +52,38 @@ class MetadataInvalidError(DistlibException): _LINE_PREFIX_1_2 = re.compile('\n \\|') _LINE_PREFIX_PRE_1_2 = re.compile('\n ') -_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'License') - -_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'License', 'Classifier', 'Download-URL', 'Obsoletes', +_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', 'Summary', 'Description', 'Keywords', 'Home-page', + 'Author', 'Author-email', 'License') + +_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', 'License', 'Classifier', 'Download-URL', 'Obsoletes', 'Provides', 'Requires') -_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', - 'Download-URL') +_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', 'Download-URL') -_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'Maintainer', 'Maintainer-email', 'License', - 'Classifier', 'Download-URL', 'Obsoletes-Dist', - 'Project-URL', 'Provides-Dist', 'Requires-Dist', +_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', 'Project-URL', 'Provides-Dist', 'Requires-Dist', 'Requires-Python', 'Requires-External') -_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', - 'Obsoletes-Dist', 'Requires-External', 'Maintainer', - 'Maintainer-email', 'Project-URL') +_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', 'Obsoletes-Dist', 'Requires-External', + 'Maintainer', 'Maintainer-email', 'Project-URL') -_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'Maintainer', 'Maintainer-email', 'License', - 'Classifier', 'Download-URL', 'Obsoletes-Dist', - 'Project-URL', 'Provides-Dist', 'Requires-Dist', - 'Requires-Python', 'Requires-External', 'Private-Version', - 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', - 'Provides-Extra') +_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External', 'Private-Version', 'Obsoleted-By', 'Setup-Requires-Dist', + 'Extension', 'Provides-Extra') -_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', - 'Setup-Requires-Dist', 'Extension') +_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension') # See issue #106: Sometimes 'Requires' and 'Provides' occur wrongly in # the metadata. Include them in the tuple literal below to allow them # (for now). # Ditto for Obsoletes - see issue #140. -_566_FIELDS = _426_FIELDS + ('Description-Content-Type', - 'Requires', 'Provides', 'Obsoletes') +_566_FIELDS = _426_FIELDS + ('Description-Content-Type', 'Requires', 'Provides', 'Obsoletes') -_566_MARKERS = ('Description-Content-Type',) +_566_MARKERS = ('Description-Content-Type', ) _643_MARKERS = ('Dynamic', 'License-File') @@ -135,6 +120,7 @@ def _version2fieldlist(version): def _best_version(fields): """Detect the best version depending on the fields used.""" + def _has_marker(keys, markers): return any(marker in keys for marker in markers) @@ -163,12 +149,12 @@ def _has_marker(keys, markers): possible_versions.remove('2.2') logger.debug('Removed 2.2 due to %s', key) # if key not in _426_FIELDS and '2.0' in possible_versions: - # possible_versions.remove('2.0') - # logger.debug('Removed 2.0 due to %s', key) + # possible_versions.remove('2.0') + # logger.debug('Removed 2.0 due to %s', key) # possible_version contains qualified versions if len(possible_versions) == 1: - return possible_versions[0] # found ! + return possible_versions[0] # found ! elif len(possible_versions) == 0: logger.debug('Out of options - unknown metadata set: %s', fields) raise MetadataConflictError('Unknown metadata set') @@ -199,28 +185,25 @@ def _has_marker(keys, markers): if is_2_1: return '2.1' # if is_2_2: - # return '2.2' + # return '2.2' return '2.2' + # This follows the rules about transforming keys as described in # https://www.python.org/dev/peps/pep-0566/#id17 -_ATTR2FIELD = { - name.lower().replace("-", "_"): name for name in _ALL_FIELDS -} +_ATTR2FIELD = {name.lower().replace("-", "_"): name for name in _ALL_FIELDS} _FIELD2ATTR = {field: attr for attr, field in _ATTR2FIELD.items()} _PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') -_VERSIONS_FIELDS = ('Requires-Python',) -_VERSION_FIELDS = ('Version',) -_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', - 'Requires', 'Provides', 'Obsoletes-Dist', - 'Provides-Dist', 'Requires-Dist', 'Requires-External', - 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', +_VERSIONS_FIELDS = ('Requires-Python', ) +_VERSION_FIELDS = ('Version', ) +_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', 'Requires', 'Provides', 'Obsoletes-Dist', 'Provides-Dist', + 'Requires-Dist', 'Requires-External', 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', 'Provides-Extra', 'Extension', 'License-File') -_LISTTUPLEFIELDS = ('Project-URL',) +_LISTTUPLEFIELDS = ('Project-URL', ) -_ELEMENTSFIELD = ('Keywords',) +_ELEMENTSFIELD = ('Keywords', ) _UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') @@ -252,10 +235,10 @@ class LegacyMetadata(object): - *mapping* is a dict-like object - *scheme* is a version scheme name """ + # TODO document the mapping API and UNKNOWN default key - def __init__(self, path=None, fileobj=None, mapping=None, - scheme='default'): + def __init__(self, path=None, fileobj=None, mapping=None, scheme='default'): if [path, fileobj, mapping].count(None) < 2: raise TypeError('path, fileobj and mapping are exclusive') self._fields = {} @@ -290,8 +273,7 @@ def __delitem__(self, name): raise KeyError(name) def __contains__(self, name): - return (name in self._fields or - self._convert_name(name) in self._fields) + return (name in self._fields or self._convert_name(name) in self._fields) def _convert_name(self, name): if name in _ALL_FIELDS: @@ -319,12 +301,12 @@ def __getattr__(self, name): # Public API # -# dependencies = property(_get_dependencies, _set_dependencies) - def get_fullname(self, filesafe=False): - """Return the distribution name with version. + """ + Return the distribution name with version. - If filesafe is true, return a filename-escaped form.""" + If filesafe is true, return a filename-escaped form. + """ return _get_name_and_version(self['Name'], self['Version'], filesafe) def is_field(self, name): @@ -415,6 +397,7 @@ def update(self, other=None, **kwargs): Keys that don't match a metadata field or that have an empty value are dropped. """ + def _set(key, value): if key in _ATTR2FIELD and value: self.set(self._convert_name(key), value) @@ -437,14 +420,12 @@ def set(self, name, value): """Control then set a metadata field.""" name = self._convert_name(name) - if ((name in _ELEMENTSFIELD or name == 'Platform') and - not isinstance(value, (list, tuple))): + if ((name in _ELEMENTSFIELD or name == 'Platform') and not isinstance(value, (list, tuple))): if isinstance(value, string_types): value = [v.strip() for v in value.split(',')] else: value = [] - elif (name in _LISTFIELDS and - not isinstance(value, (list, tuple))): + elif (name in _LISTFIELDS and not isinstance(value, (list, tuple))): if isinstance(value, string_types): value = [value] else: @@ -458,18 +439,14 @@ def set(self, name, value): for v in value: # check that the values are valid if not scheme.is_valid_matcher(v.split(';')[0]): - logger.warning( - "'%s': '%s' is not valid (field '%s')", - project_name, v, name) + logger.warning("'%s': '%s' is not valid (field '%s')", project_name, v, name) # FIXME this rejects UNKNOWN, is that right? elif name in _VERSIONS_FIELDS and value is not None: if not scheme.is_valid_constraint_list(value): - logger.warning("'%s': '%s' is not a valid version (field '%s')", - project_name, value, name) + logger.warning("'%s': '%s' is not a valid version (field '%s')", project_name, value, name) elif name in _VERSION_FIELDS and value is not None: if not scheme.is_valid_version(value): - logger.warning("'%s': '%s' is not a valid version (field '%s')", - project_name, value, name) + logger.warning("'%s': '%s' is not a valid version (field '%s')", project_name, value, name) if name in _UNICODEFIELDS: if name == 'Description': @@ -539,10 +516,8 @@ def are_valid_constraints(value): return True for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), - (_VERSIONS_FIELDS, - scheme.is_valid_constraint_list), - (_VERSION_FIELDS, - scheme.is_valid_version)): + (_VERSIONS_FIELDS, scheme.is_valid_constraint_list), (_VERSION_FIELDS, + scheme.is_valid_version)): for field in fields: value = self.get(field, None) if value is not None and not controller(value): @@ -598,8 +573,7 @@ def items(self): return [(key, self[key]) for key in self.keys()] def __repr__(self): - return '<%s %s %s>' % (self.__class__.__name__, self.name, - self.version) + return '<%s %s %s>' % (self.__class__.__name__, self.name, self.version) METADATA_FILENAME = 'pydist.json' @@ -631,7 +605,7 @@ class Metadata(object): MANDATORY_KEYS = { 'name': (), 'version': (), - 'summary': ('legacy',), + 'summary': ('legacy', ), } INDEX_KEYS = ('name version license summary description author ' @@ -644,22 +618,21 @@ class Metadata(object): SYNTAX_VALIDATORS = { 'metadata_version': (METADATA_VERSION_MATCHER, ()), - 'name': (NAME_MATCHER, ('legacy',)), - 'version': (VERSION_MATCHER, ('legacy',)), - 'summary': (SUMMARY_MATCHER, ('legacy',)), - 'dynamic': (FIELDNAME_MATCHER, ('legacy',)), + 'name': (NAME_MATCHER, ('legacy', )), + 'version': (VERSION_MATCHER, ('legacy', )), + 'summary': (SUMMARY_MATCHER, ('legacy', )), + 'dynamic': (FIELDNAME_MATCHER, ('legacy', )), } __slots__ = ('_legacy', '_data', 'scheme') - def __init__(self, path=None, fileobj=None, mapping=None, - scheme='default'): + def __init__(self, path=None, fileobj=None, mapping=None, scheme='default'): if [path, fileobj, mapping].count(None) < 2: raise TypeError('path, fileobj and mapping are exclusive') self._legacy = None self._data = None self.scheme = scheme - #import pdb; pdb.set_trace() + # import pdb; pdb.set_trace() if mapping is not None: try: self._validate_mapping(mapping, scheme) @@ -693,8 +666,7 @@ def __init__(self, path=None, fileobj=None, mapping=None, # The ValueError comes from the json.load - if that # succeeds and we get a validation error, we want # that to propagate - self._legacy = LegacyMetadata(fileobj=StringIO(data), - scheme=scheme) + self._legacy = LegacyMetadata(fileobj=StringIO(data), scheme=scheme) self.validate() common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) @@ -732,8 +704,7 @@ def __getattribute__(self, key): result = self._legacy.get(lk) else: value = None if maker is None else maker() - if key not in ('commands', 'exports', 'modules', 'namespaces', - 'classifiers'): + if key not in ('commands', 'exports', 'modules', 'namespaces', 'classifiers'): result = self._data.get(key, value) else: # special cases for PEP 459 @@ -770,8 +741,7 @@ def _validate_value(self, key, value, scheme=None): m = pattern.match(value) if not m: raise MetadataInvalidError("'%s' is an invalid value for " - "the '%s' property" % (value, - key)) + "the '%s' property" % (value, key)) def __setattr__(self, key, value): self._validate_value(key, value) @@ -783,8 +753,7 @@ def __setattr__(self, key, value): if lk is None: raise NotImplementedError self._legacy[lk] = value - elif key not in ('commands', 'exports', 'modules', 'namespaces', - 'classifiers'): + elif key not in ('commands', 'exports', 'modules', 'namespaces', 'classifiers'): self._data[key] = value else: # special cases for PEP 459 @@ -872,8 +841,7 @@ def get_requirements(self, reqts, extras=None, env=None): # A recursive call, but it should terminate since 'test' # has been removed from the extras reqts = self._data.get('%s_requires' % key, []) - result.extend(self.get_requirements(reqts, extras=extras, - env=env)) + result.extend(self.get_requirements(reqts, extras=extras, env=env)) return result @property @@ -914,8 +882,7 @@ def validate(self): if self._legacy: missing, warnings = self._legacy.check(True) if missing or warnings: - logger.warning('Metadata: missing: %s, warnings: %s', - missing, warnings) + logger.warning('Metadata: missing: %s, warnings: %s', missing, warnings) else: self._validate_mapping(self._data, self.scheme) @@ -932,9 +899,8 @@ def _from_legacy(self): 'metadata_version': self.METADATA_VERSION, 'generator': self.GENERATOR, } - lmd = self._legacy.todict(True) # skip missing ones - for k in ('name', 'version', 'license', 'summary', 'description', - 'classifier'): + lmd = self._legacy.todict(True) # skip missing ones + for k in ('name', 'version', 'license', 'summary', 'description', 'classifier'): if k in lmd: if k == 'classifier': nk = 'classifiers' @@ -945,14 +911,13 @@ def _from_legacy(self): if kw == ['']: kw = [] result['keywords'] = kw - keys = (('requires_dist', 'run_requires'), - ('setup_requires_dist', 'build_requires')) + keys = (('requires_dist', 'run_requires'), ('setup_requires_dist', 'build_requires')) for ok, nk in keys: if ok in lmd and lmd[ok]: result[nk] = [{'requires': lmd[ok]}] result['provides'] = self.provides - author = {} - maintainer = {} + # author = {} + # maintainer = {} return result LEGACY_MAPPING = { @@ -969,6 +934,7 @@ def _from_legacy(self): } def _to_legacy(self): + def process_entries(entries): reqts = set() for e in entries: @@ -1037,12 +1003,10 @@ def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): else: d = self._data if fileobj: - json.dump(d, fileobj, ensure_ascii=True, indent=2, - sort_keys=True) + json.dump(d, fileobj, ensure_ascii=True, indent=2, sort_keys=True) else: with codecs.open(path, 'w', 'utf-8') as f: - json.dump(d, f, ensure_ascii=True, indent=2, - sort_keys=True) + json.dump(d, f, ensure_ascii=True, indent=2, sort_keys=True) def add_requirements(self, requirements): if self._legacy: @@ -1055,7 +1019,7 @@ def add_requirements(self, requirements): always = entry break if always is None: - always = { 'requires': requirements } + always = {'requires': requirements} run_requires.insert(0, always) else: rset = set(always['requires']) | set(requirements) @@ -1064,5 +1028,4 @@ def add_requirements(self, requirements): def __repr__(self): name = self.name or '(no name)' version = self.version or 'no version' - return '<%s %s %s (%s)>' % (self.__class__.__name__, - self.metadata_version, name, version) + return '<%s %s %s (%s)>' % (self.__class__.__name__, self.metadata_version, name, version) diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py b/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py index e16292b..b1fc705 100644 --- a/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +++ b/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py @@ -15,8 +15,7 @@ from .compat import sysconfig, detect_encoding, ZipFile from .resources import finder -from .util import (FileOperator, get_export_entry, convert_path, - get_executable, get_platform, in_venv) +from .util import (FileOperator, get_export_entry, convert_path, get_executable, get_platform, in_venv) logger = logging.getLogger(__name__) @@ -57,15 +56,16 @@ # location where it was imported from. So we load everything into memory in # advance. -# Issue 31: don't hardcode an absolute package name, but -# determine it relative to the current package -distlib_package = __name__.rsplit('.', 1)[0] +if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): + # Issue 31: don't hardcode an absolute package name, but + # determine it relative to the current package + DISTLIB_PACKAGE = __name__.rsplit('.', 1)[0] -WRAPPERS = { - r.name: r.bytes - for r in finder(distlib_package).iterator("") - if r.name.endswith(".exe") -} + WRAPPERS = { + r.name: r.bytes + for r in finder(DISTLIB_PACKAGE).iterator("") + if r.name.endswith(".exe") + } def enquote_executable(executable): @@ -97,25 +97,18 @@ class ScriptMaker(object): executable = None # for shebangs - def __init__(self, - source_dir, - target_dir, - add_launchers=True, - dry_run=False, - fileop=None): + def __init__(self, source_dir, target_dir, add_launchers=True, dry_run=False, fileop=None): self.source_dir = source_dir self.target_dir = target_dir self.add_launchers = add_launchers self.force = False self.clobber = False # It only makes sense to set mode bits on POSIX. - self.set_mode = (os.name == 'posix') or (os.name == 'java' - and os._name == 'posix') + self.set_mode = (os.name == 'posix') or (os.name == 'java' and os._name == 'posix') self.variants = set(('', 'X.Y')) self._fileop = fileop or FileOperator(dry_run) - self._is_nt = os.name == 'nt' or (os.name == 'java' - and os._name == 'nt') + self._is_nt = os.name == 'nt' or (os.name == 'java' and os._name == 'nt') self.version_info = sys.version_info def _get_alternate_executable(self, executable, options): @@ -164,6 +157,12 @@ def _build_shebang(self, executable, post_interp): """ if os.name != 'posix': simple_shebang = True + elif getattr(sys, "cross_compiling", False): + # In a cross-compiling environment, the shebang will likely be a + # script; this *must* be invoked with the "safe" version of the + # shebang, or else using os.exec() to run the entry script will + # fail, raising "OSError 8 [Errno 8] Exec format error". + simple_shebang = False else: # Add 3 for '#!' prefix and newline suffix. shebang_length = len(executable) + len(post_interp) + 3 @@ -171,15 +170,14 @@ def _build_shebang(self, executable, post_interp): max_shebang_length = 512 else: max_shebang_length = 127 - simple_shebang = ((b' ' not in executable) - and (shebang_length <= max_shebang_length)) + simple_shebang = ((b' ' not in executable) and (shebang_length <= max_shebang_length)) if simple_shebang: result = b'#!' + executable + post_interp + b'\n' else: result = b'#!/bin/sh\n' result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' - result += b"' '''" + result += b"' '''\n" return result def _get_shebang(self, encoding, post_interp=b'', options=None): @@ -190,21 +188,17 @@ def _get_shebang(self, encoding, post_interp=b'', options=None): elif not sysconfig.is_python_build(): executable = get_executable() elif in_venv(): # pragma: no cover - executable = os.path.join( - sysconfig.get_path('scripts'), - 'python%s' % sysconfig.get_config_var('EXE')) + executable = os.path.join(sysconfig.get_path('scripts'), 'python%s' % sysconfig.get_config_var('EXE')) else: # pragma: no cover if os.name == 'nt': # for Python builds from source on Windows, no Python executables with # a version suffix are created, so we use python.exe - executable = os.path.join( - sysconfig.get_config_var('BINDIR'), - 'python%s' % (sysconfig.get_config_var('EXE'))) + executable = os.path.join(sysconfig.get_config_var('BINDIR'), + 'python%s' % (sysconfig.get_config_var('EXE'))) else: executable = os.path.join( sysconfig.get_config_var('BINDIR'), - 'python%s%s' % (sysconfig.get_config_var('VERSION'), - sysconfig.get_config_var('EXE'))) + 'python%s%s' % (sysconfig.get_config_var('VERSION'), sysconfig.get_config_var('EXE'))) if options: executable = self._get_alternate_executable(executable, options) @@ -228,8 +222,8 @@ def _get_shebang(self, encoding, post_interp=b'', options=None): # check that the shebang is decodable using utf-8. executable = executable.encode('utf-8') # in case of IronPython, play safe and enable frames support - if (sys.platform == 'cli' and '-X:Frames' not in post_interp - and '-X:FullFrames' not in post_interp): # pragma: no cover + if (sys.platform == 'cli' and '-X:Frames' not in post_interp and + '-X:FullFrames' not in post_interp): # pragma: no cover post_interp += b' -X:Frames' shebang = self._build_shebang(executable, post_interp) # Python parser starts to read a script using UTF-8 until @@ -240,8 +234,7 @@ def _get_shebang(self, encoding, post_interp=b'', options=None): try: shebang.decode('utf-8') except UnicodeDecodeError: # pragma: no cover - raise ValueError('The shebang (%r) is not decodable from utf-8' % - shebang) + raise ValueError('The shebang (%r) is not decodable from utf-8' % shebang) # If the script is encoded to a custom encoding (use a # #coding:xxx cookie), the shebang has to be decodable from # the script encoding too. @@ -250,15 +243,12 @@ def _get_shebang(self, encoding, post_interp=b'', options=None): shebang.decode(encoding) except UnicodeDecodeError: # pragma: no cover raise ValueError('The shebang (%r) is not decodable ' - 'from the script encoding (%r)' % - (shebang, encoding)) + 'from the script encoding (%r)' % (shebang, encoding)) return shebang def _get_script_text(self, entry): return self.script_template % dict( - module=entry.prefix, - import_name=entry.suffix.split('.')[0], - func=entry.suffix) + module=entry.prefix, import_name=entry.suffix.split('.')[0], func=entry.suffix) manifest = _DEFAULT_MANIFEST @@ -268,9 +258,6 @@ def get_manifest(self, exename): def _write_script(self, names, shebang, script_bytes, filenames, ext): use_launcher = self.add_launchers and self._is_nt - linesep = os.linesep.encode('utf-8') - if not shebang.endswith(linesep): - shebang += linesep if not use_launcher: script_bytes = shebang + script_bytes else: # pragma: no cover @@ -283,8 +270,7 @@ def _write_script(self, names, shebang, script_bytes, filenames, ext): source_date_epoch = os.environ.get('SOURCE_DATE_EPOCH') if source_date_epoch: date_time = time.gmtime(int(source_date_epoch))[:6] - zinfo = ZipInfo(filename='__main__.py', - date_time=date_time) + zinfo = ZipInfo(filename='__main__.py', date_time=date_time) zf.writestr(zinfo, script_bytes) else: zf.writestr('__main__.py', script_bytes) @@ -315,8 +301,7 @@ def _write_script(self, names, shebang, script_bytes, filenames, ext): except Exception: pass # still in use - ignore error else: - if self._is_nt and not outname.endswith( - '.' + ext): # pragma: no cover + if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover outname = '%s.%s' % (outname, ext) if os.path.exists(outname) and not self.clobber: logger.warning('Skipping existing file %s', outname) @@ -335,9 +320,7 @@ def get_script_filenames(self, name): if 'X' in self.variants: result.add('%s%s' % (name, self.version_info[0])) if 'X.Y' in self.variants: - result.add('%s%s%s.%s' % - (name, self.variant_separator, self.version_info[0], - self.version_info[1])) + result.add('%s%s%s.%s' % (name, self.variant_separator, self.version_info[0], self.version_info[1])) return result def _make_script(self, entry, filenames, options=None): @@ -392,8 +375,7 @@ def _copy_script(self, script, filenames): self._fileop.set_executable_mode([outname]) filenames.append(outname) else: - logger.info('copying and adjusting %s -> %s', script, - self.target_dir) + logger.info('copying and adjusting %s -> %s', script, self.target_dir) if not self._fileop.dry_run: encoding, lines = detect_encoding(f.readline) f.seek(0) @@ -415,8 +397,7 @@ def dry_run(self): def dry_run(self, value): self._fileop.dry_run = value - if os.name == 'nt' or (os.name == 'java' - and os._name == 'nt'): # pragma: no cover + if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover # Executable launcher support. # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ @@ -429,7 +410,7 @@ def _get_launcher(self, kind): name = '%s%s%s.exe' % (kind, bits, platform_suffix) if name not in WRAPPERS: msg = ('Unable to find resource %s in package %s' % - (name, distlib_package)) + (name, DISTLIB_PACKAGE)) raise ValueError(msg) return WRAPPERS[name] diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/util.py b/venv/Lib/site-packages/pip/_vendor/distlib/util.py index ba58858..0d5bd7a 100644 --- a/venv/Lib/site-packages/pip/_vendor/distlib/util.py +++ b/venv/Lib/site-packages/pip/_vendor/distlib/util.py @@ -31,11 +31,9 @@ import time from . import DistlibException -from .compat import (string_types, text_type, shutil, raw_input, StringIO, - cache_from_source, urlopen, urljoin, httplib, xmlrpclib, - HTTPHandler, BaseConfigurator, valid_ident, - Container, configparser, URLError, ZipFile, fsdecode, - unquote, urlparse) +from .compat import (string_types, text_type, shutil, raw_input, StringIO, cache_from_source, urlopen, urljoin, httplib, + xmlrpclib, HTTPHandler, BaseConfigurator, valid_ident, Container, configparser, URLError, ZipFile, + fsdecode, unquote, urlparse) logger = logging.getLogger(__name__) @@ -88,8 +86,7 @@ def marker_var(remaining): else: m = STRING_CHUNK.match(remaining) if not m: - raise SyntaxError('error in string literal: %s' % - remaining) + raise SyntaxError('error in string literal: %s' % remaining) parts.append(m.groups()[0]) remaining = remaining[m.end():] else: @@ -210,8 +207,7 @@ def get_versions(ver_remaining): ver_remaining = ver_remaining[m.end():] m = VERSION_IDENTIFIER.match(ver_remaining) if not m: - raise SyntaxError('invalid version: %s' % - ver_remaining) + raise SyntaxError('invalid version: %s' % ver_remaining) v = m.groups()[0] versions.append((op, v)) ver_remaining = ver_remaining[m.end():] @@ -224,8 +220,7 @@ def get_versions(ver_remaining): break m = COMPARE_OP.match(ver_remaining) if not m: - raise SyntaxError('invalid constraint: %s' % - ver_remaining) + raise SyntaxError('invalid constraint: %s' % ver_remaining) if not versions: versions = None return versions, ver_remaining @@ -235,8 +230,7 @@ def get_versions(ver_remaining): else: i = remaining.find(')', 1) if i < 0: - raise SyntaxError('unterminated parenthesis: %s' % - remaining) + raise SyntaxError('unterminated parenthesis: %s' % remaining) s = remaining[1:i] remaining = remaining[i + 1:].lstrip() # As a special diversion from PEP 508, allow a version number @@ -267,14 +261,8 @@ def get_versions(ver_remaining): if not versions: rs = distname else: - rs = '%s %s' % (distname, ', '.join( - ['%s %s' % con for con in versions])) - return Container(name=distname, - extras=extras, - constraints=versions, - marker=mark_expr, - url=uri, - requirement=rs) + rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) + return Container(name=distname, extras=extras, constraints=versions, marker=mark_expr, url=uri, requirement=rs) def get_resources_dests(resources_root, rules): @@ -524,8 +512,7 @@ def newer(self, source, target): second will have the same "age". """ if not os.path.exists(source): - raise DistlibException("file '%r' does not exist" % - os.path.abspath(source)) + raise DistlibException("file '%r' does not exist" % os.path.abspath(source)) if not os.path.exists(target): return True @@ -601,12 +588,7 @@ def ensure_dir(self, path): if self.record: self.dirs_created.add(path) - def byte_compile(self, - path, - optimize=False, - force=False, - prefix=None, - hashed_invalidation=False): + def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): dpath = cache_from_source(path, not optimize) logger.info('Byte-compiling %s to %s', path, dpath) if not self.dry_run: @@ -617,12 +599,11 @@ def byte_compile(self, assert path.startswith(prefix) diagpath = path[len(prefix):] compile_kwargs = {} - if hashed_invalidation and hasattr(py_compile, - 'PycInvalidationMode'): - compile_kwargs[ - 'invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH - py_compile.compile(path, dpath, diagpath, True, - **compile_kwargs) # raise error + if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): + if not isinstance(hashed_invalidation, py_compile.PycInvalidationMode): + hashed_invalidation = py_compile.PycInvalidationMode.CHECKED_HASH + compile_kwargs['invalidation_mode'] = hashed_invalidation + py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error self.record_as_written(dpath) return dpath @@ -716,16 +697,14 @@ def value(self): return resolve(self.prefix, self.suffix) def __repr__(self): # pragma: no cover - return '' % (self.name, self.prefix, - self.suffix, self.flags) + return '' % (self.name, self.prefix, self.suffix, self.flags) def __eq__(self, other): if not isinstance(other, ExportEntry): result = False else: - result = (self.name == other.name and self.prefix == other.prefix - and self.suffix == other.suffix - and self.flags == other.flags) + result = (self.name == other.name and self.prefix == other.prefix and self.suffix == other.suffix and + self.flags == other.flags) return result __hash__ = object.__hash__ @@ -810,7 +789,7 @@ def get_cache_base(suffix=None): return os.path.join(result, suffix) -def path_to_cache_dir(path): +def path_to_cache_dir(path, use_abspath=True): """ Convert an absolute path to a directory name for use in a cache. @@ -820,7 +799,7 @@ def path_to_cache_dir(path): #. Any occurrence of ``os.sep`` is replaced with ``'--'``. #. ``'.cache'`` is appended. """ - d, p = os.path.splitdrive(os.path.abspath(path)) + d, p = os.path.splitdrive(os.path.abspath(path) if use_abspath else path) if d: d = d.replace(':', '---') p = p.replace(os.sep, '--') @@ -865,9 +844,8 @@ def is_string_sequence(seq): return result -PROJECT_NAME_AND_VERSION = re.compile( - '([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' - '([a-z0-9_.+-]+)', re.I) +PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' + '([a-z0-9_.+-]+)', re.I) PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') @@ -1003,11 +981,11 @@ def __init__(self, base): logger.warning('Directory \'%s\' is not private', base) self.base = os.path.abspath(os.path.normpath(base)) - def prefix_to_dir(self, prefix): + def prefix_to_dir(self, prefix, use_abspath=True): """ Converts a resource prefix to a directory name in the cache. """ - return path_to_cache_dir(prefix) + return path_to_cache_dir(prefix, use_abspath=use_abspath) def clear(self): """ @@ -1092,8 +1070,7 @@ def publish(self, event, *args, **kwargs): logger.exception('Exception during event publication') value = None result.append(value) - logger.debug('publish %s: args = %s, kwargs = %s, result = %s', event, - args, kwargs, result) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', event, args, kwargs, result) return result @@ -1145,8 +1122,7 @@ def remove(self, pred, succ): raise ValueError('%r not a successor of %r' % (succ, pred)) def is_step(self, step): - return (step in self._preds or step in self._succs - or step in self._nodes) + return (step in self._preds or step in self._succs or step in self._nodes) def get_steps(self, final): if not self.is_step(final): @@ -1242,8 +1218,7 @@ def dot(self): # Unarchiving functionality for zip, tar, tgz, tbz, whl # -ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz', - '.whl') +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz', '.whl') def unarchive(archive_filename, dest_dir, format=None, check=True): @@ -1474,8 +1449,7 @@ def _iglob(path_glob): if ssl: - from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, - CertificateError) + from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, CertificateError) # # HTTPSConnection which verifies certificates/matches domains @@ -1487,8 +1461,7 @@ class HTTPSConnection(httplib.HTTPSConnection): # noinspection PyPropertyAccess def connect(self): - sock = socket.create_connection((self.host, self.port), - self.timeout) + sock = socket.create_connection((self.host, self.port), self.timeout) if getattr(self, '_tunnel_host', False): self.sock = sock self._tunnel() @@ -1543,9 +1516,8 @@ def https_open(self, req): return self.do_open(self._conn_maker, req) except URLError as e: if 'certificate verify failed' in str(e.reason): - raise CertificateError( - 'Unable to verify server certificate ' - 'for %s' % req.host) + raise CertificateError('Unable to verify server certificate ' + 'for %s' % req.host) else: raise @@ -1561,9 +1533,8 @@ def https_open(self, req): class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): def http_open(self, req): - raise URLError( - 'Unexpected HTTP request on what should be a secure ' - 'connection: %s' % req) + raise URLError('Unexpected HTTP request on what should be a secure ' + 'connection: %s' % req) # @@ -1598,8 +1569,7 @@ def make_connection(self, host): kwargs['timeout'] = self.timeout if not self._connection or host != self._connection[0]: self._extra_headers = eh - self._connection = host, httplib.HTTPSConnection( - h, None, **kwargs) + self._connection = host, httplib.HTTPSConnection(h, None, **kwargs) return self._connection[1] @@ -1789,10 +1759,7 @@ def reader(self, stream, context): stream.close() def run_command(self, cmd, **kwargs): - p = subprocess.Popen(cmd, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - **kwargs) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kwargs) t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) t1.start() t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) @@ -1847,10 +1814,7 @@ def read(self): if 'distutils' in sections: # let's get the list of servers index_servers = config.get('distutils', 'index-servers') - _servers = [ - server.strip() for server in index_servers.split('\n') - if server.strip() != '' - ] + _servers = [server.strip() for server in index_servers.split('\n') if server.strip() != ''] if _servers == []: # nothing set, let's try to get the default pypi if 'pypi' in sections: @@ -1861,9 +1825,7 @@ def read(self): result['username'] = config.get(server, 'username') # optional params - for key, default in (('repository', - self.DEFAULT_REPOSITORY), - ('realm', self.DEFAULT_REALM), + for key, default in (('repository', self.DEFAULT_REPOSITORY), ('realm', self.DEFAULT_REALM), ('password', None)): if config.has_option(server, key): result[key] = config.get(server, key) @@ -1873,11 +1835,9 @@ def read(self): # work around people having "repository" for the "pypi" # section of their config set to the HTTP (rather than # HTTPS) URL - if (server == 'pypi' and repository - in (self.DEFAULT_REPOSITORY, 'pypi')): + if (server == 'pypi' and repository in (self.DEFAULT_REPOSITORY, 'pypi')): result['repository'] = self.DEFAULT_REPOSITORY - elif (result['server'] != repository - and result['repository'] != repository): + elif (result['server'] != repository and result['repository'] != repository): result = {} elif 'server-login' in sections: # old format @@ -2003,8 +1963,7 @@ def get_host_platform(): from distutils import sysconfig except ImportError: import sysconfig - osname, release, machine = _osx_support.get_platform_osx( - sysconfig.get_config_vars(), osname, release, machine) + osname, release, machine = _osx_support.get_platform_osx(sysconfig.get_config_vars(), osname, release, machine) return '%s-%s-%s' % (osname, release, machine) diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/version.py b/venv/Lib/site-packages/pip/_vendor/distlib/version.py index 14171ac..d70a96e 100644 --- a/venv/Lib/site-packages/pip/_vendor/distlib/version.py +++ b/venv/Lib/site-packages/pip/_vendor/distlib/version.py @@ -619,8 +619,7 @@ def parse(self, s): def is_prerelease(self): result = False for x in self._parts: - if (isinstance(x, string_types) and x.startswith('*') and - x < '*final'): + if (isinstance(x, string_types) and x.startswith('*') and x < '*final'): result = True break return result diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/wheel.py b/venv/Lib/site-packages/pip/_vendor/distlib/wheel.py index 4a5a30e..62ab10f 100644 --- a/venv/Lib/site-packages/pip/_vendor/distlib/wheel.py +++ b/venv/Lib/site-packages/pip/_vendor/distlib/wheel.py @@ -25,9 +25,8 @@ from .compat import sysconfig, ZipFile, fsdecode, text_type, filter from .database import InstalledDistribution from .metadata import Metadata, WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME -from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, - cached_property, get_cache_base, read_exports, tempdir, - get_platform) +from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, cached_property, get_cache_base, + read_exports, tempdir, get_platform) from .version import NormalizedVersion, UnsupportedVersionError logger = logging.getLogger(__name__) @@ -88,8 +87,7 @@ def _derive_abi(): \.whl$ ''', re.IGNORECASE | re.VERBOSE) -NAME_VERSION_RE = re.compile( - r''' +NAME_VERSION_RE = re.compile(r''' (?P[^-]+) -(?P\d+[^-]*) (-(?P\d+[^-]*))?$ @@ -235,8 +233,7 @@ def filename(self): arch = '.'.join(self.arch) # replace - with _ as a local version separator version = self.version.replace('-', '_') - return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, pyver, - abi, arch) + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, pyver, abi, arch) @property def exists(self): @@ -334,8 +331,7 @@ def get_hash(self, data, hash_kind=None): try: hasher = getattr(hashlib, hash_kind) except AttributeError: - raise DistlibException('Unsupported hash algorithm: %r' % - hash_kind) + raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) result = hasher(data).digest() result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') return hash_kind, result @@ -513,7 +509,7 @@ def install(self, paths, maker, **kwargs): installed, and the headers, scripts, data and dist-info metadata are not written. If kwarg ``bytecode_hashed_invalidation`` is True, written bytecode will try to use file-hash based invalidation (PEP-552) on - supported interpreter versions (CPython 2.7+). + supported interpreter versions (CPython 3.7+). The return value is a :class:`InstalledDistribution` instance unless ``options.lib_only`` is True, in which case the return value is ``None``. @@ -522,8 +518,7 @@ def install(self, paths, maker, **kwargs): dry_run = maker.dry_run warner = kwargs.get('warner') lib_only = kwargs.get('lib_only', False) - bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', - False) + bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) pathname = os.path.join(self.dirname, self.filename) name_ver = '%s-%s' % (self.name, self.version) @@ -602,8 +597,7 @@ def install(self, paths, maker, **kwargs): if lib_only and u_arcname.startswith((info_pfx, data_pfx)): logger.debug('lib_only: skipping %s', u_arcname) continue - is_script = (u_arcname.startswith(script_pfx) - and not u_arcname.endswith('.exe')) + is_script = (u_arcname.startswith(script_pfx) and not u_arcname.endswith('.exe')) if u_arcname.startswith(data_pfx): _, where, rp = u_arcname.split('/', 2) @@ -622,8 +616,7 @@ def install(self, paths, maker, **kwargs): # So ... manually preserve permission bits as given in zinfo if os.name == 'posix': # just set the normal permission bits - os.chmod(outfile, - (zinfo.external_attr >> 16) & 0x1FF) + os.chmod(outfile, (zinfo.external_attr >> 16) & 0x1FF) outfiles.append(outfile) # Double check the digest of the written file if not dry_run and row[1]: @@ -636,15 +629,12 @@ def install(self, paths, maker, **kwargs): '%s' % outfile) if bc and outfile.endswith('.py'): try: - pyc = fileop.byte_compile( - outfile, - hashed_invalidation=bc_hashed_invalidation) + pyc = fileop.byte_compile(outfile, hashed_invalidation=bc_hashed_invalidation) outfiles.append(pyc) except Exception: # Don't give up if byte-compilation fails, # but log it and perhaps warn the user - logger.warning('Byte-compilation failed', - exc_info=True) + logger.warning('Byte-compilation failed', exc_info=True) else: fn = os.path.basename(convert_path(arcname)) workname = os.path.join(workdir, fn) @@ -732,8 +722,7 @@ def install(self, paths, maker, **kwargs): outfiles.append(p) # Write RECORD - dist.write_installed_files(outfiles, paths['prefix'], - dry_run) + dist.write_installed_files(outfiles, paths['prefix'], dry_run) return dist except Exception: # pragma: no cover logger.exception('installation failed.') @@ -746,8 +735,7 @@ def _get_dylib_cache(self): global cache if cache is None: # Use native string to avoid issues on 2.x: see Python #20140. - base = os.path.join(get_cache_base(), str('dylib-cache'), - '%s.%s' % sys.version_info[:2]) + base = os.path.join(get_cache_base(), str('dylib-cache'), '%s.%s' % sys.version_info[:2]) cache = Cache(base) return cache @@ -764,7 +752,7 @@ def _get_extensions(self): wf = wrapper(bf) extensions = json.load(wf) cache = self._get_dylib_cache() - prefix = cache.prefix_to_dir(pathname) + prefix = cache.prefix_to_dir(self.filename, use_abspath=False) cache_base = os.path.join(cache.base, prefix) if not os.path.isdir(cache_base): os.makedirs(cache_base) @@ -774,8 +762,7 @@ def _get_extensions(self): extract = True else: file_time = os.stat(dest).st_mtime - file_time = datetime.datetime.fromtimestamp( - file_time) + file_time = datetime.datetime.fromtimestamp(file_time) info = zf.getinfo(relpath) wheel_time = datetime.datetime(*info.date_time) extract = wheel_time > file_time @@ -924,12 +911,10 @@ def update_version(version, path): else: parts = [int(s) for s in version[i + 1:].split('.')] parts[-1] += 1 - updated = '%s+%s' % (version[:i], '.'.join( - str(i) for i in parts)) + updated = '%s+%s' % (version[:i], '.'.join(str(i) for i in parts)) except UnsupportedVersionError: - logger.debug( - 'Cannot update non-compliant (PEP-440) ' - 'version %r', version) + logger.debug('Cannot update non-compliant (PEP-440) ' + 'version %r', version) if updated: md = Metadata(path=path) md.version = updated @@ -971,14 +956,11 @@ def update_version(version, path): update_version(current_version, path) # Decide where the new wheel goes. if dest_dir is None: - fd, newpath = tempfile.mkstemp(suffix='.whl', - prefix='wheel-update-', - dir=workdir) + fd, newpath = tempfile.mkstemp(suffix='.whl', prefix='wheel-update-', dir=workdir) os.close(fd) else: if not os.path.isdir(dest_dir): - raise DistlibException('Not a directory: %r' % - dest_dir) + raise DistlibException('Not a directory: %r' % dest_dir) newpath = os.path.join(dest_dir, self.filename) archive_paths = list(path_map.items()) distinfo = os.path.join(workdir, info_dir) @@ -1005,11 +987,20 @@ def compatible_tags(): """ Return (pyver, abi, arch) tuples compatible with this Python. """ - versions = [VER_SUFFIX] - major = VER_SUFFIX[0] - for minor in range(sys.version_info[1] - 1, -1, -1): - versions.append(''.join([major, str(minor)])) + class _Version: + def __init__(self, major, minor): + self.major = major + self.major_minor = (major, minor) + self.string = ''.join((str(major), str(minor))) + + def __str__(self): + return self.string + + versions = [ + _Version(sys.version_info.major, minor_version) + for minor_version in range(sys.version_info.minor, -1, -1) + ] abis = [] for suffix in _get_suffixes(): if suffix.startswith('.abi'): @@ -1045,35 +1036,45 @@ def compatible_tags(): minor -= 1 # Most specific - our Python version, ABI and arch - for abi in abis: - for arch in arches: - result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) - # manylinux - if abi != 'none' and sys.platform.startswith('linux'): - arch = arch.replace('linux_', '') - parts = _get_glibc_version() - if len(parts) == 2: - if parts >= (2, 5): - result.append((''.join((IMP_PREFIX, versions[0])), abi, - 'manylinux1_%s' % arch)) - if parts >= (2, 12): - result.append((''.join((IMP_PREFIX, versions[0])), abi, - 'manylinux2010_%s' % arch)) - if parts >= (2, 17): - result.append((''.join((IMP_PREFIX, versions[0])), abi, - 'manylinux2014_%s' % arch)) - result.append( - (''.join((IMP_PREFIX, versions[0])), abi, - 'manylinux_%s_%s_%s' % (parts[0], parts[1], arch))) + for i, version_object in enumerate(versions): + version = str(version_object) + add_abis = [] + + if i == 0: + add_abis = abis + + if IMP_PREFIX == 'cp' and version_object.major_minor >= (3, 2): + limited_api_abi = 'abi' + str(version_object.major) + if limited_api_abi not in add_abis: + add_abis.append(limited_api_abi) + + for abi in add_abis: + for arch in arches: + result.append((''.join((IMP_PREFIX, version)), abi, arch)) + # manylinux + if abi != 'none' and sys.platform.startswith('linux'): + arch = arch.replace('linux_', '') + parts = _get_glibc_version() + if len(parts) == 2: + if parts >= (2, 5): + result.append((''.join((IMP_PREFIX, version)), abi, 'manylinux1_%s' % arch)) + if parts >= (2, 12): + result.append((''.join((IMP_PREFIX, version)), abi, 'manylinux2010_%s' % arch)) + if parts >= (2, 17): + result.append((''.join((IMP_PREFIX, version)), abi, 'manylinux2014_%s' % arch)) + result.append((''.join( + (IMP_PREFIX, version)), abi, 'manylinux_%s_%s_%s' % (parts[0], parts[1], arch))) # where no ABI / arch dependency, but IMP_PREFIX dependency - for i, version in enumerate(versions): + for i, version_object in enumerate(versions): + version = str(version_object) result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) if i == 0: result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) # no IMP_PREFIX, ABI or arch dependency - for i, version in enumerate(versions): + for i, version_object in enumerate(versions): + version = str(version_object) result.append((''.join(('py', version)), 'none', 'any')) if i == 0: result.append((''.join(('py', version[0])), 'none', 'any')) diff --git a/venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc index a4beb2c20c5a49af69256583000286f09104fd9b..c6b75fa436ef4519081e6742735782ced2b89c97 100644 GIT binary patch delta 20 acmZ3&xrCE@IWI340}$}3`)uT%$pQc@;{*!; delta 20 acmZ3&xrCE@IWI340}#BelHSNYlLY`X`2`FB diff --git a/venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc index 9bf09689819290ee00e096e4ce61761e6d86ff66..1514ce95cf585757b13fb83fce658ee72331c4a4 100644 GIT binary patch delta 20 acmX@abcl(2IWI340}$}3`)uSkX9NH*lmpZN delta 20 acmX@abcl(2IWI340}#BelHSN|&IkZDssz;l diff --git a/venv/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc index 46d020a1fc603c9b62ae7f7435a87065baabb071..61abe7cbaa11bdb833a3e5a1f96f23386db588be 100644 GIT binary patch delta 22 ccmca|nEA?KX71&@yj%=Gz^CrBk^AIB092j^@&Et; delta 22 ccmca|nEA?KX71&@yj%=G@U}{NBlpRN09&*N^8f$< diff --git a/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc index 4b7a9fbac008033dd7b4e112985454db4c40dc57..d604c47739cfb6903fb15d3471ad27129e19bfc8 100644 GIT binary patch delta 20 acmX@eagc+1IWI340}$}3`)uSkV*vm#M+4vh delta 20 acmX@eagc+1IWI340}#BelHSN|#sUC0T?F9( diff --git a/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc index 133ca745ebbf30d4c0d99d2865202fccd494056c..75a917da7132efe4f0ea167d8ed2e88ba573a01d 100644 GIT binary patch delta 20 acmbQBJ3*IwIWI340}$}3`)uTH6$1b+G`voch diff --git a/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc index 967f063e039ea4a246b15ab4fd5c785e47d71a2b..85d09e321d298b6f3dccc643517613543e1b3916 100644 GIT binary patch delta 20 acmaFI{*Ik{IWI340}$}3`)uTX%nSfHDg@*J delta 20 acmaFI{*Ik{IWI340}#BelHSPum>B>+Kn3Lh diff --git a/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc index f263df3467e54836b4e87f1b5c829b1c5a214316..0f4f709ccf768af2fa6103376dcbc6ed4f0ca21e 100644 GIT binary patch delta 22 ccmX>-nep^wM(*Xjyj%=Gz^CrBk^6ur07~fv+W-In delta 22 ccmX>-nep^wM(*Xjyj%=G@U}{NBliJM08#%2+yDRo diff --git a/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc index f34825540274ab314e084de3dc0b86aef0478076..8027c4e5ff398a31cc91245ce6bb4f6ab54b8ea3 100644 GIT binary patch delta 25 fcmbO~lWqP?HtyxTyj%=Gz^Crh$i0=DaY_#WRf7gW delta 25 fcmbO~lWqP?HtyxTyj%=G@U}|2k$WpQobWn(UIWI340}$}3`)uSk;{*UPv;+A7 delta 20 acmX>obWn(UIWI340}#BclHSN|#t8s8(FFSd diff --git a/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc index 5bb460485a213c6d32b9c5641c110e041c031d94..b53e1bccb80156599ba90e3bb8e938bdb4f708ec 100644 GIT binary patch delta 20 acmZ4Myw;g}IWI340}$}3`)uT1qzC{ukOa2? delta 20 acmZ4Myw;g}IWI340}#BclHSO@ND%-%tp&LN diff --git a/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc index 7d150e41bb67ea5f96c4f5f7c55f5d1ff5a84b06..bde38f3c5c98db71f812c5f6a4fb84a95fa1e709 100644 GIT binary patch delta 22 ccmeBp#MJSKiF-LOFBbz4@TvQ3$>08KpxnE(I) delta 22 ccmeBp#MJSKiF-LOFBbz4ysMJl$o+Q%090BBn*aa+ diff --git a/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc index bfb0206f55792e53c4fc87df7c804f696e002d46..b613bda327ff89ee8eed432eb5666f74a25a37f3 100644 GIT binary patch delta 20 acmZ3^vYdr`IWI340}$}3`)uTvVFCavr2~in delta 20 acmZ3^vYdr`IWI340}#BclHSNI!vp{_!UT!{ diff --git a/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-311.pyc index dbc0a8d6424205306f56080af83ae4fc484592f6..20ff24eb892b343db36cc4af34640d72553d2cd0 100644 GIT binary patch delta 20 acmX@1bwZ1KIWI340}$}3`)uU46$Jn`I0Q-n delta 20 acmX@1bwZ1KIWI340}#BclHSN|D+&NTRRv4{ diff --git a/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc index 2f4d1089fcb19e928549dc4de081c61208240b6a..f7f0a35f79bce1e2078af200c1047812051ac237 100644 GIT binary patch delta 20 acmZ1wx*(K$IWI340}$}3`)uT%ss#Wy83erm delta 20 acmZ1wx*(K$IWI340}#BclHSNYRSN(qV0Ao=HkpKVy diff --git a/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc index 5aeb7128ed1d35027007cfed9680659d46a24d4b..d9dd27c489006557e1111e9e8bd5859262c24ff1 100644 GIT binary patch delta 20 acmaE>@>Yd=IWI340}$}3`)uS+5&{4_B?PJf delta 20 acmaE>@>Yd=IWI340}#BclHSOjBm@9LLItb< diff --git a/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc index 76b521aaf8f6b12c74ada02936bb162ba53d9a82..4228950e0f84ba1a7762aa49a4af37164069f7c7 100644 GIT binary patch delta 22 ccmZ2-h-t|oChq0Dyj%=Gz^CrBky~;h080V|o&W#< delta 22 ccmZ2-h-t|oChq0Dyj%=G@UBXFBeÐ$?Ypa1{> diff --git a/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc index 8d00d84fde46e25c2f06f879f6c844674c659c88..89aa83402eb632a51aade3ffd7c18f386830e445 100644 GIT binary patch delta 2357 zcmZ`(ZA@EL7`~^Uw1ontd<_VfmC=>jZs4f13JPp&2(&=QK9~%yoIB`7DLeNv9a2jc z5}Qa&=QWWZ{%DLJi_^HRSu{qCKm5@|6S?Fj5aN>gL*x8P{q~0@zNdu_=RECw&U@eU zoacSdx$im8et@ohhRkmi6c`z3W_$0%Qs9!g0##hI*Q4lRT)wCouEpK>FV})~Dcl9#`!~I#_z-yaVO4-}jNPW&k!)2x_kb?H zeP(8gPk#1bzD8G)wZCX>$U`S2b(f?0nb&6D4%{fYdUnloXw`ElrItOtil;XV)2W3k@u>_=3T_;=G-fp>3awG7bbIsec>g`E&%HDp(+rKgpSQ!ie zD&8Y<(~#0MBs-5P&ZBbKF{SKS^82pysy!Qq(Cm~L$}Kj74QDepQDGEd<~0eEgmzfjf0N+NcxTEyddnomS?j~% z9UtVmoq~;XP>nbr=fAFo4B*MO1I)N^SK&FkiKK}|JFO>_?&h1~nndmRn+(`?WmV1)~U$cNlUBMZ$t!x1jTp67`W z3{QL6cFEjX8>O^O7b}L@34WR=B@M_7AbNdV(T9E*fVE?`-er1}&+*vntBEa*=ma?epB! zEYHpgJZ7J`z>dL!+`$l>hY$qhL|BJ=G$%jC^6m-ueK~MuRhx;b}fBjIm+D zjy<)1-)PP$1Yt5KhRK*CyR7Iv)|J!C1Ljpb;mXTCjbFKoDY>ui=Rb*8#tQ-vX1~!Q>S#M1RX;s_T_1r(ESy zs$6njMGVCrh_}bj-L#a&w=S}YcSF}hA9u>0!;0r{%95%}S>QgCU44qHPqzCMyHB?G z6^lQnzojo)(O2BGmMhi<#o81ztQS?T71ga4)g^2RAu1O+l_KXt_pR#I6-{Nj3{r@l zTbzq`T#PP6*YnIVU0TPO*fnFrs zF80}VMc`>xN$>RapuePOag{XYE0lKmW~3fpy-9sGb5#?wXpqp63Qd3!;Wo|~4vlo( z*X2~hRkNY(4NlKK<zA^%=IziP0p7;MQQ zKZlyg-;_N}p`3yVrZ`Z>A%Mwb>yms($0!^~{@gDjirvj5IZ4D4dlb;Sr zssdg1EPP4ne@Z>a=TS>Cb-WSP(@NgVhgxrL>5-496{Aoi6%W@K?Jx{~Mz}5QAO1PN z&>9ac+v3NUq6_&+&&eNeI}> Kp;}rRdHNr(E{KKz delta 693 zcmZ8dOH30{6rDG;qm)9hAk<(}K5bzDDYj!ABl1zHwuOFZr-eZxEw?HQE16a!eu9f8 zZd{H_`jH?=Pf^p%(#Dz_C;gB&TY}}b>)EE~U7k+LDG12#4?z#7z^KR~YE3e4) zr=;e7b+w7X_4!iM>F55NHCAF?X?KtXA2b#WvK@}Waj+GPax?hBj!X*#pcSzdg5W}I zL&peopuV5eOc(PHI%4W~yQ~6m{Vi)!sOrxn8b>o29VAxU4J|1#yCrMi8<2_gI zNkwll_b|9F46g~p&t^0spbLSLr!-XZ=t4;A3hP~A%^A_15zP|SEm4~FO?vx^JBzth z?~|%^(Z448OKqAM(#23oc^!$C6kQzC+%er9)A+c~$F&AYZ;;eqz6-4SHgc8a41{6c z5j7oKB7~v8PF*{e<@gM{7=)tVK#Y-%hALRZJ_q*8q|o+qT9 z2IOy~Ssj`@!y4=GqC str: return "i386" -def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> list[str]: +def _mac_binary_formats(version: AppleVersion, cpu_arch: str) -> list[str]: formats = [cpu_arch] if cpu_arch == "x86_64": if version < (10, 4): @@ -396,7 +396,7 @@ def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> list[str]: def mac_platforms( - version: MacVersion | None = None, arch: str | None = None + version: AppleVersion | None = None, arch: str | None = None ) -> Iterator[str]: """ Yields the platform tags for a macOS system. @@ -408,7 +408,7 @@ def mac_platforms( """ version_str, _, cpu_arch = platform.mac_ver() if version is None: - version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2]))) + version = cast("AppleVersion", tuple(map(int, version_str.split(".")[:2]))) if version == (10, 16): # When built against an older macOS SDK, Python will report macOS 10.16 # instead of the real version. @@ -424,7 +424,7 @@ def mac_platforms( stdout=subprocess.PIPE, text=True, ).stdout - version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2]))) + version = cast("AppleVersion", tuple(map(int, version_str.split(".")[:2]))) else: version = version if arch is None: @@ -483,6 +483,63 @@ def mac_platforms( ) +def ios_platforms( + version: AppleVersion | None = None, multiarch: str | None = None +) -> Iterator[str]: + """ + Yields the platform tags for an iOS system. + + :param version: A two-item tuple specifying the iOS version to generate + platform tags for. Defaults to the current iOS version. + :param multiarch: The CPU architecture+ABI to generate platform tags for - + (the value used by `sys.implementation._multiarch` e.g., + `arm64_iphoneos` or `x84_64_iphonesimulator`). Defaults to the current + multiarch value. + """ + if version is None: + # if iOS is the current platform, ios_ver *must* be defined. However, + # it won't exist for CPython versions before 3.13, which causes a mypy + # error. + _, release, _, _ = platform.ios_ver() # type: ignore[attr-defined] + version = cast("AppleVersion", tuple(map(int, release.split(".")[:2]))) + + if multiarch is None: + multiarch = sys.implementation._multiarch + multiarch = multiarch.replace("-", "_") + + ios_platform_template = "ios_{major}_{minor}_{multiarch}" + + # Consider any iOS major.minor version from the version requested, down to + # 12.0. 12.0 is the first iOS version that is known to have enough features + # to support CPython. Consider every possible minor release up to X.9. There + # highest the minor has ever gone is 8 (14.8 and 15.8) but having some extra + # candidates that won't ever match doesn't really hurt, and it saves us from + # having to keep an explicit list of known iOS versions in the code. Return + # the results descending order of version number. + + # If the requested major version is less than 12, there won't be any matches. + if version[0] < 12: + return + + # Consider the actual X.Y version that was requested. + yield ios_platform_template.format( + major=version[0], minor=version[1], multiarch=multiarch + ) + + # Consider every minor version from X.0 to the minor version prior to the + # version requested by the platform. + for minor in range(version[1] - 1, -1, -1): + yield ios_platform_template.format( + major=version[0], minor=minor, multiarch=multiarch + ) + + for major in range(version[0] - 1, 11, -1): + for minor in range(9, -1, -1): + yield ios_platform_template.format( + major=major, minor=minor, multiarch=multiarch + ) + + def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]: linux = _normalize_string(sysconfig.get_platform()) if not linux.startswith("linux_"): @@ -512,6 +569,8 @@ def platform_tags() -> Iterator[str]: """ if platform.system() == "Darwin": return mac_platforms() + elif platform.system() == "iOS": + return ios_platforms() elif platform.system() == "Linux": return _linux_platforms() else: diff --git a/venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc index fa54a1928c003b789892941712df9e5b01edf049..85bdf4c3d86844a35c39845763bf78575a7538c3 100644 GIT binary patch delta 28 icmX@~lv diff --git a/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc index 541af917188324503ccd6143876674d8198ea711..6e218c677e109fca6646e280900acbff7f1ef1ef 100644 GIT binary patch delta 22 ccmZ40$hfMJk$X8WFBbz4@TvQ3 delta 22 ccmZ40$hfMJk$X8WFBbz4ysMJl$UWZy07=4`R0UfA delta 20 acmaD}^t_0BIWI340}#BclHSN2V+jCEaRyxg diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc index ed758d54e35f36665fce620068a7942df1e55025..0b2df56f86081579193535d14fa2f3607ef1b734 100644 GIT binary patch delta 20 acmaDa`(BoNIWI340}$}3`)uTX!Uq65bp;*( delta 20 acmaDa`(BoNIWI340}#BclHSPugbx5hk_I3E diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc index 1e07818327ad51dad70afae25ff8c93fcaed8100..a7d053fd85b21d0353f11ac103b72f2cd4f3eb6d 100644 GIT binary patch delta 20 acmZo+YhmMF&dbZi00eyMJ{!4zG64W6bp#^- delta 20 acmZo+YhmMF&dbZi00i%d>0AwNuoB#j- diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc index a63942f6bab799bc88da526b972f72a00fb02f64..ea5009d81efd2c45b7e1123855731d09e584da7f 100644 GIT binary patch delta 20 acmaDP{z#mAIWI340}$}3`)uUC&J6%Kk_6}g delta 20 acmaDP{z#mAIWI340}#BclHSODof`l@uLbG= diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc index d7d8e72d2ba624fe70000460410ee7694e1b9e70..199de206945de43706dfa2bbe1ddaa1d8f76f238 100644 GIT binary patch delta 20 acmZ1|y-=EaIWI340}$}3`)uT%#tQ&0`~)um delta 20 acmZ1|y-=EaIWI340}#BclHSNYjTZnm83i!_ diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc index d0165e683f7300f9779c348a32ff5b2c3f795958..d530ae7eba6df1ba71fbd6a15e1db8c75e152c09 100644 GIT binary patch delta 20 acmaE(_C}3+IWI340}$}3`)uS+6b1l0Mg*(? delta 20 acmaE(_C}3+IWI340}#BclHSOjC=38XV+F1N diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc index 2f1a7b85a25d4f19a907af0635a36e37013d0f8f..18d433f4586f75bb7bfaf01b04f41f0e57369278 100644 GIT binary patch delta 22 ccmaEPis|JkChq0Dyj%=Gz^CrBkvncF09VxpfdBvi delta 22 ccmaEPis|JkChq0Dyj%=G@UBXFBX`_V0ABJ3g8%>k diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc index 346785ce89e99f39a71a5b6c967de0e54b3e1212..43db32e29495e00febfdb032c519a11fb51458cf 100644 GIT binary patch delta 20 acmdnOyM>o~IWI340}$}3`)uT1$p!!~^#nx# delta 20 acmdnOyM>o~IWI340}#BclHSO@k_`Yi5(P&9 diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc index 8402c131ed4769abc93b8dc7ac6e6fafe785c709..c5fa23a2af9e6297d8a8280d85a0b360ab55170c 100644 GIT binary patch delta 20 acmZ1^wn&V7IWI340}$}3`)uSE=LP^RZUd$O delta 20 acmZ1^wn&V7IWI340}#BclHSNI&J6%Giv*|u diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc index 4e3331d1b65775549d13089f0024658d902755ac..00c06ad36cf5a8749c37e4b376db31131d963a34 100644 GIT binary patch delta 20 acmbQIK2M!{IWI340}$}3`)uT%EDQiJIs`-j delta 20 acmbQIK2M!{IWI340}#BclHSNYSr`B}R|Q4@ diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc index f721ad943951644f7224c599c3c7af98910d340b..3f9cb700550b0feaed4aaa578efe055e0863c880 100644 GIT binary patch delta 20 ZcmeBG>s8}k&dbZi00eyMJ{!52gaIsW1CIaz delta 20 acmeBG>s8}k&dbZi00i%2 diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc index 1a34731decb5898940ef3eb196c4f22c6801b022..e5ba499b4ceebd24baeb01e9dd02a89c30a18377 100644 GIT binary patch delta 20 acmZ2%wb+V#IWI340}$}3`)uTvkOcrTxC8?L delta 20 acmZ2%wb+V#IWI340}#BclHSNIAqxOG)dd9r diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc index 977a1b00273b6e2725709dba2a96c6ea6047598e..9d95fbca850bc9bf2b70ea1859764163c8b101cb 100644 GIT binary patch delta 20 acmX?Zb=-=3IWI340}$}3`)uU4kp%!aSOjkX delta 20 acmX?Zb=-=3IWI340}#BclHSN|BMSgObp>$% diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc index 3d80975d2689ee10a289e4be59ccfb6701c97f17..0354f7ac5dc138b36ef6e88fa2c2db0ae15d4c5d 100644 GIT binary patch delta 22 ccmZ42!L+V}iF-LOFBbz4@TvQ3QU;m; diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc index 9e9da73ad35eedfcb5733594154f206c9e39fa56..cf0211b75e82b82aa6840df65e694bebdca47f35 100644 GIT binary patch delta 22 ccmbPwk!k8hChq0Dyj%=Gz^CrBk-KXJ087mV761SM delta 22 ccmbPwk!k8hChq0Dyj%=G@UBXFBX`#d08;7)7ytkO diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc index 30ccd79748b3e8b785c3c94e2cd39f75eaf55115..ec9d8406f4ac8c7122fa64714a48b2e4cbe915dc 100644 GIT binary patch delta 22 ccmX^8hVk?pM(*Xjyj%=Gz^CrBk=vmR09U03IsgCw delta 22 ccmX^8hVk?pM(*Xjyj%=G@UBXFBez2t0A9ieJOBUy diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc index 7617d9be5d19236eb7da0a635cd1e969cb8069d6..47170f78f098179e59f69a96e955103801d5796c 100644 GIT binary patch delta 20 acmexk_{WfYIWI340}$}3`)uU?C;t<8 diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc index 5a4c14e7da5539416ae2a8138c4ad6fb754a9801..99d2ae2a34e46f5545fc2c650f722dde1341324b 100644 GIT binary patch delta 20 acmca=ebt(KIWI340}$}3`)uSsB?|yMtOXkY delta 20 acmca=ebt(KIWI340}#BclHSODN)`Y@$p#$& diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc index 851c3884fe85c45020fd91a9f408d6daaf5985d0..24261c23cff0e1d5e054d6750b534d3ccdbe1e1b 100644 GIT binary patch delta 20 acmbOzIZ={(IWI340}$}3`)uTH;{gCHGXwen delta 20 acmbOzIZ={(IWI340}#BclHSPO#sdH|Pz3w{ diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc index c0aabb03bf0553faefd22fa6e2c00913de9a7090..ec19d5a8bc154146edc71801b2dd8581b5ce35ee 100644 GIT binary patch delta 20 acmZ2byr7tSIWI340}$}3`)uT%Y6$>4Ueb$?MIWI340}$}3`)uSsqzV8$v;`{w delta 20 acmX@>eb$?MIWI340}#BclHSODNEHA>(FQF5 diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc index fd5231d2395a29e3afdd41de75d65d6a42d48060..e4e0e635a66e8a7e62a27033e2fe4dd78968dfce 100644 GIT binary patch delta 20 acmbQFKS`f^IWI340}$}3`)uTH7Y6_@egrfC delta 20 acmbQFKS`f^IWI340}#BclHSPOE)D=Tn*}xi diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc index 436b061089639f9eea59bc71a729910595190289..cf8f7438384e4ad454d0032f5e0ece937a9f13bd 100644 GIT binary patch delta 22 ccmbQxz&N3Sk$X8WFBbz4@TvQ3 diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc index 746c47ccedeb6b525909a96601c233e05f31e79f..d07b653903a5f901b77f3216e31243717994fd68 100644 GIT binary patch delta 20 acmbOuF-L-XIWI340}$}3`)uSEnb54ePIWI340}$}3`)uTP<^upVDFitH delta 20 acmX>nb54ePIWI340}#BclHSPe%m)BGMg=W`nFK%p delta 20 acmdnVx|5ZAIWI340}#BclHSO@jtKxZwgo}} diff --git a/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc index ffb6322e761e97f8bbacd111944a6117037f79ba..1955bd0c1493fb716fc0189013ead31e6ef0e3be 100644 GIT binary patch delta 20 ZcmeBX?q=p*&dbZi00eyMJ{!3k7y&3C1F--A delta 20 acmeBX?q=p*&dbZi00i%=kpKVy diff --git a/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc index 8712da9c60b148d3ce72fe43cb60a93d20b9d3ab..a3e49a2ec22262c2d5bcfb8e59c2d71e341c87aa 100644 GIT binary patch delta 20 ZcmZqWY~|!$&dbZi00eyMJ{!5KSO6#s1Fir7 delta 20 acmZqWY~|!$&dbZi00i%b%sCSG delta 20 acmX@aa)^a{IWI340}#BclHSN|&IAB9`UKkm diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc index 77081e5dce4c0631f1fd12839cb7af9af1fb50f1..636a78a8bdf7f57c506846801b10a8b0516a53a4 100644 GIT binary patch delta 20 acmca7a8H1HIWI340}$}3`)uS6<^TXS^8`x( delta 20 acmca7a8H1HIWI340}#BclHSN2%mDyB5Cu&D diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc index cfd35536ea9448ca9ea278c7a9420c8e9d79685a..65a216414a8f8543229b61b93ef614b28c672728 100644 GIT binary patch delta 22 ccmbRFfpO*sM(*Xjyj%=Gz^CrBk(;jq08iZot^fc4 delta 22 ccmbRFfpO*sM(*Xjyj%=G@UBXFBR5|K09N`2umAu6 diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc index 88a69aead296540cd22836a6627e5b5cb764ca7f..549a8f206dc119cdb8886957837322f1549fbd18 100644 GIT binary patch delta 20 acmX?Zb=-=3IWI340}$}3`)uU4kp%!aSOjkX delta 20 acmX?Zb=-=3IWI340}#BclHSN|BMSgObp>$% diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc index fd1111fd927984251a6f3bf0adbef2b25b7c05b5..8155d2a39710118645fa92eff4d06808483bd9a9 100644 GIT binary patch delta 20 acmbPNG_QzzIWI340}$}3`)uSEwgdn<>;!-S delta 20 acmbPNG_QzzIWI340}#BclHSNIYzY8C2?c@x diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc index 9a7c2d0a6ad492c313c45f311244625041511710..af858da38776bb6192466d5c17a571398bced6df 100644 GIT binary patch delta 20 acmX@devX}cIWI340}$}3`)uSs%nSfCDg=Z8 delta 20 acmX@devX}cIWI340}#BclHSODm>B>%M+Jre diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc index 3956b2c54920415856a3afa3ce4d4c3910cd4de7..898ecc317e4359957b99e0059b438d5aa48e32b7 100644 GIT binary patch delta 20 acmdnVzmuPPIWI340}$}3`)uT1#|{871_W6E delta 20 acmdnVzmuPPIWI340}#BclHSO@jvW9vBL!Ok diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc index b16037e9cf83eda589643f441e7d6da00f0c0a1d..5265d06e50b336e7e6958b5a0c0c7d8f0bb16722 100644 GIT binary patch delta 22 ccmex!neoqMM(*Xjyj%=Gz^CrBk^5sN09^zJ4gdfE delta 22 ccmex!neoqMM(*Xjyj%=G@UBXFBlpKl0AwKu5C8xG diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc index 4e6d40133ad76fdfc416f8d57dc0d9479b0e7d16..cacc17f7acc9410f9a3ebaf51065f22329e1ad14 100644 GIT binary patch delta 20 acmez3_Qj2RIWI340}$}3`)uUSR0aS+76lXl delta 20 acmez3_Qj2RIWI340}#BclHSOjsSE%}GX@p_ diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc index 1f6a32d7f120577288cfc283ca030e93e2e6db74..ec03bf2f4cb883fd9c18514abba2e43ef76bca58 100644 GIT binary patch delta 20 acmZ3Zv_^@0IWI340}$}3`)uS^6a)Y;v;*P* delta 20 acmZ3Zv_^@0IWI340}#BclHSOzCKIWI340}$}3`)uSs&jJ87Qv|I5 delta 20 acmcb`d5e>KIWI340}#BclHSODo&^9ra0Rab diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc index f35e9a0e992d9d85af1017016ac309657b8f96ad..bbba64532f263333c52de31bdb30641ac2e9cf06 100644 GIT binary patch delta 22 ccmbQWo@v&4Chq0Dyj%=Gz^CrBk-L9707qp7&;S4c delta 22 ccmbQWo@v&4Chq0Dyj%=G@UBXFBX|FF08WAi(f|Me diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc index 241bed65b426f6e1f70826eeec2006454d7f65bc..1820859813d2c59bdfb1d1e2c454171d99cd7054 100644 GIT binary patch delta 20 acmdnRwTp{;IWI340}$}3`)uUaX9WN+cmvP? delta 20 acmdnRwTp{;IWI340}#BclHSOz&k6uGl?2iN diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc index d527d97c5e447260739745d21aca5413609ce78a..4d9b7daf29c9c8974dae83873fc7c85cb6dfdd96 100644 GIT binary patch delta 22 ccmezLg7MP}M(*Xjyj%=Gz^CrBkvqKv09}*@r2qf` delta 22 ccmezLg7MP}M(*Xjyj%=G@UBXFBX@cU0A#TTrvLx| diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc index 6df33ba8deffc216ac844de34ecfb7bae95c8a52..1ecf68cda2ff5c46db3150b1331fa22974b898b1 100644 GIT binary patch delta 20 acmbPhIMkoCRC} diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc index 80135f184e61167e713ff8b2d23932cfbbb8b7d6..4e373baa4411478391334f1314c3aeea363def40 100644 GIT binary patch delta 20 acmX?RaLj;vIWI340}$}3`)uU4mH+@Y!vs?R delta 20 acmX?RaLj;vIWI340}#BclHSN|Edc;M;009x diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc index f0f1dd092dff30091a5ddc12e95bb370db29c0fa..faf938a9da23a4dda2b2ca6a1e5a9ccf585972d7 100644 GIT binary patch delta 22 ccmbQZmucc&Chq0Dyj%=Gz^CrBk-Kdk07wf3*Z=?k delta 22 ccmbQZmucc&Chq0Dyj%=G@UBXFBX`?808c0e+5i9m diff --git a/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc index 53367cc9a0414a627dcc68a6335201e51fa30a16..50015a04918e62c454e7836177e5e4029b735ca3 100644 GIT binary patch delta 20 acmaFK`jVAX383fP( delta 20 acmaFK`jVAlWi)&dbZi00eyMJ`1_I0VYrbQ2+n{ delta 19 ZcmeAc>lWi)&dbZi00i%*1XBP2 diff --git a/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc index 95243e07d4793668ed2867db5cfe3e7df487a6fa..65d4c593ba7d4fb4a2aba600cc824a89c4588ca0 100644 GIT binary patch delta 22 ccmZ4egmLu~M(*Xjyj%=Gz^CrBkz1h%08t4A#sB~S delta 22 ccmZ4egmLu~M(*Xjyj%=G@UBXFBey~k09Yml$N&HU diff --git a/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc index 76696a677944481f7e9a41954ca04b8e6ea1116a..ef1fd50e2b7f1113e62f8e7f09a15d00f9d2510f 100644 GIT binary patch delta 20 acmX>Rc_NZ~IWI340}$}3`)uUis{;T%>jggm delta 20 acmX>Rc_NZ~IWI340}#BclHSO@R|fz^2nIm_ diff --git a/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc index 58d05f39dd52a66b3dbe76a5fe08aed362c8f84e..4c5e866fe5dc2b1d47b39e0f6b41974e9aa60825 100644 GIT binary patch delta 19 ZcmX@Xc!H68IWI340}$}3`%L8C3ji#f1VaD- delta 19 ZcmX@Xc!H68IWI340}#BclAg%D7XUK11w{Y= diff --git a/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc index e780f358e09c3c33d92c0f1c3551c7179c32bf58..ea149df72b37b2dab1ce3e6ef8a89b816438cb43 100644 GIT binary patch delta 20 acmcc3e4CkjIWI340}$}3`)uUCzz6^|pah`+ delta 20 acmcc3e4CkjIWI340}#BclHSODfe`>Zy#=EH diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc index 132636e52678048c9c32fafb494660ae58761196..d786aa9e2581eda3c56e605691dac32e1e8e5d30 100644 GIT binary patch delta 20 acmX?Lb-;>yIWI340}$}3`)uSkl?4DdKm=L< delta 20 acmX?Lb-;>yIWI340}#BclHSN|DhmKUT?JeK diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc index 8e55ada1a35367857f8da97f9ac26e008cdc96a1..d811b3538ce871c4ae844b5079a068654f48c9fa 100644 GIT binary patch delta 20 acmZ1%wJwT#IWI340}$}3`)uS^)&&4L00eXZ delta 20 acmZ1%wJwT#IWI340}#BclHSOztP21@9R+p( diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc index d70d659d619939994fb202027dc1e23738bf5668..c672172e6964c66d5d974b959b902b3f1f33350f 100644 GIT binary patch delta 20 acmX?Rd(4)5IWI340}$}3`)uUiEe8NOodoj$ delta 20 acmX?Rd(4)5IWI340}#BclHSO@TMhs~x&`$B diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc index 2cc28643825518c6d08dca336d3940ad344d744c..8fc0bc46869ef9ae534ce816136583816fa2d3e9 100644 GIT binary patch delta 31 lcmZp=%hPn1hkH3MFBbz4@TvPWa<_6bwsJFVH> delta 20 acmey&@|lHuIWI340}#BclHSOj!2|$4q6KaM diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc index 70e99a8a1505307ecd0edceeca1fdc69f1bccd62..2cede0583372c8f7dad80650d3beeba7fec4c054 100644 GIT binary patch delta 20 acmX@fev+MgIWI340}$}3`)uUi#|!{6Vgz*n delta 20 acmX@fev+MgIWI340}#BclHSO@j~M_te+72{ diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc index dc17f969b4bbc35265dc19b268397ae61cb58396..0b13124c35c124b4b41172180d933dc054556ace 100644 GIT binary patch delta 20 acmaEy_c)JxIWI340}$}3`)uTnFb4ocA_YYN delta 20 acmaEy_c)JxIWI340}#BclHSN2VGaOGKL$qt diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc index c65f40a93aa33fba0616266ddd33fad54ce5ba26..1c2d818fbffaa8cb3b794379d9eeae65b8f6dcfa 100644 GIT binary patch delta 20 acmbQKI#ZQt8IWI340}$}3`)uSk-~a$HdjsMC delta 20 acmdljuv>t8IWI340}#BclHSN|zySa^m;~ei diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc index e7d6ee3fa443c2b9f6ab3c2b46c1610b951c86a5..2af51f55d5177ae6f20aabfafe285bbb2eee4db8 100644 GIT binary patch delta 20 acmX@6a7=-FIWI340}$}3`)uU4761S=dju;0 delta 20 acmX@6a7=-FIWI340}#BclHSN|EdT&Jm<25W diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc index 2357176dff2aa5287bc77c71347100218c3fe45d..d0d41ffbafb91079c0ab1a608f9181ddbe535d9f 100644 GIT binary patch delta 20 acmeyZ@mqs?IWI340}$}3`)uSc5CH%^=LFsW delta 20 acmeyZ@mqs?IWI340}#BclHSN&AOZkI1O?y# diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc index 3752dde47d5dc10943b1302fef835efe2cee06cd..378e5fc6248e87cef978117af5f0657fac91f199 100644 GIT binary patch delta 20 acmbQtHkplkIWI340}$}3`)uUqUjYB( diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc index 51402629a1f1aa75fc3ae1f0d030e64bb92bb097..527e5920e50f99fc745d411f93ef211c5dc48fc0 100644 GIT binary patch delta 20 acmexj`^A=fIWI340}$}3`)uTXDF*;R%>{h` delta 20 acmexj`^A=fIWI340}#BclHSPuQVsw|>IQ!R diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc index 381d83d5e9048822449334b998e8a106ec969d51..bf9e268369bfc1e1dfae1f12f322584512ebd476 100644 GIT binary patch delta 20 acmaEp^(KpZIWI340}$}3`)uS+Gz9=e_ytw~ delta 20 acmaEp^(KpZIWI340}#BclHSOjXbJ#K6$V%U diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc index 576ceba14b214d75da4c475271316a7a8801030a..bb1c74c965f239a9036a6e05beb43076caceb47a 100644 GIT binary patch delta 20 acmaFF@rZ+aIWI340}$}3`)uS6X8`~;Zv;aC delta 20 acmaFF@rZ+aIWI340}#BclHSN2&H?~Dj0Hsi diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc index a7fc5e61a1902c1023ca4c1be48066569a2cfba8..b4b8c4f2c78b190df587e5b41e7cd10ef60ebd80 100644 GIT binary patch delta 20 acmX@lex99sIWI340}$}3`)uSs!VCa2QUr$p delta 20 acmX@lex99sIWI340}#BclHSODgc$%jZv}|} diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc index 09018da348b1dc11c78b46f85f58b3e55435a1e1..1cae5e7d31602176cd75af6daf15ce47bb46d672 100644 GIT binary patch delta 22 ccmccon(^{$M(*Xjyj%=Gz^CrBk^4j`09n-r&j0`b delta 22 ccmccon(^{$M(*Xjyj%=G@UBXFBln3?0ATV5(EtDd diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc index 4fd6b63108dc813522a8c218a286f1ad86b31ace..47197885c30bcee319840cb96f87485a10ce6d2f 100644 GIT binary patch delta 20 acmZn@YZK#M&dbZi00eyMJ{!4za{&M=4FpjD delta 20 acmZn@YZK#M&dbZi00i%y+bO&dbZi00eyMJ{!6J@c{rVsRV8S delta 20 acmeB_>y+bO&dbZi00i% diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc index 6a97d15fb1e05f93872e0796079a07b3dfb9861e..ef00b2dc68b15e85f41992fa45dbad5d36a6a752 100644 GIT binary patch delta 20 acmbQ5IW?1eIWI340}$}3`)uUyG64WMI|R-E delta 20 acmbQ5IW?1eIWI340}#BclHSPOWdZ;{SOw4k diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc index e332027ae667df0aebb9485beb42d6de2160d4e5..0fb37f1033f00515c18216560efa66a6c930958b 100644 GIT binary patch delta 20 acmewp_$QEiIWI340}$}3`)uU?r~v>(=LN?A delta 20 acmewp_$QEiIWI340}#BclHSPuQ3C)>1O~|f diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc index 0f50a93d65369cacd35737d77d64a4a3504e4d97..9beb28980baf67315860be35698e229ed745fc5f 100644 GIT binary patch delta 20 acmdn1yjPifIWI340}$}3`)uUiBnSXBfCQHS delta 20 acmdn1yjPifIWI340}#BclHSO@Ne}=#oduZy diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc index 5821b4591f24e7a2120815032d725a9dd77b6b9d..2b7ab28ab0e73575ab6a542cd7b4452f5ae16d49 100644 GIT binary patch delta 20 acmdmS9IWI340}$}3`)uT1V*~&^`2{Kf delta 20 acmdmS9IWI340}#BclHSO@#s~mJ76vQ; diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc index bee69abedeaf41b33143de4bfdba5bfedc7fc0b0..4104921ddfab769d5d8999264ef25f55ff3ff2ef 100644 GIT binary patch delta 20 acmaE5{K}YnIWI340}$}3`)uUCF9`rW&;>>S delta 20 acmaE5{K}YnIWI340}#BclHSODUlIUB?FL8y diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc index cf08268f181f2420592822536fd8f2a89586bb71..beb7757b5fd8eaeac494a6de30a3030cf9f35c6f 100644 GIT binary patch delta 22 ccmbPwlX2=zM(*Xjyj%=Gz^CrBk-IAg08FF>=l}o! delta 22 ccmbPwlX2=zM(*Xjyj%=G@UBXFBX?I008_yR>Hq)$ diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc index b26c2dc411a007fa8c403ef814022598ce21732f..f4c5a30412e97878d56898279b439443435da848 100644 GIT binary patch delta 20 acmX@jcbboTIWI340}$}3`)uTPUO6DcJAf8yj%=Gz^Crh$i0=D@%bYFZKDV3 delta 25 fcmex#l>O6DcJAf8yj%=G@UBX_k$WpQ=mZG> delta 20 acmbO&JX@H1IWI340}#BclHSNYffE2U1qBNL diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc index 5a805fa3c6ce2811d273ca9163182bcdf46c54e4..3da6f7097d4477bace8799c0501513626a38d103 100644 GIT binary patch delta 20 acmdlQvNeQzIWI340}$}3`)uUa(gFZEJp_6H delta 20 acmdlQvNeQzIWI340}#BclHSOzr3C;$S_OOn diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc index 1d063495689bca35ff8a812cdcca4f2473fa2c12..1714356e0dfd07b45eff7a5032d9cf9402642813 100644 GIT binary patch delta 20 acmewy^ErllIWI340}$}3`)uUS&;tNO5d}y9 delta 20 acmewy^ErllIWI340}#BclHSOjp$7mbIWI340}$}3`)uUqW(NQ&Y6ETn delta 20 acmbQnH;s>bIWI340}#BclHSP8%?^tb1SS9g delta 20 acmeA&?lR_H&dbZi00i%;M1& delta 22 ccmeC&#@M-yk$X8WFBbz4ysMJl$o(%008Lf~?f?J) diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc index 8869fca34afc0b6b73ff2dae96d45b46d884aa16..cc17627b8813356d3e69d5cbf3bbd9e7daf619bb 100644 GIT binary patch delta 22 ccmZ3zjB)icM(*Xjyj%=Gz^CrBky{}c07rNQD*ylh delta 22 ccmZ3zjB)icM(*Xjyj%=G@UBXFBey~@08W(#EdT%j diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc index 48411a34bd0c0ed1502c9471390258cf4aec486b..531f73fbe73bdb40fc426560d16116bd3cd51c31 100644 GIT binary patch delta 20 acmbQNFMIWI340}$}3`)uS6lK}uc9|X7n delta 20 acmaE8@z8>MIWI340}#BclHSN2CIbLNJO#P{ diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc index de4f8b427a06eebe99094db95ba8579c90063961..f07abeb279075c56db8afe96b86ff7e367f67045 100644 GIT binary patch delta 20 acmdmKwbP1wIWI340}$}3`)uUalLY`aCKLl_9 delta 20 acmdllxL=TaIWI340}#BclHSO@g#!RNTm^Cf diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc index 89b4008becc0e0a012ddd3f91b6a0194a1c2328a..7e1e439423d7ba6ab691c885b5323a8e8f6052fd 100644 GIT binary patch delta 20 acmcbjcSVnTIWI340}$}3`)uU)6bAq}sswld delta 20 acmcbjcSVnTIWI340}#BclHSPeDGmTX#|3%- diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc index ad8d664e8c3fa61f58728a357a948d351e079f6d..e5de5e02f3eddef644223808fb431b26bb7c4df6 100644 GIT binary patch delta 20 acmbQ4GBbsHIWI340}$}3`)uUqGXelNB?L|Y delta 20 acmbQ4GBbsHIWI340}#BclHSP8X9NH~LIqF& diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc index b8a5c353092ce9712f14b1a9dec50cd6fec6a1cc..119d9ccdabe88f3f2482ed628191c74de5f4f956 100644 GIT binary patch delta 22 ccmX?lo9XCnChq0Dyj%=Gz^CrBk$cx#099xPzW@LL delta 22 ccmX?lo9XCnChq0Dyj%=G@UBXFBloVg09=I!!2kdN diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc index eb20ad4ab806041498830c7f02379b7e6e57b3ed..01554eb179b7ee7a0674391d0dd5a609f938b202 100644 GIT binary patch delta 25 fcmaFT%KD_0m3uiaFBbz4@TvPWa&P5kyy*l0UcUyM delta 25 fcmaFT%KD_0m3uiaFBbz4ysMIK diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc index c3aa07ac5ad594d32b30af66327d1c9019a2a4f2..432f7451eb95a7b5d4f5e04c0b21e0448169abfb 100644 GIT binary patch delta 22 ccmaF&jq%+#M(*Xjyj%=Gz^CrBkvq8>0ACRXyZ`_I delta 22 ccmaF&jq%+#M(*Xjyj%=G@UBXFBX@E&0A?-+z5oCK diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc index b53efc6107bc2eb4028fcb4476eefc992c2bdeb2..9475ae0a661fbf8ace447631892ffea8659f325a 100644 GIT binary patch delta 20 acmca*ddrl1IWI340}$}3`)uSsF9iTQnFSjF delta 20 acmca*ddrl1IWI340}#BclHSODUJ3w0wgw#l diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc index aab2fcd968853bdcd4ac130ebc6bd0a66ab91914..0ed90cb1a31e881020b4005621c27287bdfd69ea 100644 GIT binary patch delta 20 acmaE0^1y_9IWI340}$}3`)uS6l>z`eWdy4L delta 20 acmaE0^1y_9IWI340}#BclHSN2Dg^*Sf(5Mr diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc index 0335bc3fd784deb3a7e3eb2bdcb9dd28919e0ae1..b91248dae520077f90b1969af8a78e3042d97075 100644 GIT binary patch delta 22 ccmew{iRs5AChq0Dyj%=Gz^CrBkvq2&08zFEA^-pY delta 22 ccmew{iRs5AChq0Dyj%=G@UBXFBX@2m09expBme*a diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc index 22083514fd05c5d8bf01d714b79ae72a4ec70e3b..c9952991761471700c2d4c7959745185c0a67613 100644 GIT binary patch delta 20 ZcmZn^ZWQKT&dbZi00eyMJ{!5qH~}cw1G@kK delta 20 acmZn^ZWQKT&dbZi00i%lB07>-*V*mgE delta 22 ccmZp@z|?wyiF-LOFBbz4ysMJl$o*?M08tVLWdHyG diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc index ebacf1d95854fb61766cfb50035f932e8f9833cb..ef669caea52fbbb1ac0423f7bc1341056b34acf8 100644 GIT binary patch delta 22 ccmbRBmuc2tChq0Dyj%=Gz^CrBk-L8%08?%TlK=n! delta 22 ccmbRBmuc2tChq0Dyj%=G@UBXFBX|Ek09uO&l>h($ diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc index 267b8fd10d0e8bf6ca55223ae6ee6a15d185c50c..a4ebbcbf603e3fcc15a03f823f36fbacf714829b 100644 GIT binary patch delta 20 acmew?^I3*_IWI340}$}3`)uUS-~#|U@dT&< delta 20 acmew?^I3*_IWI340}#BclHSOj!3O|B4h5 delta 20 acmcc1beD;HIWI340}#BclHSN2#0UU7=>;bM diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc index 99cebbdb3530066b3f5d8e8fd220d960bf576cd1..c94649edbebdf742b462d4a96636f278def2adb6 100644 GIT binary patch delta 22 ccmZqdV`}VU;$F_n%f$c$eCj?Mxxcjm06!W9vH$=8 delta 22 ccmZqdV`}VU;$F_n%f$c$@2aFXa(`yhy%<3 delta 20 acmbQjJcXHiIWI340}#BclHSPO$p`>2r3B6Z diff --git a/venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc index 8f5470c8cc9ad83f8a51460b0544c21554005c0f..0809f80c7cae79d607ed16f8c04499d08b8b4238 100644 GIT binary patch delta 22 ccmezUf${eTM(*Xjyj%=Gz^CrBk-MM*0AN!F)Bpeg delta 22 ccmezUf${eTM(*Xjyj%=G@UBXFBX>as0B3Lq)&Kwi diff --git a/venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc index 3a1a8c47011195ff36e9cc80e24483822ccfe97a..7638f7a3ca5638aa180707382dc4f1bba56ad6d3 100644 GIT binary patch delta 20 ZcmZoxZdT@A&dbZi00eyMJ{!3!1OY2>1L*(& delta 20 acmZoxZdT@A&dbZi00i%`8kkURM{6h)+fv)s%%)^2R6E3y-LWY)Bud&gm27GeY+nZLeN$vFgD-X&jO_TM zVSbpF2tH_Q0F$0|=&of-pDca6ELlX-ft(asGOS8Nl{eYMRBoGxfd&n$a${G~%;UAY zxLO#Kn<}LtRw_T+uqA3qbu1}|il!@d9UtfKBA~liD%iGOkPJ(0>-aMGp^BWB*xK6s z!ZIm-PQ7smL}^fYhggOTU~fz__b_Z|Cbfc%B1Z(MBSF(7_=%3A%h2A^a&gj&$+BuS zWZC0jW*#pGF$KNZnq>mPj^!mcjFv^{mxNdZP{0o;i1DwnVUbQ{<69ts4Felqu0b#i zOjhxZ($=ZmxY8&b5v3*9HERU5>U&;nSFsgJiI*uu)aq@DM@R6o($YqP1Fb{VflNi$ zL1t2xLv`{?^bP>%!}njU)J(;w!2~dTGQp?h7huA!$#QX2b8 z6Wg_x)+zy!sam9TJ@}FgEo)Skms*_yl?~Hvts0-E6h5f10cK5&Hub~AwKAd z4^CsQxY*72#KjA-)Dug8i%;K(Pu)}&{B4BGCf*|mr!ilM#;4ufT(^1FbPAte6f5VE8Zj$_)BTx?e%)H4-Z#_j+cc@`(Ev9b}m@ delta 188 zcmdnZJ&{#oIWI340}#Bcl1`t@$iVOz#DM{3DC2Vy!$b`mtrXT2wj9=6wkWn-_9*sT zjwlXBhG^DkrgVlB_C<_QoGBbpTq#V!44Ryi*D)4NUdd!B&IUB0hyz5h1BohD13gPU zLrw0h85GK;_}K$1lqljkuva*F_&KzA?{=Q2#zVzFR+Fgc%9d~yS;1dnI~ KHwYF90c8RA`y?9x diff --git a/venv/Lib/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-311.pyc index 7c37c63f87317923f37a55693866e7eff2d2c4e5..48b3afd16668973180fb63b09bdec14430795c86 100644 GIT binary patch delta 2248 zcmah~drVtZ81GkFxb!ul14Lj@%B%E2d2cI^(oN6_XmpKw^L9#!d6|tI#azS+G7uF!z@C5^b-|!Uk8>KuXd+!zoUS6AuIB00adURb zzARlGO|MD7q;!p^GS+Li94obYW0h33%wY*5>Q#qR+U({fI^y;`b%xC_o`^;@dL zPonYE-0wl$5a(4Z)voYbkO2%LUbIbCRzbD=yyjM0_Ji&*d6t|m})*arU__(kL zZel~(8!(A)nevl=UNkUF((q*h+TD0@L~x7d4r9=|6}9ErFok!@v*34ZE)N=}RxyZh z|G-r9+YrPiixK|BZ_FK8#}mdy7=PolmSgZQ-m$z0)7Woamwb=dFYpF>-~`^a=0Xx? z+Jc4?tAt0mDfp}HH8_c*6*-{A*DHdCldI?=+%)X9@6xg=PBwwf1g)l~*(>&Bkh6Vw zwK8vXfLw++gp&FC2PDQus4_+s)y}r|-4gTn`n-%biP1ubQl1(J@QR;>S1lMOy7>v& zE(P}bL{>_~X{xHZmY=NFzOEiWqo)k1B9-kvQDWity?MkgAqXG0G#U}mTf;v;d#I`{ zDIJv7+p=Xa`*rPa3h?4b8(&>ZN64fMse1jrUVos=`<%p1W0zwX^6@7}050K;)US@Ly^8{aTSauLE^8$Y0sDv^Un(7O#5b3LxB=TkiCA03P zivV9@y3+>Nu*JDneVyj41efp`XDOKRu=C@hGrSNI2Ku@J-9FaOPSL!cYDxYBes-2_ z=TK@nqJD>l^hIUw|j=ewO;ncf!Aw8+oLh=5w+{Q^zt_yI_J6qPnXbTRW;XDpf!l9WON2XEr-)&fMmcGdaHdAXHmaM| zu|~Cw(T}GI_F3(=o2V1(eD-*!0*`Kjmg(wKka3p=RgD*UpS>Z4jUxq$HU`#ABOJ=! zw=Z#X!{+8qtdcJym+jkfWr}8%n?rOYwV%LmdbOm`sGVC?RAYtMxPx^YbmbJvP4U}i z4YsRnn#JaAE?fL&gB>X}@kw{8YAs?*lAoU2wCRFBa*T4euQj0^r%K+Yyb77DRhO#P zuGF%99SIKIDymcLOlly37t&1JIE{W*qmwLz(pWH=XbC0)@UyvuEW>Vd*UbpnW!Axr z*`1f#AnO8pd0Bvm?A>ssiUW70iAb>9Qc5lYRC-E7toTM6twiuq7LvM%foo82IZ38r z)nX$b!Y`H)V;Jcp+vyl_31+K~5g9V7%gEVs*h!cgMvtvw*C8&uEL<47d&CgG3#WD(3_E|rlIu6<<@Ij;)e@ei+k~uS#?pp zH{=b3q|v~bNYB8SGfYb0JEufe!0qbMeafIBc)@j^iTb;JHbs<9SJ8V7!+RLsXCdj7 ze8dv4WJA~d8gE=zV^9~`Oz}{Zoq-60=K{RtL_R3kc^b17smxr#v z!@bp{22S*@RKAWBH{~Cd#)EW{zKr#J%%z8phUhuGT!V?erwylZc?QE-_^at!m%XyBMbcp_DR3}Bz@7i;3Ii*~ZVh0p*s||C zd@IUO?11;mOPyMgqm!{rGbI#XHsp)iu+f^bB%w+8`Qk zXs~OsNi@=C(FBi~YL>L3JYDc~Q}bdE=xb^B`z{X5!jm`af$m;vSnOlnUCRG(3mAcxcD`RJ zI0%A6)TD$}zBm)G>=PJ)07l^%GZ5NKy~`@*5yG+Ad z!5=48c^TSAEzHevWl~occdZ;RDwoWT&;cfMqS#jor4J03_~klorZe#+IwgKd=a81g ze^PmluXDLpP8L;5B5vwKv&y8}5eLtc2Z(s6hfVHC<>W5&AU{=on zf=hCWS&0KJn_--YTnF-h9W&Ek5=@C-W`(-^BL#Un3awEkqIbl_>c!Jy&EgF8z|^&@ z%oapSfr*v;lF6LL+!r-y4_GSkOB%gYPg`LgTUO5GwUjxXHC}3#kJ|^LDiA$;fCGI6 zzvRFN4g}CsL;tx0^mG;cydJCr92QVykv(>Rnitec{E|B_o3qCc&=5eQ#NV&+M1=zaDy5E+N-x_+p2}?mqa0$RJYQidXK4T|mH1_rm=;d|g>tQ&e?kW zmMi7zY;TnKC7l5_GxJ~6fDl?%N_^DFkADCb0M~or041E862Ii8pSgMR01b3g;_uhE zRIZ^st}`^Ytdw{q>E4~ocak-6LR-YzO3bG%{woC|ut1iT%Y_!m)_pg0^;gOx7OpH7T$T@`@{ySUU|CUPHe1b znaf*Cda(&^;%oF8b;ZkI_nCq+c9dNlmHg7>P{}XhYbC#gm_@#d%n`Bq6(Ty{hr6~s z3wTy^Q9oo0-X*oz0x>?9Z?{9+4efv^P#^R+i`=G;5a6}~_qy0dgVf(xh@XJOAoR6E zpGe6HEp&(-lwVmYwqRD`E6c?uS26&~ov*0hhpz7yy2;}61|oXJt_l;~`yBTaLKDp* z2NUgiMY9;%r_)=u7{?%15Y&o&5bMhSAy|;>2e}&}_ayQ7lyT#yW{*m;Lx>NpKz4c4 zcQ|bg)TCPF1GA)QfvS7gZCU1=%`=j;DhZ)TNDc+Uq0LZaSqRD-Ycx78?Cw|tJm*$a z)nlBXj8{{xN!h9Hws)YVP9$AGG7jb6s~yVEt4}&z*tGkf4@AT;^{+;wazI{>N|>Mg z%kG()zv8$-MOU}M4Jj|x$u^Xh1`DKFQ9I69@si5%4ns{@b2^kYhtwxPBV(SPJspq( z(-IBHRBA&OAEprxC!uTmvg7?Ku=pnSc-{Wxmp z{0u?O!!r{ZP0$~erHnSXg#S?fuHe4 zP8II~hJ;wNsacnoyhl7nNkA3?PRXCd!a0PzVI)mRa1a@-NQ0{)^{6F8(u@|uKtGrs zN;vINH4um?A5>i_7QaN7{AP#_R3yZ{api~2-+{Q6oG19x0x&YQ)3Z~O6xhhk;1la| z;CeVWku0E$=K2O0k=jw#^aQ=RDs8acA>njNZslk0Q9UL!9*y*r(kYB{F6B9)RTBi( z{O+s54b|Kzsv4$e7B2bEUpPMl^D3e$9xVwEROOUb`-7{IrO@)aM6o8*ufk|SYE?PX zo;uzJ2l-7Rk}Vz{H9Q&viK$+CHAYrICRe05@U;da<5J~IOtqte8$_A!5Nui**F0Z# z)WB{gqAI4XyezhKF|E`j8>qbjRfcSb;SUfQw|>6JxTW$1akKKG+R}q1@SzNJ)q*#i9NJaY zA8G&6(IUjK!bWS8J&ND%)Z-Gu67?xx>vnNk<)69*MrAE&ljmmF20cX!VrxzS{gwFf#aI+H8cvq zlJLxC%(ti%TH5e0g#*h`X;k3`oK2X8Fd)qV5@reP^h?hwV*_t;LFLB-FU19aDC)l% z2(Cu`U?Lh?jrfNK{X>WStCByANStZI4z#^SsT8D=9QB88u7&eTO!(K38TObYJlWC> zBw-{^0jbL9*H*)!V2DOD8d+M8%1UVHVs#Xc4FX}l0PvqVlmGb1tgX9;hZ=I)z)ANc>9!DGUF%meXEn{P5V6_hVK3KU7U=q4AG3$Ie^%j3r8gel|P=@*t!?#e&F!`1YTF z%5loJvkOj-jaSJ;`P|ydbFxkuY^znpR7#}3#SWXlh$k=;D&?lFA-=^&8rzACsX)Gz zW7LugGF%NuL~aXm*ND21!@?;qqL*A-&?KY;ST|Ud(zzHfs%~-88Ic#&qDIt;I#Dkg z-qr#xs&~xf&R(?#&bDZb@hp1=t0FVifLcw zMAMT5ACGzS_7%4Gg!L$bU8{Tf!%S^&43Ii2fANa4@p$q^s&C^8V!b)Ld;u07VzvqGYD}D zp{Nj91w+z$JSu}i+X7?;aL(|~&ih&lgu-xl3ai23x`alZvydN!zpQug0t`tKC`lC8AwR(e!9<78c9Dj&ZYQ-Vr2fT-f+z)YAZaOYUZbVjJj8qJMTsZHs zOK#}TR2PG{eHujD?x` z%V!s6PG|UK`ufn(xGskwzlGlG%Fh%oiyxOI<2;b<4*+UKdh z+3}7cVQR|~PSeXsoY8c*Cno_k%R}FzM~|{*VyI2&-R}*j+7IvP4=418)8?ML+Jt!& ze$Z?0dtmEJ+fF{P4X171v~4O|W#~6%36O-oCtFJzkKSuIzSnRZ)Y9hZMCVijsCoJq z8otr^O9Euu^4WDGu~nz6y&s%NT92lzN4NR3t9P4E>6_9`qucyzwzRcs+mIb1h7lG3 z`i@q^EPbr6opO`qV|3L#hCK3sxW#pg!1R2mLXA;7x9U%X0UhL^c^0;zX1Ozqo{75-bV9dj&)s0C!#Z%$Mq zJ3?{$L2!P!&&Tli5<{z5Mf8nx=ap~!+UgyW0C8oE)3Xdb7U1Ou=SF#Y&>8naMPeBb zqKPzyg4Vp?9F?arhhkv!P3&f`sk2y{K|x1eaC&uZ<1~#1rO+C}JA3bv?l6f0%7HC* zA>|NIdJ}EDMMx`=eg~_Vo54#WOMDn;>EZ2?0gUqfp{sG}TPXBxAW_^-fG+ux0~!2G zB_ZJeqN8_nAfqStmV36IJzG!G)|;~R-ad2R*>TS~vFDsf>+8OG>y6mXnPj~;Rqy=; zuX1UBNq_(lWsOAd+Tr$etqEOgx~_5CxNVH54J|vZdxrLep*>yKgsh)ht6mGI&Cey~ zt|fq)p93Q{IR8MhL}f5$^`y>m`-!xvE=!D>mirA|_Zmj_8bw(?8uS^ z%|yDTEunADsvL%i`)z~w+UEA!=04FU+vZbk^9i&2Gd-#5N^~7f+Q(D&ae%|Bk#x=B ztcF-zpIJ$#_g=@zy^fQ~j;T}!09fmNbL~BI-=4WIZFjwM>+M*ge=6xdm2#hgVOgwk z7?;HgV?Mn=tOjb{(swcOn)2&0>(`n3z`>bmW-j~>_%jx7`S zVG-;-d-k4$=Xlb7B4t03U_ZcP%LL-_0E~qVD2iw4?~JGFX58clZuiUtFP#I9C!8@h z=Up)Ogbe=5k>BjY3p1mMu7yLggfEX$Gm@_%m&XqQ_@#&KdHC+} z`4Iy&^oLw2u#5!mpuH49OM}8OaMsHj(@R zlGl-}Be{hHcXY-yJ&PM3uG_PxCH(ZA`vNkIwa1iq$49m7-Q!v1{F4; z?%y9f$658HW8_2qUi)N%2wCl}?ZgRA6XUpPZujCuE$4+-4MS~OZ`;-->}^SXdrIG) z)$qOA+h`?kq^a$ z`V{P%N3eZB6f1h7?#L27H^*gFI?WvSz+9g;*KE&y<6P40PMO`{cFee~Pw9J8`eBeB zJ)UnIO6U(gN}C$NAE;#qbAODct&Q6^5>3ZGX3X2L7|8g1nG@iW}!9@)}snX+Vu>z<-u} y35nt-z#s6B*UZ1>kJU%p7n;aklV)L<-*ej*eEgmd>;DU`I>jyk delta 5671 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 delta 1508 zcmZWpOKcle6n$^}9~?U#;t<vaiaLdz3ixp;ut)R4lw)uN zSu-QAtF}vRcr+KNj{YRFbEH0B9HD^JdG2Z3J`G)vgbo~?#vmC6G(Su`f+EP8gA2%< zIWu<73*y|^<{UR?d*`5EqcG=i z=Jlej79ojhu~==sxx7Aa%k$8M^1Q=*T3@i$1$++exD<$sC!+aa!O^K8vu`Ir*cclD zs-L&qY!nuO#r~ta31No;7+v!r8fFwfv?G^1s@5>^8{VF(r5=Y1^^R6{0zbv2$6{Y} z#$wj<(9Mp4%wB-BV?s0IBxWoF(RKS^FFkV1VUY9{q4A@>z4SGM`J#&dH#cr9lUDv- z><<0i7>)1u)8oc+?^`bVF2BF`SC6OER*v%VL|m!_c(}8j|CI>4SYOqn5h*xbGREgc`DC z}f6D3=wA6^HkoI^jXG*8|`u-1SoF6%` zoY)D+x5H_Z(7-s|33hA-ySIbgKkdnF1#`yD12rm-xyO>^$7F2mu#xHKF8ZhO{lSv- z^esF@$q;3iC?AXR4VJX4^s~SXou3^_(+sZ-t<#G};?On8Q@V{Rzn|TSel6PWi1M8% z8=`#6w?-bweG#^|QoxN__Vsd|ReqdSqdtGi8?fWIicHz&4~wCNGd^pagE z(^rRn@>G`@s6&}Vddw&4Fi6^C*9I@EW=oxhh!Qo!b=XS0vKgsE^1u3~G(a dict[str, int]: def cert_store_stats(self) -> dict[str, int]: raise NotImplementedError() + def set_default_verify_paths(self) -> None: + self._ctx.set_default_verify_paths() + @typing.overload def get_ca_certs( self, binary_form: typing.Literal[False] = ... diff --git a/venv/Lib/site-packages/pip/_vendor/truststore/_macos.py b/venv/Lib/site-packages/pip/_vendor/truststore/_macos.py index b234ffe..3450307 100644 --- a/venv/Lib/site-packages/pip/_vendor/truststore/_macos.py +++ b/venv/Lib/site-packages/pip/_vendor/truststore/_macos.py @@ -25,6 +25,8 @@ f"Only OS X 10.8 and newer are supported, not {_mac_version_info[0]}.{_mac_version_info[1]}" ) +_is_macos_version_10_14_or_later = _mac_version_info >= (10, 14) + def _load_cdll(name: str, macos10_16_path: str) -> CDLL: """Loads a CDLL by name, falling back to known path on 10.16+""" @@ -115,6 +117,12 @@ def _load_cdll(name: str, macos10_16_path: str) -> CDLL: ] Security.SecTrustGetTrustResult.restype = OSStatus + Security.SecTrustEvaluate.argtypes = [ + SecTrustRef, + POINTER(SecTrustResultType), + ] + Security.SecTrustEvaluate.restype = OSStatus + Security.SecTrustRef = SecTrustRef # type: ignore[attr-defined] Security.SecTrustResultType = SecTrustResultType # type: ignore[attr-defined] Security.OSStatus = OSStatus # type: ignore[attr-defined] @@ -197,8 +205,19 @@ def _load_cdll(name: str, macos10_16_path: str) -> CDLL: CoreFoundation.CFStringRef = CFStringRef # type: ignore[attr-defined] CoreFoundation.CFErrorRef = CFErrorRef # type: ignore[attr-defined] -except AttributeError: - raise ImportError("Error initializing ctypes") from None +except AttributeError as e: + raise ImportError(f"Error initializing ctypes: {e}") from None + +# SecTrustEvaluateWithError is macOS 10.14+ +if _is_macos_version_10_14_or_later: + try: + Security.SecTrustEvaluateWithError.argtypes = [ + SecTrustRef, + POINTER(CFErrorRef), + ] + Security.SecTrustEvaluateWithError.restype = c_bool + except AttributeError as e: + raise ImportError(f"Error initializing ctypes: {e}") from None def _handle_osstatus(result: OSStatus, _: typing.Any, args: typing.Any) -> typing.Any: @@ -258,6 +277,7 @@ def _handle_osstatus(result: OSStatus, _: typing.Any, args: typing.Any) -> typin Security.SecTrustSetAnchorCertificates.errcheck = _handle_osstatus # type: ignore[assignment] Security.SecTrustSetAnchorCertificatesOnly.errcheck = _handle_osstatus # type: ignore[assignment] Security.SecTrustGetTrustResult.errcheck = _handle_osstatus # type: ignore[assignment] +Security.SecTrustEvaluate.errcheck = _handle_osstatus # type: ignore[assignment] class CFConst: @@ -365,9 +385,10 @@ def _verify_peercerts_impl( certs = None policies = None trust = None - cf_error = None try: - if server_hostname is not None: + # Only set a hostname on the policy if we're verifying the hostname + # on the leaf certificate. + if server_hostname is not None and ssl_context.check_hostname: cf_str_hostname = None try: cf_str_hostname = _bytes_to_cf_string(server_hostname.encode("ascii")) @@ -431,69 +452,120 @@ def _verify_peercerts_impl( # We always want system certificates. Security.SecTrustSetAnchorCertificatesOnly(trust, False) - cf_error = CoreFoundation.CFErrorRef() - sec_trust_eval_result = Security.SecTrustEvaluateWithError( - trust, ctypes.byref(cf_error) - ) - # sec_trust_eval_result is a bool (0 or 1) - # where 1 means that the certs are trusted. - if sec_trust_eval_result == 1: - is_trusted = True - elif sec_trust_eval_result == 0: - is_trusted = False + # macOS 10.13 and earlier don't support SecTrustEvaluateWithError() + # so we use SecTrustEvaluate() which means we need to construct error + # messages ourselves. + if _is_macos_version_10_14_or_later: + _verify_peercerts_impl_macos_10_14(ssl_context, trust) else: - raise ssl.SSLError( - f"Unknown result from Security.SecTrustEvaluateWithError: {sec_trust_eval_result!r}" - ) - - cf_error_code = 0 - if not is_trusted: - cf_error_code = CoreFoundation.CFErrorGetCode(cf_error) - - # If the error is a known failure that we're - # explicitly okay with from SSLContext configuration - # we can set is_trusted accordingly. - if ssl_context.verify_mode != ssl.CERT_REQUIRED and ( - cf_error_code == CFConst.errSecNotTrusted - or cf_error_code == CFConst.errSecCertificateExpired - ): - is_trusted = True - elif ( - not ssl_context.check_hostname - and cf_error_code == CFConst.errSecHostNameMismatch - ): - is_trusted = True - - # If we're still not trusted then we start to - # construct and raise the SSLCertVerificationError. - if not is_trusted: - cf_error_string_ref = None - try: - cf_error_string_ref = CoreFoundation.CFErrorCopyDescription(cf_error) - - # Can this ever return 'None' if there's a CFError? - cf_error_message = ( - _cf_string_ref_to_str(cf_error_string_ref) - or "Certificate verification failed" - ) - - # TODO: Not sure if we need the SecTrustResultType for anything? - # We only care whether or not it's a success or failure for now. - sec_trust_result_type = Security.SecTrustResultType() - Security.SecTrustGetTrustResult( - trust, ctypes.byref(sec_trust_result_type) - ) - - err = ssl.SSLCertVerificationError(cf_error_message) - err.verify_message = cf_error_message - err.verify_code = cf_error_code - raise err - finally: - if cf_error_string_ref: - CoreFoundation.CFRelease(cf_error_string_ref) - + _verify_peercerts_impl_macos_10_13(ssl_context, trust) finally: if policies: CoreFoundation.CFRelease(policies) if trust: CoreFoundation.CFRelease(trust) + + +def _verify_peercerts_impl_macos_10_13( + ssl_context: ssl.SSLContext, sec_trust_ref: typing.Any +) -> None: + """Verify using 'SecTrustEvaluate' API for macOS 10.13 and earlier. + macOS 10.14 added the 'SecTrustEvaluateWithError' API. + """ + sec_trust_result_type = Security.SecTrustResultType() + Security.SecTrustEvaluate(sec_trust_ref, ctypes.byref(sec_trust_result_type)) + + try: + sec_trust_result_type_as_int = int(sec_trust_result_type.value) + except (ValueError, TypeError): + sec_trust_result_type_as_int = -1 + + # Apple doesn't document these values in their own API docs. + # See: https://github.com/xybp888/iOS-SDKs/blob/master/iPhoneOS13.0.sdk/System/Library/Frameworks/Security.framework/Headers/SecTrust.h#L84 + if ( + ssl_context.verify_mode == ssl.CERT_REQUIRED + and sec_trust_result_type_as_int not in (1, 4) + ): + # Note that we're not able to ignore only hostname errors + # for macOS 10.13 and earlier, so check_hostname=False will + # still return an error. + sec_trust_result_type_to_message = { + 0: "Invalid trust result type", + # 1: "Trust evaluation succeeded", + 2: "User confirmation required", + 3: "User specified that certificate is not trusted", + # 4: "Trust result is unspecified", + 5: "Recoverable trust failure occurred", + 6: "Fatal trust failure occurred", + 7: "Other error occurred, certificate may be revoked", + } + error_message = sec_trust_result_type_to_message.get( + sec_trust_result_type_as_int, + f"Unknown trust result: {sec_trust_result_type_as_int}", + ) + + err = ssl.SSLCertVerificationError(error_message) + err.verify_message = error_message + err.verify_code = sec_trust_result_type_as_int + raise err + + +def _verify_peercerts_impl_macos_10_14( + ssl_context: ssl.SSLContext, sec_trust_ref: typing.Any +) -> None: + """Verify using 'SecTrustEvaluateWithError' API for macOS 10.14+.""" + cf_error = CoreFoundation.CFErrorRef() + sec_trust_eval_result = Security.SecTrustEvaluateWithError( + sec_trust_ref, ctypes.byref(cf_error) + ) + # sec_trust_eval_result is a bool (0 or 1) + # where 1 means that the certs are trusted. + if sec_trust_eval_result == 1: + is_trusted = True + elif sec_trust_eval_result == 0: + is_trusted = False + else: + raise ssl.SSLError( + f"Unknown result from Security.SecTrustEvaluateWithError: {sec_trust_eval_result!r}" + ) + + cf_error_code = 0 + if not is_trusted: + cf_error_code = CoreFoundation.CFErrorGetCode(cf_error) + + # If the error is a known failure that we're + # explicitly okay with from SSLContext configuration + # we can set is_trusted accordingly. + if ssl_context.verify_mode != ssl.CERT_REQUIRED and ( + cf_error_code == CFConst.errSecNotTrusted + or cf_error_code == CFConst.errSecCertificateExpired + ): + is_trusted = True + + # If we're still not trusted then we start to + # construct and raise the SSLCertVerificationError. + if not is_trusted: + cf_error_string_ref = None + try: + cf_error_string_ref = CoreFoundation.CFErrorCopyDescription(cf_error) + + # Can this ever return 'None' if there's a CFError? + cf_error_message = ( + _cf_string_ref_to_str(cf_error_string_ref) + or "Certificate verification failed" + ) + + # TODO: Not sure if we need the SecTrustResultType for anything? + # We only care whether or not it's a success or failure for now. + sec_trust_result_type = Security.SecTrustResultType() + Security.SecTrustGetTrustResult( + sec_trust_ref, ctypes.byref(sec_trust_result_type) + ) + + err = ssl.SSLCertVerificationError(cf_error_message) + err.verify_message = cf_error_message + err.verify_code = cf_error_code + raise err + finally: + if cf_error_string_ref: + CoreFoundation.CFRelease(cf_error_string_ref) diff --git a/venv/Lib/site-packages/pip/_vendor/truststore/_windows.py b/venv/Lib/site-packages/pip/_vendor/truststore/_windows.py index 3d00d46..a9bf9ab 100644 --- a/venv/Lib/site-packages/pip/_vendor/truststore/_windows.py +++ b/venv/Lib/site-packages/pip/_vendor/truststore/_windows.py @@ -212,6 +212,7 @@ class CERT_CHAIN_ENGINE_CONFIG(Structure): CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS = 0x00000F00 CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG = 0x00008000 CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAG = 0x00004000 +SECURITY_FLAG_IGNORE_CERT_CN_INVALID = 0x00001000 AUTHTYPE_SERVER = 2 CERT_CHAIN_POLICY_SSL = 4 FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000 @@ -443,6 +444,10 @@ def _get_and_verify_cert_chain( ) ssl_extra_cert_chain_policy_para.dwAuthType = AUTHTYPE_SERVER ssl_extra_cert_chain_policy_para.fdwChecks = 0 + if ssl_context.check_hostname is False: + ssl_extra_cert_chain_policy_para.fdwChecks = ( + SECURITY_FLAG_IGNORE_CERT_CN_INVALID + ) if server_hostname: ssl_extra_cert_chain_policy_para.pwszServerName = c_wchar_p(server_hostname) @@ -452,8 +457,6 @@ def _get_and_verify_cert_chain( ) if ssl_context.verify_mode == ssl.CERT_NONE: chain_policy.dwFlags |= CERT_CHAIN_POLICY_VERIFY_MODE_NONE_FLAGS - if not ssl_context.check_hostname: - chain_policy.dwFlags |= CERT_CHAIN_POLICY_IGNORE_INVALID_NAME_FLAG chain_policy.cbSize = sizeof(chain_policy) pPolicyPara = pointer(chain_policy) diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc index 704d98f801c736851a8148a1f93d1494b0429440..5cdb1d0f14a60bb8a6214e35f2589d432a2c8453 100644 GIT binary patch delta 20 acmew+^G$|(IWI340}$}3`)uUS<^upbX#}wV delta 20 acmew+^G$|(IWI340}#BclHSOj%?AKNh6S?# diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc index e157b664f00f642911bf856e375669b5dd434bbe..9084dc937e711d2046d4de46ceb89bae9a2ec629 100644 GIT binary patch delta 22 ccmX>wneo76M(*Xjyj%=Gz^CrBk$bBr07(!9x&QzG delta 22 ccmX>wneo76M(*Xjyj%=G@UBXFBllKM08lLkyZ`_I diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc index 324e0478bfcb29e086884af14c286da8a3144434..03782723c626dfc2c216c91fcd2f8763121c446a 100644 GIT binary patch delta 25 fcmcb@c!iOBIWI340}$}3`%L6EVlpzAXg?JINi7AL delta 25 fcmcb@c!iOBIWI340}#BclAg$I#AIkO(S9lbRc{8O diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc index 35a2d04e8b4557cb34c9966b8b082767f0e814a4..76b1789557f824a0ed9c64cf994b6e887a66bfc7 100644 GIT binary patch delta 31 lcmZ3rhH=#zM&9MTyj%=Gz^Cq$9<`A-kd5)h=6JT#{s4+A2>Ad2 delta 31 lcmZ3rhH=#zM&9MTyj%=G@UBWa-De|jARFVe&GBrf{Q;S#3F`m= diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc index 0df26da53ede0129aa96157dbef0afa1725e65e5..11c3cc90082626cae22d45c840ec993f617540d5 100644 GIT binary patch delta 1752 zcmaizdu&s66vuz(-rjBPUH4$?Yixb6@#xsljSd;?!C+%$TYv~Cfj{Qhx-&+B{6 z>1}_*?+dSgAn4!I>vfEugy}U+mk0H7o^V$}>*g%AB(EJ{H6F@0CD-`Vsbu_QF=YW> z%3p5wTO%RHyeSd8S%WiXXX;ZUeo*V5iK}PlLN0EbT`<`ciEm&^P5`{-h~IBPu%ssV z3nBsDbTW3<7%{PsikCQ>F!VZ8@3D zU-XX>TQJUF8jX1E_=Bq!7NWag70kpp3mp3LXtqC-27!z}7FZn2J1vq42mvu52Xx-) z4u*RsK zm~&TvS$MqgEm>EwXxY-GPgbm`SgEd^mk%(2FV5cpS5Z?m1V;R%s72OkjUhG;e7x9F zb~VXxA;})nO16X$lal^MJWDo)^bg%=f~?>932Au`dZwvci+hFVt>Q_8ww%*Cr`#f* zvPj$>b{Z=g8!iQR3L9ZMccM5Vr&ij95gU+g*SWRQNVdVPkw!`-9vRh0JTj^k$&MGe zYBYf=M-xS|Q%pfm@l(>DyoLZI3&g3Rn7siWcO7f~*;#rqeU5I-Y3{3ir zzfYgQVYe&vK9!?bRW=pwU`N?a_*GrIaE}0jdaHa=2AskNbq*Lp$GWoE0baU~HQ?b* zCfu?vm=fEd2|yR?5E~?Vu3*j>jH`DUdr}ooeY?_NZ>`(tQS6O%Ev*|A4;IxA#@y#q zeQWSeeMv@$35LSUCg;G@=S;4U$er&@xkpUrOmjoA8nv{6-=rZt?8$=5c){by8Rf&r zlInaukK(WO)vfo`Hn;oyN(`+(M)-y>M7V;E#%g((OuACaY3y!nfD?G7aTW}s+@!#V zxVfos?nji|M>tD(mQYKeS<1JBN4GC-?to)>sM%yY&WpzMipST{-sbbv*0;B{Dc4B& zG2tR!Z(a^Ju%N{TCUsTI8i0-J5$`IP`h+(1Hsc6|VPt8x?NuR-RzE4kBKXCwX16W| zxgB^N{hR!NpRO-akFEb&l&@2JC*c6T+L>oKLFQ3{n-Ko)H}Fd5pXM%*>>>6qcHmFS zN?VU4nM3S9sjl;#7vPfW>e>&^2h^AW2M`2;NRS9Igjj+GA9Pp2J8IQ)8A4WA6fTV_ z!y-*oggblE#=HMdAxR|ss%J4@$*?JfZ-&m`R=BAi3dV_Yc)<8P{CrELVS-P>CR$&I z8NF-a4|QX&MU!-oBHIa@2?@CWg>J~ev~Bn00~DA~&|zj@R+@!(@bM2@Fn(XcQo_qv z*Ea_D)S~TfG5rz==5jbCC70|Z!Y0B!?B7`_S$T^R_14ZE0H?8Q*JH3oeRo$kKr32z zzmayH3J(&#Czxn!4OxSDakm4$#NT!wglqWro|BM?O)u?_32$M=#Jy9XSk2#CE4rSE Z2mX6Lny*<0thd9tpC?u<#?!C#{sj^}yXpV{ delta 1693 zcmaizdu-EH6vyxR{rVegyY2z~m93-e9vxWOFl8;S?2(mBR#r(M4vZq!?8%CDvn|_% zZa7~X4&vA$NPNV(KV$(kTYfmyNc;obmO*p`)Hnk%(I8P{iV-DYPVedLx&)0k`F;Am z-+RuvC->gI{;n{7O3)qG=`@UwU-o7;?HtudAen>g-&(IivFTPSdDKKIWi3~e-8^3gu%BwHXlq!$j~Q;ied(1 zJ|lwLfEK%~T^zP`lZ=np(;<^5$k@YGF%H^gK6h=-%h&h|@>pnnybABk+?g0Ei#t9u z&e^?CfsZ@3ffY|Xa&#NwtAn{zw?P|bzPy;rwPlgcU(iBW3~R$0-^v9?<69Ne@2D9& z$-nslOwB@DV>8BhmK7gcXDY0Td!gdEZWMUuC7ns3#l5Yj-lU{38!SLNhpcB)l<(L5 zEI=V%a=xu}t+xRj$B~jf@D;8sJp(dcD{c0w)rJULKq5;`JJ^0TRX(C6q;OnG&5kTl znUf<-mHH1fEX@$nE==PKq;B&OQS*xQo35NH>lXGe6VJ)&O3tj+mC54yWQptXEW<_z z8@Gcyk&QbvZk0H}^i{Gjp$F2krm9?;Fw0d=X~Hg%rO&zcl*s>tTCiWjVsXN_1VpiO-bn!>p#xpv5(@M8@M z9NF0cdK!V#95`2Ez&=+J{EEk1Kf*2L`3?O7fTDk3sR_>Es@fbF!%ej=7{tEX*R*22 zDhzGxA!e1ZxXzBx)r}_n$!i8Z=&UbKp4M-lc6uh;r=8m)qM#h9=l_#2R5e=oO;{Uq zU;;gjnWZ zcnK4PYlH;CUF8RMwch^$Uztg34to6!?cUZvOUE1msMmL%Opz)grA#0|6s?xgPlDLcaMq8}@RHRcXU zN{_Jrq;e*BNq{eu18qZKouk5k5g2d)K_I9I5+Q*gVogUi3@LAQm;_5SDHZ--alZQh1X79$^Y(3o%ZhK`GTs?>b-n;UC}LNlsEuwgzaJX9tK>y)-)^^LXLVeekey=TJL9GX`II(>P6~PY|vX4Ah{C z)Ck_&p92^1!TytQ6>s;SgIxUh@K8c@Llf2y&{9 delta 20 acmbQpKarn%IWI340}#BclHSPO#tr~6;{@XX diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc index f7cbf93cb88326404d82077ec7cdadcf23b2f616..87fcbd6b39c1e9b35d3b7786d2923bfe366251c3 100644 GIT binary patch delta 20 acmewm_aTmZIWI340}$}5`)uS+)dv7W=>c5-Ql delta 20 acmbPaKgphZIWI340}#BclHSPOE)M`W;{{#- diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc index 0dee7ffe0eee841ab15827f5f856c45184da7287..d6fdfa6a0bec14f758161527f1c64949fb58d439 100644 GIT binary patch delta 19 Zcmcc4c%6}ZIWI340}$}5`%L6M0{||~1aSZW delta 19 Zcmcc4c%6}ZIWI340}#BclAg$Y1^_hT1#$oY diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc index 1b590919bf4bc70617f4bd25b24b0dde35119e0a..34a832f914fe8f41750597bd0be2ce065e0cf2a4 100644 GIT binary patch delta 22 ccmX@q!g#2Kk$X8WFBbz4@T>c5p4+XSQl delta 20 acmcc0eU+PgIWI340}#BclHSODiWLAm@dc#- diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc index c9708a6ac02ccbbb6bb5d60c18911d39647e59ab..ea19b1e3fc0215fa3f6e911c401917582d7796b3 100644 GIT binary patch delta 20 acmZowX;tA~&dbZi00jK%J{!4z2?78t>jZKD delta 20 acmZowX;tA~&dbZi00i%jWDB delta 20 acmbOwJxiKy6HUU{c#?i^Pas8%sxlxiDd

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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/bootloader/Windows-64bit-intel/runw_d.exe b/venv/Lib/site-packages/PyInstaller/bootloader/Windows-64bit-intel/runw_d.exe new file mode 100644 index 0000000000000000000000000000000000000000..aef4a8d5722b7decc45f36b670ef3ca61c864ce4 GIT binary patch literal 280576 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 pj9f7oyK*sZHJ9AVW8UzW^{{HkTe{|ALuDmnlF literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PyInstaller/bootloader/images/icon-console.ico b/venv/Lib/site-packages/PyInstaller/bootloader/images/icon-console.ico new file mode 100644 index 0000000000000000000000000000000000000000..4d63d0f0644b8bed4bc8adb8a76b841cc07948ec GIT binary patch literal 59521 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