From d31491e2e428963d27404a6c1a878eaa1efca5fa Mon Sep 17 00:00:00 2001 From: Vagos Trantos Date: Fri, 21 Jan 2022 16:15:24 +0100 Subject: [PATCH 001/213] Add PyQt6-sip, PyQt6 and PyQt6-Qt6 --- projects/requirements.txt | 41 ++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/projects/requirements.txt b/projects/requirements.txt index ac6dd103..9bf1fceb 100644 --- a/projects/requirements.txt +++ b/projects/requirements.txt @@ -31,12 +31,33 @@ numpy-stl==2.10.1 \ --hash=sha256:f6b529b8a8112dfe456d4f7697c7aee0aca62be5a873879306afe4b26fca963c pycollada==0.6 \ --hash=sha256:fcd6f38fd981e350f9ec754d9671834017accd600e967d6d299a6cfdae5ba4f4 -PyQt5-sip==12.9.0 \ - --hash=sha256:d3e4489d7c2b0ece9d203ae66e573939f7f60d4d29e089c9f11daa17cfeaae32 \ - --hash=sha256:485972daff2fb0311013f471998f8ec8262ea381bded244f9d14edaad5f54271 \ - --hash=sha256:0fc9aefacf502696710b36cdc9fa2a61487f55ee883dbcf2c2a6477e261546f7 \ - --hash=sha256:d59af63120d1475b2bf94fe8062610720a9be1e8940ea146c7f42bb449d49067 \ - --hash=sha256:6d5bca2fc222d58e8093ee8a81a6e3437067bb22bc3f86d06ec8be721e15e90a +PyQt6-sip==13.2.0 \ + --hash=sha256:0baa53e464667b289ee157024e244fd9fa190101ec74eae30d17f0692f6af8cd \ + --hash=sha256:10e6c5d0004308efcbe8826ff0b8faf6e6f60c9e906cffeb26834e18e6340ed4 \ + --hash=sha256:121b887e40daac64f139ce3d7fc7b1d549ce75d423c6c174abbdf6ec7ab5d636 \ + --hash=sha256:12d43e55ec5ce70260097c19ff95942d2d329ba8c81fe140e5e9af08cbcfcb9c \ + --hash=sha256:149e91b372037765b18e728e68facdb2f072fbf043f76a5a424d2fa78af13163 \ + --hash=sha256:5f4b4ce20ff851fbf19cc7777485ac531171308705b1b36305cd71680686941f \ + --hash=sha256:66f3bf78d6bb084d10261111c3a7aa7c4125d73006b763544c81278468e9aa9d \ + --hash=sha256:6a12210e8547a8d8f9926fc3773e2c83db4511f9ac8bdec0b11b08a751262474 \ + --hash=sha256:9b79ca8554e40d70783ab7f7f6e16043ffd6c1d6cc14da5eba6ba474a7002233 \ + --hash=sha256:a0dcd554d00e025c844427860336fab8179173e181717a895af234f0279236f9 \ + --hash=sha256:abb26230a444f3b65396c3612af5db4f96a6765a56026078b7b45c8fb8bc1693 \ + --hash=sha256:cc92d5fc57a9192f269a622c340551ad9cde6d7a282273ccb3c64cd742f73760 \ + --hash=sha256:cda533d545414576e2d88d106c03eaf340bf8897388277838f9f2ffa6e2a7492 \ + --hash=sha256:d44e69ed4dc208c6cd791be8c54d8d656e1d395fe537bd1320f01b8ab3edec0f \ + --hash=sha256:e7c8093a6ef36395353a32df026745254b1ebdfcd490f746307d84ba67bcd93a \ + --hash=sha256:f8a65a876b70fc1c4eb95de74e133c81c146f08ad0e04877e16af8e3798b9d50 +PyQt6==6.2.2 \ + --hash=sha256:6f983a42239a6b7829ceff718ea943b8034f8d9e5d796a0fcfda0bc53fbaf8e9 \ + --hash=sha256:9325a0f51c08e37340d916d2723daf9a25c844dac99d71d6c5aacb4f6ee00171 \ + --hash=sha256:e9d56e25d307c50a8f21c2f210ddada661fac6ffd882deea82b50127919823fd \ + --hash=sha256:eda7a54f47d70377f95d0aafccfca83a7f5a6895f020d38986dfa96aa8b0883c +PyQt6-Qt6==6.2.2 \ + --hash=sha256:47515bf682748a42f41b9df8cc3854d29802199357ea76d39ece55679f390fe6 \ + --hash=sha256:8cac87d50a8afd0f3af1a3dd7b32e508bb5fd2a7149a272a84f922c63f5af6f3 \ + --hash=sha256:b3a3113f3a89d16ea204b99868adc33688559746260e8a2396b2edc9779eb37c \ + --hash=sha256:c26076c16eb1743f10179a62567d47c1cbda43ac45a1759d2e96563c52d8e41c pyserial==3.4 \ --hash=sha256:6e2d401fdee0eab996cf734e67773a0143b932772ca8b42451440cfed942c627 \ --hash=sha256:e0770fadba80c31013896c7e6ef703f72e7834965954a78e71a3049488d4d7d8 @@ -175,11 +196,3 @@ pywin32-ctypes==0.2.0; \ cx-Logging==3.0; \ sys_platform=="win32" \ --hash=sha256:ba8a7465facf7b98d8f494030fb481a2e8aeee29dc191e10383bb54ed42bdb34 -PyQt5==5.15.6; \ - sys_platform=="win32" \ - --hash=sha256:80343bcab95ffba619f2ed2467fd828ffeb0a251ad7225be5fc06dcc333af452 \ - --hash=sha256:f411ecda52e488e1d3c5cce7563e1b2ca9cf0b7531e3c25b03d9a7e56e07e7fc \ - --hash=sha256:9d2dcdaf82263ae56023410a7af15d1fd746c8e361733a7d0d1bd1f004ec2793 -PyQt5-Qt5==5.15.2; \ - sys_platform=="win32" \ - --hash=sha256:750b78e4dba6bdf1607febedc08738e318ea09e9b10aea9ff0d73073f11f6962 From 347d8121b871c77f745d6b1d7984045118bcafff Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Fri, 21 Jan 2022 16:47:28 +0100 Subject: [PATCH 002/213] Delete qt-patch-macosx-target.sh We will now install Qt via pip, so this patch is not needed anymore. --- projects/qt-patch-macosx-target.sh | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100755 projects/qt-patch-macosx-target.sh diff --git a/projects/qt-patch-macosx-target.sh b/projects/qt-patch-macosx-target.sh deleted file mode 100755 index 5a933c5e..00000000 --- a/projects/qt-patch-macosx-target.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# -# If QMAKE_MACOSX_DEPLOYMENT_TARGET is defined in the environment, -# modify the configuration scripts in Qt (qtbase/mkspecs/) to use -# that as the target OSX version. -# - -if [ -z "${QMAKE_MACOSX_DEPLOYMENT_TARGET}" ]; then - echo "QMAKE_MACOSX_DEPLOYMENT_TARGET not defined, do nothing" - exit -fi - -grep -r 'QMAKE_MACOSX_DEPLOYMENT_TARGET = ' ./qtbase/mkspecs | cut -d':' -f1 | xargs sed -i '' 's/^\(QMAKE_MACOSX_DEPLOYMENT_TARGET =\)\(.*\)$/\1 '"${QMAKE_MACOSX_DEPLOYMENT_TARGET}"'/g' From 9b645ccbc35182e7e3a115690d6c2c36f0cb14a1 Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Fri, 21 Jan 2022 16:48:14 +0100 Subject: [PATCH 003/213] Delete pyqt.cmake We will now install PyQt6 via pip, so this project is not needed anymore. --- projects/pyqt.cmake | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 projects/pyqt.cmake diff --git a/projects/pyqt.cmake b/projects/pyqt.cmake deleted file mode 100644 index 9902057a..00000000 --- a/projects/pyqt.cmake +++ /dev/null @@ -1,36 +0,0 @@ -set(pyqt_command "") -if(NOT BUILD_OS_WINDOWS) - # Building PyQt on Windows is problematic due to linking against specific Windows libraries. - # Instead, we'll use the less favourable approach of installation via Pip, which drags PyPI into the circle of trust. - # See requirements.txt for installing on windows with pip - # TODO: PyPi is already in out circle of trust why not use the same approach for the Linux and MacOS - if(BUILD_OS_OSX) - set(pyqt_command - ${Python3_EXECUTABLE} configure.py - --sysroot ${CMAKE_INSTALL_PREFIX} - --qmake ${CMAKE_INSTALL_PREFIX}/bin/qmake - --sip ${CMAKE_INSTALL_PREFIX}/bin/sip - --confirm-license - ) - else() - set(pyqt_command - # On Linux, PyQt configure fails because it creates an executable that does not respect RPATH - "LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib" - ${Python3_EXECUTABLE} configure.py - --sysroot ${CMAKE_INSTALL_PREFIX} - --qmake ${CMAKE_INSTALL_PREFIX}/bin/qmake - --sip ${CMAKE_INSTALL_PREFIX}/bin/sip - --confirm-license - ) - endif() - - ExternalProject_Add(PyQt - URL https://files.pythonhosted.org/packages/28/6c/640e3f5c734c296a7193079a86842a789edb7988dca39eab44579088a1d1/PyQt5-5.15.2.tar.gz - URL_HASH SHA256=372b08dc9321d1201e4690182697c5e7ffb2e0770e6b4a45519025134b12e4fc - CONFIGURE_COMMAND ${pyqt_command} - BUILD_IN_SOURCE 1 - ) - - SetProjectDependencies(TARGET PyQt DEPENDS Qt Sip) - -endif() From 31b3cd9c84f1c5b712688efe2e9ef5cc8f93cd72 Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Fri, 21 Jan 2022 16:48:36 +0100 Subject: [PATCH 004/213] Delete qt.cmake We will now install PyQt6-Qt6 via pip, so this project is not needed anymore. --- projects/qt.cmake | 79 ----------------------------------------------- 1 file changed, 79 deletions(-) delete mode 100644 projects/qt.cmake diff --git a/projects/qt.cmake b/projects/qt.cmake deleted file mode 100644 index 86d3418b..00000000 --- a/projects/qt.cmake +++ /dev/null @@ -1,79 +0,0 @@ -set(qt_url https://download.qt.io/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz) -set(qt_SHA256 3a530d1b243b5dec00bc54937455471aaa3e56849d2593edb8ded07228202240) - -if(BUILD_OS_WINDOWS) - # For some as of yet unknown reason, building Qt on Windows fails because it does not create moc targets. - # Due to that we install the PyQt wheel into the built Python manually. - return() -endif() - -set(_qt_configure_cmd "./configure") -set(qt_options - -release - -prefix ${CMAKE_INSTALL_PREFIX} - -archdatadir ${CMAKE_INSTALL_PREFIX}/lib - -datadir ${CMAKE_INSTALL_PREFIX}/share - -opensource - -confirm-license - -nomake examples - -nomake tests - -nomake tools - -no-cups - -no-sql-db2 - -no-sql-ibase - -no-sql-mysql - -no-sql-oci - -no-sql-odbc - -no-sql-psql - -no-sql-sqlite - -no-sql-sqlite2 - -no-sql-tds - -skip qtconnectivity - -skip qtdoc - -skip qtlocation - -skip qtmultimedia - -skip qtscript - -skip qtsensors - -skip qtwebchannel - -skip qtwebengine - -skip qtandroidextras - -skip qtactiveqt - -skip qttools - -skip qtxmlpatterns - -skip qt3d - -skip qtcanvas3d - -skip qtserialport - -skip qtwayland - -skip qtgamepad - -skip qtscxml -) - -if(BUILD_OS_OSX) - list(APPEND qt_options -no-framework) - if(CURA_OSX_SDK_VERSION) - list(APPEND qt_options -sdk macosx${CURA_OSX_SDK_VERSION}) - endif() - set(_qt_config_cmd ${CMAKE_SOURCE_DIR}/projects/qt-patch-macosx-target.sh && ${_qt_configure_cmd}) -elseif(BUILD_OS_WINDOWS) - list(APPEND qt_options -opengl desktop) -elseif(BUILD_OS_LINUX) - list(APPEND qt_options - -rpath - -pkg-config - -opengl desktop -no-gtk - -fontconfig - -system-freetype - -system-zlib - -ssl -openssl-runtime - -xcb -xcb-xlib # To build the xcb platform plug-in, found in https://forum.qt.io/topic/115827/build-on-linux-qt-xcb-option/16 - -I "${CMAKE_INSTALL_PREFIX}/include" - -L "${CMAKE_INSTALL_PREFIX}/lib") -endif() - -ExternalProject_Add(Qt - URL ${qt_url} - URL_HASH SHA256=${qt_SHA256} - CONFIGURE_COMMAND ${_qt_configure_cmd} ${qt_options} - BUILD_IN_SOURCE 1 - DEPENDS OpenSSL -) From 6da36c6dcc030b2b7b8c35f593fce3b55117a416 Mon Sep 17 00:00:00 2001 From: evtrados Date: Fri, 21 Jan 2022 15:53:45 +0000 Subject: [PATCH 005/213] Add extra needed environment variables --- docker/linux/Dockerfile.debian | 4 +++- docker/linux/build.sh | 1 + docker/linux/entrypoint.sh | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index 5f1735c8..85d56ab3 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -28,7 +28,9 @@ RUN mkdir -p "${CURA_BUILD_ENV_WORK_DIR}" "${CURA_BUILD_ENV_PATH}" ADD . "${CURA_BUILD_ENV_WORK_DIR}"/src ENV PATH="${CURA_BUILD_ENV_PATH}/bin:${PATH}" \ - PKG_CONFIG_PATH="${CURA_BUILD_ENV_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}" + PKG_CONFIG_PATH="${CURA_BUILD_ENV_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}" \ + LD_LIBRARY_PATH="${CURA_BUILD_ENV_PATH}/lib:${LD_LIBRARY_PATH}" \ + CURA_BUILD_ENV_PATH=/srv/cura-build-environment # Build the build environment RUN mkdir -p "${CURA_BUILD_ENV_WORK_DIR}"/build && \ diff --git a/docker/linux/build.sh b/docker/linux/build.sh index 23713393..dc69d94b 100755 --- a/docker/linux/build.sh +++ b/docker/linux/build.sh @@ -20,6 +20,7 @@ fi # Set up environment variables export PATH="${CURA_BUILD_ENV_PATH}/bin:${PATH}" export PKG_CONFIG_PATH="${CURA_BUILD_ENV_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}" +export LD_LIBRARY_PATH="${CURA_BUILD_ENV_PATH}/lib:${LD_LIBRARY_PATH}" # Build cmake "${SRC_PATH}" \ diff --git a/docker/linux/entrypoint.sh b/docker/linux/entrypoint.sh index f9190428..c8989b7e 100755 --- a/docker/linux/entrypoint.sh +++ b/docker/linux/entrypoint.sh @@ -13,6 +13,7 @@ fi # Sets up the environment variables. export PATH="${CURA_BUILD_ENV_PATH}/bin:${PATH}" export PKG_CONFIG_PATH="${CURA_BUILD_ENV_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}" +export LD_LIBRARY_PATH="${CURA_BUILD_ENV_PATH}/lib:${LD_LIBRARY_PATH}" # Execute command exec "$@" From af06af335870d0e9ad2bb72c4d5a264d66b7faf0 Mon Sep 17 00:00:00 2001 From: evtrados Date: Mon, 31 Jan 2022 14:57:18 +0100 Subject: [PATCH 006/213] Remove sip.cmake and install sip v6 via pip --- projects/base_requirements.txt | 9 +++++++++ projects/sip.cmake | 28 ---------------------------- 2 files changed, 9 insertions(+), 28 deletions(-) delete mode 100644 projects/sip.cmake diff --git a/projects/base_requirements.txt b/projects/base_requirements.txt index 22822370..f4489166 100644 --- a/projects/base_requirements.txt +++ b/projects/base_requirements.txt @@ -123,3 +123,12 @@ sys_platform=="win32" \ cryptography==3.4.8; \ sys_platform=="linux" \ --hash=sha256:1eb7bb0df6f6f583dd8e054689def236255161ebbcf62b226454ab9ec663746b + +toml==0.10.2 \ + --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \ + --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f +sip==6.5.0 \ + --hash=sha256:28edf2e20db20ebf135e94e3295d8a90427e4ea461337413bf3ff2ce31bbdafe \ + --hash=sha256:71332c6f209a45bf019a352fe0374fa9d58fe1f6970c8e13dbeec62e5bab2114 \ + --hash=sha256:75ca74f5a6a2024dd984aece7ecc78676ec99be218b504744392dfbdf2d4200a \ + --hash=sha256:a1cf8431a8eb9392b3ff6dc61d832d0447bfdcae5b3e4256a5fa74dbc25b0734 diff --git a/projects/sip.cmake b/projects/sip.cmake deleted file mode 100644 index 394e4ebb..00000000 --- a/projects/sip.cmake +++ /dev/null @@ -1,28 +0,0 @@ -if(BUILD_OS_WINDOWS) - set(sip_command - ${Python3_EXECUTABLE} - configure.py - --platform win32-msvc2015 - ) -elseif(BUILD_OS_LINUX) - set(sip_command - ${Python3_EXECUTABLE} - configure.py - ) -elseif(BUILD_OS_OSX) - set(sip_command - ${Python3_EXECUTABLE} - configure.py - ) -else() - set(sip_command "") -endif() - -ExternalProject_Add(Sip - URL https://www.riverbankcomputing.com/static/Downloads/sip/4.19.25/sip-4.19.25.tar.gz - URL_HASH SHA256=b39d93e937647807bac23579edbff25fe46d16213f708370072574ab1f1b4211 - CONFIGURE_COMMAND ${sip_command} - BUILD_IN_SOURCE 1 -) - -SetProjectDependencies(TARGET Sip DEPENDS Python) From f26c88445499e564bb2662b9fd2abe55e024e1db Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 11 Feb 2022 09:16:08 +0100 Subject: [PATCH 007/213] Get Arcus updated to Sip 6. part of CURA-7924 --- .gitignore | 4 ++++ projects/arcus.cmake | 12 +++++++++--- projects/base_requirements.txt | 2 +- projects/protobuf.cmake | 9 ++++++++- projects/pynest2d.cmake | 2 +- projects/savitar.cmake | 2 +- 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index bf5798cc..f7f95302 100644 --- a/.gitignore +++ b/.gitignore @@ -96,3 +96,7 @@ ENV/ .ropeproject .DS_Store + +# Backups +*.bak +*~ diff --git a/projects/arcus.cmake b/projects/arcus.cmake index fb726ffa..8c56a82c 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -31,6 +31,7 @@ if(BUILD_OS_OSX) endif() endif() + ExternalProject_Add(Arcus GIT_REPOSITORY https://github.com/ultimaker/libArcus.git GIT_TAG origin/${CURA_ARCUS_BRANCH_OR_TAG} @@ -40,13 +41,18 @@ ExternalProject_Add(Arcus -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_CXX_STANDARD=17 - -DBUILD_STATIC=ON + -DBUILD_STATIC=OFF + -DBUILD_MSVC_STATIC_RUNTIME=OFF -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=OFF ${extra_cmake_args} + BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" + COMMAND ${CMAKE_MAKE_PROGRAM} + INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install + COMMAND sip-install --target-dir ${CMAKE_INSTALL_PREFIX}/lib/site-packages ) -SetProjectDependencies(TARGET Arcus DEPENDS Sip Protobuf) +SetProjectDependencies(TARGET Arcus DEPENDS Python Protobuf) if(BUILD_OS_WINDOWS) ExternalProject_Add(Arcus-MinGW @@ -67,5 +73,5 @@ if(BUILD_OS_WINDOWS) INSTALL_COMMAND mingw32-make install ) - SetProjectDependencies(TARGET Arcus-MinGW DEPENDS Sip Protobuf-MinGW Arcus) + SetProjectDependencies(TARGET Arcus-MinGW DEPENDS Protobuf-MinGW Arcus) endif() diff --git a/projects/base_requirements.txt b/projects/base_requirements.txt index f4489166..1ed2da51 100644 --- a/projects/base_requirements.txt +++ b/projects/base_requirements.txt @@ -127,7 +127,7 @@ sys_platform=="linux" \ toml==0.10.2 \ --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \ --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f -sip==6.5.0 \ +sip==6.5 \ --hash=sha256:28edf2e20db20ebf135e94e3295d8a90427e4ea461337413bf3ff2ce31bbdafe \ --hash=sha256:71332c6f209a45bf019a352fe0374fa9d58fe1f6970c8e13dbeec62e5bab2114 \ --hash=sha256:75ca74f5a6a2024dd984aece7ecc78676ec99be218b504744392dfbdf2d4200a \ diff --git a/projects/protobuf.cmake b/projects/protobuf.cmake index 19e975d1..2ecc9665 100644 --- a/projects/protobuf.cmake +++ b/projects/protobuf.cmake @@ -18,7 +18,7 @@ set(protobuf_configure_args -DCMAKE_CXX_FLAGS=${protobuf_cxx_flags} -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_EXAMPLES=OFF - -Dprotobuf_BUILD_SHARED_LIBS=OFF + -Dprotobuf_BUILD_SHARED_LIBS=ON -Dprotobuf_WITH_ZLIB=OFF ) @@ -75,3 +75,10 @@ if(BUILD_OS_WINDOWS) INSTALL_COMMAND mingw32-make install ) endif() + +add_custom_command( + TARGET Protobuf POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_BINARY_DIR}/Protobuf-prefix/src/Protobuf/src/google/" "${CMAKE_INSTALL_PREFIX}/include/." + COMMENT "Protobuf: Needs more headers than can be found in the include directory. This is probably an oversight in protobuf. Just dump the intire protobuf source in the include directory then." + ) + diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index 22ce8775..250220c3 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -31,4 +31,4 @@ ExternalProject_Add(pynest2d ${extra_cmake_args} ) -SetProjectDependencies(TARGET pynest2d DEPENDS Sip libnest2d) +SetProjectDependencies(TARGET pynest2d DEPENDS Python libnest2d) diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 9121bad1..25757d9e 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -33,4 +33,4 @@ ExternalProject_Add(Savitar ${extra_cmake_args} ) -SetProjectDependencies(TARGET Savitar DEPENDS Sip) +SetProjectDependencies(TARGET Savitar DEPENDS Python) From a1aa1fdecf1831c21be54b10d3206a9e84d86979 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 11 Feb 2022 14:25:23 +0100 Subject: [PATCH 008/213] Make Savitar work with Sip 6 part of CURA-7924 --- projects/arcus.cmake | 4 ++-- projects/savitar.cmake | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 8c56a82c..d23197c3 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -6,7 +6,7 @@ set(pylib_cmake_command ${CMAKE_COMMAND}) if(BUILD_OS_WINDOWS) set(extra_cmake_args -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs - -DMSVC_STATIC_RUNTIME=ON + -DMSVC_STATIC_RUNTIME=OFF -DCMAKE_EXE_LINKER_FLAGS=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 -DCMAKE_EXE_LINKER_FLAGS_RELEASE=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 -DCMAKE_MODULE_LINKER_FLAGS=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 @@ -42,9 +42,9 @@ ExternalProject_Add(Arcus -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_CXX_STANDARD=17 -DBUILD_STATIC=OFF - -DBUILD_MSVC_STATIC_RUNTIME=OFF -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=OFF + -DPY_DEPEND_BIN_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}/lib/site-packages" ${extra_cmake_args} BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 25757d9e..9006bbcd 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -4,6 +4,7 @@ set(extra_cmake_args "") if(BUILD_OS_WINDOWS) set(extra_cmake_args -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs + -DMSVC_STATIC_RUNTIME=OFF ) else() if(BUILD_OS_OSX) @@ -29,8 +30,13 @@ ExternalProject_Add(Savitar -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} -DCMAKE_CXX_STANDARD=17 - -DBUILD_STATIC=ON + -DBUILD_STATIC=OFF + -DPY_DEPEND_BIN_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}/lib/site-packages" ${extra_cmake_args} + BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" + COMMAND ${CMAKE_MAKE_PROGRAM} + INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install + COMMAND sip-install --target-dir ${CMAKE_INSTALL_PREFIX}/lib/site-packages ) SetProjectDependencies(TARGET Savitar DEPENDS Python) From dac1bd3a7dc36228830f157b17d0da974e9da9e5 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 15 Feb 2022 15:27:16 +0100 Subject: [PATCH 009/213] Get pynest2d to work with Sip 6. part of CURA-7924 --- CMakeLists.txt | 11 ++++++++--- projects/arcus.cmake | 2 +- projects/clipper.cmake | 2 +- projects/pynest2d.cmake | 15 +++++++++++++-- projects/savitar.cmake | 2 +- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 14b85bba..5493bebe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,14 +3,19 @@ project(cura-build-environment) -cmake_minimum_required(VERSION 3.6) +cmake_minimum_required(VERSION 3.12) if(NOT CURA_ARCUS_BRANCH_OR_TAG) - set(CURA_ARCUS_BRANCH_OR_TAG "master") + set(CURA_ARCUS_BRANCH_OR_TAG "CURA-7924_update_to_sip6") endif() if(NOT CURA_SAVITAR_BRANCH_OR_TAG) - set(CURA_SAVITAR_BRANCH_OR_TAG "master") + set(CURA_SAVITAR_BRANCH_OR_TAG "CURA-7924_update_to_sip6") endif() +if (NOT CURA_PYNEST2D_BRANCH_OR_TAG) + set(CURA_PYNEST2D_BRANCH_OR_TAG "CURA-7924_update_to_sip6") +endif() +# TODO: Revert this to the main branch for the top to when committing! +# TODO: Also, don't forget these when we switch to 'main' -> perhaps better to take the _current_ branch or tag even? # This should care that our CMAKE_INSTALL_PREFIX is absolute at the end... get_filename_component(CMAKE_INSTALL_PREFIX diff --git a/projects/arcus.cmake b/projects/arcus.cmake index d23197c3..472f3c14 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -44,7 +44,7 @@ ExternalProject_Add(Arcus -DBUILD_STATIC=OFF -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=OFF - -DPY_DEPEND_BIN_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}/lib/site-packages" + -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/Lib/site-packages/ ${extra_cmake_args} BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} diff --git a/projects/clipper.cmake b/projects/clipper.cmake index 7022bfe0..ef18b000 100644 --- a/projects/clipper.cmake +++ b/projects/clipper.cmake @@ -8,7 +8,7 @@ if(NOT TARGET Clipper) ExternalProject_Add(Clipper URL https://sourceforge.net/projects/polyclipping/files/clipper_ver6.4.2.zip URL_HASH SHA256=a14320d82194807c4480ce59c98aa71cd4175a5156645c4e2b3edd330b930627 - PATCH_COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper/cpp" "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper" && ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/projects/clipper_cmakelists_patch.txt" "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper/CMakeLists.txt" + PATCH_COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper/cpp" "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper" && ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/projects/clipper_cmakelists_patch.txt" "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper/CMakeLists.txt" && ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper/clipper.hpp" "${CMAKE_INSTALL_PREFIX}/include/" CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index 250220c3..eaf04680 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -21,14 +21,25 @@ endif() ExternalProject_Add(pynest2d GIT_REPOSITORY https://github.com/Ultimaker/pynest2d.git - GIT_TAG origin/master + GIT_TAG origin/${CURA_PYNEST2D_BRANCH_OR_TAG} GIT_SHALLOW 1 CMAKE_COMMAND ${pylib_cmake_command} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} - -DBUILD_STATIC=ON + -DBUILD_STATIC=OFF + -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/Lib/site-packages + -DPYNEST2D_EXTRA_INCLUDES=${CMAKE_INSTALL_PREFIX}/include + -DPYNEST2D_EXTRA_LIBS=${CMAKE_INSTALL_PREFIX}/bin ${extra_cmake_args} + BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" + COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" + INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" + COMMAND sip-install --target-dir ${CMAKE_INSTALL_PREFIX}/lib/site-packages ) +# TODO: Ignoring the first error (in the 1st) build command is hacky, but functions, +# since any errors that are of a more permanent nature would be picked up by the 2nd identical one. +# ... ignoring the ones _after_ that is just bad. +# But it will make the _actual_ file we need, so do it like that for now. SetProjectDependencies(TARGET pynest2d DEPENDS Python libnest2d) diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 9006bbcd..38605269 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -31,7 +31,7 @@ ExternalProject_Add(Savitar -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} -DCMAKE_CXX_STANDARD=17 -DBUILD_STATIC=OFF - -DPY_DEPEND_BIN_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}/lib/site-packages" + -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/Lib/site-packages ${extra_cmake_args} BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} From 16d0594b03fb3f2992eccfe032e2bf518b7976c9 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 15 Feb 2022 16:03:29 +0100 Subject: [PATCH 010/213] Use all available cores for make on Linux The linux builds are always taking a long time. This is mostly due to `make` using a single core by default. By adding the argument `-j $(nproc)` to various projects which are build from source we can speed up the build process significantly. --- projects/bzip2.cmake | 2 +- projects/libffi.cmake | 2 +- projects/openblas.cmake | 2 +- projects/openctm.cmake | 2 +- projects/openssl.cmake | 2 +- projects/python.cmake | 2 +- projects/sqlite3.cmake | 2 +- projects/xz.cmake | 2 +- projects/zlib.cmake | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/projects/bzip2.cmake b/projects/bzip2.cmake index a5eba706..53c625c6 100644 --- a/projects/bzip2.cmake +++ b/projects/bzip2.cmake @@ -3,7 +3,7 @@ if(BUILD_OS_LINUX) URL https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz URL_HASH SHA256=ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 CONFIGURE_COMMAND "" - BUILD_COMMAND make -f Makefile PREFIX=${CMAKE_INSTALL_PREFIX} + BUILD_COMMAND make -j $(nproc) -f Makefile PREFIX=${CMAKE_INSTALL_PREFIX} INSTALL_COMMAND make -f Makefile install PREFIX=${CMAKE_INSTALL_PREFIX} BUILD_IN_SOURCE 1 ) diff --git a/projects/libffi.cmake b/projects/libffi.cmake index 5dd5a3b5..8c9b67d7 100644 --- a/projects/libffi.cmake +++ b/projects/libffi.cmake @@ -15,7 +15,7 @@ if(NOT BUILD_OS_WINDOWS) URL ftp://sourceware.org/pub/libffi/libffi-3.3.tar.gz URL_HASH SHA256=72fba7922703ddfa7a028d513ac15a85c8d54c8d67f55fa5a4802885dc652056 CONFIGURE_COMMAND ${_libffi_config_cmd} - BUILD_COMMAND make + BUILD_COMMAND make -j $(nproc) INSTALL_COMMAND make install BUILD_IN_SOURCE 1 ) diff --git a/projects/openblas.cmake b/projects/openblas.cmake index 135e9346..70f026ff 100644 --- a/projects/openblas.cmake +++ b/projects/openblas.cmake @@ -7,7 +7,7 @@ if(NOT BUILD_OS_WINDOWS) URL https://github.com/xianyi/OpenBLAS/archive/v0.3.13.tar.gz URL_HASH SHA256=79197543b17cc314b7e43f7a33148c308b0807cd6381ee77f77e15acf3e6459e CONFIGURE_COMMAND "" - BUILD_COMMAND make PREFIX=${CMAKE_INSTALL_PREFIX} ${openblas_options} + BUILD_COMMAND make -j $(nproc) PREFIX=${CMAKE_INSTALL_PREFIX} ${openblas_options} INSTALL_COMMAND make PREFIX=${CMAKE_INSTALL_PREFIX} ${openblas_options} install BUILD_IN_SOURCE 1 ) diff --git a/projects/openctm.cmake b/projects/openctm.cmake index 5b6701e7..0f236be7 100644 --- a/projects/openctm.cmake +++ b/projects/openctm.cmake @@ -18,7 +18,7 @@ elseif (BUILD_OS_LINUX) URL ${_cura_openctm_url} URL_HASH SHA256=${_cura_openctm_sha256} CONFIGURE_COMMAND "" - BUILD_COMMAND make -f Makefile.linux openctm + BUILD_COMMAND make -j $(nproc) -f Makefile.linux openctm INSTALL_COMMAND ${CMAKE_COMMAND} -E copy lib/libopenctm.so ${CMAKE_INSTALL_PREFIX}/lib/libopenctm.so COMMAND ${CMAKE_COMMAND} -E copy lib/openctm.h ${CMAKE_INSTALL_PREFIX}/include/openctm.h COMMAND ${CMAKE_COMMAND} -E copy lib/openctmpp.h ${CMAKE_INSTALL_PREFIX}/include/openctmpp.h diff --git a/projects/openssl.cmake b/projects/openssl.cmake index 3349e2bd..b5418219 100644 --- a/projects/openssl.cmake +++ b/projects/openssl.cmake @@ -1,5 +1,5 @@ if(NOT BUILD_OS_WINDOWS) - set(_openssl_build make depend && make) + set(_openssl_build make depend && make -j $(nproc)) set(_openssl_install make install) if(BUILD_OS_LINUX) set(_openssl_configure perl Configure --prefix=${CMAKE_INSTALL_PREFIX} --openssldir=${CMAKE_INSTALL_PREFIX} no-ssl2 no-ssl3 no-zlib shared enable-cms linux-x86_64 enable-ec_nistp_64_gcc_128) diff --git a/projects/python.cmake b/projects/python.cmake index e838332b..39e5aacb 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -1,5 +1,5 @@ set(python_configure_command ./configure --prefix=${CMAKE_INSTALL_PREFIX} --enable-shared --enable-ipv6 --without-pymalloc ) -set(python_build_command make) +set(python_build_command make -j $(nproc)) set(python_install_command make install) if(BUILD_OS_WINDOWS) diff --git a/projects/sqlite3.cmake b/projects/sqlite3.cmake index 7a6819d7..c3cc94e1 100644 --- a/projects/sqlite3.cmake +++ b/projects/sqlite3.cmake @@ -14,7 +14,7 @@ elseif(BUILD_OS_LINUX) URL_HASH SHA256=5daa6a3fb7d1e8c767cd59c4ded8da6e4b00c61d3b466d0685e35c4dd6d7bf5d PATCH_COMMAND libtoolize CONFIGURE_COMMAND ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} - BUILD_COMMAND make + BUILD_COMMAND make -j $(nproc) INSTALL_COMMAND make install BUILD_IN_SOURCE 1 ) diff --git a/projects/xz.cmake b/projects/xz.cmake index b3b79bb8..9f093cee 100644 --- a/projects/xz.cmake +++ b/projects/xz.cmake @@ -12,7 +12,7 @@ elseif(BUILD_OS_LINUX) URL https://sourceforge.net/projects/lzmautils/files/xz-5.2.4.tar.gz URL_HASH SHA256=b512f3b726d3b37b6dc4c8570e137b9311e7552e8ccbab4d39d47ce5f4177145 CONFIGURE_COMMAND ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} - BUILD_COMMAND make + BUILD_COMMAND make -j $(nproc) INSTALL_COMMAND make install BUILD_IN_SOURCE 1 ) diff --git a/projects/zlib.cmake b/projects/zlib.cmake index 3046b256..25d79087 100644 --- a/projects/zlib.cmake +++ b/projects/zlib.cmake @@ -3,7 +3,7 @@ if(BUILD_OS_OSX OR BUILD_OS_LINUX) URL https://www.zlib.net/zlib-1.2.11.tar.gz URL_HASH SHA256=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 CONFIGURE_COMMAND ./configure --64 --prefix=${CMAKE_INSTALL_PREFIX} - BUILD_COMMAND make + BUILD_COMMAND make -j $(nproc) INSTALL_COMMAND make install BUILD_IN_SOURCE 1 ) From d5636e6daaa24c3f6856f8f7ba765d3d90f85501 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 15 Feb 2022 16:05:02 +0100 Subject: [PATCH 011/213] Use CMake-3.21.5 Debian comes with a version of cmake 3.13.x building CMake from source ensures that we can use the latest version. --- docker/linux/Dockerfile.debian | 14 ++++++++++++-- docker/linux/entrypoint.sh | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index 85d56ab3..fda9fe0f 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -21,17 +21,27 @@ RUN apt update -y && \ apt upgrade -y && \ apt install -y build-essential g++ gfortran libtool make autoconf automake git curl wget cmake tar \ libffi-dev pkg-config libx11-xcb-dev libxcb* libfreetype6-dev libgl1-mesa-dev libegl1-mesa libxkbcommon-dev \ - libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf + libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev # Set up the working directory RUN mkdir -p "${CURA_BUILD_ENV_WORK_DIR}" "${CURA_BUILD_ENV_PATH}" ADD . "${CURA_BUILD_ENV_WORK_DIR}"/src -ENV PATH="${CURA_BUILD_ENV_PATH}/bin:${PATH}" \ +ENV PATH="${CURA_BUILD_ENV_PATH}/bin:/usr/local/bin/:${PATH}" \ PKG_CONFIG_PATH="${CURA_BUILD_ENV_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}" \ LD_LIBRARY_PATH="${CURA_BUILD_ENV_PATH}/lib:${LD_LIBRARY_PATH}" \ CURA_BUILD_ENV_PATH=/srv/cura-build-environment +RUN wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5.tar.gz && \ + tar -zxvf cmake-3.21.5.tar.gz && \ + cd cmake-3.21.5 && \ + cmake . && \ + make -j $(nproc) && \ + make install && \ + cd .. && \ + rm -rf cmake-3.21.5 && \ + apt-get remove -y cmake + # Build the build environment RUN mkdir -p "${CURA_BUILD_ENV_WORK_DIR}"/build && \ chown -R ultimaker:ultimaker "${CURA_BUILD_ENV_WORK_DIR}" && \ diff --git a/docker/linux/entrypoint.sh b/docker/linux/entrypoint.sh index c8989b7e..1e012608 100755 --- a/docker/linux/entrypoint.sh +++ b/docker/linux/entrypoint.sh @@ -11,7 +11,7 @@ if [[ -z "${CURA_BUILD_ENV_PATH}" ]]; then fi # Sets up the environment variables. -export PATH="${CURA_BUILD_ENV_PATH}/bin:${PATH}" +export PATH="${CURA_BUILD_ENV_PATH}/bin:/usr/local/bin:${PATH}" export PKG_CONFIG_PATH="${CURA_BUILD_ENV_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}" export LD_LIBRARY_PATH="${CURA_BUILD_ENV_PATH}/lib:${LD_LIBRARY_PATH}" From be012acfed2ce56893f51b1420b1a9868054c277 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 15 Feb 2022 18:17:40 +0100 Subject: [PATCH 012/213] Hopefully fix inability to find sip-install. Otherwise the file(s) should be manually copied, but that'll require some trial-and-error. part of CURA-7924 --- projects/arcus.cmake | 6 ++++-- projects/pynest2d.cmake | 8 ++++++-- projects/savitar.cmake | 4 +++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 472f3c14..f1d4b885 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -3,6 +3,7 @@ set(extra_cmake_args "") set(pylib_cmake_command ${CMAKE_COMMAND}) +set(run_program_command "") if(BUILD_OS_WINDOWS) set(extra_cmake_args -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs @@ -16,6 +17,8 @@ if(BUILD_OS_WINDOWS) -DCMAKE_STATIC_LINKER_FLAGS=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 -DCMAKE_STATIC_LINKER_FLAGS_RELEASE=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 ) +else() + set(run_program_command "exec") endif() if(BUILD_OS_OSX) @@ -31,7 +34,6 @@ if(BUILD_OS_OSX) endif() endif() - ExternalProject_Add(Arcus GIT_REPOSITORY https://github.com/ultimaker/libArcus.git GIT_TAG origin/${CURA_ARCUS_BRANCH_OR_TAG} @@ -49,7 +51,7 @@ ExternalProject_Add(Arcus BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - COMMAND sip-install --target-dir ${CMAKE_INSTALL_PREFIX}/lib/site-packages + COMMAND ${run_program_command} ${CMAKE_INSTALL_PREFIX}/Scripts/sip-install --target-dir ${CMAKE_INSTALL_PREFIX}/lib/site-packages ) SetProjectDependencies(TARGET Arcus DEPENDS Python Protobuf) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index eaf04680..5641b966 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -4,9 +4,12 @@ set(pylib_cmake_command ${CMAKE_COMMAND}) set(extra_cmake_args "") +set(run_program_command "") if(BUILD_OS_WINDOWS) set(extra_cmake_args -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX}) -elseif(BUILD_OS_OSX) +else() + set(run_program_command "exec") + if(BUILD_OS_OSX) if(CMAKE_OSX_DEPLOYMENT_TARGET) list(APPEND extra_cmake_args -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} @@ -17,6 +20,7 @@ elseif(BUILD_OS_OSX) -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} ) endif() + endif() endif() ExternalProject_Add(pynest2d @@ -35,7 +39,7 @@ ExternalProject_Add(pynest2d BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" - COMMAND sip-install --target-dir ${CMAKE_INSTALL_PREFIX}/lib/site-packages + COMMAND ${run_program_command} ${CMAKE_INSTALL_PREFIX}/Scripts/sip-install --target-dir ${CMAKE_INSTALL_PREFIX}/lib/site-packages ) # TODO: Ignoring the first error (in the 1st) build command is hacky, but functions, # since any errors that are of a more permanent nature would be picked up by the 2nd identical one. diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 38605269..61594e8d 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -1,12 +1,14 @@ set(savitar_cmake_command ${CMAKE_COMMAND}) set(extra_cmake_args "") +set(run_program_command "") if(BUILD_OS_WINDOWS) set(extra_cmake_args -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs -DMSVC_STATIC_RUNTIME=OFF ) else() + set(run_program_command "exec") if(BUILD_OS_OSX) if(CMAKE_OSX_DEPLOYMENT_TARGET) list(APPEND extra_cmake_args @@ -36,7 +38,7 @@ ExternalProject_Add(Savitar BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - COMMAND sip-install --target-dir ${CMAKE_INSTALL_PREFIX}/lib/site-packages + COMMAND ${run_program_command} ${CMAKE_INSTALL_PREFIX}/Scripts/sip-install --target-dir ${CMAKE_INSTALL_PREFIX}/lib/site-packages ) SetProjectDependencies(TARGET Savitar DEPENDS Python) From 50c820d903062f743cf391e77d3361e1137b4e70 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 16 Feb 2022 08:55:36 +0100 Subject: [PATCH 013/213] OS agnostic way of asking ammount of cores (for make -j). part of CURA-7924 --- CMakeLists.txt | 7 +++++++ projects/bzip2.cmake | 2 +- projects/libffi.cmake | 2 +- projects/openblas.cmake | 2 +- projects/openctm.cmake | 4 ++-- projects/openssl.cmake | 2 +- projects/python.cmake | 2 +- projects/sqlite3.cmake | 4 ++-- projects/xz.cmake | 4 ++-- projects/zlib.cmake | 2 +- 10 files changed, 19 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5493bebe..a94e15d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,12 +25,19 @@ get_filename_component(CMAKE_INSTALL_PREFIX list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) +include(ProcessorCount) + include(ExternalProject) include(GNUInstallDirs) include(BuildPlatformDetection) include(SetProjectDependencies) +ProcessorCount(N_PROC) +if(N_PROC EQUAL 0) + set(N_PROC 1) +endif() + # Hard-code the CPython executable to use later because all find_package() # commands are executed when the Makefiles are generated. Because we need to # compile CPython first, all other projects that require Python must use our diff --git a/projects/bzip2.cmake b/projects/bzip2.cmake index 53c625c6..741c6372 100644 --- a/projects/bzip2.cmake +++ b/projects/bzip2.cmake @@ -3,7 +3,7 @@ if(BUILD_OS_LINUX) URL https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz URL_HASH SHA256=ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 CONFIGURE_COMMAND "" - BUILD_COMMAND make -j $(nproc) -f Makefile PREFIX=${CMAKE_INSTALL_PREFIX} + BUILD_COMMAND make -j ${N_PROC} -f Makefile PREFIX=${CMAKE_INSTALL_PREFIX} INSTALL_COMMAND make -f Makefile install PREFIX=${CMAKE_INSTALL_PREFIX} BUILD_IN_SOURCE 1 ) diff --git a/projects/libffi.cmake b/projects/libffi.cmake index 8c9b67d7..873d7639 100644 --- a/projects/libffi.cmake +++ b/projects/libffi.cmake @@ -15,7 +15,7 @@ if(NOT BUILD_OS_WINDOWS) URL ftp://sourceware.org/pub/libffi/libffi-3.3.tar.gz URL_HASH SHA256=72fba7922703ddfa7a028d513ac15a85c8d54c8d67f55fa5a4802885dc652056 CONFIGURE_COMMAND ${_libffi_config_cmd} - BUILD_COMMAND make -j $(nproc) + BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install BUILD_IN_SOURCE 1 ) diff --git a/projects/openblas.cmake b/projects/openblas.cmake index 70f026ff..05183236 100644 --- a/projects/openblas.cmake +++ b/projects/openblas.cmake @@ -7,7 +7,7 @@ if(NOT BUILD_OS_WINDOWS) URL https://github.com/xianyi/OpenBLAS/archive/v0.3.13.tar.gz URL_HASH SHA256=79197543b17cc314b7e43f7a33148c308b0807cd6381ee77f77e15acf3e6459e CONFIGURE_COMMAND "" - BUILD_COMMAND make -j $(nproc) PREFIX=${CMAKE_INSTALL_PREFIX} ${openblas_options} + BUILD_COMMAND make -j ${N_PROC} PREFIX=${CMAKE_INSTALL_PREFIX} ${openblas_options} INSTALL_COMMAND make PREFIX=${CMAKE_INSTALL_PREFIX} ${openblas_options} install BUILD_IN_SOURCE 1 ) diff --git a/projects/openctm.cmake b/projects/openctm.cmake index 0f236be7..7fbc86c7 100644 --- a/projects/openctm.cmake +++ b/projects/openctm.cmake @@ -18,7 +18,7 @@ elseif (BUILD_OS_LINUX) URL ${_cura_openctm_url} URL_HASH SHA256=${_cura_openctm_sha256} CONFIGURE_COMMAND "" - BUILD_COMMAND make -j $(nproc) -f Makefile.linux openctm + BUILD_COMMAND make -j ${N_PROC} -f Makefile.linux openctm INSTALL_COMMAND ${CMAKE_COMMAND} -E copy lib/libopenctm.so ${CMAKE_INSTALL_PREFIX}/lib/libopenctm.so COMMAND ${CMAKE_COMMAND} -E copy lib/openctm.h ${CMAKE_INSTALL_PREFIX}/include/openctm.h COMMAND ${CMAKE_COMMAND} -E copy lib/openctmpp.h ${CMAKE_INSTALL_PREFIX}/include/openctmpp.h @@ -29,7 +29,7 @@ else () # OSX URL ${_cura_openctm_url} URL_HASH SHA256=${_cura_openctm_sha256} CONFIGURE_COMMAND "" - BUILD_COMMAND make -f Makefile.macosx openctm + BUILD_COMMAND make -j ${N_PROC} -f Makefile.macosx openctm INSTALL_COMMAND ${CMAKE_COMMAND} -E copy lib/libopenctm.dylib ${CMAKE_INSTALL_PREFIX}/lib/libopenctm.dylib COMMAND ${CMAKE_COMMAND} -E copy lib/openctm.h ${CMAKE_INSTALL_PREFIX}/include/openctm.h COMMAND ${CMAKE_COMMAND} -E copy lib/openctmpp.h ${CMAKE_INSTALL_PREFIX}/include/openctmpp.h diff --git a/projects/openssl.cmake b/projects/openssl.cmake index b5418219..efe26fbc 100644 --- a/projects/openssl.cmake +++ b/projects/openssl.cmake @@ -1,5 +1,5 @@ if(NOT BUILD_OS_WINDOWS) - set(_openssl_build make depend && make -j $(nproc)) + set(_openssl_build make depend && make -j ${N_PROC}) set(_openssl_install make install) if(BUILD_OS_LINUX) set(_openssl_configure perl Configure --prefix=${CMAKE_INSTALL_PREFIX} --openssldir=${CMAKE_INSTALL_PREFIX} no-ssl2 no-ssl3 no-zlib shared enable-cms linux-x86_64 enable-ec_nistp_64_gcc_128) diff --git a/projects/python.cmake b/projects/python.cmake index 39e5aacb..82491b8e 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -1,5 +1,5 @@ set(python_configure_command ./configure --prefix=${CMAKE_INSTALL_PREFIX} --enable-shared --enable-ipv6 --without-pymalloc ) -set(python_build_command make -j $(nproc)) +set(python_build_command make -j ${N_PROC}) set(python_install_command make install) if(BUILD_OS_WINDOWS) diff --git a/projects/sqlite3.cmake b/projects/sqlite3.cmake index c3cc94e1..ebd70054 100644 --- a/projects/sqlite3.cmake +++ b/projects/sqlite3.cmake @@ -3,7 +3,7 @@ if(BUILD_OS_OSX) URL https://sqlite.org/2018/sqlite-autoconf-3260000.tar.gz URL_HASH SHA256=5daa6a3fb7d1e8c767cd59c4ded8da6e4b00c61d3b466d0685e35c4dd6d7bf5d CONFIGURE_COMMAND ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} --with-sysroot=${CMAKE_OSX_SYSROOT} - BUILD_COMMAND make + BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install BUILD_IN_SOURCE 1 ) @@ -14,7 +14,7 @@ elseif(BUILD_OS_LINUX) URL_HASH SHA256=5daa6a3fb7d1e8c767cd59c4ded8da6e4b00c61d3b466d0685e35c4dd6d7bf5d PATCH_COMMAND libtoolize CONFIGURE_COMMAND ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} - BUILD_COMMAND make -j $(nproc) + BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install BUILD_IN_SOURCE 1 ) diff --git a/projects/xz.cmake b/projects/xz.cmake index 9f093cee..6f9497a4 100644 --- a/projects/xz.cmake +++ b/projects/xz.cmake @@ -3,7 +3,7 @@ if(BUILD_OS_OSX) URL https://sourceforge.net/projects/lzmautils/files/xz-5.2.4.tar.gz URL_HASH SHA256=b512f3b726d3b37b6dc4c8570e137b9311e7552e8ccbab4d39d47ce5f4177145 CONFIGURE_COMMAND ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} --with-sysroot=${CMAKE_OSX_SYSROOT} - BUILD_COMMAND make + BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install BUILD_IN_SOURCE 1 ) @@ -12,7 +12,7 @@ elseif(BUILD_OS_LINUX) URL https://sourceforge.net/projects/lzmautils/files/xz-5.2.4.tar.gz URL_HASH SHA256=b512f3b726d3b37b6dc4c8570e137b9311e7552e8ccbab4d39d47ce5f4177145 CONFIGURE_COMMAND ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} - BUILD_COMMAND make -j $(nproc) + BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install BUILD_IN_SOURCE 1 ) diff --git a/projects/zlib.cmake b/projects/zlib.cmake index 25d79087..951dc9f2 100644 --- a/projects/zlib.cmake +++ b/projects/zlib.cmake @@ -3,7 +3,7 @@ if(BUILD_OS_OSX OR BUILD_OS_LINUX) URL https://www.zlib.net/zlib-1.2.11.tar.gz URL_HASH SHA256=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 CONFIGURE_COMMAND ./configure --64 --prefix=${CMAKE_INSTALL_PREFIX} - BUILD_COMMAND make -j $(nproc) + BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install BUILD_IN_SOURCE 1 ) From 41204a62612af60a60951dae7e3ccc0d022173a9 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 16 Feb 2022 10:25:53 +0100 Subject: [PATCH 014/213] Copy .pyd files instead of relying on sip-install precence. part of CURA-7924 --- projects/arcus.cmake | 34 ++++++++++++++++++---------------- projects/pynest2d.cmake | 9 ++++++--- projects/savitar.cmake | 9 ++++++--- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index f1d4b885..9d3168f4 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -3,7 +3,7 @@ set(extra_cmake_args "") set(pylib_cmake_command ${CMAKE_COMMAND}) -set(run_program_command "") +set(ARCUS_pyd_copy_dir) if(BUILD_OS_WINDOWS) set(extra_cmake_args -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs @@ -17,21 +17,23 @@ if(BUILD_OS_WINDOWS) -DCMAKE_STATIC_LINKER_FLAGS=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 -DCMAKE_STATIC_LINKER_FLAGS_RELEASE=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 ) + set(ARCUS_pyd_copy_dir "lib.win-amd64-3.10") else() - set(run_program_command "exec") -endif() - -if(BUILD_OS_OSX) - if(CMAKE_OSX_DEPLOYMENT_TARGET) - list(APPEND extra_cmake_args - -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} - ) - endif() - if(CMAKE_OSX_SYSROOT) - list(APPEND extra_cmake_args - -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} - ) - endif() + if(BUILD_OS_OSX) + if(CMAKE_OSX_DEPLOYMENT_TARGET) + list(APPEND extra_cmake_args + -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} + ) + endif() + if(CMAKE_OSX_SYSROOT) + list(APPEND extra_cmake_args + -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} + ) + endif() + set(ARCUS_pyd_copy_dir "lib.osx-3.10") + else() + set(ARCUS_pyd_copy_dir "lib.linux-x86_64-3.10") + endif() endif() ExternalProject_Add(Arcus @@ -51,7 +53,7 @@ ExternalProject_Add(Arcus BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - COMMAND ${run_program_command} ${CMAKE_INSTALL_PREFIX}/Scripts/sip-install --target-dir ${CMAKE_INSTALL_PREFIX}/lib/site-packages + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build/${ARCUS_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" ) SetProjectDependencies(TARGET Arcus DEPENDS Python Protobuf) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index 5641b966..25f7d740 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -4,11 +4,11 @@ set(pylib_cmake_command ${CMAKE_COMMAND}) set(extra_cmake_args "") -set(run_program_command "") +set(PYNEST_pyd_copy_dir "") if(BUILD_OS_WINDOWS) set(extra_cmake_args -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX}) + set(PYNEST_pyd_copy_dir "lib.win-amd64-3.10") else() - set(run_program_command "exec") if(BUILD_OS_OSX) if(CMAKE_OSX_DEPLOYMENT_TARGET) list(APPEND extra_cmake_args @@ -20,6 +20,9 @@ else() -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} ) endif() + set(PYNEST_pyd_copy_dir "lib.osx-3.10") + else() + set(PYNEST_pyd_copy_dir "lib.linux-x86_64-3.10") endif() endif() @@ -39,7 +42,7 @@ ExternalProject_Add(pynest2d BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" - COMMAND ${run_program_command} ${CMAKE_INSTALL_PREFIX}/Scripts/sip-install --target-dir ${CMAKE_INSTALL_PREFIX}/lib/site-packages + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" ) # TODO: Ignoring the first error (in the 1st) build command is hacky, but functions, # since any errors that are of a more permanent nature would be picked up by the 2nd identical one. diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 61594e8d..20bc2059 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -1,14 +1,14 @@ set(savitar_cmake_command ${CMAKE_COMMAND}) set(extra_cmake_args "") -set(run_program_command "") +set(SAVITAR_pyd_copydir "") if(BUILD_OS_WINDOWS) set(extra_cmake_args -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs -DMSVC_STATIC_RUNTIME=OFF ) + set(SAVITAR_pyd_copydir "lib.win-amd64-3.10") else() - set(run_program_command "exec") if(BUILD_OS_OSX) if(CMAKE_OSX_DEPLOYMENT_TARGET) list(APPEND extra_cmake_args @@ -20,6 +20,9 @@ else() -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} ) endif() + set(SAVITAR_pyd_copydir "lib.osx-3.10") + else() + set(SAVITAR_pyd_copydir "lib.linux-x86_64-3.10") endif() endif() @@ -38,7 +41,7 @@ ExternalProject_Add(Savitar BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - COMMAND ${run_program_command} ${CMAKE_INSTALL_PREFIX}/Scripts/sip-install --target-dir ${CMAKE_INSTALL_PREFIX}/lib/site-packages + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" ) SetProjectDependencies(TARGET Savitar DEPENDS Python) From d9c0254a1b7de023641d35f0ba3cfb5be503cb65 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 16 Feb 2022 14:14:15 +0100 Subject: [PATCH 015/213] Make copy step optional. part of CURA-7924 --- projects/arcus.cmake | 2 +- projects/pynest2d.cmake | 2 +- projects/savitar.cmake | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 9d3168f4..1caf8457 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -53,7 +53,7 @@ ExternalProject_Add(Arcus BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build/${ARCUS_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build/${ARCUS_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || echo "ignore error" ) SetProjectDependencies(TARGET Arcus DEPENDS Python Protobuf) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index 25f7d740..bcb5da26 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -42,7 +42,7 @@ ExternalProject_Add(pynest2d BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || echo "ignore error" ) # TODO: Ignoring the first error (in the 1st) build command is hacky, but functions, # since any errors that are of a more permanent nature would be picked up by the 2nd identical one. diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 20bc2059..70d49de0 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -41,7 +41,7 @@ ExternalProject_Add(Savitar BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || echo "ignore error" ) SetProjectDependencies(TARGET Savitar DEPENDS Python) From 0a1e22e8e1016613aa54936f952730a57f52ee43 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 16 Feb 2022 15:30:01 +0100 Subject: [PATCH 016/213] Very important commit.` --- CMakeLists.txt | 2 +- docker/linux/Dockerfile.debian | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a94e15d7..39729b8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,7 @@ include(SetProjectDependencies) ProcessorCount(N_PROC) if(N_PROC EQUAL 0) - set(N_PROC 1) + set(N_PROC 1) endif() # Hard-code the CPython executable to use later because all find_package() diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index fda9fe0f..ea2d3be9 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -5,7 +5,7 @@ LABEL linux_distro="debian-buster" \ python_version="3.10.0" \ qt_version="5.15.2" -# Set build time arugments +# Set build time arguments ARG CURA_BUILD_ENV_BUILD_TYPE=Release ARG CURA_BUILD_ENV_PATH=/srv/cura-build-environment ARG CURA_BUILD_ENV_WORK_DIR=/tmp/cura-build-environment From cf9b02d2837b7e550847feccea81e4350521e12a Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 22 Feb 2022 11:06:55 +0100 Subject: [PATCH 017/213] Fix mistyped cmake variable definition. That typo caused a lot of head-scratching. Sorry! par of CURA-7924 --- projects/savitar.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 70d49de0..8771cc2a 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -1,13 +1,13 @@ set(savitar_cmake_command ${CMAKE_COMMAND}) set(extra_cmake_args "") -set(SAVITAR_pyd_copydir "") +set(SAVITAR_pyd_copy_dir "") if(BUILD_OS_WINDOWS) set(extra_cmake_args -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs -DMSVC_STATIC_RUNTIME=OFF ) - set(SAVITAR_pyd_copydir "lib.win-amd64-3.10") + set(SAVITAR_pyd_copy_dir "lib.win-amd64-3.10") else() if(BUILD_OS_OSX) if(CMAKE_OSX_DEPLOYMENT_TARGET) @@ -20,9 +20,9 @@ else() -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} ) endif() - set(SAVITAR_pyd_copydir "lib.osx-3.10") + set(SAVITAR_pyd_copy_dir "lib.osx-3.10") else() - set(SAVITAR_pyd_copydir "lib.linux-x86_64-3.10") + set(SAVITAR_pyd_copy_dir "lib.linux-x86_64-3.10") endif() endif() From f05c4b796b66fdd6ba656e6ec5079eb8134fbe8c Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 22 Feb 2022 17:52:10 +0100 Subject: [PATCH 018/213] Log which file (pyd) is copied, if any. part of CURA-7924 --- projects/arcus.cmake | 2 +- projects/pynest2d.cmake | 2 +- projects/savitar.cmake | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 1caf8457..487900fc 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -53,7 +53,7 @@ ExternalProject_Add(Arcus BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build/${ARCUS_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || echo "ignore error" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build/${ARCUS_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" && dir "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build/${ARCUS_pyd_copy_dir}" ) SetProjectDependencies(TARGET Arcus DEPENDS Python Protobuf) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index bcb5da26..6bd51e20 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -42,7 +42,7 @@ ExternalProject_Add(pynest2d BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || echo "ignore error" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" && dir "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" ) # TODO: Ignoring the first error (in the 1st) build command is hacky, but functions, # since any errors that are of a more permanent nature would be picked up by the 2nd identical one. diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 8771cc2a..e3d1cbc4 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -41,7 +41,7 @@ ExternalProject_Add(Savitar BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || echo "ignore error" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" && dir "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" ) SetProjectDependencies(TARGET Savitar DEPENDS Python) From 1c17dcff9e5418d10774c2fe7ec343ccb2ec3eda Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Tue, 22 Feb 2022 21:35:03 +0100 Subject: [PATCH 019/213] Correcting the pyd directory name on macOS for pynest2d --- projects/pynest2d.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index 6bd51e20..4a5c4cff 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -20,7 +20,7 @@ else() -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} ) endif() - set(PYNEST_pyd_copy_dir "lib.osx-3.10") + set(PYNEST_pyd_copy_dir "lib.macosx-10.14-x86_64-3.10") else() set(PYNEST_pyd_copy_dir "lib.linux-x86_64-3.10") endif() From ded5f65beb175913ba878f2c0e5d1ac6e3232395 Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Tue, 22 Feb 2022 21:36:23 +0100 Subject: [PATCH 020/213] Correcting the pyd directory name on macOS for Savitar --- projects/savitar.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/savitar.cmake b/projects/savitar.cmake index e3d1cbc4..97df0883 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -20,7 +20,7 @@ else() -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} ) endif() - set(SAVITAR_pyd_copy_dir "lib.osx-3.10") + set(SAVITAR_pyd_copy_dir "lib.macosx-10.14-x86_64-3.10") else() set(SAVITAR_pyd_copy_dir "lib.linux-x86_64-3.10") endif() @@ -36,7 +36,7 @@ ExternalProject_Add(Savitar -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} -DCMAKE_CXX_STANDARD=17 -DBUILD_STATIC=OFF - -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/Lib/site-packages + -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/lib/site-packages ${extra_cmake_args} BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} From 2acda38dabc415daf6138a926b8574ba2a8fe1f3 Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Tue, 22 Feb 2022 21:37:20 +0100 Subject: [PATCH 021/213] Correcting the pyd directory name on macOS for Arcus --- projects/arcus.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 487900fc..87cd1fb8 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -30,7 +30,7 @@ else() -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} ) endif() - set(ARCUS_pyd_copy_dir "lib.osx-3.10") + set(ARCUS_pyd_copy_dir "lib.macosx-10.14-x86_64-3.10") else() set(ARCUS_pyd_copy_dir "lib.linux-x86_64-3.10") endif() From ef3c09f1c6f5aa4e4950cf0f58ae9940e7fdb671 Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Tue, 22 Feb 2022 21:38:29 +0100 Subject: [PATCH 022/213] Correcting typo --- projects/arcus.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 87cd1fb8..b6e9ba08 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -48,7 +48,7 @@ ExternalProject_Add(Arcus -DBUILD_STATIC=OFF -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=OFF - -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/Lib/site-packages/ + -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/lib/site-packages/ ${extra_cmake_args} BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} From 2b93fe3e3e1c096019508367b5e01d17820e5829 Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Tue, 22 Feb 2022 21:39:02 +0100 Subject: [PATCH 023/213] Correcting typo --- projects/pynest2d.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index 4a5c4cff..fb24b0e8 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -35,7 +35,7 @@ ExternalProject_Add(pynest2d -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} -DBUILD_STATIC=OFF - -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/Lib/site-packages + -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/lib/site-packages -DPYNEST2D_EXTRA_INCLUDES=${CMAKE_INSTALL_PREFIX}/include -DPYNEST2D_EXTRA_LIBS=${CMAKE_INSTALL_PREFIX}/bin ${extra_cmake_args} From 27a16df5c32c64375655189c3097bea8aa0cf56a Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 22 Feb 2022 18:20:47 +0100 Subject: [PATCH 024/213] Which directory is here, if any? --- projects/arcus.cmake | 2 +- projects/pynest2d.cmake | 2 +- projects/savitar.cmake | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index b6e9ba08..c1cc552a 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -53,7 +53,7 @@ ExternalProject_Add(Arcus BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build/${ARCUS_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" && dir "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build/${ARCUS_pyd_copy_dir}" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build/${ARCUS_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build" ) SetProjectDependencies(TARGET Arcus DEPENDS Python Protobuf) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index fb24b0e8..4166d19b 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -42,7 +42,7 @@ ExternalProject_Add(pynest2d BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" && dir "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build" ) # TODO: Ignoring the first error (in the 1st) build command is hacky, but functions, # since any errors that are of a more permanent nature would be picked up by the 2nd identical one. diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 97df0883..af55f209 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -41,7 +41,7 @@ ExternalProject_Add(Savitar BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" && dir "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build" ) SetProjectDependencies(TARGET Savitar DEPENDS Python) From 7668604db697ece9f90ab7c849b39808f1426fda Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 22 Feb 2022 18:51:22 +0100 Subject: [PATCH 025/213] Just why? --- projects/arcus.cmake | 2 +- projects/pynest2d.cmake | 2 +- projects/savitar.cmake | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index c1cc552a..5ba3462a 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -53,7 +53,7 @@ ExternalProject_Add(Arcus BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build/${ARCUS_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build/${ARCUS_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "/temp/cura-build-environment/Arcus-prefix/src/Arcus-build/build/Arcus/build" ) SetProjectDependencies(TARGET Arcus DEPENDS Python Protobuf) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index 4166d19b..ccd1363c 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -42,7 +42,7 @@ ExternalProject_Add(pynest2d BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "/temp/cura-build-environment/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build" ) # TODO: Ignoring the first error (in the 1st) build command is hacky, but functions, # since any errors that are of a more permanent nature would be picked up by the 2nd identical one. diff --git a/projects/savitar.cmake b/projects/savitar.cmake index af55f209..6bc300f8 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -41,7 +41,7 @@ ExternalProject_Add(Savitar BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "/temp/cura-build-environment/Savitar-prefix/src/Savitar-build/build/Savitar/build" ) SetProjectDependencies(TARGET Savitar DEPENDS Python) From a3521e2572a26339951cab43932785fec619d5fd Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 22 Feb 2022 19:35:04 +0100 Subject: [PATCH 026/213] Maybe it just works now. --- projects/arcus.cmake | 2 +- projects/pynest2d.cmake | 2 +- projects/savitar.cmake | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 5ba3462a..d522bb12 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -53,7 +53,7 @@ ExternalProject_Add(Arcus BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build/${ARCUS_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "/temp/cura-build-environment/Arcus-prefix/src/Arcus-build/build/Arcus/build" + #COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build/${ARCUS_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "/temp/cura-build-environment/Arcus-prefix/src/Arcus-build/build/Arcus/build" ) SetProjectDependencies(TARGET Arcus DEPENDS Python Protobuf) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index ccd1363c..c23d64d3 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -42,7 +42,7 @@ ExternalProject_Add(pynest2d BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "/temp/cura-build-environment/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build" + #COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "/temp/cura-build-environment/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build" ) # TODO: Ignoring the first error (in the 1st) build command is hacky, but functions, # since any errors that are of a more permanent nature would be picked up by the 2nd identical one. diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 6bc300f8..232e81cc 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -41,7 +41,7 @@ ExternalProject_Add(Savitar BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "/temp/cura-build-environment/Savitar-prefix/src/Savitar-build/build/Savitar/build" + #COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "/temp/cura-build-environment/Savitar-prefix/src/Savitar-build/build/Savitar/build" ) SetProjectDependencies(TARGET Savitar DEPENDS Python) From 9ea6a243cf7737d27d5e8be1f9be0926572e871a Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 23 Feb 2022 14:35:24 +0100 Subject: [PATCH 027/213] Sip-build as command may be nescesary after all. part of CURA-7924 --- projects/arcus.cmake | 8 +++++--- projects/pynest2d.cmake | 4 +++- projects/savitar.cmake | 8 +++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index d522bb12..d0ca1504 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -51,9 +51,11 @@ ExternalProject_Add(Arcus -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/lib/site-packages/ ${extra_cmake_args} BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" - COMMAND ${CMAKE_MAKE_PROGRAM} - INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - #COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/build/Arcus/build/${ARCUS_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "/temp/cura-build-environment/Arcus-prefix/src/Arcus-build/build/Arcus/build" + COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" + COMMAND "${CMAKE_INSTALL_PREFIX}/Scripts/sip-build" || echo "ignore error" + INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" + COMMAND "${CMAKE_INSTALL_PREFIX}/Scripts/sip-install" || echo "ignore error" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/Arcus/Arcus/build/${ARCUS_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" ) SetProjectDependencies(TARGET Arcus DEPENDS Python Protobuf) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index c23d64d3..c5a9128e 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -41,8 +41,10 @@ ExternalProject_Add(pynest2d ${extra_cmake_args} BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" + COMMAND "${CMAKE_INSTALL_PREFIX}/Scripts/sip-build" || echo "ignore error" INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" - #COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "/temp/cura-build-environment/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build" + COMMAND "${CMAKE_INSTALL_PREFIX}/Scripts/sip-install" || echo "ignore error" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" ) # TODO: Ignoring the first error (in the 1st) build command is hacky, but functions, # since any errors that are of a more permanent nature would be picked up by the 2nd identical one. diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 232e81cc..58b93e69 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -39,9 +39,11 @@ ExternalProject_Add(Savitar -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/lib/site-packages ${extra_cmake_args} BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" - COMMAND ${CMAKE_MAKE_PROGRAM} - INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install - #COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" || dir "/temp/cura-build-environment/Savitar-prefix/src/Savitar-build/build/Savitar/build" + COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" + COMMAND "${CMAKE_INSTALL_PREFIX}/Scripts/sip-build" || echo "ignore error" + INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" + COMMAND "${CMAKE_INSTALL_PREFIX}/Scripts/sip-install" || echo "ignore error" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" ) SetProjectDependencies(TARGET Savitar DEPENDS Python) From d800d828d7195ea1ea6b84372f6631ddc1085fd5 Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Fri, 25 Feb 2022 16:12:49 +0100 Subject: [PATCH 028/213] Remove the pyd build and the ignore errors --- projects/arcus.cmake | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index d0ca1504..4f7f76f2 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -17,23 +17,16 @@ if(BUILD_OS_WINDOWS) -DCMAKE_STATIC_LINKER_FLAGS=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 -DCMAKE_STATIC_LINKER_FLAGS_RELEASE=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 ) - set(ARCUS_pyd_copy_dir "lib.win-amd64-3.10") + else() - if(BUILD_OS_OSX) - if(CMAKE_OSX_DEPLOYMENT_TARGET) - list(APPEND extra_cmake_args - -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} - ) - endif() - if(CMAKE_OSX_SYSROOT) - list(APPEND extra_cmake_args - -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} - ) - endif() - set(ARCUS_pyd_copy_dir "lib.macosx-10.14-x86_64-3.10") - else() - set(ARCUS_pyd_copy_dir "lib.linux-x86_64-3.10") + if(BUILD_OS_OSX) + if(CMAKE_OSX_DEPLOYMENT_TARGET) + list(APPEND extra_cmake_args -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}) + endif() + if(CMAKE_OSX_SYSROOT) + list(APPEND extra_cmake_args -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT}) endif() + endif() endif() ExternalProject_Add(Arcus @@ -48,14 +41,10 @@ ExternalProject_Add(Arcus -DBUILD_STATIC=OFF -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=OFF - -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/lib/site-packages/ + -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/lib/site-packages/ ${extra_cmake_args} - BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" - COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" - COMMAND "${CMAKE_INSTALL_PREFIX}/Scripts/sip-build" || echo "ignore error" - INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" - COMMAND "${CMAKE_INSTALL_PREFIX}/Scripts/sip-install" || echo "ignore error" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Arcus-prefix/src/Arcus-build/Arcus/Arcus/build/${ARCUS_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" + BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} + INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install ) SetProjectDependencies(TARGET Arcus DEPENDS Python Protobuf) From 6aeb53f205aeda8e01bfea9c82ee10254c8d3829 Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Fri, 25 Feb 2022 16:19:05 +0100 Subject: [PATCH 029/213] Remove the pyd directory and the ignore errors --- projects/pynest2d.cmake | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index c5a9128e..e1cf3647 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -4,10 +4,8 @@ set(pylib_cmake_command ${CMAKE_COMMAND}) set(extra_cmake_args "") -set(PYNEST_pyd_copy_dir "") if(BUILD_OS_WINDOWS) set(extra_cmake_args -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX}) - set(PYNEST_pyd_copy_dir "lib.win-amd64-3.10") else() if(BUILD_OS_OSX) if(CMAKE_OSX_DEPLOYMENT_TARGET) @@ -20,9 +18,6 @@ else() -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} ) endif() - set(PYNEST_pyd_copy_dir "lib.macosx-10.14-x86_64-3.10") - else() - set(PYNEST_pyd_copy_dir "lib.linux-x86_64-3.10") endif() endif() @@ -35,20 +30,12 @@ ExternalProject_Add(pynest2d -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} -DBUILD_STATIC=OFF - -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/lib/site-packages - -DPYNEST2D_EXTRA_INCLUDES=${CMAKE_INSTALL_PREFIX}/include - -DPYNEST2D_EXTRA_LIBS=${CMAKE_INSTALL_PREFIX}/bin + -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/lib/site-packages + -DPYNEST2D_EXTRA_INCLUDES=${CMAKE_INSTALL_PREFIX}/include + -DPYNEST2D_EXTRA_LIBS=${CMAKE_INSTALL_PREFIX}/bin ${extra_cmake_args} - BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" - COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" - COMMAND "${CMAKE_INSTALL_PREFIX}/Scripts/sip-build" || echo "ignore error" - INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" - COMMAND "${CMAKE_INSTALL_PREFIX}/Scripts/sip-install" || echo "ignore error" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/pynest2d-prefix/src/pynest2d-build/build/pynest2d/build/${PYNEST_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" + BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" + INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install ) -# TODO: Ignoring the first error (in the 1st) build command is hacky, but functions, -# since any errors that are of a more permanent nature would be picked up by the 2nd identical one. -# ... ignoring the ones _after_ that is just bad. -# But it will make the _actual_ file we need, so do it like that for now. SetProjectDependencies(TARGET pynest2d DEPENDS Python libnest2d) From 61e6d11d031a124647c8ac35845b0f824ccd3aa9 Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Fri, 25 Feb 2022 16:21:11 +0100 Subject: [PATCH 030/213] Remove the pyd directory and the ignore errors --- projects/savitar.cmake | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 58b93e69..9a1810ff 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -1,13 +1,11 @@ set(savitar_cmake_command ${CMAKE_COMMAND}) set(extra_cmake_args "") -set(SAVITAR_pyd_copy_dir "") if(BUILD_OS_WINDOWS) set(extra_cmake_args -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs -DMSVC_STATIC_RUNTIME=OFF ) - set(SAVITAR_pyd_copy_dir "lib.win-amd64-3.10") else() if(BUILD_OS_OSX) if(CMAKE_OSX_DEPLOYMENT_TARGET) @@ -20,9 +18,6 @@ else() -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} ) endif() - set(SAVITAR_pyd_copy_dir "lib.macosx-10.14-x86_64-3.10") - else() - set(SAVITAR_pyd_copy_dir "lib.linux-x86_64-3.10") endif() endif() @@ -36,14 +31,10 @@ ExternalProject_Add(Savitar -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} -DCMAKE_CXX_STANDARD=17 -DBUILD_STATIC=OFF - -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/lib/site-packages + -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/lib/site-packages ${extra_cmake_args} - BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" - COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" - COMMAND "${CMAKE_INSTALL_PREFIX}/Scripts/sip-build" || echo "ignore error" - INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" - COMMAND "${CMAKE_INSTALL_PREFIX}/Scripts/sip-install" || echo "ignore error" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Savitar-prefix/src/Savitar-build/build/Savitar/build/${SAVITAR_pyd_copy_dir}" "${CMAKE_INSTALL_PREFIX}/lib/site-packages/" + BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} + INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" ) SetProjectDependencies(TARGET Savitar DEPENDS Python) From 1596c9e8a1573e96b806cf7951721e81cf5e56ef Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Fri, 25 Feb 2022 16:23:11 +0100 Subject: [PATCH 031/213] Use the latest branches --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 39729b8c..6f956be6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,13 +6,13 @@ project(cura-build-environment) cmake_minimum_required(VERSION 3.12) if(NOT CURA_ARCUS_BRANCH_OR_TAG) - set(CURA_ARCUS_BRANCH_OR_TAG "CURA-7924_update_to_sip6") + set(CURA_ARCUS_BRANCH_OR_TAG "CURA-7924_sip_cmake_build") endif() if(NOT CURA_SAVITAR_BRANCH_OR_TAG) - set(CURA_SAVITAR_BRANCH_OR_TAG "CURA-7924_update_to_sip6") + set(CURA_SAVITAR_BRANCH_OR_TAG "CURA-7924_sip_cmake_build") endif() if (NOT CURA_PYNEST2D_BRANCH_OR_TAG) - set(CURA_PYNEST2D_BRANCH_OR_TAG "CURA-7924_update_to_sip6") + set(CURA_PYNEST2D_BRANCH_OR_TAG "CURA-7924_sip_cmake_build") endif() # TODO: Revert this to the main branch for the top to when committing! # TODO: Also, don't forget these when we switch to 'main' -> perhaps better to take the _current_ branch or tag even? From c411225eb43285d3d668edeaf0d705cb0efd0171 Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Fri, 25 Feb 2022 17:25:28 +0100 Subject: [PATCH 032/213] Adjust the post build commands for pyArcus --- CMakeLists.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6f956be6..dab4338e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,12 +69,13 @@ if(BUILD_OS_LINUX) endif() # Some extra post build additions are needed on macOS, as the eventual Cura build will fail, because otool -# throws an error while copying pynest2d.so to the Ultimaker Cura.app bundle. +# throws an error while copying pyArcus.so to the Ultimaker Cura.app bundle. if(BUILD_OS_OSX) add_custom_command( TARGET projects POST_BUILD - COMMAND /Library/Developer/CommandLineTools/usr/bin/install_name_tool -change @rpath/libnlopt.0.dylib "${CMAKE_INSTALL_PREFIX}/lib/libnlopt.0.dylib" "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/pynest2d.so" - COMMENT "Changing the RPATH of pynest2d" + COMMAND /Library/Developer/CommandLineTools/usr/bin/install_name_tool -change @rpath/libprotobuf.3.15.7.0.dylib "${CMAKE_INSTALL_PREFIX}/lib/libprotobuf.3.15.7.0.dylib" "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/pyArcus.so" + COMMAND /Library/Developer/CommandLineTools/usr/bin/install_name_tool -change @rpath/libArcus.3.dylib "${CMAKE_INSTALL_PREFIX}/lib/libArcus.3.dylib" "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/pyArcus.so + COMMENT "Changing the RPATH of pyArcus" ) endif() From 244aafc21ed541ecfdb3a386ee8e5d71db6e51bf Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Fri, 25 Feb 2022 17:27:44 +0100 Subject: [PATCH 033/213] Remove variables that won't be used by the project --- projects/pynest2d.cmake | 3 --- 1 file changed, 3 deletions(-) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index e1cf3647..707d9cda 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -30,9 +30,6 @@ ExternalProject_Add(pynest2d -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} -DBUILD_STATIC=OFF - -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/lib/site-packages - -DPYNEST2D_EXTRA_INCLUDES=${CMAKE_INSTALL_PREFIX}/include - -DPYNEST2D_EXTRA_LIBS=${CMAKE_INSTALL_PREFIX}/bin ${extra_cmake_args} BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install From fb8174981f38eaa3c68ab2922a6b29dc7c0f5c2d Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Fri, 25 Feb 2022 17:28:33 +0100 Subject: [PATCH 034/213] Remove variable that won't be used by the project --- projects/arcus.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 4f7f76f2..d9e2588f 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -41,7 +41,6 @@ ExternalProject_Add(Arcus -DBUILD_STATIC=OFF -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=OFF - -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/lib/site-packages/ ${extra_cmake_args} BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install From 4f31e9a42dbbf5ce904b771fe59448e213e02089 Mon Sep 17 00:00:00 2001 From: Evangelos Trantos Date: Fri, 25 Feb 2022 17:29:17 +0100 Subject: [PATCH 035/213] Remove variable that won't be used by the project --- projects/savitar.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 9a1810ff..82537d1c 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -31,7 +31,6 @@ ExternalProject_Add(Savitar -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} -DCMAKE_CXX_STANDARD=17 -DBUILD_STATIC=OFF - -DPY_DEPEND_BIN_INSTALL_DIR=${CMAKE_INSTALL_PREFIX}/lib/site-packages ${extra_cmake_args} BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" From 31d83b0b92bc65d0460b1e2a4f9cf4bc074efaa8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 28 Feb 2022 10:50:52 +0100 Subject: [PATCH 036/213] Fix missing string termination quote Apparently this wasn't tested yet? This was broken like 4 commits ago though. Contributes to issue CURA-7924. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dab4338e..1bdabdc3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,7 +74,7 @@ if(BUILD_OS_OSX) add_custom_command( TARGET projects POST_BUILD COMMAND /Library/Developer/CommandLineTools/usr/bin/install_name_tool -change @rpath/libprotobuf.3.15.7.0.dylib "${CMAKE_INSTALL_PREFIX}/lib/libprotobuf.3.15.7.0.dylib" "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/pyArcus.so" - COMMAND /Library/Developer/CommandLineTools/usr/bin/install_name_tool -change @rpath/libArcus.3.dylib "${CMAKE_INSTALL_PREFIX}/lib/libArcus.3.dylib" "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/pyArcus.so + COMMAND /Library/Developer/CommandLineTools/usr/bin/install_name_tool -change @rpath/libArcus.3.dylib "${CMAKE_INSTALL_PREFIX}/lib/libArcus.3.dylib" "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/pyArcus.so" COMMENT "Changing the RPATH of pyArcus" ) endif() From 3b5713d0ccb00efca4d7e78f60e6f759293d4a8e Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 1 Mar 2022 13:18:26 +0100 Subject: [PATCH 037/213] Set rpath for pynest2d pointing towards nlopt Contributes to CURA-8640 --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1bdabdc3..9b354b5a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,6 +73,7 @@ endif() if(BUILD_OS_OSX) add_custom_command( TARGET projects POST_BUILD + COMMAND /Library/Developer/CommandLineTools/usr/bin/install_name_tool -change @rpath/libnlopt.0.dylib "${CMAKE_INSTALL_PREFIX}/lib/libnlopt.0.dylib" "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/pynest2d.so" COMMAND /Library/Developer/CommandLineTools/usr/bin/install_name_tool -change @rpath/libprotobuf.3.15.7.0.dylib "${CMAKE_INSTALL_PREFIX}/lib/libprotobuf.3.15.7.0.dylib" "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/pyArcus.so" COMMAND /Library/Developer/CommandLineTools/usr/bin/install_name_tool -change @rpath/libArcus.3.dylib "${CMAKE_INSTALL_PREFIX}/lib/libArcus.3.dylib" "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/pyArcus.so" COMMENT "Changing the RPATH of pyArcus" From 6a00e0419f72c93d056bfef4ea52a8c9a90629cf Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 1 Mar 2022 18:06:31 +0100 Subject: [PATCH 038/213] Delete certain Qt plug-ins after downloading them These cause the builds to fail if they are present. Let's hope we don't need them. This hasn't yet been properly tested at this point since the build segfaults on something else. The NativeStyle hasn't been tested yet whether it truly fails the build. It seems to have the same problem though, of having a binding there but not in the Qt implementation. Contributes to issue CURA-8640. --- projects/python_packages.cmake | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/projects/python_packages.cmake b/projects/python_packages.cmake index 16284d28..5dd811ae 100644 --- a/projects/python_packages.cmake +++ b/projects/python_packages.cmake @@ -12,3 +12,16 @@ if(BUILD_OS_WINDOWS) WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/lib/site-packages/cx_Freeze ) endif() +if(BUILD_OS_OSX) + # These are plug-ins in Qt where PyQt6-Qt6 does provide the bindings, but doesn't provide the binaries they need. + # Normally this isn't a problem, but on MacOS the packaging checks these dependencies and then fails to package them. + # Excluding them from the packager makes no difference. Deleting the files outright does. + add_custom_command( + TARGET PythonPackagesGeneral POST_BUILD + COMMAND rm -r "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/PyQt6/Qt6/qml/QtQml/XmlListModel" + COMMAND rm -r "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/PyQt6/Qt6/qml/QtQuick/Scene2D" + COMMAND rm -r "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/PyQt6/Qt6/qml/QtQuick/Scene3D" + COMMAND rm -r "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/PyQt6/Qt6/qml/QtQuick/LocalStorage" + COMMAND rm -r "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/PyQt6/Qt6/qml/QtQuick/NativeStyle" + ) +endif() From c5409aaf0b88792b32806964f554eac381ef9c2f Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 1 Mar 2022 18:39:39 +0100 Subject: [PATCH 039/213] Don't set the final rpaths in the build-env These should probably be set in cura-build Contribute to CURA-8640 --- CMakeLists.txt | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b354b5a..470a9dc7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,18 +68,6 @@ if(BUILD_OS_LINUX) ) endif() -# Some extra post build additions are needed on macOS, as the eventual Cura build will fail, because otool -# throws an error while copying pyArcus.so to the Ultimaker Cura.app bundle. -if(BUILD_OS_OSX) - add_custom_command( - TARGET projects POST_BUILD - COMMAND /Library/Developer/CommandLineTools/usr/bin/install_name_tool -change @rpath/libnlopt.0.dylib "${CMAKE_INSTALL_PREFIX}/lib/libnlopt.0.dylib" "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/pynest2d.so" - COMMAND /Library/Developer/CommandLineTools/usr/bin/install_name_tool -change @rpath/libprotobuf.3.15.7.0.dylib "${CMAKE_INSTALL_PREFIX}/lib/libprotobuf.3.15.7.0.dylib" "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/pyArcus.so" - COMMAND /Library/Developer/CommandLineTools/usr/bin/install_name_tool -change @rpath/libArcus.3.dylib "${CMAKE_INSTALL_PREFIX}/lib/libArcus.3.dylib" "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/pyArcus.so" - COMMENT "Changing the RPATH of pyArcus" - ) -endif() - file(GLOB _projects projects/*.cmake) foreach(_project ${_projects}) include(${_project}) From cea9e32ec9e7230adcce005676b75c93af755f63 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 8 Mar 2022 14:43:44 +0100 Subject: [PATCH 040/213] Update cx-Freeze to 6.10 Maybe it solves the issue on Mac??? Contribute to CURA-8640 --- projects/requirements.txt | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/projects/requirements.txt b/projects/requirements.txt index 9bf1fceb..e537ce5c 100644 --- a/projects/requirements.txt +++ b/projects/requirements.txt @@ -3,10 +3,18 @@ # make sure you use the verbose flag and personally inspect the hosts that were used when generating # When updating a major Python version these need to be updates as well -cx-Freeze==6.9 \ - --hash=sha256:776d4fb68a4831691acbd3c374362b9b48ce2e568514a73c3d4cb14d5dcf1470 \ - --hash=sha256:243f36d35a034a409cd6247d8cb5d1fbfd7374e3e668e813d0811f64d6bd5ed3 \ - --hash=sha256:673aa3199af2ef87fc03a43a30e5d78b27ced2cedde925da89c55b5657da267b +cx-Freeze==6.10 \ + --hash=sha256:08a537681dcd1bcde9742584e91d86ef001fe798386f2834a904652d5b2a468a \ + --hash=sha256:1438db6d59be86e8483ea2bf2ff2f81374ca63d8a1d3a84706173cc1b98dd46f \ + --hash=sha256:2be07ffce2dba23618cf736476df6f9837d9887c85f4f92fb3fbfcd090de041a \ + --hash=sha256:59b4cb77f5c82613efbec03815b952a6fe73d4a1805bb370d57a8a1130a181ca \ + --hash=sha256:770e911f70b48e4f309a47e02aaa7e1f6dc659fd1c486f3eebe5c9e9fe70aec2 \ + --hash=sha256:8d936a872c124c2e2a40da2e898e4fa0d225a165ab606217f75136c14ee8e673 \ + --hash=sha256:9c4b491affd10065bcdd20dc0ab5239f787affe6d61857811a937ed266faa213 \ + --hash=sha256:a4d2cb00eec6bc72a419370b5b0b5d0f3adf4d8417eb89228981d470cf4c6af6 \ + --hash=sha256:e5b71bf57b9881ac142fbebeae2c8b0d3294b56f6e48ab64032321e3b1a2ba27 \ + --hash=sha256:ec752333fa2e40347902730662785da0ec4576cec976552784a6f60a7a07b45d \ + --hash=sha256:f03928cbcf8282e688dc1f9fa421044c24f5b7492a7b0fe7f45d5cc6f24c1ebf appdirs==1.4.3 \ --hash=sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92 \ --hash=sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e From 6fcf45b413b91817f5021618d0b7247377fadb11 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 8 Mar 2022 14:50:05 +0100 Subject: [PATCH 041/213] Try using pyinstaller to create the installer Contribute to CURA-8640 --- projects/requirements.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/projects/requirements.txt b/projects/requirements.txt index e537ce5c..71c94310 100644 --- a/projects/requirements.txt +++ b/projects/requirements.txt @@ -3,6 +3,18 @@ # make sure you use the verbose flag and personally inspect the hosts that were used when generating # When updating a major Python version these need to be updates as well +pyinstaller==4.10 \ + --hash=sha256:05c21117b84199272ebd355b556af4714f6e79245e1c435d6f16653786d7d17e \ + --hash=sha256:0dcaf6557cdb2da763c46e06e95a94a7634ab03fb09d91bc77988b01ee05c907 \ + --hash=sha256:15557cd1a79d182967f0a5040750e6902e13ebd6cab41e3ed84d7b28a306357b \ + --hash=sha256:581620bdcd32f01e89b13231256b807bb090e7eadf40c81c864ec402afa4758a \ + --hash=sha256:70c71e827f4b34602cbc7a0947a067b662c1cbdc4db51832e13b97cca3c54dd7 \ + --hash=sha256:714c4dcc319a41416744d1e30c6317405dfaed80d2adc45f8bfa70dc7367e664 \ + --hash=sha256:7749c868d2e2dc84df7d6f65437226183c8a366f3a99bb2737785625c3a3cca1 \ + --hash=sha256:7d94518ba1f8e9a8577345312276891ad7d6cd9785e453e9951b35647e2c7078 \ + --hash=sha256:cfed0b3a43e73550a43a094610328109564710b9514afa093ef7199d072cae87 \ + --hash=sha256:d4f79c0a774451f12baca4e476376418f011fa3039dde8fd172ea2aa8ff67bad \ + --hash=sha256:f2166ff2cd95eefb0d377ae8d1071f186fa25edd410ede65b376162d5ec41909 cx-Freeze==6.10 \ --hash=sha256:08a537681dcd1bcde9742584e91d86ef001fe798386f2834a904652d5b2a468a \ --hash=sha256:1438db6d59be86e8483ea2bf2ff2f81374ca63d8a1d3a84706173cc1b98dd46f \ From 02df695691ec41a76fbdb3487a2d3b82d585e419 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 8 Mar 2022 16:40:55 +0100 Subject: [PATCH 042/213] Build Python static on Macos Contribute to CURA-8640 --- projects/python.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/python.cmake b/projects/python.cmake index 82491b8e..0f4b5e69 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -1,4 +1,4 @@ -set(python_configure_command ./configure --prefix=${CMAKE_INSTALL_PREFIX} --enable-shared --enable-ipv6 --without-pymalloc ) +set(python_configure_command ./configure --prefix=${CMAKE_INSTALL_PREFIX} --enable-ipv6 --without-pymalloc ) set(python_build_command make -j ${N_PROC}) set(python_install_command make install) @@ -21,7 +21,7 @@ endif() if(BUILD_OS_LINUX) # Set a proper RPATH so everything depending on Python does not need LD_LIBRARY_PATH - set(python_configure_command LDFLAGS=-Wl,-rpath=${CMAKE_INSTALL_PREFIX}/lib ${python_configure_command} --with-openssl=${CMAKE_INSTALL_PREFIX}) + set(python_configure_command LDFLAGS=-Wl,-rpath=${CMAKE_INSTALL_PREFIX}/lib ${python_configure_command} --with-openssl=${CMAKE_INSTALL_PREFIX} --enable-shared ) endif() ExternalProject_Add(Python From 8366d587b86beeaeeb4b576a7f6d026d27509558 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 9 Mar 2022 08:47:25 +0100 Subject: [PATCH 043/213] Added dependencies of pyinstaller Contribute to CURA-8640 --- projects/requirements.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/projects/requirements.txt b/projects/requirements.txt index 71c94310..9c50a14f 100644 --- a/projects/requirements.txt +++ b/projects/requirements.txt @@ -3,6 +3,7 @@ # make sure you use the verbose flag and personally inspect the hosts that were used when generating # When updating a major Python version these need to be updates as well +# pyinstaller pyinstaller==4.10 \ --hash=sha256:05c21117b84199272ebd355b556af4714f6e79245e1c435d6f16653786d7d17e \ --hash=sha256:0dcaf6557cdb2da763c46e06e95a94a7634ab03fb09d91bc77988b01ee05c907 \ @@ -15,6 +16,20 @@ pyinstaller==4.10 \ --hash=sha256:cfed0b3a43e73550a43a094610328109564710b9514afa093ef7199d072cae87 \ --hash=sha256:d4f79c0a774451f12baca4e476376418f011fa3039dde8fd172ea2aa8ff67bad \ --hash=sha256:f2166ff2cd95eefb0d377ae8d1071f186fa25edd410ede65b376162d5ec41909 +altgraph==0.17.2 \ + --hash=sha256:743628f2ac6a7c26f5d9223c91ed8ecbba535f506f4b6f558885a8a56a105857 \ + --hash=sha256:ebf2269361b47d97b3b88e696439f6e4cbc607c17c51feb1754f90fb79839158 +pyinstaller-hooks-contrib==2022.2 \ + --hash=sha256:7605e440ccb55904cb2a87d72e83642ef176fb7030c77e52ac4d9679bb3d1537 \ + --hash=sha256:ab1d14fe053016fff7b0c6aea51d980bac6d02114b04063b46ef7dac70c70e1e +pefile==2021.9.3; \ + sys_platform=="win32" \ + --hash=sha256:344a49e40a94e10849f0fe34dddc80f773a12b40675bf2f7be4b8be578bdd94a +macholib==1.15.2; \ + sys_platform=="darwin" \ + --hash=sha256:1542c41da3600509f91c165cb897e7e54c0e74008bd8da5da7ebbee519d593d2 \ + --hash=sha256:885613dd02d3e26dbd2b541eb4cc4ce611b841f827c0958ab98656e478b9e6f6 + cx-Freeze==6.10 \ --hash=sha256:08a537681dcd1bcde9742584e91d86ef001fe798386f2834a904652d5b2a468a \ --hash=sha256:1438db6d59be86e8483ea2bf2ff2f81374ca63d8a1d3a84706173cc1b98dd46f \ From e6c5ec2e91a7da40e204101b0281b3c6fa03cb8e Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 9 Mar 2022 12:01:01 +0100 Subject: [PATCH 044/213] Bumped up Python to 3.10.2 pyinstaller/pyinstaller#6301 Contribute to CURA-8640 --- projects/python.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/python.cmake b/projects/python.cmake index 82491b8e..e2673b17 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -25,8 +25,8 @@ if(BUILD_OS_LINUX) endif() ExternalProject_Add(Python - URL https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tgz - URL_HASH SHA256=c4e0cbad57c90690cb813fb4663ef670b4d0f587d8171e2c42bd4c9245bd2758 + URL https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgz + URL_HASH SHA256=3c0ede893011319f9b0a56b44953a3d52c7abf9657c23fb4bc9ced93b86e9c97 CONFIGURE_COMMAND "${python_configure_command}" BUILD_COMMAND ${python_build_command} INSTALL_COMMAND ${python_install_command} From e4cc4581c72ed4578973062e3fd4bf85fe9a5d35 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 9 Mar 2022 12:27:37 +0100 Subject: [PATCH 045/213] Bumped up type-ast to 1.5.2 1.4.3 wasn't compatible with Python 3.10.2 Contribute to CURA-8640 --- projects/base_requirements.txt | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/projects/base_requirements.txt b/projects/base_requirements.txt index 1ed2da51..1b195350 100644 --- a/projects/base_requirements.txt +++ b/projects/base_requirements.txt @@ -94,12 +94,21 @@ mypy-extensions==0.4.3 \ typing-extensions==3.10.0.2 \ --hash=sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e \ --hash=sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34 -typed-ast==1.4.3 \ - --hash=sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41 \ - --hash=sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39 \ - --hash=sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a \ - --hash=sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40 \ - --hash=sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65 +typed-ast==1.5.2 \ + --hash=sha256:0eb77764ea470f14fcbb89d51bc6bbf5e7623446ac4ed06cbd9ca9495b62e36e \ + --hash=sha256:1098df9a0592dd4c8c0ccfc2e98931278a6c6c53cb3a3e2cf7e9ee3b06153344 \ + --hash=sha256:183b183b7771a508395d2cbffd6db67d6ad52958a5fdc99f450d954003900266 \ + --hash=sha256:18fe320f354d6f9ad3147859b6e16649a0781425268c4dde596093177660e71a \ + --hash=sha256:26a432dc219c6b6f38be20a958cbe1abffcc5492821d7e27f08606ef99e0dffd \ + --hash=sha256:294a6903a4d087db805a7656989f613371915fc45c8cc0ddc5c5a0a8ad9bea4d \ + --hash=sha256:31d8c6b2df19a777bc8826770b872a45a1f30cfefcfd729491baa5237faae837 \ + --hash=sha256:33b4a19ddc9fc551ebabca9765d54d04600c4a50eda13893dadf67ed81d9a098 \ + --hash=sha256:42c47c3b43fe3a39ddf8de1d40dbbfca60ac8530a36c9b198ea5b9efac75c09e \ + --hash=sha256:525a2d4088e70a9f75b08b3f87a51acc9cde640e19cc523c7e41aa355564ae27 \ + --hash=sha256:58ae097a325e9bb7a684572d20eb3e1809802c5c9ec7108e85da1eb6c1a3331b \ + --hash=sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596 \ + --hash=sha256:74cac86cc586db8dfda0ce65d8bcd2bf17b58668dfcc3652762f3ef0e6677e76 \ + --hash=sha256:8c08d6625bb258179b6e512f55ad20f9dfef019bbfbe3095247401e053a3ea30 \ # cryptography is needed before we collect/install PyQt5 cffi==1.14.1 \ From 3ca4096b50821b026a93b7b055690c62c2fbd824 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 9 Mar 2022 12:59:09 +0100 Subject: [PATCH 046/213] Bumped up mypy to 0.931 Because of version conflict of type-ast to 1.5.2 Contribute to CURA-8640 --- projects/base_requirements.txt | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/projects/base_requirements.txt b/projects/base_requirements.txt index 1b195350..dd71fc69 100644 --- a/projects/base_requirements.txt +++ b/projects/base_requirements.txt @@ -82,12 +82,27 @@ coverage==5.5 \ --hash=sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c # mypy -mypy==0.740 \ - --hash=sha256:3b1a411909c84b2ae9b8283b58b48541654b918e8513c20a400bb946aa9111ae \ - --hash=sha256:48c8bc99380575deb39f5d3400ebb6a8a1cb5cc669bbba4d3bb30f904e0a0e7d \ - --hash=sha256:540c9caa57a22d0d5d3c69047cc9dd0094d49782603eb03069821b41f9e970e9 \ - --hash=sha256:672e418425d957e276c291930a3921b4a6413204f53fe7c37cad7bc57b9a3391 \ - --hash=sha256:f4748697b349f373002656bf32fede706a0e713d67bfdcf04edf39b1f61d46eb +mypy==0.931 \ + --hash=sha256:0038b21890867793581e4cb0d810829f5fd4441aa75796b53033af3aa30430ce \ + --hash=sha256:1171f2e0859cfff2d366da2c7092b06130f232c636a3f7301e3feb8b41f6377d \ + --hash=sha256:1b06268df7eb53a8feea99cbfff77a6e2b205e70bf31743e786678ef87ee8069 \ + --hash=sha256:1b65714dc296a7991000b6ee59a35b3f550e0073411ac9d3202f6516621ba66c \ + --hash=sha256:1bf752559797c897cdd2c65f7b60c2b6969ffe458417b8d947b8340cc9cec08d \ + --hash=sha256:300717a07ad09525401a508ef5d105e6b56646f7942eb92715a1c8d610149714 \ + --hash=sha256:3c5b42d0815e15518b1f0990cff7a705805961613e701db60387e6fb663fe78a \ + --hash=sha256:4365c60266b95a3f216a3047f1d8e3f895da6c7402e9e1ddfab96393122cc58d \ + --hash=sha256:50c7346a46dc76a4ed88f3277d4959de8a2bd0a0fa47fa87a4cde36fe247ac05 \ + --hash=sha256:5b56154f8c09427bae082b32275a21f500b24d93c88d69a5e82f3978018a0266 \ + --hash=sha256:74f7eccbfd436abe9c352ad9fb65872cc0f1f0a868e9d9c44db0893440f0c697 \ + --hash=sha256:7b3f6f557ba4afc7f2ce6d3215d5db279bcf120b3cfd0add20a5d4f4abdae5bc \ + --hash=sha256:8c11003aaeaf7cc2d0f1bc101c1cc9454ec4cc9cb825aef3cafff8a5fdf4c799 \ + --hash=sha256:8ca7f8c4b1584d63c9a0f827c37ba7a47226c19a23a753d52e5b5eddb201afcd \ + --hash=sha256:c89702cac5b302f0c5d33b172d2b55b5df2bede3344a2fbed99ff96bddb2cf00 \ + --hash=sha256:d8f1ff62f7a879c9fe5917b3f9eb93a79b78aad47b533911b853a757223f72e7 \ + --hash=sha256:d9d2b84b2007cea426e327d2483238f040c49405a6bf4074f605f0156c91a47a \ + --hash=sha256:e839191b8da5b4e5d805f940537efcaa13ea5dd98418f06dc585d2891d228cf0 \ + --hash=sha256:f9fe20d0872b26c4bba1c1be02c5340de1019530302cf2dcc85c7f9fc3252ae0 \ + --hash=sha256:ff3bf387c14c805ab1388185dd22d6b210824e164d4bb324b195ff34e322d166 mypy-extensions==0.4.3 \ --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \ --hash=sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8 @@ -109,6 +124,10 @@ typed-ast==1.5.2 \ --hash=sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596 \ --hash=sha256:74cac86cc586db8dfda0ce65d8bcd2bf17b58668dfcc3652762f3ef0e6677e76 \ --hash=sha256:8c08d6625bb258179b6e512f55ad20f9dfef019bbfbe3095247401e053a3ea30 \ +tomli==2.0.1 \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f + # cryptography is needed before we collect/install PyQt5 cffi==1.14.1 \ From 5b42806c2fe0ae5816d5ef31fe5c7931d81b61d5 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 9 Mar 2022 13:30:09 +0100 Subject: [PATCH 047/213] reversed order of mypy requirements Contribute to CURA-8640 --- projects/base_requirements.txt | 49 +++++++++++++++++----------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/projects/base_requirements.txt b/projects/base_requirements.txt index dd71fc69..3247e24a 100644 --- a/projects/base_requirements.txt +++ b/projects/base_requirements.txt @@ -82,27 +82,9 @@ coverage==5.5 \ --hash=sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c # mypy -mypy==0.931 \ - --hash=sha256:0038b21890867793581e4cb0d810829f5fd4441aa75796b53033af3aa30430ce \ - --hash=sha256:1171f2e0859cfff2d366da2c7092b06130f232c636a3f7301e3feb8b41f6377d \ - --hash=sha256:1b06268df7eb53a8feea99cbfff77a6e2b205e70bf31743e786678ef87ee8069 \ - --hash=sha256:1b65714dc296a7991000b6ee59a35b3f550e0073411ac9d3202f6516621ba66c \ - --hash=sha256:1bf752559797c897cdd2c65f7b60c2b6969ffe458417b8d947b8340cc9cec08d \ - --hash=sha256:300717a07ad09525401a508ef5d105e6b56646f7942eb92715a1c8d610149714 \ - --hash=sha256:3c5b42d0815e15518b1f0990cff7a705805961613e701db60387e6fb663fe78a \ - --hash=sha256:4365c60266b95a3f216a3047f1d8e3f895da6c7402e9e1ddfab96393122cc58d \ - --hash=sha256:50c7346a46dc76a4ed88f3277d4959de8a2bd0a0fa47fa87a4cde36fe247ac05 \ - --hash=sha256:5b56154f8c09427bae082b32275a21f500b24d93c88d69a5e82f3978018a0266 \ - --hash=sha256:74f7eccbfd436abe9c352ad9fb65872cc0f1f0a868e9d9c44db0893440f0c697 \ - --hash=sha256:7b3f6f557ba4afc7f2ce6d3215d5db279bcf120b3cfd0add20a5d4f4abdae5bc \ - --hash=sha256:8c11003aaeaf7cc2d0f1bc101c1cc9454ec4cc9cb825aef3cafff8a5fdf4c799 \ - --hash=sha256:8ca7f8c4b1584d63c9a0f827c37ba7a47226c19a23a753d52e5b5eddb201afcd \ - --hash=sha256:c89702cac5b302f0c5d33b172d2b55b5df2bede3344a2fbed99ff96bddb2cf00 \ - --hash=sha256:d8f1ff62f7a879c9fe5917b3f9eb93a79b78aad47b533911b853a757223f72e7 \ - --hash=sha256:d9d2b84b2007cea426e327d2483238f040c49405a6bf4074f605f0156c91a47a \ - --hash=sha256:e839191b8da5b4e5d805f940537efcaa13ea5dd98418f06dc585d2891d228cf0 \ - --hash=sha256:f9fe20d0872b26c4bba1c1be02c5340de1019530302cf2dcc85c7f9fc3252ae0 \ - --hash=sha256:ff3bf387c14c805ab1388185dd22d6b210824e164d4bb324b195ff34e322d166 +tomli==2.0.1 \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f mypy-extensions==0.4.3 \ --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \ --hash=sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8 @@ -124,10 +106,27 @@ typed-ast==1.5.2 \ --hash=sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596 \ --hash=sha256:74cac86cc586db8dfda0ce65d8bcd2bf17b58668dfcc3652762f3ef0e6677e76 \ --hash=sha256:8c08d6625bb258179b6e512f55ad20f9dfef019bbfbe3095247401e053a3ea30 \ -tomli==2.0.1 \ - --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ - --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f - +mypy==0.931 \ + --hash=sha256:0038b21890867793581e4cb0d810829f5fd4441aa75796b53033af3aa30430ce \ + --hash=sha256:1171f2e0859cfff2d366da2c7092b06130f232c636a3f7301e3feb8b41f6377d \ + --hash=sha256:1b06268df7eb53a8feea99cbfff77a6e2b205e70bf31743e786678ef87ee8069 \ + --hash=sha256:1b65714dc296a7991000b6ee59a35b3f550e0073411ac9d3202f6516621ba66c \ + --hash=sha256:1bf752559797c897cdd2c65f7b60c2b6969ffe458417b8d947b8340cc9cec08d \ + --hash=sha256:300717a07ad09525401a508ef5d105e6b56646f7942eb92715a1c8d610149714 \ + --hash=sha256:3c5b42d0815e15518b1f0990cff7a705805961613e701db60387e6fb663fe78a \ + --hash=sha256:4365c60266b95a3f216a3047f1d8e3f895da6c7402e9e1ddfab96393122cc58d \ + --hash=sha256:50c7346a46dc76a4ed88f3277d4959de8a2bd0a0fa47fa87a4cde36fe247ac05 \ + --hash=sha256:5b56154f8c09427bae082b32275a21f500b24d93c88d69a5e82f3978018a0266 \ + --hash=sha256:74f7eccbfd436abe9c352ad9fb65872cc0f1f0a868e9d9c44db0893440f0c697 \ + --hash=sha256:7b3f6f557ba4afc7f2ce6d3215d5db279bcf120b3cfd0add20a5d4f4abdae5bc \ + --hash=sha256:8c11003aaeaf7cc2d0f1bc101c1cc9454ec4cc9cb825aef3cafff8a5fdf4c799 \ + --hash=sha256:8ca7f8c4b1584d63c9a0f827c37ba7a47226c19a23a753d52e5b5eddb201afcd \ + --hash=sha256:c89702cac5b302f0c5d33b172d2b55b5df2bede3344a2fbed99ff96bddb2cf00 \ + --hash=sha256:d8f1ff62f7a879c9fe5917b3f9eb93a79b78aad47b533911b853a757223f72e7 \ + --hash=sha256:d9d2b84b2007cea426e327d2483238f040c49405a6bf4074f605f0156c91a47a \ + --hash=sha256:e839191b8da5b4e5d805f940537efcaa13ea5dd98418f06dc585d2891d228cf0 \ + --hash=sha256:f9fe20d0872b26c4bba1c1be02c5340de1019530302cf2dcc85c7f9fc3252ae0 \ + --hash=sha256:ff3bf387c14c805ab1388185dd22d6b210824e164d4bb324b195ff34e322d166 # cryptography is needed before we collect/install PyQt5 cffi==1.14.1 \ From f924a922dc1d74c775d0d0986f3083415fdedd0c Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 14 Mar 2022 11:06:51 +0100 Subject: [PATCH 048/213] Revert "Build Python static on Macos" This reverts commit 02df695691ec41a76fbdb3487a2d3b82d585e419. --- projects/python.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/python.cmake b/projects/python.cmake index 0f4b5e69..82491b8e 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -1,4 +1,4 @@ -set(python_configure_command ./configure --prefix=${CMAKE_INSTALL_PREFIX} --enable-ipv6 --without-pymalloc ) +set(python_configure_command ./configure --prefix=${CMAKE_INSTALL_PREFIX} --enable-shared --enable-ipv6 --without-pymalloc ) set(python_build_command make -j ${N_PROC}) set(python_install_command make install) @@ -21,7 +21,7 @@ endif() if(BUILD_OS_LINUX) # Set a proper RPATH so everything depending on Python does not need LD_LIBRARY_PATH - set(python_configure_command LDFLAGS=-Wl,-rpath=${CMAKE_INSTALL_PREFIX}/lib ${python_configure_command} --with-openssl=${CMAKE_INSTALL_PREFIX} --enable-shared ) + set(python_configure_command LDFLAGS=-Wl,-rpath=${CMAKE_INSTALL_PREFIX}/lib ${python_configure_command} --with-openssl=${CMAKE_INSTALL_PREFIX}) endif() ExternalProject_Add(Python From 4c34513bd8f6d4c916ff71def5934779f4db583c Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 17 Mar 2022 14:03:22 +0100 Subject: [PATCH 049/213] Remove cx-freeze as a dependency TODO: Still need to double-check if specific cx-freeze deps can also be removed Contribute to CURA-8640 --- projects/requirements.txt | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/projects/requirements.txt b/projects/requirements.txt index 9c50a14f..8c5f473b 100644 --- a/projects/requirements.txt +++ b/projects/requirements.txt @@ -30,18 +30,6 @@ macholib==1.15.2; \ --hash=sha256:1542c41da3600509f91c165cb897e7e54c0e74008bd8da5da7ebbee519d593d2 \ --hash=sha256:885613dd02d3e26dbd2b541eb4cc4ce611b841f827c0958ab98656e478b9e6f6 -cx-Freeze==6.10 \ - --hash=sha256:08a537681dcd1bcde9742584e91d86ef001fe798386f2834a904652d5b2a468a \ - --hash=sha256:1438db6d59be86e8483ea2bf2ff2f81374ca63d8a1d3a84706173cc1b98dd46f \ - --hash=sha256:2be07ffce2dba23618cf736476df6f9837d9887c85f4f92fb3fbfcd090de041a \ - --hash=sha256:59b4cb77f5c82613efbec03815b952a6fe73d4a1805bb370d57a8a1130a181ca \ - --hash=sha256:770e911f70b48e4f309a47e02aaa7e1f6dc659fd1c486f3eebe5c9e9fe70aec2 \ - --hash=sha256:8d936a872c124c2e2a40da2e898e4fa0d225a165ab606217f75136c14ee8e673 \ - --hash=sha256:9c4b491affd10065bcdd20dc0ab5239f787affe6d61857811a937ed266faa213 \ - --hash=sha256:a4d2cb00eec6bc72a419370b5b0b5d0f3adf4d8417eb89228981d470cf4c6af6 \ - --hash=sha256:e5b71bf57b9881ac142fbebeae2c8b0d3294b56f6e48ab64032321e3b1a2ba27 \ - --hash=sha256:ec752333fa2e40347902730662785da0ec4576cec976552784a6f60a7a07b45d \ - --hash=sha256:f03928cbcf8282e688dc1f9fa421044c24f5b7492a7b0fe7f45d5cc6f24c1ebf appdirs==1.4.3 \ --hash=sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92 \ --hash=sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e From 9ff6f96ee4bc9e79d848135c7da5bde4497e5f2b Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 17 Mar 2022 14:08:32 +0100 Subject: [PATCH 050/213] Use uniform Cmake build modules These modules are also used in cura-build Contribute to CURA-8640 --- cmake/GetFromEnvironmentOrCache.cmake | 56 +++++++++++++++++++++++++++ cmake/Python.cmake | 17 ++++++++ 2 files changed, 73 insertions(+) create mode 100644 cmake/GetFromEnvironmentOrCache.cmake create mode 100644 cmake/Python.cmake diff --git a/cmake/GetFromEnvironmentOrCache.cmake b/cmake/GetFromEnvironmentOrCache.cmake new file mode 100644 index 00000000..ec0cbb4c --- /dev/null +++ b/cmake/GetFromEnvironmentOrCache.cmake @@ -0,0 +1,56 @@ +# Copyright 2022 Ultimaker + +function(GetFromEnvironmentOrCache) + set(options BOOL FILEPATH PATH STRING INTERNAL REQUIRED) + set(oneValueArgs NAME DEFAULT DESCRIPTION) + set(multiValueArgs ) + cmake_parse_arguments(VAR "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(NOT VAR_NAME) + message(FATAL_ERROR "NAME is a required keyword") + endif() + + if(NOT ${VAR_NAME}) + if(VAR_BOOL) + set(VAR_CACHE BOOL) + elseif(VAR_FILEPATH) + set(VAR_CACHE FILEPATH) + elseif(VAR_PATH) + set(VAR_CACHE PATH) + elseif(VAR_STRING) + set(VAR_CACHE STRING) + elseif(VAR_INTERNAL) + set(VAR_CACHE INTERNAL) + else() + set(VAR_CACHE STRING) + endif() + + if(DEFINED ENV{${VAR_NAME}) + set(VAR_VALUE $ENV{${VAR_NAME}}) + message(STATUS "Using value of environment variable for ${VAR_NAME}: ${VAR_VALUE}") + elseif(DEFINED VAR_DEFAULT) + set(VAR_VALUE ${VAR_DEFAULT}) + message(STATUS "Using default value for ${VAR_NAME}: ${VAR_VALUE}") + elseif(${VAR_REQUIRED}) + message(SEND_ERROR "Could net set ${VAR_NAME}, either provide commandline arg, environment variable or default value") + else() + set(VAR_VALUE "") + message(STATUS "Using empty default value for ${VAR_NAME}") + endif() + + if(NOT DEFINED VAR_DESCRIPTION) + set(VAR_DESCRIPTION "") + endif() + + if(DEFINED VAR_VALUE) + set(${VAR_NAME} + ${VAR_VALUE} + CACHE + ${VAR_CACHE} + ${VAR_DESCRIPTION} + FORCE) + endif() + else() + message(STATUS "Using CMake provided variable ${VAR_NAME}: ${${VAR_NAME}}") + endif() +endfunction() \ No newline at end of file diff --git a/cmake/Python.cmake b/cmake/Python.cmake new file mode 100644 index 00000000..44359cb5 --- /dev/null +++ b/cmake/Python.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2022 Ultimaker B.V. + +if(NOT Python_FOUND) + GetFromEnvironmentOrCache( + NAME + Python_VERSION + DEFAULT + 3.10 + DESCRIPTION + "Python Version to use" + REQUIRED) + if(APPLE) + set(Python_FIND_FRAMEWORK NEVER) + endif() + find_package(Python ${Python_VERSION} EXACT REQUIRED COMPONENTS Interpreter Development) + message(STATUS "Using Python ${Python_VERSION}") +endif() \ No newline at end of file From 8765f8296ea22aefb1ff1968ef975aab03408f71 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 17 Mar 2022 14:10:32 +0100 Subject: [PATCH 051/213] Ensure setting MACOSX_DEPLOYMENT_TARGET before project call Contribute to CURA-8640 --- CMakeLists.txt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 470a9dc7..f4bda524 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,18 @@ -#Copyright (c) 2020 Ultimaker B.V. -#cura-build-environment is released under the terms of the AGPLv3 or higher. +# Copyright 2022 Ultimaker + +# Setting the MACOSX_DEPLOYMENT_TARGET needs to be done before the first project() call. Setting this value should also +# take care of the CMAKE_OSX_SYSROOT. The variable is ignored on non-Apple systems. +list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) +include(GetFromEnvironmentOrCache) +GetFromEnvironmentOrCache( + NAME + CMAKE_OSX_DEPLOYMENT_TARGET + DESCRIPTION + "Specify the minimum version of the target platform (e.g. macOS or iOS)") project(cura-build-environment) -cmake_minimum_required(VERSION 3.12) +cmake_minimum_required(VERSION 3.18) if(NOT CURA_ARCUS_BRANCH_OR_TAG) set(CURA_ARCUS_BRANCH_OR_TAG "CURA-7924_sip_cmake_build") From d2a6fdce5b91c759dcddbba78d55684b81d17386 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 17 Mar 2022 14:18:38 +0100 Subject: [PATCH 052/213] Cleaned up main CMakeLists.txt Contribute to CURA-8640 --- CMakeLists.txt | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f4bda524..5a3201bd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,26 +14,6 @@ project(cura-build-environment) cmake_minimum_required(VERSION 3.18) -if(NOT CURA_ARCUS_BRANCH_OR_TAG) - set(CURA_ARCUS_BRANCH_OR_TAG "CURA-7924_sip_cmake_build") -endif() -if(NOT CURA_SAVITAR_BRANCH_OR_TAG) - set(CURA_SAVITAR_BRANCH_OR_TAG "CURA-7924_sip_cmake_build") -endif() -if (NOT CURA_PYNEST2D_BRANCH_OR_TAG) - set(CURA_PYNEST2D_BRANCH_OR_TAG "CURA-7924_sip_cmake_build") -endif() -# TODO: Revert this to the main branch for the top to when committing! -# TODO: Also, don't forget these when we switch to 'main' -> perhaps better to take the _current_ branch or tag even? - -# This should care that our CMAKE_INSTALL_PREFIX is absolute at the end... -get_filename_component(CMAKE_INSTALL_PREFIX - ${CMAKE_INSTALL_PREFIX} - ABSOLUTE - CACHE FORCE) - -list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) - include(ProcessorCount) include(ExternalProject) @@ -54,7 +34,7 @@ endif() # we have to hard-code the CPython executable that will be created later. All # projects that requires Python must use the variable Python3_EXECUTABLE so they # will use the right CPython. -if(BUILD_OS_WINDOWS) +if(WIN32) # Minimalistic preinstalled Python on Windows: set(Python3_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/python.exe) else() @@ -66,7 +46,7 @@ endif() add_custom_target(projects ALL COMMENT "Building Projects...") # On Linux, make sure that we use "lib" for libraries and create a symlink "lib64" pointing to "lib". -if(BUILD_OS_LINUX) +if(Linux) message(STATUS "Prepare lib and lib64 on Linux...") execute_process( COMMAND mkdir -p "${CMAKE_INSTALL_PREFIX}/lib" From af55b97141c0d401f08b687b6b3f2313ff3e393c Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 17 Mar 2022 14:24:23 +0100 Subject: [PATCH 053/213] Cleaned up Arcus Contribute to CURA-8640 --- projects/arcus.cmake | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index d9e2588f..13275e9c 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -1,9 +1,15 @@ -#Copyright (c) 2021 Ultimaker B.V. +#Copyright (c) 2022 Ultimaker B.V. #cura-build-environment is released under the terms of the AGPLv3 or higher. +GetFromEnvironmentOrCache( + NAME + ARCUS_BRANCH_OR_TAG + DEFAULT + master + DESCRIPTION + "The name of the tag or branch to build for Arcus") + set(extra_cmake_args "") -set(pylib_cmake_command ${CMAKE_COMMAND}) -set(ARCUS_pyd_copy_dir) if(BUILD_OS_WINDOWS) set(extra_cmake_args -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs @@ -17,23 +23,12 @@ if(BUILD_OS_WINDOWS) -DCMAKE_STATIC_LINKER_FLAGS=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 -DCMAKE_STATIC_LINKER_FLAGS_RELEASE=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 ) - -else() - if(BUILD_OS_OSX) - if(CMAKE_OSX_DEPLOYMENT_TARGET) - list(APPEND extra_cmake_args -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}) - endif() - if(CMAKE_OSX_SYSROOT) - list(APPEND extra_cmake_args -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT}) - endif() - endif() endif() ExternalProject_Add(Arcus GIT_REPOSITORY https://github.com/ultimaker/libArcus.git - GIT_TAG origin/${CURA_ARCUS_BRANCH_OR_TAG} + GIT_TAG origin/${ARCUS_BRANCH_OR_TAG} GIT_SHALLOW 1 - CMAKE_COMMAND ${pylib_cmake_command} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} @@ -51,10 +46,9 @@ SetProjectDependencies(TARGET Arcus DEPENDS Python Protobuf) if(BUILD_OS_WINDOWS) ExternalProject_Add(Arcus-MinGW GIT_REPOSITORY https://github.com/ultimaker/libArcus.git - GIT_TAG origin/${CURA_ARCUS_BRANCH_OR_TAG} + GIT_TAG origin/${ARCUS_BRANCH_OR_TAG} GIT_SHALLOW 1 CMAKE_GENERATOR "MinGW Makefiles" - CMAKE_COMMAND ${pylib_cmake_command} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib-mingw From 7069a914afeb4a39e7ca085a46488987d0af073d Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 17 Mar 2022 14:27:14 +0100 Subject: [PATCH 054/213] Cleaned up Savitar Contribute to CURA-8640 --- projects/savitar.cmake | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 82537d1c..9367b5c1 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -1,4 +1,13 @@ -set(savitar_cmake_command ${CMAKE_COMMAND}) +#Copyright (c) 2022 Ultimaker B.V. +#cura-build-environment is released under the terms of the AGPLv3 or higher. + +GetFromEnvironmentOrCache( + NAME + SAVITAR_BRANCH_OR_TAG + DEFAULT + master + DESCRIPTION + "The name of the tag or branch to build for Savitar") set(extra_cmake_args "") if(BUILD_OS_WINDOWS) @@ -6,26 +15,12 @@ if(BUILD_OS_WINDOWS) -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs -DMSVC_STATIC_RUNTIME=OFF ) -else() - if(BUILD_OS_OSX) - if(CMAKE_OSX_DEPLOYMENT_TARGET) - list(APPEND extra_cmake_args - -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} - ) - endif() - if(CMAKE_OSX_SYSROOT) - list(APPEND extra_cmake_args - -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} - ) - endif() - endif() endif() ExternalProject_Add(Savitar GIT_REPOSITORY https://github.com/ultimaker/libSavitar.git - GIT_TAG origin/${CURA_SAVITAR_BRANCH_OR_TAG} + GIT_TAG origin/${SAVITAR_BRANCH_OR_TAG} GIT_SHALLOW 1 - CMAKE_COMMAND ${savitar_cmake_command} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} From 204410bbc384e60331d86bb32a9ed2d7dcb39a72 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 17 Mar 2022 14:28:55 +0100 Subject: [PATCH 055/213] Cleaned up pynest2d Contribute to CURA-8640 --- projects/pynest2d.cmake | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index 707d9cda..f3326135 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -1,31 +1,23 @@ -#Copyright (c) 2020 Ultimaker B.V. +#Copyright (c) 2022 Ultimaker B.V. #cura-build-environment is released under the terms of the AGPLv3 or higher. -set(pylib_cmake_command ${CMAKE_COMMAND}) +GetFromEnvironmentOrCache( + NAME + PYNEST2D_BRANCH_OR_TAG + DEFAULT + master + DESCRIPTION + "The name of the tag or branch to build for pynest2d") set(extra_cmake_args "") if(BUILD_OS_WINDOWS) set(extra_cmake_args -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX}) -else() - if(BUILD_OS_OSX) - if(CMAKE_OSX_DEPLOYMENT_TARGET) - list(APPEND extra_cmake_args - -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} - ) - endif() - if(CMAKE_OSX_SYSROOT) - list(APPEND extra_cmake_args - -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} - ) - endif() - endif() endif() ExternalProject_Add(pynest2d GIT_REPOSITORY https://github.com/Ultimaker/pynest2d.git - GIT_TAG origin/${CURA_PYNEST2D_BRANCH_OR_TAG} + GIT_TAG origin/${PYNEST2D_BRANCH_OR_TAG} GIT_SHALLOW 1 - CMAKE_COMMAND ${pylib_cmake_command} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} From 8ebde81ed75312ea3bc5ddd8c0f65018e4bd6c59 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 17 Mar 2022 15:52:31 +0100 Subject: [PATCH 056/213] Cleaned up Linux docker Made sure there are less scattered steps process Contribute to CURA-8640 --- docker/linux/Dockerfile.centos | 175 --------------------------------- docker/linux/Dockerfile.debian | 48 +++++---- docker/linux/build.sh | 32 ------ docker/linux/entrypoint.sh | 15 +-- 4 files changed, 31 insertions(+), 239 deletions(-) delete mode 100644 docker/linux/Dockerfile.centos delete mode 100755 docker/linux/build.sh diff --git a/docker/linux/Dockerfile.centos b/docker/linux/Dockerfile.centos deleted file mode 100644 index dafe9334..00000000 --- a/docker/linux/Dockerfile.centos +++ /dev/null @@ -1,175 +0,0 @@ -# ------------------------------- -# Stage 1: Build cura-build-environment -# -FROM centos:centos8 - -LABEL linux_distro="centos8" \ - architecture="amd64" \ - python_version="3.10.0" \ - qt_version="5.15.2" - -# Set build time arugments -ARG CURA_BUILD_ENV_BUILD_TYPE=Release -ARG CURA_BUILD_ENV_PATH=/srv/cura-build-environment -ARG CURA_BUILD_ENV_WORK_DIR=/tmp/cura-build-environment -ARG CURA_ARCUS_BRANCH_OR_TAG=master -ARG CURA_SAVITAR_BRANCH_OR_TAG=master - -# Create unprivileged user -RUN groupadd -g 1000 ultimaker && \ - useradd -g ultimaker -u 1000 ultimaker -m - -# Install package repositories. Use ius to get the latest git -RUN yum -y update && \ - yum install -y epel-release && \ - yum remove -y git && \ - yum update -y && \ - yum update -y - -# Install dependencies -RUN yum install --enablerepo=powertools -y \ - gcc \ - gcc-c++ \ - gcc-gfortran \ - cmake3 \ - curl \ - git \ - libtool \ - make \ - file \ - tar \ - which \ - bzip2 \ - bzip2-devel \ - freetype \ - freetype-devel \ - fontconfig \ - fontconfig-devel \ - patch \ - mesa-libGL \ - mesa-libGL-devel \ - libX11-devel \ - libxcb-devel \ - xcb-util-devel \ - xcb-util-image-devel \ - xcb-util-keysyms-devel \ - xcb-util-renderutil-devel \ - xcb-util-wm-devel \ - libxkbcommon-devel \ - libxkbcommon-x11-devel \ - libxml2-devel \ - libxslt-devel \ - python2 \ - libxcb \ - xcb-util \ - libXrender-devel \ - libXi-devel \ - libdrm-devel \ - libXcursor-devel \ - libXcomposite-devel - - -# Set up the build environment -RUN mkdir -p "${CURA_BUILD_ENV_WORK_DIR}" "${CURA_BUILD_ENV_PATH}" -ADD . "${CURA_BUILD_ENV_WORK_DIR}"/src - -# Build the build environment -RUN mkdir -p "${CURA_BUILD_ENV_WORK_DIR}"/build && \ - chown -R ultimaker:ultimaker "${CURA_BUILD_ENV_WORK_DIR}" && \ - chown -R ultimaker:ultimaker "${CURA_BUILD_ENV_PATH}" -WORKDIR "${CURA_BUILD_ENV_WORK_DIR}"/build -USER ultimaker -RUN "${CURA_BUILD_ENV_WORK_DIR}"/src/docker/linux/build.sh "${CURA_BUILD_ENV_WORK_DIR}"/src - -# ------------------------------- -# Stage 2: Create a cleaner image with cura-build-environment installed -# -FROM centos:centos8 - -LABEL linux_distro="centos8" \ - architecture="amd64" \ - python_version="3.10.0" \ - qt_version="5.15.2" - -# Set build time arguments -ARG CURA_BUILD_ENV_BUILD_TYPE=Release -ARG CURA_BUILD_ENV_PATH=/srv/cura-build-environment -ARG CURA_ARCUS_BRANCH_OR_TAG=master -ARG CURA_SAVITAR_BRANCH_OR_TAG=master - -# Set environment variables -ENV CURA_BUILD_ENV_BUILD_TYPE="${CURA_BUILD_ENV_BUILD_TYPE}" \ - CURA_BUILD_ENV_PATH="${CURA_BUILD_ENV_PATH}" \ - CURA_ARCUS_BRANCH_OR_TAG="${CURA_ARCUS_BRANCH_OR_TAG}" \ - CURA_SAVITAR_BRANCH_OR_TAG="${CURA_SAVITAR_BRANCH_OR_TAG}" - -# Create unprivileged user -RUN groupadd -g 1000 ultimaker && \ - useradd -g ultimaker -u 1000 ultimaker - -# Install package repositories -RUN yum -y update && \ - yum install -y epel-release && \ - yum remove -y git && \ - yum update -y && \ - yum update -y - -# Install dependencies -# Note: In this cleaner image, install ONLY dependencies that Cura links dynamically to! -RUN yum install --enablerepo=powertools -y \ - gcc \ - gcc-c++ \ - gcc-gfortran \ - cmake3 \ - curl \ - git \ - gettext \ - doxygen \ - libtool \ - make \ - file \ - tar \ - which \ - bzip2 \ - bzip2-devel \ - freetype \ - freetype-devel \ - fontconfig \ - fontconfig-devel \ - mesa-libGL \ - mesa-libGL-devel \ - libX11-devel \ - patchelf \ - patch \ - libX11-devel \ - libxcb-devel \ - xcb-util-devel \ - xcb-util-image-devel \ - xcb-util-keysyms-devel \ - xcb-util-renderutil-devel \ - xcb-util-wm-devel \ - libxkbcommon-devel \ - libxkbcommon-x11-devel \ - libxml2-devel \ - libxslt-devel \ - libxcb \ - xcb-util \ - libXrender-devel \ - libXi-devel \ - libdrm-devel \ - libXcursor-devel \ - libXcomposite-devel - -# Copy cura-build-environment here -COPY --from=0 "${CURA_BUILD_ENV_PATH}" "${CURA_BUILD_ENV_PATH}" - -# Cleanup -RUN rm -rf /tmp/* && \ - rm -rf /var/cache - -# Change working directory -WORKDIR /home/ultimaker - -ADD ./docker/linux/entrypoint.sh /docker-entrypoint.sh - -ENTRYPOINT ["/docker-entrypoint.sh"] diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index ea2d3be9..b995f6e5 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -2,15 +2,16 @@ FROM debian:buster LABEL linux_distro="debian-buster" \ architecture="amd64" \ - python_version="3.10.0" \ - qt_version="5.15.2" + python_version="3.10.2" \ + qt_version="6.2.2" # Set build time arguments -ARG CURA_BUILD_ENV_BUILD_TYPE=Release -ARG CURA_BUILD_ENV_PATH=/srv/cura-build-environment -ARG CURA_BUILD_ENV_WORK_DIR=/tmp/cura-build-environment -ARG CURA_ARCUS_BRANCH_OR_TAG=master -ARG CURA_SAVITAR_BRANCH_OR_TAG=master +ARG BUILD_ENV_BUILD_TYPE=Release +ARG BUILD_ENV_PATH=/srv/cura-build-environment +ARG BUILD_ENV_WORK_DIR=/tmp/cura-build-environment +ARG ARCUS_BRANCH_OR_TAG=master +ARG SAVITAR_BRANCH_OR_TAG=master +ARG PYNEST2D_BRANCH_OR_TAG=master # Create unprivileged user RUN groupadd -g 1000 ultimaker && \ @@ -24,13 +25,12 @@ RUN apt update -y && \ libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev # Set up the working directory -RUN mkdir -p "${CURA_BUILD_ENV_WORK_DIR}" "${CURA_BUILD_ENV_PATH}" -ADD . "${CURA_BUILD_ENV_WORK_DIR}"/src +RUN mkdir -p "${BUILD_ENV_WORK_DIR}" "${BUILD_ENV_PATH}" +ADD . "${BUILD_ENV_WORK_DIR}"/src -ENV PATH="${CURA_BUILD_ENV_PATH}/bin:/usr/local/bin/:${PATH}" \ - PKG_CONFIG_PATH="${CURA_BUILD_ENV_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}" \ - LD_LIBRARY_PATH="${CURA_BUILD_ENV_PATH}/lib:${LD_LIBRARY_PATH}" \ - CURA_BUILD_ENV_PATH=/srv/cura-build-environment +ENV PATH="${BUILD_ENV_PATH}/bin:/usr/local/bin/:${PATH}" \ + PKG_CONFIG_PATH="${BUILD_ENV_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}" \ + LD_LIBRARY_PATH="${BUILD_ENV_PATH}/lib:${LD_LIBRARY_PATH}" RUN wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5.tar.gz && \ tar -zxvf cmake-3.21.5.tar.gz && \ @@ -43,15 +43,25 @@ RUN wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5 apt-get remove -y cmake # Build the build environment -RUN mkdir -p "${CURA_BUILD_ENV_WORK_DIR}"/build && \ - chown -R ultimaker:ultimaker "${CURA_BUILD_ENV_WORK_DIR}" && \ - chown -R ultimaker:ultimaker "${CURA_BUILD_ENV_PATH}" -WORKDIR "${CURA_BUILD_ENV_WORK_DIR}"/build +RUN mkdir -p "${BUILD_ENV_WORK_DIR}/build" && \ + chown -R ultimaker:ultimaker "${BUILD_ENV_WORK_DIR}" && \ + chown -R ultimaker:ultimaker "${BUILD_ENV_PATH}" +WORKDIR "${BUILD_ENV_WORK_DIR}/build" USER ultimaker -RUN "${CURA_BUILD_ENV_WORK_DIR}"/src/docker/linux/build.sh "${CURA_BUILD_ENV_WORK_DIR}"/src - +RUN cmake -DCMAKE_BUILD_TYPE=${BUILD_ENV_BUILD_TYPE} \ + -DCMAKE_INSTALL_PREFIX=${BUILD_ENV_PATH} \ + -DARCUS_BRANCH_OR_TAG=${ARCUS_BRANCH_OR_TAG} \ + -DSAVITAR_BRANCH_OR_TAG=${SAVITAR_BRANCH_OR_TAG} \ + -DPYNEST2D_BRANCH_OR_TAG=${PYNEST2D_BRANCH_OR_TAG} \ + "${BUILD_ENV_WORK_DIR}/src" +RUN cmake --build "${BUILD_ENV_WORK_DIR}/build" +RUN cmake --install "${BUILD_ENV_WORK_DIR}/build" # Cleanup +WORKDIR "${BUILD_ENV_WORK_DIR}" +RUN rm -rf "${BUILD_ENV_WORK_DIR}/build" \ + rm -rf "${BUILD_ENV_WORK_DIR}/src" + USER root WORKDIR / RUN rm -rf /tmp/* && \ diff --git a/docker/linux/build.sh b/docker/linux/build.sh deleted file mode 100755 index dc69d94b..00000000 --- a/docker/linux/build.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -# -# This script builds the cura-build-environment with the CentOS 8 or Debian Buster base docker image. -# -# Usage: -# -# Arguments: -# - src_path : the cura-build-environment source directory. -# - -set -e - -# Check and set arguments -SRC_PATH="$1" -if [[ -z "${SRC_PATH}" ]]; then - echo "Missing ." - exit 1 -fi - -# Set up environment variables -export PATH="${CURA_BUILD_ENV_PATH}/bin:${PATH}" -export PKG_CONFIG_PATH="${CURA_BUILD_ENV_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}" -export LD_LIBRARY_PATH="${CURA_BUILD_ENV_PATH}/lib:${LD_LIBRARY_PATH}" - -# Build -cmake "${SRC_PATH}" \ - -DCMAKE_BUILD_TYPE="${CURA_BUILD_ENV_BUILD_TYPE}" \ - -DCMAKE_INSTALL_PREFIX="${CURA_BUILD_ENV_PATH}" \ - -DCMAKE_PREFIX_PATH="${CURA_BUILD_ENV_PATH}" \ - -DCURA_ARCUS_BRANCH_OR_TAG="${CURA_ARCUS_BRANCH_OR_TAG}" \ - -DCURA_SAVITAR_BRANCH_OR_TAG="${CURA_SAVITAR_BRANCH_OR_TAG}" -make diff --git a/docker/linux/entrypoint.sh b/docker/linux/entrypoint.sh index 1e012608..474342ca 100755 --- a/docker/linux/entrypoint.sh +++ b/docker/linux/entrypoint.sh @@ -1,19 +1,8 @@ #!/bin/bash -# -# The entrypoint script for the cura-build-environment CentOS docker image. -# - -set -ex - -if [[ -z "${CURA_BUILD_ENV_PATH}" ]]; then - echo "CURA_BUILD_ENV_PATH is not defined. Could not find where cura-build-environment is installed." +if [[ -z "${BUILD_ENV_PATH}" ]]; then + echo "BUILD_ENV_PATH is not defined. Could not find where cura-build-environment is installed." exit 1 fi -# Sets up the environment variables. -export PATH="${CURA_BUILD_ENV_PATH}/bin:/usr/local/bin:${PATH}" -export PKG_CONFIG_PATH="${CURA_BUILD_ENV_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}" -export LD_LIBRARY_PATH="${CURA_BUILD_ENV_PATH}/lib:${LD_LIBRARY_PATH}" - # Execute command exec "$@" From 876a9c5a86bff68fbbd272f6cb4e7f381b800c0d Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 21 Mar 2022 11:21:46 +0100 Subject: [PATCH 057/213] Set a few env variables It complained about them when trying out a `docker run` Contribute to CURA-8640 --- docker/linux/Dockerfile.debian | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index b995f6e5..04f31dd0 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -7,12 +7,16 @@ LABEL linux_distro="debian-buster" \ # Set build time arguments ARG BUILD_ENV_BUILD_TYPE=Release -ARG BUILD_ENV_PATH=/srv/cura-build-environment -ARG BUILD_ENV_WORK_DIR=/tmp/cura-build-environment +ARG BUILD_ENV_PATH="/srv/cura-build-environment" +ARG BUILD_ENV_WORK_DIR="/tmp/cura-build-environment" ARG ARCUS_BRANCH_OR_TAG=master ARG SAVITAR_BRANCH_OR_TAG=master ARG PYNEST2D_BRANCH_OR_TAG=master +ENV BUILD_ENV_BUILD_TYPE=$BUILD_ENV_BUILD_TYPE +ENV BUILD_ENV_PATH=$BUILD_ENV_PATH +ENV BUILD_ENV_WORK_DIR=$BUILD_ENV_WORK_DIR + # Create unprivileged user RUN groupadd -g 1000 ultimaker && \ useradd -g ultimaker -u 1000 ultimaker -m From ab4e531ad54a6b3034459e7d519db0922897a759 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 21 Mar 2022 13:51:18 +0100 Subject: [PATCH 058/213] Set BUILD_ENV directories Contribute to CURA-8640 --- docker/linux/Dockerfile.debian | 41 ++++++++++++++++------------------ docker/linux/entrypoint.sh | 4 ---- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index 04f31dd0..c4055617 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -7,16 +7,13 @@ LABEL linux_distro="debian-buster" \ # Set build time arguments ARG BUILD_ENV_BUILD_TYPE=Release -ARG BUILD_ENV_PATH="/srv/cura-build-environment" -ARG BUILD_ENV_WORK_DIR="/tmp/cura-build-environment" +ARG BUILD_ENV_SOURCE="/home/ultimaker/env/cura-build-environment/source" +ARG BUILD_ENV_INSTALL"/home/ultimaker/env/cura-build-environment/install" +ARG BUILD_ENV_BUILD="/home/ultimaker/env/cura-build-environment/build" ARG ARCUS_BRANCH_OR_TAG=master ARG SAVITAR_BRANCH_OR_TAG=master ARG PYNEST2D_BRANCH_OR_TAG=master -ENV BUILD_ENV_BUILD_TYPE=$BUILD_ENV_BUILD_TYPE -ENV BUILD_ENV_PATH=$BUILD_ENV_PATH -ENV BUILD_ENV_WORK_DIR=$BUILD_ENV_WORK_DIR - # Create unprivileged user RUN groupadd -g 1000 ultimaker && \ useradd -g ultimaker -u 1000 ultimaker -m @@ -29,12 +26,15 @@ RUN apt update -y && \ libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev # Set up the working directory -RUN mkdir -p "${BUILD_ENV_WORK_DIR}" "${BUILD_ENV_PATH}" -ADD . "${BUILD_ENV_WORK_DIR}"/src +RUN mkdir -p "${BUILD_ENV_SOURCE}" "${BUILD_ENV_BUILD}" "${BUILD_ENV_INSTALL}" +RUN chown -R ultimaker:ultimaker "${BUILD_ENV_SOURCE}" && \ + chown -R ultimaker:ultimaker "${BUILD_ENV_BUILD}" && \ + chown -R ultimaker:ultimaker "${BUILD_ENV_INSTALL}" +ADD . "${BUILD_ENV_SOURCE}" -ENV PATH="${BUILD_ENV_PATH}/bin:/usr/local/bin/:${PATH}" \ - PKG_CONFIG_PATH="${BUILD_ENV_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}" \ - LD_LIBRARY_PATH="${BUILD_ENV_PATH}/lib:${LD_LIBRARY_PATH}" +ENV PATH="${BUILD_ENV_INSTALL}/bin:/usr/local/bin/:${PATH}" \ + PKG_CONFIG_PATH="${BUILD_ENV_INSTALL}/lib/pkgconfig:${PKG_CONFIG_PATH}" \ + LD_LIBRARY_PATH="${BUILD_ENV_INSTALL}/lib:${LD_LIBRARY_PATH}" RUN wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5.tar.gz && \ tar -zxvf cmake-3.21.5.tar.gz && \ @@ -47,24 +47,21 @@ RUN wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5 apt-get remove -y cmake # Build the build environment -RUN mkdir -p "${BUILD_ENV_WORK_DIR}/build" && \ - chown -R ultimaker:ultimaker "${BUILD_ENV_WORK_DIR}" && \ - chown -R ultimaker:ultimaker "${BUILD_ENV_PATH}" -WORKDIR "${BUILD_ENV_WORK_DIR}/build" +WORKDIR "${BUILD_ENV_BUILD}" USER ultimaker RUN cmake -DCMAKE_BUILD_TYPE=${BUILD_ENV_BUILD_TYPE} \ - -DCMAKE_INSTALL_PREFIX=${BUILD_ENV_PATH} \ + -DCMAKE_INSTALL_PREFIX=${BUILD_ENV_INSTALL} \ -DARCUS_BRANCH_OR_TAG=${ARCUS_BRANCH_OR_TAG} \ -DSAVITAR_BRANCH_OR_TAG=${SAVITAR_BRANCH_OR_TAG} \ -DPYNEST2D_BRANCH_OR_TAG=${PYNEST2D_BRANCH_OR_TAG} \ - "${BUILD_ENV_WORK_DIR}/src" -RUN cmake --build "${BUILD_ENV_WORK_DIR}/build" -RUN cmake --install "${BUILD_ENV_WORK_DIR}/build" + "${BUILD_ENV_SOURCE}" +RUN cmake --build "${BUILD_ENV_BUILD}" +RUN cmake --install "${BUILD_ENV_BUILD}" # Cleanup -WORKDIR "${BUILD_ENV_WORK_DIR}" -RUN rm -rf "${BUILD_ENV_WORK_DIR}/build" \ - rm -rf "${BUILD_ENV_WORK_DIR}/src" +WORKDIR "${BUILD_ENV_INSTALL}" +RUN rm -rf "${BUILD_ENV_SOURCE}" \ + rm -rf "${BUILD_ENV_BUILD}" USER root WORKDIR / diff --git a/docker/linux/entrypoint.sh b/docker/linux/entrypoint.sh index 474342ca..759ef70d 100755 --- a/docker/linux/entrypoint.sh +++ b/docker/linux/entrypoint.sh @@ -1,8 +1,4 @@ #!/bin/bash -if [[ -z "${BUILD_ENV_PATH}" ]]; then - echo "BUILD_ENV_PATH is not defined. Could not find where cura-build-environment is installed." - exit 1 -fi # Execute command exec "$@" From 00ac840bb360df856c5930a33112872295d6eaf7 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 21 Mar 2022 15:02:03 +0100 Subject: [PATCH 059/213] Set BUILD_ENV_INSTALL directory Contribute to CURA-8640 --- docker/linux/Dockerfile.debian | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index c4055617..600c70f2 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -8,7 +8,7 @@ LABEL linux_distro="debian-buster" \ # Set build time arguments ARG BUILD_ENV_BUILD_TYPE=Release ARG BUILD_ENV_SOURCE="/home/ultimaker/env/cura-build-environment/source" -ARG BUILD_ENV_INSTALL"/home/ultimaker/env/cura-build-environment/install" +ARG BUILD_ENV_INSTALL="/home/ultimaker/env/cura-build-environment/install" ARG BUILD_ENV_BUILD="/home/ultimaker/env/cura-build-environment/build" ARG ARCUS_BRANCH_OR_TAG=master ARG SAVITAR_BRANCH_OR_TAG=master From 430a30c8b4b435d0385150a09d5c0bb676eb8f07 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 21 Mar 2022 15:40:53 +0100 Subject: [PATCH 060/213] Wasn't allowed to remove the artifacts Contribute to CURA-8640 --- docker/linux/Dockerfile.debian | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index 600c70f2..c661f25e 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -60,6 +60,10 @@ RUN cmake --install "${BUILD_ENV_BUILD}" # Cleanup WORKDIR "${BUILD_ENV_INSTALL}" +USER ultimaker +RUN chown -R ultimaker:ultimaker "${BUILD_ENV_SOURCE}" && \ + chown -R ultimaker:ultimaker "${BUILD_ENV_BUILD}" && \ + chown -R ultimaker:ultimaker "${BUILD_ENV_INSTALL}" RUN rm -rf "${BUILD_ENV_SOURCE}" \ rm -rf "${BUILD_ENV_BUILD}" From 7fc10a165c7b738ee7c98fd1c706f399a8d6b706 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 21 Mar 2022 17:19:35 +0100 Subject: [PATCH 061/213] Clean-up as root Contribute to CURA-8640 --- docker/linux/Dockerfile.debian | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index c661f25e..5876e9b0 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -59,18 +59,12 @@ RUN cmake --build "${BUILD_ENV_BUILD}" RUN cmake --install "${BUILD_ENV_BUILD}" # Cleanup -WORKDIR "${BUILD_ENV_INSTALL}" -USER ultimaker -RUN chown -R ultimaker:ultimaker "${BUILD_ENV_SOURCE}" && \ - chown -R ultimaker:ultimaker "${BUILD_ENV_BUILD}" && \ - chown -R ultimaker:ultimaker "${BUILD_ENV_INSTALL}" -RUN rm -rf "${BUILD_ENV_SOURCE}" \ - rm -rf "${BUILD_ENV_BUILD}" - USER root WORKDIR / RUN rm -rf /tmp/* && \ - rm -rf /var/cache + rm -rf /var/cache \ + rm -rf "${BUILD_ENV_SOURCE}" \ + rm -rf "${BUILD_ENV_BUILD}" # Change working directory WORKDIR /home/ultimaker From 83c2d1b8697005e1dbb48354aed8dc393a0040b7 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 22 Mar 2022 10:57:26 +0100 Subject: [PATCH 062/213] Use cmake as entrypoint Contribute to CURA-8640 --- docker/linux/Dockerfile.debian | 8 +++----- docker/linux/entrypoint.sh | 4 ---- 2 files changed, 3 insertions(+), 9 deletions(-) delete mode 100755 docker/linux/entrypoint.sh diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index 5876e9b0..f2ff7e28 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -67,8 +67,6 @@ RUN rm -rf /tmp/* && \ rm -rf "${BUILD_ENV_BUILD}" # Change working directory -WORKDIR /home/ultimaker - -ADD ./docker/linux/entrypoint.sh /docker-entrypoint.sh - -ENTRYPOINT ["/docker-entrypoint.sh"] +USER ultimaker +WORKDIR /home/ultimaker/src/build +ENTRYPOINT ["cmake"]CMD["/home/ultimaker/src/"] diff --git a/docker/linux/entrypoint.sh b/docker/linux/entrypoint.sh deleted file mode 100755 index 759ef70d..00000000 --- a/docker/linux/entrypoint.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -# Execute command -exec "$@" From 7f79231d91785ade907b21a0eff9f44c694804a9 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 22 Mar 2022 11:07:07 +0100 Subject: [PATCH 063/213] Use CMD instead of entrypoint Contribute to CURA-8640 --- docker/linux/Dockerfile.debian | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index f2ff7e28..081c2ee8 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -69,4 +69,4 @@ RUN rm -rf /tmp/* && \ # Change working directory USER ultimaker WORKDIR /home/ultimaker/src/build -ENTRYPOINT ["cmake"]CMD["/home/ultimaker/src/"] +CMD cmake From 169a556fc176c0a0ec2a3c90b5a8576a7c499848 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 22 Mar 2022 11:49:09 +0100 Subject: [PATCH 064/213] Specify full path Contribute to CURA-8640 --- docker/linux/Dockerfile.debian | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index 081c2ee8..a83982ce 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -69,4 +69,4 @@ RUN rm -rf /tmp/* && \ # Change working directory USER ultimaker WORKDIR /home/ultimaker/src/build -CMD cmake +CMD /usr/local/bin/cmake From 41c6f7f686107762f2d6557ad3ccff23440fa156 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 23 Mar 2022 12:47:58 +0100 Subject: [PATCH 065/213] Don't link Python 3.10.2 against libcrypt pyinstaller won't include libcrypt on Linux and it is as system library which is located in different locations across different distributions. The following issue https://bugs.python.org/issue45433 report states that libcrypt is no longer used in 3.10.2 and will be fixed in 3.11. Contribute to CURA-8640 --- ...-link-libpython-against-libcrypt-GH-.patch | 80 +++++++++++++++++++ projects/python.cmake | 9 ++- 2 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch diff --git a/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch b/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch new file mode 100644 index 00000000..29874514 --- /dev/null +++ b/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch @@ -0,0 +1,80 @@ +From be21706f3760bec8bd11f85ce02ed6792b07f51f Mon Sep 17 00:00:00 2001 +From: Mike Gilbert +Date: Mon, 11 Oct 2021 19:24:03 -0400 +Subject: [PATCH] bpo-45433: Do not link libpython against libcrypt (GH-28881) + +Save/restore LIBS when calling AC_SEARCH_LIBS(..., crypt). This avoid +linking libpython with libcrypt. +--- + Doc/whatsnew/3.11.rst | 2 ++ + .../NEWS.d/next/Build/2021-10-11-16-08-37.bpo-45433.pVDkMV.rst | 1 + + configure | 3 +++ + configure.ac | 3 +++ + 4 files changed, 9 insertions(+) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-08-37.bpo-45433.pVDkMV.rst + +diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst +index 0d30fe8b64..21a46b4b72 100644 +--- a/Doc/whatsnew/3.11.rst ++++ b/Doc/whatsnew/3.11.rst +@@ -457,6 +457,8 @@ Build Changes + * CPython can now be built with the ThinLTO option via ``--with-lto=thin``. + (Contributed by Dong-hee Na and Brett Holman in :issue:`44340`.) + ++* libpython is no longer linked against libcrypt. ++ (Contributed by Mike Gilbert in :issue:`45433`.) + + C API Changes + ============= +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-08-37.bpo-45433.pVDkMV.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-08-37.bpo-45433.pVDkMV.rst +new file mode 100644 +index 0000000000..27869f08fb +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-08-37.bpo-45433.pVDkMV.rst +@@ -0,0 +1 @@ ++Avoid linking libpython with libcrypt. +diff --git a/configure b/configure +index 15c7c54b09..70f28b0c70 100755 +--- a/configure ++++ b/configure +@@ -13227,6 +13227,8 @@ done + + # We search for both crypt and crypt_r as one or the other may be defined + # This gets us our -lcrypt in LIBS when required on the target platform. ++# Save/restore LIBS to avoid linking libpython with libcrypt. ++LIBS_SAVE=$LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing crypt" >&5 + $as_echo_n "checking for library containing crypt... " >&6; } + if ${ac_cv_search_crypt+:} false; then : +@@ -13368,6 +13370,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + fi + ++LIBS=$LIBS_SAVE + + for ac_func in clock_gettime + do : +diff --git a/configure.ac b/configure.ac +index 6c65b2914b..afdc68363c 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -4085,6 +4085,8 @@ AC_CHECK_FUNCS(setpgrp, + + # We search for both crypt and crypt_r as one or the other may be defined + # This gets us our -lcrypt in LIBS when required on the target platform. ++# Save/restore LIBS to avoid linking libpython with libcrypt. ++LIBS_SAVE=$LIBS + AC_SEARCH_LIBS(crypt, crypt) + AC_SEARCH_LIBS(crypt_r, crypt) + +@@ -4099,6 +4101,7 @@ char *r = crypt_r("", "", &d); + [AC_DEFINE(HAVE_CRYPT_R, 1, [Define if you have the crypt_r() function.])], + []) + ) ++LIBS=$LIBS_SAVE + + AC_CHECK_FUNCS(clock_gettime, [], [ + AC_CHECK_LIB(rt, clock_gettime, [ +-- +2.35.1 + diff --git a/projects/python.cmake b/projects/python.cmake index e2673b17..6756c15b 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -1,6 +1,7 @@ set(python_configure_command ./configure --prefix=${CMAKE_INSTALL_PREFIX} --enable-shared --enable-ipv6 --without-pymalloc ) set(python_build_command make -j ${N_PROC}) set(python_install_command make install) +set(patch_command ) if(BUILD_OS_WINDOWS) # Otherwise Python will not be able to get external dependencies. @@ -22,11 +23,15 @@ endif() if(BUILD_OS_LINUX) # Set a proper RPATH so everything depending on Python does not need LD_LIBRARY_PATH set(python_configure_command LDFLAGS=-Wl,-rpath=${CMAKE_INSTALL_PREFIX}/lib ${python_configure_command} --with-openssl=${CMAKE_INSTALL_PREFIX}) + + # FIXME: Not longer needed when we update to Python 3.11 + set(patch_command git apply ${CMAKE_SOURCE_DIR}/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch) endif() ExternalProject_Add(Python - URL https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgz - URL_HASH SHA256=3c0ede893011319f9b0a56b44953a3d52c7abf9657c23fb4bc9ced93b86e9c97 + GIT_REPOSITORY https://github.com/python/cpython.git + GIT_TAG v3.10.2 + PATCH_COMMAND ${patch_command} CONFIGURE_COMMAND "${python_configure_command}" BUILD_COMMAND ${python_build_command} INSTALL_COMMAND ${python_install_command} From 2426ed33c79876f8558c6e06d442fa8854a95864 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 23 Mar 2022 12:53:24 +0100 Subject: [PATCH 066/213] Preset a couple of env paths These are used when running pyinstaller for cura-build Contribute to CURA-8640 --- docker/linux/Dockerfile.debian | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index a83982ce..230219ed 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -34,7 +34,10 @@ ADD . "${BUILD_ENV_SOURCE}" ENV PATH="${BUILD_ENV_INSTALL}/bin:/usr/local/bin/:${PATH}" \ PKG_CONFIG_PATH="${BUILD_ENV_INSTALL}/lib/pkgconfig:${PKG_CONFIG_PATH}" \ - LD_LIBRARY_PATH="${BUILD_ENV_INSTALL}/lib:${LD_LIBRARY_PATH}" + LD_LIBRARY_PATH="${BUILD_ENV_INSTALL}/lib:/home/ultimaker/src/install/lib:/lib/x86_64-linux-gnu/:/usr/lib/x86_64-linux-gnu/:${LD_LIBRARY_PATH}" \ + PYTHONPATH=/home/ultimaker/src/install/lib/python3/dist-packages/:/home/ultimaker/env/cura-build-environment/install/lib/python3.10/site-packages/ \ + HOME=/home/ultimaker \ + USER=ultimaker RUN wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5.tar.gz && \ tar -zxvf cmake-3.21.5.tar.gz && \ From a22e34ace83bc1898416444fba78429217947ec5 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 23 Mar 2022 14:11:24 +0100 Subject: [PATCH 067/213] Encapsulate patch command with qoutes and use list dir Contribute to CURA-8640 --- projects/python.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/python.cmake b/projects/python.cmake index 6756c15b..8301ff36 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -25,7 +25,7 @@ if(BUILD_OS_LINUX) set(python_configure_command LDFLAGS=-Wl,-rpath=${CMAKE_INSTALL_PREFIX}/lib ${python_configure_command} --with-openssl=${CMAKE_INSTALL_PREFIX}) # FIXME: Not longer needed when we update to Python 3.11 - set(patch_command git apply ${CMAKE_SOURCE_DIR}/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch) + set(patch_command "git apply ${CMAKE_CURRENT_LIST_DIR}/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch") endif() ExternalProject_Add(Python From fcf59e727dce0882a836c7d24476022eac95d598 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 23 Mar 2022 14:37:09 +0100 Subject: [PATCH 068/213] Don't use list dir Contribute to CURA-8640 --- projects/python.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/python.cmake b/projects/python.cmake index 8301ff36..95be1a52 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -25,7 +25,7 @@ if(BUILD_OS_LINUX) set(python_configure_command LDFLAGS=-Wl,-rpath=${CMAKE_INSTALL_PREFIX}/lib ${python_configure_command} --with-openssl=${CMAKE_INSTALL_PREFIX}) # FIXME: Not longer needed when we update to Python 3.11 - set(patch_command "git apply ${CMAKE_CURRENT_LIST_DIR}/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch") + set(patch_command "git apply ${CMAKE_SOURCE_DIR}/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch") endif() ExternalProject_Add(Python From 0c3ffdcb24b0439712383d604a158518f9518eb5 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 23 Mar 2022 15:44:02 +0100 Subject: [PATCH 069/213] trimesh depends on OpenCTM Contribute to CURA-8640 --- projects/python_packages.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/python_packages.cmake b/projects/python_packages.cmake index 5dd811ae..2f58981f 100644 --- a/projects/python_packages.cmake +++ b/projects/python_packages.cmake @@ -1,7 +1,7 @@ add_custom_target(PythonPackagesGeneral ALL COMMAND ${Python3_EXECUTABLE} -m pip install --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt COMMENT "Install Python packages" - DEPENDS Python + DEPENDS Python OpenCTM ) if(BUILD_OS_WINDOWS) From 68a3f077593d9efd84704bc6a98f4ec1c88e9c95 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 23 Mar 2022 15:49:10 +0100 Subject: [PATCH 070/213] Use git as source Sourceforge is an unreliable download source. often failing to download and disputable practices https://www.howtogeek.com/218764/warning-don%E2%80%99t-download-software-from-sourceforge-if-you-can-help-it/ Contribute to CURA-8640 --- projects/clipper.cmake | 4 ++-- projects/xz.cmake | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/projects/clipper.cmake b/projects/clipper.cmake index ef18b000..04011253 100644 --- a/projects/clipper.cmake +++ b/projects/clipper.cmake @@ -6,8 +6,8 @@ #CMake 3.6 (our minimum requirement) doesn't support SOURCE_SUBDIR yet. Instead we copy the source from the cpp subfolder to the main folder. if(NOT TARGET Clipper) ExternalProject_Add(Clipper - URL https://sourceforge.net/projects/polyclipping/files/clipper_ver6.4.2.zip - URL_HASH SHA256=a14320d82194807c4480ce59c98aa71cd4175a5156645c4e2b3edd330b930627 + GIT_REPOSITORY https://github.com/skyrpex/clipper + GIT_TAG 6.4.2 PATCH_COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper/cpp" "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper" && ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/projects/clipper_cmakelists_patch.txt" "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper/CMakeLists.txt" && ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper/clipper.hpp" "${CMAKE_INSTALL_PREFIX}/include/" CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} diff --git a/projects/xz.cmake b/projects/xz.cmake index 6f9497a4..6c7257ee 100644 --- a/projects/xz.cmake +++ b/projects/xz.cmake @@ -1,7 +1,7 @@ if(BUILD_OS_OSX) ExternalProject_Add(xz - URL https://sourceforge.net/projects/lzmautils/files/xz-5.2.4.tar.gz - URL_HASH SHA256=b512f3b726d3b37b6dc4c8570e137b9311e7552e8ccbab4d39d47ce5f4177145 + GIT_REPOSITORY https://git.tukaani.org/xz.git + GIT_TAG v5.2.4 CONFIGURE_COMMAND ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} --with-sysroot=${CMAKE_OSX_SYSROOT} BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install @@ -9,8 +9,8 @@ if(BUILD_OS_OSX) ) elseif(BUILD_OS_LINUX) ExternalProject_Add(xz - URL https://sourceforge.net/projects/lzmautils/files/xz-5.2.4.tar.gz - URL_HASH SHA256=b512f3b726d3b37b6dc4c8570e137b9311e7552e8ccbab4d39d47ce5f4177145 + GIT_REPOSITORY https://git.tukaani.org/xz.git + GIT_TAG v5.2.4 CONFIGURE_COMMAND ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install From dcf18277ca774a82d609750edba371bab8b2cd9e Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 23 Mar 2022 16:05:15 +0100 Subject: [PATCH 071/213] use autogen before the configure step Contributes to CURA-8640 --- projects/xz.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/xz.cmake b/projects/xz.cmake index 6c7257ee..64e7a91f 100644 --- a/projects/xz.cmake +++ b/projects/xz.cmake @@ -2,7 +2,7 @@ if(BUILD_OS_OSX) ExternalProject_Add(xz GIT_REPOSITORY https://git.tukaani.org/xz.git GIT_TAG v5.2.4 - CONFIGURE_COMMAND ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} --with-sysroot=${CMAKE_OSX_SYSROOT} + CONFIGURE_COMMAND ./autogen.sh && ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} --with-sysroot=${CMAKE_OSX_SYSROOT} BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install BUILD_IN_SOURCE 1 @@ -11,7 +11,7 @@ elseif(BUILD_OS_LINUX) ExternalProject_Add(xz GIT_REPOSITORY https://git.tukaani.org/xz.git GIT_TAG v5.2.4 - CONFIGURE_COMMAND ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} + CONFIGURE_COMMAND ./autogen.sh && ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install BUILD_IN_SOURCE 1 From c421315205c7a0d442fe73b4cb1fda2473a13ee2 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 23 Mar 2022 16:23:15 +0100 Subject: [PATCH 072/213] Apply patch to polyclipping runtime lib Contributes to CURA-8640 --- .../0002-install-location-runtime-libs.patch | 17 +++++++++++++ projects/clipper.cmake | 8 +++--- projects/clipper_cmakelists_patch.txt | 25 ------------------- 3 files changed, 20 insertions(+), 30 deletions(-) create mode 100644 projects/0002-install-location-runtime-libs.patch delete mode 100644 projects/clipper_cmakelists_patch.txt diff --git a/projects/0002-install-location-runtime-libs.patch b/projects/0002-install-location-runtime-libs.patch new file mode 100644 index 00000000..7c6a471f --- /dev/null +++ b/projects/0002-install-location-runtime-libs.patch @@ -0,0 +1,17 @@ +diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt +index 32293cb..8179774 100644 +--- a/cpp/CMakeLists.txt ++++ b/cpp/CMakeLists.txt +@@ -15,7 +15,11 @@ ADD_LIBRARY(polyclipping clipper.cpp) + CONFIGURE_FILE (polyclipping.pc.cmakein "${PCFILE}" @ONLY) + + INSTALL (FILES clipper.hpp DESTINATION "${CMAKE_INSTALL_INCDIR}") +-INSTALL (TARGETS polyclipping LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") ++INSTALL (TARGETS polyclipping ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ++ RUNTIME DESTINATION "${CMAKE_INSTALL_LIBDIR}" ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" ++ ) + INSTALL (FILES "${PCFILE}" DESTINATION "${CMAKE_INSTALL_PKGCONFIGDIR}") + + SET_TARGET_PROPERTIES(polyclipping PROPERTIES VERSION 22.0.0 SOVERSION 22 ) diff --git a/projects/clipper.cmake b/projects/clipper.cmake index 04011253..f76a2817 100644 --- a/projects/clipper.cmake +++ b/projects/clipper.cmake @@ -1,14 +1,12 @@ -#Copyright (c) 2020 Ultimaker B.V. +#Copyright (c) 2022 Ultimaker B.V. #cura-build-environment is released under the terms of the AGPLv3 or higher. -#Clipper (dependency of libnest2d). - -#CMake 3.6 (our minimum requirement) doesn't support SOURCE_SUBDIR yet. Instead we copy the source from the cpp subfolder to the main folder. if(NOT TARGET Clipper) ExternalProject_Add(Clipper GIT_REPOSITORY https://github.com/skyrpex/clipper GIT_TAG 6.4.2 - PATCH_COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper/cpp" "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper" && ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/projects/clipper_cmakelists_patch.txt" "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper/CMakeLists.txt" && ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/Clipper-prefix/src/Clipper/clipper.hpp" "${CMAKE_INSTALL_PREFIX}/include/" + PATCH_COMMAND git apply ${CMAKE_SOURCE_DIR}/projects/0002-install-location-runtime-libs.patch + SOURCE_SUBDIR cpp CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} diff --git a/projects/clipper_cmakelists_patch.txt b/projects/clipper_cmakelists_patch.txt deleted file mode 100644 index 155241e7..00000000 --- a/projects/clipper_cmakelists_patch.txt +++ /dev/null @@ -1,25 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0) -PROJECT(polyclipping) - -SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "Release type") -# The header name clipper.hpp is too generic, so install in a subdirectory -SET(CMAKE_INSTALL_INCDIR "${CMAKE_INSTALL_PREFIX}/include/polyclipping") -SET(CMAKE_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}") -SET(CMAKE_INSTALL_PKGCONFIGDIR "${CMAKE_INSTALL_PREFIX}/share/pkgconfig") -SET(PCFILE "${CMAKE_CURRENT_BINARY_DIR}/polyclipping.pc") - -SET(BUILD_SHARED_LIBS ON CACHE BOOL - "Build shared libraries (.dll/.so) instead of static ones (.lib/.a)") -ADD_LIBRARY(polyclipping clipper.cpp) - -CONFIGURE_FILE (polyclipping.pc.cmakein "${PCFILE}" @ONLY) - -INSTALL (FILES clipper.hpp DESTINATION "${CMAKE_INSTALL_INCDIR}") -INSTALL (TARGETS polyclipping - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - RUNTIME DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" -) -INSTALL (FILES "${PCFILE}" DESTINATION "${CMAKE_INSTALL_PKGCONFIGDIR}") - -SET_TARGET_PROPERTIES(polyclipping PROPERTIES VERSION 22.0.0 SOVERSION 22 ) From 333456c068944ff6b3e7afb2f02a243f0f488371 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 23 Mar 2022 16:25:52 +0100 Subject: [PATCH 073/213] Drop support for CTM files Open CTM has been used 5 times on million of slices the past year. Since OpenCTM seems to be abounded since 2012 we have decided to drop support. There are plenty of conversion tools for this file type available. Contributes to CURA-8640 --- projects/openctm.cmake | 38 ---------------------------------- projects/python_packages.cmake | 2 +- 2 files changed, 1 insertion(+), 39 deletions(-) delete mode 100644 projects/openctm.cmake diff --git a/projects/openctm.cmake b/projects/openctm.cmake deleted file mode 100644 index 7fbc86c7..00000000 --- a/projects/openctm.cmake +++ /dev/null @@ -1,38 +0,0 @@ -set(_cura_openctm_url https://sourceforge.net/projects/openctm/files/OpenCTM-1.0.3/OpenCTM-1.0.3-src.tar.bz2/download) -set(_cura_openctm_sha256 4a8d2608d97364f7eec56b7c637c56b9308ae98286b3e90dbb7413c90e943f1d) - -if (BUILD_OS_WINDOWS) - ExternalProject_Add(OpenCTM - URL ${_cura_openctm_url} - URL_HASH SHA256=${_cura_openctm_sha256} - CONFIGURE_COMMAND "" - BUILD_COMMAND nmake /f Makefile.msvc openctm - INSTALL_COMMAND ${CMAKE_COMMAND} -E copy lib/openctm.dll ${CMAKE_INSTALL_PREFIX}/bin/openctm.dll - COMMAND ${CMAKE_COMMAND} -E copy lib/openctm.lib ${CMAKE_INSTALL_PREFIX}/lib/openctm.lib - COMMAND ${CMAKE_COMMAND} -E copy lib/openctm.h ${CMAKE_INSTALL_PREFIX}/include/openctm.h - COMMAND ${CMAKE_COMMAND} -E copy lib/openctmpp.h ${CMAKE_INSTALL_PREFIX}/include/openctmpp.h - BUILD_IN_SOURCE 1 - ) -elseif (BUILD_OS_LINUX) - ExternalProject_Add(OpenCTM - URL ${_cura_openctm_url} - URL_HASH SHA256=${_cura_openctm_sha256} - CONFIGURE_COMMAND "" - BUILD_COMMAND make -j ${N_PROC} -f Makefile.linux openctm - INSTALL_COMMAND ${CMAKE_COMMAND} -E copy lib/libopenctm.so ${CMAKE_INSTALL_PREFIX}/lib/libopenctm.so - COMMAND ${CMAKE_COMMAND} -E copy lib/openctm.h ${CMAKE_INSTALL_PREFIX}/include/openctm.h - COMMAND ${CMAKE_COMMAND} -E copy lib/openctmpp.h ${CMAKE_INSTALL_PREFIX}/include/openctmpp.h - BUILD_IN_SOURCE 1 - ) -else () # OSX - ExternalProject_Add(OpenCTM - URL ${_cura_openctm_url} - URL_HASH SHA256=${_cura_openctm_sha256} - CONFIGURE_COMMAND "" - BUILD_COMMAND make -j ${N_PROC} -f Makefile.macosx openctm - INSTALL_COMMAND ${CMAKE_COMMAND} -E copy lib/libopenctm.dylib ${CMAKE_INSTALL_PREFIX}/lib/libopenctm.dylib - COMMAND ${CMAKE_COMMAND} -E copy lib/openctm.h ${CMAKE_INSTALL_PREFIX}/include/openctm.h - COMMAND ${CMAKE_COMMAND} -E copy lib/openctmpp.h ${CMAKE_INSTALL_PREFIX}/include/openctmpp.h - BUILD_IN_SOURCE 1 - ) -endif () diff --git a/projects/python_packages.cmake b/projects/python_packages.cmake index 2f58981f..5dd811ae 100644 --- a/projects/python_packages.cmake +++ b/projects/python_packages.cmake @@ -1,7 +1,7 @@ add_custom_target(PythonPackagesGeneral ALL COMMAND ${Python3_EXECUTABLE} -m pip install --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt COMMENT "Install Python packages" - DEPENDS Python OpenCTM + DEPENDS Python ) if(BUILD_OS_WINDOWS) From a01e27c848a5f7578d8f10b64625984954504ab5 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 23 Mar 2022 16:52:18 +0100 Subject: [PATCH 074/213] Added autopoint as system dep needed to prepare xz Contributes to CURA-8640 --- docker/linux/Dockerfile.debian | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index 230219ed..1e82419b 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -23,7 +23,7 @@ RUN apt update -y && \ apt upgrade -y && \ apt install -y build-essential g++ gfortran libtool make autoconf automake git curl wget cmake tar \ libffi-dev pkg-config libx11-xcb-dev libxcb* libfreetype6-dev libgl1-mesa-dev libegl1-mesa libxkbcommon-dev \ - libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev + libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev autopoint # Set up the working directory RUN mkdir -p "${BUILD_ENV_SOURCE}" "${BUILD_ENV_BUILD}" "${BUILD_ENV_INSTALL}" From ad9130f12ae9d1f7f27c77c081146a4e781cb7f9 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 23 Mar 2022 17:59:48 +0100 Subject: [PATCH 075/213] encapsulated patch command with quote signs CMake... arghhhhh! Contributes to CURA-8640 --- projects/python.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/python.cmake b/projects/python.cmake index 95be1a52..2acfd759 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -25,13 +25,13 @@ if(BUILD_OS_LINUX) set(python_configure_command LDFLAGS=-Wl,-rpath=${CMAKE_INSTALL_PREFIX}/lib ${python_configure_command} --with-openssl=${CMAKE_INSTALL_PREFIX}) # FIXME: Not longer needed when we update to Python 3.11 - set(patch_command "git apply ${CMAKE_SOURCE_DIR}/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch") + set(patch_command git apply ${CMAKE_SOURCE_DIR}/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch) endif() ExternalProject_Add(Python GIT_REPOSITORY https://github.com/python/cpython.git GIT_TAG v3.10.2 - PATCH_COMMAND ${patch_command} + PATCH_COMMAND "${patch_command}" CONFIGURE_COMMAND "${python_configure_command}" BUILD_COMMAND ${python_build_command} INSTALL_COMMAND ${python_install_command} From 4fc381e2d913e2a43092a7b733abab21d091a171 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 23 Mar 2022 18:29:23 +0100 Subject: [PATCH 076/213] Don't patch what isn't there Contributes to CURA-8640 --- ...not-link-libpython-against-libcrypt-GH-.patch | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch b/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch index 29874514..7ff6a6f9 100644 --- a/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch +++ b/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch @@ -6,26 +6,12 @@ Subject: [PATCH] bpo-45433: Do not link libpython against libcrypt (GH-28881) Save/restore LIBS when calling AC_SEARCH_LIBS(..., crypt). This avoid linking libpython with libcrypt. --- - Doc/whatsnew/3.11.rst | 2 ++ .../NEWS.d/next/Build/2021-10-11-16-08-37.bpo-45433.pVDkMV.rst | 1 + configure | 3 +++ configure.ac | 3 +++ - 4 files changed, 9 insertions(+) + 3 files changed, 7 insertions(+) create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-08-37.bpo-45433.pVDkMV.rst -diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst -index 0d30fe8b64..21a46b4b72 100644 ---- a/Doc/whatsnew/3.11.rst -+++ b/Doc/whatsnew/3.11.rst -@@ -457,6 +457,8 @@ Build Changes - * CPython can now be built with the ThinLTO option via ``--with-lto=thin``. - (Contributed by Dong-hee Na and Brett Holman in :issue:`44340`.) - -+* libpython is no longer linked against libcrypt. -+ (Contributed by Mike Gilbert in :issue:`45433`.) - - C API Changes - ============= diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-08-37.bpo-45433.pVDkMV.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-08-37.bpo-45433.pVDkMV.rst new file mode 100644 index 0000000000..27869f08fb From fcd662ce57c263534640a7d58ebc406c699c7bd4 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 23 Mar 2022 18:59:54 +0100 Subject: [PATCH 077/213] fix patch does not apply hopefully https://stackoverflow.com/questions/4770177/git-patch-does-not-apply Contributes to CURA-8640 --- projects/clipper.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/clipper.cmake b/projects/clipper.cmake index f76a2817..482a07d2 100644 --- a/projects/clipper.cmake +++ b/projects/clipper.cmake @@ -5,7 +5,7 @@ if(NOT TARGET Clipper) ExternalProject_Add(Clipper GIT_REPOSITORY https://github.com/skyrpex/clipper GIT_TAG 6.4.2 - PATCH_COMMAND git apply ${CMAKE_SOURCE_DIR}/projects/0002-install-location-runtime-libs.patch + PATCH_COMMAND git apply --reject --whitespace=fix ${CMAKE_SOURCE_DIR}/projects/0002-install-location-runtime-libs.patch SOURCE_SUBDIR cpp CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} From 830f83fa52d0d28367f027b4a337907f5cc847a2 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 24 Mar 2022 11:36:01 +0100 Subject: [PATCH 078/213] Use CMAKE_PREFIX_PATH Make sure stuff is found Contributes to CURA-8640 --- docker/linux/Dockerfile.debian | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index 1e82419b..c24d7486 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -53,6 +53,7 @@ RUN wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5 WORKDIR "${BUILD_ENV_BUILD}" USER ultimaker RUN cmake -DCMAKE_BUILD_TYPE=${BUILD_ENV_BUILD_TYPE} \ + -DCMAKE_PREFIX_PATH=${BUILD_ENV_INSTALL} \ -DCMAKE_INSTALL_PREFIX=${BUILD_ENV_INSTALL} \ -DARCUS_BRANCH_OR_TAG=${ARCUS_BRANCH_OR_TAG} \ -DSAVITAR_BRANCH_OR_TAG=${SAVITAR_BRANCH_OR_TAG} \ From 340ca1bb46976516885a149af775d985d0cd6e2f Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 24 Mar 2022 15:19:24 +0100 Subject: [PATCH 079/213] use ultimaker user consitantly Contributes to CURA-8640 --- docker/linux/Dockerfile.debian | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index c24d7486..d1a587c4 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -26,16 +26,16 @@ RUN apt update -y && \ libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev autopoint # Set up the working directory -RUN mkdir -p "${BUILD_ENV_SOURCE}" "${BUILD_ENV_BUILD}" "${BUILD_ENV_INSTALL}" -RUN chown -R ultimaker:ultimaker "${BUILD_ENV_SOURCE}" && \ +RUN mkdir -p "${BUILD_ENV_SOURCE}" "${BUILD_ENV_BUILD}" "${BUILD_ENV_INSTALL}" && \ + chown -R ultimaker:ultimaker "${BUILD_ENV_SOURCE}" && \ chown -R ultimaker:ultimaker "${BUILD_ENV_BUILD}" && \ chown -R ultimaker:ultimaker "${BUILD_ENV_INSTALL}" -ADD . "${BUILD_ENV_SOURCE}" +ADD --chown=1000:1000 . "${BUILD_ENV_SOURCE}" ENV PATH="${BUILD_ENV_INSTALL}/bin:/usr/local/bin/:${PATH}" \ PKG_CONFIG_PATH="${BUILD_ENV_INSTALL}/lib/pkgconfig:${PKG_CONFIG_PATH}" \ LD_LIBRARY_PATH="${BUILD_ENV_INSTALL}/lib:/home/ultimaker/src/install/lib:/lib/x86_64-linux-gnu/:/usr/lib/x86_64-linux-gnu/:${LD_LIBRARY_PATH}" \ - PYTHONPATH=/home/ultimaker/src/install/lib/python3/dist-packages/:/home/ultimaker/env/cura-build-environment/install/lib/python3.10/site-packages/ \ + PYTHONPATH=/home/ultimaker/src/install/lib/python3.10/site-packages/:/home/ultimaker/env/cura-build-environment/install/lib/python3.10/site-packages/ \ HOME=/home/ultimaker \ USER=ultimaker @@ -51,7 +51,7 @@ RUN wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5 # Build the build environment WORKDIR "${BUILD_ENV_BUILD}" -USER ultimaker +USER ultimaker:ultimaker RUN cmake -DCMAKE_BUILD_TYPE=${BUILD_ENV_BUILD_TYPE} \ -DCMAKE_PREFIX_PATH=${BUILD_ENV_INSTALL} \ -DCMAKE_INSTALL_PREFIX=${BUILD_ENV_INSTALL} \ @@ -71,6 +71,6 @@ RUN rm -rf /tmp/* && \ rm -rf "${BUILD_ENV_BUILD}" # Change working directory -USER ultimaker +USER ultimaker:ultimaker WORKDIR /home/ultimaker/src/build CMD /usr/local/bin/cmake From 4065958933368da41e957b390c13bf810c269177 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 25 Mar 2022 13:01:10 +0100 Subject: [PATCH 080/213] Use CMAKE defined flags and compiler for zlib Contributes to CURA-8640 --- projects/zlib.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/zlib.cmake b/projects/zlib.cmake index 951dc9f2..68fed624 100644 --- a/projects/zlib.cmake +++ b/projects/zlib.cmake @@ -2,7 +2,7 @@ if(BUILD_OS_OSX OR BUILD_OS_LINUX) ExternalProject_Add(zlib URL https://www.zlib.net/zlib-1.2.11.tar.gz URL_HASH SHA256=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 - CONFIGURE_COMMAND ./configure --64 --prefix=${CMAKE_INSTALL_PREFIX} + CONFIGURE_COMMAND CXX_FLAGS="${CMAKE_CXX_FLAGS}" CC="${CMAKE_C_COMPILER}" CXX="${CMAKE_CXX_COMPILER}" ./configure --64 --prefix=${CMAKE_INSTALL_PREFIX} BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install BUILD_IN_SOURCE 1 From 61bfdceeb9b520f86961819580ac140af5961a9e Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 25 Mar 2022 13:10:51 +0100 Subject: [PATCH 081/213] Compile against libc++ for Mac Contributes to CURA-8640 --- CMakeLists.txt | 5 +++++ projects/zlib.cmake | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a3201bd..e479d6f1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,6 +57,11 @@ if(Linux) ) endif() +if (APPLE) + message(STATUS "Compiling against libc++") + add_compile_options("-stdlib=libc++") +endif() + file(GLOB _projects projects/*.cmake) foreach(_project ${_projects}) include(${_project}) diff --git a/projects/zlib.cmake b/projects/zlib.cmake index 68fed624..7e1967bc 100644 --- a/projects/zlib.cmake +++ b/projects/zlib.cmake @@ -1,8 +1,13 @@ if(BUILD_OS_OSX OR BUILD_OS_LINUX) + get_property(MAIN_CXX_FLAGS COMPILE_OPTIONS) + if(NOT MAIN_CXX_FLAGS) + message(STATUS" No CXX_FLAGS set for zlib") + set(MAIN_CXX_FLAGS ) + endif() ExternalProject_Add(zlib URL https://www.zlib.net/zlib-1.2.11.tar.gz URL_HASH SHA256=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 - CONFIGURE_COMMAND CXX_FLAGS="${CMAKE_CXX_FLAGS}" CC="${CMAKE_C_COMPILER}" CXX="${CMAKE_CXX_COMPILER}" ./configure --64 --prefix=${CMAKE_INSTALL_PREFIX} + CONFIGURE_COMMAND CXX_FLAGS="${MAIN_CXX_FLAGS}" CC="${CMAKE_C_COMPILER}" CXX="${CMAKE_CXX_COMPILER}" ./configure --64 --prefix=${CMAKE_INSTALL_PREFIX} BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install BUILD_IN_SOURCE 1 From 0c0369db462125dccc4cba283c07055a5e595efe Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 25 Mar 2022 13:13:47 +0100 Subject: [PATCH 082/213] fixed incorrect no arg for get_property Contributes to CURA-8640 --- projects/zlib.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/zlib.cmake b/projects/zlib.cmake index 7e1967bc..2f7350b6 100644 --- a/projects/zlib.cmake +++ b/projects/zlib.cmake @@ -1,5 +1,5 @@ if(BUILD_OS_OSX OR BUILD_OS_LINUX) - get_property(MAIN_CXX_FLAGS COMPILE_OPTIONS) + get_property(MAIN_CXX_FLAGS GLOBAL COMPILE_OPTIONS) if(NOT MAIN_CXX_FLAGS) message(STATUS" No CXX_FLAGS set for zlib") set(MAIN_CXX_FLAGS ) From 6b7912a703ee0b5a299f1dd317c017a479fa234f Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 25 Mar 2022 13:15:01 +0100 Subject: [PATCH 083/213] fixed incorrect no arg for get_property Contributes to CURA-8640 --- projects/zlib.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/zlib.cmake b/projects/zlib.cmake index 2f7350b6..6971b720 100644 --- a/projects/zlib.cmake +++ b/projects/zlib.cmake @@ -1,5 +1,5 @@ if(BUILD_OS_OSX OR BUILD_OS_LINUX) - get_property(MAIN_CXX_FLAGS GLOBAL COMPILE_OPTIONS) + get_property(MAIN_CXX_FLAGS GLOBAL PROPERTY COMPILE_OPTIONS) if(NOT MAIN_CXX_FLAGS) message(STATUS" No CXX_FLAGS set for zlib") set(MAIN_CXX_FLAGS ) From 769cf54767ff19a4d9b450ab0447612ac26f3309 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 25 Mar 2022 13:25:38 +0100 Subject: [PATCH 084/213] old skool Couldn't get the property from some reason Contributes to CURA-8640 --- CMakeLists.txt | 2 +- projects/zlib.cmake | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e479d6f1..39d949d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,7 +59,7 @@ endif() if (APPLE) message(STATUS "Compiling against libc++") - add_compile_options("-stdlib=libc++") + set(CMAKE_CXX_FLAGS ("-stdlib=libc++") endif() file(GLOB _projects projects/*.cmake) diff --git a/projects/zlib.cmake b/projects/zlib.cmake index 6971b720..68fed624 100644 --- a/projects/zlib.cmake +++ b/projects/zlib.cmake @@ -1,13 +1,8 @@ if(BUILD_OS_OSX OR BUILD_OS_LINUX) - get_property(MAIN_CXX_FLAGS GLOBAL PROPERTY COMPILE_OPTIONS) - if(NOT MAIN_CXX_FLAGS) - message(STATUS" No CXX_FLAGS set for zlib") - set(MAIN_CXX_FLAGS ) - endif() ExternalProject_Add(zlib URL https://www.zlib.net/zlib-1.2.11.tar.gz URL_HASH SHA256=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 - CONFIGURE_COMMAND CXX_FLAGS="${MAIN_CXX_FLAGS}" CC="${CMAKE_C_COMPILER}" CXX="${CMAKE_CXX_COMPILER}" ./configure --64 --prefix=${CMAKE_INSTALL_PREFIX} + CONFIGURE_COMMAND CXX_FLAGS="${CMAKE_CXX_FLAGS}" CC="${CMAKE_C_COMPILER}" CXX="${CMAKE_CXX_COMPILER}" ./configure --64 --prefix=${CMAKE_INSTALL_PREFIX} BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install BUILD_IN_SOURCE 1 From e7584575c0c0f09d269a1e0a9340ed0fe9911a0e Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 25 Mar 2022 13:29:51 +0100 Subject: [PATCH 085/213] Allow them to be set from cmd line Contributes to CURA-8640 --- CMakeLists.txt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 39d949d3..5a3201bd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,11 +57,6 @@ if(Linux) ) endif() -if (APPLE) - message(STATUS "Compiling against libc++") - set(CMAKE_CXX_FLAGS ("-stdlib=libc++") -endif() - file(GLOB _projects projects/*.cmake) foreach(_project ${_projects}) include(${_project}) From 77b1f227651bd3f5faa9937fb6ae171a7f0a5d61 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 25 Mar 2022 15:19:00 +0100 Subject: [PATCH 086/213] Configure zlib with CMake Contributes to CURA-8640 --- projects/zlib.cmake | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/projects/zlib.cmake b/projects/zlib.cmake index 68fed624..f2c5ca1f 100644 --- a/projects/zlib.cmake +++ b/projects/zlib.cmake @@ -2,9 +2,11 @@ if(BUILD_OS_OSX OR BUILD_OS_LINUX) ExternalProject_Add(zlib URL https://www.zlib.net/zlib-1.2.11.tar.gz URL_HASH SHA256=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 - CONFIGURE_COMMAND CXX_FLAGS="${CMAKE_CXX_FLAGS}" CC="${CMAKE_C_COMPILER}" CXX="${CMAKE_CXX_COMPILER}" ./configure --64 --prefix=${CMAKE_INSTALL_PREFIX} - BUILD_COMMAND make -j ${N_PROC} - INSTALL_COMMAND make install + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_CXX_STANDARD=17 + -DAMD64=ON BUILD_IN_SOURCE 1 ) endif() From 1be4466548d3cae209334624f4dcfe7551f06b93 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 25 Mar 2022 16:04:03 +0100 Subject: [PATCH 087/213] Configure sqlite with compiler and flag Contributes to CURA-8640 --- projects/sqlite3.cmake | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/projects/sqlite3.cmake b/projects/sqlite3.cmake index ebd70054..3044ae79 100644 --- a/projects/sqlite3.cmake +++ b/projects/sqlite3.cmake @@ -1,8 +1,23 @@ if(BUILD_OS_OSX) + GetFromEnvironmentOrCache( + NAME + CMAKE_CXX_COMPILER + DEFAULT + clang++ + DESCRIPTION + "Specify the CXX compiler to use") + GetFromEnvironmentOrCache( + NAME + CMAKE_C_COMPILER + DEFAULT + clang + DESCRIPTION + "Specify the C compiler to use") + ExternalProject_Add(sqlite3 URL https://sqlite.org/2018/sqlite-autoconf-3260000.tar.gz URL_HASH SHA256=5daa6a3fb7d1e8c767cd59c4ded8da6e4b00c61d3b466d0685e35c4dd6d7bf5d - CONFIGURE_COMMAND ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} --with-sysroot=${CMAKE_OSX_SYSROOT} + CONFIGURE_COMMAND CXXFLAGS="-stdlib=libc++" CCX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} --with-sysroot=${CMAKE_OSX_SYSROOT} BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install BUILD_IN_SOURCE 1 From 37c90e000d01db0c956f432f27b45cc88f76b451 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 25 Mar 2022 16:30:28 +0100 Subject: [PATCH 088/213] Configure openssl with compiler and flag Contributes to CURA-8640 --- projects/openssl.cmake | 16 +++++++++++++++- projects/sqlite3.cmake | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/projects/openssl.cmake b/projects/openssl.cmake index efe26fbc..79dfabdd 100644 --- a/projects/openssl.cmake +++ b/projects/openssl.cmake @@ -4,7 +4,21 @@ if(NOT BUILD_OS_WINDOWS) if(BUILD_OS_LINUX) set(_openssl_configure perl Configure --prefix=${CMAKE_INSTALL_PREFIX} --openssldir=${CMAKE_INSTALL_PREFIX} no-ssl2 no-ssl3 no-zlib shared enable-cms linux-x86_64 enable-ec_nistp_64_gcc_128) elseif(BUILD_OS_OSX) - set(_openssl_configure perl Configure --prefix=${CMAKE_INSTALL_PREFIX} --openssldir=${CMAKE_INSTALL_PREFIX} no-ssl2 no-ssl3 no-zlib shared enable-cms darwin64-x86_64-cc enable-ec_nistp_64_gcc_128) + GetFromEnvironmentOrCache( + NAME + CMAKE_CXX_COMPILER + DEFAULT + clang++ + DESCRIPTION + "Specify the CXX compiler to use") + GetFromEnvironmentOrCache( + NAME + CMAKE_C_COMPILER + DEFAULT + clang + DESCRIPTION + "Specify the C compiler to use") + set(_openssl_configure CXXFLAGS="-stdlib=libc++" CXX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} perl Configure --prefix=${CMAKE_INSTALL_PREFIX} --openssldir=${CMAKE_INSTALL_PREFIX} no-ssl2 no-ssl3 no-zlib shared enable-cms darwin64-x86_64-cc enable-ec_nistp_64_gcc_128) endif() ExternalProject_Add(OpenSSL diff --git a/projects/sqlite3.cmake b/projects/sqlite3.cmake index 3044ae79..affc2c40 100644 --- a/projects/sqlite3.cmake +++ b/projects/sqlite3.cmake @@ -17,7 +17,7 @@ if(BUILD_OS_OSX) ExternalProject_Add(sqlite3 URL https://sqlite.org/2018/sqlite-autoconf-3260000.tar.gz URL_HASH SHA256=5daa6a3fb7d1e8c767cd59c4ded8da6e4b00c61d3b466d0685e35c4dd6d7bf5d - CONFIGURE_COMMAND CXXFLAGS="-stdlib=libc++" CCX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} --with-sysroot=${CMAKE_OSX_SYSROOT} + CONFIGURE_COMMAND CXXFLAGS="-stdlib=libc++" CXX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} --with-sysroot=${CMAKE_OSX_SYSROOT} BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install BUILD_IN_SOURCE 1 From dc3541aa3b9f58b8c2126d39df62dd6a187d247a Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 25 Mar 2022 16:35:37 +0100 Subject: [PATCH 089/213] Configure libffi with compiler and flag Contributes to CURA-8640 --- projects/libffi.cmake | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/projects/libffi.cmake b/projects/libffi.cmake index 873d7639..2b3bda3b 100644 --- a/projects/libffi.cmake +++ b/projects/libffi.cmake @@ -1,14 +1,28 @@ if(NOT BUILD_OS_WINDOWS) - set(_libffi_config_cmd - ./configure --disable-dependency-tracking --disable-silent-rules --enable-portable-binary - --prefix=${CMAKE_INSTALL_PREFIX} - ) if(BUILD_OS_OSX) + GetFromEnvironmentOrCache( + NAME + CMAKE_CXX_COMPILER + DEFAULT + clang++ + DESCRIPTION + "Specify the CXX compiler to use") + GetFromEnvironmentOrCache( + NAME + CMAKE_C_COMPILER + DEFAULT + clang + DESCRIPTION + "Specify the C compiler to use") + + set(_libffi_config_cmd CXXFLAGS="-stdlib=libc++" CXX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} ./configure --disable-dependency-tracking --disable-silent-rules --enable-portable-binary --prefix=${CMAKE_INSTALL_PREFIX}) if(CMAKE_OSX_SYSROOT) # On OS X, make sure the right OS X SDK is used. list(APPEND _libffi_config_cmd --with-sysroot=${CMAKE_OSX_SYSROOT}) endif() + else() + set(_libffi_config_cmd ./configure --disable-dependency-tracking --disable-silent-rules --enable-portable-binary --prefix=${CMAKE_INSTALL_PREFIX}) endif() ExternalProject_Add(libffi From cb38cbc65f739c283d417cde406e64d7f79a9718 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 25 Mar 2022 16:36:46 +0100 Subject: [PATCH 090/213] Removed libnest2d_find_clipper Clipper should be installed correctly by the dependency itself Contributes to CURA-8640 --- projects/libnest2d_find_clipper.cmake | 92 --------------------------- 1 file changed, 92 deletions(-) delete mode 100644 projects/libnest2d_find_clipper.cmake diff --git a/projects/libnest2d_find_clipper.cmake b/projects/libnest2d_find_clipper.cmake deleted file mode 100644 index 264f1e07..00000000 --- a/projects/libnest2d_find_clipper.cmake +++ /dev/null @@ -1,92 +0,0 @@ -# Find Clipper library (http://www.angusj.com/delphi/clipper.php). -# The following variables are set -# -# CLIPPER_FOUND -# CLIPPER_INCLUDE_DIRS -# CLIPPER_LIBRARIES -# -# It searches the environment variable $CLIPPER_PATH automatically. - -unset(CLIPPER_FOUND CACHE) -unset(CLIPPER_INCLUDE_DIRS CACHE) -unset(CLIPPER_LIBRARIES CACHE) -unset(CLIPPER_LIBRARIES_RELEASE CACHE) -unset(CLIPPER_LIBRARIES_DEBUG CACHE) - -if(CMAKE_BUILD_TYPE MATCHES "(Debug|DEBUG|debug)") - set(CLIPPER_BUILD_TYPE DEBUG) -else() - set(CLIPPER_BUILD_TYPE RELEASE) -endif() - -FIND_PATH(CLIPPER_INCLUDE_DIRS clipper.hpp - $ENV{CLIPPER_PATH}/ - $ENV{CLIPPER_PATH}/cpp/ - $ENV{CLIPPER_PATH}/include/ - $ENV{CLIPPER_PATH}/include/polyclipping/ - ${PROJECT_SOURCE_DIR}/python/pymesh/third_party/include/ - ${PROJECT_SOURCE_DIR}/python/pymesh/third_party/include/polyclipping/ - ${CMAKE_PREFIX_PATH}/include/polyclipping/ - ${CMAKE_PREFIX_PATH}/include/ - ${CMAKE_INSTALL_PREFIX}/include/polyclipping/ - ${CMAKE_INSTALL_PREFIX}/include/ - /opt/local/include/ - /opt/local/include/polyclipping/ - /usr/local/include/ - /usr/local/include/polyclipping/ - /usr/include/ - /usr/include/polyclipping/) - -set(LIB_SEARCHDIRS - $ENV{CLIPPER_PATH} - $ENV{CLIPPER_PATH}/cpp/ - $ENV{CLIPPER_PATH}/cpp/build/ - $ENV{CLIPPER_PATH}/lib/ - $ENV{CLIPPER_PATH}/lib/polyclipping/ - ${PROJECT_SOURCE_DIR}/python/pymesh/third_party/lib/ - ${PROJECT_SOURCE_DIR}/python/pymesh/third_party/lib/polyclipping/ - ${CMAKE_PREFIX_PATH}/lib/ - ${CMAKE_PREFIX_PATH}/lib/polyclipping/ - ${CMAKE_INSTALL_PREFIX}/lib/ - ${CMAKE_INSTALL_PREFIX}/lib/polyclipping/ - /opt/local/lib/ - /opt/local/lib/polyclipping/ - /usr/local/lib/ - /usr/local/lib/polyclipping/ - /usr/lib/polyclipping -) - -set(_deb_postfix "d") - -FIND_LIBRARY(CLIPPER_LIBRARIES_RELEASE polyclipping ${LIB_SEARCHDIRS}) -FIND_LIBRARY(CLIPPER_LIBRARIES_DEBUG polyclipping${_deb_postfix} ${LIB_SEARCHDIRS}) - -if(CLIPPER_LIBRARIES_${CLIPPER_BUILD_TYPE}) - set(CLIPPER_LIBRARIES "${CLIPPER_LIBRARIES_${CLIPPER_BUILD_TYPE}}") -else() - set(CLIPPER_LIBRARIES "${CLIPPER_LIBRARIES_RELEASE}") -endif() - -include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(Clipper - "Clipper library cannot be found. Consider set CLIPPER_PATH environment variable" - CLIPPER_INCLUDE_DIRS - CLIPPER_LIBRARIES) - -MARK_AS_ADVANCED( - CLIPPER_INCLUDE_DIRS - CLIPPER_LIBRARIES) - -if(CLIPPER_FOUND) - add_library(Clipper::Clipper UNKNOWN IMPORTED) - set_target_properties(Clipper::Clipper PROPERTIES IMPORTED_LOCATION ${CLIPPER_LIBRARIES}) - set_target_properties(Clipper::Clipper PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CLIPPER_INCLUDE_DIRS}) - if(CLIPPER_LIBRARIES_RELEASE AND CLIPPER_LIBRARIES_DEBUG) - set_target_properties(Clipper::Clipper PROPERTIES - IMPORTED_LOCATION_DEBUG ${CLIPPER_LIBRARIES_DEBUG} - IMPORTED_LOCATION_RELWITHDEBINFO ${CLIPPER_LIBRARIES_RELEASE} - IMPORTED_LOCATION_RELEASE ${CLIPPER_LIBRARIES_RELEASE} - IMPORTED_LOCATION_MINSIZEREL ${CLIPPER_LIBRARIES_RELEASE} - ) - endif() -endif() From 358feb623055101f6f40b2381405a248b9627b8c Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 25 Mar 2022 16:39:53 +0100 Subject: [PATCH 091/213] Make sure that xz is compiled with clang on Mac Contributes to CURA-8640 --- projects/xz.cmake | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/projects/xz.cmake b/projects/xz.cmake index 64e7a91f..4f5d6d8d 100644 --- a/projects/xz.cmake +++ b/projects/xz.cmake @@ -1,8 +1,22 @@ if(BUILD_OS_OSX) + GetFromEnvironmentOrCache( + NAME + CMAKE_CXX_COMPILER + DEFAULT + clang++ + DESCRIPTION + "Specify the CXX compiler to use") + GetFromEnvironmentOrCache( + NAME + CMAKE_C_COMPILER + DEFAULT + clang + DESCRIPTION + "Specify the C compiler to use") ExternalProject_Add(xz GIT_REPOSITORY https://git.tukaani.org/xz.git GIT_TAG v5.2.4 - CONFIGURE_COMMAND ./autogen.sh && ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} --with-sysroot=${CMAKE_OSX_SYSROOT} + CONFIGURE_COMMAND ./autogen.sh && CXXFLAGS="-stdlib=libc++" CXX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} --with-sysroot=${CMAKE_OSX_SYSROOT} BUILD_COMMAND make -j ${N_PROC} INSTALL_COMMAND make install BUILD_IN_SOURCE 1 From 1cc2f35239c5794abd41b010c59dcf843a84f635 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 25 Mar 2022 16:48:39 +0100 Subject: [PATCH 092/213] Configure OpenBLAS with CMake Contributes to CURA-8640 --- projects/openblas.cmake | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/projects/openblas.cmake b/projects/openblas.cmake index 05183236..fc0999dc 100644 --- a/projects/openblas.cmake +++ b/projects/openblas.cmake @@ -6,10 +6,9 @@ if(NOT BUILD_OS_WINDOWS) ExternalProject_Add(OpenBLAS URL https://github.com/xianyi/OpenBLAS/archive/v0.3.13.tar.gz URL_HASH SHA256=79197543b17cc314b7e43f7a33148c308b0807cd6381ee77f77e15acf3e6459e - CONFIGURE_COMMAND "" - BUILD_COMMAND make -j ${N_PROC} PREFIX=${CMAKE_INSTALL_PREFIX} ${openblas_options} - INSTALL_COMMAND make PREFIX=${CMAKE_INSTALL_PREFIX} ${openblas_options} install - BUILD_IN_SOURCE 1 + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} ) else() add_custom_target(OpenBLAS) From f4e8bfece362d41c2b70a7a5d5965d8be6b5af44 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 28 Mar 2022 10:26:48 +0200 Subject: [PATCH 093/213] Use github as source for zlib Contributes to CURA-8640 --- projects/zlib.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/zlib.cmake b/projects/zlib.cmake index f2c5ca1f..681d4088 100644 --- a/projects/zlib.cmake +++ b/projects/zlib.cmake @@ -1,12 +1,12 @@ if(BUILD_OS_OSX OR BUILD_OS_LINUX) ExternalProject_Add(zlib - URL https://www.zlib.net/zlib-1.2.11.tar.gz - URL_HASH SHA256=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 + GIT_REPOSITORY https://github.com/madler/zlib.git + GIT_TAG v1.2.11 + GIT_SHALLOW 1 CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_CXX_STANDARD=17 -DAMD64=ON - BUILD_IN_SOURCE 1 ) endif() From 0304192876b68bf00aa603c873693893db4d105d Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 28 Mar 2022 12:37:50 +0200 Subject: [PATCH 094/213] allow specify compiler on MacOS for Python Contributes to CURA-8640 --- projects/python.cmake | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/projects/python.cmake b/projects/python.cmake index 2acfd759..cb4344b7 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -1,4 +1,23 @@ -set(python_configure_command ./configure --prefix=${CMAKE_INSTALL_PREFIX} --enable-shared --enable-ipv6 --without-pymalloc ) +if(BUILD_OS_OSX) + GetFromEnvironmentOrCache( + NAME + CMAKE_CXX_COMPILER + DEFAULT + clang++ + DESCRIPTION + "Specify the CXX compiler to use") + GetFromEnvironmentOrCache( + NAME + CMAKE_C_COMPILER + DEFAULT + clang + DESCRIPTION + "Specify the C compiler to use") + set(python_configure_command CXXFLAGS="-stdlib=libc++" CXX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} ./configure --prefix=${CMAKE_INSTALL_PREFIX} --enable-shared --enable-ipv6 --without-pymalloc ) +else() + set(python_configure_command ./configure --prefix=${CMAKE_INSTALL_PREFIX} --enable-shared --enable-ipv6 --without-pymalloc ) + +endif() set(python_build_command make -j ${N_PROC}) set(python_install_command make install) set(patch_command ) From 5e414f65a45e220bd4e4c9630d4f3d2cf860e8f8 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 28 Mar 2022 13:18:29 +0200 Subject: [PATCH 095/213] Revert "Removed libnest2d_find_clipper" This reverts commit cb38cbc65f739c283d417cde406e64d7f79a9718. --- projects/libnest2d_find_clipper.cmake | 92 +++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 projects/libnest2d_find_clipper.cmake diff --git a/projects/libnest2d_find_clipper.cmake b/projects/libnest2d_find_clipper.cmake new file mode 100644 index 00000000..264f1e07 --- /dev/null +++ b/projects/libnest2d_find_clipper.cmake @@ -0,0 +1,92 @@ +# Find Clipper library (http://www.angusj.com/delphi/clipper.php). +# The following variables are set +# +# CLIPPER_FOUND +# CLIPPER_INCLUDE_DIRS +# CLIPPER_LIBRARIES +# +# It searches the environment variable $CLIPPER_PATH automatically. + +unset(CLIPPER_FOUND CACHE) +unset(CLIPPER_INCLUDE_DIRS CACHE) +unset(CLIPPER_LIBRARIES CACHE) +unset(CLIPPER_LIBRARIES_RELEASE CACHE) +unset(CLIPPER_LIBRARIES_DEBUG CACHE) + +if(CMAKE_BUILD_TYPE MATCHES "(Debug|DEBUG|debug)") + set(CLIPPER_BUILD_TYPE DEBUG) +else() + set(CLIPPER_BUILD_TYPE RELEASE) +endif() + +FIND_PATH(CLIPPER_INCLUDE_DIRS clipper.hpp + $ENV{CLIPPER_PATH}/ + $ENV{CLIPPER_PATH}/cpp/ + $ENV{CLIPPER_PATH}/include/ + $ENV{CLIPPER_PATH}/include/polyclipping/ + ${PROJECT_SOURCE_DIR}/python/pymesh/third_party/include/ + ${PROJECT_SOURCE_DIR}/python/pymesh/third_party/include/polyclipping/ + ${CMAKE_PREFIX_PATH}/include/polyclipping/ + ${CMAKE_PREFIX_PATH}/include/ + ${CMAKE_INSTALL_PREFIX}/include/polyclipping/ + ${CMAKE_INSTALL_PREFIX}/include/ + /opt/local/include/ + /opt/local/include/polyclipping/ + /usr/local/include/ + /usr/local/include/polyclipping/ + /usr/include/ + /usr/include/polyclipping/) + +set(LIB_SEARCHDIRS + $ENV{CLIPPER_PATH} + $ENV{CLIPPER_PATH}/cpp/ + $ENV{CLIPPER_PATH}/cpp/build/ + $ENV{CLIPPER_PATH}/lib/ + $ENV{CLIPPER_PATH}/lib/polyclipping/ + ${PROJECT_SOURCE_DIR}/python/pymesh/third_party/lib/ + ${PROJECT_SOURCE_DIR}/python/pymesh/third_party/lib/polyclipping/ + ${CMAKE_PREFIX_PATH}/lib/ + ${CMAKE_PREFIX_PATH}/lib/polyclipping/ + ${CMAKE_INSTALL_PREFIX}/lib/ + ${CMAKE_INSTALL_PREFIX}/lib/polyclipping/ + /opt/local/lib/ + /opt/local/lib/polyclipping/ + /usr/local/lib/ + /usr/local/lib/polyclipping/ + /usr/lib/polyclipping +) + +set(_deb_postfix "d") + +FIND_LIBRARY(CLIPPER_LIBRARIES_RELEASE polyclipping ${LIB_SEARCHDIRS}) +FIND_LIBRARY(CLIPPER_LIBRARIES_DEBUG polyclipping${_deb_postfix} ${LIB_SEARCHDIRS}) + +if(CLIPPER_LIBRARIES_${CLIPPER_BUILD_TYPE}) + set(CLIPPER_LIBRARIES "${CLIPPER_LIBRARIES_${CLIPPER_BUILD_TYPE}}") +else() + set(CLIPPER_LIBRARIES "${CLIPPER_LIBRARIES_RELEASE}") +endif() + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Clipper + "Clipper library cannot be found. Consider set CLIPPER_PATH environment variable" + CLIPPER_INCLUDE_DIRS + CLIPPER_LIBRARIES) + +MARK_AS_ADVANCED( + CLIPPER_INCLUDE_DIRS + CLIPPER_LIBRARIES) + +if(CLIPPER_FOUND) + add_library(Clipper::Clipper UNKNOWN IMPORTED) + set_target_properties(Clipper::Clipper PROPERTIES IMPORTED_LOCATION ${CLIPPER_LIBRARIES}) + set_target_properties(Clipper::Clipper PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CLIPPER_INCLUDE_DIRS}) + if(CLIPPER_LIBRARIES_RELEASE AND CLIPPER_LIBRARIES_DEBUG) + set_target_properties(Clipper::Clipper PROPERTIES + IMPORTED_LOCATION_DEBUG ${CLIPPER_LIBRARIES_DEBUG} + IMPORTED_LOCATION_RELWITHDEBINFO ${CLIPPER_LIBRARIES_RELEASE} + IMPORTED_LOCATION_RELEASE ${CLIPPER_LIBRARIES_RELEASE} + IMPORTED_LOCATION_MINSIZEREL ${CLIPPER_LIBRARIES_RELEASE} + ) + endif() +endif() From 6403f4949389b065d7e2f256365b6f4e5d7e6802 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 28 Mar 2022 16:54:02 +0200 Subject: [PATCH 096/213] Added some missing libraries pyinstaller is missing dbus, and a couple of wayland libs Contributes to CURA-8640 --- docker/linux/Dockerfile.debian | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index d1a587c4..f3ec6efa 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -23,7 +23,8 @@ RUN apt update -y && \ apt upgrade -y && \ apt install -y build-essential g++ gfortran libtool make autoconf automake git curl wget cmake tar \ libffi-dev pkg-config libx11-xcb-dev libxcb* libfreetype6-dev libgl1-mesa-dev libegl1-mesa libxkbcommon-dev \ - libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev autopoint + libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev autopoint libdbus \ + libwayland-cursor++0 libwayland-egl++0 # Set up the working directory RUN mkdir -p "${BUILD_ENV_SOURCE}" "${BUILD_ENV_BUILD}" "${BUILD_ENV_INSTALL}" && \ From 18bf199c5966f29c2403d0b2106604d178bc9a7c Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 28 Mar 2022 16:59:33 +0200 Subject: [PATCH 097/213] Remove libwayland-egl not part of the architecture Contributes to CURA-8640 --- docker/linux/Dockerfile.debian | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index f3ec6efa..df614ecc 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -24,7 +24,7 @@ RUN apt update -y && \ apt install -y build-essential g++ gfortran libtool make autoconf automake git curl wget cmake tar \ libffi-dev pkg-config libx11-xcb-dev libxcb* libfreetype6-dev libgl1-mesa-dev libegl1-mesa libxkbcommon-dev \ libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev autopoint libdbus \ - libwayland-cursor++0 libwayland-egl++0 + libwayland-cursor++0 # Set up the working directory RUN mkdir -p "${BUILD_ENV_SOURCE}" "${BUILD_ENV_BUILD}" "${BUILD_ENV_INSTALL}" && \ From 4b3646e32858e04242bab672c1f7894e90063e20 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 28 Mar 2022 17:03:24 +0200 Subject: [PATCH 098/213] Revert "Remove libwayland-egl" This reverts commit 18bf199c5966f29c2403d0b2106604d178bc9a7c. --- docker/linux/Dockerfile.debian | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index df614ecc..f3ec6efa 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -24,7 +24,7 @@ RUN apt update -y && \ apt install -y build-essential g++ gfortran libtool make autoconf automake git curl wget cmake tar \ libffi-dev pkg-config libx11-xcb-dev libxcb* libfreetype6-dev libgl1-mesa-dev libegl1-mesa libxkbcommon-dev \ libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev autopoint libdbus \ - libwayland-cursor++0 + libwayland-cursor++0 libwayland-egl++0 # Set up the working directory RUN mkdir -p "${BUILD_ENV_SOURCE}" "${BUILD_ENV_BUILD}" "${BUILD_ENV_INSTALL}" && \ From b47556a513fc8961914cd3fc5b02518ecdb422b2 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 28 Mar 2022 17:03:25 +0200 Subject: [PATCH 099/213] Revert "Added some missing libraries" This reverts commit 6403f4949389b065d7e2f256365b6f4e5d7e6802. --- docker/linux/Dockerfile.debian | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index f3ec6efa..d1a587c4 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -23,8 +23,7 @@ RUN apt update -y && \ apt upgrade -y && \ apt install -y build-essential g++ gfortran libtool make autoconf automake git curl wget cmake tar \ libffi-dev pkg-config libx11-xcb-dev libxcb* libfreetype6-dev libgl1-mesa-dev libegl1-mesa libxkbcommon-dev \ - libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev autopoint libdbus \ - libwayland-cursor++0 libwayland-egl++0 + libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev autopoint # Set up the working directory RUN mkdir -p "${BUILD_ENV_SOURCE}" "${BUILD_ENV_BUILD}" "${BUILD_ENV_INSTALL}" && \ From a61aa11f489352b5dad3c4cff3da228b6578a52e Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 29 Mar 2022 08:01:14 +0200 Subject: [PATCH 100/213] Added wayland and dbus shared libs Contributes to CURA-8640 --- docker/linux/Dockerfile.debian | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile.debian index d1a587c4..a44c7035 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile.debian @@ -23,7 +23,8 @@ RUN apt update -y && \ apt upgrade -y && \ apt install -y build-essential g++ gfortran libtool make autoconf automake git curl wget cmake tar \ libffi-dev pkg-config libx11-xcb-dev libxcb* libfreetype6-dev libgl1-mesa-dev libegl1-mesa libxkbcommon-dev \ - libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev autopoint + libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev autopoint \ + libdbus-1-3 libwayland-egl1 libwayland-cursor0 # Set up the working directory RUN mkdir -p "${BUILD_ENV_SOURCE}" "${BUILD_ENV_BUILD}" "${BUILD_ENV_INSTALL}" && \ From aed27b03505060d97ddc75590464c8a45620dbf6 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 29 Mar 2022 09:33:52 +0200 Subject: [PATCH 101/213] Python don't use git repo To big a repo Contributes to CURA-8640 --- projects/python.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/python.cmake b/projects/python.cmake index cb4344b7..2b3f4238 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -48,8 +48,8 @@ if(BUILD_OS_LINUX) endif() ExternalProject_Add(Python - GIT_REPOSITORY https://github.com/python/cpython.git - GIT_TAG v3.10.2 + URL https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgz + URL_HASH SHA256=3c0ede893011319f9b0a56b44953a3d52c7abf9657c23fb4bc9ced93b86e9c97 PATCH_COMMAND "${patch_command}" CONFIGURE_COMMAND "${python_configure_command}" BUILD_COMMAND ${python_build_command} From 2a192edb0640eda6e7529b1db4d153ad2d8b852a Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 29 Mar 2022 11:06:16 +0200 Subject: [PATCH 102/213] Multistage Docker With increased git postbuffer Contributes to CURA-8640 --- docker/linux/{Dockerfile.debian => Dockerfile} | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) rename docker/linux/{Dockerfile.debian => Dockerfile} (93%) diff --git a/docker/linux/Dockerfile.debian b/docker/linux/Dockerfile similarity index 93% rename from docker/linux/Dockerfile.debian rename to docker/linux/Dockerfile index a44c7035..7bdefd56 100644 --- a/docker/linux/Dockerfile.debian +++ b/docker/linux/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:buster +FROM debian:buster AS base_environment LABEL linux_distro="debian-buster" \ architecture="amd64" \ @@ -27,6 +27,7 @@ RUN apt update -y && \ libdbus-1-3 libwayland-egl1 libwayland-cursor0 # Set up the working directory +RUN git config --global http.postBuffer 100000000 RUN mkdir -p "${BUILD_ENV_SOURCE}" "${BUILD_ENV_BUILD}" "${BUILD_ENV_INSTALL}" && \ chown -R ultimaker:ultimaker "${BUILD_ENV_SOURCE}" && \ chown -R ultimaker:ultimaker "${BUILD_ENV_BUILD}" && \ @@ -50,6 +51,14 @@ RUN wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5 rm -rf cmake-3.21.5 && \ apt-get remove -y cmake +# Cleanup +USER root +WORKDIR / +RUN rm -rf /tmp/* && \ + rm -rf /var/cache \ + +FROM base_environment AS cura_build_environment + # Build the build environment WORKDIR "${BUILD_ENV_BUILD}" USER ultimaker:ultimaker @@ -66,9 +75,7 @@ RUN cmake --install "${BUILD_ENV_BUILD}" # Cleanup USER root WORKDIR / -RUN rm -rf /tmp/* && \ - rm -rf /var/cache \ - rm -rf "${BUILD_ENV_SOURCE}" \ +RUN rm -rf "${BUILD_ENV_SOURCE}" \ rm -rf "${BUILD_ENV_BUILD}" # Change working directory From 7617bd974fee2d611ebb62ed0047f9ea80ca18c6 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 30 Mar 2022 05:06:15 +0200 Subject: [PATCH 103/213] Build external projects with Conan usage: ```bash mkdir build && cd build conan install .. --build=missing cmake --toolchain conan_toolchain.cmake .. cmake --build .. ``` Contributes to CURA-8640 --- CMakeLists.txt | 48 +----- cmake/BuildPlatformDetection.cmake | 24 --- cmake/Python.cmake | 17 -- cmake/SetProjectDependencies.cmake | 25 --- conanfile.txt | 18 ++ docker/linux/Dockerfile | 85 +++++---- env_osx.sh | 32 ---- ...-link-libpython-against-libcrypt-GH-.patch | 66 ------- .../0002-install-location-runtime-libs.patch | 17 -- projects/arcus.cmake | 66 ++----- projects/base_requirements.txt | 161 ------------------ projects/boost_headers.cmake | 12 -- projects/build_python_windows.bat | 5 - projects/bzip2.cmake | 21 --- projects/bzip2_shared.patch | 11 -- projects/clipper.cmake | 16 -- projects/googletest.cmake | 26 --- projects/install_python_windows.bat | 78 --------- projects/libffi.cmake | 36 ---- projects/libnest2d.cmake | 35 ++-- projects/libnest2d_find_clipper.cmake | 92 ---------- projects/nlopt.cmake | 14 -- projects/openblas.cmake | 17 -- projects/openssl.cmake | 32 ---- projects/protobuf.cmake | 84 --------- projects/pynest2d.cmake | 31 ++-- projects/python.cmake | 102 ++++------- projects/python_packages.cmake | 27 --- projects/requirements.txt | 152 +++++++++++++++++ projects/savitar.cmake | 32 ++-- projects/sqlite3.cmake | 37 ---- projects/xz.cmake | 33 ---- projects/zlib.cmake | 12 -- 33 files changed, 298 insertions(+), 1166 deletions(-) delete mode 100644 cmake/BuildPlatformDetection.cmake delete mode 100644 cmake/Python.cmake delete mode 100644 cmake/SetProjectDependencies.cmake create mode 100644 conanfile.txt delete mode 100644 env_osx.sh delete mode 100644 projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch delete mode 100644 projects/0002-install-location-runtime-libs.patch delete mode 100644 projects/base_requirements.txt delete mode 100644 projects/boost_headers.cmake delete mode 100644 projects/build_python_windows.bat delete mode 100644 projects/bzip2.cmake delete mode 100644 projects/bzip2_shared.patch delete mode 100644 projects/clipper.cmake delete mode 100644 projects/googletest.cmake delete mode 100644 projects/install_python_windows.bat delete mode 100644 projects/libffi.cmake delete mode 100644 projects/libnest2d_find_clipper.cmake delete mode 100644 projects/nlopt.cmake delete mode 100644 projects/openblas.cmake delete mode 100644 projects/openssl.cmake delete mode 100644 projects/protobuf.cmake delete mode 100644 projects/python_packages.cmake delete mode 100644 projects/sqlite3.cmake delete mode 100644 projects/xz.cmake delete mode 100644 projects/zlib.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a3201bd..650d1f03 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,55 +11,19 @@ GetFromEnvironmentOrCache( "Specify the minimum version of the target platform (e.g. macOS or iOS)") project(cura-build-environment) - cmake_minimum_required(VERSION 3.18) -include(ProcessorCount) - include(ExternalProject) include(GNUInstallDirs) - -include(BuildPlatformDetection) -include(SetProjectDependencies) +include(ProcessorCount) ProcessorCount(N_PROC) if(N_PROC EQUAL 0) set(N_PROC 1) endif() -# Hard-code the CPython executable to use later because all find_package() -# commands are executed when the Makefiles are generated. Because we need to -# compile CPython first, all other projects that require Python must use our -# compiled one. Because we cannot use find_package() to find Python at runtime, -# we have to hard-code the CPython executable that will be created later. All -# projects that requires Python must use the variable Python3_EXECUTABLE so they -# will use the right CPython. -if(WIN32) - # Minimalistic preinstalled Python on Windows: - set(Python3_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/python.exe) -else() - # All other OSs like OSX - set(Python3_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/python3) -endif() - -# Build projects step -add_custom_target(projects ALL COMMENT "Building Projects...") - -# On Linux, make sure that we use "lib" for libraries and create a symlink "lib64" pointing to "lib". -if(Linux) - message(STATUS "Prepare lib and lib64 on Linux...") - execute_process( - COMMAND mkdir -p "${CMAKE_INSTALL_PREFIX}/lib" - ) - execute_process( - COMMAND ln -s "lib" "lib64" - WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}" - ) -endif() - -file(GLOB _projects projects/*.cmake) -foreach(_project ${_projects}) - include(${_project}) -endforeach() - -ProcessProjectDependencies(TARGET projects) +include(projects/python.cmake) +include(projects/libnest2d.cmake) +include(projects/pynest2d.cmake) +include(projects/arcus.cmake) +include(projects/savitar.cmake) \ No newline at end of file diff --git a/cmake/BuildPlatformDetection.cmake b/cmake/BuildPlatformDetection.cmake deleted file mode 100644 index 87848b9a..00000000 --- a/cmake/BuildPlatformDetection.cmake +++ /dev/null @@ -1,24 +0,0 @@ -set(BUILD_OS_OSX OFF) -set(BUILD_OS_LINUX OFF) -set(BUILD_OS_WINDOWS OFF) -set(BUILD_OS_WIN32 OFF) -set(BUILD_OS_WIN64 OFF) - -if(APPLE) - set(BUILD_OS_OSX ON) - message(STATUS "Building for OSX") -elseif(WIN32) - set(BUILD_OS_WINDOWS ON) - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(BUILD_OS_WIN64 ON) - message(STATUS "Building for 64-bit Windows") - elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(BUILD_OS_WIN32 ON) - message(STATUS "Building for 32-bit Windows") - else() - message(FATAL_ERROR "Could not determine platform architecture!") - endif() -elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") - set(BUILD_OS_LINUX ON) - message(STATUS "Building for Linux") -endif() diff --git a/cmake/Python.cmake b/cmake/Python.cmake deleted file mode 100644 index 44359cb5..00000000 --- a/cmake/Python.cmake +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (c) 2022 Ultimaker B.V. - -if(NOT Python_FOUND) - GetFromEnvironmentOrCache( - NAME - Python_VERSION - DEFAULT - 3.10 - DESCRIPTION - "Python Version to use" - REQUIRED) - if(APPLE) - set(Python_FIND_FRAMEWORK NEVER) - endif() - find_package(Python ${Python_VERSION} EXACT REQUIRED COMPONENTS Interpreter Development) - message(STATUS "Using Python ${Python_VERSION}") -endif() \ No newline at end of file diff --git a/cmake/SetProjectDependencies.cmake b/cmake/SetProjectDependencies.cmake deleted file mode 100644 index 3bc40fcd..00000000 --- a/cmake/SetProjectDependencies.cmake +++ /dev/null @@ -1,25 +0,0 @@ - -include(CMakeParseArguments) - -macro(SetProjectDependencies) - set(_single_value_args TARGET) - set(_multi_value_args DEPENDS) - cmake_parse_arguments("" "" "${_single_value_args}" "${_multi_value_args}" ${ARGN}) - - list(APPEND ALL_PROJECT_TARGETS ${_TARGET}) - - set_property(TARGET ${_TARGET} PROPERTY PROJECT_DEPENDS ${_DEPENDS}) -endmacro() - -macro(ProcessProjectDependencies) - set(_single_value_args TARGET) - cmake_parse_arguments("" "" "${_single_value_args}" "" ${ARGN}) - - foreach(_project ${ALL_PROJECT_TARGETS}) - get_property(_depends TARGET ${_project} PROPERTY PROJECT_DEPENDS) - if(_depends) - add_dependencies(${_project} ${_depends}) - endif() - add_dependencies(${_TARGET} ${_project}) - endforeach() -endmacro() diff --git a/conanfile.txt b/conanfile.txt new file mode 100644 index 00000000..b9ac4441 --- /dev/null +++ b/conanfile.txt @@ -0,0 +1,18 @@ +[requires] +cpython/3.10.0 +protobuf/3.17.1 +clipper/6.4.2 +boost/1.70.0 +gtest/1.8.1 +nlopt/2.7.0 + +[generators] +virtualrunenv +CMakeDeps +CMakeToolchain + +[options] +cpython:optimizations=True +cpython:lto=True +cpython:shared=True +cpython:pymalloc=False \ No newline at end of file diff --git a/docker/linux/Dockerfile b/docker/linux/Dockerfile index 7bdefd56..4161be04 100644 --- a/docker/linux/Dockerfile +++ b/docker/linux/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:buster AS base_environment +FROM debian:buster AS base LABEL linux_distro="debian-buster" \ architecture="amd64" \ @@ -6,13 +6,11 @@ LABEL linux_distro="debian-buster" \ qt_version="6.2.2" # Set build time arguments -ARG BUILD_ENV_BUILD_TYPE=Release -ARG BUILD_ENV_SOURCE="/home/ultimaker/env/cura-build-environment/source" -ARG BUILD_ENV_INSTALL="/home/ultimaker/env/cura-build-environment/install" -ARG BUILD_ENV_BUILD="/home/ultimaker/env/cura-build-environment/build" -ARG ARCUS_BRANCH_OR_TAG=master -ARG SAVITAR_BRANCH_OR_TAG=master -ARG PYNEST2D_BRANCH_OR_TAG=master +ARG SOURCE="/home/ultimaker/source" +ARG INSTALL="/home/ultimaker/install" +ARG BUILD="/home/ultimaker/build" +ARG ENVIRONMENT="/home/ultimaker/env" +ARG CONAN_DATA="/home/ultimaker/.conan/data" # Create unprivileged user RUN groupadd -g 1000 ultimaker && \ @@ -24,23 +22,22 @@ RUN apt update -y && \ apt install -y build-essential g++ gfortran libtool make autoconf automake git curl wget cmake tar \ libffi-dev pkg-config libx11-xcb-dev libxcb* libfreetype6-dev libgl1-mesa-dev libegl1-mesa libxkbcommon-dev \ libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev autopoint \ - libdbus-1-3 libwayland-egl1 libwayland-cursor0 + libdbus-1-3 libwayland-egl1 libwayland-cursor0 ninja-build zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev \ + libsqlite3-dev libreadline-dev libbz2-dev libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev \ + libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev \ + libxft-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev \ + libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev \ + libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev \ + libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev \ + xkb-data libxcb-dri3-dev uuid-dev libxcb-util0-dev -# Set up the working directory -RUN git config --global http.postBuffer 100000000 -RUN mkdir -p "${BUILD_ENV_SOURCE}" "${BUILD_ENV_BUILD}" "${BUILD_ENV_INSTALL}" && \ - chown -R ultimaker:ultimaker "${BUILD_ENV_SOURCE}" && \ - chown -R ultimaker:ultimaker "${BUILD_ENV_BUILD}" && \ - chown -R ultimaker:ultimaker "${BUILD_ENV_INSTALL}" -ADD --chown=1000:1000 . "${BUILD_ENV_SOURCE}" - -ENV PATH="${BUILD_ENV_INSTALL}/bin:/usr/local/bin/:${PATH}" \ - PKG_CONFIG_PATH="${BUILD_ENV_INSTALL}/lib/pkgconfig:${PKG_CONFIG_PATH}" \ - LD_LIBRARY_PATH="${BUILD_ENV_INSTALL}/lib:/home/ultimaker/src/install/lib:/lib/x86_64-linux-gnu/:/usr/lib/x86_64-linux-gnu/:${LD_LIBRARY_PATH}" \ - PYTHONPATH=/home/ultimaker/src/install/lib/python3.10/site-packages/:/home/ultimaker/env/cura-build-environment/install/lib/python3.10/site-packages/ \ +ENV PATH="/home/ultimaker/env/bin:/home/ultimaker/install/bin:/usr/local/bin/:${PATH}" \ + LD_LIBRARY_PATH="/home/ultimaker/env/lib:/home/ultimaker/install/lib:/usr/lib/x86_64-linux-gnu/:/usr/lib/:/lib/:/lib/x86_64-linux-gnu/:${LD_LIBRARY_PATH}" \ HOME=/home/ultimaker \ USER=ultimaker +FROM base AS base_cmake + RUN wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5.tar.gz && \ tar -zxvf cmake-3.21.5.tar.gz && \ cd cmake-3.21.5 && \ @@ -51,34 +48,36 @@ RUN wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5 rm -rf cmake-3.21.5 && \ apt-get remove -y cmake -# Cleanup -USER root -WORKDIR / -RUN rm -rf /tmp/* && \ - rm -rf /var/cache \ +FROM base_cmake AS base_python -FROM base_environment AS cura_build_environment +RUN wget https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgz && \ + tar -xf Python-3.10.2.tgz && \ + cd Python-3.10.2 && \ + ./configure --enable-optimizations && \ + make -j $(nproc) && \ + make install -# Build the build environment -WORKDIR "${BUILD_ENV_BUILD}" -USER ultimaker:ultimaker -RUN cmake -DCMAKE_BUILD_TYPE=${BUILD_ENV_BUILD_TYPE} \ - -DCMAKE_PREFIX_PATH=${BUILD_ENV_INSTALL} \ - -DCMAKE_INSTALL_PREFIX=${BUILD_ENV_INSTALL} \ - -DARCUS_BRANCH_OR_TAG=${ARCUS_BRANCH_OR_TAG} \ - -DSAVITAR_BRANCH_OR_TAG=${SAVITAR_BRANCH_OR_TAG} \ - -DPYNEST2D_BRANCH_OR_TAG=${PYNEST2D_BRANCH_OR_TAG} \ - "${BUILD_ENV_SOURCE}" -RUN cmake --build "${BUILD_ENV_BUILD}" -RUN cmake --install "${BUILD_ENV_BUILD}" +FROM base_python AS base_conan + +RUN python3 -m pip install conan && \ + conan profile new default --detect && \ + conan profile update settings.compiler.libcxx=libstdc++11 default && \ + conan config install https://github.com/ultimaker/conan-config.git && \ + conan config set general.revisions_enabled=1 && \ + conan config set general.scm_to_conandata=1 + +FROM base_conan AS cura_build_environment # Cleanup USER root WORKDIR / -RUN rm -rf "${BUILD_ENV_SOURCE}" \ - rm -rf "${BUILD_ENV_BUILD}" +RUN rm -rf /tmp/* && \ + rm -rf /var/cache + +# Set up the build folders +RUN mkdir -p /home/ultimaker/source /home/ultimaker/build /home/ultimaker/install /home/ultimaker/env && \ + chown -R ultimaker:ultimaker /home/ultimaker # Change working directory USER ultimaker:ultimaker -WORKDIR /home/ultimaker/src/build -CMD /usr/local/bin/cmake +WORKDIR /home/ultimaker/ diff --git a/env_osx.sh b/env_osx.sh deleted file mode 100644 index 890218f4..00000000 --- a/env_osx.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh -# -# The following optional environment variables can be set to configure the build: -# - CURA_TARGET_OSX_VERSION: The minimum OSX version you are targeting -# - CURA_OSX_SDK_VERSION : The OSX SDK version to use for compiling -# - - -# (Optional) Minimum OSX version for deployment -if [ -n "${CURA_TARGET_OSX_VERSION}" ]; then - echo "Using ${CURA_TARGET_OSX_VERSION} as the minimum OSX version." - export MACOSX_DEPLOYMENT_TARGET="${CURA_TARGET_OSX_VERSION}" - export CMAKE_OSX_DEPLOYMENT_TARGET="${CURA_TARGET_OSX_VERSION}" - export QMAKE_MACOSX_DEPLOYMENT_TARGET="${CURA_TARGET_OSX_VERSION}" - - echo "Set MACOSX_DEPLOYMENT_TARGET to ${MACOSX_DEPLOYMENT_TARGET}" - echo "Set CMAKE_OSX_DEPLOYMENT_TARGET to ${CMAKE_OSX_DEPLOYMENT_TARGET}" - echo "Set QMAKE_MACOSX_DEPLOYMENT_TARGET to ${QMAKE_MACOSX_DEPLOYMENT_TARGET}" -fi -# (Optional) OSX SDK version to use -if [ -n "${CURA_OSX_SDK_VERSION}" ]; then - echo "Using ${CURA_OSX_SDK_VERSION} as the OSX SDK version." - export CMAKE_OSX_SYSROOT="/Library/Developer/CommandLineTools/SDKs/MacOSX${CURA_OSX_SDK_VERSION}.sdk" - - echo "Set CMAKE_OSX_SYSROOT to ${CMAKE_OSX_SYSROOT}" -fi - -export CMAKE_CXX_FLAGS="-stdlib=libc++" -export CXXFLAGS="-stdlib=libc++" - -export CC="/Library/Developer/CommandLineTools/usr/bin/clang" -export CXX="/Library/Developer/CommandLineTools/usr/bin/clang++" diff --git a/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch b/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch deleted file mode 100644 index 7ff6a6f9..00000000 --- a/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch +++ /dev/null @@ -1,66 +0,0 @@ -From be21706f3760bec8bd11f85ce02ed6792b07f51f Mon Sep 17 00:00:00 2001 -From: Mike Gilbert -Date: Mon, 11 Oct 2021 19:24:03 -0400 -Subject: [PATCH] bpo-45433: Do not link libpython against libcrypt (GH-28881) - -Save/restore LIBS when calling AC_SEARCH_LIBS(..., crypt). This avoid -linking libpython with libcrypt. ---- - .../NEWS.d/next/Build/2021-10-11-16-08-37.bpo-45433.pVDkMV.rst | 1 + - configure | 3 +++ - configure.ac | 3 +++ - 3 files changed, 7 insertions(+) - create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-08-37.bpo-45433.pVDkMV.rst - -diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-08-37.bpo-45433.pVDkMV.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-08-37.bpo-45433.pVDkMV.rst -new file mode 100644 -index 0000000000..27869f08fb ---- /dev/null -+++ b/Misc/NEWS.d/next/Build/2021-10-11-16-08-37.bpo-45433.pVDkMV.rst -@@ -0,0 +1 @@ -+Avoid linking libpython with libcrypt. -diff --git a/configure b/configure -index 15c7c54b09..70f28b0c70 100755 ---- a/configure -+++ b/configure -@@ -13227,6 +13227,8 @@ done - - # We search for both crypt and crypt_r as one or the other may be defined - # This gets us our -lcrypt in LIBS when required on the target platform. -+# Save/restore LIBS to avoid linking libpython with libcrypt. -+LIBS_SAVE=$LIBS - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing crypt" >&5 - $as_echo_n "checking for library containing crypt... " >&6; } - if ${ac_cv_search_crypt+:} false; then : -@@ -13368,6 +13370,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - - fi - -+LIBS=$LIBS_SAVE - - for ac_func in clock_gettime - do : -diff --git a/configure.ac b/configure.ac -index 6c65b2914b..afdc68363c 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -4085,6 +4085,8 @@ AC_CHECK_FUNCS(setpgrp, - - # We search for both crypt and crypt_r as one or the other may be defined - # This gets us our -lcrypt in LIBS when required on the target platform. -+# Save/restore LIBS to avoid linking libpython with libcrypt. -+LIBS_SAVE=$LIBS - AC_SEARCH_LIBS(crypt, crypt) - AC_SEARCH_LIBS(crypt_r, crypt) - -@@ -4099,6 +4101,7 @@ char *r = crypt_r("", "", &d); - [AC_DEFINE(HAVE_CRYPT_R, 1, [Define if you have the crypt_r() function.])], - []) - ) -+LIBS=$LIBS_SAVE - - AC_CHECK_FUNCS(clock_gettime, [], [ - AC_CHECK_LIB(rt, clock_gettime, [ --- -2.35.1 - diff --git a/projects/0002-install-location-runtime-libs.patch b/projects/0002-install-location-runtime-libs.patch deleted file mode 100644 index 7c6a471f..00000000 --- a/projects/0002-install-location-runtime-libs.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt -index 32293cb..8179774 100644 ---- a/cpp/CMakeLists.txt -+++ b/cpp/CMakeLists.txt -@@ -15,7 +15,11 @@ ADD_LIBRARY(polyclipping clipper.cpp) - CONFIGURE_FILE (polyclipping.pc.cmakein "${PCFILE}" @ONLY) - - INSTALL (FILES clipper.hpp DESTINATION "${CMAKE_INSTALL_INCDIR}") --INSTALL (TARGETS polyclipping LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") -+INSTALL (TARGETS polyclipping -+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" -+ RUNTIME DESTINATION "${CMAKE_INSTALL_LIBDIR}" -+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" -+ ) - INSTALL (FILES "${PCFILE}" DESTINATION "${CMAKE_INSTALL_PKGCONFIGDIR}") - - SET_TARGET_PROPERTIES(polyclipping PROPERTIES VERSION 22.0.0 SOVERSION 22 ) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 13275e9c..3953ee4f 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -1,5 +1,5 @@ -#Copyright (c) 2022 Ultimaker B.V. -#cura-build-environment is released under the terms of the AGPLv3 or higher. +# Copyright (c) 2022 Ultimaker B.V. +# cura-build-environment is released under the terms of the AGPLv3 or higher. GetFromEnvironmentOrCache( NAME @@ -9,57 +9,13 @@ GetFromEnvironmentOrCache( DESCRIPTION "The name of the tag or branch to build for Arcus") -set(extra_cmake_args "") -if(BUILD_OS_WINDOWS) - set(extra_cmake_args - -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs - -DMSVC_STATIC_RUNTIME=OFF - -DCMAKE_EXE_LINKER_FLAGS=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 - -DCMAKE_EXE_LINKER_FLAGS_RELEASE=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 - -DCMAKE_MODULE_LINKER_FLAGS=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 - -DCMAKE_MODULE_LINKER_FLAGS_RELEASE=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 - -DCMAKE_SHARED_LINKER_FLAGS=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 - -DCMAKE_SHARED_LINKER_FLAGS_RELEASE=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 - -DCMAKE_STATIC_LINKER_FLAGS=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 - -DCMAKE_STATIC_LINKER_FLAGS_RELEASE=/LIBPATH:"${CMAKE_INSTALL_PREFIX}/libs" /machine:x64 - ) -endif() - ExternalProject_Add(Arcus - GIT_REPOSITORY https://github.com/ultimaker/libArcus.git - GIT_TAG origin/${ARCUS_BRANCH_OR_TAG} - GIT_SHALLOW 1 - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DCMAKE_CXX_STANDARD=17 - -DBUILD_STATIC=OFF - -DBUILD_PYTHON=ON - -DBUILD_EXAMPLES=OFF - ${extra_cmake_args} - BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} - INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install -) - -SetProjectDependencies(TARGET Arcus DEPENDS Python Protobuf) - -if(BUILD_OS_WINDOWS) - ExternalProject_Add(Arcus-MinGW - GIT_REPOSITORY https://github.com/ultimaker/libArcus.git - GIT_TAG origin/${ARCUS_BRANCH_OR_TAG} - GIT_SHALLOW 1 - CMAKE_GENERATOR "MinGW Makefiles" - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib-mingw - -DCMAKE_CXX_STANDARD=17 - -DBUILD_STATIC=ON - -DBUILD_PYTHON=OFF - -DBUILD_EXAMPLES=OFF - ../Arcus-MinGW - BUILD_COMMAND mingw32-make - INSTALL_COMMAND mingw32-make install - ) - - SetProjectDependencies(TARGET Arcus-MinGW DEPENDS Protobuf-MinGW Arcus) -endif() + GIT_REPOSITORY https://github.com/ultimaker/libArcus.git + GIT_TAG origin/${ARCUS_BRANCH_OR_TAG} + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DSIP_BUILD_EXECUTABLE=sip-build + -DPython_SITEARCH=${Python_SITEARCH} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/${CMAKE_TOOLCHAIN_FILE} + DEPENDS Python) diff --git a/projects/base_requirements.txt b/projects/base_requirements.txt deleted file mode 100644 index 3247e24a..00000000 --- a/projects/base_requirements.txt +++ /dev/null @@ -1,161 +0,0 @@ -# These hashes were generated with: -# hashin --verbose --python-version --requirements-file= == == ... -# make sure you use the verbose flag and personally inspect the hosts that were used when generating -# When updating a major Python version these need to be updates as well - -pip==21.3.1 \ - --hash=sha256:deaf32dcd9ab821e359cd8330786bcd077604b5c5730c0b096eda46f95c24a2d \ - --hash=sha256:fd11ba3d0fdb4c07fbc5ecbba0b1b719809420f25038f8ee3cd913d3faa3033a -setuptools==60.1.1 \ - --hash=sha256:89e8cb2d5ade19e9885e56cd110f2f1e80697f7cffa048886c585fe559ebbe32 \ - --hash=sha256:10d6eff7fc27ada30cc87e21abf324713b7169b97af1f81f8744d66260e91d10 -wheel==0.37.1 \ - --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 \ - --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a -cython==0.29.26 \ - --hash=sha256:af377d543a762867da11fcf6e558f7a4a535ff8693f30cce123fab10c00fa312 \ - --hash=sha256:f5e15ff892c8afad64931ee3dd723c4755c2c516606f9aae7613bebfac62b0f6 \ - --hash=sha256:2b834ff6e4d10ba6d7a0d676dd71c1b427a181ddbbbbf79e91d1861557aab59f \ - --hash=sha256:c813799d533194b7d85203d881d8b4f567a8c644a67f50d47f1ffbf316df412f \ - --hash=sha256:6773cce9d4b3b6168d8feb2b6f06b658ef1e11cbfec075041745666d8e2a5e45 \ - --hash=sha256:362fbb9cb4627c7786231429768b54aaba5459a2a0e46c25e59f202ca6155437 -pybind11==2.6.2 \ - --hash=sha256:2d8aebe1709bc367e34e3b23d8eccbf3f387ee9d5640548c6260d33b59f02405 \ - --hash=sha256:d0e0aed9279656f21501243b707eb6e3b951e89e10c3271dedf3ae41c365e5ed - -# pytest -pytest==5.2.1 \ - --hash=sha256:7e4800063ccfc306a53c461442526c5571e1462f61583506ce97e4da6a1d88c8 \ - --hash=sha256:ca563435f4941d0cb34767301c27bc65c510cb82e90b9ecf9cb52dc2c63caaa0 -more-itertools==8.9.0 \ - --hash=sha256:70401259e46e216056367a0a6034ee3d3f95e0bf59d3aa6a4eb77837171ed996 \ - --hash=sha256:8c746e0d09871661520da4f1241ba6b908dc903839733c8203b552cffaf173bd -wcwidth==0.2.5 \ - --hash=sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784 \ - --hash=sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83 -pluggy==0.13.1 \ - --hash=sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0 \ - --hash=sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d -attrs==21.2.0 \ - --hash=sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1 \ - --hash=sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb -py==1.10.0 \ - --hash=sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3 \ - --hash=sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a -atomicwrites==1.4.0 \ - --hash=sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197 \ - --hash=sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a -colorama==0.4.4 \ - --hash=sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b \ - --hash=sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2 - -# packaging is a dependency of pytest -packaging==18.0 \ - --hash=sha256:0886227f54515e592aaa2e5a553332c73962917f2831f1b0f9b9f4380a4b9807 \ - --hash=sha256:f95a1e147590f204328170981833854229bb2912ac3d5f89e2a8ccd2834800c9 -pyparsing==2.4.2 \ - --hash=sha256:6f98a7b9397e206d78cc01df10131398f1c8b8510a2f4d97d9abd82e1aacdd80 \ - --hash=sha256:d9338df12903bbf5d65a0e4e87c2161968b10d2e489652bb47001d82a9b028b4 -six==1.12.0 \ - --hash=sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c \ - --hash=sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73 - -# pytest-benchmark -pytest-benchmark==3.2.2 \ - --hash=sha256:4512c6805318d07926efcb3b39f7b98a10d035305a93edfd5329c86cbf9cfbf7 \ - --hash=sha256:ab851115ce022639173b9497d4a4183a1d8fe9cdcf8fab9d8a57607008aedd3d -py-cpuinfo==8.0.0 \ - --hash=sha256:5f269be0e08e33fd959de96b34cd4aeeeacac014dd8305f70eb28d06de2345c5 - -# pytest-cov -pytest-cov==2.8.1 \ - --hash=sha256:cc6742d8bac45070217169f5f72ceee1e0e55b0221f54bcf24845972d3a47f2b \ - --hash=sha256:cdbdef4f870408ebdbfeb44e63e07eb18bb4619fae852f6e760645fa36172626 -coverage==5.5 \ - --hash=sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6 \ - --hash=sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2 \ - --hash=sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6 \ - --hash=sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759 \ - --hash=sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502 \ - --hash=sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a \ - --hash=sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873 \ - --hash=sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c - -# mypy -tomli==2.0.1 \ - --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ - --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f -mypy-extensions==0.4.3 \ - --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \ - --hash=sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8 -typing-extensions==3.10.0.2 \ - --hash=sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e \ - --hash=sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34 -typed-ast==1.5.2 \ - --hash=sha256:0eb77764ea470f14fcbb89d51bc6bbf5e7623446ac4ed06cbd9ca9495b62e36e \ - --hash=sha256:1098df9a0592dd4c8c0ccfc2e98931278a6c6c53cb3a3e2cf7e9ee3b06153344 \ - --hash=sha256:183b183b7771a508395d2cbffd6db67d6ad52958a5fdc99f450d954003900266 \ - --hash=sha256:18fe320f354d6f9ad3147859b6e16649a0781425268c4dde596093177660e71a \ - --hash=sha256:26a432dc219c6b6f38be20a958cbe1abffcc5492821d7e27f08606ef99e0dffd \ - --hash=sha256:294a6903a4d087db805a7656989f613371915fc45c8cc0ddc5c5a0a8ad9bea4d \ - --hash=sha256:31d8c6b2df19a777bc8826770b872a45a1f30cfefcfd729491baa5237faae837 \ - --hash=sha256:33b4a19ddc9fc551ebabca9765d54d04600c4a50eda13893dadf67ed81d9a098 \ - --hash=sha256:42c47c3b43fe3a39ddf8de1d40dbbfca60ac8530a36c9b198ea5b9efac75c09e \ - --hash=sha256:525a2d4088e70a9f75b08b3f87a51acc9cde640e19cc523c7e41aa355564ae27 \ - --hash=sha256:58ae097a325e9bb7a684572d20eb3e1809802c5c9ec7108e85da1eb6c1a3331b \ - --hash=sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596 \ - --hash=sha256:74cac86cc586db8dfda0ce65d8bcd2bf17b58668dfcc3652762f3ef0e6677e76 \ - --hash=sha256:8c08d6625bb258179b6e512f55ad20f9dfef019bbfbe3095247401e053a3ea30 \ -mypy==0.931 \ - --hash=sha256:0038b21890867793581e4cb0d810829f5fd4441aa75796b53033af3aa30430ce \ - --hash=sha256:1171f2e0859cfff2d366da2c7092b06130f232c636a3f7301e3feb8b41f6377d \ - --hash=sha256:1b06268df7eb53a8feea99cbfff77a6e2b205e70bf31743e786678ef87ee8069 \ - --hash=sha256:1b65714dc296a7991000b6ee59a35b3f550e0073411ac9d3202f6516621ba66c \ - --hash=sha256:1bf752559797c897cdd2c65f7b60c2b6969ffe458417b8d947b8340cc9cec08d \ - --hash=sha256:300717a07ad09525401a508ef5d105e6b56646f7942eb92715a1c8d610149714 \ - --hash=sha256:3c5b42d0815e15518b1f0990cff7a705805961613e701db60387e6fb663fe78a \ - --hash=sha256:4365c60266b95a3f216a3047f1d8e3f895da6c7402e9e1ddfab96393122cc58d \ - --hash=sha256:50c7346a46dc76a4ed88f3277d4959de8a2bd0a0fa47fa87a4cde36fe247ac05 \ - --hash=sha256:5b56154f8c09427bae082b32275a21f500b24d93c88d69a5e82f3978018a0266 \ - --hash=sha256:74f7eccbfd436abe9c352ad9fb65872cc0f1f0a868e9d9c44db0893440f0c697 \ - --hash=sha256:7b3f6f557ba4afc7f2ce6d3215d5db279bcf120b3cfd0add20a5d4f4abdae5bc \ - --hash=sha256:8c11003aaeaf7cc2d0f1bc101c1cc9454ec4cc9cb825aef3cafff8a5fdf4c799 \ - --hash=sha256:8ca7f8c4b1584d63c9a0f827c37ba7a47226c19a23a753d52e5b5eddb201afcd \ - --hash=sha256:c89702cac5b302f0c5d33b172d2b55b5df2bede3344a2fbed99ff96bddb2cf00 \ - --hash=sha256:d8f1ff62f7a879c9fe5917b3f9eb93a79b78aad47b533911b853a757223f72e7 \ - --hash=sha256:d9d2b84b2007cea426e327d2483238f040c49405a6bf4074f605f0156c91a47a \ - --hash=sha256:e839191b8da5b4e5d805f940537efcaa13ea5dd98418f06dc585d2891d228cf0 \ - --hash=sha256:f9fe20d0872b26c4bba1c1be02c5340de1019530302cf2dcc85c7f9fc3252ae0 \ - --hash=sha256:ff3bf387c14c805ab1388185dd22d6b210824e164d4bb324b195ff34e322d166 - -# cryptography is needed before we collect/install PyQt5 -cffi==1.14.1 \ - --hash=sha256:267adcf6e68d77ba154334a3e4fc921b8e63cbb38ca00d33d40655d4228502bc \ - --hash=sha256:6923d077d9ae9e8bacbdb1c07ae78405a9306c8fd1af13bfa06ca891095eb995 \ - --hash=sha256:98be759efdb5e5fa161e46d404f4e0ce388e72fbf7d9baf010aff16689e22abe \ - --hash=sha256:b1d6ebc891607e71fd9da71688fcf332a6630b7f5b7f5549e6e631821c0e5d90 \ - --hash=sha256:b2a2b0d276a136146e012154baefaea2758ef1f56ae9f4e01c612b0831e0bd2f \ - --hash=sha256:d3148b6ba3923c5850ea197a91a42683f946dba7e8eb82dfa211ab7e708de939 -pycparser==2.20 \ - --hash=sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705 - -cryptography==3.4.8; \ -sys_platform=="darwin" \ - --hash=sha256:a00cf305f07b26c351d8d4e1af84ad7501eca8a342dedf24a7acb0e7b7406e14 - -cryptography==3.4.8; \ -sys_platform=="win32" \ - --hash=sha256:3520667fda779eb788ea00080124875be18f2d8f0848ec00733c0ec3bb8219fc - -cryptography==3.4.8; \ -sys_platform=="linux" \ - --hash=sha256:1eb7bb0df6f6f583dd8e054689def236255161ebbcf62b226454ab9ec663746b - -toml==0.10.2 \ - --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \ - --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f -sip==6.5 \ - --hash=sha256:28edf2e20db20ebf135e94e3295d8a90427e4ea461337413bf3ff2ce31bbdafe \ - --hash=sha256:71332c6f209a45bf019a352fe0374fa9d58fe1f6970c8e13dbeec62e5bab2114 \ - --hash=sha256:75ca74f5a6a2024dd984aece7ecc78676ec99be218b504744392dfbdf2d4200a \ - --hash=sha256:a1cf8431a8eb9392b3ff6dc61d832d0447bfdcae5b3e4256a5fa74dbc25b0734 diff --git a/projects/boost_headers.cmake b/projects/boost_headers.cmake deleted file mode 100644 index 7b519e49..00000000 --- a/projects/boost_headers.cmake +++ /dev/null @@ -1,12 +0,0 @@ -#Copyright (c) 2021 Ultimaker B.V. -#cura-build-environment is released under the terms of the AGPLv3 or higher. - -if(NOT TARGET BoostHeaders) - ExternalProject_Add(BoostHeaders - URL https://boostorg.jfrog.io/artifactory/main/release/1.67.0/source/boost_1_67_0.tar.bz2 - URL_HASH SHA256=2684c972994ee57fc5632e03bf044746f6eb45d4920c343937a465fd67a5adba - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/BoostHeaders-prefix/src/BoostHeaders/boost" "${CMAKE_INSTALL_PREFIX}/include/boost" - ) -endif() diff --git a/projects/build_python_windows.bat b/projects/build_python_windows.bat deleted file mode 100644 index 78cf9f67..00000000 --- a/projects/build_python_windows.bat +++ /dev/null @@ -1,5 +0,0 @@ -@echo off -setlocal enableextensions -rem Custom Python installation script, because Python itself lacks one. - -%* "/p:PlatformToolset=v142" "/p:DefaultWindowsSDKVersion=10" diff --git a/projects/bzip2.cmake b/projects/bzip2.cmake deleted file mode 100644 index 741c6372..00000000 --- a/projects/bzip2.cmake +++ /dev/null @@ -1,21 +0,0 @@ -if(BUILD_OS_LINUX) - ExternalProject_Add(bzip2-static - URL https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz - URL_HASH SHA256=ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 - CONFIGURE_COMMAND "" - BUILD_COMMAND make -j ${N_PROC} -f Makefile PREFIX=${CMAKE_INSTALL_PREFIX} - INSTALL_COMMAND make -f Makefile install PREFIX=${CMAKE_INSTALL_PREFIX} - BUILD_IN_SOURCE 1 - ) - # bzip2 "Makefile-libbz2_so" builds the dynamic library but doesn't include any installation targets. The patch - # file "bzip2_shared.patch" adds a install target so the dynamic libraries can be installed. - ExternalProject_Add(bzip2-shared - URL https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz - URL_HASH SHA256=ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 - PATCH_COMMAND patch Makefile-libbz2_so ${CMAKE_SOURCE_DIR}/projects/bzip2_shared.patch - CONFIGURE_COMMAND "" - BUILD_COMMAND make -f Makefile-libbz2_so PREFIX=${CMAKE_INSTALL_PREFIX} - INSTALL_COMMAND make -f Makefile-libbz2_so install PREFIX=${CMAKE_INSTALL_PREFIX} - BUILD_IN_SOURCE 1 - ) -endif() diff --git a/projects/bzip2_shared.patch b/projects/bzip2_shared.patch deleted file mode 100644 index 179acd53..00000000 --- a/projects/bzip2_shared.patch +++ /dev/null @@ -1,11 +0,0 @@ -@@ -57,3 +57,10 @@ - $(CC) $(CFLAGS) -c decompress.c - bzlib.o: bzlib.c - $(CC) $(CFLAGS) -c bzlib.c -+ -+install: all -+ if ( test ! -d $(PREFIX)/lib ) ; then mkdir -p $(PREFIX)/lib ; fi -+ cp -f libbz2.so.1.0.8 $(PREFIX)/lib/ -+ ln -s -f libbz2.so.1.0.8 $(PREFIX)/lib/libbz2.so.1.0 -+ ln -s -f libbz2.so.1.0.8 $(PREFIX)/lib/libbz2.so.1 -+ ln -s -f libbz2.so.1.0.8 $(PREFIX)/lib/libbz2.so diff --git a/projects/clipper.cmake b/projects/clipper.cmake deleted file mode 100644 index 482a07d2..00000000 --- a/projects/clipper.cmake +++ /dev/null @@ -1,16 +0,0 @@ -#Copyright (c) 2022 Ultimaker B.V. -#cura-build-environment is released under the terms of the AGPLv3 or higher. - -if(NOT TARGET Clipper) - ExternalProject_Add(Clipper - GIT_REPOSITORY https://github.com/skyrpex/clipper - GIT_TAG 6.4.2 - PATCH_COMMAND git apply --reject --whitespace=fix ${CMAKE_SOURCE_DIR}/projects/0002-install-location-runtime-libs.patch - SOURCE_SUBDIR cpp - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_CXX_FLAGS=-fPIC - -DBUILD_SHARED_LIBS=OFF - ) -endif() diff --git a/projects/googletest.cmake b/projects/googletest.cmake deleted file mode 100644 index 83437678..00000000 --- a/projects/googletest.cmake +++ /dev/null @@ -1,26 +0,0 @@ -set(_googletest_url "https://github.com/google/googletest/archive/release-1.8.1.tar.gz") -set(_googletest_sha256 "9bf1fe5182a604b4135edc1a425ae356c9ad15e9b23f9f12a02e80184c3a249c") - -ExternalProject_Add(GoogleTest - URL ${_googletest_url} - URL_HASH SHA256=${_googletest_sha256} - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - BUILD_IN_SOURCE 1 -) - -# Also need to build with MinGW on Windows -if(BUILD_OS_WINDOWS) - ExternalProject_Add(GoogleTest-MinGW - URL ${_googletest_url} - URL_MD5 ${_googletest_md5sum} - CMAKE_GENERATOR "MinGW Makefiles" - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_INSTALL_LIBDIR=lib-mingw - BUILD_COMMAND mingw32-make - INSTALL_COMMAND mingw32-make install - ) -endif() diff --git a/projects/install_python_windows.bat b/projects/install_python_windows.bat deleted file mode 100644 index 72e0f609..00000000 --- a/projects/install_python_windows.bat +++ /dev/null @@ -1,78 +0,0 @@ -@echo off -setlocal enableextensions -rem Custom Python installation script, because Python itself lacks one. - -set SCRIPTDIR=%~dp0 - -set ARCH=%~1 -set SOURCEDIR=%~f2 -set DESTDIR=%~f3 - -echo arch %ARCH% -echo source %SOURCEDIR% -echo dest %DESTDIR% - -if not defined ARCH goto :help -if not defined SOURCEDIR goto :help -if not defined DESTDIR goto :help - -if "%ARCH%"=="win32" ( - goto :install -) else ( - if "%ARCH%"=="amd64" ( - goto :install - ) -) -goto :invalid_arch - -:install - -set BINDIR=%SOURCEDIR%\PCbuild\%ARCH% - -echo bindir %BINDIR% - -echo Install binaries to DESTDIR/bin - -mkdir %DESTDIR%\bin - -echo %BINDIR%\python.exe - -copy /Y %BINDIR%\python.exe %DESTDIR%\bin -copy /Y %BINDIR%\*.dll %DESTDIR%\bin - -echo Install libraries to DESTDIR/lib - -mkdir %DESTDIR%\lib - -copy /Y %BINDIR%\*.pyd %DESTDIR%\lib - -xcopy /Y /E %SOURCEDIR%\lib\* %DESTDIR%\lib - -echo Install import libraries to DESTDIR/libs - -mkdir %DESTDIR%\libs - -copy /Y %BINDIR%\*.lib %DESTDIR%\libs - -echo Install headers into DESTDIR/include - -mkdir %DESTDIR%\include - -xcopy /Y /E %SOURCEDIR%\include\* %DESTDIR%\include - -copy /Y %SOURCEDIR%\PC\pyconfig.h %DESTDIR%\include - -exit /B 0 - -:invalid_arch - -echo Invalid architecture. Options are win32 or amd64. -echo. - -:help - -echo Usage: install_python_windows.bat [arch] [source dir] [dest dir] -echo. -echo [arch] Architecture to install. Either win32 or amd64. -echo [source dir] Source directory. Should be root of the Python source. -echo [dest dir] Destination directory. Will be cleaned before installation. diff --git a/projects/libffi.cmake b/projects/libffi.cmake deleted file mode 100644 index 2b3bda3b..00000000 --- a/projects/libffi.cmake +++ /dev/null @@ -1,36 +0,0 @@ -if(NOT BUILD_OS_WINDOWS) - - if(BUILD_OS_OSX) - GetFromEnvironmentOrCache( - NAME - CMAKE_CXX_COMPILER - DEFAULT - clang++ - DESCRIPTION - "Specify the CXX compiler to use") - GetFromEnvironmentOrCache( - NAME - CMAKE_C_COMPILER - DEFAULT - clang - DESCRIPTION - "Specify the C compiler to use") - - set(_libffi_config_cmd CXXFLAGS="-stdlib=libc++" CXX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} ./configure --disable-dependency-tracking --disable-silent-rules --enable-portable-binary --prefix=${CMAKE_INSTALL_PREFIX}) - if(CMAKE_OSX_SYSROOT) - # On OS X, make sure the right OS X SDK is used. - list(APPEND _libffi_config_cmd --with-sysroot=${CMAKE_OSX_SYSROOT}) - endif() - else() - set(_libffi_config_cmd ./configure --disable-dependency-tracking --disable-silent-rules --enable-portable-binary --prefix=${CMAKE_INSTALL_PREFIX}) - endif() - - ExternalProject_Add(libffi - URL ftp://sourceware.org/pub/libffi/libffi-3.3.tar.gz - URL_HASH SHA256=72fba7922703ddfa7a028d513ac15a85c8d54c8d67f55fa5a4802885dc652056 - CONFIGURE_COMMAND ${_libffi_config_cmd} - BUILD_COMMAND make -j ${N_PROC} - INSTALL_COMMAND make install - BUILD_IN_SOURCE 1 - ) -endif() diff --git a/projects/libnest2d.cmake b/projects/libnest2d.cmake index f5bb0f2e..59c75395 100644 --- a/projects/libnest2d.cmake +++ b/projects/libnest2d.cmake @@ -1,23 +1,18 @@ -#Copyright (c) 2020 Ultimaker B.V. -#cura-build-environment is released under the terms of the AGPLv3 or higher. +# Copyright (c) 2022 Ultimaker B.V. +# cura-build-environment is released under the terms of the AGPLv3 or higher. -include(${CMAKE_CURRENT_SOURCE_DIR}/projects/boost_headers.cmake) -include(${CMAKE_CURRENT_SOURCE_DIR}/projects/nlopt.cmake) -include(${CMAKE_CURRENT_SOURCE_DIR}/projects/clipper.cmake) +GetFromEnvironmentOrCache( + NAME + LIBNEST2D_BRANCH_OR_TAG + DEFAULT + master + DESCRIPTION + "The name of the tag or branch to build for libnest2d") -set(extra_cmake_args "") - -#libnest2d (dependency of pynest2d). ExternalProject_Add(libnest2d - GIT_REPOSITORY https://github.com/Ultimaker/libnest2d.git - GIT_TAG master - GIT_SHALLOW 1 - UPDATE_DISCONNECTED 1 - PATCH_COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/projects/libnest2d_find_clipper.cmake" "${CMAKE_CURRENT_BINARY_DIR}/libnest2d-prefix/src/libnest2d/cmake_modules/FindClipper.cmake" - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_CXX_STANDARD=17 - ${extra_cmake_args} - DEPENDS BoostHeaders nlopt Clipper -) + GIT_REPOSITORY https://github.com/Ultimaker/libnest2d.git + GIT_TAG origin/${LIBNEST2D_BRANCH_OR_TAG} + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/${CMAKE_TOOLCHAIN_FILE}) diff --git a/projects/libnest2d_find_clipper.cmake b/projects/libnest2d_find_clipper.cmake deleted file mode 100644 index 264f1e07..00000000 --- a/projects/libnest2d_find_clipper.cmake +++ /dev/null @@ -1,92 +0,0 @@ -# Find Clipper library (http://www.angusj.com/delphi/clipper.php). -# The following variables are set -# -# CLIPPER_FOUND -# CLIPPER_INCLUDE_DIRS -# CLIPPER_LIBRARIES -# -# It searches the environment variable $CLIPPER_PATH automatically. - -unset(CLIPPER_FOUND CACHE) -unset(CLIPPER_INCLUDE_DIRS CACHE) -unset(CLIPPER_LIBRARIES CACHE) -unset(CLIPPER_LIBRARIES_RELEASE CACHE) -unset(CLIPPER_LIBRARIES_DEBUG CACHE) - -if(CMAKE_BUILD_TYPE MATCHES "(Debug|DEBUG|debug)") - set(CLIPPER_BUILD_TYPE DEBUG) -else() - set(CLIPPER_BUILD_TYPE RELEASE) -endif() - -FIND_PATH(CLIPPER_INCLUDE_DIRS clipper.hpp - $ENV{CLIPPER_PATH}/ - $ENV{CLIPPER_PATH}/cpp/ - $ENV{CLIPPER_PATH}/include/ - $ENV{CLIPPER_PATH}/include/polyclipping/ - ${PROJECT_SOURCE_DIR}/python/pymesh/third_party/include/ - ${PROJECT_SOURCE_DIR}/python/pymesh/third_party/include/polyclipping/ - ${CMAKE_PREFIX_PATH}/include/polyclipping/ - ${CMAKE_PREFIX_PATH}/include/ - ${CMAKE_INSTALL_PREFIX}/include/polyclipping/ - ${CMAKE_INSTALL_PREFIX}/include/ - /opt/local/include/ - /opt/local/include/polyclipping/ - /usr/local/include/ - /usr/local/include/polyclipping/ - /usr/include/ - /usr/include/polyclipping/) - -set(LIB_SEARCHDIRS - $ENV{CLIPPER_PATH} - $ENV{CLIPPER_PATH}/cpp/ - $ENV{CLIPPER_PATH}/cpp/build/ - $ENV{CLIPPER_PATH}/lib/ - $ENV{CLIPPER_PATH}/lib/polyclipping/ - ${PROJECT_SOURCE_DIR}/python/pymesh/third_party/lib/ - ${PROJECT_SOURCE_DIR}/python/pymesh/third_party/lib/polyclipping/ - ${CMAKE_PREFIX_PATH}/lib/ - ${CMAKE_PREFIX_PATH}/lib/polyclipping/ - ${CMAKE_INSTALL_PREFIX}/lib/ - ${CMAKE_INSTALL_PREFIX}/lib/polyclipping/ - /opt/local/lib/ - /opt/local/lib/polyclipping/ - /usr/local/lib/ - /usr/local/lib/polyclipping/ - /usr/lib/polyclipping -) - -set(_deb_postfix "d") - -FIND_LIBRARY(CLIPPER_LIBRARIES_RELEASE polyclipping ${LIB_SEARCHDIRS}) -FIND_LIBRARY(CLIPPER_LIBRARIES_DEBUG polyclipping${_deb_postfix} ${LIB_SEARCHDIRS}) - -if(CLIPPER_LIBRARIES_${CLIPPER_BUILD_TYPE}) - set(CLIPPER_LIBRARIES "${CLIPPER_LIBRARIES_${CLIPPER_BUILD_TYPE}}") -else() - set(CLIPPER_LIBRARIES "${CLIPPER_LIBRARIES_RELEASE}") -endif() - -include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(Clipper - "Clipper library cannot be found. Consider set CLIPPER_PATH environment variable" - CLIPPER_INCLUDE_DIRS - CLIPPER_LIBRARIES) - -MARK_AS_ADVANCED( - CLIPPER_INCLUDE_DIRS - CLIPPER_LIBRARIES) - -if(CLIPPER_FOUND) - add_library(Clipper::Clipper UNKNOWN IMPORTED) - set_target_properties(Clipper::Clipper PROPERTIES IMPORTED_LOCATION ${CLIPPER_LIBRARIES}) - set_target_properties(Clipper::Clipper PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CLIPPER_INCLUDE_DIRS}) - if(CLIPPER_LIBRARIES_RELEASE AND CLIPPER_LIBRARIES_DEBUG) - set_target_properties(Clipper::Clipper PROPERTIES - IMPORTED_LOCATION_DEBUG ${CLIPPER_LIBRARIES_DEBUG} - IMPORTED_LOCATION_RELWITHDEBINFO ${CLIPPER_LIBRARIES_RELEASE} - IMPORTED_LOCATION_RELEASE ${CLIPPER_LIBRARIES_RELEASE} - IMPORTED_LOCATION_MINSIZEREL ${CLIPPER_LIBRARIES_RELEASE} - ) - endif() -endif() diff --git a/projects/nlopt.cmake b/projects/nlopt.cmake deleted file mode 100644 index 1cb15a52..00000000 --- a/projects/nlopt.cmake +++ /dev/null @@ -1,14 +0,0 @@ -#Copyright (c) 2020 Ultimaker B.V. -#cura-build-environment is released under the terms of the AGPLv3 or higher. - -#NLopt (dependency of libnest2d). -if(NOT TARGET nlopt) - ExternalProject_Add(nlopt - GIT_REPOSITORY https://github.com/stevengj/nlopt.git - GIT_TAG v2.6.2 - GIT_SHALLOW 1 - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - ) -endif() \ No newline at end of file diff --git a/projects/openblas.cmake b/projects/openblas.cmake deleted file mode 100644 index fc0999dc..00000000 --- a/projects/openblas.cmake +++ /dev/null @@ -1,17 +0,0 @@ -if(NOT BUILD_OS_WINDOWS) - # Fortran compiler is needed for OpenBLAS, but it does no check whether it is available. - enable_language(Fortran) - set(openblas_options DYNAMIC_ARCH=1 DYNAMIC_OLDER=1 NO_STATIC=1 TARGET=GENERIC) - - ExternalProject_Add(OpenBLAS - URL https://github.com/xianyi/OpenBLAS/archive/v0.3.13.tar.gz - URL_HASH SHA256=79197543b17cc314b7e43f7a33148c308b0807cd6381ee77f77e15acf3e6459e - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - ) -else() - add_custom_target(OpenBLAS) -endif() - -SetProjectDependencies(TARGET OpenBLAS) diff --git a/projects/openssl.cmake b/projects/openssl.cmake deleted file mode 100644 index 79dfabdd..00000000 --- a/projects/openssl.cmake +++ /dev/null @@ -1,32 +0,0 @@ -if(NOT BUILD_OS_WINDOWS) - set(_openssl_build make depend && make -j ${N_PROC}) - set(_openssl_install make install) - if(BUILD_OS_LINUX) - set(_openssl_configure perl Configure --prefix=${CMAKE_INSTALL_PREFIX} --openssldir=${CMAKE_INSTALL_PREFIX} no-ssl2 no-ssl3 no-zlib shared enable-cms linux-x86_64 enable-ec_nistp_64_gcc_128) - elseif(BUILD_OS_OSX) - GetFromEnvironmentOrCache( - NAME - CMAKE_CXX_COMPILER - DEFAULT - clang++ - DESCRIPTION - "Specify the CXX compiler to use") - GetFromEnvironmentOrCache( - NAME - CMAKE_C_COMPILER - DEFAULT - clang - DESCRIPTION - "Specify the C compiler to use") - set(_openssl_configure CXXFLAGS="-stdlib=libc++" CXX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} perl Configure --prefix=${CMAKE_INSTALL_PREFIX} --openssldir=${CMAKE_INSTALL_PREFIX} no-ssl2 no-ssl3 no-zlib shared enable-cms darwin64-x86_64-cc enable-ec_nistp_64_gcc_128) - endif() - - ExternalProject_Add(OpenSSL - URL https://www.openssl.org/source/openssl-1.1.1l.tar.gz - URL_HASH SHA256=0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1 - CONFIGURE_COMMAND ${_openssl_configure} - BUILD_COMMAND ${_openssl_build} - INSTALL_COMMAND ${_openssl_install} - BUILD_IN_SOURCE 1 - ) -endif() diff --git a/projects/protobuf.cmake b/projects/protobuf.cmake deleted file mode 100644 index 2ecc9665..00000000 --- a/projects/protobuf.cmake +++ /dev/null @@ -1,84 +0,0 @@ -set(_cura_protobuf_url https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.15.7.tar.gz) -set(_cura_protobuf_sha256 efdd6b932a2c0a88a90c4c80f88e4b2e1bf031e7514dbb5a5db5d0bf4f295504) - -if(BUILD_OS_OSX) - set(protobuf_cxx_flags "-fPIC -std=c++11 -stdlib=libc++") -elseif(BUILD_OS_LINUX) - set(protobuf_cxx_flags "-fPIC -std=c++11") -else() - set(protobuf_cxx_flags "") -endif() - -set(protobuf_configure_args - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_INSTALL_LIBDIR=lib - -DCMAKE_INSTALL_CMAKEDIR=lib/cmake/protobuf - -DCMAKE_CXX_FLAGS=${protobuf_cxx_flags} - -Dprotobuf_BUILD_TESTS=OFF - -Dprotobuf_BUILD_EXAMPLES=OFF - -Dprotobuf_BUILD_SHARED_LIBS=ON - -Dprotobuf_WITH_ZLIB=OFF -) - -if(BUILD_OS_OSX) - if (CMAKE_OSX_DEPLOYMENT_TARGET) - list(APPEND protobuf_configure_args - -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} - ) - endif() - if (CMAKE_OSX_SYSROOT) - list(APPEND protobuf_configure_args - -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} - ) - endif() -endif() - -ExternalProject_Add(Protobuf - URL ${_cura_protobuf_url} - URL_MD5 ${_cura_protobuf_md5} - CONFIGURE_COMMAND ${CMAKE_COMMAND} ${protobuf_configure_args} -G ${CMAKE_GENERATOR} ../Protobuf/cmake -) - -if(BUILD_OS_WINDOWS) - # Compile it again, this time using MinGW - # We need to build the Arcus Python plugin with MSVC due to Python. - # However, we also need a MinGW library because CuraEngine does not really support MSVC. - # Since the two are ABI-incompatible we need two versions of the library... - set(protobuf_configure_args - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_INSTALL_LIBDIR=lib-mingw - -DCMAKE_CXX_STANDARD=11 - -DCMAKE_CXX_STANDARD_REQUIRED=ON - -DCMAKE_CXX_EXTENSIONS=OFF - -Dprotobuf_BUILD_TESTS=OFF - -Dprotobuf_BUILD_EXAMPLES=OFF - -Dprotobuf_BUILD_SHARED_LIBS=OFF - -Dprotobuf_WITH_ZLIB=OFF - ) - - # HACK: Protobuf-MinGW depends on Protobuf is because CuraEngine needs to use protoc.exe to generate C++ code. - # Because we compile CuraEngine with MinGW, it needs to use the protoc.exe that's also compiled with MinGW to - # generate C++ code and library links that works with MinGW. With the current configuration, because Protobuf-MinGW - # depends on Protobuf, it will install its binary into CMAKE_INSTALL_PREFIX\bin, overwriting the protoc.exe - # compiled with MSVC. Because we don't need the protoc.exe from MSVC, this works. Ideally, it would be better to - # separate the 2 sub-environments, MSVC and MinGW, but to keep this compatible with the current systems, we leave - # it for now. - ExternalProject_Add(Protobuf-MinGW - URL ${_cura_protobuf_url} - URL_HASH SHA256=${_cura_protobuf_sha256} - DEPENDS Protobuf - CONFIGURE_COMMAND ${CMAKE_COMMAND} ${protobuf_configure_args} -G "MinGW Makefiles" ../Protobuf-MinGW/cmake - BUILD_COMMAND mingw32-make - INSTALL_COMMAND mingw32-make install - ) -endif() - -add_custom_command( - TARGET Protobuf POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_BINARY_DIR}/Protobuf-prefix/src/Protobuf/src/google/" "${CMAKE_INSTALL_PREFIX}/include/." - COMMENT "Protobuf: Needs more headers than can be found in the include directory. This is probably an oversight in protobuf. Just dump the intire protobuf source in the include directory then." - ) - diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index f3326135..c84c57ed 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -1,5 +1,5 @@ -#Copyright (c) 2022 Ultimaker B.V. -#cura-build-environment is released under the terms of the AGPLv3 or higher. +# Copyright (c) 2022 Ultimaker B.V. +# cura-build-environment is released under the terms of the AGPLv3 or higher. GetFromEnvironmentOrCache( NAME @@ -9,22 +9,15 @@ GetFromEnvironmentOrCache( DESCRIPTION "The name of the tag or branch to build for pynest2d") -set(extra_cmake_args "") -if(BUILD_OS_WINDOWS) - set(extra_cmake_args -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX}) -endif() - ExternalProject_Add(pynest2d - GIT_REPOSITORY https://github.com/Ultimaker/pynest2d.git - GIT_TAG origin/${PYNEST2D_BRANCH_OR_TAG} - GIT_SHALLOW 1 - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} - -DBUILD_STATIC=OFF - ${extra_cmake_args} - BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} || echo "ignore error" - INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install -) + GIT_REPOSITORY https://github.com/Ultimaker/pynest2d.git + GIT_TAG origin/${PYNEST2D_BRANCH_OR_TAG} + GIT_SHALLOW 1 + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DSIP_BUILD_EXECUTABLE=sip-build + -DPython_SITEARCH=${Python_SITEARCH} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/${CMAKE_TOOLCHAIN_FILE} + DEPENDS libnest2d Python) -SetProjectDependencies(TARGET pynest2d DEPENDS Python libnest2d) diff --git a/projects/python.cmake b/projects/python.cmake index 2b3f4238..225a2420 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -1,80 +1,42 @@ -if(BUILD_OS_OSX) - GetFromEnvironmentOrCache( - NAME - CMAKE_CXX_COMPILER - DEFAULT - clang++ - DESCRIPTION - "Specify the CXX compiler to use") - GetFromEnvironmentOrCache( - NAME - CMAKE_C_COMPILER - DEFAULT - clang - DESCRIPTION - "Specify the C compiler to use") - set(python_configure_command CXXFLAGS="-stdlib=libc++" CXX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} ./configure --prefix=${CMAKE_INSTALL_PREFIX} --enable-shared --enable-ipv6 --without-pymalloc ) +# Copyright (c) 2022 Ultimaker B.V. +# cura-build-environment is released under the terms of the AGPLv3 or higher. +# +# Sets up a virtual environment using the Python interpreter + +if(WIN32) + set(ext .pyd) + set(env_path_sep ";") else() - set(python_configure_command ./configure --prefix=${CMAKE_INSTALL_PREFIX} --enable-shared --enable-ipv6 --without-pymalloc ) - + set(ext .so) + set(env_path_sep ":") endif() -set(python_build_command make -j ${N_PROC}) -set(python_install_command make install) -set(patch_command ) - -if(BUILD_OS_WINDOWS) - # Otherwise Python will not be able to get external dependencies. - find_package(Subversion REQUIRED) - set(python_configure_command ) - # Use the Windows Batch script to pass an argument "/p:PlatformToolset=v140". The argument must have double quotes - # around it, otherwise it will be evaluated as "/p:PlatformToolset v140" in Windows Batch. Passing this argument - # in CMake via a command seems to always result in "/p:PlatformToolset v140". - set(python_build_command cmd /c "${CMAKE_SOURCE_DIR}/projects/build_python_windows.bat" "/PCbuild/build.bat" --no-tkinter -c Release -e -M -p x64) - set(python_install_command cmd /c "${CMAKE_SOURCE_DIR}/projects/install_python_windows.bat amd64 ${CMAKE_INSTALL_PREFIX}") +if(NOT DEFINED Python_VERSION) + set(Python_VERSION + 3.10 + CACHE STRING "Python Version" FORCE) + message(STATUS "Setting Python version to ${Python_VERSION}. Set Python_VERSION if you want to compile against an other version.") endif() - -if(BUILD_OS_OSX) - set(python_configure_command ${python_configure_command} --with-openssl=${CMAKE_INSTALL_PREFIX}) +if(APPLE) + set(Python_FIND_FRAMEWORK NEVER) endif() - -if(BUILD_OS_LINUX) - # Set a proper RPATH so everything depending on Python does not need LD_LIBRARY_PATH - set(python_configure_command LDFLAGS=-Wl,-rpath=${CMAKE_INSTALL_PREFIX}/lib ${python_configure_command} --with-openssl=${CMAKE_INSTALL_PREFIX}) - - # FIXME: Not longer needed when we update to Python 3.11 - set(patch_command git apply ${CMAKE_SOURCE_DIR}/projects/0001-bpo-45433-Do-not-link-libpython-against-libcrypt-GH-.patch) -endif() - -ExternalProject_Add(Python - URL https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgz - URL_HASH SHA256=3c0ede893011319f9b0a56b44953a3d52c7abf9657c23fb4bc9ced93b86e9c97 - PATCH_COMMAND "${patch_command}" - CONFIGURE_COMMAND "${python_configure_command}" - BUILD_COMMAND ${python_build_command} - INSTALL_COMMAND ${python_install_command} - BUILD_IN_SOURCE 1 -) - -# CPython has a number of dependencies (OpenSSL, bzip, xz, zlib, sqlite) -# cryptography requires cffi, which requires libffi -# Numpy needs OpenBLAS. -if(BUILD_OS_LINUX) - SetProjectDependencies(TARGET Python DEPENDS OpenBLAS OpenSSL bzip2-static bzip2-shared xz zlib sqlite3 libffi) -elseif(BUILD_OS_OSX) - SetProjectDependencies(TARGET Python DEPENDS OpenBLAS OpenSSL xz zlib sqlite3 libffi) +find_package(cpython ${Python_VERSION} QUIET COMPONENTS Interpreter) +if(NOT TARGET cpython::python) + find_package(Python ${Python_VERSION} EXACT REQUIRED COMPONENTS Interpreter) else() - SetProjectDependencies(TARGET Python DEPENDS OpenBLAS) + add_library(Python::Python ALIAS cpython::python) + set(Python_SITEARCH "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages") + set(Python_EXECUTABLE ${cpython_PACKAGE_FOLDER_RELEASE}/bin/python3) + set($ENV{PYTHONPATH} ${Python_SITEARCH}) endif() +message(STATUS "Using Python ${Python_VERSION}") + -# Make sure pip and setuptools are installed into our new Python -ExternalProject_Add_Step(Python ensurepip - COMMAND ${Python3_EXECUTABLE} -m ensurepip - DEPENDEES install -) +add_custom_target(Python ALL COMMENT "Create Virtual Environment") -ExternalProject_Add_Step(Python baserequirements - COMMAND ${Python3_EXECUTABLE} -m pip install --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/base_requirements.txt - DEPENDEES ensurepip -) +add_custom_command( + TARGET Python + COMMAND ${Python_EXECUTABLE} -m venv ${CMAKE_INSTALL_PREFIX} + COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${Python_SITEARCH}" ${Python_EXECUTABLE} -m pip install --prefix ${CMAKE_INSTALL_PREFIX} --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt + MAIN_DEPENDENCY Python) \ No newline at end of file diff --git a/projects/python_packages.cmake b/projects/python_packages.cmake deleted file mode 100644 index 5dd811ae..00000000 --- a/projects/python_packages.cmake +++ /dev/null @@ -1,27 +0,0 @@ -add_custom_target(PythonPackagesGeneral ALL - COMMAND ${Python3_EXECUTABLE} -m pip install --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt - COMMENT "Install Python packages" - DEPENDS Python -) - -if(BUILD_OS_WINDOWS) - add_custom_command( - TARGET PythonPackagesGeneral POST_BUILD - COMMAND powershell -Command "(gc hooks.py) -replace 'libffi-7.dll', 'libffi-8.dll' | Out-File -encoding ASCII hooks.py" - COMMENT "Make libffi-8.dll visible to cx_Freeze" - WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/lib/site-packages/cx_Freeze - ) -endif() -if(BUILD_OS_OSX) - # These are plug-ins in Qt where PyQt6-Qt6 does provide the bindings, but doesn't provide the binaries they need. - # Normally this isn't a problem, but on MacOS the packaging checks these dependencies and then fails to package them. - # Excluding them from the packager makes no difference. Deleting the files outright does. - add_custom_command( - TARGET PythonPackagesGeneral POST_BUILD - COMMAND rm -r "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/PyQt6/Qt6/qml/QtQml/XmlListModel" - COMMAND rm -r "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/PyQt6/Qt6/qml/QtQuick/Scene2D" - COMMAND rm -r "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/PyQt6/Qt6/qml/QtQuick/Scene3D" - COMMAND rm -r "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/PyQt6/Qt6/qml/QtQuick/LocalStorage" - COMMAND rm -r "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages/PyQt6/Qt6/qml/QtQuick/NativeStyle" - ) -endif() diff --git a/projects/requirements.txt b/projects/requirements.txt index 8c5f473b..9d925ee4 100644 --- a/projects/requirements.txt +++ b/projects/requirements.txt @@ -3,6 +3,158 @@ # make sure you use the verbose flag and personally inspect the hosts that were used when generating # When updating a major Python version these need to be updates as well + +wheel==0.37.1 \ + --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 \ + --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a +cython==0.29.26 \ + --hash=sha256:af377d543a762867da11fcf6e558f7a4a535ff8693f30cce123fab10c00fa312 \ + --hash=sha256:f5e15ff892c8afad64931ee3dd723c4755c2c516606f9aae7613bebfac62b0f6 \ + --hash=sha256:2b834ff6e4d10ba6d7a0d676dd71c1b427a181ddbbbbf79e91d1861557aab59f \ + --hash=sha256:c813799d533194b7d85203d881d8b4f567a8c644a67f50d47f1ffbf316df412f \ + --hash=sha256:6773cce9d4b3b6168d8feb2b6f06b658ef1e11cbfec075041745666d8e2a5e45 \ + --hash=sha256:362fbb9cb4627c7786231429768b54aaba5459a2a0e46c25e59f202ca6155437 +pybind11==2.6.2 \ + --hash=sha256:2d8aebe1709bc367e34e3b23d8eccbf3f387ee9d5640548c6260d33b59f02405 \ + --hash=sha256:d0e0aed9279656f21501243b707eb6e3b951e89e10c3271dedf3ae41c365e5ed + +# pytest +pytest==5.2.1 \ + --hash=sha256:7e4800063ccfc306a53c461442526c5571e1462f61583506ce97e4da6a1d88c8 \ + --hash=sha256:ca563435f4941d0cb34767301c27bc65c510cb82e90b9ecf9cb52dc2c63caaa0 +more-itertools==8.9.0 \ + --hash=sha256:70401259e46e216056367a0a6034ee3d3f95e0bf59d3aa6a4eb77837171ed996 \ + --hash=sha256:8c746e0d09871661520da4f1241ba6b908dc903839733c8203b552cffaf173bd +wcwidth==0.2.5 \ + --hash=sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784 \ + --hash=sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83 +pluggy==0.13.1 \ + --hash=sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0 \ + --hash=sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d +attrs==21.2.0 \ + --hash=sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1 \ + --hash=sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb +py==1.10.0 \ + --hash=sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3 \ + --hash=sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a +atomicwrites==1.4.0 \ + --hash=sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197 \ + --hash=sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a +colorama==0.4.4 \ + --hash=sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b \ + --hash=sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2 + +# packaging is a dependency of pytest +packaging==18.0 \ + --hash=sha256:0886227f54515e592aaa2e5a553332c73962917f2831f1b0f9b9f4380a4b9807 \ + --hash=sha256:f95a1e147590f204328170981833854229bb2912ac3d5f89e2a8ccd2834800c9 +pyparsing==2.4.2 \ + --hash=sha256:6f98a7b9397e206d78cc01df10131398f1c8b8510a2f4d97d9abd82e1aacdd80 \ + --hash=sha256:d9338df12903bbf5d65a0e4e87c2161968b10d2e489652bb47001d82a9b028b4 +six==1.12.0 \ + --hash=sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c \ + --hash=sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73 + +# pytest-benchmark +pytest-benchmark==3.2.2 \ + --hash=sha256:4512c6805318d07926efcb3b39f7b98a10d035305a93edfd5329c86cbf9cfbf7 \ + --hash=sha256:ab851115ce022639173b9497d4a4183a1d8fe9cdcf8fab9d8a57607008aedd3d +py-cpuinfo==8.0.0 \ + --hash=sha256:5f269be0e08e33fd959de96b34cd4aeeeacac014dd8305f70eb28d06de2345c5 + +# pytest-cov +pytest-cov==2.8.1 \ + --hash=sha256:cc6742d8bac45070217169f5f72ceee1e0e55b0221f54bcf24845972d3a47f2b \ + --hash=sha256:cdbdef4f870408ebdbfeb44e63e07eb18bb4619fae852f6e760645fa36172626 +coverage==5.5 \ + --hash=sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6 \ + --hash=sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2 \ + --hash=sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6 \ + --hash=sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759 \ + --hash=sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502 \ + --hash=sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a \ + --hash=sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873 \ + --hash=sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c + +# mypy +tomli==2.0.1 \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f +mypy-extensions==0.4.3 \ + --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \ + --hash=sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8 +typing-extensions==3.10.0.2 \ + --hash=sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e \ + --hash=sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34 +typed-ast==1.5.2 \ + --hash=sha256:0eb77764ea470f14fcbb89d51bc6bbf5e7623446ac4ed06cbd9ca9495b62e36e \ + --hash=sha256:1098df9a0592dd4c8c0ccfc2e98931278a6c6c53cb3a3e2cf7e9ee3b06153344 \ + --hash=sha256:183b183b7771a508395d2cbffd6db67d6ad52958a5fdc99f450d954003900266 \ + --hash=sha256:18fe320f354d6f9ad3147859b6e16649a0781425268c4dde596093177660e71a \ + --hash=sha256:26a432dc219c6b6f38be20a958cbe1abffcc5492821d7e27f08606ef99e0dffd \ + --hash=sha256:294a6903a4d087db805a7656989f613371915fc45c8cc0ddc5c5a0a8ad9bea4d \ + --hash=sha256:31d8c6b2df19a777bc8826770b872a45a1f30cfefcfd729491baa5237faae837 \ + --hash=sha256:33b4a19ddc9fc551ebabca9765d54d04600c4a50eda13893dadf67ed81d9a098 \ + --hash=sha256:42c47c3b43fe3a39ddf8de1d40dbbfca60ac8530a36c9b198ea5b9efac75c09e \ + --hash=sha256:525a2d4088e70a9f75b08b3f87a51acc9cde640e19cc523c7e41aa355564ae27 \ + --hash=sha256:58ae097a325e9bb7a684572d20eb3e1809802c5c9ec7108e85da1eb6c1a3331b \ + --hash=sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596 \ + --hash=sha256:74cac86cc586db8dfda0ce65d8bcd2bf17b58668dfcc3652762f3ef0e6677e76 \ + --hash=sha256:8c08d6625bb258179b6e512f55ad20f9dfef019bbfbe3095247401e053a3ea30 \ +mypy==0.931 \ + --hash=sha256:0038b21890867793581e4cb0d810829f5fd4441aa75796b53033af3aa30430ce \ + --hash=sha256:1171f2e0859cfff2d366da2c7092b06130f232c636a3f7301e3feb8b41f6377d \ + --hash=sha256:1b06268df7eb53a8feea99cbfff77a6e2b205e70bf31743e786678ef87ee8069 \ + --hash=sha256:1b65714dc296a7991000b6ee59a35b3f550e0073411ac9d3202f6516621ba66c \ + --hash=sha256:1bf752559797c897cdd2c65f7b60c2b6969ffe458417b8d947b8340cc9cec08d \ + --hash=sha256:300717a07ad09525401a508ef5d105e6b56646f7942eb92715a1c8d610149714 \ + --hash=sha256:3c5b42d0815e15518b1f0990cff7a705805961613e701db60387e6fb663fe78a \ + --hash=sha256:4365c60266b95a3f216a3047f1d8e3f895da6c7402e9e1ddfab96393122cc58d \ + --hash=sha256:50c7346a46dc76a4ed88f3277d4959de8a2bd0a0fa47fa87a4cde36fe247ac05 \ + --hash=sha256:5b56154f8c09427bae082b32275a21f500b24d93c88d69a5e82f3978018a0266 \ + --hash=sha256:74f7eccbfd436abe9c352ad9fb65872cc0f1f0a868e9d9c44db0893440f0c697 \ + --hash=sha256:7b3f6f557ba4afc7f2ce6d3215d5db279bcf120b3cfd0add20a5d4f4abdae5bc \ + --hash=sha256:8c11003aaeaf7cc2d0f1bc101c1cc9454ec4cc9cb825aef3cafff8a5fdf4c799 \ + --hash=sha256:8ca7f8c4b1584d63c9a0f827c37ba7a47226c19a23a753d52e5b5eddb201afcd \ + --hash=sha256:c89702cac5b302f0c5d33b172d2b55b5df2bede3344a2fbed99ff96bddb2cf00 \ + --hash=sha256:d8f1ff62f7a879c9fe5917b3f9eb93a79b78aad47b533911b853a757223f72e7 \ + --hash=sha256:d9d2b84b2007cea426e327d2483238f040c49405a6bf4074f605f0156c91a47a \ + --hash=sha256:e839191b8da5b4e5d805f940537efcaa13ea5dd98418f06dc585d2891d228cf0 \ + --hash=sha256:f9fe20d0872b26c4bba1c1be02c5340de1019530302cf2dcc85c7f9fc3252ae0 \ + --hash=sha256:ff3bf387c14c805ab1388185dd22d6b210824e164d4bb324b195ff34e322d166 + +# cryptography is needed before we collect/install PyQt5 +cffi==1.14.1 \ + --hash=sha256:267adcf6e68d77ba154334a3e4fc921b8e63cbb38ca00d33d40655d4228502bc \ + --hash=sha256:6923d077d9ae9e8bacbdb1c07ae78405a9306c8fd1af13bfa06ca891095eb995 \ + --hash=sha256:98be759efdb5e5fa161e46d404f4e0ce388e72fbf7d9baf010aff16689e22abe \ + --hash=sha256:b1d6ebc891607e71fd9da71688fcf332a6630b7f5b7f5549e6e631821c0e5d90 \ + --hash=sha256:b2a2b0d276a136146e012154baefaea2758ef1f56ae9f4e01c612b0831e0bd2f \ + --hash=sha256:d3148b6ba3923c5850ea197a91a42683f946dba7e8eb82dfa211ab7e708de939 +pycparser==2.20 \ + --hash=sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705 + +cryptography==3.4.8; \ +sys_platform=="darwin" \ + --hash=sha256:a00cf305f07b26c351d8d4e1af84ad7501eca8a342dedf24a7acb0e7b7406e14 + +cryptography==3.4.8; \ +sys_platform=="win32" \ + --hash=sha256:3520667fda779eb788ea00080124875be18f2d8f0848ec00733c0ec3bb8219fc + +cryptography==3.4.8; \ +sys_platform=="linux" \ + --hash=sha256:1eb7bb0df6f6f583dd8e054689def236255161ebbcf62b226454ab9ec663746b + +toml==0.10.2 \ + --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \ + --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f +sip==6.5 \ + --hash=sha256:28edf2e20db20ebf135e94e3295d8a90427e4ea461337413bf3ff2ce31bbdafe \ + --hash=sha256:71332c6f209a45bf019a352fe0374fa9d58fe1f6970c8e13dbeec62e5bab2114 \ + --hash=sha256:75ca74f5a6a2024dd984aece7ecc78676ec99be218b504744392dfbdf2d4200a \ + --hash=sha256:a1cf8431a8eb9392b3ff6dc61d832d0447bfdcae5b3e4256a5fa74dbc25b0734 + # pyinstaller pyinstaller==4.10 \ --hash=sha256:05c21117b84199272ebd355b556af4714f6e79245e1c435d6f16653786d7d17e \ diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 9367b5c1..3ac0c0b1 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -9,26 +9,14 @@ GetFromEnvironmentOrCache( DESCRIPTION "The name of the tag or branch to build for Savitar") -set(extra_cmake_args "") -if(BUILD_OS_WINDOWS) - set(extra_cmake_args - -DCMAKE_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/libs - -DMSVC_STATIC_RUNTIME=OFF - ) -endif() - ExternalProject_Add(Savitar - GIT_REPOSITORY https://github.com/ultimaker/libSavitar.git - GIT_TAG origin/${SAVITAR_BRANCH_OR_TAG} - GIT_SHALLOW 1 - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} - -DCMAKE_CXX_STANDARD=17 - -DBUILD_STATIC=OFF - ${extra_cmake_args} - BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} - INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install || echo "ignore error" -) - -SetProjectDependencies(TARGET Savitar DEPENDS Python) + GIT_REPOSITORY https://github.com/ultimaker/libSavitar.git + GIT_TAG origin/${SAVITAR_BRANCH_OR_TAG} + GIT_SHALLOW 1 + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DSIP_BUILD_EXECUTABLE=sip-build + -DPython_SITEARCH=${Python_SITEARCH} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/${CMAKE_TOOLCHAIN_FILE} + DEPENDS Python) diff --git a/projects/sqlite3.cmake b/projects/sqlite3.cmake deleted file mode 100644 index affc2c40..00000000 --- a/projects/sqlite3.cmake +++ /dev/null @@ -1,37 +0,0 @@ -if(BUILD_OS_OSX) - GetFromEnvironmentOrCache( - NAME - CMAKE_CXX_COMPILER - DEFAULT - clang++ - DESCRIPTION - "Specify the CXX compiler to use") - GetFromEnvironmentOrCache( - NAME - CMAKE_C_COMPILER - DEFAULT - clang - DESCRIPTION - "Specify the C compiler to use") - - ExternalProject_Add(sqlite3 - URL https://sqlite.org/2018/sqlite-autoconf-3260000.tar.gz - URL_HASH SHA256=5daa6a3fb7d1e8c767cd59c4ded8da6e4b00c61d3b466d0685e35c4dd6d7bf5d - CONFIGURE_COMMAND CXXFLAGS="-stdlib=libc++" CXX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} --with-sysroot=${CMAKE_OSX_SYSROOT} - BUILD_COMMAND make -j ${N_PROC} - INSTALL_COMMAND make install - BUILD_IN_SOURCE 1 - ) - SetProjectDependencies(TARGET sqlite3 DEPENDS zlib) -elseif(BUILD_OS_LINUX) - ExternalProject_Add(sqlite3 - URL https://sqlite.org/2018/sqlite-autoconf-3260000.tar.gz - URL_HASH SHA256=5daa6a3fb7d1e8c767cd59c4ded8da6e4b00c61d3b466d0685e35c4dd6d7bf5d - PATCH_COMMAND libtoolize - CONFIGURE_COMMAND ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} - BUILD_COMMAND make -j ${N_PROC} - INSTALL_COMMAND make install - BUILD_IN_SOURCE 1 - ) - SetProjectDependencies(TARGET sqlite3 DEPENDS zlib) -endif() diff --git a/projects/xz.cmake b/projects/xz.cmake deleted file mode 100644 index 4f5d6d8d..00000000 --- a/projects/xz.cmake +++ /dev/null @@ -1,33 +0,0 @@ -if(BUILD_OS_OSX) - GetFromEnvironmentOrCache( - NAME - CMAKE_CXX_COMPILER - DEFAULT - clang++ - DESCRIPTION - "Specify the CXX compiler to use") - GetFromEnvironmentOrCache( - NAME - CMAKE_C_COMPILER - DEFAULT - clang - DESCRIPTION - "Specify the C compiler to use") - ExternalProject_Add(xz - GIT_REPOSITORY https://git.tukaani.org/xz.git - GIT_TAG v5.2.4 - CONFIGURE_COMMAND ./autogen.sh && CXXFLAGS="-stdlib=libc++" CXX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} --with-sysroot=${CMAKE_OSX_SYSROOT} - BUILD_COMMAND make -j ${N_PROC} - INSTALL_COMMAND make install - BUILD_IN_SOURCE 1 - ) -elseif(BUILD_OS_LINUX) - ExternalProject_Add(xz - GIT_REPOSITORY https://git.tukaani.org/xz.git - GIT_TAG v5.2.4 - CONFIGURE_COMMAND ./autogen.sh && ./configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=${CMAKE_INSTALL_PREFIX} - BUILD_COMMAND make -j ${N_PROC} - INSTALL_COMMAND make install - BUILD_IN_SOURCE 1 - ) -endif() diff --git a/projects/zlib.cmake b/projects/zlib.cmake deleted file mode 100644 index 681d4088..00000000 --- a/projects/zlib.cmake +++ /dev/null @@ -1,12 +0,0 @@ -if(BUILD_OS_OSX OR BUILD_OS_LINUX) - ExternalProject_Add(zlib - GIT_REPOSITORY https://github.com/madler/zlib.git - GIT_TAG v1.2.11 - GIT_SHALLOW 1 - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_CXX_STANDARD=17 - -DAMD64=ON - ) -endif() From 71a08b15443383e40309dd08ebf56eae08a27044 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 30 Mar 2022 07:02:47 +0200 Subject: [PATCH 104/213] Update README Only contains Linux instructions for now and still WIP Contributes to CURA-8640 --- README.md | 420 ++++++++++++++++++++---------------------------------- 1 file changed, 157 insertions(+), 263 deletions(-) diff --git a/README.md b/README.md index a838da17..b95ac1a2 100644 --- a/README.md +++ b/README.md @@ -1,283 +1,177 @@ -cura-build-environment -====================== - -This is a CMake-based project that will build the dependencies for Cura. - -It will download and build the following projects: - -- Python -- Qt (Not on Windows) -- Sip -- PyQt (Installs Wheel on Windows) -- OpenBLAS (Only on Linux) -- Numpy (Installs Wheel on Windows) -- Scipy (Installs Wheel on Windows) -- Protobuf -- Arcus -- python-netifaces -- python-six -- python-zeroconf -- pyserial -- Savitar -- cx_Freeze -- AppImageKit (Only on Linux) -- python-utils -- Numpy-STL - -To build these dependencies of Cura, the following software needs to be installed on your system: - -- **CMake** Once CMake is installed make sure it is available on your `%PATH%`. Check this by running `cmake --version` in the Windows console. (http://www.cmake.org/) -- **git** - The `git` command should be available on your `%PATH%` or `$PATH`, depending which OS you are using. (https://git-scm.com/) - - (WINDOWS) Make sure that the `cmd` directory in the git for windows installation directory is on the `%PATH%` and *not* its `bin` directory, otherwise mingw32 will complain about `sh.exe` being on the path. (https://git-for-windows.github.io/) - - (LINUX) Check your package management system for the term `git`. You should be able to find easily there. -- **Subversion aka "svn"** - To fetch some sources - -On Linux, the following dependencies are required in order to build Qt: -- pkg-config -- freetype -- xcb -- opengl-desktop -- fontconfig - -The end result of this project should be a complete build environment -installed to CMAKE_INSTALL_PREFIX. This environment can be used in -combination with the [cura-build] repository to produce Cura executables for -all three supported platforms. - -[cura-build]: https://github.com/ultimaker/cura-build - - -# Docker Images (Linux and Windows) - -The lastest docker images can be found on DockerHub via https://hub.docker.com/r/ultimaker/cura-build-environment. -Currently only the CentOS-based images are available. To get the latest CentOS-base image, you can run - -```shell script -docker pull ultimaker/cura-build-environment -``` - -There are Dockerfiles for Linux and Windows. You can find them in the `docker` -directory. The main Dockerfiles are as follows: - - - `docker/linux/Dockerfile.centos`: Based on centos7 - - `docker/windows/Dockerfile.vs2015`: Based on Windows Server Core 1809 with - Visual Studio 2015 Build Tools - -To build a docker, you can use the commands below: - -```shell script -# Make sure that you are in the `cura-build-environment` root directory. - -# Build the Linux image based on centos7 -docker build -t -f docker/linux/Dockerfile.centos . -``` - -```powershell -# Build the Windows image based on Windows Server Core 1809 with -# Visual Studio 2015 Build Tools -docker build -t -f docker/windows/Dockerfile.vs2015 . -``` - -Note that the Windows Dockerfile uses `mcr.microsoft.com/windows/servercore:1809-amd64` -as the base image. See https://hub.docker.com/_/microsoft-windows-servercore): "Windows -requires the host OS version to match the container OS version." So, if the `1809` base -image doesn't work for you, try to change it to an eariler version, for example `1607`. -To check your Windows version, you can run the PowerShell command below: - -```powershell -PS > [System.Environment]::OSVersion.Version - -Major Minor Build Revision ------ ----- ----- -------- -10 0 17763 0 -``` - -**IMPORTANT:** There's a known issue with Windows docker images earlier than version `1809` -that CMake git clone and submodule commands can fail due to SSL verification. In -cura-build-environment, this can happen for `libArcus` and `libSavitar`. A workaround is -to use the `GIT_CONFIG` option in `ExternalProject_Add()` to disable SSL verification. -To do so, add the following line: - -``` -ExternalProject_Add(myProj - GIT_REPOSITORY https://github.com/my/project - ... - GIT_CONFIG http.sslVerify=false - ... -) -``` - -The built cura-build-environment will be installed in the following paths in the -docker images: - - `Linux` : `/srv/cura-build-environment` - - `Windows` : `C:\cura-build-environment` - -There are 2 main environment variables in the image: - - - `CURA_BUILD_ENV_BUILD_TYPE`: The build type, either `Release` (default) or - `Debug`. - - `CURA_BUILD_ENV_PATH`: Where the cura-build-environment is installed. - -You can use a number of arguments to customize the image you want to build. The -available arugments are as follows: - - - `CURA_BUILD_ENV_BUILD_TYPE`: By default `Release`, this is passed to cmake via `CMAKE_BUILD_TYPE`. - - `CURA_BUILD_ENV_PATH`: Where the cura-build-environment will be installed in the image. - - `CURA_ARCUS_BRANCH_OR_TAG`: The git branch/tag to use for building libArcus. - - `CURA_SAVITAR_BRANCH_OR_TAG`: The git branch/tag to use for building libSavitar. - -You can configure them via the example command below: +# cura-build-environment + +**WIP** + +This repository contains helper scripts for building Cura from source. It will create a base environment from which +you can (re)build Cura on a regular basis, in an time efficient matter. It consists of the following tools. + +## CMake script + +The CMake project will ensure that the following dependencies are build and can be installed in a location for future +use. It will download and install the following projects: + +- libnest2d +- pynest2d +- libsavitar +- libarcus +- Python dependencies + - wheel + - cython + - pybind11 + - pytest + - more-itertools + - wcwidth + - pluggy + - attrs + - py + - atomicwrites + - colorama + - packaging + - pyparsing + - six + - pytest-benchmark + - py-cpuinfo + - pytest-cov + - coverage + - tomli + - mypy-extensions + - typing-extensions + - typed-ast + - mypy + - cffi + - pycparser + - cryptography + - sys_platform + - cryptography + - sys_platform + - cryptography + - sys_platform + - toml + - sip + - pyinstaller + - altgraph + - pyinstaller-hooks-contrib + - pefile + - macholib + - appdirs + - certifi + - chardet + - decorator + - idna + - netifaces + - networkx + - numpy-stl + - pycollada + - PyQt6-sip + - PyQt6 + - PyQt6-Qt6 + - pyserial + - python-dateutil + - python-utils + - requests + - sentry-sdk + - trimesh + - urllib3 + - importlib-metadata + - zipp + - jeepney + - SecretStorage + - keyring + - Twisted + - constantly + - hyperlink + - incremental + - zope.interface + - Automat + - twisted-iocpsupport + - zeroconf + - ifaddr + - numpy + - scipy + - pyclipper + - lxml + - pywin32 + - pywin32-ctypes + - cx-Logging + +The list of dependencies above also have their own dependencies, such as: + +- cpython +- protobuf +- clipper +- boost +- gtest +- nlopt + +These can be installed with the help of [Conan](https://conan.io/), which is a dependency manager for C++ projects. +It will either download the binaries and header files or compile it automatically from source. It will also generate +the CMake find_package modules, such that these can be used. The `conanfile.txt` located in the root of this directory +specifies a list of used dependencies. + +Installation of Conan is simple: ```bash -docker build \ - --build-arg CURA_BUILD_ENV_BUILD_TYPE=Release \ - --build-arg CURA_ARCUS_BRANCH_OR_TAG=master \ - ... +pip install conan ``` -## Details about the Linux CentOS 7 Docker Image +> Ultimaker has its own standard Conan configuration, you could apply these with the command below. Keep in mind that +> this isn't necesarry and it might overwrite your current Conan configuration +> ```bash +> conan config install https://github.com/ultimaker/conan-config.git +> ``` -The default user is `ultimaker` with `uid=1000` and group `ultimaker` with -`gid=1000`. This ensures if volume mounting is used, the resulting files should -have the correct ownerships which corresponds to the default linux user on the -host machine. -The development tool in use is `devtoolset-7`. In order to use the build -environment correctly in the docker container, make sure that the following -is done before you do anything else: +Once Conan is installed and configured, installing the cura-build-environment is easy. The steps below should do the +trick. ```bash -#!/bin/bash - -# Enable devtoolset-7 with its environment variables -source /opt/rh/devtoolset-7/enable -# Make sure that the executables and packages in the install cura-build-environment -# will be preferred. -export PATH="${CURA_BUILD_ENV_PATH}/bin:${PATH}" -export PKG_CONFIG_PATH="${CURA_BUILD_ENV_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}" +mkdir build && cd build +conan install .. --build=missing +cmake -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_PREFIX_PATH= -DCMAKE_INSTALL_PREFIX= +. activate_run.sh +cmake --build . +cmake --install . ``` +_For more detailed explanation and options see the [Conan online documentation](https://docs.conan.io/en/latest/)._ -Note that the default entrypoint of this image is `/docker-entrypoint.sh`, -which executes the commands above. +The `` should now contain all used dependencies which can be used by the +[cura-build](https://github.com/Ultimaker/cura-build) repository. -# Building cura-build-environment on Native Machine +# Recommended usage with Docker image -## Linux - -Building on Linux is fairly straightforward: - -``` -cbe_src_dir= -cbe_install_dir= - -cd $cbe_src_dir -mkdir build -cd build - -# Set some environment variables to make sure that the installed tools can be found. -export PATH=$cbe_install_dir/bin:$PATH -export PKG_CONFIG_PATH=$cbe_install_dir/lib/pkgconfig:$PKG_CONFIG_PATH - -cmake -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=$cbe_install_dir \ - -DCMAKE_PREFIX_PATH=$cbe_install_dir \ - .. -make -``` - -Note that a fairly recent C++ compiler is required, at the very least GCC -4.9. If you are building on CentOS, you can get this from the devtoolset -packages. - -## Mac OS - -Building on MacOS currently requires OpenSSL and a recent version of the -development tools distributed with XCode. You may also want to set -MACOSX_DEPLOYMENT_TARGET to ensure everything can be used with older -versions of Mac OS. The "env_osx.sh" will set it to 10.7 and ensure the -right compiler is still used. It also add the relevant directories for -OpenSSL installed through Brew. - -On newer versions of MacOS, the zlib headers cannot be found unless -XCode Command Line Tools are installed first. To install those, please -run the following first: - -``` -xcode-select --install -``` - -To build, run the following: - -``` -cbe_src_dir= -cbe_install_dir= +This repository also contains dockerfiles which will build a cura-builder image for either Windows or Linux. These images +contain all build essentials to both build cura-build-environment and cura-build -cd $cbe_src_dir -mkdir build -cd build - -source ../env_osx.sh - -# Set some environment variables to make sure that the installed tools can be found. -export PATH=$cbe_install_dir/bin:$PATH -export PKG_CONFIG_PATH=$cbe_install_dir/lib/pkgconfig:$PKG_CONFIG_PATH +## Linux -cmake -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=$cbe_install_dir \ - -DCMAKE_PREFIX_PATH=$cbe_install_dir \ - .. -make +Build the docker file +```bash +docker build -t cura-build -f docker/linux/Dockerfile ``` -## Windows - - - -cura-build-environment on Windows requires Visual C++ 2015 (14.0) and MinGW-w64 -(version 4.9 or higher). Python and all Python modules are compiled with VC++ -and CuraEngine is built with MinGW. - -**Microsoft Visual Studio 2015 (Recommended)** -1. Download Microsoft Visual Studio from [here (Web Installer)](https://go.microsoft.com/fwlink/?LinkId=532606&clcid=0x409) or -[here (ISO Image)](https://go.microsoft.com/fwlink/?LinkId=615448&clcid=0x409). -2. Run the installer. To save on space, Custom can be selected with only `Visual C++` selected in Programming Languages. The complete installation will be large (>12 GB) and will take a while to complete. - -**MinGW-w64** -1. Download mingw-w64 from [here (executable installer)](https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe/download) -2. In the Settings page of the installer, select Architecture: i686 for 32bit or x86_64 for 64bit systems -3. Ensure that the directory C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin (or the i686 equivalent) is in your PATH - -The current cura-build-environment uses Python 3.5.2 which can be compiled with -Visual C++ 2015 (14.0) with Windows 8.1 SDK. Visual Studio 2017 doesn't seem to -be able to compile Python 3.5.* successfully. - -In addition, Subversion is required for building Python (for building OpenSSL). -Please make sure all required tools are accessible through your path. - -The `env_win32.bat` and `env_win64.bat` will make sure to set a few -environment variables that are required. Most importantly, they call the -`vcvarsall.bat` files from Visual C++ to ensure VC++ can be used. - -To build, run the following: +This docker image can be used to create a cura-build-environment and a cura-build. +First we need to create a build environment +```bash +docker run --name cura-builder \ +-v :/home/ultimaker/source \ +-v :/home/ultimaker/build \ +-v :/home/ultimaker/install \ +-v ~/.conan/data:/home/ultimaker/.conan/data ``` -set cbe_src_dir= -set cbe_install_dir= +> NOTE: +> By specifying the conan data folder we ensure that big dependencies, such as Python +> and Boost can be used in multiple environments and are reused when we are recreating +> the environment from scratch. -cd %cbe_src_dir% -mkdir build -cd build +Once the environment is build and installed in the path `` we can then check out +the cura-build repository and build Cura using the cura-builder and the previously build cura-build-environment. -..\env_win64.bat - -cmake -DCMAKE_BUILD_TYPE=Release ^ - -DCMAKE_INSTALL_PREFIX=%cbe_install_dir% ^ - -DCMAKE_PREFIX_PATH=%cbe_install_dir% ^ - -G "NMake Makefiles" ^ - .. -nmake -``` - -Note: Using the NMake Makefiles generator is important, since the normal -Visual Studio generator does not work well in combination with some of -the build systems of the sub-projects that are built. +```bash +docker run --name cura-builder \ +-v :/home/ultimaker/source \ +-v :/home/ultimaker/build \ +-v :/home/ultimaker/install \ +-v :/home/ultimaker/env \ +-v ~/.conan/data:/home/ultimaker/.conan/data +``` \ No newline at end of file From 017361bf7d6cef448825e5e9d9d2547079fc3223 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 30 Mar 2022 09:03:37 +0200 Subject: [PATCH 105/213] Don't clone with depth==1 Checking out branch or tag seems to behave problematic atm. Allow checking out a specific commit by hash. Specify the _BRANCH_OR_TAG as follows: - branch: `origin/CURA-8640` - tag: `v4.13.0` - commit: `e666f5` Contributes to CURA-8640 --- CMakeLists.txt | 4 ++++ projects/arcus.cmake | 7 ++++--- projects/libnest2d.cmake | 7 ++++--- projects/pynest2d.cmake | 9 ++++----- projects/python.cmake | 3 ++- projects/savitar.cmake | 8 ++++---- 6 files changed, 22 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 650d1f03..553a8c78 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,10 @@ if(N_PROC EQUAL 0) set(N_PROC 1) endif() +add_custom_target(projects) + +message(STATUS "Using toolchain: ${CMAKE_TOOLCHAIN_FILE}") + include(projects/python.cmake) include(projects/libnest2d.cmake) include(projects/pynest2d.cmake) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 3953ee4f..238571dd 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -7,15 +7,16 @@ GetFromEnvironmentOrCache( DEFAULT master DESCRIPTION - "The name of the tag or branch to build for Arcus") + "The name of the tag (e.q.: v4.13.0), branch (e.q.: origin/CURA-8640) or commit hash (e.q.: 961dabf) for Arcus") ExternalProject_Add(Arcus GIT_REPOSITORY https://github.com/ultimaker/libArcus.git - GIT_TAG origin/${ARCUS_BRANCH_OR_TAG} + GIT_TAG ${ARCUS_BRANCH_OR_TAG} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DSIP_BUILD_EXECUTABLE=sip-build -DPython_SITEARCH=${Python_SITEARCH} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/${CMAKE_TOOLCHAIN_FILE} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} DEPENDS Python) +add_dependencies(projects Arcus) \ No newline at end of file diff --git a/projects/libnest2d.cmake b/projects/libnest2d.cmake index 59c75395..3a3663bf 100644 --- a/projects/libnest2d.cmake +++ b/projects/libnest2d.cmake @@ -7,12 +7,13 @@ GetFromEnvironmentOrCache( DEFAULT master DESCRIPTION - "The name of the tag or branch to build for libnest2d") + "The name of the tag (e.q.: v4.13.0), branch (e.q.: origin/CURA-8640) or commit hash (e.q.: 961dabf) for libnest2d") ExternalProject_Add(libnest2d GIT_REPOSITORY https://github.com/Ultimaker/libnest2d.git - GIT_TAG origin/${LIBNEST2D_BRANCH_OR_TAG} + GIT_TAG ${LIBNEST2D_BRANCH_OR_TAG} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/${CMAKE_TOOLCHAIN_FILE}) + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) +add_dependencies(projects Arcus) \ No newline at end of file diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index c84c57ed..1763915d 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -7,17 +7,16 @@ GetFromEnvironmentOrCache( DEFAULT master DESCRIPTION - "The name of the tag or branch to build for pynest2d") + "The name of the tag (e.q.: v4.13.0), branch (e.q.: origin/CURA-8640) or commit hash (e.q.: 961dabf) for pynest2d") ExternalProject_Add(pynest2d GIT_REPOSITORY https://github.com/Ultimaker/pynest2d.git - GIT_TAG origin/${PYNEST2D_BRANCH_OR_TAG} - GIT_SHALLOW 1 + GIT_TAG ${PYNEST2D_BRANCH_OR_TAG} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DSIP_BUILD_EXECUTABLE=sip-build -DPython_SITEARCH=${Python_SITEARCH} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/${CMAKE_TOOLCHAIN_FILE} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} DEPENDS libnest2d Python) - +add_dependencies(projects pynest2d) \ No newline at end of file diff --git a/projects/python.cmake b/projects/python.cmake index 225a2420..cd3a882a 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -39,4 +39,5 @@ add_custom_command( TARGET Python COMMAND ${Python_EXECUTABLE} -m venv ${CMAKE_INSTALL_PREFIX} COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${Python_SITEARCH}" ${Python_EXECUTABLE} -m pip install --prefix ${CMAKE_INSTALL_PREFIX} --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt - MAIN_DEPENDENCY Python) \ No newline at end of file + MAIN_DEPENDENCY Python) +add_dependencies(projects Python) \ No newline at end of file diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 3ac0c0b1..28bb7043 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -7,16 +7,16 @@ GetFromEnvironmentOrCache( DEFAULT master DESCRIPTION - "The name of the tag or branch to build for Savitar") + "The name of the tag (e.q.: v4.13.0), branch (e.q.: origin/CURA-8640) or commit hash (e.q.: 961dabf) for Savitar") ExternalProject_Add(Savitar GIT_REPOSITORY https://github.com/ultimaker/libSavitar.git - GIT_TAG origin/${SAVITAR_BRANCH_OR_TAG} - GIT_SHALLOW 1 + GIT_TAG ${SAVITAR_BRANCH_OR_TAG} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DSIP_BUILD_EXECUTABLE=sip-build -DPython_SITEARCH=${Python_SITEARCH} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/${CMAKE_TOOLCHAIN_FILE} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} DEPENDS Python) +add_dependencies(projects Savitar) \ No newline at end of file From 5630d8dca64e23782ca12f1ee01bfdec51337a79 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 30 Mar 2022 10:11:14 +0200 Subject: [PATCH 106/213] Add additional generators VirtualRunEnv and VirtualBuildEnv ensure that variables and paths are set correctly. They can also be called from the shell if needed with a `source activate_run.sh` or `source activate_build.sh` The json generator outputs a handy json file with all files, paths, flags and variables etc. Contributes to CURA-8640 --- conanfile.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conanfile.txt b/conanfile.txt index b9ac4441..295e54d4 100644 --- a/conanfile.txt +++ b/conanfile.txt @@ -7,9 +7,11 @@ gtest/1.8.1 nlopt/2.7.0 [generators] -virtualrunenv +VirtualRunEnv +VirtualBuildEnv CMakeDeps CMakeToolchain +json [options] cpython:optimizations=True From 10ecda900ea67823930574add48d8432df773fcf Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 30 Mar 2022 16:51:15 +0200 Subject: [PATCH 107/213] Add entrypoint to dockerfile Contributes to CURA-8640 --- README.md | 36 +++++++++++++++++++++++-------- docker/linux/Dockerfile | 48 +++++++++++++++++++++++++++++------------ 2 files changed, 61 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index b95ac1a2..d74e9ccf 100644 --- a/README.md +++ b/README.md @@ -146,32 +146,50 @@ contain all build essentials to both build cura-build-environment and cura-build Build the docker file ```bash -docker build -t cura-build -f docker/linux/Dockerfile +cd docker/linux +docker build -t cura-build-env: -f Dockerfile . ``` -This docker image can be used to create a cura-build-environment and a cura-build. +This docker image can be used to create a cura-builder which helps us build the cura-build and cura-build-environment. First we need to create a build environment ```bash -docker run --name cura-builder \ +docker create -t cura-env-builder::/home/ultimaker/source \ -v :/home/ultimaker/build \ -v :/home/ultimaker/install \ --v ~/.conan/data:/home/ultimaker/.conan/data +-v ~/.conan/data:/home/ultimaker/.conan/data cura-build-env: ``` > NOTE: > By specifying the conan data folder we ensure that big dependencies, such as Python > and Boost can be used in multiple environments and are reused when we are recreating > the environment from scratch. +We can then build the environment with: +```bash +cd +docker run cura-env-builder:cura-8640 \ +-DLIBNEST2D_BRANCH_OR_TAG= \ +-DCMAKE_...... +``` + Once the environment is build and installed in the path `` we can then check out the cura-build repository and build Cura using the cura-builder and the previously build cura-build-environment. ```bash -docker run --name cura-builder \ --v :/home/ultimaker/source \ --v :/home/ultimaker/build \ --v :/home/ultimaker/install \ +docker create -t cura-builder::/home/ultimaker/source \ +-v :/home/ultimaker/build \ +-v :/home/ultimaker/install \ -v :/home/ultimaker/env \ --v ~/.conan/data:/home/ultimaker/.conan/data +-v ~/.conan/data:/home/ultimaker/.conan/data cura-build-env: +docker run cura-builder:cura-8640 \ +-DURANIUM_BRANCH_OR_TAG= \ +-DCMAKE_...... ``` \ No newline at end of file diff --git a/docker/linux/Dockerfile b/docker/linux/Dockerfile index 4161be04..f3ca51a8 100644 --- a/docker/linux/Dockerfile +++ b/docker/linux/Dockerfile @@ -6,10 +6,10 @@ LABEL linux_distro="debian-buster" \ qt_version="6.2.2" # Set build time arguments -ARG SOURCE="/home/ultimaker/source" -ARG INSTALL="/home/ultimaker/install" -ARG BUILD="/home/ultimaker/build" -ARG ENVIRONMENT="/home/ultimaker/env" +ARG SOURCE_DIR="/home/ultimaker/source" +ARG INSTALL_DIR="/home/ultimaker/install" +ARG BUILD_DIR="/home/ultimaker/build" +ARG ENVIRONMENT_DIR="/home/ultimaker/env" ARG CONAN_DATA="/home/ultimaker/.conan/data" # Create unprivileged user @@ -31,10 +31,18 @@ RUN apt update -y && \ libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev \ xkb-data libxcb-dri3-dev uuid-dev libxcb-util0-dev -ENV PATH="/home/ultimaker/env/bin:/home/ultimaker/install/bin:/usr/local/bin/:${PATH}" \ - LD_LIBRARY_PATH="/home/ultimaker/env/lib:/home/ultimaker/install/lib:/usr/lib/x86_64-linux-gnu/:/usr/lib/:/lib/:/lib/x86_64-linux-gnu/:${LD_LIBRARY_PATH}" \ +ENV PATH="${INSTALL_DIR}/bin:${INSTALL_DIR}/bin:${BUILD_DIR}/bin:/usr/local/bin/:${PATH}" \ + LD_LIBRARY_PATH="${INSTALL_DIR}/lib:${INSTALL_DIR}/lib:${BUILD_DIR}/lib:/usr/lib/x86_64-linux-gnu/:/usr/lib/:/lib/:/lib/x86_64-linux-gnu/:${LD_LIBRARY_PATH}" \ HOME=/home/ultimaker \ - USER=ultimaker + USER=ultimaker \ + SOURCE_PATH=${SOURCE_DIR} \ + INSTALL_PATH=${INSTALL_DIR} \ + BUILD_PATH=${BUILD_DIR} \ + CONAN_PATH="${BUILD_DIR}/conan" \ + ENVIRONMENT_PATH=${ENVIRONMENT_DIR} + +# Change working directory +WORKDIR /home/ultimaker/ FROM base AS base_cmake @@ -45,7 +53,7 @@ RUN wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5 make -j $(nproc) && \ make install && \ cd .. && \ - rm -rf cmake-3.21.5 && \ + rm -rf cmake-3.21.5* && \ apt-get remove -y cmake FROM base_cmake AS base_python @@ -55,7 +63,9 @@ RUN wget https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgz && \ cd Python-3.10.2 && \ ./configure --enable-optimizations && \ make -j $(nproc) && \ - make install + make install && \ + cd .. && \ + rm -rf Python-3.10.2* FROM base_python AS base_conan @@ -64,7 +74,8 @@ RUN python3 -m pip install conan && \ conan profile update settings.compiler.libcxx=libstdc++11 default && \ conan config install https://github.com/ultimaker/conan-config.git && \ conan config set general.revisions_enabled=1 && \ - conan config set general.scm_to_conandata=1 + conan config set general.scm_to_conandata=1 && \ + chown -R ultimaker:ultimaker "$HOME/.conan" FROM base_conan AS cura_build_environment @@ -75,9 +86,18 @@ RUN rm -rf /tmp/* && \ rm -rf /var/cache # Set up the build folders -RUN mkdir -p /home/ultimaker/source /home/ultimaker/build /home/ultimaker/install /home/ultimaker/env && \ - chown -R ultimaker:ultimaker /home/ultimaker -# Change working directory +RUN mkdir -p "$SOURCE_PATH" "$BUILD_PATH" "$BUILD_PATH/conan" "$INSTALL_PATH" $ENVIRONMENT_PATH && \ + chown -R ultimaker:ultimaker "$SOURCE_PATH" && \ + chown -R ultimaker:ultimaker "$BUILD_PATH" && \ + chown -R ultimaker:ultimaker "$INSTALL_PATH" && \ + chown -R ultimaker:ultimaker $ENVIRONMENT_PATH && \ + chown -R ultimaker:ultimaker $HOME + USER ultimaker:ultimaker -WORKDIR /home/ultimaker/ + +WORKDIR ${HOME} +COPY ./entrypoint.py . +WORKDIR ${BUILD_DIR} + +ENTRYPOINT ["python3", "../entrypoint.py"] From eaddb3807f475fc8c54c0dd98407fb0345e5a931 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 31 Mar 2022 10:05:51 +0200 Subject: [PATCH 108/213] Use system Python interpreter CPython currently can't be build on our Windows build server. https://github.com/conan-io/conan-center-index/issues/10028 @rburema and I did a test if it would be possible to use a system installed Python binaries. This seems to be possible. Contributes to CURA-8640 --- conanfile.txt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/conanfile.txt b/conanfile.txt index 295e54d4..cb6654f9 100644 --- a/conanfile.txt +++ b/conanfile.txt @@ -1,5 +1,4 @@ [requires] -cpython/3.10.0 protobuf/3.17.1 clipper/6.4.2 boost/1.70.0 @@ -13,8 +12,4 @@ CMakeDeps CMakeToolchain json -[options] -cpython:optimizations=True -cpython:lto=True -cpython:shared=True -cpython:pymalloc=False \ No newline at end of file +[options] \ No newline at end of file From 5da9ff6ff3997f80b0ce8d421156df6698037c19 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 31 Mar 2022 10:13:22 +0200 Subject: [PATCH 109/213] Specify system requirements Contributes to CURA-8640 --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index d74e9ccf..c7a9decc 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,27 @@ This repository contains helper scripts for building Cura from source. It will create a base environment from which you can (re)build Cura on a regular basis, in an time efficient matter. It consists of the following tools. +## System Requirements + +- Python 3.10.2 +- conan >= 1.46 + +### Linux +- GCC >= 8.0 +- CMake >= 3.16 +- GNU Make >= 4 +- Docker >= 20 + +### MacOS +- MacOS SDK +- clang-apple +- MacOS + +### Windows +- Visual Studio >= 16 +- NMake +- Docker + ## CMake script The CMake project will ensure that the following dependencies are build and can be installed in a location for future From 30cc17646c7bcdfc8a6cf9581e239f6fb55cd4f3 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 1 Apr 2022 09:43:55 +0200 Subject: [PATCH 110/213] Use conan WIP Contributes to CURA-8640 --- CMakeLists.txt | 8 +- README.md | 5 + cmake/conan.cmake | 34 ++++++ docker/linux/base/.dockerignore | 11 ++ docker/linux/base/Dockerfile | 104 +++++++++++++++++ docker/linux/base/conan.lock | 52 +++++++++ docker/linux/base/conanfile.txt | 2 + docker/linux/base/profile | 13 +++ docker/linux/clang/.dockerignore | 11 ++ docker/linux/clang/Dockerfile | 159 ++++++++++++++++++++++++++ docker/linux/docker-compose.yml | 184 +++++++++++++++++++++++++++++++ docker/linux/gcc/.dockerignore | 11 ++ docker/linux/gcc/Dockerfile | 69 ++++++++++++ projects/arcus.cmake | 5 +- projects/libnest2d.cmake | 2 +- projects/pynest2d.cmake | 5 +- projects/python.cmake | 4 +- projects/savitar.cmake | 7 +- 18 files changed, 672 insertions(+), 14 deletions(-) create mode 100644 cmake/conan.cmake create mode 100644 docker/linux/base/.dockerignore create mode 100644 docker/linux/base/Dockerfile create mode 100644 docker/linux/base/conan.lock create mode 100644 docker/linux/base/conanfile.txt create mode 100644 docker/linux/base/profile create mode 100644 docker/linux/clang/.dockerignore create mode 100644 docker/linux/clang/Dockerfile create mode 100644 docker/linux/docker-compose.yml create mode 100644 docker/linux/gcc/.dockerignore create mode 100644 docker/linux/gcc/Dockerfile diff --git a/CMakeLists.txt b/CMakeLists.txt index 553a8c78..5c55a4b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,8 @@ GetFromEnvironmentOrCache( project(cura-build-environment) cmake_minimum_required(VERSION 3.18) +include(cmake/conan.cmake) + include(ExternalProject) include(GNUInstallDirs) include(ProcessorCount) @@ -24,10 +26,8 @@ endif() add_custom_target(projects) -message(STATUS "Using toolchain: ${CMAKE_TOOLCHAIN_FILE}") - include(projects/python.cmake) include(projects/libnest2d.cmake) include(projects/pynest2d.cmake) -include(projects/arcus.cmake) -include(projects/savitar.cmake) \ No newline at end of file +#include(projects/arcus.cmake) +#include(projects/savitar.cmake) \ No newline at end of file diff --git a/README.md b/README.md index c7a9decc..f9cbb7cd 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,11 @@ docker build -t cura-build-env: -f Dockerfile . This docker image can be used to create a cura-builder which helps us build the cura-build and cura-build-environment. First we need to create a build environment +```bash +DOCKER_BUILDKIT=1 docker build --build-arg JFROG_PASSWORD=JmZofe2*EjvoN=?9=4 -f Dockerfile -t cura-build-env +docker run -v /mnt/projects/ultimaker/cura/cura-build-environment:/home/ultimaker/source -v /mnt/projects/ultimaker/cura/cura-build-environment/cmake-build-release-docker/:/home/ultimaker/build -v /mnt/projects/ultimaker/cura/cura-build-environment/install/:/home/ultimaker/install -v /home/peer23peer/.conan/data:/home/ultimaker/.conan/data --name blerker cura-env-builder:latest +``` + ```bash docker create -t cura-env-builder::/home/ultimaker/source \ diff --git a/cmake/conan.cmake b/cmake/conan.cmake new file mode 100644 index 00000000..974f5b63 --- /dev/null +++ b/cmake/conan.cmake @@ -0,0 +1,34 @@ +if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake") + message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan") + file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/0.18.0/conan.cmake" + "${CMAKE_BINARY_DIR}/conan.cmake" + EXPECTED_HASH SHA256=65fc3508c91bf201f5472d28b21259e02b6f975a2917be457412ab7a87906c1e + TLS_VERIFY ON) +endif() +include(${CMAKE_BINARY_DIR}/conan.cmake) + +# === Project specific === + +conan_config_install(ITEM https://github.com/ultimaker/conan-config.git TYPE git VERIFY_SSL True) +conan_check(VERSION 1.46.0 REQUIRED) + +conan_cmake_run( + BASIC_SETUP + CONANFILE + conanfile.txt + GENERATORS + VirtualRunEnv + VirtualBuildEnv + CMakeDeps + CMakeToolchain + json + PROFILE + cura_release.jinja + BUILD + missing + ) + +if(NOT DEFINED CMAKE_TOOLCHAIN_FILE AND EXISTS "${CMAKE_BINARY_DIR}/conan_toolchain.cmake") + include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake) + set(CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR}/conan_toolchain.cmake) +endif() \ No newline at end of file diff --git a/docker/linux/base/.dockerignore b/docker/linux/base/.dockerignore new file mode 100644 index 00000000..95103f8d --- /dev/null +++ b/docker/linux/base/.dockerignore @@ -0,0 +1,11 @@ +.git +unused +Dockerfile +.gitignore +README.md +test/ +LICENSE +/tmp/gcc/share +/tmp/gcc/doc +/tmp/install/share +/tmp/install/doc \ No newline at end of file diff --git a/docker/linux/base/Dockerfile b/docker/linux/base/Dockerfile new file mode 100644 index 00000000..12aa046f --- /dev/null +++ b/docker/linux/base/Dockerfile @@ -0,0 +1,104 @@ +ARG DISTRO_VERSION + +FROM ubuntu:${DISTRO_VERSION} + +LABEL maintainer="Ultimaker b.v. " + +ENV PATH=/usr/local/bin/:/opt/conan/binutils/bin:${PATH} \ + CONAN_USER_HOME=/home/conan + +ARG CMAKE_VERSION +ARG CMAKE_VERSION_FULL +ARG PYTHON_VERSION +ARG CONAN_VERSION + +WORKDIR /root + +COPY conan.lock conanfile.txt /opt/conan/ + +RUN apt-get -qq update \ + && apt-get -qq install -y --no-install-recommends software-properties-common \ + && add-apt-repository ppa:git-core/ppa -y \ + && apt-get -qq update \ + && apt-get -qq install -y --no-install-recommends --no-install-suggests -o=Dpkg::Use-Pty=0 \ + sudo \ + binutils \ + wget \ + git \ + g++-multilib \ + libgmp-dev \ + libmpfr-dev \ + libmpc-dev \ + nasm \ + dh-autoreconf \ + libffi-dev \ + libssl-dev \ + pkg-config \ + subversion \ + zlib1g-dev \ + libbz2-dev \ + libsqlite3-dev \ + libreadline-dev \ + xz-utils \ + curl \ + libncurses5-dev \ + libncursesw5-dev \ + liblzma-dev \ + ca-certificates \ + autoconf-archive \ + gdb \ + lcov \ + libssl-dev \ + libgdbm-dev \ + uuid-dev \ + && rm -rf /var/lib/apt/lists/* \ + && wget -q --no-check-certificate https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION_FULL}/cmake-${CMAKE_VERSION_FULL}.tar.gz \ + && tar -xzf cmake-${CMAKE_VERSION_FULL}.tar.gz \ + --exclude=bin/cmake-gui \ + --exclude=doc/cmake \ + --exclude=share/cmake-${CMAKE_VERSION}/Help \ + --exclude=share/vim \ + --exclude=share/vim \ + && cp -fR cmake-${CMAKE_VERSION_FULL}/* /usr \ + && rm -rf /root/cmake-${CMAKE_VERSION_FULL} \ + && rm /root/cmake-${CMAKE_VERSION_FULL}.tar.gz \ + && curl -fL https://getcli.jfrog.io | sh -s 1.48.1 \ + && mv jfrog /usr/local/bin/jfrog \ + && chmod +x /usr/local/bin/jfrog \ + && groupadd 1001 -g 1001 \ + && groupadd 1000 -g 1000 \ + && groupadd 2000 -g 2000 \ + && groupadd 999 -g 999 \ + && useradd -ms /bin/bash conan -g 1001 -G 1000,2000,999 \ + && printf "conan:conan" | chpasswd \ + && adduser conan sudo \ + && printf "conan ALL= NOPASSWD: ALL\\n" >> /etc/sudoers \ + && wget https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz \ + && tar -xf Python-${PYTHON_VERSION}.tgz \ + && cd Python-${PYTHON_VERSION} \ + && ./configure --enable-optimizations --with-openssl=/usr/ \ + && make -j $(nproc) \ + && make install \ + && cd .. \ + && rm -rf Python-${PYTHON_VERSION}* \ + && python3 -m pip install -q --upgrade --no-cache-dir pip \ + && printf '/usr/local/lib\n' > /etc/ld.so.conf.d/20local-lib.conf \ + && printf '/usr/local/lib64\n' >> /etc/ld.so.conf.d/20local-lib.conf \ + && mv /etc/ld.so.conf.d/libc.conf /etc/ld.so.conf.d/10libc.conf \ + && rm /etc/ld.so.cache \ + && ldconfig -C /etc/ld.so.cache \ + && apt-get -qq purge -y g++-multilib gcc gcc-5 \ + && apt-get -qq autoremove -y \ + && apt-get -qq autoclean \ + && apt-get -qq update \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /tmp/* \ + && chown -R conan:1001 /opt/conan + +USER conan +WORKDIR /home/conan + +RUN python3 -m pip install conan==${CONAN_VERSION} \ + && CONAN_REVISIONS_ENABLED=1 CONAN_USER_HOME=/tmp/conan conan install -r conancenter -g deploy -if /opt/conan -l /opt/conan/conan.lock /opt/conan/conanfile.txt \ + && rm -rf /tmp/conan \ + && conan config set general.revisions_enabled=1 \ No newline at end of file diff --git a/docker/linux/base/conan.lock b/docker/linux/base/conan.lock new file mode 100644 index 00000000..bccfa9b0 --- /dev/null +++ b/docker/linux/base/conan.lock @@ -0,0 +1,52 @@ +{ + "graph_lock": { + "nodes": { + "0": { + "options": "readline:fPIC=True\nreadline:shared=False\nreadline:with_library=termcap\ntermcap:fPIC=True\ntermcap:shared=False\nzlib:fPIC=True\nzlib:shared=False", + "requires": [ + "1" + ], + "path": "conanfile.txt", + "context": "host" + }, + "1": { + "ref": "binutils/2.37#7e1081ddda1762c3f97d47399c4b1691", + "options": "readline:fPIC=True\nreadline:shared=False\nreadline:with_library=termcap\ntermcap:fPIC=True\ntermcap:shared=False\nzlib:fPIC=True\nzlib:shared=False", + "package_id": "8e7714e05da644d1474247995163817b009f35ad", + "prev": "92231e81212010b1f015f78125760d49", + "requires": [ + "2", + "3" + ], + "context": "host" + }, + "2": { + "ref": "zlib/1.2.11#b46bf663179824c23085bb71666ba8e6", + "options": "fPIC=True\nshared=False", + "package_id": "76f87539fc90ff313e0b3182641a9bb558a717d2", + "prev": "a4730ad7fc025658ed1806f0b0d5ba1f", + "context": "host" + }, + "3": { + "ref": "readline/8.0#6bfe51715475f7b96c43adfa7b6aef96", + "options": "fPIC=True\nshared=False\nwith_library=termcap\ntermcap:fPIC=True\ntermcap:shared=False", + "package_id": "ad3074fd90ef13789cde8b160ab25ce883db3c6e", + "prev": "15a274e05579977eaebf58e1bdb8b51e", + "requires": [ + "4" + ], + "context": "host" + }, + "4": { + "ref": "termcap/1.3.1#a75d9f61bf0d1899b64967958dfa6538", + "options": "fPIC=True\nshared=False", + "package_id": "76f87539fc90ff313e0b3182641a9bb558a717d2", + "prev": "34552acd6624780a5f6251750f40d9c5", + "context": "host" + } + }, + "revisions_enabled": true + }, + "version": "0.4", + "profile_host": "[settings]\narch=x86_64\narch_build=x86_64\nbuild_type=Release\ncompiler=gcc\ncompiler.libcxx=libstdc++11\ncompiler.version=5\nos=Linux\nos_build=Linux\n[options]\n[build_requires]\n[env]\n" +} \ No newline at end of file diff --git a/docker/linux/base/conanfile.txt b/docker/linux/base/conanfile.txt new file mode 100644 index 00000000..f773c3ac --- /dev/null +++ b/docker/linux/base/conanfile.txt @@ -0,0 +1,2 @@ +[requires] +binutils/2.37 \ No newline at end of file diff --git a/docker/linux/base/profile b/docker/linux/base/profile new file mode 100644 index 00000000..bedce735 --- /dev/null +++ b/docker/linux/base/profile @@ -0,0 +1,13 @@ +[settings] +os=Linux +os_build=Linux +arch=x86_64 +arch_build=x86_64 +compiler=gcc +compiler.version=5 +compiler.libcxx=libstdc++11 +build_type=Release +[options] +[conf] +[build_requires] +[env] \ No newline at end of file diff --git a/docker/linux/clang/.dockerignore b/docker/linux/clang/.dockerignore new file mode 100644 index 00000000..95103f8d --- /dev/null +++ b/docker/linux/clang/.dockerignore @@ -0,0 +1,11 @@ +.git +unused +Dockerfile +.gitignore +README.md +test/ +LICENSE +/tmp/gcc/share +/tmp/gcc/doc +/tmp/install/share +/tmp/install/doc \ No newline at end of file diff --git a/docker/linux/clang/Dockerfile b/docker/linux/clang/Dockerfile new file mode 100644 index 00000000..16a0ee5d --- /dev/null +++ b/docker/linux/clang/Dockerfile @@ -0,0 +1,159 @@ +ARG DOCKER_USERNAME +ARG LIBSTDCPP_MAJOR_VERSION +ARG DOCKER_TAG +ARG DISTRO_VERSION +ARG DISTRO +ARG SUFFIX + +FROM ubuntu:${DISTRO_VERSION} as builder + +ARG CLANG_VERSION +ARG LIBSTDCPP_VERSION + +LABEL maintainer="Ultimaker b.v. " + +RUN apt-get -qq update \ + && apt-get -qq install -y --no-install-recommends --no-install-suggests -o=Dpkg::Use-Pty=0 \ + apt-transport-https \ + binutils \ + wget \ + curl \ + ca-certificates \ + git \ + python3 \ + python3-pip \ + && pip3 install ninja cmake \ + && ln -s /usr/bin/python3 /usr/bin/python \ + && printf 'deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-10 main\n' > /etc/apt/sources.list.d/llvm.list \ + && wget -q --no-check-certificate https://apt.llvm.org/llvm-snapshot.gpg.key \ + && apt-key add llvm-snapshot.gpg.key \ + && apt-get -qq update \ + && apt-get -qq install -y --no-install-recommends --no-install-suggests -o=Dpkg::Use-Pty=0 clang-10 lld-10 libc++-10-dev \ + && wget -q --no-check-certificate https://github.com/llvm/llvm-project/archive/llvmorg-${CLANG_VERSION}.tar.gz \ + && tar zxf llvmorg-${CLANG_VERSION}.tar.gz \ + && sed -E -i 's/OUTPUT_NAME\s+"unwind"/OUTPUT_NAME "llvm-unwind"/g' llvm-project-llvmorg-${CLANG_VERSION}/libunwind/src/CMakeLists.txt \ + && sed -i 's/unwind/llvm-unwind/g' llvm-project-llvmorg-${CLANG_VERSION}/clang/lib/Driver/ToolChains/CommonArgs.cpp \ + && cd llvm-project-llvmorg-${CLANG_VERSION} \ + && mkdir build \ + && cd build/ \ + && cmake ../llvm \ + -G Ninja \ + -DCMAKE_CXX_COMPILER=clang++-10 \ + -DCMAKE_C_COMPILER=clang-10 \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ + -DBUILD_SHARED_LIBS=ON \ + -DCMAKE_INSTALL_PREFIX=/tmp/install \ + -DLLVM_INCLUDE_EXAMPLES=OFF \ + -DLLVM_INCLUDE_TESTS=OFF \ + -DLLVM_INCLUDE_GO_TESTS=OFF \ + -DLLVM_INCLUDE_DOCS=OFF \ + -DLLVM_INCLUDE_TOOLS=ON \ + -DLLVM_INCLUDE_UTILS=OFF \ + -DLLVM_INCLUDE_BENCHMARKS=OFF \ + -DLLVM_TARGETS_TO_BUILD=X86 \ + -DLLVM_ENABLE_OCAMLDOC=OFF \ + -DLLVM_ENABLE_BACKTRACES=OFF \ + -DLLVM_ENABLE_WARNINGS=OFF \ + -DLLVM_ENABLE_PEDANTIC=OFF \ + -DLLVM_ENABLE_ASSERTIONS=OFF \ + -DLLVM_ENABLE_PROJECTS="libunwind;clang;libcxx;libcxxabi;lld;compiler-rt" \ + -DLLVM_BUILD_DOCS=OFF \ + -DLLVM_BUILD_TESTS=OFF \ + -DLLVM_BUILD_32_BITS=OFF \ + -DLLVM_BUILD_TOOLS=OFF \ + -DLLVM_BUILD_UTILS=OFF \ + -DLLVM_BUILD_EXAMPLES=OFF \ + -DLLVM_BUILD_BENCHMARKS=OFF \ + -DLLVM_BUILD_STATIC=OFF \ + -DLLVM_USE_SANITIZER=OFF \ + -DLLVM_USE_LINKER=lld-10 \ + -DLLVM_OPTIMIZED_TABLEGEN=ON \ + -DLIBUNWIND_ENABLE_ASSERTIONS=OFF \ + -DLIBUNWIND_ENABLE_PEDANTIC=OFF \ + -DLIBUNWIND_ENABLE_SHARED=ON \ + -DLIBUNWIND_ENABLE_STATIC=ON \ + -DLIBUNWIND_USE_COMPILER_RT=ON \ + -DCLANG_INCLUDE_TESTS=OFF \ + -DCLANG_ENABLE_ARCMT=OFF \ + -DCLANG_ENABLE_STATIC_ANALYZER=OFF \ + -DCLANG_INCLUDE_DOCS=OFF \ + -DCLANG_BUILD_EXAMPLES=OFF \ + -DCLANG_ENABLE_BOOTSTRAP=OFF \ + -DCLANG_DEFAULT_RTLIB=compiler-rt \ + -DCLANG_DEFAULT_UNWINDLIB=libunwind \ + -DLIBCXX_INCLUDE_TESTS=OFF \ + -DLIBCXX_ENABLE_SHARED=YES \ + -DLIBCXX_ENABLE_STATIC=OFF \ + -DLIBCXX_INCLUDE_BENCHMARKS=OFF \ + -DLIBCXX_INCLUDE_DOCS=OFF \ + -DLIBCXX_GENERATE_COVERAGE=OFF \ + -DLIBCXX_BUILD_32_BITS=OFF \ + -DLIBCXX_CXX_ABI=libcxxabi \ + -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON \ + -DLIBCXX_USE_COMPILER_RT=ON \ + -DLIBCXX_DEBUG_BUILD=OFF \ + -DLIBCXX_CXX_ABI=libcxxabi \ + -DLIBCXX_CXX_ABI_INCLUDE_PATHS=../libcxxabi/include/ \ + -DLIBCXXABI_ENABLE_ASSERTIONS=OFF \ + -DLIBCXXABI_ENABLE_PEDANTIC=OFF \ + -DLIBCXXABI_BUILD_32_BITS=OFF \ + -DLIBCXXABI_INCLUDE_TESTS=OFF \ + -DLIBCXXABI_ENABLE_SHARED=ON \ + -DLIBCXXABI_ENABLE_STATIC=ON \ + -DLIBCXXABI_USE_COMPILER_RT=ON \ + -DLIBCXXABI_USE_LLVM_UNWINDER=ON \ + -DLIBCXXABI_ENABLE_STATIC_UNWINDER=ON \ + -DLIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY=ON \ + -DLIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL=ON \ + -DCOMPILER_RT_INCLUDE_TESTS=OFF \ + -DCOMPILER_RT_USE_LIBCXX=ON \ + && ninja unwind \ + && ninja cxxabi \ + && cp lib/libc++abi* /usr/lib/ \ + && ninja cxx \ + && ninja clang \ + && ninja lld \ + && ninja compiler-rt \ + && ninja install-unwind install-cxxabi install-cxx install-clang install-lld install-compiler-rt \ + && cp -a lib/clang/${CLANG_VERSION}/include /tmp/install/lib/clang/${CLANG_VERSION}/include \ + && cp $(find lib -name "*.so*") /tmp/install/lib + +FROM ${DOCKER_USERNAME}/gcc${LIBSTDCPP_MAJOR_VERSION}-${DISTRO}${SUFFIX}:${DOCKER_TAG} as libstdcpp + +FROM ${DOCKER_USERNAME}/base-${DISTRO}${SUFFIX}:${DOCKER_TAG} as deploy + +ARG LIBSTDCPP_VERSION +ARG LIBSTDCPP_PATCH_VERSION + +ARG DOCKER_USERNAME +ARG DOCKER_TAG +ARG DISTRO + +COPY --from=builder /tmp/install /tmp/clang +COPY --from=libstdcpp /usr/local /tmp/gcc + +ENV CC=clang \ + CXX=clang++ \ + CMAKE_C_COMPILER=clang \ + CMAKE_CXX_COMPILER=clang++ + +RUN sudo mv /tmp/gcc/lib64 /usr/local/ \ + && sudo ln -s -f /usr/local/lib64/libstdc++.so.6.0.${LIBSTDCPP_PATCH_VERSION} /usr/local/lib64/libstdc++.so.6 \ + && sudo ln -s -f /usr/local/lib64/libstdc++.so.6 /usr/local/lib64/libstdc++.so \ + && sudo cp -a /tmp/gcc/include/* /usr/local/include/ \ + && sudo rm -rf /usr/lib/gcc/x86_64-linux-gnu/* \ + && sudo cp -a /tmp/gcc/lib/gcc/x86_64-linux-gnu/${LIBSTDCPP_VERSION} /usr/lib/gcc/x86_64-linux-gnu/ \ + && sudo cp -a /tmp/gcc/lib/* /usr/local/lib/ \ + && sudo rm -rf /tmp/gcc \ + && sudo cp -a /tmp/clang/bin/* /usr/local/bin/ \ + && sudo cp -a /tmp/clang/lib/* /usr/local/lib/ \ + && sudo cp -a /tmp/clang/include/* /usr/local/include/ \ + && sudo rm -rf /tmp/clang \ + && sudo update-alternatives --install /usr/local/bin/cc cc /usr/local/bin/clang 100 \ + && sudo update-alternatives --install /usr/local/bin/cpp ccp /usr/local/bin/clang++ 100 \ + && sudo update-alternatives --install /usr/local/bin/c++ c++ /usr/local/bin/clang++ 100 \ + && sudo update-alternatives --install /usr/local/bin/ld ld /usr/local/bin/ld.lld 100 \ + && sudo rm /etc/ld.so.cache \ + && sudo ldconfig -C /etc/ld.so.cache \ + && conan profile new --detect --force default \ No newline at end of file diff --git a/docker/linux/docker-compose.yml b/docker/linux/docker-compose.yml new file mode 100644 index 00000000..4ed1574f --- /dev/null +++ b/docker/linux/docker-compose.yml @@ -0,0 +1,184 @@ +version: '3.4' + +x-common-args: &common-args + CMAKE_VERSION_FULL: ${CMAKE_VERSION_FULL} + CMAKE_VERSION: ${CMAKE_VERSION} + PYTHON_VERSION: ${PYTHON_VERSION} + CONAN_VERSION: ${CONAN_VERSION} + LIBSTDCPP_VERSION: ${LIBSTDCPP_VERSION} + LIBSTDCPP_PATCH_VERSION: ${LIBSTDCPP_PATCH_VERSION} + LIBSTDCPP_MAJOR_VERSION: ${LIBSTDCPP_MAJOR_VERSION} + DOCKER_USERNAME: ${DOCKER_USERNAME} + DOCKER_TAG: ${DOCKER_TAG} + DISTRO: ${DISTRO} + DISTRO_VERSION: ${DISTRO_VERSION} + +x-gcc5: &gcc5 + GCC_VERSION: ${GCC5_VERSION} + +x-gcc6: &gcc6 + GCC_VERSION: ${GCC6_VERSION} + +x-gcc7: &gcc7 + GCC_VERSION: ${GCC7_VERSION} + +x-gcc8: &gcc8 + GCC_VERSION: ${GCC8_VERSION} + +x-gcc9: &gcc9 + GCC_VERSION: ${GCC9_VERSION} + +x-gcc10: &gcc10 + GCC_VERSION: ${GCC10_VERSION} + +x-gcc11: &gcc11 + GCC_VERSION: ${GCC11_VERSION} + +x-llvm10: &llvm10 + CLANG_VERSION: ${CLANG10_VERSION} + +x-llvm11: &llvm11 + CLANG_VERSION: ${CLANG11_VERSION} + +x-llvm12: &llvm12 + CLANG_VERSION: ${CLANG12_VERSION} + +x-llvm13: &llvm13 + CLANG_VERSION: ${CLANG13_VERSION} + + +services: + # Base image + base: + build: + context: base + dockerfile: Dockerfile + args: + <<: *common-args + image: ${DOCKER_USERNAME}/base-${DISTRO}:${DOCKER_TAG} + container_name: base + tty: true + + # Builder images + gcc5-builder: + build: + context: gcc + dockerfile: Dockerfile + target: gcc-builder + args: + <<: *common-args + <<: *gcc5 + image: ${DOCKER_USERNAME}/gcc5-builder-${DISTRO}:${DOCKER_TAG} + container_name: gcc5-builder + tty: true + gcc6-builder: + build: + context: gcc + dockerfile: Dockerfile + target: gcc-builder + args: + <<: *common-args + <<: *gcc6 + image: ${DOCKER_USERNAME}/gcc6-builder-${DISTRO}:${DOCKER_TAG} + container_name: gcc6-builder + tty: true + gcc7-builder: + build: + context: gcc + dockerfile: Dockerfile + target: gcc-builder + args: + <<: *common-args + <<: *gcc7 + image: ${DOCKER_USERNAME}/gcc7-builder-${DISTRO}:${DOCKER_TAG} + container_name: gcc7-builder + tty: true + gcc8-builder: + build: + context: gcc + dockerfile: Dockerfile + target: gcc-builder + args: + <<: *common-args + <<: *gcc8 + image: ${DOCKER_USERNAME}/gcc8-builder-${DISTRO}:${DOCKER_TAG} + container_name: gcc8-builder + tty: true + gcc9-builder: + build: + context: gcc + dockerfile: Dockerfile + target: gcc-builder + args: + <<: *common-args + <<: *gcc9 + image: ${DOCKER_USERNAME}/gcc9-builder-${DISTRO}:${DOCKER_TAG} + container_name: gcc9-builder + tty: true + gcc10-builder: + build: + context: gcc + dockerfile: Dockerfile + target: gcc-builder + args: + <<: *common-args + <<: *gcc10 + image: ${DOCKER_USERNAME}/gcc10-builder-${DISTRO}:${DOCKER_TAG} + container_name: gcc10-builder + tty: true + gcc11-builder: + build: + context: gcc + dockerfile: Dockerfile + target: gcc-builder + args: + <<: *common-args + <<: *gcc11 + image: ${DOCKER_USERNAME}/gcc11-builder-${DISTRO}:${DOCKER_TAG} + container_name: gcc11-builder + tty: true + clang10-builder: + build: + context: clang + dockerfile: Dockerfile + target: clang-builder + args: + <<: *common-args + <<: *llvm10 + image: ${DOCKER_USERNAME}/clang10-builder-${DISTRO}:${DOCKER_TAG} + container_name: clang10-builder + tty: true + clang11-builder: + build: + context: clang + dockerfile: Dockerfile + target: clang-builder + args: + <<: *common-args + <<: *llvm11 + image: ${DOCKER_USERNAME}/clang11-builder-${DISTRO}:${DOCKER_TAG} + container_name: clang11-builder + tty: true + clang12-builder: + build: + context: clang + dockerfile: Dockerfile + target: clang-builder + args: + <<: *common-args + <<: *llvm12 + image: ${DOCKER_USERNAME}/clang12-builder-${DISTRO}:${DOCKER_TAG} + container_name: clang12-builder + tty: true + + clang13-builder: + build: + context: clang + dockerfile: Dockerfile + target: clang-builder + args: + <<: *common-args + <<: *llvm13 + image: ${DOCKER_USERNAME}/clang13-builder-${DISTRO}:${DOCKER_TAG} + container_name: clang13-builder + tty: true \ No newline at end of file diff --git a/docker/linux/gcc/.dockerignore b/docker/linux/gcc/.dockerignore new file mode 100644 index 00000000..95103f8d --- /dev/null +++ b/docker/linux/gcc/.dockerignore @@ -0,0 +1,11 @@ +.git +unused +Dockerfile +.gitignore +README.md +test/ +LICENSE +/tmp/gcc/share +/tmp/gcc/doc +/tmp/install/share +/tmp/install/doc \ No newline at end of file diff --git a/docker/linux/gcc/Dockerfile b/docker/linux/gcc/Dockerfile new file mode 100644 index 00000000..67f6b6ed --- /dev/null +++ b/docker/linux/gcc/Dockerfile @@ -0,0 +1,69 @@ +ARG DOCKER_USERNAME +ARG DOCKER_TAG +ARG DISTRO_VERSION +ARG DISTRO +ARG SUFFIX + +FROM ubuntu:${DISTRO_VERSION} as builder + +ARG GCC_VERSION + +LABEL maintainer="Ultimaker b.v. " + +RUN apt-get -qq update \ + && apt-get -qq install -y --no-install-recommends --no-install-suggests -o=Dpkg::Use-Pty=0 \ + g++-multilib \ + gcc \ + curl \ + wget \ + zlib1g \ + ca-certificates \ + autoconf-archive \ + binutils \ + libgmp-dev \ + libmpfr-dev \ + libmpc-dev \ + nasm \ + dh-autoreconf \ + libffi-dev \ + libssl-dev \ + pkg-config + +RUN wget -q --no-check-certificate http://mirrors.concertpass.com/gcc/releases/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.xz \ + && tar Jxf gcc-${GCC_VERSION}.tar.xz + +RUN cd gcc-${GCC_VERSION} \ + && ./configure --build=x86_64-linux-gnu \ + --disable-bootstrap \ + --disable-multilib \ + --disable-nsl \ + --enable-languages=c,c++,fortran \ + --disable-werror \ + --without-isl \ + --with-system-zlib \ + --prefix=/tmp/install \ + && make -s -j$(nproc) \ + && make install-strip + +FROM ${DOCKER_USERNAME}/base-${DISTRO}${SUFFIX}:${DOCKER_TAG} as deploy + +ARG GCC_VERSION +ARG LIBSTDCPP_PATCH_VERSION + +COPY --from=builder /tmp/install /tmp/install + +RUN sudo rm -rf /usr/lib/gcc/x86_64-linux-gnu/* \ + && sudo cp -a /tmp/install/lib/gcc/x86_64-linux-gnu/${GCC_VERSION} /usr/lib/gcc/x86_64-linux-gnu/ \ + && sudo cp -a /tmp/install/include/* /usr/local/include/ \ + && sudo cp -a /tmp/install/lib64/ /usr/local/ \ + && sudo cp -a /tmp/install/libexec/ /usr/local/ \ + && sudo cp -a /tmp/install/lib/* /usr/local/lib/ \ + && sudo cp -a /tmp/install/bin/* /usr/local/bin/ \ + && sudo rm -rf /tmp/install \ + && sudo update-alternatives --install /usr/local/bin/cc cc /usr/local/bin/gcc 100 \ + && sudo update-alternatives --install /usr/local/bin/cpp cpp /usr/local/bin/g++ 100 \ + && sudo update-alternatives --install /usr/local/bin/c++ c++ /usr/local/bin/g++ 100 \ + && sudo rm /etc/ld.so.cache \ + && sudo ldconfig -C /etc/ld.so.cache \ + && conan profile new --detect --force default \ + && conan profile update settings.compiler.libcxx=libstdc++11 default \ No newline at end of file diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 238571dd..6555fb39 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -15,8 +15,9 @@ ExternalProject_Add(Arcus CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DSIP_BUILD_EXECUTABLE=sip-build - -DPython_SITEARCH=${Python_SITEARCH} + -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build + -DPYTHONPATH=${PYTHONPATH} + -DPython_ROOT=${Python_ROOT} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} DEPENDS Python) add_dependencies(projects Arcus) \ No newline at end of file diff --git a/projects/libnest2d.cmake b/projects/libnest2d.cmake index 3a3663bf..48b7405b 100644 --- a/projects/libnest2d.cmake +++ b/projects/libnest2d.cmake @@ -16,4 +16,4 @@ ExternalProject_Add(libnest2d -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) -add_dependencies(projects Arcus) \ No newline at end of file +add_dependencies(projects libnest2d) \ No newline at end of file diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index 1763915d..55164240 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -12,11 +12,12 @@ GetFromEnvironmentOrCache( ExternalProject_Add(pynest2d GIT_REPOSITORY https://github.com/Ultimaker/pynest2d.git GIT_TAG ${PYNEST2D_BRANCH_OR_TAG} + CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${CMAKE_COMMAND} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DSIP_BUILD_EXECUTABLE=sip-build - -DPython_SITEARCH=${Python_SITEARCH} + -DPython_ROOT=${Python_ROOT} + -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} DEPENDS libnest2d Python) add_dependencies(projects pynest2d) \ No newline at end of file diff --git a/projects/python.cmake b/projects/python.cmake index cd3a882a..6c44fa8c 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -32,12 +32,12 @@ else() endif() message(STATUS "Using Python ${Python_VERSION}") - +set(PYTHONPATH ${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages) add_custom_target(Python ALL COMMENT "Create Virtual Environment") add_custom_command( TARGET Python COMMAND ${Python_EXECUTABLE} -m venv ${CMAKE_INSTALL_PREFIX} - COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${Python_SITEARCH}" ${Python_EXECUTABLE} -m pip install --prefix ${CMAKE_INSTALL_PREFIX} --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt + COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${CMAKE_INSTALL_PREFIX}/bin/python3 -m pip install --prefix ${CMAKE_INSTALL_PREFIX} --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt MAIN_DEPENDENCY Python) add_dependencies(projects Python) \ No newline at end of file diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 28bb7043..a5f448b4 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -12,11 +12,12 @@ GetFromEnvironmentOrCache( ExternalProject_Add(Savitar GIT_REPOSITORY https://github.com/ultimaker/libSavitar.git GIT_TAG ${SAVITAR_BRANCH_OR_TAG} + CMAKE_COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages" ${CMAKE_COMMAND} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DSIP_BUILD_EXECUTABLE=sip-build - -DPython_SITEARCH=${Python_SITEARCH} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build + -DPython_ROOT=${Python_ROOT} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} DEPENDS Python) add_dependencies(projects Savitar) \ No newline at end of file From 3afc8dde8a81013fdc98602574d9be3e40925592 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 1 Apr 2022 12:38:42 +0200 Subject: [PATCH 111/213] Re-use Python_EXECUTABLE instead of .../bin/python3 The executable is correct in any case, because we just called it. Python3 may refer to a different version of Python on some systems. Contributes to issue CURA-8640. --- projects/python.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/python.cmake b/projects/python.cmake index 6c44fa8c..88df44bc 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -38,6 +38,6 @@ add_custom_target(Python ALL COMMENT "Create Virtual Environment") add_custom_command( TARGET Python COMMAND ${Python_EXECUTABLE} -m venv ${CMAKE_INSTALL_PREFIX} - COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${CMAKE_INSTALL_PREFIX}/bin/python3 -m pip install --prefix ${CMAKE_INSTALL_PREFIX} --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt + COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${Python_EXECUTABLE} -m pip install --prefix ${CMAKE_INSTALL_PREFIX} --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt MAIN_DEPENDENCY Python) -add_dependencies(projects Python) \ No newline at end of file +add_dependencies(projects Python) From eff223ed70647c848087d9cfe27c32c173213c98 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 1 Apr 2022 15:34:16 +0200 Subject: [PATCH 112/213] Base Dockerfiles builds It allows you to specify Python, CMake and Conan version Contributes to CURA-8640 --- docker/linux/base/Dockerfile | 44 ++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/docker/linux/base/Dockerfile b/docker/linux/base/Dockerfile index 12aa046f..b51bbfe4 100644 --- a/docker/linux/base/Dockerfile +++ b/docker/linux/base/Dockerfile @@ -4,12 +4,16 @@ FROM ubuntu:${DISTRO_VERSION} LABEL maintainer="Ultimaker b.v. " -ENV PATH=/usr/local/bin/:/opt/conan/binutils/bin:${PATH} \ +ARG PYTHON_VERSION +ARG PYTHON_VERSION_FULL + +ENV PYENV_ROOT=/opt/pyenv \ + PATH=/usr/local/bin/:/opt/pyenv/versions/${PYTHON_VERSION_FULL}/bin/:/opt/conan/binutils/bin:${PATH} \ + LD_LIBRARY_PATH="/home/conan/env${LD_LIBRARY_PATH}" \ CONAN_USER_HOME=/home/conan ARG CMAKE_VERSION ARG CMAKE_VERSION_FULL -ARG PYTHON_VERSION ARG CONAN_VERSION WORKDIR /root @@ -51,6 +55,10 @@ RUN apt-get -qq update \ libssl-dev \ libgdbm-dev \ uuid-dev \ + build-essential \ + llvm \ + libxml2-dev \ + libxmlsec1-dev \ && rm -rf /var/lib/apt/lists/* \ && wget -q --no-check-certificate https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION_FULL}/cmake-${CMAKE_VERSION_FULL}.tar.gz \ && tar -xzf cmake-${CMAKE_VERSION_FULL}.tar.gz \ @@ -73,15 +81,29 @@ RUN apt-get -qq update \ && printf "conan:conan" | chpasswd \ && adduser conan sudo \ && printf "conan ALL= NOPASSWD: ALL\\n" >> /etc/sudoers \ - && wget https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz \ - && tar -xf Python-${PYTHON_VERSION}.tgz \ - && cd Python-${PYTHON_VERSION} \ - && ./configure --enable-optimizations --with-openssl=/usr/ \ + && wget --no-check-certificate --quiet -O pyenv-installer https://raw.githubusercontent.com/pyenv/pyenv-installer/56d708c8bda56370c4bc1e2fce68087cfcd007eb/bin/pyenv-installer \ + && chmod +x pyenv-installer \ + && ./pyenv-installer \ + && rm pyenv-installer \ + && update-alternatives --install /usr/bin/pyenv pyenv /opt/pyenv/bin/pyenv 100 \ + && git clone https://github.com/openssl/openssl.git \ + && cd openssl \ + && git checkout OpenSSL_1_1_1m \ + && ./config \ + && apt-get remove -y openssl \ && make -j $(nproc) \ && make install \ + && ldconfig \ && cd .. \ - && rm -rf Python-${PYTHON_VERSION}* \ - && python3 -m pip install -q --upgrade --no-cache-dir pip \ + && rm -rf openssl \ + && PYTHON_CONFIGURE_OPTS="--enable-shared --with-openssl-rpath" CPPFLAG="-I/usr/include/" LDFLAGS="-L/usr/local/lib/" pyenv install ${PYTHON_VERSION_FULL} \ + && pyenv global ${PYTHON_VERSION_FULL} \ + && update-alternatives --install /usr/bin/python3 python3 /opt/pyenv/shims/python3 100 \ + && update-alternatives --install /usr/bin/pip3 pip3 /opt/pyenv/shims/pip3 100 \ + && update-alternatives --install /usr/local/bin/python python /opt/pyenv/shims/python 100 \ + && update-alternatives --install /usr/local/bin/pip pip /opt/pyenv/shims/pip 100 \ + && ln -s /usr/share/pyshared/lsb_release.py /opt/pyenv/versions/${PYTHON_VERSION_FULL}/lib/python${PYTHON_VERSION}/site-packages/lsb_release.py \ + && pip install -q --upgrade --no-cache-dir pip \ && printf '/usr/local/lib\n' > /etc/ld.so.conf.d/20local-lib.conf \ && printf '/usr/local/lib64\n' >> /etc/ld.so.conf.d/20local-lib.conf \ && mv /etc/ld.so.conf.d/libc.conf /etc/ld.so.conf.d/10libc.conf \ @@ -93,12 +115,16 @@ RUN apt-get -qq update \ && apt-get -qq update \ && rm -rf /var/lib/apt/lists/* \ && rm -rf /tmp/* \ + && runuser -u conan -- printf 'eval "$(pyenv init -)"\n' >> /home/conan/.bashrc \ + && runuser -u conan -- printf 'eval "$(pyenv virtualenv-init -)"\n' >> ~/.bashrc \ + && mkdir -p /home/conan/env \ + && chown -R conan:1001 /opt/pyenv \ && chown -R conan:1001 /opt/conan USER conan WORKDIR /home/conan -RUN python3 -m pip install conan==${CONAN_VERSION} \ +RUN python -m pip install conan==${CONAN_VERSION} \ && CONAN_REVISIONS_ENABLED=1 CONAN_USER_HOME=/tmp/conan conan install -r conancenter -g deploy -if /opt/conan -l /opt/conan/conan.lock /opt/conan/conanfile.txt \ && rm -rf /tmp/conan \ && conan config set general.revisions_enabled=1 \ No newline at end of file From 8bfd6b4d8b5222c9102bd9c9e171d88f16502bdf Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 1 Apr 2022 16:36:32 +0200 Subject: [PATCH 113/213] builder Dockerfiles builds Contributes to CURA-8640 --- docker/linux/Dockerfile | 103 ------------- docker/linux/docker-compose.yml | 250 +++++++++++++++++++++++++++++++- 2 files changed, 249 insertions(+), 104 deletions(-) delete mode 100644 docker/linux/Dockerfile diff --git a/docker/linux/Dockerfile b/docker/linux/Dockerfile deleted file mode 100644 index f3ca51a8..00000000 --- a/docker/linux/Dockerfile +++ /dev/null @@ -1,103 +0,0 @@ -FROM debian:buster AS base - -LABEL linux_distro="debian-buster" \ - architecture="amd64" \ - python_version="3.10.2" \ - qt_version="6.2.2" - -# Set build time arguments -ARG SOURCE_DIR="/home/ultimaker/source" -ARG INSTALL_DIR="/home/ultimaker/install" -ARG BUILD_DIR="/home/ultimaker/build" -ARG ENVIRONMENT_DIR="/home/ultimaker/env" -ARG CONAN_DATA="/home/ultimaker/.conan/data" - -# Create unprivileged user -RUN groupadd -g 1000 ultimaker && \ - useradd -g ultimaker -u 1000 ultimaker -m - -# Update and install packages -RUN apt update -y && \ - apt upgrade -y && \ - apt install -y build-essential g++ gfortran libtool make autoconf automake git curl wget cmake tar \ - libffi-dev pkg-config libx11-xcb-dev libxcb* libfreetype6-dev libgl1-mesa-dev libegl1-mesa libxkbcommon-dev \ - libxkbcommon-x11-dev libx11-dev libxml2-dev libxslt-dev libfontconfig1-dev patchelf libssl-dev autopoint \ - libdbus-1-3 libwayland-egl1 libwayland-cursor0 ninja-build zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev \ - libsqlite3-dev libreadline-dev libbz2-dev libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev \ - libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev \ - libxft-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev \ - libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev \ - libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev \ - libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev \ - xkb-data libxcb-dri3-dev uuid-dev libxcb-util0-dev - -ENV PATH="${INSTALL_DIR}/bin:${INSTALL_DIR}/bin:${BUILD_DIR}/bin:/usr/local/bin/:${PATH}" \ - LD_LIBRARY_PATH="${INSTALL_DIR}/lib:${INSTALL_DIR}/lib:${BUILD_DIR}/lib:/usr/lib/x86_64-linux-gnu/:/usr/lib/:/lib/:/lib/x86_64-linux-gnu/:${LD_LIBRARY_PATH}" \ - HOME=/home/ultimaker \ - USER=ultimaker \ - SOURCE_PATH=${SOURCE_DIR} \ - INSTALL_PATH=${INSTALL_DIR} \ - BUILD_PATH=${BUILD_DIR} \ - CONAN_PATH="${BUILD_DIR}/conan" \ - ENVIRONMENT_PATH=${ENVIRONMENT_DIR} - -# Change working directory -WORKDIR /home/ultimaker/ - -FROM base AS base_cmake - -RUN wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5.tar.gz && \ - tar -zxvf cmake-3.21.5.tar.gz && \ - cd cmake-3.21.5 && \ - cmake . && \ - make -j $(nproc) && \ - make install && \ - cd .. && \ - rm -rf cmake-3.21.5* && \ - apt-get remove -y cmake - -FROM base_cmake AS base_python - -RUN wget https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgz && \ - tar -xf Python-3.10.2.tgz && \ - cd Python-3.10.2 && \ - ./configure --enable-optimizations && \ - make -j $(nproc) && \ - make install && \ - cd .. && \ - rm -rf Python-3.10.2* - -FROM base_python AS base_conan - -RUN python3 -m pip install conan && \ - conan profile new default --detect && \ - conan profile update settings.compiler.libcxx=libstdc++11 default && \ - conan config install https://github.com/ultimaker/conan-config.git && \ - conan config set general.revisions_enabled=1 && \ - conan config set general.scm_to_conandata=1 && \ - chown -R ultimaker:ultimaker "$HOME/.conan" - -FROM base_conan AS cura_build_environment - -# Cleanup -USER root -WORKDIR / -RUN rm -rf /tmp/* && \ - rm -rf /var/cache - -# Set up the build folders - -RUN mkdir -p "$SOURCE_PATH" "$BUILD_PATH" "$BUILD_PATH/conan" "$INSTALL_PATH" $ENVIRONMENT_PATH && \ - chown -R ultimaker:ultimaker "$SOURCE_PATH" && \ - chown -R ultimaker:ultimaker "$BUILD_PATH" && \ - chown -R ultimaker:ultimaker "$INSTALL_PATH" && \ - chown -R ultimaker:ultimaker $ENVIRONMENT_PATH && \ - chown -R ultimaker:ultimaker $HOME - -USER ultimaker:ultimaker - -WORKDIR ${HOME} -COPY ./entrypoint.py . -WORKDIR ${BUILD_DIR} - -ENTRYPOINT ["python3", "../entrypoint.py"] diff --git a/docker/linux/docker-compose.yml b/docker/linux/docker-compose.yml index 4ed1574f..7d90ad09 100644 --- a/docker/linux/docker-compose.yml +++ b/docker/linux/docker-compose.yml @@ -4,6 +4,7 @@ x-common-args: &common-args CMAKE_VERSION_FULL: ${CMAKE_VERSION_FULL} CMAKE_VERSION: ${CMAKE_VERSION} PYTHON_VERSION: ${PYTHON_VERSION} + PYTHON_VERSION_FULL: ${PYTHON_VERSION_FULL} CONAN_VERSION: ${CONAN_VERSION} LIBSTDCPP_VERSION: ${LIBSTDCPP_VERSION} LIBSTDCPP_PATCH_VERSION: ${LIBSTDCPP_PATCH_VERSION} @@ -170,7 +171,6 @@ services: image: ${DOCKER_USERNAME}/clang12-builder-${DISTRO}:${DOCKER_TAG} container_name: clang12-builder tty: true - clang13-builder: build: context: clang @@ -181,4 +181,252 @@ services: <<: *llvm13 image: ${DOCKER_USERNAME}/clang13-builder-${DISTRO}:${DOCKER_TAG} container_name: clang13-builder + tty: true + + # Deploy images + gcc5-deploy: + build: + context: gcc + dockerfile: Dockerfile + target: deploy + cache_from: + - ${DOCKER_USERNAME}/gcc5-builder-${DISTRO}:${DOCKER_TAG} + args: + <<: *common-args + image: ${DOCKER_USERNAME}/gcc5-deploy-${DISTRO}:${DOCKER_TAG} + container_name: gcc5-deploy + tty: true + gcc6-deploy: + build: + context: gcc + dockerfile: Dockerfile + target: deploy + cache_from: + - ${DOCKER_USERNAME}/gcc6-builder-${DISTRO}:${DOCKER_TAG} + args: + <<: *common-args + image: ${DOCKER_USERNAME}/gcc6-deploy-${DISTRO}:${DOCKER_TAG} + container_name: gcc6-deploy + tty: true + gcc7-deploy: + build: + context: gcc + dockerfile: Dockerfile + target: deploy + cache_from: + - ${DOCKER_USERNAME}/gcc7-builder-${DISTRO}:${DOCKER_TAG} + args: + <<: *common-args + image: ${DOCKER_USERNAME}/gcc7-deploy-${DISTRO}:${DOCKER_TAG} + container_name: gcc7-deploy + tty: true + gcc8-deploy: + build: + context: gcc + dockerfile: Dockerfile + target: deploy + cache_from: + - ${DOCKER_USERNAME}/gcc8-builder-${DISTRO}:${DOCKER_TAG} + args: + <<: *common-args + image: ${DOCKER_USERNAME}/gcc8-deploy-${DISTRO}:${DOCKER_TAG} + container_name: gcc8-deploy + tty: true + gcc9-deploy: + build: + context: gcc + dockerfile: Dockerfile + target: deploy + cache_from: + - ${DOCKER_USERNAME}/gcc9-builder-${DISTRO}:${DOCKER_TAG} + args: + <<: *common-args + image: ${DOCKER_USERNAME}/gcc9-deploy-${DISTRO}:${DOCKER_TAG} + container_name: gcc9-deploy + tty: true + gcc10-deploy: + build: + context: gcc + dockerfile: Dockerfile + target: deploy + cache_from: + - ${DOCKER_USERNAME}/gcc10-builder-${DISTRO}:${DOCKER_TAG} + args: + <<: *common-args + image: ${DOCKER_USERNAME}/gcc10-deploy-${DISTRO}:${DOCKER_TAG} + container_name: gcc10-deploy + tty: true + gcc11-deploy: + build: + context: gcc + dockerfile: Dockerfile + target: deploy + cache_from: + - ${DOCKER_USERNAME}/gcc11-builder-${DISTRO}:${DOCKER_TAG} + args: + <<: *common-args + image: ${DOCKER_USERNAME}/gcc11-deploy-${DISTRO}:${DOCKER_TAG} + container_name: gcc11-deploy + tty: true + clang10-deploy: + build: + context: clang + dockerfile: Dockerfile + target: deploy + cache_from: + - ${DOCKER_USERNAME}/clang10-builder-${DISTRO}:${DOCKER_TAG} + args: + <<: *common-args + image: ${DOCKER_USERNAME}/clang10-deploy-${DISTRO}:${DOCKER_TAG} + container_name: clang10-deploy + tty: true + clang11-deploy: + build: + context: clang + dockerfile: Dockerfile + target: deploy + cache_from: + - ${DOCKER_USERNAME}/clang11-builder-${DISTRO}:${DOCKER_TAG} + args: + <<: *common-args + image: ${DOCKER_USERNAME}/clang11-deploy-${DISTRO}:${DOCKER_TAG} + container_name: clang11-deploy + tty: true + clang12-deploy: + build: + context: clang + dockerfile: Dockerfile + target: deploy + cache_from: + - ${DOCKER_USERNAME}/clang12-builder-${DISTRO}:${DOCKER_TAG} + args: + <<: *common-args + image: ${DOCKER_USERNAME}/clang12-deploy-${DISTRO}:${DOCKER_TAG} + container_name: clang12-deploy + tty: true + + clang13-deploy: + build: + context: clang + dockerfile: Dockerfile + target: deploy + cache_from: + - ${DOCKER_USERNAME}/clang13-builder-${DISTRO}:${DOCKER_TAG} + args: + <<: *common-args + image: ${DOCKER_USERNAME}/clang13-deploy-${DISTRO}:${DOCKER_TAG} + container_name: clang13-deploy + tty: true + + # Images + gcc5: + build: + context: gcc + dockerfile: Dockerfile + args: + <<: *common-args + <<: *gcc5 + image: ${DOCKER_USERNAME}/gcc5-${DISTRO}:${DOCKER_TAG} + container_name: gcc5 + tty: true + gcc6: + build: + context: gcc + dockerfile: Dockerfile + args: + <<: *common-args + <<: *gcc6 + image: ${DOCKER_USERNAME}/gcc6-${DISTRO}:${DOCKER_TAG} + container_name: gcc6 + tty: true + gcc7: + build: + context: gcc + dockerfile: Dockerfile + args: + <<: *common-args + <<: *gcc7 + image: ${DOCKER_USERNAME}/gcc7-${DISTRO}:${DOCKER_TAG} + container_name: gcc7 + tty: true + gcc8: + build: + context: gcc + dockerfile: Dockerfile + args: + <<: *common-args + <<: *gcc8 + image: ${DOCKER_USERNAME}/gcc8-${DISTRO}:${DOCKER_TAG} + container_name: gcc8 + tty: true + gcc9: + build: + context: gcc + dockerfile: Dockerfile + args: + <<: *common-args + <<: *gcc9 + image: ${DOCKER_USERNAME}/gcc9-${DISTRO}:${DOCKER_TAG} + container_name: gcc9 + tty: true + gcc10: + build: + context: gcc + dockerfile: Dockerfile + args: + <<: *common-args + <<: *gcc10 + image: ${DOCKER_USERNAME}/gcc10-${DISTRO}:${DOCKER_TAG} + container_name: gcc10 + tty: true + gcc11: + build: + context: gcc + dockerfile: Dockerfile + args: + <<: *common-args + <<: *gcc11 + image: ${DOCKER_USERNAME}/gcc11-${DISTRO}:${DOCKER_TAG} + container_name: gcc11 + tty: true + clang10: + build: + context: clang + dockerfile: Dockerfile + args: + <<: *common-args + <<: *llvm10 + image: ${DOCKER_USERNAME}/clang10-${DISTRO}:${DOCKER_TAG} + container_name: clang10 + tty: true + clang11: + build: + context: clang + dockerfile: Dockerfile + args: + <<: *common-args + <<: *llvm11 + image: ${DOCKER_USERNAME}/clang11-${DISTRO}:${DOCKER_TAG} + container_name: clang11 + tty: true + clang12: + build: + context: clang + dockerfile: Dockerfile + args: + <<: *common-args + <<: *llvm12 + image: ${DOCKER_USERNAME}/clang12-${DISTRO}:${DOCKER_TAG} + container_name: clang12 + tty: true + + clang13: + build: + context: clang + dockerfile: Dockerfile + args: + <<: *common-args + <<: *llvm13 + image: ${DOCKER_USERNAME}/clang13-${DISTRO}:${DOCKER_TAG} + container_name: clang13 tty: true \ No newline at end of file From 9416bd80319793d452f30f58ef1f6b8774f4fc97 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 1 Apr 2022 16:38:19 +0200 Subject: [PATCH 114/213] Fix Arcus and Pynest2D building environment These two needed to get the Python parameters to build properly. I also pass this to Savitar but that one needs some more work at the moment. Contributes to issue CURA-8640. --- projects/arcus.cmake | 34 +++++++++++++++++----------------- projects/pynest2d.cmake | 8 ++++---- projects/savitar.cmake | 22 +++++++++++----------- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 6555fb39..da84b8ea 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -2,22 +2,22 @@ # cura-build-environment is released under the terms of the AGPLv3 or higher. GetFromEnvironmentOrCache( - NAME - ARCUS_BRANCH_OR_TAG - DEFAULT - master - DESCRIPTION - "The name of the tag (e.q.: v4.13.0), branch (e.q.: origin/CURA-8640) or commit hash (e.q.: 961dabf) for Arcus") + NAME + ARCUS_BRANCH_OR_TAG + DEFAULT + master + DESCRIPTION + "The name of the tag (e.q.: v4.13.0), branch (e.q.: origin/CURA-8640) or commit hash (e.q.: 961dabf) for Arcus") ExternalProject_Add(Arcus - GIT_REPOSITORY https://github.com/ultimaker/libArcus.git - GIT_TAG ${ARCUS_BRANCH_OR_TAG} - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build - -DPYTHONPATH=${PYTHONPATH} - -DPython_ROOT=${Python_ROOT} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - DEPENDS Python) -add_dependencies(projects Arcus) \ No newline at end of file + GIT_REPOSITORY https://github.com/Ultimaker/libArcus.git + GIT_TAG ${ARCUS_BRANCH_OR_TAG} + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build + -DPYTHONPATH=${PYTHONPATH} + -DPython_SITEARCH=${Python_SITEARCH} + DEPENDS Python) +add_dependencies(projects Arcus) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index 55164240..1ef27537 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -12,12 +12,12 @@ GetFromEnvironmentOrCache( ExternalProject_Add(pynest2d GIT_REPOSITORY https://github.com/Ultimaker/pynest2d.git GIT_TAG ${PYNEST2D_BRANCH_OR_TAG} - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${CMAKE_COMMAND} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DPython_ROOT=${Python_ROOT} - -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build + -DPYTHONPATH=${PYTHONPATH} + -DPython_SITEARCH=${Python_SITEARCH} DEPENDS libnest2d Python) -add_dependencies(projects pynest2d) \ No newline at end of file +add_dependencies(projects pynest2d) diff --git a/projects/savitar.cmake b/projects/savitar.cmake index a5f448b4..4aed20d9 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -10,14 +10,14 @@ GetFromEnvironmentOrCache( "The name of the tag (e.q.: v4.13.0), branch (e.q.: origin/CURA-8640) or commit hash (e.q.: 961dabf) for Savitar") ExternalProject_Add(Savitar - GIT_REPOSITORY https://github.com/ultimaker/libSavitar.git - GIT_TAG ${SAVITAR_BRANCH_OR_TAG} - CMAKE_COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages" ${CMAKE_COMMAND} - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build - -DPython_ROOT=${Python_ROOT} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - DEPENDS Python) -add_dependencies(projects Savitar) \ No newline at end of file + GIT_REPOSITORY https://github.com/ultimaker/libSavitar.git + GIT_TAG ${SAVITAR_BRANCH_OR_TAG} + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build + -DPYTHONPATH=${PYTHONPATH} + -DPython_SITEARCH=${Python_SITEARCH} + DEPENDS Python) +add_dependencies(projects Savitar) From 7dbf50cdab0b7a83d8c8285decb0ed2fa799bb8c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 1 Apr 2022 16:56:57 +0200 Subject: [PATCH 115/213] Don't exclude Arcus and Savitar They work now. Contributes to issue CURA-8640. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c55a4b9..283e120d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,5 +29,5 @@ add_custom_target(projects) include(projects/python.cmake) include(projects/libnest2d.cmake) include(projects/pynest2d.cmake) -#include(projects/arcus.cmake) -#include(projects/savitar.cmake) \ No newline at end of file +include(projects/arcus.cmake) +include(projects/savitar.cmake) From 1c8dc871f32890e926e1d44f7436b8313b395ca9 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Sun, 3 Apr 2022 14:45:20 +0200 Subject: [PATCH 116/213] Mount conan data Contributes to CURA-8640 --- docker/linux/docker-compose.yml | 47 +++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/docker/linux/docker-compose.yml b/docker/linux/docker-compose.yml index 7d90ad09..00824ffa 100644 --- a/docker/linux/docker-compose.yml +++ b/docker/linux/docker-compose.yml @@ -329,6 +329,10 @@ services: image: ${DOCKER_USERNAME}/gcc5-${DISTRO}:${DOCKER_TAG} container_name: gcc5 tty: true + ports: + - 2222:22 + volumes: + - $HOME/.conan/data:/home/conan/.conan/data gcc6: build: context: gcc @@ -339,6 +343,10 @@ services: image: ${DOCKER_USERNAME}/gcc6-${DISTRO}:${DOCKER_TAG} container_name: gcc6 tty: true + ports: + - 2222:22 + volumes: + - $HOME/.conan/data:/home/conan/.conan/data gcc7: build: context: gcc @@ -349,6 +357,10 @@ services: image: ${DOCKER_USERNAME}/gcc7-${DISTRO}:${DOCKER_TAG} container_name: gcc7 tty: true + ports: + - 2222:22 + volumes: + - $HOME/.conan/data:/home/conan/.conan/data gcc8: build: context: gcc @@ -359,6 +371,10 @@ services: image: ${DOCKER_USERNAME}/gcc8-${DISTRO}:${DOCKER_TAG} container_name: gcc8 tty: true + ports: + - 2222:22 + volumes: + - $HOME/.conan/data:/home/conan/.conan/data gcc9: build: context: gcc @@ -369,6 +385,10 @@ services: image: ${DOCKER_USERNAME}/gcc9-${DISTRO}:${DOCKER_TAG} container_name: gcc9 tty: true + ports: + - 2222:22 + volumes: + - $HOME/.conan/data:/home/conan/.conan/data gcc10: build: context: gcc @@ -379,6 +399,10 @@ services: image: ${DOCKER_USERNAME}/gcc10-${DISTRO}:${DOCKER_TAG} container_name: gcc10 tty: true + ports: + - 2222:22 + volumes: + - $HOME/.conan/data:/home/conan/.conan/data gcc11: build: context: gcc @@ -389,6 +413,10 @@ services: image: ${DOCKER_USERNAME}/gcc11-${DISTRO}:${DOCKER_TAG} container_name: gcc11 tty: true + ports: + - 2222:22 + volumes: + - $HOME/.conan/data:/home/conan/.conan/data clang10: build: context: clang @@ -399,6 +427,10 @@ services: image: ${DOCKER_USERNAME}/clang10-${DISTRO}:${DOCKER_TAG} container_name: clang10 tty: true + ports: + - 2222:22 + volumes: + - $HOME/.conan/data:/home/conan/.conan/data clang11: build: context: clang @@ -409,6 +441,10 @@ services: image: ${DOCKER_USERNAME}/clang11-${DISTRO}:${DOCKER_TAG} container_name: clang11 tty: true + ports: + - 2222:22 + volumes: + - $HOME/.conan/data:/home/conan/.conan/data clang12: build: context: clang @@ -419,7 +455,10 @@ services: image: ${DOCKER_USERNAME}/clang12-${DISTRO}:${DOCKER_TAG} container_name: clang12 tty: true - + ports: + - 2222:22 + volumes: + - $HOME/.conan/data:/home/conan/.conan/data clang13: build: context: clang @@ -429,4 +468,8 @@ services: <<: *llvm13 image: ${DOCKER_USERNAME}/clang13-${DISTRO}:${DOCKER_TAG} container_name: clang13 - tty: true \ No newline at end of file + tty: true + ports: + - 2222:22 + volumes: + - $HOME/.conan/data:/home/conan/.conan/data From 724259d40289db73c367fd2213538605c8241114 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Sun, 3 Apr 2022 17:12:47 +0200 Subject: [PATCH 117/213] Use Ubuntu 18.04 as base image Contributes to CURA-8640 --- docker/linux/.env | 29 +++++++++++++++++++++++++++++ docker/linux/base/Dockerfile | 2 ++ docker/linux/gcc/Dockerfile | 1 + 3 files changed, 32 insertions(+) create mode 100644 docker/linux/.env diff --git a/docker/linux/.env b/docker/linux/.env new file mode 100644 index 00000000..06b2a08b --- /dev/null +++ b/docker/linux/.env @@ -0,0 +1,29 @@ +CONAN_VERSION=1.47.0 +DOCKER_TAG=1.47.0 +DOCKER_USERNAME=ultimaker + +# This versions are mandatory by 'conan-io/conan-center-index' +CMAKE_VERSION_FULL=3.23.0 +CMAKE_VERSION=3.23 +PYTHON_VERSION=3.10 +PYTHON_VERSION_FULL=3.10.4 +LIBSTDCPP_VERSION=10.3.0 +LIBSTDCPP_PATCH_VERSION=28 +LIBSTDCPP_MAJOR_VERSION=10 + +# Exact compiler versions +GCC5_VERSION=5.5.0 +GCC6_VERSION=6.5.0 +GCC7_VERSION=7.5.0 +GCC8_VERSION=8.4.0 +GCC9_VERSION=9.3.0 +GCC10_VERSION=10.3.0 +GCC11_VERSION=11.1.0 + +CLANG10_VERSION=10.0.1 +CLANG11_VERSION=11.1.0 +CLANG12_VERSION=12.0.0 +CLANG13_VERSION=13.0.0 + +DISTRO=ubuntu18.04 +DISTRO_VERSION=18.04 \ No newline at end of file diff --git a/docker/linux/base/Dockerfile b/docker/linux/base/Dockerfile index b51bbfe4..75eec787 100644 --- a/docker/linux/base/Dockerfile +++ b/docker/linux/base/Dockerfile @@ -59,6 +59,8 @@ RUN apt-get -qq update \ llvm \ libxml2-dev \ libxmlsec1-dev \ + g++-5 \ + gcc-5 \ && rm -rf /var/lib/apt/lists/* \ && wget -q --no-check-certificate https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION_FULL}/cmake-${CMAKE_VERSION_FULL}.tar.gz \ && tar -xzf cmake-${CMAKE_VERSION_FULL}.tar.gz \ diff --git a/docker/linux/gcc/Dockerfile b/docker/linux/gcc/Dockerfile index 67f6b6ed..aedbafe6 100644 --- a/docker/linux/gcc/Dockerfile +++ b/docker/linux/gcc/Dockerfile @@ -17,6 +17,7 @@ RUN apt-get -qq update \ curl \ wget \ zlib1g \ + zlib1g-dev \ ca-certificates \ autoconf-archive \ binutils \ From 983b16c6a83a4e149a1de05c226f677ab8cfcca3 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Mon, 4 Apr 2022 13:38:40 +0200 Subject: [PATCH 118/213] Update PyQt6 to 6.2.4 This also means that we need to update to Ubuntu 20.04 Contributes to CURA-8640 --- docker/linux/.env | 4 +- docker/linux/base/Dockerfile | 86 +++++++++++++++++++++++++----------- projects/requirements.txt | 52 +++++++++------------- 3 files changed, 83 insertions(+), 59 deletions(-) diff --git a/docker/linux/.env b/docker/linux/.env index 06b2a08b..82e4b69a 100644 --- a/docker/linux/.env +++ b/docker/linux/.env @@ -25,5 +25,5 @@ CLANG11_VERSION=11.1.0 CLANG12_VERSION=12.0.0 CLANG13_VERSION=13.0.0 -DISTRO=ubuntu18.04 -DISTRO_VERSION=18.04 \ No newline at end of file +DISTRO=ubuntu20.04 +DISTRO_VERSION=20.04 \ No newline at end of file diff --git a/docker/linux/base/Dockerfile b/docker/linux/base/Dockerfile index 75eec787..d0e1d200 100644 --- a/docker/linux/base/Dockerfile +++ b/docker/linux/base/Dockerfile @@ -9,7 +9,7 @@ ARG PYTHON_VERSION_FULL ENV PYENV_ROOT=/opt/pyenv \ PATH=/usr/local/bin/:/opt/pyenv/versions/${PYTHON_VERSION_FULL}/bin/:/opt/conan/binutils/bin:${PATH} \ - LD_LIBRARY_PATH="/home/conan/env${LD_LIBRARY_PATH}" \ + LD_LIBRARY_PATH="/home/conan/env:${LD_LIBRARY_PATH}" \ CONAN_USER_HOME=/home/conan ARG CMAKE_VERSION @@ -59,30 +59,65 @@ RUN apt-get -qq update \ llvm \ libxml2-dev \ libxmlsec1-dev \ - g++-5 \ - gcc-5 \ + libgl1-mesa-dev \ + libx11-dev \ + libx11-xcb-dev \ + libfontenc-dev \ + libice-dev \ + libsm-dev \ + libxau-dev \ + libxaw7-dev \ + libxcomposite-dev \ + libxcursor-dev \ + libxdamage-dev \ + libxdmcp-dev \ + libxext-dev \ + libxfixes-dev \ + libxft-dev \ + libxi-dev \ + libxinerama-dev \ + libxkbfile-dev \ + libxmu-dev \ + libxmuu-dev \ + libxpm-dev \ + libxrandr-dev \ + libxrender-dev \ + libxres-dev \ + libxss-dev \ + libxt-dev \ + libxtst-dev \ + libxv-dev \ + libxvmc-dev \ + libxxf86vm-dev \ + xtrans-dev \ + libxcb-render0-dev \ + libxcb-render-util0-dev \ + libxcb-xkb-dev \ + libxcb-icccm4-dev \ + libxcb-image0-dev \ + libxcb-keysyms1-dev \ + libxcb-randr0-dev \ + libxcb-shape0-dev \ + libxcb-sync-dev \ + libxcb-xfixes0-dev \ + libxcb-xinerama0-dev \ + xkb-data \ + libxcb-dri3-dev \ + uuid-dev \ + libxcb-util-dev \ && rm -rf /var/lib/apt/lists/* \ - && wget -q --no-check-certificate https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION_FULL}/cmake-${CMAKE_VERSION_FULL}.tar.gz \ - && tar -xzf cmake-${CMAKE_VERSION_FULL}.tar.gz \ - --exclude=bin/cmake-gui \ - --exclude=doc/cmake \ - --exclude=share/cmake-${CMAKE_VERSION}/Help \ - --exclude=share/vim \ - --exclude=share/vim \ - && cp -fR cmake-${CMAKE_VERSION_FULL}/* /usr \ - && rm -rf /root/cmake-${CMAKE_VERSION_FULL} \ - && rm /root/cmake-${CMAKE_VERSION_FULL}.tar.gz \ - && curl -fL https://getcli.jfrog.io | sh -s 1.48.1 \ - && mv jfrog /usr/local/bin/jfrog \ - && chmod +x /usr/local/bin/jfrog \ - && groupadd 1001 -g 1001 \ - && groupadd 1000 -g 1000 \ - && groupadd 2000 -g 2000 \ - && groupadd 999 -g 999 \ - && useradd -ms /bin/bash conan -g 1001 -G 1000,2000,999 \ + && useradd -ms /bin/bash conan \ && printf "conan:conan" | chpasswd \ && adduser conan sudo \ && printf "conan ALL= NOPASSWD: ALL\\n" >> /etc/sudoers \ + && wget -q --no-check-certificate https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION_FULL}/cmake-${CMAKE_VERSION_FULL}.tar.gz \ + && tar -xzf cmake-${CMAKE_VERSION_FULL}.tar.gz \ + && cd cmake-${CMAKE_VERSION_FULL} \ + && ./bootstrap \ + && make -j $(nproc) \ + && make install \ + && cd .. \ + && rm /root/cmake-${CMAKE_VERSION_FULL}.tar.gz \ && wget --no-check-certificate --quiet -O pyenv-installer https://raw.githubusercontent.com/pyenv/pyenv-installer/56d708c8bda56370c4bc1e2fce68087cfcd007eb/bin/pyenv-installer \ && chmod +x pyenv-installer \ && ./pyenv-installer \ @@ -111,7 +146,7 @@ RUN apt-get -qq update \ && mv /etc/ld.so.conf.d/libc.conf /etc/ld.so.conf.d/10libc.conf \ && rm /etc/ld.so.cache \ && ldconfig -C /etc/ld.so.cache \ - && apt-get -qq purge -y g++-multilib gcc gcc-5 \ + && apt-get -qq purge -y g++-multilib \ && apt-get -qq autoremove -y \ && apt-get -qq autoclean \ && apt-get -qq update \ @@ -120,8 +155,8 @@ RUN apt-get -qq update \ && runuser -u conan -- printf 'eval "$(pyenv init -)"\n' >> /home/conan/.bashrc \ && runuser -u conan -- printf 'eval "$(pyenv virtualenv-init -)"\n' >> ~/.bashrc \ && mkdir -p /home/conan/env \ - && chown -R conan:1001 /opt/pyenv \ - && chown -R conan:1001 /opt/conan + && chown -R conan:conan /opt/pyenv \ + && chown -R conan:conan /opt/conan USER conan WORKDIR /home/conan @@ -129,4 +164,5 @@ WORKDIR /home/conan RUN python -m pip install conan==${CONAN_VERSION} \ && CONAN_REVISIONS_ENABLED=1 CONAN_USER_HOME=/tmp/conan conan install -r conancenter -g deploy -if /opt/conan -l /opt/conan/conan.lock /opt/conan/conanfile.txt \ && rm -rf /tmp/conan \ - && conan config set general.revisions_enabled=1 \ No newline at end of file + && conan config set general.revisions_enabled=1 \ + && conan config install https://github.com/ultimaker/conan-config.git \ No newline at end of file diff --git a/projects/requirements.txt b/projects/requirements.txt index 9d925ee4..88a68bf0 100644 --- a/projects/requirements.txt +++ b/projects/requirements.txt @@ -149,11 +149,11 @@ sys_platform=="linux" \ toml==0.10.2 \ --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \ --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f -sip==6.5 \ - --hash=sha256:28edf2e20db20ebf135e94e3295d8a90427e4ea461337413bf3ff2ce31bbdafe \ - --hash=sha256:71332c6f209a45bf019a352fe0374fa9d58fe1f6970c8e13dbeec62e5bab2114 \ - --hash=sha256:75ca74f5a6a2024dd984aece7ecc78676ec99be218b504744392dfbdf2d4200a \ - --hash=sha256:a1cf8431a8eb9392b3ff6dc61d832d0447bfdcae5b3e4256a5fa74dbc25b0734 +sip==6.5.1 \ + --hash=sha256:204f0240db8999a749d638a987b351861843e69239b811ec3d1881412c3706a6 \ + --hash=sha256:57e5ac40744c0f10a6c53dd45d2ef2c90e52f34a0210d8309e6563a07f914d0d \ + --hash=sha256:13b09357615c2d8bcb23bf21c1637941ac8ff5f28b346c1ccad7efafa57673e9 \ + --hash=sha256:01a637b44c5918505801c3d56e1e010b8e86a4edee71c0bd8541c54387b57ae2 # pyinstaller pyinstaller==4.10 \ @@ -206,33 +206,21 @@ numpy-stl==2.10.1 \ --hash=sha256:f6b529b8a8112dfe456d4f7697c7aee0aca62be5a873879306afe4b26fca963c pycollada==0.6 \ --hash=sha256:fcd6f38fd981e350f9ec754d9671834017accd600e967d6d299a6cfdae5ba4f4 -PyQt6-sip==13.2.0 \ - --hash=sha256:0baa53e464667b289ee157024e244fd9fa190101ec74eae30d17f0692f6af8cd \ - --hash=sha256:10e6c5d0004308efcbe8826ff0b8faf6e6f60c9e906cffeb26834e18e6340ed4 \ - --hash=sha256:121b887e40daac64f139ce3d7fc7b1d549ce75d423c6c174abbdf6ec7ab5d636 \ - --hash=sha256:12d43e55ec5ce70260097c19ff95942d2d329ba8c81fe140e5e9af08cbcfcb9c \ - --hash=sha256:149e91b372037765b18e728e68facdb2f072fbf043f76a5a424d2fa78af13163 \ - --hash=sha256:5f4b4ce20ff851fbf19cc7777485ac531171308705b1b36305cd71680686941f \ - --hash=sha256:66f3bf78d6bb084d10261111c3a7aa7c4125d73006b763544c81278468e9aa9d \ - --hash=sha256:6a12210e8547a8d8f9926fc3773e2c83db4511f9ac8bdec0b11b08a751262474 \ - --hash=sha256:9b79ca8554e40d70783ab7f7f6e16043ffd6c1d6cc14da5eba6ba474a7002233 \ - --hash=sha256:a0dcd554d00e025c844427860336fab8179173e181717a895af234f0279236f9 \ - --hash=sha256:abb26230a444f3b65396c3612af5db4f96a6765a56026078b7b45c8fb8bc1693 \ - --hash=sha256:cc92d5fc57a9192f269a622c340551ad9cde6d7a282273ccb3c64cd742f73760 \ - --hash=sha256:cda533d545414576e2d88d106c03eaf340bf8897388277838f9f2ffa6e2a7492 \ - --hash=sha256:d44e69ed4dc208c6cd791be8c54d8d656e1d395fe537bd1320f01b8ab3edec0f \ - --hash=sha256:e7c8093a6ef36395353a32df026745254b1ebdfcd490f746307d84ba67bcd93a \ - --hash=sha256:f8a65a876b70fc1c4eb95de74e133c81c146f08ad0e04877e16af8e3798b9d50 -PyQt6==6.2.2 \ - --hash=sha256:6f983a42239a6b7829ceff718ea943b8034f8d9e5d796a0fcfda0bc53fbaf8e9 \ - --hash=sha256:9325a0f51c08e37340d916d2723daf9a25c844dac99d71d6c5aacb4f6ee00171 \ - --hash=sha256:e9d56e25d307c50a8f21c2f210ddada661fac6ffd882deea82b50127919823fd \ - --hash=sha256:eda7a54f47d70377f95d0aafccfca83a7f5a6895f020d38986dfa96aa8b0883c -PyQt6-Qt6==6.2.2 \ - --hash=sha256:47515bf682748a42f41b9df8cc3854d29802199357ea76d39ece55679f390fe6 \ - --hash=sha256:8cac87d50a8afd0f3af1a3dd7b32e508bb5fd2a7149a272a84f922c63f5af6f3 \ - --hash=sha256:b3a3113f3a89d16ea204b99868adc33688559746260e8a2396b2edc9779eb37c \ - --hash=sha256:c26076c16eb1743f10179a62567d47c1cbda43ac45a1759d2e96563c52d8e41c +PyQt6-sip==13.2.1 \ + --hash=sha256:b7bce59900b2e0a04f70246de2ccf79ee7933036b6b9183cf039b62eeae2b858 \ + --hash=sha256:8b52d42e42e6e9f934ac7528cd154ac0210a532bb33fa1edfb4a8bbfb73ff88b \ + --hash=sha256:0314d011633bc697e99f3f9897b484720e81a5f4ba0eaa5f05c5811e2e74ea53 \ + --hash=sha256:226e9e349aa16dc1132f106ca01fa99cf7cb8e59daee29304c2fea5fa33212ec \ +PyQt6==6.2.3 \ + --hash=sha256:a9bfcac198fe4b703706f809bb686c7cef5f60a7c802fc145c6b57929c7a6a34 \ + --hash=sha256:11c039b07962b29246de2da0912f4f663786185fd74d48daac7a270a43c8d92a \ + --hash=sha256:8a2f357b86fec8598f52f16d5f93416931017ca1986d5f68679c9565bfc21fff \ + --hash=sha256:577334c9d4518022a4cb6f9799dfbd1b996167eb31404b5a63d6c43d603e6418 +PyQt6-Qt6==6.2.4 \ + --hash=sha256:42c37475a50ec7e06e0445ac9ce39465f69a86af407ad9b28b183da178d401ee \ + --hash=sha256:b68543e5d5a4f5d24c26b517569da3cd30b0fbe75390b841e142c160399b3c0a \ + --hash=sha256:0aa93581b92e01deaf2dcaad88ed6718996a6d84de59ee88316bcba143f008c9 \ + --hash=sha256:48bc5b7400d6bca13d8c0a145f82295a6da317952ee1a3f107f1cd7d078c8140 pyserial==3.4 \ --hash=sha256:6e2d401fdee0eab996cf734e67773a0143b932772ca8b42451440cfed942c627 \ --hash=sha256:e0770fadba80c31013896c7e6ef703f72e7834965954a78e71a3049488d4d7d8 From 2adfd9efaf5f7bc0ade8fdf5447d20bc81455bc2 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Mon, 4 Apr 2022 16:58:17 +0200 Subject: [PATCH 119/213] Pass along the used Python_root Contributes to CURA-8640 --- projects/arcus.cmake | 1 + projects/pynest2d.cmake | 2 +- projects/savitar.cmake | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index da84b8ea..7815a852 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -19,5 +19,6 @@ ExternalProject_Add(Arcus -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build -DPYTHONPATH=${PYTHONPATH} -DPython_SITEARCH=${Python_SITEARCH} + -DPython_ROOT=${Python_ROOT} DEPENDS Python) add_dependencies(projects Arcus) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index 1ef27537..ed9ac1ee 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -18,6 +18,6 @@ ExternalProject_Add(pynest2d -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build -DPYTHONPATH=${PYTHONPATH} - -DPython_SITEARCH=${Python_SITEARCH} + -DPython_ROOT=${Python_ROOT} DEPENDS libnest2d Python) add_dependencies(projects pynest2d) diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 4aed20d9..47ec735c 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -19,5 +19,6 @@ ExternalProject_Add(Savitar -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build -DPYTHONPATH=${PYTHONPATH} -DPython_SITEARCH=${Python_SITEARCH} + -DPython_ROOT=${Python_ROOT} DEPENDS Python) add_dependencies(projects Savitar) From 753032997c17cbe3ff3cf567e744daf798143d9d Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 06:45:40 +0200 Subject: [PATCH 120/213] Add CuraEngine as dependency Contributes to CURA-8640 --- CMakeLists.txt | 1 + projects/curaengine.cmake | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 projects/curaengine.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 283e120d..9b00127b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,3 +31,4 @@ include(projects/libnest2d.cmake) include(projects/pynest2d.cmake) include(projects/arcus.cmake) include(projects/savitar.cmake) +include(projects/curaengine.cmake) diff --git a/projects/curaengine.cmake b/projects/curaengine.cmake new file mode 100644 index 00000000..843a0214 --- /dev/null +++ b/projects/curaengine.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2022 Ultimaker B.V. +# cura-build is released under the terms of the AGPLv3 or higher. + +GetFromEnvironmentOrCache( + NAME + CURAENGINE_BRANCH_OR_TAG + DEFAULT + master + DESCRIPTION + "The name of the tag or branch to build for CuraEngine") +GetFromEnvironmentOrCache( + NAME + CURA_ENGINE_VERSION + DEFAULT + ${CURA_VERSION} + DESCRIPTION + "The version of CuraEngine") + +ExternalProject_Add(CuraEngine + GIT_REPOSITORY https://github.com/ultimaker/CuraEngine + GIT_TAG origin/${CURAENGINE_BRANCH_OR_TAG} + GIT_SHALLOW 1 + STEP_TARGETS update + CMAKE_GENERATOR "$,MinGW Makefiles,${CMAKE_GENERATOR}>" + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DCURA_ENGINE_VERSION=${CURA_ENGINE_VERSION} + DEPENDS Arcus) +add_dependencies(projects CuraEngine) \ No newline at end of file From cf4d53a045bfb6ddedc0e52a3bb7b447725a126f Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 07:22:05 +0200 Subject: [PATCH 121/213] Build Cura completly in one go Contributes to CURA-8640 --- CMakeLists.txt | 6 ++ projects/charon.cmake | 21 ++++++ projects/cura-binary-data.cmake | 20 ++++++ projects/cura.cmake | 112 ++++++++++++++++++++++++++++++++ projects/curaengine.cmake | 4 +- projects/fdm_materials.cmake | 21 ++++++ projects/uranium.cmake | 28 ++++++++ 7 files changed, 209 insertions(+), 3 deletions(-) create mode 100644 projects/charon.cmake create mode 100644 projects/cura-binary-data.cmake create mode 100644 projects/cura.cmake create mode 100644 projects/fdm_materials.cmake create mode 100644 projects/uranium.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b00127b..7ceb05a4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,7 @@ # Setting the MACOSX_DEPLOYMENT_TARGET needs to be done before the first project() call. Setting this value should also # take care of the CMAKE_OSX_SYSROOT. The variable is ignored on non-Apple systems. + list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) include(GetFromEnvironmentOrCache) GetFromEnvironmentOrCache( @@ -27,8 +28,13 @@ endif() add_custom_target(projects) include(projects/python.cmake) +include(projects/uranium.cmake) +include(projects/charon.cmake) include(projects/libnest2d.cmake) include(projects/pynest2d.cmake) include(projects/arcus.cmake) include(projects/savitar.cmake) include(projects/curaengine.cmake) +include(projects/cura.cmake) +include(projects/fdm_materials.cmake) +include(projects/cura-binary-data.cmake) \ No newline at end of file diff --git a/projects/charon.cmake b/projects/charon.cmake new file mode 100644 index 00000000..963f3a75 --- /dev/null +++ b/projects/charon.cmake @@ -0,0 +1,21 @@ +#Copyright (c) 2022 Ultimaker B.V. +#cura-build is released under the terms of the AGPLv3 or higher. + +GetFromEnvironmentOrCache( + NAME + CHARON_BRANCH_OR_TAG + DEFAULT + master + DESCRIPTION + "The name of the tag or branch to build for libCharon") + +ExternalProject_Add(Charon + GIT_REPOSITORY https://github.com/Ultimaker/libCharon + GIT_TAG ${CHARON_BRANCH_OR_TAG} + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DPython_ROOT=${Python_ROOT} + DEPENDS Python) +add_dependencies(projects Charon) diff --git a/projects/cura-binary-data.cmake b/projects/cura-binary-data.cmake new file mode 100644 index 00000000..fb302d85 --- /dev/null +++ b/projects/cura-binary-data.cmake @@ -0,0 +1,20 @@ +# Copyright (c) 2022 Ultimaker B.V. +# cura-build is released under the terms of the AGPLv3 or higher. + +GetFromEnvironmentOrCache( + NAME + CURABINARYDATA_BRANCH_OR_TAG + DEFAULT + master + DESCRIPTION + "The name of the tag or branch to build for cura-binary-data") + +ExternalProject_Add(cura-binary-data + GIT_REPOSITORY https://github.com/ultimaker/cura-binary-data + GIT_TAG ${CURABINARYDATA_BRANCH_OR_TAG} + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + DEPENDS Cura) +add_dependencies(projects cura-binary-data) diff --git a/projects/cura.cmake b/projects/cura.cmake new file mode 100644 index 00000000..4d2a5298 --- /dev/null +++ b/projects/cura.cmake @@ -0,0 +1,112 @@ +GetFromEnvironmentOrCache( + NAME + CURA_BRANCH_OR_TAG + DEFAULT + master + DESCRIPTION + "The name of the tag or branch to build for Cura") + +# Create the version-related variables +GetFromEnvironmentOrCache( + NAME + CURA_VERSION_MAJOR + DESCRIPTION + "Cura Major Version") +GetFromEnvironmentOrCache( + NAME + CURA_VERSION_MINOR + DEFAULT + 0 + DESCRIPTION + "Cura Minor Version") +GetFromEnvironmentOrCache( + NAME + CURA_VERSION_PATCH + DEFAULT + 0 + DESCRIPTION + "Cura Patch Version") +GetFromEnvironmentOrCache( + NAME + CURA_VERSION_EXTRA + DESCRIPTION + "Cura Extra Version Information") +if(NOT ${CURA_VERSION_EXTRA} STREQUAL "") + set(CURA_VERSION_EXTRA "-${CURA_VERSION_EXTRA}") +endif() +set(_default_cura_version "${CURA_VERSION_MAJOR}.${CURA_VERSION_MINOR}.${CURA_VERSION_PATCH}${CURA_VERSION_EXTRA}") +if(${_default_cura_version} VERSION_GREATER 0.0.0) + set(CURA_VERSION ${_default_cura_version}) +endif() +GetFromEnvironmentOrCache( + NAME + CURA_VERSION + DESCRIPTION + "Cura Extra Version Information" + REQUIRED) + +GetFromEnvironmentOrCache( + NAME + CURA_DEBUGMODE + DEFAULT + OFF + DESCRIPTION + "Enable crash handler and other debug options in Cura" + BOOL) +GetFromEnvironmentOrCache( + NAME + CURA_CLOUD_API_ROOT + DESCRIPTION + "The cloud API root") +GetFromEnvironmentOrCache( + NAME + CURA_CLOUD_ACCOUNT_API_ROOT + DESCRIPTION + "The cloud account API root") +GetFromEnvironmentOrCache( + NAME + CURA_DIGITAL_FACTORY_URL + DESCRIPTION + "The Digit factory url") +GetFromEnvironmentOrCache( + NAME + CURA_MARKETPLACE_ROOT + DESCRIPTION + "The marketplace root") +GetFromEnvironmentOrCache( + NAME + URANIUM_SCRIPTS_DIR + DESCRIPTION + "The Uranium script directory") +GetFromEnvironmentOrCache( + NAME + CURA_NO_INSTALL_PLUGINS + DESCRIPTION + "A list of plugins to exclude from installation, should be separated by ','.") +GetFromEnvironmentOrCache( + NAME + CURA_BUILDTYPE + DESCRIPTION + "Build type of Cura, eg. 'testing'") + +ExternalProject_Add(Cura + GIT_REPOSITORY https://github.com/ultimaker/Cura + GIT_TAG ${CURA_BRANCH_OR_TAG} + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DPython_ROOT=${Python_ROOT} + -DURANIUM_SCRIPTS_DIR=${URANIUM_SCRIPTS_DIR} + -DCURA_VERSION=${CURA_VERSION} + -DCURA_BUILDTYPE=${CURA_BUILDTYPE} + -DCURA_DEBUGMODE=${CURA_DEBUGMODE} + -DCURA_CLOUD_API_ROOT=${CURA_CLOUD_API_ROOT} + -DCURA_CLOUD_API_VERSION=${CURA_CLOUD_API_VERSION} + -DCURA_CLOUD_ACCOUNT_API_ROOT=${CURA_CLOUD_ACCOUNT_API_ROOT} + -DCURA_DIGITAL_FACTORY_URL=${CURA_DIGITAL_FACTORY_URL} + -DCURA_MARKETPLACE_ROOT=${CURA_MARKETPLACE_ROOT} + -DCURA_NO_INSTALL_PLUGINS=${CURA_NO_INSTALL_PLUGINS} + DEPENDS Python CuraEngine Uranium pynest2d Charon Savitar +) +add_dependencies(projects Cura) diff --git a/projects/curaengine.cmake b/projects/curaengine.cmake index 843a0214..ac096bf9 100644 --- a/projects/curaengine.cmake +++ b/projects/curaengine.cmake @@ -18,9 +18,7 @@ GetFromEnvironmentOrCache( ExternalProject_Add(CuraEngine GIT_REPOSITORY https://github.com/ultimaker/CuraEngine - GIT_TAG origin/${CURAENGINE_BRANCH_OR_TAG} - GIT_SHALLOW 1 - STEP_TARGETS update + GIT_TAG ${CURAENGINE_BRANCH_OR_TAG} CMAKE_GENERATOR "$,MinGW Makefiles,${CMAKE_GENERATOR}>" CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} diff --git a/projects/fdm_materials.cmake b/projects/fdm_materials.cmake new file mode 100644 index 00000000..e3c08c6a --- /dev/null +++ b/projects/fdm_materials.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2022 Ultimaker B.V. +# cura-build is released under the terms of the AGPLv3 or higher. + +GetFromEnvironmentOrCache( + NAME + FDMMATERIALS_BRANCH_OR_TAG + DEFAULT + master + DESCRIPTION + "The name of the tag or branch to build for fdm_materials") + +ExternalProject_Add(fdm_materials + GIT_REPOSITORY https://github.com/ultimaker/fdm_materials + GIT_TAG ${FDMMATERIALS_BRANCH_OR_TAG} + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + DEPENDS Cura +) +add_dependencies(projects fdm_materials) diff --git a/projects/uranium.cmake b/projects/uranium.cmake new file mode 100644 index 00000000..51ff7169 --- /dev/null +++ b/projects/uranium.cmake @@ -0,0 +1,28 @@ +# Copyright (c) 2022 Ultimaker B.V. +# cura-build is released under the terms of the AGPLv3 or higher. + +GetFromEnvironmentOrCache( + NAME + URANIUM_BRANCH_OR_TAG + DEFAULT + master + DESCRIPTION + "The name of the tag or branch to build for Uranium") + +GetFromEnvironmentOrCache( + NAME + CURA_NO_INSTALL_PLUGINS + DESCRIPTION + "A list of plugins to exclude from installation, should be separated by ','.") + +ExternalProject_Add(Uranium + GIT_REPOSITORY https://github.com/ultimaker/Uranium + GIT_TAG ${URANIUM_BRANCH_OR_TAG} + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DPython_ROOT=${Python_ROOT} + -DUM_NO_INSTALL_PLUGINS=${CURA_NO_INSTALL_PLUGINS} + DEPENDS Python) +add_dependencies(projects Uranium) From 642e0d52b271009044297c8dc450f9822ee2519e Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 07:38:11 +0200 Subject: [PATCH 122/213] Added PyQt6 NetworkAuth to requirements Needed for PyQt6.QtNetwork Contributes to CURA-8640 --- projects/requirements.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/projects/requirements.txt b/projects/requirements.txt index 88a68bf0..22f2c769 100644 --- a/projects/requirements.txt +++ b/projects/requirements.txt @@ -221,6 +221,15 @@ PyQt6-Qt6==6.2.4 \ --hash=sha256:b68543e5d5a4f5d24c26b517569da3cd30b0fbe75390b841e142c160399b3c0a \ --hash=sha256:0aa93581b92e01deaf2dcaad88ed6718996a6d84de59ee88316bcba143f008c9 \ --hash=sha256:48bc5b7400d6bca13d8c0a145f82295a6da317952ee1a3f107f1cd7d078c8140 +PyQt6-NetworkAuth==6.2.0 \ + --hash=sha256:23e730cc0d6b828bec2f92d9fac3607871e6033a8af4620e5d4e3afc13bd6c3c \ + --hash=sha256:b85ee25b01d6cb38d6141df0052b96de2df7f6e69066eaddb22ae238f56be40b \ + --hash=sha256:e637781a00dd2032d0fd2025af09274898335033763e1dc765a5a99348f60c3b \ + --hash=sha256:542e9d9a8a5bb78e1f26fa3d35ee01f45209bcf5a35b0cc367aaa85932c29750 +PyQt6-NetworkAuth-Qt6==6.2.4 \ + --hash=sha256:c7996a9d8c4ce024529ec37981fbfd525ab1a2d497af1281f81f2b6054452d2e \ + --hash=sha256:1ae9e08e03bd9d5ebdb42dfaccf484a9cc62eeea7504621fe42c005ff1745e66 \ + --hash=sha256:8ed4e5e0eaaa42a6f91aba6745eea23fb3ffcbddc6b162016936530ed28dd0ad pyserial==3.4 \ --hash=sha256:6e2d401fdee0eab996cf734e67773a0143b932772ca8b42451440cfed942c627 \ --hash=sha256:e0770fadba80c31013896c7e6ef703f72e7834965954a78e71a3049488d4d7d8 From add9036ad62e7b7c74f0f39edb10cd5d61928048 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 08:19:33 +0200 Subject: [PATCH 123/213] Fixed typo newline This was the cause that pyqt6 wasn't installed Contributes to CURA-8640 --- projects/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/requirements.txt b/projects/requirements.txt index 22f2c769..a5b5b615 100644 --- a/projects/requirements.txt +++ b/projects/requirements.txt @@ -210,7 +210,7 @@ PyQt6-sip==13.2.1 \ --hash=sha256:b7bce59900b2e0a04f70246de2ccf79ee7933036b6b9183cf039b62eeae2b858 \ --hash=sha256:8b52d42e42e6e9f934ac7528cd154ac0210a532bb33fa1edfb4a8bbfb73ff88b \ --hash=sha256:0314d011633bc697e99f3f9897b484720e81a5f4ba0eaa5f05c5811e2e74ea53 \ - --hash=sha256:226e9e349aa16dc1132f106ca01fa99cf7cb8e59daee29304c2fea5fa33212ec \ + --hash=sha256:226e9e349aa16dc1132f106ca01fa99cf7cb8e59daee29304c2fea5fa33212ec PyQt6==6.2.3 \ --hash=sha256:a9bfcac198fe4b703706f809bb686c7cef5f60a7c802fc145c6b57929c7a6a34 \ --hash=sha256:11c039b07962b29246de2da0912f4f663786185fd74d48daac7a270a43c8d92a \ From 737507a55ca259053131d46d11a4428a47f4f462 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 09:49:28 +0200 Subject: [PATCH 124/213] Install to local sitelibs Contributes to CURA-8640 --- projects/charon.cmake | 1 + projects/cura.cmake | 1 + projects/uranium.cmake | 1 + 3 files changed, 3 insertions(+) diff --git a/projects/charon.cmake b/projects/charon.cmake index 963f3a75..27e575b5 100644 --- a/projects/charon.cmake +++ b/projects/charon.cmake @@ -17,5 +17,6 @@ ExternalProject_Add(Charon -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DPython_ROOT=${Python_ROOT} + -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ DEPENDS Python) add_dependencies(projects Charon) diff --git a/projects/cura.cmake b/projects/cura.cmake index 4d2a5298..c9508e52 100644 --- a/projects/cura.cmake +++ b/projects/cura.cmake @@ -97,6 +97,7 @@ ExternalProject_Add(Cura -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DPython_ROOT=${Python_ROOT} + -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ -DURANIUM_SCRIPTS_DIR=${URANIUM_SCRIPTS_DIR} -DCURA_VERSION=${CURA_VERSION} -DCURA_BUILDTYPE=${CURA_BUILDTYPE} diff --git a/projects/uranium.cmake b/projects/uranium.cmake index 51ff7169..4514a68b 100644 --- a/projects/uranium.cmake +++ b/projects/uranium.cmake @@ -23,6 +23,7 @@ ExternalProject_Add(Uranium -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DPython_ROOT=${Python_ROOT} + -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ -DUM_NO_INSTALL_PLUGINS=${CURA_NO_INSTALL_PLUGINS} DEPENDS Python) add_dependencies(projects Uranium) From 7b59f8944148ea7e2f04fc0a193ec0f8e800f42c Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 10:02:51 +0200 Subject: [PATCH 125/213] Set PYTHONPATH as environment Contributes to CURA-8640 --- projects/python.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/python.cmake b/projects/python.cmake index 88df44bc..59c6cc84 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -28,7 +28,7 @@ else() add_library(Python::Python ALIAS cpython::python) set(Python_SITEARCH "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages") set(Python_EXECUTABLE ${cpython_PACKAGE_FOLDER_RELEASE}/bin/python3) - set($ENV{PYTHONPATH} ${Python_SITEARCH}) + set(ENV{PYTHONPATH} ${Python_SITEARCH}) endif() message(STATUS "Using Python ${Python_VERSION}") From fc0943a657ad91b15de2529f30ebb1d90063210f Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 10:14:25 +0200 Subject: [PATCH 126/213] Define local site-packages path Contributes to CURA-8640 --- projects/arcus.cmake | 2 +- projects/pynest2d.cmake | 1 + projects/savitar.cmake | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 7815a852..3130cbe8 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -18,7 +18,7 @@ ExternalProject_Add(Arcus -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build -DPYTHONPATH=${PYTHONPATH} - -DPython_SITEARCH=${Python_SITEARCH} + -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ -DPython_ROOT=${Python_ROOT} DEPENDS Python) add_dependencies(projects Arcus) diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index ed9ac1ee..fe81bc4e 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -18,6 +18,7 @@ ExternalProject_Add(pynest2d -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build -DPYTHONPATH=${PYTHONPATH} + -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ -DPython_ROOT=${Python_ROOT} DEPENDS libnest2d Python) add_dependencies(projects pynest2d) diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 47ec735c..235c9a8e 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -18,7 +18,7 @@ ExternalProject_Add(Savitar -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build -DPYTHONPATH=${PYTHONPATH} - -DPython_SITEARCH=${Python_SITEARCH} + -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ -DPython_ROOT=${Python_ROOT} DEPENDS Python) add_dependencies(projects Savitar) From a54b886b2b557a83f3e2387d6bfe55260b7cb943 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 10:24:49 +0200 Subject: [PATCH 127/213] Activate virtual python environment Contributes to CURA-8640 --- projects/python.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/python.cmake b/projects/python.cmake index 59c6cc84..50017ee7 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -38,6 +38,7 @@ add_custom_target(Python ALL COMMENT "Create Virtual Environment") add_custom_command( TARGET Python COMMAND ${Python_EXECUTABLE} -m venv ${CMAKE_INSTALL_PREFIX} + COMMAND . ${CMAKE_INSTALL_PREFIX}/bin/activate COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${Python_EXECUTABLE} -m pip install --prefix ${CMAKE_INSTALL_PREFIX} --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt MAIN_DEPENDENCY Python) add_dependencies(projects Python) From 0467c201ab42b7c14fc7d041f460582986475350 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Tue, 5 Apr 2022 10:59:41 +0200 Subject: [PATCH 128/213] Set python executable directly if unable to find correct version CURA-8640 --- projects/python.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/projects/python.cmake b/projects/python.cmake index 50017ee7..f9960e3d 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -23,7 +23,8 @@ if(APPLE) endif() find_package(cpython ${Python_VERSION} QUIET COMPONENTS Interpreter) if(NOT TARGET cpython::python) - find_package(Python ${Python_VERSION} EXACT REQUIRED COMPONENTS Interpreter) + set(Python_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/python3) + set(ENV{PYTHONPATH} ${Python_SITEARCH}) else() add_library(Python::Python ALIAS cpython::python) set(Python_SITEARCH "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages") From def3dd7d30535e194c9ebde580e547d8f1f95a0a Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 11:28:28 +0200 Subject: [PATCH 129/213] Use shallow clone Contributes to CURA-8640 --- projects/cura-binary-data.cmake | 2 ++ projects/cura.cmake | 2 ++ projects/curaengine.cmake | 2 ++ projects/fdm_materials.cmake | 2 ++ 4 files changed, 8 insertions(+) diff --git a/projects/cura-binary-data.cmake b/projects/cura-binary-data.cmake index fb302d85..9f25e4b2 100644 --- a/projects/cura-binary-data.cmake +++ b/projects/cura-binary-data.cmake @@ -12,6 +12,8 @@ GetFromEnvironmentOrCache( ExternalProject_Add(cura-binary-data GIT_REPOSITORY https://github.com/ultimaker/cura-binary-data GIT_TAG ${CURABINARYDATA_BRANCH_OR_TAG} + GIT_SHALLOW 1 + STEP_TARGETS update CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} diff --git a/projects/cura.cmake b/projects/cura.cmake index c9508e52..adf96547 100644 --- a/projects/cura.cmake +++ b/projects/cura.cmake @@ -92,6 +92,8 @@ GetFromEnvironmentOrCache( ExternalProject_Add(Cura GIT_REPOSITORY https://github.com/ultimaker/Cura GIT_TAG ${CURA_BRANCH_OR_TAG} + GIT_SHALLOW 1 + STEP_TARGETS update CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} diff --git a/projects/curaengine.cmake b/projects/curaengine.cmake index ac096bf9..90cff877 100644 --- a/projects/curaengine.cmake +++ b/projects/curaengine.cmake @@ -19,6 +19,8 @@ GetFromEnvironmentOrCache( ExternalProject_Add(CuraEngine GIT_REPOSITORY https://github.com/ultimaker/CuraEngine GIT_TAG ${CURAENGINE_BRANCH_OR_TAG} + GIT_SHALLOW 1 + STEP_TARGETS update CMAKE_GENERATOR "$,MinGW Makefiles,${CMAKE_GENERATOR}>" CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} diff --git a/projects/fdm_materials.cmake b/projects/fdm_materials.cmake index e3c08c6a..72633683 100644 --- a/projects/fdm_materials.cmake +++ b/projects/fdm_materials.cmake @@ -12,6 +12,8 @@ GetFromEnvironmentOrCache( ExternalProject_Add(fdm_materials GIT_REPOSITORY https://github.com/ultimaker/fdm_materials GIT_TAG ${FDMMATERIALS_BRANCH_OR_TAG} + GIT_SHALLOW 1 + STEP_TARGETS update CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} From 2ce129a87314b95a6e595cca2ea9e17f58786f1f Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 11:45:27 +0200 Subject: [PATCH 130/213] Create installer Contributes to CURA-8640 --- CMakeLists.txt | 5 ++++- projects/pyinstaller.cmake | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 projects/pyinstaller.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ceb05a4..e34f93f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,4 +37,7 @@ include(projects/savitar.cmake) include(projects/curaengine.cmake) include(projects/cura.cmake) include(projects/fdm_materials.cmake) -include(projects/cura-binary-data.cmake) \ No newline at end of file +include(projects/cura-binary-data.cmake) + +# Collect the artifacts with pyinstaller +include(projects/pyinstaller.cmake) \ No newline at end of file diff --git a/projects/pyinstaller.cmake b/projects/pyinstaller.cmake new file mode 100644 index 00000000..f6e50225 --- /dev/null +++ b/projects/pyinstaller.cmake @@ -0,0 +1,18 @@ +# Copyright (c) 2022 Ultimaker B.V. +# cura-build-environment is released under the terms of the AGPLv3 or higher. +# +# Sets up a virtual environment using the Python interpreter + +add_custom_target(Installer ALL COMMENT "Collect the build artifacts in a single installer") + +set(pyinstaller_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/pyinstaller) +set(cura_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/cura_app.py) +set(curaengine_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/CuraEngine) +set(installer_DIR ${CMAKE_INSTALL_PREFIX}/installer) +file(MAKE_DIRECTORY ${installer_DIR}) + +add_custom_command( + TARGET Installer + WORKING_DIRECTORY ${installer_DIR} + COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${pyinstaller_EXECUTABLE} ${cura_EXECUTABLE} --collect-all cura --collect-all UM --hidden-import pySavitar --hidden-import pyArcus --hidden-import pynest2d --add-binary "${curaengine_EXECUTABLE}:." --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources:resources" --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources:resources" --add-data "${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/UM/Qt/qml/UM/:resources/qml/UM/" --windowed --clean --noconfirm --log-level INFO --name "Ultimaker-Cura" + MAIN_DEPENDENCY projects) \ No newline at end of file From f7a8681c43ecf9a00870d95d38ce0cb811714064 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 12:23:41 +0200 Subject: [PATCH 131/213] Set installer dependency order Still something which goes wrong. Can't find Python any more on Linux Contributes to CURA-8640 --- CMakeLists.txt | 2 +- projects/cura-binary-data.cmake | 3 +-- projects/cura.cmake | 2 +- projects/fdm_materials.cmake | 4 +--- projects/pyinstaller.cmake | 30 ++++++++++++++++++++++++------ signing/cura.entitlements | 12 ++++++++++++ 6 files changed, 40 insertions(+), 13 deletions(-) create mode 100644 signing/cura.entitlements diff --git a/CMakeLists.txt b/CMakeLists.txt index e34f93f4..73560f80 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,9 +35,9 @@ include(projects/pynest2d.cmake) include(projects/arcus.cmake) include(projects/savitar.cmake) include(projects/curaengine.cmake) -include(projects/cura.cmake) include(projects/fdm_materials.cmake) include(projects/cura-binary-data.cmake) +include(projects/cura.cmake) # Collect the artifacts with pyinstaller include(projects/pyinstaller.cmake) \ No newline at end of file diff --git a/projects/cura-binary-data.cmake b/projects/cura-binary-data.cmake index 9f25e4b2..278775fd 100644 --- a/projects/cura-binary-data.cmake +++ b/projects/cura-binary-data.cmake @@ -17,6 +17,5 @@ ExternalProject_Add(cura-binary-data CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - DEPENDS Cura) + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) add_dependencies(projects cura-binary-data) diff --git a/projects/cura.cmake b/projects/cura.cmake index adf96547..7c861d62 100644 --- a/projects/cura.cmake +++ b/projects/cura.cmake @@ -110,6 +110,6 @@ ExternalProject_Add(Cura -DCURA_DIGITAL_FACTORY_URL=${CURA_DIGITAL_FACTORY_URL} -DCURA_MARKETPLACE_ROOT=${CURA_MARKETPLACE_ROOT} -DCURA_NO_INSTALL_PLUGINS=${CURA_NO_INSTALL_PLUGINS} - DEPENDS Python CuraEngine Uranium pynest2d Charon Savitar + DEPENDS Python CuraEngine Uranium pynest2d Charon Savitar fdm_materials cura-binary-data ) add_dependencies(projects Cura) diff --git a/projects/fdm_materials.cmake b/projects/fdm_materials.cmake index 72633683..cf7cdb68 100644 --- a/projects/fdm_materials.cmake +++ b/projects/fdm_materials.cmake @@ -17,7 +17,5 @@ ExternalProject_Add(fdm_materials CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - DEPENDS Cura -) + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) add_dependencies(projects fdm_materials) diff --git a/projects/pyinstaller.cmake b/projects/pyinstaller.cmake index f6e50225..f060c524 100644 --- a/projects/pyinstaller.cmake +++ b/projects/pyinstaller.cmake @@ -3,16 +3,34 @@ # # Sets up a virtual environment using the Python interpreter -add_custom_target(Installer ALL COMMENT "Collect the build artifacts in a single installer") + set(pyinstaller_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/pyinstaller) set(cura_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/cura_app.py) set(curaengine_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/CuraEngine) set(installer_DIR ${CMAKE_INSTALL_PREFIX}/installer) -file(MAKE_DIRECTORY ${installer_DIR}) + + +if(APPLE AND DEFINED CODESIGN_IDENTITY) + GetFromEnvironmentOrCache( + NAME + CODESIGN_IDENTITY + DESCRIPTION + "The name of the tag or branch to build for fdm_materials") +set(extra_pyinstaller_args "--codesign-identity \"${CODESIGN_IDENTITY}\" --osx-entitlements-file \"${CMAKE_SOURCE_DIR}\\signing\\cura.entitlements\" --osx-bundle-identifier \"nl.ultimaker.cura.dmg\" ") +else() + set(extra_pyinstaller_args ) +endif() + +add_custom_target(create_installer_dir ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${installer_DIR}) +add_custom_target(Installer ALL COMMENT "Collect the build artifacts in a single installer") add_custom_command( - TARGET Installer - WORKING_DIRECTORY ${installer_DIR} - COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${pyinstaller_EXECUTABLE} ${cura_EXECUTABLE} --collect-all cura --collect-all UM --hidden-import pySavitar --hidden-import pyArcus --hidden-import pynest2d --add-binary "${curaengine_EXECUTABLE}:." --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources:resources" --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources:resources" --add-data "${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/UM/Qt/qml/UM/:resources/qml/UM/" --windowed --clean --noconfirm --log-level INFO --name "Ultimaker-Cura" - MAIN_DEPENDENCY projects) \ No newline at end of file + TARGET + Installer + WORKING_DIRECTORY + ${installer_DIR} + COMMAND + ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${pyinstaller_EXECUTABLE} ${cura_EXECUTABLE} --collect-all cura --collect-all UM --hidden-import pySavitar --hidden-import pyArcus --hidden-import pynest2d --add-binary "${curaengine_EXECUTABLE}:." --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources:resources" --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources:resources" --add-data "${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/UM/Qt/qml/UM/:resources/qml/UM/" --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} --name "Ultimaker-Cura" + DEPENDS Python Cura create_installer_dir) +add_dependencies(projects create_installer_dir Installer) \ No newline at end of file diff --git a/signing/cura.entitlements b/signing/cura.entitlements new file mode 100644 index 00000000..3b95f077 --- /dev/null +++ b/signing/cura.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.cs.disable-executable-page-protection + + com.apple.security.cs.disable-library-validation + + + From c519c2d4ac668ec6eb74c25c852b3af05e859644 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 5 Apr 2022 12:24:49 +0200 Subject: [PATCH 132/213] Revert "Set python executable directly if unable to find correct version" This reverts commit 0467c201ab42b7c14fc7d041f460582986475350. --- projects/python.cmake | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/projects/python.cmake b/projects/python.cmake index f9960e3d..50017ee7 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -23,8 +23,7 @@ if(APPLE) endif() find_package(cpython ${Python_VERSION} QUIET COMPONENTS Interpreter) if(NOT TARGET cpython::python) - set(Python_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/python3) - set(ENV{PYTHONPATH} ${Python_SITEARCH}) + find_package(Python ${Python_VERSION} EXACT REQUIRED COMPONENTS Interpreter) else() add_library(Python::Python ALIAS cpython::python) set(Python_SITEARCH "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages") From bc8014b6ed67a0f17eeb1b9f6b4a4cf8227f3abd Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 12:53:35 +0200 Subject: [PATCH 133/213] Fixed installer dependency order Sort of, I hate CMake! Contributes to CURA-8640 --- projects/arcus.cmake | 2 +- projects/charon.cmake | 2 +- projects/cura.cmake | 2 +- projects/pyinstaller.cmake | 4 ++-- projects/pynest2d.cmake | 2 +- projects/python.cmake | 19 +++++++++++++------ projects/savitar.cmake | 2 +- projects/uranium.cmake | 2 +- 8 files changed, 21 insertions(+), 14 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 3130cbe8..a0239dd7 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -20,5 +20,5 @@ ExternalProject_Add(Arcus -DPYTHONPATH=${PYTHONPATH} -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ -DPython_ROOT=${Python_ROOT} - DEPENDS Python) + DEPENDS install-python-requirements) add_dependencies(projects Arcus) diff --git a/projects/charon.cmake b/projects/charon.cmake index 27e575b5..97918e61 100644 --- a/projects/charon.cmake +++ b/projects/charon.cmake @@ -18,5 +18,5 @@ ExternalProject_Add(Charon -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DPython_ROOT=${Python_ROOT} -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ - DEPENDS Python) + DEPENDS create-virtual-env) add_dependencies(projects Charon) diff --git a/projects/cura.cmake b/projects/cura.cmake index 7c861d62..dae22a1b 100644 --- a/projects/cura.cmake +++ b/projects/cura.cmake @@ -110,6 +110,6 @@ ExternalProject_Add(Cura -DCURA_DIGITAL_FACTORY_URL=${CURA_DIGITAL_FACTORY_URL} -DCURA_MARKETPLACE_ROOT=${CURA_MARKETPLACE_ROOT} -DCURA_NO_INSTALL_PLUGINS=${CURA_NO_INSTALL_PLUGINS} - DEPENDS Python CuraEngine Uranium pynest2d Charon Savitar fdm_materials cura-binary-data + DEPENDS install-python-requirements CuraEngine Uranium pynest2d Charon Savitar fdm_materials cura-binary-data ) add_dependencies(projects Cura) diff --git a/projects/pyinstaller.cmake b/projects/pyinstaller.cmake index f060c524..d78c07c0 100644 --- a/projects/pyinstaller.cmake +++ b/projects/pyinstaller.cmake @@ -32,5 +32,5 @@ add_custom_command( ${installer_DIR} COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${pyinstaller_EXECUTABLE} ${cura_EXECUTABLE} --collect-all cura --collect-all UM --hidden-import pySavitar --hidden-import pyArcus --hidden-import pynest2d --add-binary "${curaengine_EXECUTABLE}:." --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources:resources" --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources:resources" --add-data "${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/UM/Qt/qml/UM/:resources/qml/UM/" --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} --name "Ultimaker-Cura" - DEPENDS Python Cura create_installer_dir) -add_dependencies(projects create_installer_dir Installer) \ No newline at end of file + DEPENDS install-python-requirements Cura create_installer_dir) +add_dependencies(Installer install-python-requirements Cura create_installer_dir) \ No newline at end of file diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index fe81bc4e..5de48472 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -20,5 +20,5 @@ ExternalProject_Add(pynest2d -DPYTHONPATH=${PYTHONPATH} -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ -DPython_ROOT=${Python_ROOT} - DEPENDS libnest2d Python) + DEPENDS libnest2d install-python-requirements) add_dependencies(projects pynest2d) diff --git a/projects/python.cmake b/projects/python.cmake index 50017ee7..81c52d1b 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -33,12 +33,19 @@ endif() message(STATUS "Using Python ${Python_VERSION}") set(PYTHONPATH ${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages) -add_custom_target(Python ALL COMMENT "Create Virtual Environment") +set(Python_VENV_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/python) +add_custom_target(create-virtual-env ALL COMMENT "Create Virtual Environment") add_custom_command( - TARGET Python + TARGET create-virtual-env COMMAND ${Python_EXECUTABLE} -m venv ${CMAKE_INSTALL_PREFIX} - COMMAND . ${CMAKE_INSTALL_PREFIX}/bin/activate - COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${Python_EXECUTABLE} -m pip install --prefix ${CMAKE_INSTALL_PREFIX} --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt - MAIN_DEPENDENCY Python) -add_dependencies(projects Python) + MAIN_DEPENDENCY ${Python_EXECUTABLE}) + +add_custom_target(install-python-requirements ALL COMMENT "Install python requirements in virtual environment") +add_custom_command( + TARGET install-python-requirements + COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${Python_VENV_EXECUTABLE} -m pip install --prefix ${CMAKE_INSTALL_PREFIX} --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt + MAIN_DEPENDENCY ${Python_VENV_EXECUTABLE} + DEPENDS create-virtual-env) + +add_dependencies(install-python-requirements create-virtual-env) diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 235c9a8e..3d3b4596 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -20,5 +20,5 @@ ExternalProject_Add(Savitar -DPYTHONPATH=${PYTHONPATH} -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ -DPython_ROOT=${Python_ROOT} - DEPENDS Python) + DEPENDS install-python-requirements) add_dependencies(projects Savitar) diff --git a/projects/uranium.cmake b/projects/uranium.cmake index 4514a68b..a294d807 100644 --- a/projects/uranium.cmake +++ b/projects/uranium.cmake @@ -25,5 +25,5 @@ ExternalProject_Add(Uranium -DPython_ROOT=${Python_ROOT} -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ -DUM_NO_INSTALL_PLUGINS=${CURA_NO_INSTALL_PLUGINS} - DEPENDS Python) + DEPENDS install-python-requirements) add_dependencies(projects Uranium) From a7c642c092fcab4c81f49ce299281b6e57df33f8 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 15:51:33 +0200 Subject: [PATCH 134/213] Add future to python requirements needed by pefile Contributes to CURA-8640 --- projects/requirements.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/projects/requirements.txt b/projects/requirements.txt index a5b5b615..a8546913 100644 --- a/projects/requirements.txt +++ b/projects/requirements.txt @@ -177,6 +177,9 @@ pyinstaller-hooks-contrib==2022.2 \ pefile==2021.9.3; \ sys_platform=="win32" \ --hash=sha256:344a49e40a94e10849f0fe34dddc80f773a12b40675bf2f7be4b8be578bdd94a +future==0.18.2; \ + sys_platform=="win32" \ + --hash=sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d macholib==1.15.2; \ sys_platform=="darwin" \ --hash=sha256:1542c41da3600509f91c165cb897e7e54c0e74008bd8da5da7ebbee519d593d2 \ From d6f048f6413d76aa3c5303933f43d404ce165191 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 15:58:51 +0200 Subject: [PATCH 135/213] Fixed python paths for windows Contributes to CURA-8640 --- projects/arcus.cmake | 2 +- projects/charon.cmake | 2 +- projects/cura.cmake | 2 +- projects/python.cmake | 30 ++++++++++++++++++------------ projects/uranium.cmake | 2 +- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/projects/arcus.cmake b/projects/arcus.cmake index a0239dd7..a3ad8f7f 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -18,7 +18,7 @@ ExternalProject_Add(Arcus -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build -DPYTHONPATH=${PYTHONPATH} - -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ + -DPython_SITELIB_LOCAL=${Python_SITELIB_LOCAL} -DPython_ROOT=${Python_ROOT} DEPENDS install-python-requirements) add_dependencies(projects Arcus) diff --git a/projects/charon.cmake b/projects/charon.cmake index 97918e61..9eacb67b 100644 --- a/projects/charon.cmake +++ b/projects/charon.cmake @@ -17,6 +17,6 @@ ExternalProject_Add(Charon -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DPython_ROOT=${Python_ROOT} - -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ + -DPython_SITELIB_LOCAL=${Python_SITELIB_LOCAL} DEPENDS create-virtual-env) add_dependencies(projects Charon) diff --git a/projects/cura.cmake b/projects/cura.cmake index dae22a1b..86a861c6 100644 --- a/projects/cura.cmake +++ b/projects/cura.cmake @@ -99,7 +99,7 @@ ExternalProject_Add(Cura -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DPython_ROOT=${Python_ROOT} - -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ + -DPython_SITELIB_LOCAL=${Python_SITELIB_LOCAL} -DURANIUM_SCRIPTS_DIR=${URANIUM_SCRIPTS_DIR} -DCURA_VERSION=${CURA_VERSION} -DCURA_BUILDTYPE=${CURA_BUILDTYPE} diff --git a/projects/python.cmake b/projects/python.cmake index 81c52d1b..6acb0181 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -3,15 +3,6 @@ # # Sets up a virtual environment using the Python interpreter -if(WIN32) - set(ext .pyd) - set(env_path_sep ";") -else() - set(ext .so) - set(env_path_sep ":") -endif() - - if(NOT DEFINED Python_VERSION) set(Python_VERSION 3.10 @@ -27,13 +18,28 @@ if(NOT TARGET cpython::python) else() add_library(Python::Python ALIAS cpython::python) set(Python_SITEARCH "${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages") - set(Python_EXECUTABLE ${cpython_PACKAGE_FOLDER_RELEASE}/bin/python3) + set(Python_EXECUTABLE ${cpython_PACKAGE_FOLDER_RELEASE}/bin/python${exe_ext}) set(ENV{PYTHONPATH} ${Python_SITEARCH}) endif() message(STATUS "Using Python ${Python_VERSION}") -set(PYTHONPATH ${CMAKE_INSTALL_PREFIX}/lib/python3.10/site-packages) -set(Python_VENV_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/python) +if(WIN32) + set(ext .pyd) + set(env_path_sep ";") + set(exe_ext ".exe") + set(exe_path "Scripts") + set(lib_path "lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}") +else() + set(ext .so) + set(env_path_sep ":") + set(exe_ext "") + set(exe_path "bin") + set(lib_path "Lib") +endif() + +set(PYTHONPATH ${CMAKE_INSTALL_PREFIX}/${lib_path}/site-packages) +set(Python_VENV_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/${exe_path}/python${exe_ext}) +set(Python_SITELIB_LOCAL ${CMAKE_INSTALL_PREFIX}/${lib_path}/site-packages/) add_custom_target(create-virtual-env ALL COMMENT "Create Virtual Environment") add_custom_command( diff --git a/projects/uranium.cmake b/projects/uranium.cmake index a294d807..161e94d0 100644 --- a/projects/uranium.cmake +++ b/projects/uranium.cmake @@ -23,7 +23,7 @@ ExternalProject_Add(Uranium -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DPython_ROOT=${Python_ROOT} - -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ + -DPython_SITELIB_LOCAL=${Python_SITELIB_LOCAL} -DUM_NO_INSTALL_PLUGINS=${CURA_NO_INSTALL_PLUGINS} DEPENDS install-python-requirements) add_dependencies(projects Uranium) From b29560510bc530d02179e0480fd495ca9b91f2db Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 16:18:58 +0200 Subject: [PATCH 136/213] Fixed python paths for windows Contributes to CURA-8640 --- projects/pyinstaller.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/pyinstaller.cmake b/projects/pyinstaller.cmake index d78c07c0..051ac7e5 100644 --- a/projects/pyinstaller.cmake +++ b/projects/pyinstaller.cmake @@ -31,6 +31,6 @@ add_custom_command( WORKING_DIRECTORY ${installer_DIR} COMMAND - ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${pyinstaller_EXECUTABLE} ${cura_EXECUTABLE} --collect-all cura --collect-all UM --hidden-import pySavitar --hidden-import pyArcus --hidden-import pynest2d --add-binary "${curaengine_EXECUTABLE}:." --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources:resources" --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources:resources" --add-data "${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/UM/Qt/qml/UM/:resources/qml/UM/" --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} --name "Ultimaker-Cura" + ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${pyinstaller_EXECUTABLE} ${cura_EXECUTABLE} --collect-all cura --collect-all UM --hidden-import pySavitar --hidden-import pyArcus --hidden-import pynest2d --add-binary "${curaengine_EXECUTABLE}:." --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources:resources" --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources:resources" --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/:resources/qml/UM/" --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} --name "Ultimaker-Cura" DEPENDS install-python-requirements Cura create_installer_dir) add_dependencies(Installer install-python-requirements Cura create_installer_dir) \ No newline at end of file From c9f53777c7ba7dbc773549b0d2adb79354ef5418 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 5 Apr 2022 17:18:41 +0200 Subject: [PATCH 137/213] Add serial and Charon dependencies These two are only used in plug-ins and so they are not auto-detected. Contributes to issue CURA-8640. Conflicts: projects/pyinstaller.cmake -> Changed path to Sitelib upstream, while I added two extra libraries for plug-ins --- projects/pyinstaller.cmake | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/projects/pyinstaller.cmake b/projects/pyinstaller.cmake index 051ac7e5..81e71a22 100644 --- a/projects/pyinstaller.cmake +++ b/projects/pyinstaller.cmake @@ -31,6 +31,21 @@ add_custom_command( WORKING_DIRECTORY ${installer_DIR} COMMAND - ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${pyinstaller_EXECUTABLE} ${cura_EXECUTABLE} --collect-all cura --collect-all UM --hidden-import pySavitar --hidden-import pyArcus --hidden-import pynest2d --add-binary "${curaengine_EXECUTABLE}:." --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources:resources" --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources:resources" --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/:resources/qml/UM/" --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} --name "Ultimaker-Cura" + ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${pyinstaller_EXECUTABLE} ${cura_EXECUTABLE} + --collect-all cura + --collect-all UM + --collect-all serial #Used only in plug-ins. + --collect-all Charon + --hidden-import pySavitar + --hidden-import pyArcus + --hidden-import pynest2d + --add-binary "${curaengine_EXECUTABLE}:." + --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins:plugins" + --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins:plugins" + --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources:resources" + --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources:resources" + --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/:resources/qml/UM/" + --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} + --name "Ultimaker-Cura" DEPENDS install-python-requirements Cura create_installer_dir) add_dependencies(Installer install-python-requirements Cura create_installer_dir) \ No newline at end of file From 0fdddc4e806951d6f379b7ee5848f845cd0d3602 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 16:27:12 +0200 Subject: [PATCH 138/213] Basic Windows Docker Contributes to CURA-8640 --- docker/windows/Dockerfile | 54 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 docker/windows/Dockerfile diff --git a/docker/windows/Dockerfile b/docker/windows/Dockerfile new file mode 100644 index 00000000..3085b1c5 --- /dev/null +++ b/docker/windows/Dockerfile @@ -0,0 +1,54 @@ +FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-ltsc2019 + +# Restore the default Windows shell for correct batch processing. +SHELL ["cmd", "/S", "/C"] + +LABEL windows_version="1809" \ + architecture="amd64" \ + vs_version="2019" \ + windows_sdk_version="10" \ + python_version="3.10.4" \ + qt_version="6.2.4" + +COPY install_vs2019_buildtools.cmd install_wixtools.ps1 C:\\Temp + +# Install chocolatey +RUN powershell.exe Set-ExecutionPolicy Bypass -Scope Process -Force; \ + [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; \ + iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) + +# Enable global confirmation +RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ + choco feature enable -n=allowGlobalConfirmation + +# Install other build tools +# - perl, svn, and nasm are needed by OpenSSL for Python +RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ + choco install -y 7zip; \ + choco install -y cmake --installargs 'ADD_CMAKE_TO_PATH=System'; \ + choco install -y git --params '/GitOnlyOnPath /NoAutoCrlf /SChannel'; \ + choco install -y nsis; \ + choco install -y strawberryperl; \ + choco install -y tortoisesvn; \ + choco install -y nasm; \ + choco install -y doxygen.install; \ + choco install -y poedit + +# Install Visual Studio buildtools +RUN C:\\Temp\\src\\docker\\windows\\install_vs2019_buildtools.cmd + +# Get WiX Toolset 3.11.2 +RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ + C:\\Temp\\src\\docker\\windows\\install_wixtoolset.ps1 + +# Set up environment variables. +RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ + C:\\Temp\\src\\docker\\windows\\setup_envvars.ps1 + +# Cleanup +RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ + Remove-Item -Recurse -Force C:\\Temp\\ + +# Define the entry point for the docker container. +# This entry point starts the developer command prompt and launches the PowerShell shell. +ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"] From 6fd59f72edb2e1c9090448e637018644b6b6d880 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 20:08:39 +0200 Subject: [PATCH 139/213] Use correct lib path for Python venv Accidentally mixed up the Windows and UNIX paths Contributes to CURA-8640 --- projects/python.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/python.cmake b/projects/python.cmake index 6acb0181..5b83ed26 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -28,13 +28,13 @@ if(WIN32) set(env_path_sep ";") set(exe_ext ".exe") set(exe_path "Scripts") - set(lib_path "lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}") + set(lib_path "Lib") else() set(ext .so) set(env_path_sep ":") set(exe_ext "") set(exe_path "bin") - set(lib_path "Lib") + set(lib_path "lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}") endif() set(PYTHONPATH ${CMAKE_INSTALL_PREFIX}/${lib_path}/site-packages) From 08cb9918d6f44314fd445a47ac230004c10f5d4d Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Tue, 5 Apr 2022 21:35:51 +0200 Subject: [PATCH 140/213] Added network stuff to the pyinstaller Contributes to CURA-8640 --- projects/pyinstaller.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projects/pyinstaller.cmake b/projects/pyinstaller.cmake index 81e71a22..c6e879a3 100644 --- a/projects/pyinstaller.cmake +++ b/projects/pyinstaller.cmake @@ -39,6 +39,8 @@ add_custom_command( --hidden-import pySavitar --hidden-import pyArcus --hidden-import pynest2d + --hidden-import PyQt6.QtNetwork + --hidden-import zeroconf --add-binary "${curaengine_EXECUTABLE}:." --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins:plugins" --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins:plugins" From b70f4d6dede780b2fd3a664fe1c52b595a430593 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 6 Apr 2022 05:37:50 +0200 Subject: [PATCH 141/213] Added function to create a dmg Contributes to CURA-8640 --- CMakeLists.txt | 5 +- cmake/macoscreatedmg.cmake | 40 +++++++ {projects => cmake}/pyinstaller.cmake | 8 +- packaging/VolumeIcons_Cura.icns | Bin 0 -> 776715 bytes packaging/cura_background_dmg.png | Bin 0 -> 57851 bytes packaging/cura_license.txt | 165 ++++++++++++++++++++++++++ 6 files changed, 213 insertions(+), 5 deletions(-) create mode 100644 cmake/macoscreatedmg.cmake rename {projects => cmake}/pyinstaller.cmake (88%) create mode 100644 packaging/VolumeIcons_Cura.icns create mode 100644 packaging/cura_background_dmg.png create mode 100644 packaging/cura_license.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 73560f80..ed3705c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,4 +40,7 @@ include(projects/cura-binary-data.cmake) include(projects/cura.cmake) # Collect the artifacts with pyinstaller -include(projects/pyinstaller.cmake) \ No newline at end of file +include(cmake/pyinstaller.cmake) +if(APPLE) + include(cmake/macoscreatedmg.cmake) +endif() \ No newline at end of file diff --git a/cmake/macoscreatedmg.cmake b/cmake/macoscreatedmg.cmake new file mode 100644 index 00000000..0ade3250 --- /dev/null +++ b/cmake/macoscreatedmg.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2022 Ultimaker B.V. +# cura-build-environment is released under the terms of the AGPLv3 or higher. + +add_custom_target(create-dmg ALL COMMENT "Create the dmg from the pyinstaller output") + +GetFromEnvironmentOrCache( + NAME + CREATE_DMG_EXECUTABLE + DEFAULT + /usr/local/bin/create-dmg + DESCRIPTION + "The path to the create-dmg executable") + +GetFromEnvironmentOrCache( + NAME + REX_EXECUTABLE + DEFAULT + /Library/Developer/CommandLineTools/usr/bin/Rez + DESCRIPTION + "The path to the Rez (Resource compiler)") + +add_custom_command( + TARGET + create-dmg + WORKING_DIRECTORY + ${installer_DIR} + COMMAND + ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${CREATE_DMG_EXECUTABLE} --window-pos 640 360 + --volicon "${CMAKE_SOURCE_DIR}/packaging/VolumeIcons_Cura.icns" + --window-size 690 503 + --icon-size 90 + --icon "Ultimaker-Cura.app" 169 272 + --app-drop-link 520 272 + --eula "${CMAKE_SOURCE_DIR}/packaging/cura_license.txt" + --background "$source_dir/packaging/cura_background_dmg.png" + --rez /Library/Developer/CommandLineTools/usr/bin/Rez + "${installer_DIR}" + "${installer_DIR}/dist/Ultimaker-Cura.app" + DEPENDS pyinstaller install-python-requirements Cura create_installer_dir) +add_dependencies(create-dmg pyinstaller install-python-requirements Cura create_installer_dir) \ No newline at end of file diff --git a/projects/pyinstaller.cmake b/cmake/pyinstaller.cmake similarity index 88% rename from projects/pyinstaller.cmake rename to cmake/pyinstaller.cmake index c6e879a3..77a61e3c 100644 --- a/projects/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -16,18 +16,18 @@ if(APPLE AND DEFINED CODESIGN_IDENTITY) NAME CODESIGN_IDENTITY DESCRIPTION - "The name of the tag or branch to build for fdm_materials") + "The Apple codesign identity") set(extra_pyinstaller_args "--codesign-identity \"${CODESIGN_IDENTITY}\" --osx-entitlements-file \"${CMAKE_SOURCE_DIR}\\signing\\cura.entitlements\" --osx-bundle-identifier \"nl.ultimaker.cura.dmg\" ") else() set(extra_pyinstaller_args ) endif() add_custom_target(create_installer_dir ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${installer_DIR}) -add_custom_target(Installer ALL COMMENT "Collect the build artifacts in a single installer") +add_custom_target(pyinstaller ALL COMMENT "Collect the build artifacts in a single installer") add_custom_command( TARGET - Installer + pyinstaller WORKING_DIRECTORY ${installer_DIR} COMMAND @@ -50,4 +50,4 @@ add_custom_command( --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} --name "Ultimaker-Cura" DEPENDS install-python-requirements Cura create_installer_dir) -add_dependencies(Installer install-python-requirements Cura create_installer_dir) \ No newline at end of file +add_dependencies(pyinstaller install-python-requirements Cura create_installer_dir) \ No newline at end of file diff --git a/packaging/VolumeIcons_Cura.icns b/packaging/VolumeIcons_Cura.icns new file mode 100644 index 0000000000000000000000000000000000000000..6ea45262934d97accd72a87303f3e6bea4729387 GIT binary patch literal 776715 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 k>M%uZ)!M1UdY zm=S9XPu?eQPPJJyepFa_6H-vx=IRSgg=N(vkm;$;b8DGb#mt=4VOuji`Nl^{WpWL4 zd-pA9+i9y)!g=n!ij9*q-XYVz8FXdpK71t+3SQ!zvmi(wRrwY%oq(WJH*)hku8n7m z@)ny%&qa~E-yrbz>iGf39yF1AF&0`U8nw1Gf6>|z<=5VA_ui?qpi$5MT{~DdYjLEh zT^*;yGUH+9VvwW7R0SN=L!2Kb7|D%P3|MoNDY+Os?_kRG;a?7&9GqLNw#ZzL-6ExD zvN_h;+sLza30rY-(s7q7*7%i@@2M-MmEfNn*P_6G)2~KqQEqiS+#W#myjA z8QV@tZ6!nrzO}uyOYM~$v_f-u0!GKqxd-(09%9DTdcD%Wk&!m8XAlLPeT-%f7kP)c zIu5qb9a>Z@FivF8Yh0x5+@#$8fU`X`v+UCS@o5kbv8wwvrbFV?h2_;!$WhmjhZ|lx zcTBNNBW+k}lh#^VIE$_G0_8PC+#s}gT@R0d_C6Z%92Z<(VG9#2zfj85i?pt(aiG`L z3bGzNO~Ct+pfe#EHD$qllj-~ zU9-$BcPUk%AgX&{@viWfdXLHM1gX{qLxccy{ zGtXRK(DA{?gtJe6hQ8_t_A^{Y-#d7+mwxqSBi#lQ8;|>-Y-t2oX8ve4-Yr-4wkXNY zL~i2LLLJo9U}P@l6)lesD_Ns`66o3i5=@yBsQCmIm!UGJF52HVFFJeJJl)qdbjUgHt zY@y_qQ&X(imV9d_ar>YOu{=&50~f@0cL* z$~G1o)Z~lb=Z`OS+tkGd=@{U*1|#(@sjNtpr1lUyi8+WBl5uJ;ym<)EI{{GLLu(%B z6_N|wsP&9Ola4WQeooEO2UyFKyl6wgXw{Eyl)I5vzXFemGtkip2@5!}#YQZspte(Z zE6{rg5gm+Zvy3Z|)Bfi?vKDLvBFz>#^i59SE932x|FJUUxvwl}`;VESvCekX|#79PS8H5?(I^pZFGu8td4|FZMizLQ;Gv+ZBN!^FAujYd} zmM#d50JZHyKA7|kc_6N@WVK=~r74L6b)(T;o`1EuJo4*#Byi(aPjE!dAG%Lju(y4= zO-cfJ8+--W0ir||h)MSw4_nsLe17rGkwo8jsPFCG`fhv^KL+E` zyat1zkx2%a5%dRrzV}+2HgLGonf3(ORw?**$g8jX9RvYkYe9j2)QT@RE%IMAA+R-0 zi(bX(hEK#o)9R~#HxqWuX2sCt!KHdsosl{u>4-~3C$bcOMU92DXLpcpnUEX9fsGUF9f}iX-vo zp~b=d(8ioV^K)kz?M&97mXf&z-eIndVh@vpMAKs(>SNIE!)MW20oxL>%m6KoJF>!r|Wl#+${uWAV56 zVehf-$5KnFB1-}sTTQ-TNzKxT?{75GlM#4L^}qiadH`D2Oi&S)BY(Z&Ez9To^{O&m zaqvZUyRBD+W4jX~U_hV9*8OpvUEPDeh&8-~Dms?&Lrcf^XF2<5`8`IN#CCWx27m9o zUPR|hy5e$$)i|){Tb9_$Bu_>ljVI|RUG1uw9F&Vpt0<6O;iijsBKKLv1(MgNmQtWu zAK(Ufcr``y=bt#y>@c{8H|o!r~^^NrEdV@q#Z%q)kgX@y45Q_HIeh znt-bhbU`Z&ih2lJE}E=YYaE5`?NzGHfT70=qy`X}+Gd$qdjL8&VC<>u-3o2I0_V^@Im&YYaW zG02=hX!nnGG@Ttn2**4tJ*W%z9I6waq$~hI8Wzp-q_4%EjhNsU-hcZUa9cEJB+NJi z=bk$>N(S0T;AtVXZVoTXV{uHyLCvaX6|lI}6*Ng&uwwR?IKQ^+aTk5Gxkuf%bBhFc zhv)>p&_(8K#YqoW)D1py*m@~%- zAxx?Nm@I#~>u_8vKvh6bo#!EL8NHaU_;6DmN1O$6I;k^DUKfv?Ft7v%h z%muW)a4U+<4-X^>Msd5dyLE*fm%GWymy8i`Y(z9>5Mo^485SbN!|FhO^czeH4Ob>Y zARe$5wtq%6N3tg!*-jFiMKG2rll#q`eW*>?>^{ zRcYN`y|qy)p9%@d(c(2KsJPcbnIY<6VBRg#KKAz)7=x{<+6uV%P>YPUcWF5JEwP>@ z@BZ_w2eg%bo=D3C{4 z92(HjyTJibsV;!zo{M4!lLPs?V7qjGa=?;+wt-L=)p(gXP4BVcijF7r@Gv;_lPC?W zISW}|@tLw|Pab~(2Y*rqG{rsh4*O0Y`=iInL*xri8$;MGGwz89iA&`Kldik2Li*JO zSr)z$Q=Bgh-|n{#W9kD|^Zj1@8U0PG3x3}$JT@J3R=7vr>hrcbM`$F{w!2Igcy;hL z?0%&obH2TqmVCyx;MsjAy8R?_wH(?^?Iu`04lig6Y_QEKN$RIUEl79nQ&lf`te!9O zxXX{vB#PrH4U74CCcZL9cNQ}bwP^H2-U<&^x@D7kVnkER?Vt#TV4+&!i&{p(__I0OAN}aKcEH^MPqC_N)rWp4-?a0#!5BeR+;wOGqp}-wA!PU z#Ea>~&7V^$E~EtXcSzCBOYP78&&y#Na^a8giE!J?5q>>(juGN_xvK`5T1MK-6^UuS zvvNz4M!+6k7G3Yj&i33~$d_<_k@xnwlO0uBn4Vf9jLHjC^m>d?xq~A1Ysg#g_6eq| zv-OyIN@)}ycG#Lp0nAI0p^9-xS@gA6w0JgHL&+X3I}Yy}W1=e8EtV~o-oNRzcvehSZ@p1?iT>qo%)F}u{B?(8%k%C`A&Z_<1> z6P0L^);Pd#^88>r2!LDubpivu0x)rn7z6=Wba&xtDK|>^b*u5yEtj(_w0I{s$889K zDSJl7-4~_SXpA-ShAD?b3CGeOrc0gvCDjhbdWp{ zptDA^_`f7^|9m{-)jXhTkGBK2wy^j))|yGXJED%2TN&rmdLwF&$mc7Ig|}s5`M!Y| zdM)Xh4$0fX3J(4v!j3_1JAIi8k1HkQ%>w1;N(xe)vaSD04S-3F3nVi_lX&@rRTZI9 zDL+x%8*3>AH)TjdQQsVtiT@jUbUUa1h&zZ5^-;>4u_{wje{VyK7c`Cz%MkE70K!0J zErbxepvNRzwvdyR`Z_11!?*W30joWz(y@mZXi!u&_E0{a*D~$qD6g{fMAd*V_SBMF zxvH|H+!%}XRqy~XjbZD90zsIhl@~5Jke7C4$t9RG9bBcw4cf;m#uMl`$7HX8ATPod zghlv=ES&T%un+nRPmf}7kE)dn?5|c(9T?+6mh2(Q z-QC+esF`cvItN<#yg!D#9 zW(wqr*9%tJn&5gM|2nElnE6|Q7Y>onnNZqb4xW8SYh6NG5HlK32fQA9T zRJSzslkcYy{~)_pg7T~wyRLI?!!er>J0QX!k#kcs2;i(O zc3T0px3olClQn9@$M_RnsGa0b-!XSq)KN$@X3b&>j$bSJ_2YZPSwKT=7(SlZc&vvQ z0Z;u_)(xwgyaKA$?p72lU4l?21`A*U#-DQLOh7!!&Z9SHkcWGCSWrHk>fY+MTkB!5 z+g^Vv~3b;Z0O_O9Ku$PNaSaAtiY$ z7I&LubchG+6$A|=wNJ}nmNV5-+ZjU8i|~J`HM)cvrPO@kwmA%~?5PDGk{{1Rs<4}EfJ*W8(I1cF4Bou`N3+hwMs9Sr7oFL_4_sw`4 z2=0&fgB6jd4Oj8W4TtmFSMwfb&qBtG)E&X_0V^4Da_x>2U1;l&-;}`eo8MM?|DW>(!Z0lyyJzz3I(tsx4d?!iK%F)U)dJ8pnx0olO zR*qvgB+!AuS4+RBQRPoGYRkkt%a<(MNDmoriwe1E-D(W0$SDq*~d910_Q?V?3epmJ>| z)}1Jaf6b1^xd>4cjI{A7&rS#t6u-~#!UL@T9P28)P3_42S37a2lf3YkZV#TB<#Wwu zES)pTwP_O|T5~)%$xWS1T|hf>bEdMo2qs)`Fl5i*sNzL$eLdJN%Z}@}s9W8*C}%y? z^BM$rqNZhirNE);S>kDS4EpdQn`E6pe5eJy){-bkgD2NrtAzaw@ihH5>Kg_Ta09?E zEJvRiCSA#&9W=X%kw{Nft=JO!PbswHt*|_{+U0rMP*61775Pzee8}V>1}gPc#&EF3 zKn&u>MXJ{>wi-|+rZ`bYe5zQIs=oHIb+ zAM+NWLp(1hj&^~Pl2aPFxmWf@P=SiJLu7%#pa}i}fy4y11sIz>+7YA8o{wI|8|jH= zhS`L3-QMBkKfC7Vj|9~lms!?e!L=MjzlNtObsXemOA1wsG_wS?-HqCb^&d8F59Znz zr9~0(8~-7|&REI4cU$1{fvwGbaEN?vKhIV9B1k#aM~p?543hS!T9t1)&VXF8C6`x% z_+&Wo85plX4vGv%#zOof+w&=BvmCbQs~M^fMJgB(flj!W$7}asT1EglJ0Q}!z6P)w zA$D3z)}BF$CF^OQ1SI!=$HizG0+>Gp@D0M zakgpq&vJYt$TWoi6j4$zRBOTUn1m}CZh+Ooi#;utCg$vng^C8*1u@$ZBAkw>zQ}px zGLgQJSbe^hUQ%@|uqL&4Adpr|6b9__=ykY3IA|m|B~#)#3xI?XKMT}&l_E48zilI`^q?Vh4FWJ&y?magiwDW9F*U80_9)WX3{j5`Y#4M{gj6`U^fRv%QY|6bmY zn)bOy9CTT-Tu>S5uWybcX?AXzhXWSDxY2?k>q{g6ZWzb5I<$H7j|x}dl#cZU7Zd51 z;;}$o>l@7cjg|@gOLVr=6~k=>*0c%^Q;rEMun+Ngapi1iH=CsqdfCIGdA0Y-ySHY?pu&5HC&jfER7C%EoiLN`I@%@G`l& zjyK1|gl-V`Bo@tNMuGo80~kmuR!$OMgvGf=Wk&pnW?6Lkq$b}G5)+~pzOOB5O<1|A zU>pw~aaZQ>IV{AF6H{epjn74F(?MpLSPdaGbfq=Tsfae|oUeIo~?v(Svv^+=|u z^C;!mJ_pM4`tZmvX>an1Dok|k+?uEm3!dY?Mo0kJc^oE5u)=x&f9*aG8k`3mrCso$ zwq3*(^N#wcVg!=IjxDyUk#fT`W@y5^magrlL*Y3V5n7Q-b`<+HBNK6j8uw;a#{E#Fy zh%ks39(PAuuceI@FA zC3C*(-19k6R5PxE)^7Ee>CEn4TV<_A(6UXfwnw1x1c$=P=%%8r{5B*q@eQE1GZKGa3<`+g62c9I4`oKImw*g6nkdK zpU=Zir{STo_+9|Fz>>rtAW}?i4{K<7{w=L;npdjk&D)Jra3U{=A$?eU=P9n0VX-Sa zF3*i`C!aYG>i6+BKijKet5lYxeS{#P63x4#FZFZ&bi8ErfStROL1~P`2whnM9qI_j zj8s6e*W%g$fB}Nb26V8e&6HGePyaQ^;?9TIV3FDoeHPVgx#S$Yg5yk(`a`30_yW)C zsa+}cS`KC6OZ-~NU0>nb06z?B0{;owRu|h3A*!^C*F%(U&9 z%6>iKa8+ym`=;;$Sd*V4g-XkPhIWtRKew42G_#%o0GFdQs=+2(lGE=Yd}1fX*7}nb z`q;**z_md1edH%^-}n%dWOVj{hS_(<4#Lv&@qkmuG0b_HuQ2q|KNy18=WaEo2A`_M zE0V^N=#9z)N=p}IB}U5;06@Y*Q`qxxSS23>NvA;AnIX7yy}3tT99zO-ywSB`K|_* z4SEeCO2?|5gxnbzTcec4gp)+ERl~q!Zg~cjE1#_~iX#e1r_#4&FjyKIGT*KXa0qeV zugY#A$-F^#cALhJVAn|8VbjKZm5%_V>B`JrKW#r1n3Drg!k~bNG4-{|BNdz{a3N&lzPe zLVg%TgO}Xosj&7ny(sQcj|oOdzhNW(H+TqN{aKg;Bu>Rb;8T+YquL0{ zeGh=iq0%b5G||ZMp*6;kxb#Hj)<1;FXPDNdc?_o|DA+MBmG;kXF-gKZr3!y~;C|%H z`F$9$5qb>vGBn0|86_}bKUU+83qq+r1aczB^VlV5PwUpToV0y%=``zr$Y5YW<1C1L z_b;s%o=Bj%9aPv7M)~H$SnZI3-T%$soBDC!Su6kQ)ejZ<`QDr2@?$@Os@3D zciDz|TG#ivs2$%1eNImlDUx!T-2Sr2k1xj~t#Qi2I;#8vosjDF{!DnDTQT~F<*QSL zDfbz}Es(a6-NeE{Si3}Hf#2{lIM7!^aK%Pv)U%hC^Pm-b1&U+V31bzlF7W)y-d%F2 zKz-Dde>cZ>(u2%b1>91@fJw33wMgj9WfsjQ%&-?}5MX_;J8}#?7RhjK7h3j(U)AxG zV-*7s0GZ9Pj?X;O66=}frHl|^Yl<-hGpNW^!Mohj!K#Bh5Kk^Dd5JhEmBx9)kY#Td zebO_DjyH0Ie3Y+tb?U)_uXTyqe-%8g+tVelDR|#Tv<+qV=>#mbN5 z%tgf$Mh$>8w1YR8h9w$g8ZlZ`@c)EUQrd;C3e*R{|1!|%rL)4wzG?VkLVm6!TI#&I}aHmzgRID%gwDNOkNp(8S6yqni8W0skb8^jNcLc;rL7v`5!{0W#yWPT{u}rpMU{_vOF|{R0sy4CG@^FgP1Q^@ifmm0 z{=Xcn(Tpz0usI}bGhDe5+_(`DAqYT4(_=xq8lWg5hI(a}YmZ+wAxcoeK()R<$0@~A zeI=+W>XK)YBrn@$9aWmTu=098ngp=g?nRNW)VdbY)9iry35A8Ma5{1?z1g~nkr9UX zXF!yUw`5wI5bL)oN9WhSdSyiAjp~3ylMd4J40(AaOWNGx z(z!h!k05$~a7F(e+y0$B0}T-_eg^mZ2n8i3vHx^uWNCGH>puMcAB$MpogH+)AIkrv)M)VDh7({p%AKk+y>C92hO*HJ%c@H!ZeQtEI^BWWW7s zPf!RlE%``BW-oT|E`0_WpZG>~ah%E*8auY`)^G^x>rZ$)gJSZQ;!@ViBQjSbIkz*e zLk-WSr2So~XijFD9mDJv0z4f!H%4|KmcdIhof3oFNE5$+`{yUxWUBPLXkCRZHTgpyaBB1tmJ z?8M8utUfeTR|qbaMwcIvtX=LSx|xkb%JHAz(J3)45=GYI zTYgYuS^{_BfONLl-;oNw)2ZaTonw?eyMqWz7@9-)1Q>9Exf`%KZ{UOEcs%R)IhL>v z77b5~Ue~M{ZxyOH)n#F_yVqpsa36YLdWg8zREB4y)MVxeS=P0C+BWGA9J9&MXj`jqy0g z{6}vUGdD(O84i@l<%r!ZWSKx=WrDn!yFgW5v}U{S^5EVT7yFj73-RS{pp6bc%7ONz zFNVsUZNp=AQ}ACQ4rpx)-t)6tOeH%4BqEiWK!j4{Qo(o5r`cWIEz~NlO)WEN$-T&% zPA}yeiisAL#-v%`lQbpc%z6=Xvj9G(c@H_*YI!v zg}#uSK2y4~SHSS6cuh(H5#)jd(dV_~jc=h}cV33qNwi7oI@gdQp=@yt)l<=&8f28w zb>ZB_|1Ab9BDD#D5}CzClOrWYmpaf{;w=#NL#w8r-#f<-krw+~His^u{HXh@a~pQB zz!plP>-3O~r2*cC_=8pD2%j?0r|~7b{ERB!pKa2cAS==+)a9QXzxiCC+N16XYdB@+ ztb7kF#lA?INt!lCt$b2&#(~kO3#8w+jQQ3(KsWVfzAEv|tF5|fwUGdJi%Fd0UEZ>3 zysMuZlx5u=vnx%Sb1)@yGv?jE{!mkN(->p@GbB?ySemOkbbEf7LQ*rOe}o`ccnsd~ zykif`}R~i4pBEh#|N0XGkAq&DviP0jv22oDfFWSCD>J zxTZJf6=Rs%em~MUJL)g1af3>j4DzE%GpVAQ#p;V;STH3zTquN7dY-Dz%j))nT+=nE z@YuZ=UTG(}lMm?N47KFqOxXlx`UjbkGIF%U*WEX_aR`HnEg52_b&`%_8lh4+hg?nq zB4Taza3(h<57;pFlowmv)@~-~I~a*Vkw`=R4rlUMoSnMMBcjjiq2WXBx7r^-q~1)? zyqdk*KeVo&D-D{Y^Cv^0Ry|`+m)tPyJ5qMj`$Lp;qg@?P7aWGF_#3{BkTk3LT4$an z%rEPN$!-Rb1_+Gh^pzHAGhXqIB8DxUrkkdqe*o+;Ax2xTCZaKjN`dskKO@B{X91w3 zbye6YcFlhI&AF2=$=-WNKZ$7~41pwkc>enbBbB*?Nb_Z2DZ{aHPxm#`015fI)1--Z zIkGWoP=h7$&M=ydlTHhvs_)#9quL~1ENi4M@=*w-D}9ZP=6b+t>o@5SE}&TT@CHpygbH=;;yh-Y$7z@ZS6(?@2G=<4|t4R7GUU`*;%V|2C9 zJS~;-Q=e;4mR=4Xz^Hq}`WJ!)ejRfi=_NPU{uEzoTh_U>`=}frfl3Ii@1rg8pJWCn z9acvllIsY-nWE(%+z5F@t{>iytCCzN&&-Y*_pgb@S)8j4<66eK_=R2XrPyAFk7mvn z?-_^Uv2N`hv=R;xRrF`gtk7h!y?Cn?I#xORpPK`ciE|dP9XKQWyKS|NXUWLLemjA0 zn+lKRkW*Y51vh+d9#v3bmY!aU`VPh~e{_jIzun(LyS5>r#zB3@A;X-0Q~aHi1@1S= zJPaaAvG?g)T>~!>`dCL5hM3hOg0shfi`G<)MP5}@SA+Mz>HN6u#1_)l6|p*sdd~;B z=v30>p4?}Ts0Zc6NoMyT8D4uTCx5NrF(Av^g># z+kq)}EA~#7iA#2E+(?HHE~q`j{kYG-DGZM0Nfh9J-oKtfS#f@cvM` zN*AX#gI5k%+8R3VP4Yw#uZYYP{?>MG;~K)1{v#cbQjNwf^-gsb zT6Tkc7O@EvWrhflhpW69^r9=}X_8?LISG38kID{np#cmG4ygD0cl2A1j`5_3P*Ms6{Tn4(6b?d#9mc=X}Wwn*0e@S zspx0DBV~%tdcX}RH3RqDC|HvZ)$FJ=%g87Hc>h8-wFJhBrs%s)U}cY32|7UN z{a@=-t{dikigVXiM5v_LPh~CJx%TIM>F0236*yvcA<7#z8t^XaqRyd?j9^Y)9z28K zhuE%bcKfm-J);ET!sc)m^2e%pmj*B_VO2m)wtjauyayEF?%{XKyWV-5rITr3Dzrs| zgk*BYWh>lfemdd=u8g0%OL>)eS_$D%zO(jl_-|;Fz~dF^m3ucq#`wTg3%J7wQM~B@ zvlKFbWLs5xJiUO4*8;i;_-(Lm*yby`CZY!)6DdpfZmgoFpX+2#2)grQ` ziu3;R$5Pax&iXQ8?Q>xjcJ4&>?{g@3_7z>oS6*eFlo9XMwo{_?ayhHool^dWNI&zp zJWK3*OZmWAlu2DuUsfnwRDda zcr6u-LQywF{)9%;&qO?o_%1Z_Lwxn+!e za_NP)LDVlwiojS6zXU}g&zFY&_SgxqqVf04bFr@e|LB5+d;xmha+wuWjJ2E ze2klK4KExUK298wZR&Ama>DJA*L|5mgMFK4L$#q5H-Dz~5FWSR_8@gAWdf#LfA0C5 zQ?q_~tWNtJ!Gxr2q(dY3MO6uYl1D7$j|Ni}rsB8kXCp7?!Mk<;eLpY|K)~12*dn-h z3-GvFMOKn$!{<}-l;)rw3yDlmsqfqDCm;ps1r(CSL#_Jp#Dq2P#dI|fg{pa%{0nQv zAOrva00000003biWt!o@om~Dtxi1$!Y9VCX>KrH?v-~Tfu5>@w2BDt~qsN%KK#Lq* z;=Vz8*&U3dGnI8_ONr}E%~eL~FmwO_0000002TIJ1L=KcE%w=?7xA6!A1avew=K*j zdIHT*6UGzJ8(X_p%m=B#af?w*39m9E;Xi=pzbf- z4jD}#0fXCHJyd*zq7WM_^h6&{J)s|J?Pw2IOu_TuNos%q00r;IxWiZt@U%dJ%LLp} za!@$^ud9?EC1~S`G{!qJ=8g6crlBnVNq3r-iG>fad8E&c5EF+-T%F9qIi!>;DJbRK zjxZXON9*LqY@%5|sBV3~*U9IZFHV`m!2t>IjvW6yfFWyPGbdtx2wj#(*Jr#W=N`7= z<~hJyuIhLjnGB)kb^%h!f#izeR*1J~_Qbw`E#`z%`Y8(7cZ7P<&v zNZ4~x=_AhSO?`!!J`UDf0N@a?FufZcKN}i-No+&u?mMhUM)m8|eUm9+-DcVyP)FxA zhRJ?MpgY7Ew_U_JUh_1koaj|R&(m82lmyjWGF~R-$`V`uf8U`GLmyPi2N==DDq0Sx zQ7fXUvA|ykny|!cxQk}{x)}r25QG!C2||z?{V#G{H7jzx}iVfTBbPhj(K16ZcWrP)Rz-!J)wD89v!@BK9Y@m6;I+w`7MT)7?P6 z$@Mw3lDpko^sUSBQ(p?fO$#1&xporiq;9Idqt^_!)$yCViWdgnlTKbf_3j1+5|UkT zR0^@$*EsTeoR~4uIfJ-kHN6MQu?JS0Ti*n{9*_hDM9irYlYTNI`iofN>4%!wqcUQ{ z6!aikd$MpM5c_T2cl`6+b#Gm_zq!26zzLI&D6<$3WF`Mq_hakjN+M!xV1{6X)d0xU zI9And5j(|WhA8wqsH;0bvhSHz)a3Sc$jDqAMy60MRGR{$>wb`Evo1N z5PmlpPw!$PPtGGs!PI|8m|SjC%225~APwKs2ht5Y=uIO8J!{(y_NU|cC?#RI3Sf}$ z?q;M~@waC~@MiEC#1l*BM4RzQD|1uqipAyyUL&8GGg}YtZ%FgCXb`H0yII{M&gestDv?yY#>km3s*_Ij{(DhOn#000ts{ZWDynLz*m z008p`7vU|wc`#tV9Z9%(h3fjt6uu%U-dE-1DmpN@7SPr6s#Nz}rF(6sbX#}Xj{7av zv=S39%0-{%3=bg!H*Up%GZe9%_VJ{)9yq0rmb~6tVhxnX^*TO6xLGJq4FQrroDBF8 z*@X%bKy?XbBoBh|n53ql%u<*r3mzlyHoC(RF4tEuSg{e{dLjZe;D`*tU#h^cw(*k- z0Yp(n*WK5BOh$j`C{2-auZxIb3S3=lPQRtoSr)pr+((IJqP;EP%97RlC|*rmu(KS; zq901FDn}B*Bl+rV3fs|1h5QNCi@9J*sT-(kqwUQd^qYgw-1zc#%ShBVJCZEFs!RUO z+MSjrjQkLBu3@UN;(id@)nlWsNmc2qgHrr&JUjRdL7nZNADQ?8kCr1b1l4R;d)^xK^uj!z&R*yWnaP5gFn8f}oRNO*G#{o612#Nl>t-Xzp&8Q2wNJ2s z$|L_>3K`de(K%4r{Iu|H_V;9Uc60D1=kvuD+!)4Wi`!fS4>2I~{~ex+$ecW=(0orv zpzy943XWjV)=jGj{?tF-@u2SNWJTMEf8HV{vqqbmp+`||c&pEWGX>BE(z2c1STLHH@S zD#W`|1j$5QwgwWPM`>0XdS?}`S8Y34tgFCR_#(>eK2f5wmTC)7Q4xC5Wo~XvkMaq9 z;||cCeZ6{sgS*SVHvd|^WpVC1Q2$ReOt^{#kbj%^DtYcZ-wZwfZ9)06a`-sPiA_O@ zf{sE~n3#_DKxn8Ka5gDkhRB6TBNZXtV|}hERLSr#uhYK}gy7$8V9vYq=mmHUK%}l4 z19NMAU<@PgN2^i6<^u@gW;dife_F)TEF=E0DG$Bu2WpvbXA7>xGq=OPauUjF{TM+w z(G{I{HUcm*LZqf|S4xdSKa*m<{40*YAy-94+fQkT&^7WrSAbzXi%I7oV?qGPI&<^E zUxubi|0)yE)>v$cd)xVQf~{~wOF~BRVo-WD$5HGp8QR83%^Mtv1At-o?@mHC+lJYI zO#{NBbV$(bBv~Cj{6$Ee07I;+n#9xw^{iQdj1lkE63Ja2U8YiUF=lQ@0NWmN9`wA7ti*Th+iXM3saGxN z5**gY)>9=rKmJEvI~02(AcKPkp>*z|O86A{eF!<-Zn*uH*VcCUwRs?OK$4-mrgcov z&CEn6Oebchp;et@df1=*`cN;0x-udW0ajt%QxZhnVj?szj}yjYt7=kBIvgwyOs&+$ zXS3$$fk3zrnwGX;_3TRqxyFDIlC2scYQ@>PO`Ajt_*@ALtK^7bP;s}D98tJO1;vqHz3eW zeTYpV?Pd3Xc%OQ0Zy@YR=(8D>8>o%bx+i@N+F0rQe?YM?zwEHOr8NC0&$Q^(Z%|YC zVn@?+on(WFZ&h~-m$E@R_#wiXb%~H$i(rwDDLd|SHNNl}w|0L$4SgoscC7=D(PPZTvk0W$ zGYDL)xNC6)AuL3O5vX@r&{LDDJ&aSb-?JOO7fY3~x4KR4)Ope@esjVVG44gTy8B~u zgLE4f6Gh~v3`Vy%^g7NdP5dys3IisP2@9db1{Fjw5k=!AYUCN zKuW+$qWuXd6rI&F`{1?T9)JdBI07@U0<)^^-Dt!scvpiYNtgq{9Xk3KiZX!A6(5g( zX9oVW>gmAj2hX=6m4R74{QYSkdY&XF2oP)60UT}_mSPp4w2W2J^{(3)J*`P}wyrQU&RZ zI!$8|BlpZ#jM9qfevlkA69`%8P_@MQs3hjF;(KSCz~j@1dKP!Zb@`L+#8$H(LbGkE zQN}LW!PT;VB0i~oGNTUBnLRGEP?(O!jvyatb`u8^kWvX0GnU*eM-Re*aX4Zj128#F zB3D2&eO5`GNQ(0xPxDG?wh2p>CHrbBdnDDtw#Vn&-}{dt48&@>0D=+!NYA6w5!0Ri zgcl=j$7x9A3vV|yTsV3vR{kg!{_E{*k`qw0V{2sPjF7@-vdn^aY*hK$K#_LiIaYAC z*jALtD42`XyT0Bdd9a6D;O^Ki#Gx4?zcc6pk2rf^d|I@S{>ndgrUBj`obUj~bK9T3 z5G8GI<(ER(0%kq>+43Zn)F!t zm%YvJq+{aL3){}~>lr)FavnQfc(@hjs-s^N=S){dm(N1DcOGjTz_N78f3Xk49qp(t zoLs4=zlS|3c#ukcV53Km_ri1!iU$c)(*fBWP9FluCVf*^rE8p1TfMK-Oo3%DCg%t3 z8r6Vdhj_f1u%Os+!TiLOGeA*TC91>)M4JfAoKOpion3|Bk2mPZsPql{1+^t7EVj+Gp`!~xwbi(GsFLz?GBa;I4EC=V+sI@^z9O~MzW z;Njk4L_pobIKWpo!cG&+xHbh{LP^kggOue^#R3qO^Bd&Q+ZI~Qng&DClMtB}dFP4-RK@9$WxWRX&n=Gg3pjSv4l~e}yI?e! zl7j%UwHPR#x?DGiOiw%zYjAQmaEmLPMkF_0@txJ_mXNrsn!(Yjn{g}Y~DhsR3F8JL5C#H=zQv0$}S6Y%WO2rm$789D_LT}HdPJ1a{NJTnD#c-|R zH6f7rez|PsXmuzkW2+DDyh5})LHFjrl2YBZ6Y<42M;>Qq9ETewTf{FwThh5_lgJQB!tGK}es*AtnB3w^=VG|D}v07c#HIEj0 z1mWhj)~~+#_l7cpUTpQMH1N;2hBJ!ggw9KW+x6K#N)aWe2gFcH{Ul*YhYF)|CWo0y z@|Weo{^7h6Q-Oo*^mT3^=Yi&G26BAQu3siT|7u%1JE68 z55^0pa-q2)jk`_0Qd7!y{Qk8(^Z#*nHqCGqjfQ8;>Vyp+GSJ#jBk1#OlHUU8j)!NF z(!MCTwCa2)7{hd8Vzakf-Ja?JHw5BiVqrm?n#TZJgyxMxgJFIwjE`J+g$6@$Pt3n% zYj(E*Fmafo9|Ym^9cRcq=te*R;9#R&mLmAEg)WTT9$(?5wm zWA7a{+XQHsQk!t&9^qa}VNesibgsT;B{l618T|ay7*L(hiyY`vHSQiezCB(G#XA?< z;IPUCLJ&bzTu%XU)@CiV^C+c(VYh|^t8SWxjrdU(?FOg3I=v#BxUbKn>Ty+BabN@dxOqb%q{pOz_fn zOiTuHaobNR)%RA`Jl#%GOHv!SbQLZWNP%|f%n{}?&%WUvVkW6nP6yR`9119;b(4YxVGOs7s4oFEL^W7|9dZbwH@g7Y-{-9f1)VN z))`@>EGkSzo8hhx@t*Z7!;VRz+c`~auN~H~NlIR_s|N;8hiUl3cOE{r3eArwV8rs9{i<3D^@IxG}KcTL3VAs4!FB*WO5q?;; z=xj_k>_|5|zaJGvqc{9tC_iw93WS7CbJ z^hd%Plu-^WtZbw09 ztsemgVUthA-M|~%kff7oww04dc1O9Rup$xVf`CEWI8H;G!$T~&J7UYg@eMicRYX2) z049vzGW>&d=#wAcCB-o3k>1&uz(V6cc0vz`r)4oKCz;EO;ox_5i={~11;NX!E)Jp z-+e-_#!}9p$O(Os)0_H z6@RRYBA!#hr^^z2=9FY?=jUE(-b({rbHJPFl0c9g=2I5hxC*CTVY45N(cUFH_CA27 znE3AHOt~CT|p(Uv$F#PVA`B`BZCFZxzKIsqCv3K${5UB!WiOGYI@3m8T>>3npo^Rk=msrimOE}0!MlrGe+|Mdc?#ekZWQ)u{lN)D z%d2KfZP%TVj9W=1hH#a+e7}Qo^`>ow)$j~53yI~b=&1OF zs_KrGvqF4JFRi1>Z-r7(^tmP*Yd4WQD^$eYGovHN zgibLgf5{2_>e8U&zX6k5(-VvL`kr^{4yflv7REQ7#^S1z|99Lp^tL}-VE0Q$@=u_( zv`kV7I_!Ou>?uupzt4*HtNJ<(n@X#N64Z(NOk?PY^FdXb$I=9Xf;kZ3qER?Y(y4hg z{KZvxq{B3whkVn{$VcyI2Y!%9_k?~2(>X^$Wrr7$SFhCN8H;y!KH<{cw#Loqsl>$0A^$zC zryyQW>Gj{pkKV>4s6F|GTAJ+Rz7G&O4l;@CCCC;xx*0hX^8(gIO(ATs>TU7-&kot` z1&M4O?c29uFvn#wDl@^c*b_%bI5hSmeQtLI0v1s|?fZ$?vj zptDqT9spM_`m--x8rPq3$oWhXvy2Sb#mFfro3Y63ug+-$m9(~ts0twgd zJQxQD4b2++@r<{SjGoIR$rCvub5j^>+Pt!>!37-ioOJX?1PM+ZfTL1r};{9-Jq7{ z8cu4_wf;^h9?s{Fyfhfpy$$r!HHj=tR$r4?M8QTVyXf$Y+D9f3C)(c9sQ(PO(ygyc z)xv^kwNV;5pO7sxW{lfeu1VwFeWBys(N5-hMRq1uBzf!;c6ahew#7cX1V-&x|5caw zU?T`#76FDt54cWP1fzXtq0(V4_hfxOtToNZgo;7L#sy&^BiHEr1<9;Bt%4zuq|E3w z7kDB<+V?7P;wv%S&RupU_g>JgDU=lzqC}GPvq>xPJTaGwavg9EXwiE6bTq!+1nypy z+$2iUod85YyT24g^x`1>_Jt`tpll{~jfZHU=*nm?9^Ga_uLm|$zF;wwZc(#9*K5|M zm;NsCS-=69)jQ_Cm!r47Az7WgDDVU4b0>Fa&<;vtOs3QHzDawO^W}EkGan%v_l+EP z?*n3bsb?hU(>ZB06P=ihFdGn`ri2S9n@GUnvv zkg5c~IctG%>F{FgzwhpRB8BuxdihL%Wg7E3Zthwj=k;$n<3DhHawbJ-9bh=AJdi0eTg4; znW!6&LtCNu%h+qK7ZKB$6YO#$u92>BE zGl0&TkOL-R7>cE!AGOQ7qenbA}N2Kc4-al7Pzi)R_mOeKsQtnZ-I&R2j3k)o8R#iD?G`% zzXnG&WuuKfb-SEwPny*!M-?+5!w5!Prza$ocng4Y_xc`{_y^1)Wr(FD*5DfMu|)Og@`MaWt=b51Hug8D;`}g#3IMoX^R^$#g;gtL^H_=?lpqB)mFD`ue}qj z?f&c~ZRbNus1@(o|8#*M$7z3!>Ir*MwpQT)t!neT=s!3J{@MJUC%>^_Tl2jstUjh@ zanE-5fDm;uVd=Ci3}whmA9emuy=r=-zrA5{?G1!PnY&-wck1^L%cD6!8JkIq_Fbgk zFCy2zeh?9qG=e1%t7~- zC;*krGv{r}Cgv6?TQH@NF9o+Zoj{69lU@1_+rN2{q8ur(bAUU3k;36)pQJTc+jo6}tIf ziHmU!-H1pUo!@4{8>-yiZ3Idnb!)|qtEV0fN+JXI;#d=8k7vYI^M04`gX=wv&}aW5 zT7jMzB!YTS8=ouqRv^+#kJ%BTu18(=Ogq!vgWz4le}n{D-1oR8vbPPp24=E4Dq#N% zmM|&bswhI_PkkK|yitjI(|Cj7oPrt%H?Pj+%hOphkLrQ3G9=2Hz3+&N7Cv_ZE;psU zLbQ+l4OG*XOH~y4;_7z8$#WP&eA|kKxBw`!P*@Mpto zAet2~u=RJFqDOy?z~YI6f4L3OU^**yS<$z$b+5=V=VbQTjCF}c?9`6h^9T?Q6=1G? z(j%Mlj8Zj&uIwIj6H8!F@rU zcbWfNU(SAc5)?`uhcXi-&+7_w`Q5k5?wVw}z>(z#Il$g(hu_{JKM1B>9znxPd}rw(XbeSu55UoKB~+&3v~#6DAPn3#U7vZSmC4(7(b5-NE<)xQup zNw`w=G4y(VExOl`wV+SxCjk?UTtd<={}m|SBepz@t*JY* zJCO(S10#9w0%o^0ri9%u}3e5Nj1Gts-j#O@#MU?E{!5x)bKBSD%hVOg~ z@^)Fk$)|CSihLUZr&R;CwIV;#AhZpR$SU4(BA)j+Dq;_vZggGc0u%Wh>fzk>KLlR&AXq^{*e(dBM>ko1!WIA!n zY`n^7(a{n!me_UD;_Gds_*uPJNk_|ojnvqd&*gLA@8_})fT7Sky5USx=wZz#(L8Q^ zG=)p}j0ckU*Y@^T&uD4hRK~5$>NgVc+oKC{l#1o4Z(0Rm)#Cf9&W266Yb-ISH3%WD z4(?elb#sl7x7+`ZXj4GoVQZL>cGU?3r&eJUYuzLk5Yc)p~iE+JvhH~JI@v5vF zvLIJdbUiQ)9!<>HB+&xZ9C1p{TkB?~vAzKf!sFGos1<>~&&07AmYTbIrHp zhHk2`y^8@y8{ks5J{Ky~>8jFoXLlDqo@I{kSynZn$I4Ec zD=L$uPOc&~f~ZW2l5$yGT$)y6);ZGD66Heg7U3Cpl_~5Vg)NE&n-sc!GSV&bzX_V@ zwgP21AEyZS@G|-z8MU-<+#)TEvJO|`zz9^5Y|vUUh`3iY;jpfy=1`W88ZabAIj~o! zM{;tuVF|&1erGUD$F_u-b) z@cT5!V&IafFSi0Slx0VmNJWwYaAp<9j!ZsF1LG-`^zZ3VushGG%3}sYHO$`UsM8Y4 z^HU(m3}#PYkWiYcA#9dz^uR|^LJDjr!ehfjl?&bBI!*{+qJ$9;{UwCSc`{*@Yg4sV zf!vGAcSyg=C?J{P*sT?Xf&K#8<9z84p0S@$_O6KDPJQ0^I;Z80Vttu-)nTgsSI50V zXTo{Y%D7Vvia6JIB~9CVz5%VSmJ7ly8coV^>pO;4-0e~4U z=OC+tZvxd*ZOqNiK+%)oI?)YIHqy;}0tW!~N^0}Y)XdLzd6V**{5{jGPnx(_d%U9V zxyI!iEDH}1f{(n^C_t8AK^p#rCGU{@m#XiBgc0kom{3R{+tLZbni@F)d9;WRVdX4> ztUhMun`IrK(Os~PR0p;+_txcX_`4BxpGa0op&tS#pwBO6ua%8}&_KJAN(7)OZN)i9w)3+y20kx5zwt?vmZYRxI{$lp%$Wt(9-6e% zms33bq0yz=aY*$Pfw1iOTNypjn~{-kEaWLR2s?8TlpF7?dbplN=t>l&dhpDV3Jpw& z+r2xMiAKG;a5Szy;~m=Pi~GSmX-bVAlcsVQy?$}~g3?U3hR=L{JU2`9cs5mG9x(Q! zo-d3Hi=9Lllu_11uRc5P9kyhF6MP?9e@<=O@wTZJPw!WSM)12|o@QjYX;?ph-dIFGn$RhWPx3!!6(h8$W5ZuS)>_UsRX=@d zA$IhaC{XI{_#?mEJF=Iq73_AmwxFGg<{W_CfN7tm?{fkbw4Za4NWZTrmRWbOO-b2ibVvFn8>tM!~iGX2%<$yoyhV8p&WnpwCkmNC%Xhjr+(okr+K zjeE}gbEv5S`aSvb5ozfoxFMpGFvbSR_Ju9rG3QqSXNPD#R_d>vrm>|wNm#t0kIZ?* ze?p(Z%3q5C!D~i?f{gsFRzFte0;~euKlP3q5-J4^*K-eABmz5FWSGbHrvqTtYt6No z?cvSKZ|;FX4C|?~6{lf9Sj^XVLSlCFPfTiKp;hQ(XSIh>bVb_f?WiA2^OiQa{5RxdY2eVFsy9# zNEso)T&8+>TVgl8(L5LaoRlVdccIF%6dov)-Y0gWL>%l-ai#SWB_l0=&R1Meh18{L zZ9EjjGrQ*HEDT+^1*ZXEEeuj#VyHp82*8L|ELslQ4Z}7i9Oo4qrL@8*|bF=%JQiMe?@-a2C{I4RDJQ ztn*aI7uh3IK{Eo0uUf*H9L!<8>6idNV$Dx#MZpMii5i%ha>0mRZU;R+ z>v6ymEQkGihnq|^Gw;R0lYC$s#D2`)L`wdLV0kk)W#s7E9B54l7@>DiTsj12zC~re zf8g@83gYs}rpM|^UUhG7mcPsf3^NdTh3$P5E%X&4-SU$S;oQY;^V{Xr(f>#g zhO?NRq))rlHsP9PzbctP2M-}RBte0t*hV(|?zYrLpZv}{IwXWsRzTTC_GpREk0V2t zHoOUbG||p7zyp}TkPqKSK%vW2qod$L+Jo^-(%Il5Rez!;GuQAo8EmBuZ?K4FSRL~d z7{dcvdgq_!26`z0CTb9DY1J%zmE(T}kYK%uj8y>!hE`aCBT`=G|(%yjc}@Q&c1TE zNt;1JQs`xM($i6UdQ*YgE}&<8mj~e47w-Xi+~_r8c3e8KVo4m9OW7@`DKu-;Wdu4`~xO{nL(S0L<=8!reEL-IW-7 zm9ix9sU4K;=k&P5zhuLZMma6ftN!=eFF-(`kP@(oT(XT8?^#UEc@r9~UX)cAJa_wN9J2QQER782eXp~W&ODDl$PtXq%DuV?6>P;49G$1p=! zc_pEXUSjQF#`IJkc{)6*yVF_h0V9bCWOKDk$f{-5N>hQ{8eC$}oYG!H4tF|Ns@%hH z^EW$rk&Liwje_f0%b>nb96fvp0+p1^Ko2MT8hw!XoXX;HlwMjo62w^)ovQa@Gbc*N zf_C+Yj&Jg9GA?h=4Jcz*4M`KjgP)>r^-gsi`39S5S_pJOmJ78+V#q|E*!`g~$8Q%N z(CG>v7kG<6Lmj}W9g;j(8Jw_G^@dwcY#7Y-_F-;X2b<)*C(w8CeRgB@hO9Tx z_rwR>(&Xv&6qqwYf#bFc_NwZA+kPFUQ-Q+bBR}SNF`~g^!wg`cu8I_xyzpwOW3L-o zUOqs{^>DtL6JSjF=aLxI?t2;2{GAE-Qo*8e8f7*(_tF3rbrk!E)RgT5dfn9y?K{^QD9;hqwaE zELgxo2bn8tWRGs649Ge2_aoVq(vG^cnlEQhjBDi=NPsaPf$Z#wk3+egVrSyT;5BebZ4M|gKRZk~x1Zl^&U7bCYEb26aaCKT8B}|h6^*sg2Q9l< zq~jqmgcG5eBS-)Vgqxqzc~`e>VyYHREgc&$51Y>@hC_%)_tKcYH`%$UplGZ{FD7Uf$}$I?KOMA z^Tx9rd1!|H&k`l#M%g-=>Gb0z;)*UFG}}w~x?yyZ0R3TpB~4Ynsk5}7?N_)&q(3(% z*xZb(FI$h@_R58LEFko>1>l;vi}Dzv!T57q zyhUo6d$yR)OLju{Y42_Wt035^F%rD)cPQQr2rvHuTzEPR{|N@(rsVG$+QANk|O8fXIbhtmWJ*+a}KGQIR~*(Eo(mg_a-&rn*q`jjm-ycK;`J z45ziXZbx^%Te#1@nZ(>^DPRYP3xo%UnFIn@c$})PuL^|F-)0~IZ?$e9Ada5xyq+=h z{hVcWARJ*Gvd8~)#}S9|nZfm=k1rtQta;u>qA07{h6Af=PV56vNS@i*ziYVtJK>s{ zQsKrgl#x*Ow}+9zL|9;}&8=;`XSO+4i6S31B{B`%IWK|;Pg+u-4VC5)w2pc=0pjSe z_Tv8MQds0{7%Ir_O3U`d1&TgteL?=r*msB3f7BQ#nsk3~bUgq=;Jggf;B|U0GA@th zB(o{W5!q9o+n(TcgYHzBmXwwV^;%f!xqVN}09u@q;??yEIUU1lU=u%gpe(}C(UovA zY_I`zJaRR$KTqFMS6G1bDDW*^e9VtUVAgvG#~zF5!H*ykL}Y%jR9{lA@|5#B5XD+r z3K=UgDnq$A#x3ga0Ec^|rKe`3RX>}6>&h^j-GK?<;qJGPsLH0V5j{YA&qoJ96S_fG z*3Ep8bG|KzJX7*OAQ~r>mb~;y{jlhuCC1MiTVo)$)%Go9e&0cT<_7T6U};-NisV zc?=&Y6m&2rG$H4UKz}-nb24=wuF&%!9y{Tr-6vs&O)r3LszO0@YB z=GVF+Q-j|cexX~<$O5HzCS$9cX|Knt^LnfaC#mVuN&&kCS zSe}6tLkJ2?N2{A?-?U|1VNVJQ5*e2rdmrU<`{nAcxiIyV{3GR|r{*@l<+!8 z;gwfs9{Zkcr&wJ(FEtdzc#J5K7~gSpvP%zBqroL%Ogwdx@2I06u(J8 zQJ00nm1`xJL4_h_kM#-#u9NBWgf?>2Ydx6Gqya{Hx>a}!f>QM-05&$G*BG!+`Y@1| zr2ie+964M0rJ66bjZ+#;zYCQzyKP^c#N|Yc8ig*+(ES7iMW5?h-tRpHOLE0qwPQ<_ zh<(IO*jH?iH-m(d($>sNB1lVuq_-;-6O&pWM({9|kfvI2r3U zs@YHfb~XPiYFZe+rf5dgaL^;+Il(4~hE6>)2Y&)^iZC`$X1K{7RcKxd+69v_jrSY8 z39k7Dp%s$I4xn+@AzXNj8q+JzIvr=+M-4Rgg1E5dp1WW)(#mwvCSYvU1w+UKpbbFArH(X>xHDfygb(!hAX zUbd;fN7>={KMk3c?*tRYlZ(Fq(d1O6g4+GGz=N$vD0d=8YELPAiIeoxx?j zyw5{)KHab?Cu$cH&hgTKIS@=ZhxZFtm|$wDpdh0l|1@ufiDRF<3HQ9)s>ls#)U4UJ zhWqAcV-QylRdQ;U0lzSE|AH>~**vjws_d5YIL|5afnTf3bJLHOotA$B2b+%uc2MG! z!#F!f!HyheAiGi{zjs00H0t93)DS0f`90jk!1IrE?U$SV|2a*fec~fNg5}QFSj&}q ziwfFGBxTSUw3dS#< z^8XLT*!u!V;xeq1;7@@mw=P4TZfXb^P35tUSFs;WE_>_es=p%k_^ z1>PaHREMt1$A^-WC$bx9Q>Cwk5VYSZj2%|~+eDl}lJ3=#A4e{6QH-|x0Xwn9ql3U8 z2A{UwJ`wsa;`$Z(@Rk8ShcztzA`=FWnQ=4YG5JlDwN?@Hn;O{hhoK(4mn+&& z^U2h80~HTVkazU^1c8cVICOp?RaxIAzs~udTx2sJjPGoZ!${^2@FLdbouIT~=TiDWKv`=%l zzFn7`@Ct){Z;QJ zL?qtHhsOhIlf20GKgfiDNvoT2ONbYi9R$*>r4hS-KHI1}LB8o~nvH~mdXfFZ_Pq^{ zYKTRcpM=;*3_~Kq1w+wbE9*t92%vgJ`?V=s9{B%1=6fXm*I;9!Gj&271%lPF2?X9g zDTm%24Dw>h#tz{ks>w&mM|Ij3y%UPv?8Bz-|9|iuznf#iJW=yBjjy+qBhFxCd_#46 z=d+@?ys^F4(Q(lak0VJ>CWuQ+rtY(;IP3;`WX2?8K}{zMq#0``(Z$-w;5TFO&FYjR zQ4pzI*Dm2H^l;xOVmX_tjjO)S+1JZ5tBPMv5pecVgrF2g%M<@MB627AC?2&KAFTw8Si~A!d|p@p`hWIxD|N(^ zlP{X11py<7^@OK*{~Qk0tR{Us^!!L>`4-w`WauQVtX16deos8aQFk8d6;B*1mJ6VY zVOtXTDGH>+v)_tzS%K7uekTy$+attQCH9DHl}OR@@6#6{Eu>zgoKNM^Ug*H9-7atW z;Jt^ZNt3$uDj|8Di#K?6MYd=@i*HfD>96QAn+m}XS_~YL?Dm-~3bCpW6Z!^Zsg{Yl zj!7)RhG4Sj8yHiPU6|}CWn|feqvMvRo70Tcz)TL{kAMg}XqU~Kp&aR}APnBvo$XR! zhJf2Z=M&}a@Z!L-qdOi2!Eddrowt*0CH%$+8{tFRNhi`+p|w!4M!e-%yHOf{c?9Jy z@H%&uQ=#!48%3lw9yl}B2zm|O+YzEnZBCz?ROsl^Tbs(|1ndGa#WQjT{iFrSb{@Xc=FNYV=B|mop011eE?{>yNO4 zfb1dg(rl3Ofv!OZ0=Yhjb;SOYlqD*2cw)nq%)EAp?uYaz)0!R10M9N!fjv*iXSlX- zbhvUwRZrtQykqHuX4HrV#BswW3u+MU#MQLqK-ugg$m+oB4%-o_ic4OlTLZzJ|* z`wt%Wu`I6IN?gr_-9EYg-Q+M?!ZleekQj_qmW_xV2h!e&>fq%LsTA5{tNeR}VY@>R zYq#!)v8m&bKWD-aBMBg0l*JL(l+uWX6V7Mph2k0iew0;JT9*Fl zegLD|it%}v)YZM9w&l#96VQt}1Pl3_>Y2m*-53BfGs`tx zrMo~4xe^;@c)p3PRBDp!3vV?{7TJ!^1CV)+q7{x zr%}d}VFS|#Q(D@DRqtxD$t9?i9TrreoL}iAD9ufI4nC5h5j(*n+BqEmY_oDiOq-N7 z90plYf<`IIULMNPT~P}Uc&%ny@y3uN0RupSdPKghCn+UqTpGaL1LIk40TrgAo}y%Z zdH2&85&8E-AQLIUjApxd(Ji73iUsdtY!cKMc5JtB2mfrTsmtG_snNLUMl7%)H^khr z?kQdCAq$yu$R6ZvSOpcQgbf}bw^Ll#HLAi&s+{zwCZrosenQZU5gM#Aa)5#%!4|?9 zK0PSqM5?yaSXH)_*oX%J@b|kglY=D+)Dl5kkxHoq4+74JwCVA*fj}#jUVKsL*-Or( zl5%~0JB|zY?EHRhpN>Qg)~ukjl*q z2Sb*@CkIj#K5TaQWzh@S$JQ!-GA|79;M60bjNHT!tA_Omd5NE3;27x|LEoR-`pG61 zBh$-Z>~?x9e%=f2Ac~-0imgtAOvlGwaE%PZ{3Y$0wk%43dqXMI z+T|Btdhjs9QqqVNZy(isn#K?;-#EQOw0hjca%Rt()FaR0dNd$d!b69|(tV%#Jqa3B z9rnXWS@wQvnnO&}8-=mK0F`I@#ZT%Em?b*eh@b4kxu!P4;XFs(RH8<@>`l1R*`EB3 zh#bFcBRMTl`Gl)e2e!Ir#M4v;U;|Mvhdt%2NA$lE0yOP9F3c*V7B_sa(mqCl1|~*S zetEZcW{rkxDW8*jAEMe~Hn96+R)I7}+dF18PQbXD+ldznN~8-WYrpG_c;2&zzPMYo z4{*VdzA&Q~MB$+J7&orQzfJp%SfL0wh>}|+DvVrAUCI?Zk+PnUn2V?TO6%@}p0?$I zv}1ap6`JWwIoYBhClqTFWXamVT%IB|o$1q!Ml}KJ8H^qFfq_Jr`+MIxS<*LOsD)~D zY{|BImn8ofHIRR1MI0^@%lV$3+%4x1f!}wqXT2*aa0N8#6JcXbu<*HNyCQVf5?2N- z>!wCHnrUzUf1?;obhM#W99N5H#gy^;SHvKS`_O3r1}DM&2^Lptr9e0wVwMkNhKD*v zkB~yJ?LnrF1rCi=UmCLbg4^F}5d~_|H6D&Dl@o-v+{ggz!wIGHtu4bQywW6HH2}y~ zr0p}sA<)iXVC2KkCc_o$2RaGB_`8pE7o}JWhrl+@r(H>f{LT`xiN1kRf2Jlw-<-ucrTqwwEY|=(memGUiMDlkdGw6n zH7h6VP5%aeY5bEn1JLZu3F0)zjTe<;CJkH|Mxxsiuo~mFLWa7q@jva3kWHFFM2rEW zFT)OQ&Jyy55z`Sn1}lJ`pZ;5B4;r#UH#pBJMdzLHi7R-+zHv4gu=Sq*nlp4b1~oD z{k2sT@{8VK!BeANvx@ElKm5%lTMU2vAXcpT=9TMQieYAqFoD%dWRmT8{*~O`}2IT`QQdZGz z-iC-|7!6>W9_c(z-VOHa_zq1)JXHz_{3KM$!e!0P!m;D< zZ|%oOU-DY@0lr1tq0Lu515WwnAZEl@(mPjvzO`Xq8G`B9Pm2IALlBAdQbQSKH9QuW z*pyJJDaYz1A&s-z7@fD-_Vt@CD(qf7y-cSm+kQVQUFGgcJ1=!qahXP%K}iM=&T7Ia zHOyp%GC8bu0LzGC(0AY@MmcY5d++MIsx3p z!k60YpftvQ%3qXcMuAFhBw$xMN=Gpqjzm)TAXQHf1Jbt_HBD2l)6L6M7+3SSxM=A% z$JG_+Lh0$?)kKDr+~oCaSt&WQjH`Dn)FS#TFtbH6J)xo%@jVe zEvqd#Gi%AfeM8V2S0uELjoIP!Xc5T@@^8#tu&C~ml9HD757n|6YI0z7wy<*z9BJ3N zl)1}l&cl77G1TSBF$83iz2iM1q_6yTV8R4Z3@QTFId1{iSGtuXkY_P(MTrLYk|JaqjVn`lm-!igJu-52j;HVgp&^*`vW$)x(Hw46I}K3 z%n}vvYInR3HHyVL`u*mEYE56NIWOdZn%AX$=9lV0&1ArLD2m%LQ~t?3e>}rK66py; zc)Pj*;d{z!Y7kEIdgTK42f7+ zMYKW9XZ27?6&H?8T)e6IDK$jGjL;xW|6Iz{(u}%5^sDdfe&!ZY z^adHuF5q+=WXRo(T|VYo*;JI3g#F!R9BfG{rL7Ha^R?)VFZX*7X_eZK(vZmi8e+Pu zBQP&7kh8L$`^MFvMQA44iW3j`8Y^~dj{*-aIQ4Zkk#c3p z)KZuipG9wkbxHDOGJ(h0+K+%GwBuB3cwXHES{O5ga-_kOxpLIERO=EousBiijcIa?p8O9MBE+(umg(NE>?kducT$g2vHHh24`$kXAYmH=F93i zMZb?~0z>k7WUduZCU|9t!bUNW-t+gos%Z9x|;Hq)sAJ&|vHA|^&H4dw$!V;1{pDdTIl zV&;y~^i$8?bv!*uZyyHdzV>h`f9~#)w~b!n`lQ@spGAzO*?osvU;^fv@W70U)UI>~ zIm7(Q1 zl$nxe{uid(wR{}-sX|H}20?wu5qSe3WB|vYxiN|S_;&)o?^wY7i(Tr#WIza3{(r= z8fv;+6C*9jJK9XPAC$KtX~d}mY5B^$1n~V`0f}K+-cJuc_F}=GD`Q0HOmVKUZf)7{ z(U0F0-TN{g$BQ~ANqS?SRN*6eSv5PO<@PLg`d8bW?>gG)a_W>~ z;Yk-b&P=(gyvAJd^5YUX><-@YIf?7-VI0E0(9(wrK!Wd=`S! zWgKFt)_E(F$$V;2qItFC>q6D6Je!!-T2Xc|-}Rq#%+$h3S^FT`1YiJBTnpar7(}v( z1A%U>Pib`cY8OhMeLd*Y_bI<~A9C>X0`lq7040c!g?}wEBuiDE?Nt$D@Ltd&K=}VN zN=zrxRbzR9WXFn{>j^6oO4j+l6Kvnm9@yrXq@y%2g1LfG63o;OKRn#u(VSNJrL)BJClnu`WCE%$4?BiN=h7pFYIxOG9vYNd;wEDI`_(}8etFH>A= zJN)JkU)}RW+r}5q8S%HBQQ$I%g1z!B^xIEg}>L0 z&yl3^pttSgI^CKA{RfLlhkVHK2X*%w>tE| zC9jg0QJ6#6?o=UUUd$-fXu)j`5fNJxK)R#0l5D!vwwOJvrj~*xFO6sU-fV-!oYkRD zGQs#7pFgcyj6TYi@(k}SWdQCA=DbeT)T8m}>oX6A2det5T=2YiJD%=_kfsyl*r#Hn(#K*;6$x zOw6uE5~y(>ePx&_NpDTirOL1!KWxg7sn~{zj=h4`t(Bg1l=M&?aGVaaD=?7Ug4mzM zrZ%*WmP1n$PST}(Z~D|O;Gm_+o})wXB&=M%8xiG28P>B;cBd8|s}&ee&aU>@Klfmo zFmQR&jC=-6?_n!C{ts=KtnnWn@14F*H`LNw;c4VMAZHVB3gQ8lqX=`;&#>i+R@Vgl zF_7hZP*HC!*x5y0>XXpGa>#6ig?6iC#HIXlQ7sA60sJ4V2F}^tTbsuFY+xlgr`J{MKB_C?AC@1JSlW)6JN!sWHR2P7&wq=V+^V$upbh9i z<4*X0SN~7)pD}<3^L4k@7Lh$(CebK&jK;v_MBz@D_0g#T!kr ze!vxop;+kS`55v%pH(7d$tLU-UTP48>4@~ogx1lj0!JlFrYjfj(M|zzmvrKfe(;_> zU9M`vcIWNXLBsA%FPg=!?`rU^h%+q;3cjpsO{}MQqD2$@L*q7UhTq|{pA5VoHZ?&1 z2*TB*mDn5`#cS@_5(_+*;gdJ5JmApL5!}6yFXaPvr3omk1;z%boQ~`?5i)W1<;A(v z$aUN0g|R5dw*i*O4VLX?FZ>{x~qSe_9u}xN^G> z1vO90C;N8)O%AO!n_Es6jldOAxPd)v`wGJ>c4CIw&dQm@_loMhwB=4rfKYhh?BiW| z#~1rfYPBsG&O||i$=9iDQuR!vZo>*_bvR38IyJGVf%xHq=g z+iyMcebrpxk`7yHuuwr$%Y8rQ(~aKCiO`UM{_y$i^cSp%KJUQLRw&}eTa}ndD!e|K zvuRtbxzQl zTKq=p%Z>JP3Sp261zv8^wE6VCv%OLPh(*^V+O{_6t#Fnp4L`Fazo!~(ldMSr84^Pb z=eH^UBv8p(TAtAUo@8muYb@XH7^-uF?!ev(B3;}~!`vB^+uZTfhK*Fvc7RJm+rw~? z;p*On+6b_$-meXR)9~`VjTjTFTe#C9y`JW8F=CHdiO!RI;X$^TovKH>8sZ%u_~2_+ z!yX^Pkfo8P2o2-zkAi;U;OxIXbK2j-5n8z zf9F+**z`D2g%vc>`;=;Z9PHON#mhUhSu=oin))LZ4B{?hmk-<(vQx@zBMl=NlnpZb z5D}@{uTbXU>2tuVKY)<03LJtaro?R|4J~r6K?kdV4f~a`cL7Z=(4jTI#&_N&Ge7;? zE^Ool10pKV=s1Dgwkb`{3F0yH*2@^D`fP9p62$MH!4?p;#IR0?6PIBok za9c&rdYF46tgn;6lnkSsr%oXIiF1JIgH!|6JYN${Ie>#FY$xUcq2o!YxD7wgT^# zgOt!65z1;F_Z6f@z8;p`@~S^MH@Yomz)y+K`y$Nrp8MnI4OYu-Xl$EIv5A6nt4S*& z5=x`(8&{~y&Q)3l2N=f}qE1<4U`V;r~5cVbytwTdd`{ibNLyudho9`Q7c1Q=AAAN(2SWX zqi)oR-aNG^zP7~*avw?_X;^F86H5>0F`?GYR4Ma)@{Ai)u;sM^^S|d~Ycj1;Hsu@F z&-z7um1pPh^#6YkNI&7}H~c*xvip56Z@1Cg_N$`%SNq!F*k*VN{ME*$3Za1Upglg@hsOd#?#$(_j$*ZY*0U}1@WZ%Vha&T4j zdF4tpnPG9MQb%c=)r=Dng9LUX?CVFv!sd{ZXO7zxaTT5h<{wM1Jt_N623bFPr{f5e zLDL}5ZB%}JEN98#wR}QC#NNCC2PY6Z9dEJnOtAoJK$X804pT3iifCJ+i3Mm(uMER9 z{~_=;8AWVJVeIq{HxHutRSB0t!M^R@+%+|-6Pz{3XIC|uL&uAaT{oIKpG+5U=~s9L z^7++RE48$YG1^Y7E&@WkEU+-s2kPe!cv^<%mJ4VG-A0$ibx4)E#ht z)N0e^BqE?!MZS9upPHq5DyLNbe#?4!Zc54(3s5ggJ;QV$EovrNxPP9*3gQkn6>V1+ z;dPo#meA6OY*dPzZR%5ELkVp7WmBR|*JgC`9qTpM>|yl@40>5Bl*o?C_<#`Y37pZ= z?T+I4HNDS#(--A0loTCdZjHy)tq_Ln9@M_XcxP_Skpyd0^j{tHpl!xA zr&Uf|^nIOoHy&1lVUe=sc9nvSWvLBKwJr^Y;0c7FTwUfGX124(?JOy z%y8?0EB7GE@RFHm(9jj3fZCvJx|Qqc6*S#!XLJwhoq}e78>}L0Gs_EU@3|c0q%m=- zKN+vt628}B#yip1%Pr69vCy5$tuL?3?Sv@1gv7IU-rc7qO(q^~URn|u$O;mikuV3W zW`fgw;6Y~-%S`+62o~bwpip+g&DRms5mISHYdLTsIGFA#C5InUZ6Zk09h)BMK*dGQ z|62tXpJP8GB=W``?8Rp&Y#KW*vOPm_l?|UmXXwTVx6dY_a{nbj4z;wzu` zZB?P1cqcmr*l#8BFY4$IBunQLPgy%w^Cc=%OwH;Ad#~ycwt|@ys5;I>ly`8!)Q*Kg zi<0}Oz*)cF!o)%9F!(gvjAe;O~ZzEA?C5ac{1`Go2$ro#vPA6YPkwOIG4NVe-MRCh< zC{U@-iaxw^RwOs>VPQ6uVvNrW1kztqfJFr=FX#kJQU48f%n2UyAJykQF~&lY!@I*7 z3b4ew)7r&1PTIqAU)OySd0&xwmN9jp`=_)paNfN4AIGj)!!Ky=TKz|U`U%ykl?etB zxbW|bX!%k-x9TxA!)pIeic=PL+_0u>Ou3!8gQrTH{AznbZJq>tFe7{RpPqUs!rB~3 zn%D(u`K-IgKf#BD2v*0%8|`5Q6Wy7`o+bOV(TTA65L4D2t%tahpC~h;F!NI;jcD(O z2TY)YF^bP)L5dcS-T_I!J{h_&7N=fbjCalQpTQnHges5tT5qRPE4%Ca`L(m@k9g(p z%QQ$^4T$k-OBg!bB~qSVbO-?3={GGD2Lli77Ao_1Dn!@nt0~`Gup1mANcb!CK$@66 zbj}x}S?18$YvLQnOaf>jS<9^blgmvfMZ|wR+r(|q>!JaWnDRJZ~xbeM6%| zGUqN!GxuKV1lBLt%tyLzV!=KX550i5y$&u z{4l{fy;9~<7`h!$nD>~D%I+^^6=h(iH`F3o#P5f=c_pQy;+RN3&@z3eLPgNKbkpbZ z-($8in!Aq9BsSAfm-3$AGT-XhYkO<4B{iWSKsXZDVzr3EP$G|1_5zc>e0D`k#&P>0 z9Xyw1FohvHc?s1$y)FgA{u8LZ^oErkw#&n{Gj`e3b_;P8ls46FyY#bNW~2Q##-+U$ZGlJ5ca$7~!7o?jvtRMm8Qu>K7K?NJP6hjM?FjD8$85D>Y{jpM0PFo2v<+F-56M#cfpVYanw<7(=eU;`S&SDl4 zPkcC@(km=otm!3r2+$34Ijm_x5NmT;ZvKj#?WMmAL@rUxCTi0(k*M?%`&X(-ygIO- z3b-%l8FWK@ghJCUQ^2vpYF1H%$fCcSRBT6*yLuPS^3!ZRvI@;Ev~GJsv8CskN|?i< zwTG!_;G-Q#M}hxQU5{2X>AGCq=V;8_6iJxktLzV>~_lw#! z&qQH08BdkXnEShQ|k8HO7jRfCuMWD zdBupuCOhtqN7~+Q>FwI1X2}!aQQeu49A+bi@CpNiWnmt?YZr;%)O^~j1-U!rL=J6@ zXnwrHQO<9Rq#;rINT?s1hkQM!kBn>%lNA_x`LOU}hyel}DI?NxvM5^-7=C%8w^e(cl z*oIb=j$2?P1Q=W@z|&M=Iog5j7`?F%DppJ1$NzifoFSJ*+MJO1axSAi^%Er`>ia?S z2POQDNwI6d22>fWE)Ox~na~LlhQCth5}5{ZhqNpEs=so!lr-Yw1~6WU9W>jb^(UU% zIm4*KCLf_|1jAjxR9;98l>|ffCs9 zl$PIiKq{zS92X5j9cTo;G)QT%wa4N}{@bXonI*ZWKX)PGHz6+w?4fc*P=y*|SPZS0 znYn5(b!v&-pGDz#LCZKHJxDbH+9!x%|bt*?!=5=`E? zqM6)*v|@k$P~AegZ=gP!q6d}Uy)MJK#T*V5o66gca9Lqc$ssLa@FkT6bhazwgf zn4l^oRiW=vR0Bp3_DXDrd~hzcL(PLB)hq*PvUJf`A}*Jt$___X33X6QbyowE;ebQ_ z{M9kX6Ec-8PP$XLu_a-;iV(*zym2VzXiYMHg`JOiy}!p1CuL|(@*bVcfU|+HNxXHEG_-eewYG6ta2+X!Ot_l-^a zYtrZI!rY&$aEW`teay8Mo131dLD~i`_F~dXT~!euDJ75}$YGy3mUDG|spZey;rPZ8 z${EQmchvY70xW-pD5oNJh?8Og)$WhSp*&XQ@=6XCqL41ZH*lgsA}V779L71gXUYPm z#-I*!*pXt&FDAfJz$Dw+;0$T!(9$z##RUL?TmuMIR@Zdn_xo9-v=yKxvW1gLvRt~4 zYYg`7;QAPe39Mftr1`?*cNH-hY|pVU82?9!DVV*RMu%iGwgyhxKq#9aS2nS`bEx;y z@HpLyTu%w3H#&V@y;rqA%6lqTO`A9|}? zh!ZSPmsn%}WvCSDUF{9^_eOZ6NSg+3*y@8z@lQT=^#4S5S}khbzTx&UJZ*WCQn?EA znCUe|`#ioi8U4V3l9!(hD9S{=A;#|RJ|LVjC;4ez5VL17Pj z6b=i@<+-_l1iRb=_$>D|Li4*4m_C4vt3X;9lb4qBZ^#pNuw-2-Av!!b)+ph(!Al4S zx%yRtmAx5!Nt7t>&?%)~7&#MEgK<&v!e*V+;Z}YnnM4_-GQ6`{SV9sZP%ck&t4U7; zjwu|U)NQqt1O=4%Bxsqs%1Bz6Z+HYcZ(B%$*p)UbrWZEfi+CZ_mpq^7PwfVgsbRsS zAXD?rXFv+G6r`ev>R+>JRyz?D5{sU0J#ZU%lUd%qOq0TXex)499_@AIa|UyX2jsbwVh)r+m0`bN|=+uNDk`D$q_EgMp^zAAq9F#_FnGu%JO zM7lT6AY6dX9;VYPB|n18HoPbm*sViSXu9=i8XQ?&*ir)HaUII<2kM5uSIf~-g7`FU zDQ>~}MfHQrjRJi~jW>tuuIx)XS*-Ht3(|k}PHVX>O0Bg8U`Q%9^o)XTy(tN4tHQ%V zwQp!nbq}!+)eQXK!IT;3F8bBrbRmsdOMeMb)*N!{MMhiKqcczuuFcFp7x3?EY|S62 z?}<`Sg?F$Ac)7t??`39ASp4B*yzB%xkBrQUkD;w6xW@fIC@B7-(oos7HutLii(Sq< zFTt)cmOa=^To`knkjdp%l{Cv_gweF6noFd|z{ICBc@CJsEL{jviDknPge_YSWnJ(D z6xdGsV;=_v8Ad!7KZ}N5@D|7`d&Kl4(fsZ%Lz51VF8fCKpI8pGeV z9Hx%r&le~}^SH71YIycI8*bT}a1uhEhi;8_+Q~;+Cc1MC2epg4rqQQ`1+*^~la^QG zO!@peVF|lu3WVpSjTsCF9*A?lc_mViXX<1Y*_wB>t#V|ozmSgVn~*$#lOtQysl}g4(HRy$bX$a{9MifSY}YGb`8RI}2>9QosNW`J9)>P9Z^(^^6> z0S;lxfG$2i!Cc4dOj?FJ>>F}~i741m4bohrhyeUffWqsvgVN^YzEWppgF)=F1wE1G zkVU-KJM7c6>!uPzbe)ngHpevneqgvfr^Dk;T0#GFnq?P&e?rjPC77jr5Ao)YMqQ&@ z4HGDADN8*&U^Wlmupzqpmg*}OF5L&s3#&3OPfv~2=b)kv*H-<~9@-JbO1k{@@k?+D zvmE3Uqpvj_aHug=bo|XTmYt7^C~Shy z;G{-d`M|n}ET?V-3W6Y&@*;{Oe(b$G{|~ddA+yHipKjE(LXX*8iQ_3WbTs0Y2nd`} z>H^X_mF|9Y$K|#zo&}|%c(~V-283FI^}_CB8A(y)6T_y&4o2Ie&@7ys zBcmVQ%-flrEz#n|y4TcOker>Hip`v!ua!YN3A;506^lzAc3)_uW{6>yQ}LEPf_P^N zLL|R~pnmeT@))A!CR>so;$e!zdn>`)NDu~fyqotWc72%?2`6k32+-f$0Ss@Go**@` zTIV|#+y7ivoaTZqkAG7sb}9{%$d-y*H%UdGusa14r!M=LWcsczS)8W5h1#gIOYU>d z7NG5;1_ChP_mn)=B*Q*EkP_d3FT4Qmk9y2whFa>czk~{^JTF5URhb0>*{cVrD3eA= zIve~$x~t*+ivHOK9My{uXV?5nO7v}?Lsj62qjF-rRf*GkMv$>Cnnw_I_glJg3-}>BQuH(9o zPIxee639l3?>vf$8p-Dqn#WhSCg;3Tp2m{DOl4DfTaYanG}9_3PE-AzUeznQcgQ}Y z%w@5<%LxmFXFtDp^jo1ugs<0O>lvTulOh)o6(myyUe|6`S-%CS{ThWGLV>OX z#kF>G2L#{d#uSmD5sc8kv=k|Y6CIpj#&{AsiO|pD~i|LktRXVaODt1e&$ss-96iARM8(qS1-z68Y)3T}a)QWB#!D*F8;SrPsdAllFq>ha@5hmXY2B#Z!P%Lszq1cbU_ zQ^9&te})@SOTm0?=u#=&%?-LNH@Cjzfq-Or|2J<{n1X)oja412V|0b|$z9Qh6)jIQXE-bjjL0o!|bcW*x%6gfTd@i^dNyi&(2nGEFzX&-1 zoSe<>NLo&d`_)}dV^oiTnILB`GevvVW+R}0-tU2!dVA^M_?QxiaOON@E}XaulR7A_ zNvdTLT#DMHHmoNh(3nMz#=3v?1{2zUxAF;ryM=B$EDZ0P(`#I!!#ODG5s@=*X+viq z!cB^>sKUa1rU%Vw+H_IL#t&}V`ZIWJzmzDsR+?;t$o=NZxA;LHw+Nso~}UGGR~?uiZP5LQ6QEBSibRKRhUE0I5n`j|y%W zmy+x0Y&wo8g82;r@1q&{eW$#Q5FjU?*9jHfY+ zagu9GnLj%-f4@FkCnpra4%rVl&2*sM=<|E{4)$NIJ_T!Fs704rU=9Mk{~d7D!H!3y zfuG+wiW-X+_5>Si|4uBZg(7L12)HP*$d$wzW|Ega zh~l|cIkXCwVIEZcCt3eJ z3eAs1eXIE^p6%JO)tjWn%waU|*S_oP?^(Xxz%06+*$h`wp{cb;LjJrlWt?WV?oYK$1~xToI30l>{_v_ z2LB|rtoW$43l4&&z`C|c_7@(tFALN!>p`wc9qN-n>+%>>l_f~{c56okX+#qC)1)6O zKjgXhfqBeK2|Ot{39pSlqSU$3;kr@i(Z9PN1#mrR)>V3qTVjfD4{WHDcAXUT_e8k7 zikUp!FQ1iOfZavMHB@lslRM9y{#hCO6a&?H3NI5&<$qjT2G^IJTwC)Egddq<^DzaqMSB=7|E%x_2*wX2V|d?J^xp<9r(DEXMxuXqgjCnYq3$| zy_1zs&q4o(#^U}Zm83!=aU@CFuGQ+yaqs1p-}e6Eluwnzg_iupLji6osTekUJV2EE z5SXM!0wl#tUAhIOlz;@t@=*9!IctyqE3>dt*vw3PSQQ$WRP^>$ZFXr&GP!H)ucQb| zZsF{mILf}XvlD*nXD}Ilcx1ExWc!)flZ7WOmniMP35cs2Dg!5(b=uQDe-RRCTM)ji zAi!04^?I!-e7eZPIBENjH@8i(ztjRvHBdz}@;NW4kt+SZ%i-}WR4;6N!Ye%Y7ZgFE zB1yi4gC&{@^ObeiF)ga-!EP9!wEgI=YcCjCZ?GO z-00IIr%Wa4}I90000000Ea-RUD^4rSvGDu$ypxl6@8FWD#vd0o1x% zz3_r0^nfAp!Z46adne(r000002h(r?cM;`=t~%H6YV-U}_6;6-XaQKJRk#YzP(NzT z3{}vqI<|B>m51jfnwel1Y{Fkch&h?8!nCBtEn&$~Ulbj_QFM=TWc;-sIzOOV1apjo zpZZZe=6samZ-Z(h*-0e9Zs(y)5)Q#>NI}j}LJ`SqlNTjzHpOuU87MJFk>R*-Y}D(2 zLxQTZKIexxPu3L2KsAs2GKQy5hYqX@SMiBaDdm{nJzJeh1w^Oi5 zrU@$Kj1c&bY>)*fxCUGrv&e^1O&Bj|*7ctcUf}V_#$r{J(4F+d9qe9a+Z+tI9}aMY zDbl7*%YK_?H(gJhmNMD>QCkxn`~lrXaV|@K3{i8x@*#`OIc63tYy!w@y>*)FssZ>M zsyH=YKF8ZM=5~I{l991|!xu$jXnxT`Y6DSI;G&bfQNrWh!}C=Q#qJ;&yaOp0GjBO@&)2Z^NV@;!^Eo8*X8 z7rdcz4wX`%EI%9+7{`6#W##CHxI_1z2n^skTft~4DIXV8#oK~>cZZO|M5)qtV@oCT zr!EQD{SA7VDhY9pE4|-E=~oTx`0-Fof5uRjY3>XnN{Xd1>1=`zWL2HANzbFOkHC-5FxqmhciJ!QOt^-C{ujdo5(s+>? zq`KN@S@xqAJuH5i!eR*dO8}DgdIhB~Z zZ&uW`(iTLfCD^VwslS8s=RWN==1Rtl26u;We^LFbTX~jc@S?UQ* z?}lz@nJ<7_YafU=x#}v#gInYmb(A?mqoY#wuQ_J4_aBDPQJJ~W0 zV~W47D!jWP`RIVE5*;kiG2F#nGpK-wEz4;ym214OA;VP$u?7GJCVN_ykzat5H&X*> z5m1In1s1)i2j}mwv z2yUs5X~2EGe6_SM7Sv;|4HBa3p&ZiGuG~Pic{2w3^+m;Z7N>F!}lY zc4nJ)5`wI1;*m*HsVDChC^@=XRj3$l;{G)>qHYogjJh~;c-kQ}_G=Ln3&B@!4=lF3^}Oi_&+6b zHmY;^xaFR@l*u*!OvgAJ3WG#iL}I=|+J3xzuCf+?z>#>~lZ@syH938}B_-pD1&_c| z{4(4K88suP*?CQb4AnH%(q)t)o$nvYJ~J^F=g?TP6D(gZiVwKJ*9$K>R&c0Ya2$F| zZlkMo8^rNfbCzzixy!TWD0rGN3GBZIP$Z73162-8GKwt>MFpX=$T}Sa?ILW78^R#6 zCo2dIVEFlso?KBn-1VGK6NrhZBCo0dq%s3X&9yT&v+Z-1B0M^4psuqkv(L7q%~_?i zT^siRlPf;VL?|Y$J$I?`i{>O8T`t#JEsILOH@j&d$Y$L{=a1Seki**-F`0g&Au`{r7=ch}AC9Gs=B0^}An@z$5nxclfK~pdS z+1Kc*DY8teRm{!>`;|PU7+LzgQXxEDC#}m%uHMqZPV>0Uy?AT^J~fH=Iw#f}d;4Az^`Umf(<$59D7wG;p}=Ac_I(d+da8zv+GBJ+?L?&x7) zl+DjOpUxB6>a%~p=N{Vc=+ZRv<_IR_JlGph24Xy3ls3GDb^Tvg%yb;_oL9OvR^3rE z1E_ z%1g?sj!qF@FV4<7{{V@|^K$#={#6diJQg&<5^Xdv1Mhrp< z;=%(-h_v{1-SL81wPPyQETF9L*v=LfGchRG;)gEi`^`tl{;#nm#}d(h|73BTI9dh4 zhq8|20}@{#nT8zQ-B9|d>kWJZmM)NkI9#oN^a@2j3ssgDFs#jNeP_c)yc%q1iZrJT(E>t;Y<*ySB0N{(qncsbNJ0})hwT0h!Y34gv zbHFVx0Wm2YBLvjr@6zmt$`P+&%eERe*Aa-MxY&@Q7h(JD8u5byF=I&ZPf&3vl7kdq zE_O#(3vRAWVHVAW65wy<#iIsfZv4Q9dlqt}3s3mU_-@riN~pRM%l_^;kggY-Z34CN4er?T-Oaw3nj=)M> zINl_D!IJjxH@OC-f9QGya?->d`dE9po8nlni@yMSxQS7YvHGW9Yv#_C?_QQJNBJbB zL6^&dgr5W3e{67#{BvW2(QEHRue2v=FnTBkmu7e^6;G)N513fmHR_~dVWd|D zckM=y^vMfvcpzO4@u20(nqNcQIa7Ts_+V_J42p5e4{Qiesz3s#f8s92BX)HFxJY)C z8l?kZa3W{J<=8q^?$L1EPdC(UN572$!skF0?e!x6d;~b`Mf^MX& zUdYjvQj{=|sD5w3uLM&6CS2V}bE+*0IwFO7K&H@N<@hujRgVDV4;!1io*qvb%0+}g zweayT%ASO_+Y%e!0E_1zV+3EWkAF!;z;Wg_>_rEw?{5_ieTpeW^#TA6+OH!74^1E!EdA)940wEfOfEU=cBimsW$_Mb5U za8I6ctiYh9)Jq}g^`L?sMa|gs@Yq5K^XR{m9kOH8e_|c!JD7r4b9IVr>CgP?JYJ_} zRpGKPicsoZA7Gb<01*wQ=}^ZEB9rMC5?4NU;|4-zGht!Nj==Ac&TMs3aAt%Wy=Dnt z;5zmdc~Cg(g*5)B#G(R$F9l>k9&jNH-jZM1c z-n^cNBvZ~~TC7lz=6-t;PAskKn}lGqR-PBeTYD`3JZ(!80y+t6S!o6>7N)TW?={lI zA}D=M8=r+X(Au8qSsJr{!@yXO)O8Z}=aP!^iaOOh{{&lQt6o9KxB$bjzT-4S%?qTNzaHD?rzzN(>+3eW6KuS%e5Noo{%3!KX+a%{@~l zF&=Hl{RR48S-EKUSa#A0s*&`E zVnb*VWV#9IG(NR=mRJeWp^2@)&|#=a1B}x}MPWgQn}!*gvZJj1OIkOM%JG0Zf0!my zx*)?x@?b;Rn6XAuHU_%iz&FGZRUFUbbFAhC(Bgmv`L&YN4$3?MSoU)a+G!T&9Ys%0vfg*08YbP#~?I znrc_~bGl)8mIz0j6h+mNU>w&@?6Zy_^O^ErJ~2exP~HkXJ>xNYwX8DnvZiJ$>F?Yy zmAu~{Vy+mlKgV$!qi}WGiGCY25pXk0F>^2A@L?M3Fda2RZ#Tin0ItWGfn1Km34KB{qUO*34u*NFJ@^n8O`Q46FbvB_rK~m=sZ=~Su~oAMx)GUR`S--IX`ivC&p>;Vn0)hw zB3o2z_Xb<`OZ9@8Mi5TO41^)-8*k<}^k<&RyXuRBOf4#a+)E;~)9;oz$@hFu*aNrK zvta!2q`Y&Nk6&T;7IOhP+ME+CNI8e|HCB=!JZ4Q5?eAg(tU(P<77!6W-F3LcQJf&l zB_!Iv*j0x1-`HfAGQ}`I!qyECFli?G^MhyFTLD;We+$y>{f=jj462OY!YPa7wm|RO zEAhfBg?npA;j3Of@o9hbPibBIbc|kyxb#wS!z8V0Rz!c55XLhz96)xE5&W#;MT0BXUvwtj~sTAJ}b?PQtu)BZ>8C$v^O;lntYf>l$UAU|kVU1zmCVTOfiHXHM1?1mt(_s{lGJyAqqzy@@a>K>!CPKnbKHW$#ysi#`Bso47Tiev(+1N ziq!S$r6MqmxJ3@0hut)(_>L>r;NalCH{&oBvrm_jb!DP#D6;`q#kj5^SSu@)HVkj5 zY(@G8XDrVVqxX*W3vsFgl~n26Ern3DmR0{0d_;CGr>gp3M_EqSy*h*5(MjK}=VlTy z-WfMo^SM4QT+kjx1{fr`BhxcZq&M6M;RERGs%UtlwCu%B#3iRYr9CpOwMYa3tbVx{(?Ul0Wi)DB8lr9 zKnG9vBHaKUa$S)X^m#8t$FE|E;T!q>GXzRk^$<%x9WIx&m(6ig5m+?pM0Oi7ZOipC z(o{3&>OQ}+99XYAp`HN2aCPtoOF`>C=y5kB0y`-&A@|l+@U;=~sK;R-Sdd{!* zlKP_{9xJa1qMRXuT~Yvrti^(rD^4d)>%AI*i^O%8Fh6Y;%w<%xsDg0S&kxJpKRd7o z5w(n=hmOKU{uvP3wzt^U1<<>wGQ}H_q~WMOxp3?UANB;V19yjIKS1$jB(s0}K5nbs z;h-8n1%jnQLO0?zo<)FS4X9zZd;9dMS@@ur9r87uc*WO`1@u5Fx=|DCy_lC*hmO<6 ze08wN=4Gx$YKr;po4RBy>|;gzxZJtCE^##Y6x((gipjJpI#M0wJNT|+FU zXRV3w{s`8A)+}M3^c4wS)~ucx2O@$91O2^R=Hc@owJWzLL-a9Jh~snt?9i4c^`z-j zTc0mzhZR^03&^P_bi4-!BW=`z0%M!e?A1OsC|`B zm(AHnNdH_eI-)*b*3tqhXA7O?+JetkD0|wbHV8PgQ>S)V;{ADEL2_nY{jxv2s?q?p zmo03#9q0dEZ4@;))Z}D+_(7ZE?J5MQU{}_j`Zj^#-d7wtV!{1TjV56ApuY1mJbkt z6ZX||jXADElB=5S)orpf=fhJmhtLMG514C}*h>6B-gy)U{F53yJ&w>>(ok#L&SHKJ zo0+gb(d!vKGn9wr#C&mj*Og{_w1#y627o?l!-=QGO907>A5!E`92er^YHd2#hCqK= zDw?e@GX3f-gdsZa)5%s}P{3bBOK)jnc>fF8hMouy6N5W1+qFkE(g>I-Myep}{6gXt zQ_?K!yeo9`Q|V#S)d71iZCsfYge@I8K_&eL(2X7ae9Mz>MEWruZCNud`yW0nE`>@C zD2Ejd<2ZcZ&RGC2?us7v_+O zT-Rt!UaUGfQRU*^L0U>A zHUlECRc2cJYx`nYK)CWlFA?67$rIyvmI7lr9owvaQ_zrXDRBoYBMS;$U8StcWumj1w zl4DL$9vxXMTx2qyku=>}Lcax>GhUZqzM|qdMcqgbj#@av_f|qJjdPX3_!tIarPxiq zazhZ>RGKFs4SyyP9YuIeZupUy5s}Uuf8B1d;o8lAaj?H_p~iLsA$k?H}UZ! zoCg9n7c-y){BnKksyjrS!=rh6ITUup`TNB>KxpLDFRpvfFk;mpJs7n(b%&u91|VDB z!zb0G3@Cb@h<nvA!)}7 zlINFdnmF1Wkr`F&*%h@SD%ce4d*p<&H4`nu-xkB_NQY|bQQE958QWK^2)(9gNggk0 zg*Zf=JO4d3*dJcqB=X|~^tg+c1IBq!^(&^}Uu$hQ_BnPJezV%Chx2tc6+pVl$xvf@ z0vf2G)yk5Go;9(?ZZjy_?=CU5hSkCEg7QiA;?|X@^PWiuxm8lVUM7>i<1$+wV~0EX z*z5V*hdsK+vJ*HifO{4P}Fq zM_D6~67Bo^=OP>nA1kl&%e?dT@(79-e_^(KY9Eg~RX62!2lx$3fu>@L?RY)Sgv$O3 z{bp1R`gqXHXCEw)DmtfUfqMeLY?8Sh#=AaC@%-zWU4?fAjS6PujS^nBz>Gy)Y|k!_ z3V@tZ+-zdm=AXl*u?*QPV7AKewb(yn(ZDp?H?7TOg2OPMXlfzZ!l|2OU5YRK7MaD) zt3fikGG#-_SoSGmj&O_y)J6?A5=|2Azu?YDB9f0csdRghVWb)4eu^Q3jT0W5NYrb4 z=tyassJbb8)-_=KQDPO|ajW6yD{NPwz8v;({p%Vc4EO5UQmGqo4T;*4v7&O-3YYT! z7XlVhMOR2;8V*J*+&ex5j|R>X2R3Y@(_2~Gi~;RuYSB{J&nmcJb1tILgK=1%0Fvxb z`NP5ZlNCXDFe(@nLbefeeeTBVjAv^I7$k2_+_83V>Uc0!bpdoOfkR0LIXB)x zNY7GEStRE#<*!OeqS2XH?-G<5O>~7hmwmBM46@P*OiG?E6yRkY^ElinyCKV-NDcB> zp^t{)yEH++eRs+S_M=($n-?;4;XzPWh(0$y6JeVan;$nyfGi0y;qj)ku4jym0$M-R z@DTIJvIPl<^cNtIs-VyTFJkvL+Os2IVoWJb1il_&q=}R6COWDcu7j`pAC)<64e-7O z6aLr^>Z=ejx!B6e*%-N~3OG#nH*V=~MKZMSWLXF;zz?(ny2)nCKj-kO|3az$6#sZs z8T={_;ZFYrQ+>5&KZD=!pnrp>@O05zfyqLQ@b8Bce5dcCwd8uE;Bc1G2aB6wB)YnX7- zS5=#Ad6~nmW~n&;IDjl*G_3j$hHtbx0G09lPycmlV;J3M565K|PeeTGfmLYuC@LI! zpJeJ0fCx!dSnfJ1-Ib-_mtKAR32C-#E?^t6b;87fvhn;*^L-_1Mb!ibBob;eU(fJ6 zK{B$x28#y^{X~QMmZKvWj*JazJGqDX!Bg0%@OUb;vf6#=C~q6zZI+5GOUS}XO%YVe z48s&8rUYSt@t>%kx$>yE-=Wl<$)l<+$O@eP>oX$AS$Vpz5oWPxd?hX3B zCo|$JTUKPjM%>!78kX(C7)D96Er{f{s#mK#s=ubU1k72ggq_Q14FOmx6YiXrh9OUz z(xmDO8Z7avE?YO;xaETvG@n+V_~0E@E#7n5{gJqU#y)SLq09W&MYNSAJq<6;nPY(I zd!J~};hIn>XAw@M!?qVrL+qljF-yl>LoFhc?@?pEKIRD%BfAAQs0Tml@NcpC_QLHm z)5E0Db#xf3mJ}=(ld|^&Cyz&^^?RJu)%YbcQ(dCUSB{LNlwXnpT z|7xBQO~J?di$*4|kmmr#g5>&67Hk!M*h{jjc_utA3cp!X>1pie`;V>=l2brhxba|5 zyd~DAN2eINJu(0oNCP=ckdEm9$q;jHw(sul6~*>VjFp=Vd}(3VX5f+zTJPd#`*ISI zfKk$&MS+25pdH5`vjl;(Q2L6{X~EM~ty-?FLezty*XVPjegVP9hKfdyeylmOzkCcH z5c8>pf>QRd53ZBx^M!f_MzQDQdLWGOCMj~+x*8_=Bav630B$bLr^hVNs>tvRuBs@` zoEj}LGfK75&XFSt1EkIp3Y&yv@sJ#a+F!GaqhZ_fkCkp*EWFAj1c-$(iKs`!MiK^G zk4OOg>T%r7=U+}r5>yY9+Ir?Zi+w){YX)$ksTa6+tA^!vHo=qUqg%@ocz*bStPGGA zTRcaY1%ltVW*7G=d1rAKtY!ay@F5AZk};BEGpdLrLvfppWCouMLkQhEq4u6T$%+zpe&)^r!!D zv34PpkOv6{`;)-ox!z5%2`3wU@aU|SIGaQh_Qu`Y{eE@L3!3~Qg$or1W9AMbPU@t& zWCG)fql*kyTdNuWZQuVixCWc2Po?py00000000001{q;-8Dc1b;Wqk!0Cx6Q$kHvb ziSJgAKuLe(Q7bB&L4BZZll1N!DP_N=EKR^ciaavn{~6(+Ma&Gq$FPf>3I<*n*Xn+C z*!n5yO1QW@4%t?95&pl=x`%Ki71F<1%JqF#^3TW|d}>&Mk~V+5a_Rog;P@*Kz}&_M0^|L#IDJvWcM#V z&jIKc5CeCkp{;=fli$MGN)K%kp`W}CEMQIyR+zn3mO{R%6OADLZ;NWJcZBs>e{9G#WT*_znBHS7q8W{#q=LUOWbd9Nv{F6^z z>SdzH)z_Qd0a*~wcYd!b_j}xZ7CNdVTmEy5nbe3;9g6*F^11VivUB8oXZYI~lld}e zT$9xt$2V!l-RZ~enO~d!WGh|35Z&WV+uz}t*!6VG@iK^jLOyznpo<0etYF%}eqlL( zB&JqY_9qYl#y&^CXmVsuCV3?M$dFnmyc>o|yJk6TA;d_FpDfvWx&T~2qrXX?sKvRX zJsLI#LB;pNRbp}!Z*^-wf)S2kq?Re%|#zZ&9DO zyD!`6vHN{6e{XlZe}`ee!_bSLS9f2-w0rID*Z6uOPphZtNSRyfHXA-;xd8%Y+-RN~nWvaX=&;lyA><4KPCh!RKy-6tQJ_MB&&+Vl zJGvr<5{KD8tvLc~xDGs>F(=E@KVOTyJ9fS5kbUW&^b*Y`B5T!8%UOB*qV3T z&@H47&L(vZGP(D3+1YsS2&h7h!eVQtf91%hN}`oMdT z8!#|m>5@9eRQCL3(mragxRDe>ZoA^=;lEoxv}$12J6UJQp>3t&r0ae)YL(8c4d>q_ z(FH|Y8}N7FTn`W6%T)INVHwp`Zy5ffb%$fhH+SS=l-prmhn;tm2vzc)Ga>2N851(^ z1n4UydTNKidiL3nCJO_xL8%GaD7(6OW=M^|!OWct7Jg5yj1G4csf{Cv&KD5OD|An) zXOgyOOWoX`c`Q})4Kq=wzb)b<=p`amWD&7*)h8`%kh6|`#kJQ8McAFwnGfyK-Cq>w zvr=PWKJ+%Y$w#+|D*%>6rsueS4O5c>Z;o$Ygzmes#)pkYuih0JE7P zN=_k@4GB*8zR%AR1md92u5VEz_=ME(I;#HDBt;UcrV^^Gw-Lsg_$6jQg2_u+$Yt>W zZ-a5W{?DeEh*<1VK13r6EqMo^Dl}fYp5w9twi?38I#lQZsEr5F0dBYvHn=c zSx%?N43rU)p)-2MS#0!_<34R2FZ-UAP6n?!Tav#xGSabbq^xTmaJ)|LHl@+(bdF=t zh0^zTsvaCTO=9#Ix<#Bmu^X;{I}jgfdn{M9q?kBH3o1f^!dYWmGmh*uD`J7t ze=8mG!v`7+dgf0HtsZL?JYEcvk$uTm->CcNpn~Mp0=1epv)#+!jAVAYGe3m3ju7|p zx^nc~<#hYg3;8Ze`o(ctt=nn-{NhZ?S*0ke%E`jd*Bk;c^INLLX-iqC30IBp^MEVa z%I!GE&WAUJyp(MaUt*p;KdO2tGYwOQ9u$7Gc@U3TCh&S56QDywiH*<(mS>=j@#LF& z3A-IFd6Tguy08ghX?6E^ED8*X3$~?MlMPSl8DXbd#gvu5JnhRjmRi-eH_2u-XUC;% zoPK6>#S6h}2=A@82+cbXhM}UUKQmFCPuzIPlL~PNT}qNheH5yTykh3Hzc7G0T0L7K z^lSjW%x;QH&3;!}E}euJP&|V+rph*w<1xkeU;cdR;jWL{Ea9u5nMat)^TcEzrH0*> zI4oKu0$*{Cak}AtC{G4JQ!C)W)xB5YTkOh5x>3VMV|i1rYId5WExfC1#X%dy>M#c+)Jv)?j3L}P>UAAF@|Znr^^0Dszt9>pQb;yK#uE=W2qDt}H0l&0YJ z`O_xKXaILD2knqzRnl6dBnHWqvqX@QpQAZW6X^glmk!z$feGP)m7MT7(oJVn`_mai z@|OU1i$1BR+fq#0iDs4!@6h7K$?iy74L*w7x=3i-UbE*4R1?Kb#k$MV=)jkF=ENb* z>Qal-;Cwnb0A>mU2m!CNF(P7&G2;zTDx7}G41RHBzWfmEzc(_q{nQ+|H1k0eV+v(c zFhLCq-O}#5Ct!gUsKOMTYSAWhO)rn>quBvV`TbR+7xOTN#&&{-= zJkvucGV?gLu)6IpmLYI+Z6vurKLR&X#naGlVNDjqh5=8@kT^bgI6U*Wra9CmSg&{v zc|Bv%4fK#-7#Dm=RRL^qfIny9NkqoI)*mq2^b^J-bct7wqOqSPtXcz%H8edd@26Ex zsqZsf$GaiD#j3%{(*Q8+F5ROv|Tp@cqolxI3~n@T{5FpZ&g*;gCKKojz7 zKaG3j+(>UY+?0xZUJ5(P1V(=FL0OuU3RA5pB(-LK4pYCITH;+s!ePFsy@MgOIi`@R zNP#1DkE1^Msen*DsS!oP8SB$>Hnk-dl-!iHd!z4>P=2UJZV^N^_Kd2}7o3%2OHvb< zW#Gh&MViixUtO6sT+hKm+R=(nd3<_Zzj zrtc6Q1qqlN)4(y_S{&wYIr{a%l~_aM)D)l(zAADOY7)E7u*?_)mQA07zOryFhjA_A z^HL1d5L}@{*Di5j>=bpb?-yjZS6fFdJ4amYW^BP#7iUsbfui0Zw$Zh%8&zJJWHHs} zCSXjB^pR*5DP@0m$5y&s;|G;BOD9aio#Hzu4-npW1LvZ=blait+Tm9o{hIfXL8*S?#3s$iy`%gXZdhur-1>7+C6|p0~;z>ry+do`~xE_+}KQzkI zMN|VY&(kYK3YG5G$SV=hpSeyBsotlpN7k=(6B0U772~wF2Cg8@1=hWeso+x%Oz%()sIHqscH=D7 z_+LOqJX0uMINm%f(F^PJ_+im~K=m+WM+q@95ZrwCj06MovWei+k)N=frO-T6!g(;9 z3LURiK&LSh30Di|)L)%S#gmj9LkcZ^AJcKG^u4f?-T4>}m)5ES3=9)zNNH0V#cr)g zY%gNN#hibrPewuUrh(77sF{n&LNVSy7lq>MA9CWZa>ydvu6{;)n)VfH(YL1= zQ1F!Z*GujWf%2U&v|yyBoQuyfCO?N-vz^MRi$ot|k}^*$(sLsN z3o9^-P(Qtr*swq62ELc99f}zb#L{@4XEsgYmLs>A!&V=&r8kx|OP*kSkpw|xQBw30 zVB8{Pg!+ZP^3+fWgt1a`YV2pF89Ya!pC-A%Wd=15hM|*|kY+`8psL>kOyc>75{-$Z z_VE59b>wlyD|b-V7~xfd9pA6+S+D|3Rl*+M=@Z}ctx>DQYWR@MoZb}Vdt&AB$KkDTuo4D`j0m)DY24zx+DNKV^hX&3 zD%FcR?k;jCQ4>7n>O6d;Cg{5l+DCGZrK?5vd&0!CPBa2bW^SgET^6NxeoSM}J}HF@8Eh`A#5}GB*pTAc5VYC?(`q;aJO6*Ckp{6O zS1UJ0(q@WKH>N$|2a^n)_&==dshxzej%kq0$nMB!Vz9kzRN!u=s)c{>t#@n}# zevQ@G*|zIoff$OGc}Ll>VA=?V-vxxNrJE>B!IR)z%*m}6CuUNBB$6={SL~$YTY!Z~ z`I2?gdsT|{{f|DNt}?>4x&|&o^uhfJnfXVW%&Bmp*xyh#&8cC=GfAA3*wXw$u>ssr z4+a@fV+v$=0a}^u9Y_PVTOeX~w@CEM7?{LmR?Vf=QHv_uGI%rP&8HA!?j|%@PfHS6 z@rct117kUbOK4Wv*RnB(97th#`w(PLyq;qKsSLE%YPI)1k9ZV``mjjpUR#k!lL8th zqGzOqSg=gTF}T^=g5?Rt$eaFURNB00Kb{kBpp;`*J(`? zCy%ea$T9>>+iLmq2cBeyG6Lhmns$7iwx!h;+ZFX=zY^fSJfq<)S(2K;9V#WFBg*@U zy;7|kN-qW^MSSBrc{0f4?Hzi%v7OS;?dud-mP_ElP1z_@`4X{r2PeZY#Sk}@bhLpu zzSLPy!5jq~y0wM?fDx#Eq5JI!ihzP#ny%K$*TA#T|79e^^*{JXvk0V>cn*F?2mdwM zl9?WAE{86XoUq}(u^!X;;Uwup2i46J;N_t4xQ`$z_#X8&Zo##9d;XP**cpBlB-da* z8#Ho|evluRWnm3MR|_AR6Q@iBZ44a~sUK^c|9|oQ(`Aq%6P#JC0Gte6i7~oAx@|54 z_kwriA4iD8!hUb4&21VRP*0>*MaQK{KFBgU`>E92Hn%~;Y+O9CzlpB$*nMy8q%C?* zu+{OR){YRerXt_4Nz8pip0`D(1Kft;gJW9TqL}2AQ>wh#5|#!&>9JKFEY0!}cy4MU z|73Eq>|z1sM-tXolh-qNX(gI(on!bH6q_G8%pnhTjUnSoGX=-=-FQC2ep+Lj4<~cI zAGgT@TPc4m2P%e@zV%`U^#17RzWGr6)`xA&gHBsZlOdO$6E#c;ldA=}v4h_=)??i> za+%(q*X9a@wdZ!QS0_(gOqG=gve_Yj=LiOhgvxW&7>=$adlp=`BEvh`Fs~~Gq^w&z zqL(nPY5v&xoydZ{g3?rw|ce5H~*K~HI={aH7;3LWV>n#`=D%aO6eUaEv4zH~Fj zfpO2TP5XGr1gLtz`EAr5=vh&He(wR#4$6^Uv(rZr+xRt69VPrOs+fbRVk&IAl0*=k zD|7H&w4~_SQmB+7$=(H4%-y?dekx= z7%@4*(5f1H#{0E+-%idi;%E}T^olfBsQ4dM>7J?pauPZBbbr%xia#GthX_Dc$3OG= zD(JE5j9gW|OD`u|9o}HNbU7talj4t2Z|BTUpvLQ={lMG9rUB&XC>7b;z^5h+x;otu znvabx{rI_6`A-wHXPBuDwK_uk*(ABg9HN5Re{xqg5mxA%RUN<6xN$=|QViW#DS)SR z>G8#+TohpJntxhTRZ2a(X5MiQcpZIzaZ+6nDcj$kFljLrrJHWES+ij&(auGec&MjK zbGYS-fgBpnF^8R?!*%?d0t!(}VKveoe~#?EEdX>QpA)CQs>@-#>qX{bDZVW7g-@34ZrQTtnrK>#3{rksF_=Fw3f=3rqslp2ywXB-??=`rcoDv7bASL+7__m2`i z&Pd`)g7SDEm{Tz@tftoX$9(E}CM)eM2A)Wex8@t(Z?Hr?r|n`HzgF5@0QUEW#g&}n zVwBT&bxTQ{4B_<^+S^)|g-VxFc#$;P@Znhh9C`x8olB_33ObM*0eRncjR858rIp>>kQGq_XWD0Sf%UGAOd*9Kd=@g9BePk1I zU!_ifst@=~`or z#EeqT@CqBA|3%Csj4aHD3rqB&%zPyxbWx)8Qa(s1__$N1w#bezk-VLFjyXj7Qct0Y zQ`5o4Q#o*49Qi)Vkjj#9+vHI)~DJuSC3Z}z!pZkC#M_DiKlNw)-N|VpY*K^td9d7{@ z#6QX>-`1h)kLklhBJ$>H3-XZJ_W)yh+l~v($K18YlvY_vkZiQNcJjv)>n_nN){iEk|o_$~qS5W(bZnV_yF$-)7$%>=B*$ z0hJ3Mfk-!0rQ?q|f%GX>I++9uaA9c00ucJpUf|TE-^-=r4U*9a(C2-m_*7f5WiO*6 zEPv}ZL15TA#8|Q0O}ABS;gPbEEEx%%#x)kqfM(wDGu%bGnoM+R8PK-GCwm zxP)YX_*!LgkAz7+J3E-xNhhpZ5%338JxL_glmfbBXMYr;j%!64T*Xz02 zzYKVo_d$*Fv_1NU#7}Q9=uE#2bW7BalSr5fkGK?wT()Y9JL13PrDuaJA=jq84E2kG~SMPiEGA$vKgq3Z=gXp@~he(hW z@c0Wgot`n4wE2vHYuvyIJ!TV#)Xo4i3O10`%RUiaV8jyH!`}2B8S;El95$e^rx%V6 zb!7+u#9&#L=jeGT!Ba*GIDTc+@Nba8zZ6#rhSjjbd%bU5KL*Z8a9RX+MKze z!Fm!i#47Z3>Egl(PppJq;+A?&&mhn zf_f1?9qOl26`CBvxDVwFZE=~d!rAs4B2z=wDyhrY8p>1Ung-=~OUGQkt_h|KHG`h9By+`%k4Ib) zGpyV3+=r27d6!NAArAwjG1t1O{rFdm=^Ei+feVG7GJ1_zQx1gGwmH1Gt`B+n5 zL_@HShHxDAJWfo@SuoG^x*l%KB-_80-@VIbm&55zIskk6gG(^7Bnsc-_YHH~TmoaV z)$GPg$g9N?;X2np5=CCe4~omQ2K~^;W2}}afX#!b_2Q-qI%@xNq8%UXMkGw6_J(kv{8T_=3;a%tMleZtRc5bPt6RyJj_cn z2#X{qvn!b|3K$aX<7+u?$2r2VMQITpYixyY&Wt=OMih6#XtyHwCZVWu0N@^&ZGc;g zqr_30b_<_MwOWm$Z9R#dp%2gXy9W}Ho~XBdrF01D%DFvZPTKR2!3;G#j*$ z{E|pZrExIl*Pc@U1+js5&r0AjBdURG9PCSHFM{Tf?tzD$--S4@)5haQK|0npv!vUnDS|0G45s zOqC^u`Sm+!EG8n;{2QZKOXvebR^Q=N4SND6tQ1qwCZZ21^(9$>5wym9$U#QRvJ|KW zJ*0i(bBhPgPeC}tV2DQ>qP=94H*etbhSBNaq>&ll zDico_4Ny8wUU|-@z_JwGz2o@oWH=1o<+@1WHH#-xj?}Jq|mUe zvt0l~Le{2}XHE)oI4J-n2t{ujrYlcWCEZwY&O@L*_cN<$1isIE*Mk2Z$D%dcPq;Y5 znL3mC-KK=lVKg}UdU|8*`DN<8UbPJyg2U=WVZX~SOgH}{GSEA&pe}~P08pBwFol zSyc1htuy0U)c25-8ebRJC@7vm%Gq|JU2VLGT1R*>F`M&WV7oE6iM|yyVOOfX*oqFa zCile7dMws9t7@^2b*69yW#hYQAkCMd9-&W&Jc#Ub%N;)*_BGgFgkXbNlSXWO4?Q&j zK6~UZjnt^{cBm&j9_>57-wY=R3#uTROuVl|lDkui^KA!c2Mixi0H$?j7@$;W-x3|t}t2%inwx9-8lP$Gd`tt>;O?F8a z(4nF%mXo+M{+&->t-8SZj;=i7bDmtHQ^U|>@rOB?5B#v>Wyr-mL|!bA(W|F3f{_kC zNMxF@sgkr)`DG}wJ4wiy?w2abu!!}ev+Ta}VbaWI{#Brsd8JkPKaRTbyHnpcCS82;~J_lKpa^5C48T8u6$qjzMvh8}U z1|iHa&)Hw)m^uRleCHc>d_yoFmLLKFy`g|J3c`~yQG`z0t~c?Ji9*8QIieO#H+}jo zzysbOu`YPpsfL**;@$VTr9k)&e*2l0H)DVNp*D+gV&a*kANo=h<&S?m<%}a6uE4Qz zXUipfB1u)HdC&V(vIb-lTC_NOO;m*)rF7O3`oPK-$}aS-_huBPPMK>Db_~XoZZARw zq18!R5>RhrB8;r0ZvK8AX@TE=)0>UV?|U-$k~5UKk6411z^*1$E%JUx#gr@K*OR!x zAAJ{F6G)KA9~i<#M>z1(MvNJM>iMq05sw_UN37B>f17)SzWM$%SewGnZ+fSi`r%@O zUfilM`ZwDPZl&}1%iNfz1>6gQQM-#uq;veN06J1lv?SlzPL z5@3;v+=rB`OPU=vWo)YFf%9{{Va2KbCw26&cholY<3hj?JH4MqG<uWtG2k^{^GI?O-PV_?f&Ns&-WzMAX`OXGM>*Sih)td&8nj`+{q3}AB>gGB#AGj7`Qo%Btzz04;>AO-KC8?Z)gAX%Ob zQT-(=zv@a|`KX|0<2v>3H|7FNDF|pQv0eLK4bFfZk}P8aL^FsU;X!6&NSXz z!-0wqQLsESrW(y}+U|y;UK>he8c-eZl$cz-o&?&ID@)E)DJEkg9old#ytc@ z`27eV-%B;H;|MtZ?4ysW3g4eQEIclWuQf1X(}K@h^YCJUF_phC~qblZlN7JqYG*19MZRo>nc?(JIaJ@W>Mu39SnLbL^9u9zQIn3ldLBfw^3@q0Wc zrThehn|nyfro zh&~@m@WN3NUG>13L~c>?zAV6t z?LQ|=J+J2h^0IA614#|$Nmm(rnAKRkuZB!1VE0LwEA&E!@19%H( zuj@ykFs=Vj0$tdHQpIF^M$4p~3Ib@}IW_z8hi$tvA#F`l!fpZR+(jQy$YG*+mgioa zHFJNpEhcYc`wwD+CN~rQI^xEh=6TXLVdtyP<+26M^#4%VXTM_y^(J*M%Kv=S!GSU# zs^MAm&jK$#K~YL!qOyOG0+xcXXbKZ=h0q*Y1ZtNH%51#2kr$qV(GB&^7j|*{5ebs} zW~}LU%MtfSvM9jkd4=tgMMk#eX?|A5>Ev0M(N?AT8dt~~cA4uOeUu2s58~q}H7R1? zHaGlS@NVcQa@qn*Sl>h<1FNk%;J>*w{OS;;UIH_38}SC!Gj^esg>BMreo#K0QBW(8 zvsYU(lf>t1Yfp;r#p~b{SGj8yn4e;A))^`HB1Y=YkwOpt#Z6 z&ac2$FxUmfAQ&#@78RYsF+Is2zR1HuK5DlSD)&GP6)~8qhq57UhRlfaIR(M7nPI)o zV+H;&0MgG%oI%R!;IyqySK~Zi8^lP#`yGxQWQI44Im`V4K?Hyz`+V8Q~&raaq>K6q4T&e+(QKU4_j_R{_L!Xc9B zOwDw;+FS%oXNA+87q%lhul*!O!PD4OU~cRxzNmB}!PlDRe8I4y@Q zvWEbp;T*t@xSocM6t2ga&+Y4gPo4?G-RzOer6hs6*=x_GaU|lP6^iC}g`)Rbn!A~S zy(*G?_=K$FN^UCWq?6w(?cyWF}${8nmwIzoWs@H0N}1eg~ZvEnMYT@z}iZaMeY zfhnfaxYwC+=-#g3=3OW-L^hXp9ozoc$I=^2{f`*%wRaT1%UQfLYn8{N{P6#5_*(T= zwbHn$YpZxpvi3aQd5yw&h*~@UcAH7A6gCo>(6kovjs{Pm-X-w&%{ z4IlLUN_?`Sh9N{KOCGaw_^AINFcQ1)&stXKOD0quRy(QRZK}D zZm}n}z1kF)9lwzOf5Y-X>fsfA3*kU(;}A;Y1xT~(Jgo-{P-%7sya34uo!@OhBZ4g) z(qsg>7HCVz7ez8E=xsbYc)n_Qld&U{b>GH528|o0J!{2;_D_J%Cm1wtKRR3-nB9m`55b@5avfY~? zU>!W0$-L)l;%ydeF{lGtj5UC-LwwYEmZCUYnuW9cqCvx=yMa`hpXahb3>Wyn zNOE5sF1$rH7i4J9PF}C|5ByA>rKqrx$xt_5+Q(lE#Z}Ep0-D=_-#AF4BeDiNQ)`sL zu1K!NlVha{`HO{roKuH{G#iSr$LSjof^PbwM%S)7ouSfd(bN6&?&|x|DKS>z^EtTX zCE&~~#gEq$UYq5O1H=iMxOXd2^VNI>N7ZppS4&*=$151c_Wtkjj3@8mF%-t z{@{V)TNuQ+5mvthau-raV6^Emvp{Tzjii$;!J)1c!(jg^S?DED1MRK^yIczDo{nwq zoeIn<+)SxE^3rm3J{hfA98o``MhEt2A%}fip0fvOw{h|cd3h9*Fu-k>3{7Ws*7B(^ z$#Tl?uv-5zpXOVZc|PMOXwb#TFr7One{(uO9KN*?7u*PTFTlLxK$(_uWq1rs(zsX| zXQ$miH}k%o4l@`8*WI-}?Ww1+tQzx|b?rF(hEsS-H+15KFnMle2vkDCBT2CdtGDkc0`Q~AtOtyHdjFF`YLJL zY~*HQE>8ogtydV=fE8WTDTk=<<66$bd{t&u_E8G4X?gHG$ACSMD2n+FOn>?vfh*x% zMj7%>%6EotQ6jdc6pE_~N&szm!C8TxSYvSG>MA+DpaaC&K}FdsU;i-1-jPH2-g6@> zMyo{XJ4cPC;~Hw?en`n}X~h>>ErYYT^oxe~<_zqzul_VFXPK(f9sqycn?dI%{AovFr@ zDHcyn;9B1C?HVV}-JYZu@LG$z{SlvQ; zVlr}Zgr0+-3#v74J|vCJp=jbd@il71BD8H9e}d+*Q{Jl@u5*q`s$_qFKd{1C9!JzE zVh}Q`AvA&9Ym2Fmf!*84g1n5{(&lMTcp-p>`+TvcW`JO73$Mf&wl$*i`%~t0icRZZ zfxJd8X~bte1`zrXmfK$;(>iO5K4mOLFHoyaG?OKBVmq6M<|P%Cyiw*ZT9exlM4FJF z9A&%(2|G*o(PWwVO`qn6z6SB^swhE4Ruzw#vSq)Vq>Y5C9S9~L(_@~zKN8J#h-}X*OX?>F%^QQSc=Rr-8?v?r7}lVT%1J(TL6A?_<3=X zD$_sat7yssU+=Qe zfHasR4XLlRv6*as8Ws`>K=S62q^-ByXNPI$sa9_9$5K&!_jT{Gdlj-RbD|kQFF%An z*pVX`MKl*J9`}DKyU{{`Nl-`$VF-}Ku-D!bt`MyL&=*gz?KB&&h@EW078vL*YV&f`+kOOFzU3Yjj3Zkmnm3;TM69xWE-aa((nXg@L?d(E7+F0w3u|**&!*YY;D*!_R#e}yCB-d{w&|tyF2D5_kc47pU@rXg-w4zJ z;Xbs`Wk#=kh)**!R%WO=PVFpERkJI*s1aFAo;ZLdK#oTUgD5U@%+Q>K79Fg+v{R87@wV`c%}9j zR`T+*Nr^a)8)@rlFr?RU_@Q`#K2>+9$syo04Dd(M#^XK3?)=&0n{dUEpwMQg^(s z!AY>Ny0Wv+#QC2 z`gZQdv8x#tJFO0UXA*-mfl{k|CR2Qfgmf>D?~1=snoRm|?hmd&{};&ahfyMD2izlj zxd{la*}r(lS;wPXi`7$GLmX6i>^Dp(Z}MlGAYiK(74YQ!wmG`_TDL?f&3;*rJBy*8 zlA7>LvXkfdSb{@;c9fA<@!p)IeCZ>=2DyCbIpI!qwHCy*vRDxmQ0%;TRZ?Q9gzYdL zVE&u^9byb!JjADH9Xn+X^2@jZ%-XT`?ZpHc?|}zbI%idrUH;I27J;SGKqx0p)VhOG zm7Lc6^}w~Oq2*eo1Ix8d@~m~nHlYT=$5hb_J>UEw@#JnYheRQXu=A!H2b~)^dKa0y z(Gx5sFn23z)SbVb>@JE04|)8r0-1cJ&D!g0TkBea@Ze-~R$>!y&JNgfbBmyTbsIFy zM6JBt@Y`Lc2lQZu`pdz%$q7|wSEikWzVt~N*lRiM?ZtNaq%zq-ro~r5)f>euy7iMv z5#%=vfp(}zU(V3q^auoM^Po-ry)OSl3(Raya=YmOOY6k`d73x+TkIvLxe^BXH*RiW z!(!1N*groZpS85V_;m@YR6JLV8lzQ#+@$x*P9J9N^gzV*U#H94#qu zqs1nIUkx9}nm8!pXO$r{$4mB2h5_gcuVkN4pH1CeoB_!ZH5&_dpc-Qn!f2MLM6>8P zPpCqXf6D~ZX`D8P^v*r}N?GZsCv>y9WPbvSx2lF@7`f!)7uFId5%EI0e{QjI0tK{2 zO6s@Qzj#+S=DRpjM!SOj`%TAXt=d^Vh3NuIF-TOo3#kr%l&CR_PSqEa)oBR9&Yd5N z=9TT7!@cOXH8s6MIn|9!xJ-_TgZAXnQ}ZpQ7)Sii>jBh9HhOYgZjiBq3yH1lN{zva zJnGc;Q!w_Bt9T2GQoa&j5dm-Wi1@Mx`iSO-*wRc*Usm{}^N|srid%4W5eYWpEL>-d z5OFKuyLybDMdU{hQ0etn(DO|_A;Rar*1XKl;J@;@2M9U}c%@%%t<&)dTWpUf3Aq~( zas^qJOObW4!MaKz?5! zeT$xvU1p16BV$c|BGi>Z@t1V*CdO(}T0_#DoKB4+u}yZ@?OMI?t$uHsyv0R{#^LUN zDzPkAtgY`itN#7XzE2{sn%nwc1GN3+0;6fT#~o`Dl06H0pTBi)Je%(}g6_Zq=DH`A z(%ZsI5QKHFFCw3h;93vS;_;maZ$uL4d)9dFCXpUlMg_jbu>w|{`3Zqb4Iugclao2* zBgPg-irc{sw1sm>ULDF;Mc~g(Bp{nJgreYu&JABfB;;yNQv!*Xq1wBZh&yK&BIVp( zM1{~9R*65wbJ}eHG^Nx>0pKZQukO_ceaR4t8JVN5dbFnN=xZC}=B%ML>&vEs+B72f zoiqVKm*?T~_ft~O4XIlS@Lqz>3=oxkg9~$$yJ}1&>p zqo(n$aT8*t?LxN7X8n|R7yX}J+< zgGN0Z=T~`!Qx^?DUo`JiN_hUeu01-W8z5gy^GC_?6A7GHSxHgK0R>vbwGU5h;)*k* zCYRr0D>^r*S7H$N9~W|e%(4#H5C42jk@jB?jym&#^%?gQYQE6La(@SQ^66NUkTXYT zk}n*-Gs4Y6tFjHxY`PWlsr>u^000alSj6R)Ew`{5wiZ7{7@)777RUeq0000000000 z00007Knw4SYP7;ev0K4UAH5&2ZFN`&+#o~I_JZf7l`2>8g6p;bcSX&*v(Im_5jdS> zQmRMeXW#zj0&f1^?y)(QlbjjPDjFHJch6>X=sJ}9={VET?0t&wDX%vkid1x}n01|@ ztau{Hn z4`8Yn@8eQ=odO<_t*t_AgV@(+S5tM3_+XEUKz!Fcm?rE^Yv4tq-$4RMx0j6jZcmW~ zZjfNQOR=>{8KF3+UxaO4u1E8Yh-KYNmZ#!C*PMct2G6V{c;fOyI2O>Dk1tgGFf)`{g`HQs|4w@dhLwz-3#r9h5h zuUS(Lk9E!sl1|a>3HL zxFwY;_ICxKHV&^sqpAVCUP%wX82aFQ?POCEi_N;LMMON*@_{cE+6|nL+y(E4ISq_+ zP8`ozqO2q$#C~ELZ9GqNJ&zu~CrVxjk+ltSm9jbDG0EVXcnl;yW+SX%!SIq?>=L)oeF5|z7otZJS<*8Rk=Yo1s~10 z4xvuJdTu2IJ}x&Y6!&i9sBLdY?0;*rGG_dS1_EXd@^V9OfnszRc2n_ujKT{)&$mjT zlyIEq3{F`ycBh$3@sJcr-Z6HmrZS}ul-aSvJGk)cj_Qab;shx`CoH0C3SWc~JSc+2 zN}>9*`&HHCTwd43n-S%@{ijE$I(;eOA!xGzH#$U8%)RZt&p7?QtX@*OF#A;2g|G#^ zaz0SP#*=2d6~Oj^FjFo(YU|KF6US_^uw~ad7a+*iyl(Ims?m4ohOsY&v}uUWH&)j&|OS1)5jDCVCYDwLAt*=)PBzBCz?bf=l1$TBeDG z1C@bnVIR5&B#}B92^cRXLyg>n4a}I-ei%Wem^3P&-Q-{rH$n0zM7IEC&F|bLK^Cep>fPA}D{V4^|TZ1Vt~Aq;@o4ha}d_?d7+(x!k<6e6&3iTJGyIVgpG* zV3=!FY<)s0D}S7hRM>{_N?%sfGW(HpqeMrhoaXMRIO^Rt&0yN&WLDeh35A+NpcwYRRq-UsFc-Y_&MFSTl! z8DmT5gIw7JQ_#-X)*(3osx|)v^eYo<&tz|9-pnNY(z&Ns69tlL#tjxXq+ zr)cFgv?E>?$B2d<{pMLX%)#!;t+0|+uYGxZf|0-3En)rdv;6>HK%l>FSNh4vVeG}a zT_Lwwza4mE3hV+`;26^`4BfQ|2KU>@@u&Jq6i5n&6bYmmg7}*ALTw)R3Z+yCz|*ii zJF&2*I6}SY+d?_A)^CP09|}wYqpJL_hH6h|Mhyf^mj(c*L4sl8X$ov%{N`6&N|Po^ zxL6AbRaf91JX2lRaK6v!*Q|@6>2gF^zHwP*4&SvVq4#|3RKnFa_z9Q%F~51?Xw9@{PqrZjW_|A=xn+=5cm7sTY_=T-C#a66mun><%{s00P}~ z#@u>ikjt6`jntaArRT1V+_W_F!F=gY7)c1&KftayAs?TYD9(o2w@|AQx8Yvn=Dp$pID})2+*l z3U4IMp%YeZ3#Xb#C%^27W_51z2XM~54EVzZ+j`0XXDKKgN(7B!**|Ua7#mwP$$!`Y zeQv_XJYrjV_;##hES`n8p&02&-@yn${Za7h%cdqk8g(hSka1`Ykba+fPZ-=daN8in z@MY8d02RoQF5d&s)8_G9f#8Z~B>>A$?f+WwCo2g)%KLIJ8f0u;&qBre{FQ+{{&HhP zQB^C7axt#rwBy&|U{Fb&wiX8xaR_+(si;!^Bwx}w)sAZRP ztD=^yL$Xv#I~0KYi~*~$*FP$e;1hqyhSM+~{&nf%q#I?99x@%6?Uc*%s8%zRcULD& z^pQjTVL#n7_mxt*D-G?crEZkl(LW_(#aiL0@!5I^09%o~+^&z^rX7bGmTNuU@gjM< zWK4wd#B@z3W#?w3F)b4=Eq)-RJC#?&YwQzU_L|7rwSDXmY7g1t)`Vmi#KW zBQ*)uD857gE-h{e;-I%c$WnTmChrXlV&Uw9CXF|<$147I`;)F0=>eGUF`f!%Ob5z; zBMD4Z)efYLohGL*z)*a*FiJe~C@Rsl8gq&=s(cSlo}H82=@?{VR!wOCS*EE`Ba|mD zHx>ipAvPDEDVTIJCJ}S&=&h0C*6%~*j0@g|8vui+!3mO>WTe+s#s_|swC{4%?Pj3s65u? zu*m$B-E#PCedg2W0$dt60$RK_#*pPnUk$qtNuM_JN4Svkf#@>5k@h^>h#o_(;<@G!-IX&i`m(WyYd$%SZmjD>hlm?FFP zgwU8-yxhd8Kk`q+n@Xy-0!Tlb_eJTYJTt88%0MRyMH9KphG{FH#`QG@5juo8Td)e* zc)u)=Cbi`3dc~`h-9;VUPVX8jHrY3Jr><50#}^;7w*YxjSX2WErd@3UvY5vqHsadX z_MXe*6enk)jsISj3{#63wN2uF<_&%Xb{|@FKjS7RwANNyyVfb(SZ%Zmj%$dmnPj zJhoTm8y3wj*%F23&1H;3Y-T9L2oA#?q5kg`*S5sd>zt~ahC;1&9%S$?AFSFTWE;&AwioF8XU+E#cJYjUL(cRR0~nW)&@$Tqrcl>BaBkytYJnA?J3N1bH2+JF zLtw)x@6yjhaV|jyL+a6Ke)w43Y0v*VY}U8(TClR8_^X7t z3Qx?#+j9_fd3Hm#T>%TARsOr!rP1w=W}T(G2MY%B66rGbcdWW$R!(Y^#@G1N)HhG;bXb90&>rNp0g3SHr#>}7I;=BeM08pAFJg@v3uj}F?a*R;p3!w z=S0tP+q3QAR`@!@?pp1Vpcu&E;-x+$9sFJ^2?EsTQi`fk{I23xLf-1eWeW5kkj)#W zywyoKnyHvrcx{bw%Huquup{P;r`qDtYE0QJ(&%EiI}qB(eN^Dp=hC#wbwrC!5%mmb zfkN$i8@nedBt(=|*;RjT6fzH6(61{TI$`Qt&nVJyOm|bo-1Y~>{rMm^O(+d!cCh6s zkK*kF8KpZ)@1HW}hPYeWv&?*e>vP9uFDX!%VyB<^R75wWg;vX|!*+UnFLrTQ#tA`G z*I_F0RF-L0aLPT-oLLnx^Z{LY<3~^67AVSi@cfZ|Mq*8esEM795<^>^O|jkSwd)^Jn3;C}Vo3KIWKj1VzIpKR#o@y% zUB1{={EV-Tpai`kNR2!j^C>f$^4$5ZfNK}zYVKMh#S~s^l)U~4lMvH$W|`xXC$;}? zELiL3rh?HWve6yHjvP$g&TMb4G`X+z?000!8yLk;yYaH#V30`K6vr&-o9l3<MNkqyc)4#r^mFkV7$7oN&hf6rr`=TDQ+r_aUt>mKr@;(fUw3ZftRI zNl(w1bm05ZWk+0iRL_8Z%N>a?p5|H?7UgsTgcV0~XGI*BrK-zvFC>x-^QSm}rd}Py z$u%#tIGF#0;pWP!Q!Ax54=U`4C}nuFVdY&GOquoBoUJzOnem$l_L9Z; ztaM1WWP6%=a5UJh@I`49(ZovhDXx_&kE&11l`nkecinIfb}7iYwMXDZz)XI6RA7XI z%*7)j7Z>|WTtA)M|199;^*QB;s8baC9@_dttkMJ>L~S_o`*w=j3i3||56^WzmR=v5 zW{&3$ITfcuvXp?rB`W`SuME5?UubO;SjT(iE=SBGCLa$ z$x!bgn}%cHr4NMvOr9B0*!bHBg93cw7~JF4sNt!uD~ooh@=2o-C!+pcorQSf8*XyQ zSW9B67)D73JdjN@I;hsxTD!#-WA6?YXw?THF&^q<^A;DZ64Ob}t{E`XoNE=(ggNo{ zJ`kh0uawUS0^!#ps0-w6#}w8ZakRde&3*qCw;IJ>Ax9e74P3lyL`FQYpyB3%vgY7p zo#C>OZDZyhU%&G3eHQ+YSpPe3kGYH=TK0~hnvf}+J85-ZQmA6nOY&n75%!TwK^8om zva6d~FeP)CFJp4ibKS3m_Q!8gs5zvOgWZsO5ag`3{{&M8pvst$(40*>)Q&l}sN5Hb zErM?R?FyiqUdKDz3J~|%FgW|fGq=nqlZO)W-;gI@>#NB-T$8^t1tyR6K<20HJp>#O%ctkV7>)+VH;6>>-uJhRS9y)@rS4E;H&%N zc6lVigD`XDC*3FU!aZuHH#@57Ww$in?cbK&xpI^Lh~ zs%px*ByT-UVBv=~(;fJo$in`*5lYWE;P86TjeQ>zIvf77B4BV3ItH0qX%_LNgbfKj zHEdLT(VY%9rcF)9yt(zi1xOBY#j=ckSc|K&l_mN$|8|+}ZPprkQ=EpdE{;@s9R^Rk z@-qKTYkN8GkVCnTj6}F?&_d=yKI8dy0C$pe`)qD-W(#^ zFVN~CMCdCBs`XdWuPpGWW(v%r_;Am{8~=doXd;M)nZg=9Eg3zrb69bSX|Q7o4>5>@ zh0;q&&hSTiu$@61$myjAIJ0P+MCO5zZI;@S+_i7w?S{r4m$hnxGD+uvv$P*w>Djew zn?H|LOSy|6>&@ZBJfHjK&mbvWE!kT5tdk@YpbT9x$5Ps7H+0aBe)Q8TU%-8=b9Ab4 z5v2t@+{S4c%M^fa?A>Mh-oM>)+!5jxz(hRVstEshM`0MDBl=Wg&^AYjx7)Fj{B1>w zsGs4m2T4voELx4igYE0$IYOs&@Fq#B=N9)a@3)Ii6K2Q<*Yl1R8MB@7#xT3rjWbt* zQt`={4w>FehAO~>ns-W6rUpCtT)pb&QBalMTC<7X@J*!#o$1e()G%Lgh%j0HF)tGuj z8Wz9UK9pnxl4% z-^{Npiy|3dO>`;?d^FS9iW6N`XJ0oizVR~4E}dDIV%zPM!4Dz9Mc=iQwe7dR6t6z( zcJM)d>)jXO6=wAu<0l>Z4}x;Bml}dP;ZN8v(L7&GpcNb@Ma1p_24oJKD={1Vkic4; z!9!(ua>&-Mpszvo<)00oOI}HEs9OddP*y1$SJh2K_()xRJKC=D0N5a$u)Z^RM>Ba_ z&@`xTKA76l>nj}M3V{V<*_y84f#F4>9%iBnoJX*aCqJ>t-O>R}+DsY5Tkht2C(=y8 zXnKsNvojs2t0K5V(My}XEReVKvmQhMGk1B_{vST=F4N$uDA$^ktVhx``EH%7{|xtW zV=Lq!uQ$7j(=;IJWZO=#ni)W334Y$}0|^NMdheU+&O~W1!O?=?Rh6yAmpma1c_yKP zk$6DfBroIi(p*|)p;3MRCFGJ0T+Hq@rr{)5w4DRev`+Ntd?8Owl#)pz)4qaN*#l%Q zLo$iuQofouZoTPnRmF_x9mUAMFXnX${mID7fd1MTqE2o9za9vAfN~xMKtW(Ox`ek2%w|4264Vt z4Z*ltHvZXyRY|hS#CK;}Df?0@yX%kl$Ca@%_Q3J~6%k_<^%QF4bb7!8eenMFz5BC( z?lUIruL_1z*F4dgShvmSg*B4m7(BfM*= zmrj$GRJ#dZT^8D{apFGIWSt6nPm7J6FKN)fO00rU-aaYoo=I0f;IJ5TZEQjYe4Ks| zRcSAwD`%3XDUl|KkrmJN7r3Hk5~3_rvv$+MD@}AKM%c-&%uKT`Vna}an(wY@ z2b|VbZ^j5q(|7CJM(y|g3La1xEFR{Vc10z=2=N{0&Z8&4jo~s3-&!UnEQePD??#Bi zYi2xaTfaB9^R=Gw6(5lc_wC`S`MWIu8d>LL^@Y4zDM7RY5-ln9?x$V0VNmguzOs`T zobp$dHL?_j26hF43J`hJXwk=RO}s!yr&OQnKa4XGpHq6z4(G_LE2~uO%S)Sk!|B6L z62?gq8VcBJZ2hn|vx^2lxN30Gg6Temwam=k;evOBP270lZbdpSv2}9*d|I^8#*GGt zsXT6;#R`|{tLHSBqGe$cdHz_s8Z(8=Xuw(H2G*Q)^K|yDP*#*_IK`Adu4Fy{rlA)A zWiXDvi3G$;izI}U_;Dmt`7a?h2mfDV+)_;zB`Eu`4rtK6 zKyCe@%7!ZC0WaUeyQxA_C()L5(H>hUaByLzY@Mtcm{&8U4#D-HfH_Me<97zkZ7M#r zSHJ`>hcAoolX~xkpV;Vr#|bBz*v`SO?n`I-4=kfe8`yHuUvqIo-=1jx<2TkDSZ3pi zV^!{p`?ua=U)4UWH-*p(KUY9TY%QczRhJzJ(4aA$OZ+Efnd;USHqD!eMo!~JXlaz2IGNQ+Dr$t3{Ok*s+Uv@5 z!K6IH28R3jyyBgY1)}Bb5jV?#llcAAVXNUFrO@5w@ENRXg~QQ^ z{ciNw(wuv4fF?=liocq0ocxIUtdggZaRS2EJSBpe6S0dLk*#)hc%QM}y&8FfKt>`Z zujjaV<-p2UEJl(u@%qX}Q(uu#0d}A`O9W1<-2s?m~nPmU7b52RgLAgee%9`wEh%@bDrgy@^_gU_cI)-+h;F;)QC60 zvYEo^Au@cNyq<>V4aAJm@D*%KUkzC%FFd*=vZ4|T?Va1Ksb|+pkli1m$Bxg`*y1F5 zhyi5un5me&)zY}W7PTb4RKad1K;(R1w2`)uU-NSL7B*1D7-i)!pD>+Y>rIzE7_UJdxc#G_X}WE|L`sU=^sD znhtSmE7T(k9ysONgzn45==g@irG_pWwVOEx%@fV&zUFjioiN*bOxa$0KSbd^R35=a z2nz(yD)+N|zYx`f9Q6t~(rXsEC5c+-6=udSDb>2qXjfaDjW&PfrEA`QjU3&#x+vfX zs-*cz-S)St%L_@J>lhWq=>B?$$cXmVUxDwHiOZ|OOV2GK^99>k=Ur|~Gy(GuN0R>p z&ANw)szMEokO+L4LmLWxbUo|>e!y5*$dksY?Ep<-M**QyMvFJy1OoV1lJc9)+)gyX zmkc!SDQqm)aD1C!t1UKv^#d-)=Hlr5!h_(QyZS~f>OkeQ0iOnqV?SIT8iIcu2N_*p zcW}<@C|JnyWj4Xd5a7WcqeUQlC3FUmBAkLI5r^TPU3lU)LjdkshPu)ZL=1jzF;y@L znn+BBB{csIwZxaVcQHPd$+>UNy)%15pQGa);P?cIo;&IEc| z!T~MmQl_O$A zhOwplqG#7PJ5CmW^YPLwE2B=Fk?<6MNuwjDkFk19T2>eH_7t(>(#C2){6Ye{w)P>* zH$rC?^rE^Fq_&pEgxK+&tfD!xJMfJ4F>$uDM1~-GYK;xl8#p#z>r&!aio!Xubn#nP zM~ZrP@gRIVM1uzDQBz^10c5t3W5<40h#>6IWe3xlA-1M z5(NB+YG;U$g4_h|RBMOlWHobexsXP`^l=Cd1C8XVsEJ+cHtlGuYD`zXJov zJk2G2Z}tp9FV|{4WC6DcjSsI!y}fs6IdLltGXf)L5Rf{7f%4JrEGS=Q3?lOE);f(S z2l-(0>q+kxkf1wTp+lWF2NEB2{?U1iN& znpo@6d*j0YYb&{q;;enTsj&1njc~VZI&2+&FNq`ImO=|%2pb01*+2b*1yK<%<*-6x zWQs0q4kqhW;oh(~U}Kgg;d6~pystDQjF);WyFGLb`{e|#eEm8mDTL%Ij&z8oCQ5eH z*;bs}a*9v995U9#dEVxR{M7trdzQ{B6(ThDPke7_0f90#=tAq%Xp!;g(oro->WXz9 zuUZw!FnFxJSKFFchgqKlwbZnpuuKJ12bdB!$Z%)HD%(J;v#0=VzS}z1Ho|8{XXEdv zE>9KYb5FRvr}bN;ohFM{R%WxoP^^xoT+V+D?{;24UVmx(pN0f=iyDA!336Ejp>HuT zxBqFO@=VNnP*CqUP4=<@uzT-P@5LF-`UIWkG$PV%Gp=h_-F@SoA+eEeTOFe_-O%DI zV-EH;wZDk5y~z?yYSYI5Gt70>9~M7Dqy@JWAo0f*^eoH%0$IzMee1em#tanK*AS1C z+PNg9^e6v;>7Yr0_=h4+0`2@aBScHMj$DEn5AO0pl?O#@z=o7I%?U1f6vjqihs_De z@qw{QshH?cW7(N!AV0IQI_y6MEbm%}NFaXasaHgkRNTQ1YAcs48etGIxA|73z#Uzn zpc6nPtV@k^j6bf>#JBxTAmB|i#DJP&iLs+)hVc$k2{oFw{(HoGlLG_-Nd)U#*H`k` zmSj92h(-)1*5lCoErdBX-=-cRCEI}lfNt$o=~_x}spIH30e${m;kQWyYA6-mESi{o z_<%g}7r}vd-Hu6!m7cFEW4D3NP-fx4^K=}CxUVkn89)F4000J3U!T+IGWV<$z%^@U zwcy;T1p@%=SgdLPQd9T-?3K6kv}1Ge+#m{>d3ZT`1j1Y;2N7t~MURv2)%Z0oHxFL} zk*1~n|30_j1=lWms_c);tG=iBcEI$*U%egcVd;0x?TsoK*4Qx0ohz@F*r-y%VbCyn zXn@|psVGTZ5my;-KZ}Dqp-tCrRRHZ9`oG>VN@5hX$GTyY3+DGVSQ-Lv$@mr+yy)Ys zYCM@+bSp<`X44MjIfN4Cy;DuF6r3C?2sT{g=t@w@TaHjL_09_;ESQ)BXj^3@M8Nm8 z9_!F3F76id|9}5~|7U$H_;@clXA)q$nx$D>&{{F&L`%#Ck=QVY|0b~la^xK9yqOh% z%O(;yoGRDY8~{}^f2Ad87U;2fC0J-Rcr_nqie&IGsex`PC5BbG_0zeH4EYa%5jN*} zmdC0EIc&VaBQ6V&G;)TtzWqEl)co5(@)xuHS zuq0A=fhX!j?C>0hMmGuW$Zt)BCZ07Q=KTsd4$Xv*y)cjeWxBsI5JU3U0!C(2y=mPA zhjkzWQ|sGUpiL46L|+~oLTiknUI1p4f%k|)mqJeZ-x=964ezOBQ_Buml!F7GdHtbT z#ZirmAmI>z=1EE5>!GTxMzK+cP8I)u|9-O=h>^w3i=*D|eQqXm#|{=|zdVb0F_FGa zXy>u#JH@bQ{wi3e#?Jf&v~0u7Dt}21C5qrP##L|4~qeY?p2P8diH%>va^`H=e z>Ktm+_k+iqn&RdW1j~wv=mfm?Mg_bW=~be=xwDP943+L3{N~@F_-NB_<14UswsFrP zmOX`-BNn6(F5PVNS5_)lxqIaI+Dtl!IpU_v9KiwU>r>))pqI=|{s(rF^Ps2RPV3vn zy=w$|%`aZ-MgD z8rsmhF)o(>V7*1p4zK(T=YjJpQu&jyZdl8~_*+r=_cpvE%v~YMivabP;EVJV61b)b z?hE$oh54JS?o+gnTI`G2BsxW%5vlodTozml{*M+pY1o+I4{B!%b}k&DOFOt&XCi^@ zaNdDBpJ!XD9oA|btOx7rUl&G%cz}-R#4l!A=r|v)vH`sD%>;^y=da(A;?^KX=>VBQ zYBZeNuX~A(z9}7Z$F1wUYBCR35Mh8n+Y-tAYQ zN#WEPfrw*k=Ya%rKs|$B6wa%OK^zQ?m*RaLAhT7tcJ0EcDkbtzb`u!RH-pB#86PGb zdXRL(?ndi%mC^Z=OkrL=((@6$iDr`%@@~T*&%rgyjN5P&5#?EP^6^iF5;j*oU^i1n}o}CHWI6$ zKak47D+O#Gck}Y7l;;(lq;DE{+2Q z{(!)?sOZtBi7T7HQP4Pkz*drk2%=mSO&a3o^j32l7!$mD`WCnIoT!hKNc)Hw*?3fc zKHM;FEsa2^1iuey(lt4re{o;&iT!r{IW=s^o1NKVerg@z9qoF~K-dCX)5r#qq1yON zBhPpiZ5@6WA3lQKxqu)e3@V9yyNgH%A;j)$9AXFdxt>h`+JG4iXjs}}97Nd@sw&;T z{-ohVypm*NxrH*`%)MD0GfxP^JYR!Tjg9HC?%eMoHGtF798Rh{L8P8yA zuDVORwVpo!_nxonS@$O9xQq^(0o~Q-W{I-BCHI;J)XGBRKS7>&=(o$03iHx6d)D$2 zFL2_|snI@hB~4osRypAqz{c%RWS0%f>;Z1yfzwZi&Tr<;;-;DwI_E2(cT;-dws}GT zv5QRm+>S#Dzyesz`h-*ZZ1ktVlkj}ie^hhSu@;T{8l}f$RQMG0;)SCAsZQ>wX4L!NI66CPwc5L@e%6H+2aM= z+65wN5+Tqm){!USJbOWinE9d?#x}VpL3aW$F5>08jld$vEONdO;%(dZX5PiRc|&N4v?jx*it-%lu0(AE zeNg*Sp|0}rA-Fq)tXN0CRvwNB>M_!<HihV7t&|R za~tpG;e~(0oBa#c0bL3ie5RvBhhdV3K+t;3w`bdCZVpwk-zi#_Me?`tE47&+#LUjuPyI&-w;Dl9OI;2Kvb+idvMo z&a_`tThm=7mG*E^MM9_)87NjGj6C4okasG-To+I$jI2xg4`i6;6L}U~~ zS{1DvWnJOc00HlUSO0&U8qomWdP}2f-Ht11dySsw9}kHhDzC%EdvdqP zpwOrhW?SJnF&QFgg{n|KrznFZ4bv7Zq1*BiSzewuaZ1RB1~lsvxXFNDLD2_nS0YbBHB`H#GF|2H^BoI3a&kMH8T4021wr$#Fm*`AhD8{+Ig3I zx&=ot$e?dOwQiFkf8{8?!{w4^GdYrOTdRH~O9O6BHdi&(>G9A^p*Y8W6{I`^aslm_^4O?OlvojoD^$`u{U{-;*W)NozM|v8U9xzY~C8Y{Kt24Zm zhxfuMk9HWG>f<=xo~GR6>$rHc=Q|!OecNa9ZRKi<*Kw|^X~PTz$v#l|?pf^wMa~$n z`T*XNM%M$sWo0^QNqjLTW3Rz3WgQBSJ8fM6(7S)O@)A%-Z$K`ISaeqlxZ%Lw?| zZFDLl`TAz-elo-qICXIX@Y_inv;p@cf(Fv1|C!wvpUw>cf z<<4m@yuw)%)u^E8nU$qEH%o_Av~`m6-zedEHxG@@#jf6hk2{5mazunHjX{%~;c^bS zh9o_*n+1hmg+(o3;!V@fUhkx+o7#g0rn&K4a<>ZyWG$e$wRId3j?P7-%!nQ?5BI%C z33|%3&bz$P2zivP^70pO@!iHdD@Hc>=8cVeixss%ca53i8aKj#RNAW2dxTyL=^Xw@ zwu1ezu<0Nm%OI>|j~oP9LXy_3Qp)9>naqfVYZGa~d!i0^{R9Fb`Z}wUlY^^oP38_uk49 z^_@y9eBuWA%OH@gV8|kV78TQuy!(|9;w~$9F;i75uVoS2uIFGGN~)Y17SG2MUMr2$ zB@R6e*~@!aWk1d#j34Up1+&8#?I_&Ut9m(9dAP9Alc{tsOeH|4{e)En4rrIA+Ri7! zXg!+i!d(`+9R8C)SxOm+qo+yux4k;RTR4IvR|mBK?6+QMvf5rdkHFPfC8mbbjFhZk51qA^zyAL~iU7s1G$@u?8g0 z3kwJAz#;bzq8|8r-Ga|YSz(*FVy83Hp|Zv8NHzz@%902~i5w#6pE|xtosr^O`FtR;kd+LTN>dTNHINkSc6d;C!yHAG{`Y;Y$Q55rB}TuP>a;T0pDR|2#SQ zj``|4qxsy*VGP!kOz5=^y{m2p^*Up1_uZL{+^{Wp$cQVD@E%!VPzrTO&H1jRAwLvB zTQ4Rl1IR74?N4kV8@p{6I6>&w0~;Lr7J@b^&|L1XzfM2jPfhT4AWzJ*gdCG~%KOBu zDGa;Z2A5=Aa?dyptCq4pIg#NIMb7fzFVsW(%S>^S#rAsc!D`_g%|oLo2wx; zw1Je&R^6}W@B-JC0e(%(_+rKJF@8C0 zce)rki^gw{u3?BKiw1iN{djc+OUZ2yTKdyu-`0;nG8B0 z8YDrd)7UVQWErHarn*3JcC_lYGb8R*#=Xq~2l%NX#D>34SBT1FGsiIE7qZ_TN9T*s~Ny=18E_v=b=BoFA z2ip&Rzu4~0z`~?`GRiY1NwBD^xDA%AL&*<)aZ?ViMb7gA=4XFhflt3_bMcv@} zq&eZ!!<6?IbmRP0FQ zE-xy<6hi`V(t!1YHC9?}XUBCJMPDezCmnl`mWNH`?dz|kLWGKR#Lmb5Qox&j9Uhck ze`*h3IC~lzsji0>7v4uF-SYV-wzQPVS}(fA-q)}VO+y>*vjEIduS@UDScZwUbKV`m zR5KW+Js~|p+@Sj%#qC#eJ0n$ju&R$4?0`(^GnX8yOCKLj$Q)g9<7~o4x*_3ov2Wor zmLg?Dwuw|E%=dZZtb%v)9;8E)wgQ_KeT2zpj%b){cR!^l6rpN5<5&;(YavY;pO<8# zoC|}^hUn%g8RvDiwnm%NF_VQr^$nUvZPjg6Jv$gapR%Gbg==5;zzwbL5yFRIhjxoMD0NMsFnSc-t|2S1B^2(Co{Hr1eYuf)!d}yO znwSpSo@WV0kTSC(*pb#d|4~KTepwl**9HeBsRN|zL^go#oEeOm)O@@kf{CB~aLXe5 z?GpS@>J|%FOENQzW=7QW(;5fCtp|$~Q~k~|q-W^^=Y3Hcg%m48YB}Cj?U?Sw_4}Ah zqd_OvrW`e8qiAp6h%mw0$7;NA33*-r~5fDS$!ifM?&B!tt|6{m|o0w_HXqLjPL z*VYziq)qb?U$;zJJfF1P$p3{*=n*KIy?dx$$C3@^%Nx*6dH{G8s)zXF0%vTP77`=a zRV;1Q7T$j}%eRBfI+8vrbENl|!S*VL(`HS10M>ki@V!2PWecKhpb$?Zx$QbVgDB=a z26g+E%2NMWj>u64EQkfvL|d-~VJKhRJexV$r_Wy8gEHVWY5D8KpqV)V;{f z#gE21@Tt4oDxL@RU(Kg0Z`?+{f(AvQpM)1-{1ve%ymX%^8&z(%`m4u4qMzpTk725# zdOpsbbwOEssEs7$G84&OTn-i*cjuM}fdI zoMdVp7}1Z*7Xgxe&d1zQCb&MCV-8GBd6~*Y}*$O6!Pc5xdw>&>xvtBWs;rFpgDfn zo+;qf&@?mxd4bbSBt0&uTGx0xO$o=t_$HCk85|uquqop^La_$TDJg}WeF<-HaeQ*E zCv#QfR2#=Js^BlxP1#$Ab63>Vi9m_X1jhNrB1t?yrSd~KpkcU8`arUyy#@U}+q?X6 z1`IV=Z-6BNE11UlkY4UB;ZBhcN{fGT(az0RM7; zOWY_>wJlbmJl$$7BJf{snd8B~WtNP*tnIo&wU-&HajsE+ZU8La~lz@15oXiR6KL)|UH>qtWE3}GdhJ}V_DtS`}%aU(FE z$0D@X2<;iZkH~0x@HJ-<{%6_i;|VkG#N-6(g1ImVW#(6Gwds@!--zcNpyUpj=WTPmF@}&*ptoit-%i9gv)Cqr_YJoTt7*i z6Es`DT_6MA*biaTbH{J9e3OC22^?}hm~ZTduKqOUFtc;ZLl;7gd4idu9TmGn&#W`R zC}uZQzAZbft{rSF^J(xJ%ygBesZ=;)Zgyhf$Tz63 z6;w_}(R9Uw^-eq0IQa@Io=0u zpy?l>z1!0^*3H1uTXwWxjJS7qBM_NSYOJ~e;zA_rP1t#5Y{-)tNYw%m0BPLU8Rxw^ z2qsgf(C(d>)iJOm6n&Q$1KGDfQG35M8Vu2Xaly6QT2&Re?)w9535-phmJdJ1O_B+) zOkZptBh7vwsI7fI35t^g1Ft)D;naeyB;1Gl)=U2?KO9U$*8uOPEsb^#qbh+&OXj#P zZY3YB#)X}lKC|I?d*XPPrEf1{piCHjjm#T@{Nn9bv&8qtkMn{NV{b+Ud8(Mwil=|t|%_M${JtJ|l5a7phQV{h>^w&z3S=|1qm{2e|;R_sp zd!Li0=YnhyMLCw&xCmGvB{P7usk`h2Ndz>I91EL0ETS@s=e%78DmW&UD1tyytYM3- zg^PEjdCm;{;y!^uk*-7xSO6TZSt>``#;Z+#mdEp%ANaRMp##M^SKX*2EUAaKmugwF zq3|c~d%hYQc0A@tlPn<;tA1VXl~TDxaEK%TTxA19fbrk0BYXkk7b(@js&{T|RHqxs<}`3X4n31!=!F>I_@Oq?pp7BuE~<_u?g0^{yCh~1aN#?Z_T=D7MC z;Okwmv5`f6kQhhBwVvt&%$8T2w_NZ^#V13h-`G5iOTV#_{Vt-~2ca;eADNrw;hv)6 zq+=6*Y#+Cn-B5xY>7ldmmhAXumBmt3%OIHGAkPmo-g&YYVPqzz80FX89s!FUH7lu4 z%0M_h@WC(W~#E&_;EX7e0CfR7}$?qtP1-Sr(uSRWBkQ%8_slHMQ1_+}G6 zT#9#6&ISTad!KTXx4?kMs*=0Ncp^RoveL;8Ue_F-m>Y<`s4(kHB=r9sXOFu-?oT?U z$TOthAE~zN@xHG>1H>Tt3G17M(EWACXl1RErILti`c6=OmQ{?hKx3g1B8c67BPV6O za>a|F8Xf`rn~iBj^op?e5)9TCSz0$OztOKU1^;Uwf}@9B`aq+=23cCulmO1@FJTx@ zWqxt{&D128Zgsv4v{-larL+~PX>kwAK!;{#F~-jlm{MBP6vF^WK)1iivbrXT6$pSK zyikl-^?Ktndr3S547R}P2)}uk zN_YV0&2@y}5>yu{W}{0O79G4XK~0{NE)?Ec0H=}hF4zYgTsVq*R}d_y6T?OmWK5a< z(|R>nw$_sr?L6@+s19hJM@~&qdNAWCOc{|xL?sPW6%P%Ivu;mYa{A9|9A1b;hX^>u<&~`>Ky%u4C1u%f%Sa2r7IBqA!4xU%kqhtUfsrY6oh^(DeMG2>j1?1s`sM z!Lw#JaVOV9PNX%>ISC36rS~JItd!txxk<2UA;8PvCfD2E;K^-ed;&Q!Vv~T5GS|~x z$1Y*f{^|cV&Wfj)NY~SU@WGah)&!ML(HG;JPoPK!#wS)rp=Z>s8B{yq|0>OP-$#d% zL;ryMAAEMZMuV*fMF3-fqELHRRv%j?LB}8uC0n;pzx|hi;>S34S782eA6syS24_EN z9KsKrjk~wPi?Phta{7A@7q~J>^wWg3K^^ucMu;YeAM!-u)noK?R>0q6AE3p8{6FRF z-)I|>cG3IxN}4i9zbXO?Z`HBho924=(H+Hm8_Gl=g=5f|yTYnHdAm&GgB^YCV``Ki z**JE1BWHT>FJ*cRjb`J#YqFi=^U~8AMFx>ZgFD;6zfJSPe;TAbs#L~o*#TJHZ=g+t zqd3fG)?dJ){8CT>#V zul-@4wNN?*T)f?|In9y%f*S^}s_Oi^{!n!?cyP~l1reK9ev0=NVo|+1+&V;yA_OJT z)d!@`0$KU3wJC(3vxAf49d;(dx$!L)$u+B96zVW*rU}PVwKsF#2ej-+i%+IXVrn2h zBwEVKXO?5$ZhrJi+l#k}$_i`0usDwCgl`8x8LT`DlhJK`@NPQ;X)L{eWeE*4Jnp`2 zN$PFJUibMGbC=zyEzGm$RYyKJIF_=QH<(y9PS9PL!%+|VNn#Z<-0=u+S{Y){KVOF4 zMTpl)C53DWXG-{dLm=ThP%}Sr5n64GMb$FNdVGPrDTk_A$yTX0mpBGEuCMD>7yXQNyih zEe?_43@wP4#k-tj&j%&W3LV7N=}EeF|pS>}XIgoY+MkSw7-2xWUzfJq6Q1)PRBUWG%lbL4e!r71W2 zw;PR{)-%O|$v+Xe5o5o}7D(Fv7e7 zX=LT5g^s~e8;YQL?@~Tn}Ng#3vfdn(pi|h8+Tx1wN zlgn&s&#|^@a!V!W_AsI6d5q{zX^SUG zuhsxh0|^|14oszzk|02GtIZBq8s+!rn`x)^_Fb7aKib4TH_meTF=x) z3IRW~YI9e5k26+MHtO{bU-j-WswF_U=qCCp8*f-XiP}J1bPJUT5CD4DlaUC7Dnlfi zdQixJCATyh*1@wEI6q0zd0Psjq^vdFcLTrFm7N^hpN;0D%_nDi3k+7m;p}>p>6RgVVb5aN)~FR}01n@N5s(`sFV(F9 z_K}0<0sk{^c{TuC!iHG5O<7Ww9IUG<`Q{fpW^1H!lhG_lNM|H>VDY?y1=UfV{$mL^ z`QjlURN>+3)G)&TI7>`;TJTC;o2(v+OHx5rST*ub9;5Z0FdTP*jh zKzn~y! z>t!S`lq2;7AJ5@BtbwP(A)uMHkueo@0#8?~5!`Ql#6@aa!aAYYJ?GotxJqc55@ z-X>4{&olnvXXbKMvq!PSn~k!MkXK*2csB`iqs4s65on%0@-}Q;8e}rN(D6Gqpo#$9 z#+8G^9g3(w4Ks0h%h0dCHr{#bCe{tB*ZFh<&ycVS(*&eNRnOaXzf270b&`WoQjC>< z7g?d)@#5By!Kd!~xaVf_&MZA&|a`|5P#yxO^V;6-B2&JO_Q zYPYK?A{b8Lk!g4;Hx`om-mcrKQfMA2%;UudEOGcMh#DF3w2NrmgF;Amyqs?uSv5oL zKyCprsexm3bv{EAk3_?05$7^Z5|-}Xk$APA#fVJ|a%COS-k|(z59>rUKwdFL_^8a& zC5Z2YRpa)DhVJ%eMN1{movg@!U{x4n<<(>dRpo8Aig%{is0!ckt<8wmQY+DaIf9>wySURUg#n5yJ&c?bKKfug~A z?I&VoU#ehU5o|zu>$tbDdU**&Kkcx;f0o=s57s1WTan?2%9dkhuu#xkG41A=A!bjt zvJqUl*yqvqrO=^=GG=Fpw!~SJDq}U9Rnr%fvua?rrpR~MYd(vv_zcJa-vHU!W zsI1{nGs2EK#Vmqrbjlm5%{cL@U#3DHdsNuLbz;^9dU39$3u77N_&k2rMH{&WS@f}v zK_GQTeldL42*P)I=`nFpONGFs97c5?SeU!t=%nt>%pFmRBJ0e z`~NN@_O|Ck;Uv?>6nYp*{N`GYM7QoiP-EPaesfe`JB>~CY#bYe9Z=0G+l#*7^#XYh zxH~g@qOc!E0y`Jn53$oyLxKY>dDJI2_yXHLWAl!Gdme zwXlhs$2R;)`W4JBipkrl*PFXjlB8BG_ zd@7`j935p%7!1A|JWOQurR{&IMR`*kS>xeEgF7iv7NHaX=GtqA;_9b{RoEyJ2tQ&6 zTdZj`bLYXa3&gkJt&^k|{338_<-fyppg-`TujA+RD4z_J(q@++?N#A2nv$7M^4zu+ z90!qa$aYevhRlPZNM!Cs$e$_~wts^QILlDdFk{`lUc2nU71s$hq6vek!-`^~#L1O6G zwVG9QIMupx5RUlFm)o@7oXvKXkbw~HVqR$vOvI(1#K&KmSLlLGm> zN#O~&pRnu_+PwfAq|`Kj17H(F2Z&sXwxewW#D~7!X*rvX9F!ZMF=o{nomcE$o+Z|Ed|Kpz-|~oadkjc^eFvT& zm$nY7C~AC@LcXsSZ*XuQ>@bIxmGWLM6{VgDD6=E!>x+LdC4R19OArXX}Aq zMT|zoLmP-E8vQR76B^Ozk4*u+sVvn$>oIUJqobvYF3)*FMY=td%L`O1{6xB3!5Yjp zI5Om1m(%Dn?eJfC*;`ELN(e>>(xUl)?Ah}4!9YIZLn$09J7u}-Ws>y+w|Nfrb)}gV z?lr>?c$>DE4HD@I#RJK21$;90LO!Eq-4q$l`6V8;dJkCVlH;9bvNUb|s~-zT`kKSb z-obONL@UW+oBYP~MeGv)Yr2H&py}5_@<-Wrc3Kg1c!}1k({A#gT87z(CQ!#j@(+c~ zU6{Da(g7=KoGEg_b7LhefIM5?&FRral|^Ix@O%5%n0%Rqpvvtl6?Tjaa3A$X9JffI z@>Oq=3mZhe7VTj+9=zb5`oLmLAsoY|RnH1Io*up&7JhjU6Z(05DjRr zemKIR$+^aKM%PmMCU=$Z5fco}@I6R!FJ_gMvslF9mx07gwx(!{f%NX&rtcI!BU6Dt z5M;C=j;j|YzBK|%P&bQab@Kh6Akjw<~^z44@! zhp$V82Gi7y6Oqd@D(s2U|1|1Ykjnvm7p0`5O?~c#eGJM9+4$NLWHKnXJ5ZZy#vzyU zk0oxdy#{$cz)ErajV02yvokhe0|Zv|L|4JzpN`HHZr^4yW4RSPkr_riU%$E=}3+Mfq>sC|q4(a65=TM2iY45d=;L?xiD=1}1b$t=If5 zw2Dq#<&tQ}5vCl73j}NOt;vvKhygG$mY8Hj5y(GFGVzX@u>p4urHH+V5p-R8|8tCS zrcOl(4VF1h&tK+^!-;RU267brKWb)4mvBt>R5CY0Z!#xEBB_HYuBk0BQmoSYL!q%SYBC?6?O@`AtKX$$67I^zZFutl$X+L?C&Grz zAcXHSr-Bdctm%|X}HO2Gj(dN4KHbP1KYPCM)n>Ugau$c})jrXc{(;QhNbJ+OAu zP;z@RTR)j|gA`nQnrDJ}OAerNXa9GZmh)&DYAxux*AO^8)X$Pk2%gauYEStO0YVJ2 zvTTTM?~7Rd@XMWn&>A=6)B>Hx=E;q^8QvJIO*TWpz++0V+OvmB9NNQNRvw>!jmmv@ z)4T+@^kvIDk(jcPXFX-9iDN8%1W=7Tj z6cIcUzMDitMtk)wE_Ea4sO14~<)u|#O#@jx3LamTo~C(o?Z7Iy)9M-b3={moh07xO z7hXl87aT)EH`t5Q=S?*;qrCv@1w$iXzy8wHC`H`n!p8TNS+?wkYFU%CUfLUrf@qBs z7SB65#(iX!u0i~i=NZoly62&YCeCje6K&xrkdWf%LMsHQtY=(KoswdYgv4I*&<=+z zu}jVi1m$|;eDpj8yhkD>Aw(2)V2QGh@y_dN=`s*+@B!e=ytG5zeIi9OxT zeI+)&njz@%=d4nQF}iMGbHtUdo|4W66w?A|vccD64>-8=Z{q=$2>iRyQWw-YZlGm4 zwy8(;a^XAFMig|59D%JnjNwn1kzQf?+|BWt!zrI*>W5qN*tj+&pzik7lh9qh%T0mH|`omEEpU-BxtA&{tKg{D*63hf`+4ZWItKfLlpN$ltSnH$6 zb%_m|5obNxT!5Q^vL9|r)M=BBo>y-&J652_0?nWzP@;=N#001cB!DJQQ?04~&8p~Q zjK0?>w-By?jr8R=?eVM)2yzLMc;9VQA~FwV#eY1|>ldg1gd{&872D0O?vu;e z{QB<8a_!L-O@_>|>Xa#%A2%roGj_b9wLY6SZ{i=l*{7(9_JCVpi3mVN`(t2V@vt^zT+ z*+FHryJk=^o7n!~?Ra}okGU^@D~Zoz6K3TO{O3Bx4#x02rpIgSQcQcIgnB6Z+RE9( zX^J92-y1JY;#+v%qjz! zHFr!V9!3F24eLB=v+EHY+LLCKSOOcYNaLEh=>`MX&=HW0DZ=?&2!n}ysgLr6N8F9< z(g2^pqLb*q|3BV<6E(_)P3@m7tA$)9fsTOZttkZ~+^H!Lxf>j5-IkO03`ojiRX-?) zWMH{tbCdi&{|`Q$WrG)#orlnc1*pYsjxo*;R=+@voO#F%KTCgGI%Sm~7G`62uXD8wx0R@sCoQCvd$lBJ#cg{i61iHUI%xte>_U?4fTjDajfire|02&DgU2zzMU z{&(c97(%a+B!6N%&N?aDZPWK^3&1;isoQsX${)7H$s6!2u=90RFWea#D3*J%?mjr{ zy#~M|_@shy$et&-Q8QSo`NdyUhIVJLyQWSq6e$oseQ0vorSIkYVsv2N<(bji2IYHC zM;0dekELqp~sFkVM)e^^>Kh@;$4PA)aQ^|c* zNTF5u-=(J{7Xi3%7w{i99SeA?KY5b*{{GK(EPIQ3+d>=E1fEA0r8Nv}V-AnG5W*<# zPO4xbEA5AnPlORYlZQ-*X@%<3O3W?VKZWbF_0gPi zK^xienjcaD%Lc?)0*B?To`k^1-~_>~e=oyC2spPn+}mthDAsO^MyMbb z;QYTee?Keq!@ghE9|3PAaF=e>7`cs94a9={d!!m}X)k5xZz|Z<%8j0z4=*}c`s**as+Qif z{=*krd*Lo`@~y_dBp6+t>W5uq!HH{fY@j>qx@{x9jZ4-iiYLV5%M0g|ta^qvbG_gGGKsO2-IM?g3E6EK z$JK`>Zn{j^ep+2d5QEY6nJ(4}RQQm|dwKOh3BV4<3_rz4Kcd+<&OJr3bC+d-bqZoR z7~EJ5C9*yw3W8zo+#(e6ML%bwH|JHavuCvmHzM8}F6O+Vo4A`zjp08wBSpW(AK6&e z6g}_Iz1Nh^7)=)C8!#33KkKVR^*v8p%>7a{0_2`}fc(a}aV@ep@mMPY`^pAqchaRY zrqlxUz`tHSnv={aOEx{3)7_25XnhE%Nz<1bw1`|8A!vE5AduCJnUODR!UW&wq>@HQ zu0vMw21Kh#vVtr$@0U+4+css9*c0_ESPxLO+zSR(E8B-fgW9+!dofMD6IY!ch%zU0 z$Z#c}JE3M_VAw}4gxR?i7898P0`F^I)YB!hN_NG=lh(k(iUZmjSYaBpC#F|4nAU7) zIHc#SI0O^t|0WUNpS&(6PC-|KXG<_=vM*k2G|pob_=m4i3mTk%0d(Rdk3maOF!Ms9 z2_v5@p!Gmns&`2qU^+3?LL;+U7PkttV&U0H2UyZZKp>|wDO31wI_3`&-PS&1X{s^T ziU76vT*u>li{S3eSKZLLWzBdn6Mp2OCd{0~4mN8v>20=qg)9N?yKT!*`BJ z7wv2GoAO~4qpRy&o)l?aw7K+cfdVBL8 zx*x&=lAcJULaY~?-(5JaF#L14*FXmlHvGaK3yqdU!-)MSzAXWewn@AI-FD;;J}!tb zl*ul08|LzJ1REF8CUK|SR$yXmPoh8g`;R>rh$yiQXoZ97l^wjC-D4O zx|Yd)TkN?7j1Si4CYzS!n>iOu51=QUwr|d28-XbB?#vcDu03y{ueGw4%i){-AS?|K zG=D#X*N({*SKr0@4U{A8E-gy*NT+~AL2=1`p*t8CoUJ?dB}u$VzX1>`OqFUOFY#VW zG)4Sl=$8Z{o-#tegWZ!J_U&lPf1ob`)i0-spJy{vVVIBNW4#tH)6||SpIS| z$})AF?|&Cl}Ogc-MFrY&sykJ@U8q}OE4rUe>S$Dj&Dt(i8Zh8WecH8^I2{nLzxq{K{^y=gplp!tB;GQYqi6uTewn#OHvlMwl~i*73_XXnJCR1szQYMI z#qZSm)#7FjOPu}+_QXSUmxLw$^7Pa|bQ(lnXF0*~M4GWnyWquaIYm`aU7))$Kd%pP z{&Sb{k>+zQ4$?jxHhhOwcp-8Docp5EI3VXvOhPWnOqSQbDBJ={Qvm^g%NQu#JlU~J zXFSpSJm&a59?3$aBHp6cD+8E&tU3j;((42AJFQilSa`k#$^v2~=ZP!8;RnXnL5EA@ zE8C)~Q_UX4x??@jscQqF^bnhAtJiB}m)jJ~4lOH7Mo22gJ@drZ;4qhr&;C8ytQFY4p@-msSTiyTKrP^&=WbR7`5jiAT&lk*o-@!Y6qM z-}E_Iw&Tdz!g;-9!*`0ysiz{|>r(?yGt=fM=k zxe!|>Hq7YIb{`_$_y9q9uH-8-_N2o(myJ+~=9qe}sEx= z@c|DpAJt`UOptD^i#m4o%!A{>v!MmI`$JXRaUPuG zSd$J%$7!3%=1Ksjew_a#9v>0{4;_4TfudxM&D`$TOk_+yvh)eizybt7<1_7QLT}Y6 z^Eqem&`EFJUkok{LRZ0Y`QfrYl^yLh6F2=4dObk%SrVx3Gxo(K!n(1PlM#*CJXLaj z%c1MCu=Wj8bPpm3xEPu4Ok5!iTpYH zHit3MO7Ic^eYW5I?}#W^hLKIEOYyJg-^pv|JqobB``6_|4ZQ+6%sf^2u~&>V9Z@T$ z*GdfHN;|eMM&O+Yi_iBB>!lSAd3}h%`3ip=v2ptC-a5-kSSxz@tM}O+V}sIycn9SW z4SN=8Yi#zRV4_dG%(NnZ?tQ6}qlYB$nQm)kBS5fQy1rXHKVhxz(DYD0Z$RH?RqZw+ zA2Ok^XLkR4E(OQrd6mqfJ*V*mqIcSw%B~*s=fqDm9mEUar3yBWD6PQrIMC?@o&K07 zV0qSi!jkp2nOmC9z_zQXI$mw+f!&v;MLrpPB#;_gzi^&#w=k)~VFHPV~S}sXMtXoK0Q^;Q?8nqeTkH z!TussP<@;$AB23~-bmN2A3(#DJWoVOl$~zNBPWEoxZGM`^l9>~f4pC!_@ZseHpK}th?>?5Z|}cbN2d0@7wCH`+Ly+ zy}ZNW{Q#lx{qla^*ZF?lum3mGkG|hWAK}`S^?Dlq-u|z*sVVh$>94EMxAyvW@7wF& zeO`u)B3@%|l(-*2ktA3xJ~_;+!AzM_}g=+hrRt6S~#-RITn1s^}v z)4tzjJMHun{vLp^`97d9`97Ur!@eNl;$q92*_u5TGqG->Yxo@Ibb3K|Bn?uL&M7nx z#rHJ5sIMxmj98V-R{(K^D`_mAHT4x%{sG}(`D^rTJR$8`jTOfOO>69Av){CU@xQ%A z1@#i?{ggDbaD3%)miCz;58-$$8W7twKN~n1V#Wy87a$InWW!g=@X#j)(*gV4X+#p` zLr~sy4yd^BUu{~7t+B52C1fB38xPB7I?`p{Bab`)!_ z-EQ;rvbba^TF~`^Cu_(xeTCEdraq1 z?jW>pjSMS_N$!vLF4q>?%V2g@qKk#2lH#gJa;DT)7peu4vVX>DE5Ae_1MSlO7=GwGcjYbjBu=Q z1fcb9<{(5-2fq3m^;xx$QT3AM0|uUCQy^&UfNC|Gg^Xn0zMxqz|3N5%Ed+S9fkoBC zV0!9|lhgYqrvEdB_*o3d=<1CFZ^NXu4)YS!GR<)9@!?3Ix;jt>FK@i#9JZNe(zAY} z=}5a1Js(MJYRDZf=hy5W=@A*VYMFmIGGCW@dt(deq1K))7JWu?c@WXIe(wqRb?EgW zFTPC*bF4~&x`+-bV7+2uNa$$(0pZf);&lBaY4z5(eJ&ZY!WPG-0zCANJkfS8OKUnU zaDLl2!zJiZ&IdE%etf`qmB@ZrJ1HhH+G$#sPddjrkvwZ_kq*ydhmFowllKpS+t~^C zZu&InOj$P>5YvcVL@I%eFhp@OCCCc;u+|MB%);>45_N zPxZ??RI__|b57L6T(_`$4)uM}hW+}ve1QJpi3K`kHruy=WU$LK6WGB z#5c$%ON+ZJ@>#z53kmj;%M8~EtyWq9AF0l(6;tE!fA@7QKr}+=37#WTa8Oel#fWRK zxt=D=ur)T=?Z&*|4X`eaDyg2H{~6hrWzK%(E4DQ5HO!Bub*f39YW#MB@`@QWsAwmjMGY<5}xT* z0pR1zkN2n&Tes`wp-S4F38n3g?=hiqjtt`e6yx#?8U|i%`0VV?oaj zevv^d5EkZnx2Uufz#WLGz>HCQvW~iyg8+RWdgVF@G*CyQfrs1D@sePeK6Ci0CJj$= zDd2ZU&E!ZMMekw!bg$;R80wv*78bRe1$R*GDQ0+NND*P)^yHPuz41<@Iu>kMsIqD3 zCX*e$$u($ZLPp|KK~d%F&PzPx%AG7X{|mwG3lmdtjLpuNtuSzth@HZxtVGBbRNCS` z9nsrOytkRaaK0>fhnrt&?@z}o$`SnhM6$wsrTX%_~r6onOn4N1qD1fQ`S$^Al#^1(70hH7ySuJqQkhxT9)sf|iwJjI(rO-NQ^x z{kY-8M`zJ#)a%Z@IH{6`CKv7!sR{QBC9k~3sR1cwm$AA^%tp8=6?sv3&Q7v5is@Ci zo2#2B6e(dOgwDO6^0Qgd4$-=gE*OUR)38^JG7t%6QvFT|#c(VbGw1tSr^yIj|9w@S z@8sD?E-YnADCr^ii_EPUf$r^OR*E0y?$m}Ic% znb-<3YOHrfbD1dNJu^^DoB@j?{A82$zlw4ufhaazMgvuGOAh3NDXI#hUZXrE(UgV5 zN&=EQx+&!^R+4CeBAyeIJrTVa?Q_37(Mu2+cz5!lMEqWv3Ip*?Q9C6=_EPvWiE!dW zCx;Rq!ZcwI)7$WQOxPlmVhvB8J_zk1awArwfCr?@F#*sUS(#b2wp^goD>!dPzD3e! zTt^pAQzpnmF0in0&_?BOV&DoJfMnX3@F_4wp~CfkC25DJunFwUjW2L11was*moA1$ z1^PSy*Z*;LfB2O`udoj}rvYyCfuvqjbzrKeb&3IM6ej{L%liouvMIY>VhefLFu`l{ z8nZVSws@S7WVjmuEO1(PkW@p3K5{Xa=!^eVlOH({#PpCD$~%3N+WV8PT-*)&16G7P z-K~0tqf4#7Uu+Cg+UuF*p{s<~IM783ra?rmKY0TSV5$dcU*rwWT}9oP4(=34>bMW@ z6uP~>GR)(domjs_uTpSF^^n^*47bTtRK?*0pQU^s`k(jy4W9j|M zn^JYLhazENAlbNUk>$OpH#4&zng#F(9EsO^JaS7xtPG;`0pek516@DiJsxZ z81~$PSk2z9%sZO)Gi)($h41QgWMEZ%ddDpNJ8lIoVZk@A z)fxPAp9&bo%37hBc^2>!}ufyl+Yz2gzm=Hw^t^Fq}1r;%`Y36jjPiZu)Wd0tm} zT7c30Y&7hc8P2*nnD}I=Dtka04JadHFyib%=|^2l<)ru=S7=mWkj6!=cFs#@3R^O= zd5T{D6=-?cBzVZ%mJ$Q)XG`67G5&2@HAzmNw(L;T;<7k}9yE3H%WCoWei`lLMUGbT zWq65oztDZFRsX5fw(dh8t0K6pZ{?_QcE2v*!XY&s2PyOrL)>~aVN~ljNYn{ z6Fmg}Ti7MA-(DI>MI!r!EKpL?^!~{PDUQmp^fYCWSi zDS38jv=d+HZ(0gWV8DckYJo}j6nZEA>@Bu^5p*(>WM$x$0-p4>#mjhw_)eN1< za7U=dx=+tq5i!Xc8^+X?pwnya6{&rGtw}kX$Hpsx9`sKkuA7?(nZ{zvk;g3hW9X~^ zPDJu$;ROtJZ5lYG{^)O9qTeThK0Yv0>4BKvrA~Pk7p=TH^{`BFgemezw*g~C!^F6N z5IZ5@NXzoL#2wMA@OwAoCEU`Y;WvGz;=e5JiA(66oifvXOzr~{<{JJ09;E61?QR|~ zYGl$t=CF1|TAgwIc2VB6WG>NYk@kUMp_?>Us2tTJ2^7GH=P-=bU`w_n0qigCDGB@e z26`|h!HG&s=Z0T=3A1dtD7Qnl^&7A{AM;(o&zgwhgm^tRKZdkHxZCijmrLb{qJdXxyLN9oRA4d&< zU@;oul&b!d{9#XnD~Xs;zCNLlP(;ppIjpQVe0ey)+DODZ>w$qwa$=dY*2`4xKC&hE z4x0)lF`l8{&|a5RDOnrJwBIkF)b3MWdq8pMv-Wb?-?8e+G}**vOHvjoLN+j4WGl>_ zTTUO+lPu~TNapTm5Gr`xxFz5|P^heEO?E4i58)cpj=QUg&3v&D08K*5VlgoJHwO zj+2MWzwwC-SKh*_D;(H#e{oV@Ppyg}!bx5}CVdKLX&-lZe`-9_`wl*6GMIr;W`hM( zu)9Dc%9^UW^>C05*b-7WSASZrn+2>UQ{9nu9S(zJSzJUV;m!k`zZi7qJ$Z8nYtn(k z-efsovyA6thjq-}=r<9^dqyS_Ay!a)@cZ{SXBvt+@y`^wkgfg@dQ5Yf2vtI+$oo;i z`X@gZRukH=_g-Y&{}^L~7gDDCuja8)ex0eyhGdZkhk2XSB)bLZp|96CSBA^N3V;EO zAs4o3Wiw1Vti|$C02oO(0D6QWsFlDSnPTdHMr6N*%D#J4g=)_IjGBOJ5fVp3FZHt~ zCz1)ss_;(;)FU3+0I%ey$;fY@iiQtEO7V|` z29YU{G9CIYep9{{h|C33yk{24QxgM5Z*V%&gc;(`9sU!{#u@lmpoh-j=1~3SRS+u04`wWW3PT;#w*v*UM=*Mu!^e2rwpybcEEbUA z9WS4(;sU7ai3r2$=D62s9g)CtWZI87Q()a+p$zs24S291EMr-P1%7eBZmWmX7|IZY ziQF2DYlK89d>E}$3eUmi8CB8zilGfD=Hz1$>e{u$At=>a3aN<1ibNd@!^btWwHvEbBtV zik~7FfAhxNZtzw|j9!gJJ%OxdOY1B?LMpzKmk>-Xu^#ocaTn%m*pDmC*O^vh$wX2j zzZL25P%Z*-0ODAJoduX&ecC@Ec1(p$2M{@=r+=TGcsD%TDO8%ZV758Esa zi%&3%;leTMm5l9;1Low33>8V4qfLC>IY0UUdJXn{-8d2oVjJ}oN~5Ctb*Bwh3haUK zUbAb)^oJ;u=a~SWeu(6?;p%T+MVt|5FH2*-9qc|Yw3-srO^z6*V6hk!c+VNMWLJVf zGUm3yv#&mqF%S^=a_pfNgVWl?b*_=E=5DC6x@nz%n=<2SYM78{IU7fPM1${$O-eH5 z@F>Wyt+neR)Ps#q0{?-oljv?@8gJF&q`j6^D655wd(p$vZu|{StJtXiBVFcKs9*iZ z=5DOITS6H>OcXf5i*pU~AKizv!AUxFHN>vDmCLECd*NWsO?2^U`>C>nSQYjwMB;K8 zBxKt&@N|Fz8rpKQDQ6TucWu0wpCg!p^ydkTn(Phae ztRWUOstnxT3@WQvzC;ze2DlkjQ$#9S)C4Pv5JFz7d_cA;E-o)L=EHLxckLlW5?MpR z?-_Pdj`R2dPe8{_N$jPDT5nudJe3!9w@Z52S$=A)$y&#m1Lc6sb}8D#!}UULnNA&^ z5wyWMrnSf@aqET8ASCGl0qp}nu3iQEo+|eZO4g(wm@Mc%ItHVu;39u)gLU~ zMj{mCVtgWPWBC>$&5@sU$m&91cmRiljYY`7jBcSt26}uWzVp^rlE94=g^RQlBI`GRd?5kpwA*v$hdVDc-2&-hr#siLjSv|2X+)+Kd+Tfw zjjM6-7wCC^1;*hDPOK}h;qcCz%3?X`!+x6#vFy_rd=uml(o1QRJgveEks$mc=E-#(|9A%Bi5p0}Bh+l*Y}eT#_MD)b zHXC|QT^8-Oq8TNO;A)RfuR^(I&k328FP^`2>c}JJ!!IpRBTLW#30HL&Hd3 z=GxEWEc4z}h5eQ3TXs{uRc=6Blk&LevA*7*N(yb68chtNZprUEs_j>%XwET3<#i`F zE%_~)<*#kQ?vC%)?mWuKvW@eU;*jddZ9K+SEMh(5n6nYm}GG7qdHjlNn0+9sjr%&nvOA=*Kkkk0C z^J}IsBld4aM1!k|tM$*vF2qDjzYbwR&a=Tsu_3g=J)nwLNhTdP^?Df}sdj8Ew7p$X zjdVk~bha2z6Vl(6TeZ~|Gnvl-_v!(e4X|!aY*+;dz7J=KYW54E-jfT&Ht7Pg2Pnja z%hLYCzk>HJr+=};%lu@=$8bJK5xfuM&0?@Rrs0P#!rd`YV)L*3uz;lLTOfmfkq!;M z{b1?yncCZG2aZ9cJ)hRR*&aQzBBzi)fyRnw0qa(>i{uq4+>0*rUQD|y0sE>~v#IRU z`ww0+2yYYTfY8eDls}(1o7bXZ)i%b8TDh#hc*BJ&>+>44aNDI>7}1fkVnQ9$HGi{~ zh{b}Oi4O0JE>vF#e?9GYSjGF^v{qxG;1u)Xl0cX6Ty6P{wHw<#ROBOcG_Xd?3p{0| z$#`q5(5`RM*HzGtV{N9=C>-4^u}ZC^1F?9`Kd^InCo}b1~2YtJXt2*=9 zqf!jYb5W@+fP|F6N9uMqqef1CT=>< zeQ9;3FwistIpS-Hf5VrBwN?r)cSz``FGq_B0oGwo8_@8*YdX zT|{lpozpj!h~Bsh4gN7#uXUe+3HZ`5qFECfalb1t@ktVz}Jxr9$(FL(W$71EgzK(y8bAfPv`-$)7b#W}hS2-nH zVzmuvGyu+8VD8poHB8|5L4s<}}dfS*HBShjjtYtkx$o{gWt~ zxLe}AJ*9L8-P=~M?Z|fzw+65Ne9sm8fX%@t+|XNo^NyC67u%_mO8{sK>&iH$T%ilPw%Pj3Dp5K2k0)OSZwusto4Uz zB+p6ye;G6DWwupLAmc9vtjxo0j8k^TqYX_N!ac{Q=ouz3w`lo_~{Q zo-igKhWcm;<6w8V8JEwWL3^Na&A}vXrbG$}!R)tnFrteSFIrItBEYbolujqgdZmt! ze{mxo#etoV#Fxo-5RoZxtE^j*X7e!BIZ0Ne0JB4Z$LhFOCuJDsj1h5r6eRsytSSq z6a=+}5bzA}m&sMD@i9uLEaq+%t_{+$Tx~Q3msDJTlZi&avX(R>l2WHGtI81ZPO_3I?I1mJvnXupURoKZ%x;fdu7nj zix705Uisp%ryHb#jlI=8mDZ$X*Ja!aVwxmgNG8D&TS>nbMfG-0yFwil<{&AAC zfXYRyf15y@1!YZvnPg7wepGd6m{LT~hFC*RI`Mf`~9R$alGAaJNF`7i8a30M4bpRz( zurt#k6pBmK>&q}|_%P{xO{DWmHmJ62{%+@>tgd=jHofY(-_M1ikH6FZKx;zB&w7~i z8)q6rxENzE2LCz{FDCZ=>oO&C|66~@ROYGqHvxfu&@$OiA7i{26Zdzcs8u;&sqpg+S%E@6D-{$| zp}J;l=|odOPQJ@SnCaRDKXm+{NStalN^+@TZiIYr7@L?OQV?(*hXRb3$0x#XUc;Kv zNtr9bhF#E{4FGyeR-}0?&T~$Ai{^w>+u#divLs}h_>@1o3DPKo8^7V>V6#1WlQWf< zgXTbPGSK}%3Wv+n`Gd-g+=FwJ!0MR%_vUSYEpBXq&4GFxNiTEdD>zpFM9(iGW-eas zfaL81l_q$1{&xz-N7ssGj(s+4Ea^?unJ}Nyb)k#& zd0U6{4y&D~;+IuoX@$`}p&!)4+J`8)qgGv=kvuQGZmHq5Ju3^~)J5kzMWGY=v9 zJ-U(ck?LDe&h4!CUPm>#CpQ0jlg5= zfGKj(H7D&8MSeBVn-9v^oLW0 z$3K$gV4Dqdoh9DuLVmg?=>5!BI}N=;GL~g zu`i9kbBJ~0f1%_J%l}T6FrcBuQ7{eg&&ByJSVS(In&NI=e>-za3d1Sgvlv{q;cAip zBm<`;z4`)NY8YEbl3r+hj^>ibEM-Ba8asg)f7-7-qbMFDpKC$j;RmO28uZ96uNBB3 z^SCZEb+BGl#Y1SR{j6G=#1NRRK17R}g)10eR;ybN>#6Njb}n}M{NbF21L>uc3Vb2<@dOD2zVy=gI8NX6idJ1*-htm~IgAaN>e zeRB_H8;6CM6UFVS9gV~3kC3-tze-wuCTv1&aj=#?ecNkG1fo6`THDStpZ;HeQn-X` zz`V!c*YeGA0qa)Jn!&YgQO~gpn24`XJNY<$#Rk zbPLMph!dc3t#ZejVRybM4w?{SXK$8rN8aJ2gM33^U)xgzq3;B2B28Io4v1BO!`KfM zbgw2ML+^6H((7BixW}EP>!v3#a)Z)cpcGJiO)0n6uShWmn12Yoh*U5T_0-L+W~;PA zyVDL~`bb2u?l}rNoGXB*3!lf1xxGKJL)8*#zND_B_>F7c*qO#!{(6w#yl-vC)C%dW0@;`%mF)Km$_10+n-w$b-09gDmC%AhK%;QTgHqV;hQD|xX8rC$;S}DHskm{6^SLA@4gl+RC$}_qmSX0J zNcT+Vii0ocKbVYzeDCB2smosfmV|JWo3iM25iyWSI!Qt=mY)OlljOoay+fe4NC)OxxMLk{a(isj1$&^CW4sE^p0Fc4!Kv#3xbcx z(w7JXv)1Zg9E@bqQMJQ=yq3)QT!@~v#0m;%~A zK~AjO83r1M>>>oki(dwv{_7-|p=;b1i#9g+)7F1@_0RtLcFvL_IKN|m8*_2xckLQL za4%#6HQK29!!s^;6}+R3av}2%_wzk+Nlp-4C;b zY9V38E|3qRu4c3D8@`uALBmvqWc)Op$hPRMWwKiSN5H;>LF$BcVouZVnmwd zI3`l0L5th4ra=Tv<3?{vu4a1IauBBK{B`=vtr0=ac*@@Nz#f1hT#DCa)D}~qjQL*o z@c1Qq%%^t$8Z|(A<%AB^1_&jf0WSp&nD??`t79di&U-rvZhnTPEEQYcJsvm2=)~mt zjY1;l=}s_gJm(qbZTYQ^F^Ln>w=2zT%Uz#GeN4ojTL4mBp;pfO{u*~02GiY6R@E!z zL_a5soCKr9q?*3#jQ|G^dCgMc2FGz$7`li8t8T?8JcJ`%xD|iscRzx$0Y)Hm{a6} zNR+T5zLM$i0%7$L_O9Tj0ex19zdw(x>fhEe5j=Xk>ai=272>ZBQrp`0ht=3kjFh!x zmjT?4@$ArTPdmW&?9=5ZJj$`LJ^55^8J4ZWv(>r$)rt zPyx?QX2vs=bx`;|B!wt}7@uyjyb(njro{LL4|c7o9x<@rQgoB!u*J_9@{YtIQ7=#x z!Ee3(@i02)jbHW9ekCtv-4$Bs56;ri%s9C$T;j?;A1g952zfq5rx3+LanV2s2s8a4 z=*@XV%dMX2STy;1YaNb3qRdgF2dA8TCT^80GQRYfd5Zr7W%9rGt~SB6DucshGW0#MQ(*>Hxh4&&0ix^!MQ7% z#je#tjjVVRvX!yXOx#K3#S_q}r0wc^&JQ|;Ixx@H{~fT`DL>qY+%YJkCh(svOr~8F z#Cg0|Nhv^Go)y=x>WEwhapc>DusgzD&7Z*YyASj3K6ju5h`Y;NS>RpYWlA!=7)Kd_ zF@P8Ln=kbr1NaT+Z``3py3%+_@ACVO1C|*20Cam}ZyjplV5U~`HZarB!`WB2(bYIq zw_Oaej>@m~;;3e5g|g?<2$p;xhmGW+bppwFK4D=Gs1{Lm(pT|=K$ejA8a*pX8uk>I z^a0c&I48%wf824gro zUfcv>vTK9QoSs<6&9CziYU$c$KU7O8+BCZifB$)yw-p1v^W($;v{mh?B9HLS(zxIn zRKjInsbpX67{Y}I5m!}Fk&89*;q(()_O7}ynSOwwGAIT~hkP@k+?A~Gfq}@q?Zq+o z`bVn%Q^1xw-YWkDI26hhD!QC%YBTbA3U}Oi@gS=$K4!6L9y>|8d4u{;BrRD;)3sOu zxG|4l_iz+zJso7BR1$dQB2H;8H}iE)zn#nP>&dhK*-D`A+!MS6;zFv1Tj_|dj8Z+a7p9pq?%hJSSU*x zE*=nW`w1Ro&De<+|2h}3Oc!ieN3(hyDBT6nr2-dH*fkE~XJu*|4HNAJMtidHn9o-! zWcMpGxi_}AdptzJNSsq=#YF<4rUSH?_~8}96Hy|HO?ihb%$74L@a343_jkpV5Yr8r zT;!dcGOIT<5P5-;R)VaIDJnMJ*g-}K3Q4<3Mb!KI_*D9z8>xTyv@0YPZ*p_?Sci1H zmTFf0GvXkUX`ZcsgGa&tQl5&h)ChXe?#1SxmhQ*yCQPer|4BY;m>ApXZ+@&V)ddRS znTNSHZ0J17$yVB0#$#Y+H)Iy;(FP)^K5v;8Qv0@KnnjoSzu4yt^>$P?>G2z8_mxH=*K+v8wN;k(Dy}Rc z0G;z;C)RJB(F;B3=SdUS-m(g~2zoe@IL+M6UiWJzGG6Q0wYayG`rhDiZE>o1+a4f; zo^}Dpfy@b#l8RYxFbw#6uutw9;$NJmXYT!KWS@ex4uo+3r3JW7nivTZk~Awa^*N zQS{?$+tEjw@blTGVfODh)vC6}3xFSfCpMACJEe^E9*+Ep8e!qV`i`1&EhczoM(EC` z)lZv(%s(i61N9t!ktM{sCZApac>%F>`5U*;099{V5=Wk}?24@p&WL>H>vDg3Y{YmY zi#t5|e_X}BEJTyz^X{JNf{0x2b)%7xUIo6*CwKvYLn#m^^-pI~1O~izjrZ%vyOoS3 zR5zaruVTxQ)$E(&`}9rk@jj3wc9v;{-KF~7e!i5N{h11j4V|y9tZQS1VFmE(Zovks zH0BFq_=9+4crGPb?Rp~5B}+~sGXh{LEZrgBO_?kE_*oIl)Oeeq>Mvze4@92j8~F7Q z(ck<15{iH+G{HrH$o}=@Hr>endUGD-D?$nzlRm}UZ*@tMpbbE)MEWD#onA*$J5KnZ zYXnx@7*5zS5qRc{%G#blxXQ1sy)*bZ2FsD8L~(dO>u$&12DgZ5DJ(v=+O}bp(fjjJ z)X9F&^^9dKYE{3IMpRK1%-aBj8Sa7GNWoeB~$R zqQ-v1C0EPGV+M@FAimbn!Z;Ed(a7lk41=&f{i5?#%zb0ePLeI(CyI?hbKDW^2lzUk z^SEt$FoWLx`9d~bwfhfI1lb<2Re{hasUv>lXy%GAu^l3r9& z`x8qFXR3|1K(V&{D@x`uP$G9F(zvRSO&OdhKklZVCc^|ZV3bSaOiut;g06@p!66UH z!`)xXGwJ5pIw~NI*Er8<@R89fWJ-SHMhXhvx4^>g^&Y@jEG&G3Jvqn$HfWI@6O5b# ztYsuGWl#DQg_djI=rVMm=MW11)DVNKWDe0VP{OF6qr&HSOF#|85|CQoojV#VNqJ;2&{Op83j zg!Ig`SKYFECaSC=&X!VD?ZgaSb~LWekALz1hxa2NVH z80SyBsE)eH56z=~2JENZ_K!$kdgTZWVEY6u==EpmQ3E`9$6^s5&cc!;6xiRi^!A>B zz)cix?8RCH1L~0O>qM>rZaUpoh7G}0s*E1}S|jEaiph&GNuzZPh;(uzCRU;~WFaQN z%I^=5ZJRLtZ(EI7oMiU0Tekc zu#p{;rPCUTfHX|um&%ncY>^vn*jlYl3#oL{a!7vbTl+5t`O%T9mAI~O53o5N5Q5_8Ol{;SS(-DH%~;*Z0+ zHj~Z&XkO;g17DMlwc~Na*tf&!N)giomX+2qu&M5w9`DB#d_8tR%e-viV1SNsOEjGb zkWMMiLb*z9GldtSz4r;~KmQR0h>mUao%=Z*Ce7+8qpG|m_gyO}bC;h7$B80)REq=* zEK`#8C>Y+)PtP!Zjd!q=s+a3-i!gv>5;P2D!A#1sPF#wa72yhv4JmDe^w z>K-k6fde2s3^9sFyT%Tla1Gqz=rYF@vgDU#cCv?Yuk`&hI(9s^PX8=k4^~cq!>iuf zm&d~>mUr%t7No(R^xYX2`}o#IEdepM&EbqRKmTU0qpavrb;JrAg~EfBE_4V_rPuD{ zWO$!RJOHy6K{Su%NyVHiOBR=^^t|0W%3@kQVf@zFPl_^~eO$lUEU%Tgt`wPSTzChu zk$TidHz;E!@3=wNFAJAwq?<5T4L!h`JxlrJ*k_Qv^cNR6;8`c7iDEY_9 zuVpKXx1^mX$9DZ*`6r1Tcv6**#V~}+m$^A);`|mnPr?%( z!b=#J1S$%oT-`^^LEopb64{;ned9)tN39?p!clA=VJy*HZc2Ar1DW5QBpT^!Z)HUd zQe^LQR~T3rOFf-VwpOD84E&j?N)jUF=J)w+znD+uxD#)xs>rJcGDKm@0>t_FJQRfv z*m@A`#WlB>AMDDv-XYjK3l!wY0AD99l@_gXUen&quveEU1~fqKEmoNz zbe;xc@|^zIJTXE)+TEu|AJnBRS!Q|0VQ7UqoXE;`<}bcBb7DG9!J{vexg>mC+3ng& zNK2OTv%1Bn&pIM0w**;0{#6$S6G*-vXJkcVRX6r6!ju-be-aB11w#hdeI59c<*1l9 zM6zsXcs%$bt7BB%)EX|V(H`1C){{$b5;rDkAkkc%d%a+U6jP)d%Sx)d^L=eZInOLS z{%!M`sj{LsC@rGV@2cmB-r(5=#{zng5G<`aXI=BimE%_gdmuSOKWP6Lq7BRxjT#Kc zhN&~p`{$-8qz%IK;Gt&p8hoo&Eyaq%tF%Hie-SPn1{%1MX<#wZ(AVrtc!@!m9gH$K zJADi)s0Ii4kFw^JZ7YSp_nwfADxA6(2V44mw(7QsAxQr=LS2-r+U$<>j}cTrrTt5$ z!cv|}E@sN>EppMaKo;=s%x!}6rUJzUmS`~)UJ~X!ZJpjl8SGP|;7|n^8>N&|N}BjS zvyjrfSGp1!Klq-`RkV3-6c8E&*ZggJ8Fds)L?mJ2l__*Q*qSr?Oksdd<8ZS_6?{(j zMsnZ;xRm42_4-Z*F^1m_R=R7!>!}I!LkIsOdh@*%7Forj4*v587(_HWvn?Oo`=8HC zH8n}AHR9eB&-=1HYoK?cy9yCv5jdCRuI1duaN_)QJw(ZaW!9zM-~$tg?$Kg*7kf6_ zr$Qx|a3V3rx&yiooKVH6A2FH+5cS1G2x}tF5e=-Sv^8=$k?I}A%G!=F8mS(xdjPO$ zktM`rAWZVkn9Qp$YI(Q2UR7{auZ_vx6e9^hus{;`dxAHpFwHOXXBAxb&QCHwNi1J~ z)zzYO`@tN46>E`0Hs;`3G>1r^)@KT*#su+$ffh}|E2Y*N-HTW#>4nFTNBbFvIunx}KC*CaA| zkV-nLe3=j*|9_U`&?<8V0jvQCfWO(62#EWKCmZDL%!Z6%WTnTkAVv#NSIjS%;1&yS&qY zWBKUc@69id2^P)SK2$$}2Sm0I=>i8%P$UCA=IPt}UlzY;U0=vv3%MaC25pPVl1^i0 z^Y=*qC@wsa!MDjIK`5i`eo3_o{>AV4fKuhf=@*uwZ?j~lRT3=+w}uFswy_(6B}-Ow z;sSNIF@hP3=a{HoE@I4?(drmABp$YKoEK@mJ>Qy-yCDozQE;?%mmx69h7JQs_`-kFEldLaNTafue&&pz+VR$vof zWzd2M^ik|1a4*5roFEh`lw+}A8zXcxOBVqCC6|vB(t>NBYLAFkcP+NCY>L94#MRDd zrd532t4u@?ckH!QQ!=*JiU&6bigxcC?b9S;9r|njEU00f`9PNtv4bL|g(K71ZAviM zzarde(T**@#DnsxKQd{FQv}V2%k}f^h^*}~rh){eTb_H#YBMSR! z$L@FbGj&_$Zm+-OwHUsN<^Fa*`s^(q8|8vyk*V4cBJborLE**OY zKLKq2ajN?7oF1E$!YEbRgAlyFo|oSh%V|ZQ@6Feu10ZcM2&1uwbehv4jfWWy@-6#t zN5(j>IM@da2GJdAkYG}Cr5+B^D+Fz({V zJB-p^yfk(zVD*oPH}pvoE)vA&0^b+Ul#AS{e&k4nx5G20pPk0YQV)bOO$yL4jUC+J*Zz#@{(6C9UodbL7= z$EVl`vGF;ci5K4Mt@ds)HJ}F8 z;ne;vkQMFf6Z4q~wX(sgCYn)0JM$gZTyemFe`4znp+0<0HtV_Ao=pQ(~u z$QNZ24waN-3@pfoO=Sq9+Ns;6kY_PGeq3PiM+&OG3(#)KdP1@un)vIZQ;z~Fz?Qi> z^F-wpq|OA9M!4vEO*yngYBECUj-JL`aDuCx(xgtt?C{BZxDcYt;#X}F%duGvSZ80i znK1Nch~5*ovdWcyj}xCz79E8MV)J_bIG=YH&mcA5xrhy%@+7n(@b85vkxc{#+nW%O zZk9j(CWHt6P*--B=_}m&B)RE)kw0n$u}WR75e4?G{9%yc_c_}tapLaIM#-I={J$fRHVH-_0vuhPfp{tB@aq8?=1IULwd*kqQ=^` zAU>PQvt0X-+>*0F8)9&c3-@?c+YMLJ3@ZL}7!z(UxAoy1o=7}QNH4g`*ly}OJZ?2= zgwat{>48l0r;MOooNYox%(gm04J`;OHG7A2iZ+zLs$cp*KjJ1Q z{mX*Yd$K=(k%e3RX-k^iYTK#txQAeIOpYU_dhv9E000032=}z)5CCBwo5ZRFTd!QD zGsFgxUiZDC<(xnE4O`%>WPx${qxRJQWiLq2{ufePgVoOiJ)$~@6rAX)0fDG4tT>h2jp<($!6#!xCW8X>z2$>Ta2=7QO>BBy{Q*CC+DQDF#tKw2|S7gpx) z`u0~@NRyPaAG=2`<>!Jqm<`4iYaR`~{a{)&pnnT9k{g^P2tS@{Os<$ZjxeX!z!C&C zqvB6VdAYv&1w@@euemhbHAxI}jK;UWKNh~BJ zku=l0=A!LiM96{2_RyD4=4zR)GF{bNW)OrY2Ve@+_zj!MjJLD@YRab1!>$SR@_b-J z(k}D;1KR{zTv+X+P{?RoLJJ{wI*%*9$!6BK%=9SP7lPcms4S6|Rh840(X5hZ5JwAM z;iO3JwYZl;WJ8pXqAUE!v!$Nfy=32LKVm<0(8iKV@WPcIV0-;5gGB#!a($5Sf&A}{ zMe19GMx%OP6nQ4H$<%`aw{~tQci&Hk>OtY3GD;ZGW;_Ke=!yD&^$`@GNZvfrix0Ug z2e0zl`Z+k?+GcRKkt_S&vJ7RVh&;4P|9r-&0vqrycGObmf3SXc8#rApf6KcW!28No zJWphO#1O=Q=Ty~l5XK`3nn<9B<%}kYw^wo+W#J#e!)+Sbi}&e@)}KfXRyh1JsNV`# z|5M%+cxNn{_AWO->ITm)DkpN_1*ars5j4V9yOy_Sds`MiCgKN7g}IzJSss=!HoTe& zB{Qe5lcqRN(4PNg#KPtvap=(Ln&9$1;Sth{!chwS8(;PRRo+$c(!hxp5uz5e#q_7E z69tvwVa`fqTWD=|0@BYSyFx9&u|>GqX$@wxYL_trBofz z-n#JHNT?Ptv(&Ky6vD_n33{k^=hiUx!WW~C$78k@go+bOsfCt_mAtHU;y3;ENjC#W zA=%5%FA>w@pwWT%Au2yG`5GO@d+YcGCOA^tANC>;iVXytAHs*hFbR5rCvX zU^t7ZETAZp_DD7A%)ru5-Y4_Rnd!Vk#(K&e7@f`z5&Ep`_r(~Lb$RO3KIfb>fT{2RMv`% z0RXr8R0IbVmf0uPMSbEze+#>AuRcjVYfA2B zVElxBam;6{)h^rX!#MliTKGcf^ z(%7*<1K4JIwvuwiMJ?Eo@vtPNY5*NsA_$O(|^l`NG;cPIGK(VT4v~8W~}v3U;sp$ z3NcOWi=VJNoDxYFZcgZbGns$PwmOTJ{hbpiTdd`$RV^Zec^v=%003bj7GVGY1`-m& zeV-P0n*LT8+U(P2vQxJHIpfF&#cTujxNW752=Ce?aAjmNO$OM*FSO`gLzO1@9wN6=fxav|8Q14ew^z2 zbZ($aBmJt(CqN=#%tU5p-~T4_`V%04`ChupeItd@c zK}!S#alq32%SjlTpfklaeKVdrUY@%ykHZvqT&hzEF9XnxU(aJ zE4|!czGtz)(Ch0)w9ahW9yt!^#PH8vA2Ty<0qY%ehW!ls-n?v~-1giekSV4~Z`8;i zgS4qz-xL-saxJ{zSJ;u-PWn1q1BExR_Fw%h|8J}_>;zg+`NjtOc2WRjJqD?)hcHfc z+%82C(0Hbzp1b_9#Pr7yRS}BA=t2g|o&a<-v!VMZna!6Am$v^7y-KcU&1}-?Cxi`l zV+&xK6n&&1Qgz zuF;LRPPG8?UErmnt~8%8y16>z`-E|DwYWPiwcYTsgfusz+!kRB@0~_3dM4;~W6FHF7Q8?yWH-xr0V=j$hVq(yYne+SK2ESs1rL(st)X zAPBP)HHDOgk8?kda>r58-)}A;55t5XjRqtxy$$b9pd<3W#2~ArZLsB@g_P!PN~Yip z;PyKLUCrPwBmo8U7kwe8uuiAHFXTl)+PyAC<^2{8^;xuDnYSlPm*>^$i zN-H6!1=WF~Ew*!+a?*T@97o$HXDA+L(=&;cGf?>mp+yi9Jj+6!sIn5m%2_-ewQOX@ znmgKVMqWe~n^S0&PgCc5Rlfj5n`k6v!F3cq6S3YE>K|*ME$z$bzS|Eq9D$0qHvrSO z5UZ7nZuo!b*i6S0j$s;mxi2w0_lI=tX~Ko$*_+qkjickeYvg{U!OlRjheoUl7jWex zn|Vx4>ziBwjvAz&u?w}NP*>@sig=FjyV z6#pDHD$6KlXj!2jmo9@zF5|i_=L5F!40`Pwv zD^@fu6*3tvp#c94o1*Y&_5f~fpQX&ze4sek#Y427u|5hhLWkas&+(TGx1A8FNI*CW zmh2d{AkCvLm#)&=D@FG}@Fi_7f|+{Rl4(5)ys?2ctZSm(lz7~elv(;n|M)p+Z3 z`%UPqcaK^PV-TE`{W`-iC2&<3Xf^T0BM@`i=co0bNm*)j--EH~bjY`x1=dizGf5>& zwC#i|+Cvv01j$y^S79mcJS$rwp&!NRJwC)ZldDyYR8X5R6DTLAC?Xp^hP{bE7$3@=Zwv`mzz7`HxB!pv)X-17!C5U72$l5RCu!m8!V|H6adbV=ZYVF$iDj~ z%Jim?oU6!A#N|RVqky>-kFmIpXCr};!}X>^Ha$Wyju@i)#Qct;XFy5+XC|-45*-gK zc`A1%IJfY|h|*Xe(2;@I`aCyuo`+Da_RR#4MO%Kn7sAxlxY`3GJ&+*YaS0axc#v$r zr3WL*Wgm8J2e}FaustxoAlT%r3Q9iNw_nYW!-@`!eE16}C=1`Z%M;?0Kcs*7UX1c^ zN^lus_Y3in9}79?zzBqKF~)>aw3kFN{>{#{FWc=_xusQh-hzVN%r6g#_%<$EuHqr@ zudTv~1RXy2sx`6}soCTaLG)%}3y;5bc9{-A1s?lN0opQpbB8Xyb!f0e_2rLk^kbld$`QJS>)q3KD@FT$^^l ztXCZ2#(j$ux52oCHftaC>?Y(I=t?*u-rf=!CyS@!^|LoW4r%~`7b#Rmry321fV`6d zR#+@D$7#C_8f<7s%axj2vg*8wF4l_0uIi4^8QAQ@uF|ODW|)>1z1Zt!!R5O&4ZO<- zFx^pxM+#*;G1Y_Ut>k7+s_|fKdS40NY-m{4704VfbFWu};%@-Vy9E8mW<~ebJAX3Y z^Wr-?;*yI_p5huY)l0yxc}%G7x4JnVpR((yS^pYxeI&hQ9(7(>4vql|-`ZqaZl(^69eFd~Wu&pM@0k9LPA>j>AHuK9W5$!h&Ab@cB3pWz^&W_yJ#t?yy)*3q zBgB;y*QyPc#GV#r!%%F14`w{jVq@t)o_#1Rd%x%EQNvT9RLkl?;a(qA4F)1I78+KO zTjuQ~3YTjb+;&NQ`ipnw#=>ZYTEG``bMbaTnNwYjrk2OD`doG0t-K5o z%;=A8eWS6*%@;OQOs-vVNKgTw%=j&v%?N2s9G@lOhOa@`ItxDMQ@xJXHe~A->P`J2 zyn*dI0lM&Oo656scR~itCCe~@Fhh~|QwL)G(T>C_8wzUFE73%R3ME1@7zAq~VK<^I zSbX;*1hTJk(l7QGpgsn9YcZgiwR=QkM)78IW8ARb@2fT+Hf{jR#*L6CN5z;l}-gnP7Rx+3oqt0pi^sp`zs1)*`n%Lm}g9TNWrueM-_j#r4c-GgaExx9{s- z8d?OAJ*OwP?2wl|6Y&C}dhDY~#Mm^c->jZoz-X!_cS<9e7&eUX?w`607&_Yxe1D|& z4Yl{7jVnsrNpo{>3QR%!*}-cWs_~E|$OLqJyHG8R|A2CEDo(b(yH;ey~zx0wEhDT5Ev@VwJ6j0raNz%c%ngp$)SJvsQJ zl$U~U6RJLu$WS${Ra`$@NrA(-W%p{^|0{PvOSOt*_B8=fwFXQc%Nf^qc}qqfnq5i7 z`tSUSl0F0DGWHAB8-s@>SvEw!M@ zjs}@gtVbncJjI?1LrB)sEM7&~l3prWGb|e2ZYL_qF8aK@%dSnI23tdnD9f9BHURTR zgF{-LB$T*^i>l0||8qOPYgl#;nzmu75aSLahrf4DIE!(ssa!F|D+T~bK(@cgs2{Uw z#Z`<_w;o61uDQPIb2Z|G2L80Ph|G_!F^Pl90ec5!c!1vbzt?y8=Y4FbV$e}}m#FBy zBy0((Bu6M3h?f(NfYx1Ci*)V20SXI}H@PMOa6k;S=;iB)t)C+ka`tYi?)N-|-;?pQ z_{W6@z>_{}V8^!qI^AD6qWAkeAV<*7FGqPNDi85asaXpWV{K%pG0b84hH8@o+x>L(GM+?D*8TiT;ws?EQksd|TgQ z0VE31o~@({T0^4HtRL)tfEn>f)}6{&9vVXSdXo{FaX$u<5JRDFnC zi)P&)uYIKacoezQ?s|diQP{po9Ic~}ixT=QaRHjT^}a)3^Qn}Md2V;0-jEvz`+Ld0 z{LELzkiVgLTz3Gj!5zPunD~499kI%rZO<1oe7bY*!0?VPC3Wj5pw-3Ph6#3yGOeblSfS!yh0FQ%Go%q5km2EUs>A#f3YDh+Jg7ZuXM6pq;6J% z>!y~njVp|(I%R)f0f>?GZYx#E0Gg07-_SiF$)vcsvf+Y&u%vsf?`OgF9Y>Zoux5s) z&u#4k-ky!}=B_hb=h-R2;=eOk-XXi=9$4xK{r+aJBnz$IgDSDq&LJOq=OaP_dF-bz z4^Q2(rR-wJYrSFAWgUAx`#0}TT!jZuy-qR32$lo|76_s9?#|c(%o5Uz2OO6b*hdyd z9jmlW5Wo2m#|RBi4&+9dmB$)htq2CcDDq?b4#$h=D8*yZN!xwFm9E$@Lke%B`7yLF zLB97#AL=Cgk219^A4(JM|4jD!VMT@kiC^TB;s^V^bm8NJiv`bx_Kha*ElEE2*$p>k zctr4g-kG*S>>)SNM-P2M)$sMOR7CBlo}5gZ~hIxJ@%jhlVvH z6D&a}x+37ZoV%#{^ieN}l=s_5n)<*@H2YFI!Y4GnK=SyVaoT~oSYqN#shzLkb_W~1 zTX?eWBw#HAmxm@wh+{?nAA*>Ua`{c;7PBMaORN7rA~GupQ^Nbh&os#~Gb*a)(U%>& zPeb)maLii9KdEmBtQ(S|F%QMuCA6lo>nZeGs<2fE{=Tsbe907hEk3M+0wHVtOPqB! zMN3GZyetF#-%HHGkF)dxWp9vAOWCQu-33@PqE;>{YH;>$$;D7GG>z8w`}j@kdLj@I zk^e1Ti{fB%dum^jp6?_C2}*rts*6aSjv;XWOX5I7z{6EJb7ZVJoB63Eo;mgsHpxD{ zybR7^ zd%;4f3-D{%b$Oa-O7<8kIoS403h1?w;dNN@(V8sE`5%%iTa%*w^~^84pzSk(#fr$~ z9+Hc^?+FF1L`eQebv9A1_2Dh8|7pZC2gh(iRSHI(T$;M}z zdWC36H9^{F?h{wF2_>ScPW=cKI_HV-nJ(_E*w@6_0IF5|!-W9Us0~V%Cz~?>xr-#^ zx(*SS&Ihi&yTwE*t%)4Wj^CIDYQQ>VL`cHt7+5RQ)nID>9ZOQMu6(bcX21d&nBAK{ zU1}EKB>o2hNscUF%*(OZb@%p9mg`+{OmZ)i3qItP)J3;idG<=b6|p9EnaBN0AEHt+ z5}Uir0<<4yG1petKLA~350W2*B$7q$#AmV`>RFTP-{_ur?zs7AaPLN#3g)w|*tecF zM_l(a!v49YWEnXZ&DsR(e{fS90$slcPHYx3pC-xlNJnf(H8_E6y&(9w>uq}oYU>#! zrNPT7xpabRQJeE>QLpdZe>PeQ(%NngstMyso1LydR3>*;sxQv{UQRFrnXZKyPxwMR z_}NKIjE)pgtVm3j5>uE?JPoIInq{Fsr+FCD>(A7@5iqR3{MIZW8n35_^J_rb>U*ZR z3k+Eg;ws*))3cD`e3|JB5C1m~Gj#qO@KgvgVdS)6K&Au-9h7{RBgdD{b!38+=`FKQ zkb5~ErqS1fh41jpEfK3uFj&3KJ{iqHIzSg{J9)16S(z7CN{AnEn}rJ2Zxequr#z|= z;UaPt2{A_$KQvk{eB$tk%MFr%(X!_Bthtr54HySH;h`EK5+S|rM$vBXbfRJzW1|%2 zL56-SiF@4hi;0O(5&20l?pNHmYgNtgS&qZaaEfnhtC1nS3!u|9oQKK{y6G4^TxyK4 zcu{zEjsic$uGixK8~-incy_eM=8R}!cq!G>c;i5-A99MM;mP??A3lIyU!D2X0)3H)(6E>gb99xpeSfla zLN@ebmu##IE=@<(iH`|E1k+|64lI0Jj`8aj55EYq7W!BpkG%OK4t6srph6TVn{k-6 zzvqtCnNesmOO=;J)B*a=@+8!U${^|3*ArT|AB>nT9p31uJ`RY;ss>PFw3LpzxFsb< zoLj%RO4xHYDGW*9#z;;mCxl3>+glM93C=>f-CuC5%cUici!TQ^YZOclly7`9JPZt@ zy+mSMsE9!vF^oJ|fsKu1DL6wgc8Edpd5vhLQ7mF$<9QwSF8pQjkVC(O8a{j5i5U+H zOeE5EC$X_GcE_9?) zcafOBshs;Rg9@HY^OdDwc@9D;k9|6kevn?i!9ck(?GDob&tw;n27cR(Q*uNYHIsES z(sLg%%7n0UFsn7byPUj`QgY_bdWO5(z9Yez0NwIBw>V=alOzf8X?3wo(s}i&+G%oz zh;SAGQ7SweJYH7~v^05(m=WDoeHkNt8E0p#MTW?yaBIfPSU863@h{S2Z&RUp*v6Gq z#zrPThXCDxq2l#^f~h6>gXy6n;QnzM&hRv>CD`oYQOo5SVOaVGi@)0;hL9M_VsTpr6< zjy*@I1a!K<$##OXc2jfbwT5}N+)q;Tkf+ltP&-dk=_P~X0Eu|-AeTn!kCY1u6$TGz zIqL!HmDpd*A4QYbb%Vy%xgV?H@y=J1KbiBkbG3pipJS(xLJ*E=Wob7kK8M6 zKkx`|t={(j&;Kv<2Bgyz^$hT9;+(uyR@w{;xX5n6Iv`9!+<^iT5AuGFqC~UIXqn$| zd+n1piXDUL*-q-I1HmEo0TloY0Tqc3H)WRB)#UL2=Ycqwu9kDF5Yu;;Vy{|q_i1x$ z(uNkPfUy<;pul4UQtq|>y-7yeWs8NPC(Mm1XZ9&bJ2FfkDlFYst`pGl==bkcXOq2A zsS!AY)@(^_Zki(j&<2U;!8mV@ko{rXxD(aUIMRu$O1t5cqngN8x7aCax-0Z1Y2#-2z$%;j*G>Xl8qB}liOGWdVgD`S$i|9oPgCZTr) z?<$!6Q}a#Q$#XYOu1(UGtfyX69ZY~m>5)-|qx4-vwZ;hKJ4UK1Agvs46mFC$!;}V# z_bI|Vj94b?E1eWrzeP7$Dj~^%IS>4@HIXV*G=9j?Qf+;PzmLD@acxoxzLO=JaZ*0& z=Xc|w@8XL&)X+~5s_Mp`JKD(=Cq6@YW$Z-T{cvk&U#v&cGZ}0Dcm82-oY#=&5IR{$ zhjI@RrIZ~>-xe$b3+5C_@0HtmB_DMQPMZkF-#MGFr14e<+|D}FB^_R zz6p!lIyrK;FiaNZo1rPV+uam{#n=*FVHYK9U4g7SUqX@@qTeqD!LTA-!G*yI5z7g% z+n0pLGGA)rghn{tpR83PTsm$?V1yL}Q%V`+H^V_(I(lt|{2|G? zc>GpL?<`qI*aHD*=GL9u(4g_;i`%s2sOOt`d7 zeQCMO!;!pDw*y%sl82xIwfBP{YKrgxe>35XKHgWw`r)Z*r;HZY;t%vs+jVmbILUY= zhRWl9DT@r|l>U$DFGR^fO{0spEGzV@4$5iNA#K$N<8mC?8i3ZQ~B7=%6q= zSn$nbF25*xn#w;ABPWX8$edcdJQP7h;Ev6~=F8n7bSa{16n3KzTR+#Wf%t)j2noC; z60zJSt7x>p3DkZ7fp$u84!oV71)@{ydh^mFJg$O7;k}POLQLn*=_lDigkQmmX`ddQ z-J38rKAYIl!VNdvDLpc{_9?Q{VGzoz6DH|RRu-_z>R{IlAyc^gz$PWNnG+ zTZ!U^GPd>43X7;V1-#WLLu(1T@QDq_Ew3%ml{x~u-0uFYEA;c9J~JGtiDU;*(`omy z@fY~3{pBIaq4H?I_J%{1{<2mHW`fk-6g{zG9pur5-v1o(!%BDK~OcCpUCr|4C5+Q_Dyd;2%Kfo{}&E z^)T{CsT^Hfl^locNsV!t)!g?UaUt-f+q9H7w|rlPVhzTta3F`MPGO*I7V$W|g6>$^ zdot{RRR=dS7yy_P>z!*&_(;fTSS>Lk&+{UFg0Z9_F0+ish2m^QLPWWED)fXTpHus) z=;6_aq8?iF37=P##hKnMe-3u$LUON@R7-8V8tqq&CW@dbF)mG_)qn&3RMC>c6_ELc zaQ)Hj{Lf?#k(f+}5)Y&7j1kXea^(R12d-3Uxx7ud@7IK>LpgD9USU*xD5@1upLoX^)}T-470MyYMq#*mVOg&Lx?|jAy%LMvw79ND=Sc> zFTS1BR3xPdANHi9!Y*bTR4hZjbu1e&_-_zDX5gx>jZ$=wSew#-$$+}RdV@JkL4G3! z)SR#GSQ)V*{I$KshY#F?K&TwE^NPZKoIz_#M%Gi;@J7*y*9EeK;hTld&kZ5}fxOgA zpyT*|pUkrQJ9tGe2F1m7s!n`DXYzK?S)AYgR%eU`YI=lClgwDv01a+t8Wlkh)diiF z=eVLRJxa)aAHwSCv52r~Xr-iq@nKF|I{|pEU ztXcIq@Qjh_&fe>rdkDv~d>3h=JkTuvTg3AkO;zpch5Q-+97OriR=VFP1jiCMPzdvM zHDVLz6kyrW4~jz8ywMj@IC4!fguna`QOhdEYOI+;%ptHCD~+1$Rt9i=JK5NiJq3+r z;QxHq>hiU#niu8UHgPho>g9pG`VUC4y;2>P#%6z(=HD7c!N6>JBC#uaDsbxOuIZ~j zi+tUPUIp6!YTmlbL~m{p)M0+TyDJ$nGT$niVS~fApDOjG?#6VkSvteoksNb^swD_G zv?FkODD^!66#jC7!J!*JfN@tR@#-%;P1wswpBt>a^T}|&x}z8}$eg2@b5U01<;1V& z!tr!!tTLM3Nh|2U=LBTM80h=rbM(ne*+grxPr9k5oXD*L*#xA>2>37=m4+_l>tj2u zm50#2Z(^T|Kr8MsBj=~1dV`_H^X@v~kqk|i`#TEH*$$xo$HXFy&DHyS64asoabjDQ zZQ-fh3RaDWrvqKf1a2pb2L~NgU6khV$X;ILsRlf)`MIj zPZT}0msfMC%!W=6DzEho$DBl-e86+(zwp(vdRWT>an;?OjwfsQ4#qWr-hSx+E1i2ItvQ}I=hCimam@P>P1LcFG) z8-ALg78`yx;P4Lq)(iw^fCke&Kx|(JU%*y$!U)rzzUMv1;!<@&C5gG-Rgw?7|5^y@ zjrf8GnO$jyyywU(kzpapVHy-AZ)*QlO!l1(Pl9P zJR(EgKb$bpsfp|=Zo~i};T9^DT4r)a@R&=9J>2HgP~qf>ucwj)$oVvkLxerH)Y8K~ z!;xAIzXu+;?83i#Ds;7nc`-TKwUiTP8mkH$64x&mZx1Zg;di|%q)+N?oh6Pp>Blo8 z^w+7ARNuBw&y8+B=eDGLrrjO}x>M{kST`ciF6inwPafHjn@2HksSVQ+p#rE}L z$_6v3A1B#M)OgG^qwQJw>S<%qvzC^13QxRr{4ES=Sy(%Uygnlcsa=&_+&w6X~?q z`}7a6Yq9J_| zR}8206XarG#7wqGUZaP!ZADCqBA{CZy!95;EE7@}tjUd>J;tuN?b_$v6>Wt$L5Hxm zY&cS9(Ih~Brz{VYVHE`df!l|G)gtHnUgROmvs=zY>q3{=(ZL(7bMk()Vy7mDFc#US zY%Av2=Wl+ovg01q^htA6ZA>bsIUP*jRi0*VkzrWUR}9hVH= zchE&y{}~;!6r`4Z)&t1~#m&J1L-Ef^Z^*BUkt$YZeqMhWg(NA08+=_`c<#ecprBs=Xmv^@6g~8%9A|o^ zUbkRxt1-bzgGe!Q6UWwdW+!IsUEhjPI%!lOZnM%>+jaTj_fFH4uF}z*V7o=OV`M4p zUjc1(p7Q)oKi1oM*2BVQFib_9g+J(W0I_}yjJ_gDoMfTPQP#AcCdl|W-~vL)p}^1N z25P!S6o;5-*edktL#igq&bl`@E5my~EprGr zaHjWm3d7OHcCZUNh>M&`pO<=o}eqkS9 zQ@%y1Q)8M4M)q#e3gg)VJdJHMt5bPS(9Q*jbM-}~4-}0Uu#j35Q+03UtFjZIQVbey zP%=1s0BY2RFH_O@PJVNQ87}}65DS847b50PU5O^y0Q05o>tOi7{0|S+#k;%f*^uu0 z>}(6A(oU0BJ^2p5^gu44#sJn@h?2lghU((!V0vSRNcFOM+a1$yUm$1Y9Vz? z$8_YZ*{1eDTayDZ3jHM+L8YPdAarH~0e0UWqe$@ANQvf9d&EU*#NXa`GY&Q&m;4u# zlrx}0As&j96gRbs-|55ipgrOTn?KrD%&R_8)x8ytS%ix3uCe@Y?@u@O8b>qI2onU} zvMew;5{0sgfAFc_K60DqM?2h=o%^-|j>6ybM8wM~pZ`*Vf-yBv$pFkDU`j8pMiIW+ zn*b2Xt_%R@di z?jWD@jWz=*Y1OEDhv-2+K2;@u!7vzG)7yDRF9PP$XuKf2YA*vV&hTPXmpF-hv1jy( z67WW9sK&1YVu&5Sb2dt*M#J%FoE%PwZTWN{EPV0SxY9;nc4PFUk^nn3sSqPQ2Z_Oe zf769~eUX^!WR$MGu~h)jYD4i#&`w+Io-i6>W9s)*=6sbsG6`T;%4k1Nx2)NUum%+N z;_%yO&v51iS1Zx@uDBqLgZDZMs~%*4jU)t!QRv^5b9yRz-MjZEru~(AycbHcLsxG% zWtT#ab#F$u=Sr3Fu6LXYLP6Tuw+1j9$B?tKkN{-9N1D0P3y1+uBxI=I3l}1Oiubfh zMEKGU@GJ=>TwEo8Ku*R8A)vb7_Wk&qf29%xr8L_x)<#}7xCs9&6ZJFi;#mpt>B!S! ze9^HJnf-i|!EE=TF9lb+5C_GwXI`aWvN|OVWFtc$-y4laRd4G1?kwCEBUZ_M*n<~U zbd@=cR)heLz{MvkKR?;hFHmG>#=qA=H&WuEGt6lt&Lx9f6#`ZOiz`s({YXLksuxg4 z3h1 z9vIvp^z6#N?azooTP9d?5|6L(xxkNtr;pjkD|#`UP$1CA@e0CB=MT#ajJKj-iS)o^ zi$C4#++sT?Wh?-9WdQgcU6*>AZqH-i=;CY-1&;(fxTr}AQl?ceb)I(LnSCyOS|ev@ z$R#S$W=0jirH74U-3m{xn%xd+q5{P{T6evWOjG=Ciq7p*F&IaTY%#}Y_=$ws zZRKNp&k|6;eNqj)`yC3(ZYrtxz>HN~imzJK!2?GH-uC7?bzwZW%^t|zlpzJ_aHIhn zHLTqNM$gq`_y8V+Z{LNIn)2t@+9KX9gU?U@XrAK3US^w;sF9R3S>J*XCYS5%B0J~M z_v#@(#*L5=%sbqF2P=pX=Sd6IC^UqO7n#TsDIjTe{xkp>NJ|GR5q-Jzy82tsKYAs6 zUOEGz0fFivr(Hpf;P|C=?*5@GT9~59uq&dE7w##BN-$Izs{qvc3$NK^-;EN{=}ull zZanfQ^N858TmG3LKV^ACDA7YG007>l*xo6^wpRQByn)NO;q`n(U{q$DR01uh@VICz zlTdW|Dr~g2Sf$23*4!YzaO(YA?w55w!|d)<2SyFy5}o5VQ9X{N8$n&<=Oppj0wn}! z6*d{?LAdOT|8eTui9P4!udd2kw*gK}ol(5nw=Bo#z7i80y5iQWo&aXZLOn?V8r6+~ zxsNRkP42l8ae!;ASq7muJh>iG3n0v{k-0ft`*n27lMeGe`Xw z5`d)%`6ko*r){yEDo57Jm8CY$h2fQ53>GM#Wd!QHC4>>SL(SPZxD+0B&ccgGR&3{7 zf;hy$PL^zUwp7zWb7TL1^SGbEhZSZm6IA$Z?RCW1wy2Jx?n2?|X}rAaCC(B$z=K#AP>XHHk&Y% zxJ6hB%!+0h)SY0GX?g2f@}L;GKt*ab%Z!=}ESpBO?)xE!XUoJOwVB>PG|LH~+{(4~ zX)Q)X&0YO9oBsFa0lNOG=EW7Zm~4PHo=gyD@)a>MhIW|N(Mw=k)zkDhp2O_KCQzX%Wr<@x{TfYu;wsnZ?X_VW?2zm17pMqKvZ^ehXpw7{nnIE{9pJ*9(&>S#|Z&$F|1^5*AS*V z@A`m} zxv#t>D{QYt*{5V2%^xt^yQcIfUJ4Ka$Fw-%khw+$fz%xy?`$RfvfeZ2#`=#Qxk1KH zua#isKja!s__brML8{IQv_xm7Gj-zDMa!QhvhcR-V%(I68wNmti76L!AE7`?L8}5* z>k>6gmI&jnnS2SKR@WpHE}CDx>&bE224bMzde=vr7gG+>2^hatX`3!9UN_DmrHam} z)yg!_!p6IhXb+WB2;)>?uEDQ2TnrV8s&qcwKJ~2pRy4#=ezA4~ZXFo1p*Z!U%Ia(_+4D(&ABs5h{XuKMG1Fw7)VK$!)_Vf23qI<05Fi1umw18P4L%yBE6^3 z>gV!g+Fgw`iwp9`IcPpxO1KW$nEoQgrtwexi#eRFPzI(y{lMl4BhO#V+kULXWYjQ_ zkm9Lm`v=csmd|FoF4TTXfB+2?KcQ3Cx%axpWLEL>UZV7Udq3p6dXsJl_C+|`$?J%? zi8OH<+b5S4kfl0HFF7>2Gy@`e*pj_M#LP|oxo+30HL zmQffZ&IQx+t$e0V2rI?~E|{auORFs;rD>?n$uC61sv6uLh9#J$(uQ63ae0)Mx-!_lylA z9@!yCz@PtRbWJC)vn#8EJNe>%E9HZFfYA$RRJ$+I@~@Pa)y4IlhJSnoZ!>+y^j!t8*-7v z5B~mgy!BloS|izQI`~sfF{+MHc=xfDN||EOHIaBduCtFnumw%CaWDgb5VeBP#e<2P zV0)-RM~V)@#dOGr@c(W~z2-L|3s5w5|9}5@_nvy7>gBFyx6qbY<~n$4E~6FH(&=wb z_fXmMk#y85$fYRlBwjGYTqmO~EP`Xa_};yZCb zdF<+FOY9b9tpgm)j8bmT0}ueFRCEHKlHBJx?MA(WIv-}JRmx98EE!=n9&>;QTe+z1 z7sn(?VC1HUtg$!z!Z?Li=0ho0_q`wPJe%*Z^}v`^B?aE1|6B35sFbjlHDbF+p?(xg z#rT>S(pQ-EMha{cccww~eCyGENRFI-E~pYoT?&wSu9MW4hRqM;)q~4C-3|0PC*cNJ zUGDSBX&rx*-zym~(9}wTEuFM|F+n%*H1*G=)9hP-7XcD`ShM7zXro;LXqf!D4zRq_ z4C~jZ1v4`iaM%3%&A~C*SJo0eIw1W^8aKABsc9TJ09QEhv;mi*1Jndec5f1BQGhj^ z*{9L5M3@T^RyF;9BK`0|f8iGSLj~-D64&RoS_V|xnhN)kwdy|&j{f_&K5Ag_T4$qN z$gRuV(FTv`j9>lK{?cxiqh8mR6pR*B3vDII(9$5`G>8_a{|Efq2*_GUXde@6J16<2 z+mzJ6$d-RW3lZwu)OGhXLqch>dB-nUh+tB~T4sf%?@Aok?Dx$4WdC5-l|TUp4sN_C zCggCkBRjL%A@HiERARIaClJr#(}Wcn!#$GtFFQEVQ6s;bAt*jYn^)6%fsl?E~9!DJo-bALbU>|vE(JGa5t zm#gG~LPGr~QwuG;O@RuZTw~$$XG3u?I^o}F)=q}{q~;{K$bD&o7iJOY{0*J#FfJxnKL!l43p}Z zC6|)_MMIzIgPEK@^0-W7Wgh*PfJICnz_TIkA%q_}6+pyvlSU2gm{qg(6*iMFT}ks^ z6Vj<+_@rRQ{Qq4F$UU+_2A`aM-dODn-6-O@N1&tHG90o%%#9dHh}Cuxah3~C6{VK9 z!Sh8$&aicMaQEX`(gQhkmKE~4pN;m5ZgYbOT>r!u>9c4PM?$exIWmp!J$pqP_gie%sR9+LJ zy%oWEu91^SWRNI1zjZwx&3kpY=JbbDg(2ve;wa>w9GE-L1h|vWc{2k_k1(ib8kjaG zqK!BQWhKCiDGvx>F>;}D0586DCz&nHtmN_QS^s^$uEcV0xq|X-!2bkOUz7uMk9&;= zP}`tV`p-h%RFlnX?=}nCg61u|&BoQx600GucECF%cQPA`yi2I~uy#2@OHyuYE6wyh zSV82x6dN#YcfzYR0C_D|hn+WD&~sTggv8DCGL&5j4XA$q0zLy`IbSoPP{xYymuJ+2 zbG0vfnP2<2hsPa;gLJ>}RpE!a6Ve_riYg%Z6B^W#_Xao)R%%_nJsuK^LB0qoYe<4$ z`uTCoi9YSdb82we3#1d z9-1YaYN7D0BR2$eFYH!s&-6|N&tVBXTAb5rf$iKj3uPu|Cfd1V&yLM+f5^D2=wBiO3WQAlLzCq$}T`*#11!z&T08q(jo` zpaC(KlD9!UM0|q8l2ZUzo(L4b;p@bF%i{Kw^~>Ij zfeQLxkvY1_$5~wF=&3by=*taW8#E~d0n5$p{H^Czpto4PRvGNVUCJa&KI!cUV$BJn zG|8!1<+e`JlT)TPZkU*A;r^rn;-^GA-32A!7$6)#=*)s~fZtG7v%u!2nw1mBG64QV z1-ACMk3NOB_4OMEoTB^ADp>y${Uq~+NN3Lrv019zlEt@6YxbIQh&?7Cr=7!Dv0Tqk z1rr+An^0;lI+K+quUoNYjI*&QEnJNAbfVJJIVQX zClp6RL@3j$#X~2(?Nkh>@Z%@H!@D>!NC9QEh)DL#vTnWx)?dIw)~k7iB3XI6CuuP1 zPv`N!k0`h0b5)p}xlZnhXD4bbU5jn@^m@b^vRac|v>=T+rxT|CGY&VaK>#*zmqZ() z#1eHQRr&5-8SQA6xQ;g(RH~Mb`hxaFLgO?&l(P-Px#n60HZ5{fp7^7puOtg*_ENQt~&kxjeX}R|Y8ip;BA8(tQL;a87w1qWwsrgpenXsb3Sr;==LF z-RXklBqF_Mp(&ORMin^bLsp=F7)4-HD3OuoRckgGOP(NOO;XN9h;Zc0hvnSrLMvsI zu1-#XdeA?LoDKjY4ToblC3ueDW=1>rz66-E^$ZW#M>|>v!WlDiGq(ym92OJaVF_p@ zJ{fu-IDzU47uhHzxWWZh#1c%$(aa>18YbtQ*If15Y`~sow(59ot%a z2_oVpmWO}3EggYg9@Z}ol2CXD-*)3se20fxSEg59yvEZno$DS;RcQQYjn+B6$zu@}!5%xY4uQn#4V0ms7V3Cx@SX-oCr{uO!h!{I9%mbYcPijbAPME| zVKD8Rf(&!#dcX@Bd39t~gOk*Rc!IPbmkEt|3@3El6fO)T!FDHnfQm+o8Qxsn-&N3L1LYCtj0NzMR`x>50uiDEqvMZ zjb;?Vp!GUaUVm^X=p643f$`){;>1RsvUua~*aceuU^)%Wy?S9--fKzPqC-`vDrE0l zO~d%JKaINgAW)*tqzY}vOkLagB8T)!;sa#pZJjg}8ePR}zuJp&Ef=NM$SdY|u8E== z4W&Z_!b-x(u{IdkOnE;F%c2$vG!mne(>A~awh>Y#L`Y)L2EvJ?oRJ|YI`8I(yU%S3 zQ0Qmp|B6{b&WNymXT`W&xf)drUNvGB@F09mTQ8I>zuh3eEz*`K*hqO}$Mli_TH#l~ z)WO@7vRFPx{SL%Awajox!K<9lHxVWyUH5a#fEx(iB<(IBa_<*!03YQNK1rRch3RlX%bX_s297@BzdZ3nRx1?vn_b7{n_NNjaCS~AtO zIJ`(ONmC^I_k>)OZW)mO4o{iU;}=QboJ>fhl;q`t+Xp5#AVJ*hkE8LM%deRyove@z z@5DSeQhlU}R?BD8Ag@%`r16yT9x&l{KD0zL%_ZiS!7_@8u zSfik@KebjLx=zdh_di;qH7Fe=lnqe!hbzbyhZW)p7AN>Sez=*a8!TNcp24cEMrlBP zG>X8EBa-edfN5fZP;y(8tWB?`El0Gwg2U|#W{hz)n1cJKMeu$IrEORL8nm8Qe!&KG z%7&hmsCV$8u($S;o@*;4@bmP97o6y(hU+Y@5T-p?-N#|DL{sDGUav}r?n%p&oec-A znh$*x6O&(NW5XeL4u=WeTzFaRYw#nbBzj8jl#Tj#M6)9!QE0C#ChNBW>%wmFEV9~mo}7sPJ~?<=htYd45rwmDj#)!B;znzQwnug{ zZZTl07LjtVS4PlKG|X#KaI@OacpD5?Tch)w0Wl=?1TcLROPio6b>h^Mt1nvKGK6AmuP8yZ~LfgbCcZ>K}S9cheN&v@Q-i@EWiq3qb5L_F0$1CDs&j&n}ta4NPt z*aDwu=K?Q+E_wI>;Kw{Rs@e`J{DR8OQ_<~|xCn9nv!Y7ylN3|9pZ{P}suua=IF9uZ zo;B5gtE;MKOt@0W1g*%Mf=`cdlQ9H7ZB{W!cKEW#b$wm1mfRX&?r#ey4afg~)<1B4 zcB35mr>hwtw~KOO0h8|BYSO2%!EBM-I#pQ7h@)c{7&P-c08b#~y{u-Y>iA*RRT!<*-=5WBF7Q1F!bAm2WE_BCC? z%n5zn2^Bu2ojmpG+^(uuTgYEdoZNXGQ}96-PZ*JRrFpCxmBYk}3tV{lGQz{> zvH354j+y$@ajy`IJ{G=$NF?lE){_|<%PX%@emizlez3qJZ<~VU$47AAW;K#@f=W~vNU`86aFcPhSLor za0!Jq>g{`{biV&%8_XOy1cv2Twlc}(^jnu$kKymSj~IzPpk`tHVy(6>j)N)o(AyN^ zIzkH_T$~Jo*YAu*r8Aa>CQqI@5*v!5YrV35%=)}){y(O zxI}3-m*pUa7R63j?jY98#=Sr9>TkgNuLL4VKd~7=WdLP&VEDCP6`rO;%+qf~soMn) zb`2jMRv2|iEat227wb@D(uL^GRo|W6a0k_3V)`r<0%d;)_}_dajX?801-QW2n%CVvEiKs*l_@OqFq^`o#i&gYl8s@ z;!n5+|8RlmXHZFtmeb8I6AC0&a#;KJ|6@5v82F?#fFo=Jq3N->%NYDW!p~iQNGBU3 z3MBs|lLx-0PQs}iDhqL!v_@+v6uTEq}wKL1huGL;YnvQ z?DG`lm;>!_V*2iA^MBHt&G%5g(RT}zXt9A0@ep?E4JxvOm1WcDU!ljlc|ArAOI-_x zd(Tu(MYB{I5O(gFaQDkzO#e0gV(sbO`L-Sw-3SS0RKPz zJM)uzp)HBV$xt27q@A-n+J}|MlHJ5g&b5*}W<6;6xdcyA{5{?UeyaKBfPmX1?C`k- z_&hmPwxyCmO2ewLD$lQaJP=k3+7mN#F9_eArzC}jwP{F8M^G7Etofuq5(0u{;I95j zy_=d_E`SzSD!i*rA26!4nt=o-fc;@vA-i zCkIk@q`#HwjgFu5 zQZ>*?I2fpM`{{^=J0fTj;XvvqV!d70yu5cpBgsQkmOU<88BTs1WXm^vl0^Pgi?_Fa zY7P`S13M2dm&^@6oo-|*=Ua zX+-c=P?vY^jBun}IMCx;>kVJdDb1mvHe=nOS)$aOT_nH-p8|fe>#Lk@Jsb$5a3!eV zQy7!fmv0D;_8b;~lP#|xGvL8|^j{=T5 zU}QZY>i`m?MtY>g_ffR`Nxi*WY4(oWkB$n~J`c=vmAwI|bYhYP*<^ZYp%Z;(bi#)K zRHd8%eWl*#G@)Y>oKp5DZckpBlAhk-Ayct6Nzu^|mOT|5vH6QCx?lDxnRcu#QZYe7e>7G4{L4RbK!jix)GPG$@Fxql^6(xyZSk9j z#q)&^SlWg?`k8)W$1~_rnl24xfM5{k#g`V5Vv6jcd+YCKU3E29=>Xb%J89zoC^+d) z7ScX58Ix`$?DrvGF84=xV`ElGe?5leBM}aUl-m%)KuPGVzHqUwDzo4~05?F$zvoY3zw}Dpz1z<;gInz`K5<5Wa57gu#%I<0 zv*~4tgVS;?KO+E_Cjr^`0#`z;0wfLFyo~(s`>gt%&Ppg(;9*4Bpz?Pn?+nzsAhbk% zAU`uhY=hm(I**jH_{Yh{q8oh)Ur%zaBwlu#_WjjIG7c0uH&(N)rg2yTZ=eeez0qEO;3xrSqQ;F>DV(m!thD?n@mwNV!=^bInqQnTMsxaHKP7fZ$7tSsq4|*u1#|9)8c7kMYr3a}=zeX;8 zxvnC_?C0HzkLTwe9~jw~3WT3)w(>7VGDQq5b3@7B$I>AmzO#Lf8H zXY$gF!xwpPh6)I6cDUE6%;wG!n3hUjNg0TXtICwGM^o@ZG0yKx0ZR7vJZPE&mjxL} zyMdNQR{hK&CKkvaB>#e^8cFOo^jgrNs&bTWFTdY~F>{Bigmq?jsX(laKV((4J47@E zK+)7_#Xir*+S97Vs2>}2Mn&EafmrM^31Byde6LwpXBb5e*U?o`D3|VgWKT&D-UTq* zn81DW+M@NVVaI+O!*lQrSPUAF=Y;WPU7YDuf?sw=*0GdsTEgNLQ~@ccZd6--uO!fa zMeAi4BbKX2*)L|P+%4^V%37AIg0eJO)zFSX*{C43TuIAKFs8I+ekJ9-va|y46(HAj zuJ=df&FOu$@i8#uKo0;+BrgDnvGIT}$^mB3Hv;*bnf&fCfkMI;Wm;gXJaDfBd((vS(nd#Yfm*2{6+jI}YY;yG1UT>Hupcbrgz?=2U#)6xCMuMnWfU-c%Ty)bNn69A2(DtxK?E?QQ%+7Z*IDX;Hy zmWJ^;FvXAUxgPuyM**#q_|z1qb2~8oq}}H@ZgvwPMSNEgRv%&0VN&-$%ev>o&5Eio znPk9A{k-QEwdM<@-|Pj8ry<1c)>DAm<}i{Mx#1|5y(qz?{_W8$7#tGfcC(=9_i<`@ zP&NvvH)_SRcJYZ}j=N>R!MyouhciU7>h|8)uGY)GS2P984zQA3CvYFiZ8=spl(6t6W zGTLZpsEqE#i2qS?^*idQ#!!;RuOYB@oiQKm1f3tHsXokmaC$(sw{A64`-}2uwQ7Wo zj%}BE+4xXwVklK^01u?;1>bAAt~2nganz^mut6N_**D<~CKe07jYe)+FAjyK6rU{L zyVBQJO(^F_Rjp{tE5?&A1bn9yWgmixwFxn4kUWNUC&0LCS)EACEb;or&yCxEg!52O z(sXUE>~cVV2$rzl9!r6$8g4qcy~TvkM3uH|#RJp!qe`AzqrNjdtB*P}#J>QAc9fCJ z@WrkoGQXMYM}y%T;~Q4P_9HD~&TNA7={RE|qpu9tu`Uy2f2|!Z0>K{?%EgCQN!&CB z17BJ0Pg%-?`$05P7Z9k53A{wkb~)Qhu}dz$bb;j%tc} z6rJHq6*Ghv0nHm#s3HlVA>Xw^2kKAy`&@@zOEHH2;Z-?bak9!&EZI~PxpGj&B{(5`z^cGXnAMa*R z{_Pz+N_&e(aJIZ^r^5{OZYbO2pc`;~E?%{gFjID59nO>wu$4g|psJeAohBjCwfL;^ zqtF>9M(+dhDC0Y^{o>-vx|hYBy!^H8B$p>7}U zcJHLMqUcYCJ=d%^oML*~!dbqj#{sV%s=BpeR4m+~4ct*a9909N0u0tXFM_fFr*m>B z4g_MCjHOY)-PBhuyB7Ja3?&jU%ab#yV)}6p#PFDe0?oGKOiV`#2}zO?7%w09+mj?9 zVGVC$k{VzCZAV=m?wCQ!+ZZp`PcoCO3&6oGmBi!PG~N)wTglB_>?q(IDrn>=y2IZ~ zTQN*ITWCyf=Kea`^2MMzrUz=cR;r*)alxCOo6R#x-tIckvfxCVBnEy-u=91iZUcTR z%}IWj{09|(3cNu)D)_z5{Dg)~56>_zi1mX0ju%ej6U75xtGC)9m%9$?EmT#tL^_)=OC{Chs!5slv% zVx*z#b*cox#YUtsVSdq}t~TCZLU-{P=US9TrPncF8Lar_2%h$&{yrEie;Bphjcr6a zId)4|Y%qWV>#TOS62;2UK7uu2>4pMSamx+?+fH6Qnx2yv}sE=80tgl zM{XNz3dG)OZ&OndhI44ErXT@#h4Mx0ii@{~W}W~CxE<3hwWgWM7AQMozY%Gg+-Gnm z%FMPE<5NkxHLxtUFUPV#fL7@sz}pKiqj<3m*pST+#W&r6pCdMyQB7px-z87a;+V}n z^CMJ$qDrhDL<&Xyy~}~onK5;7m39wM&krXd6+g>{-KCy;CXqR>%EVa-NlLCq2*7}j z;?Ep0w3^EEu?hPG$k;a+8UdQ7UxMf=I`p(kVC!$Ghp0w|bC055)+9ff*EdZOYiG>O zvdRXd?W!z_PU%>3eSEh2W0x1Mq{U)ct71#zp?i~|u@h5nwLd$sBn+br6>+`lS$ihg zXmE9+bFnsXnJC*tWVo9Z6ZrHsL_#I8)1E;6Jij2b!6PZ^>%r->p_0zkr?-foVNb`8 z0%+!Z7ElY%9^5KJPPb^odwPA(G8M-zkB{$fxr&p2vmeY0nYazP12;jCpDA*cQcLMI z>c%VjkTZ-{nK#e&&}!HnxiVxt)`UcW7nH6 zw|F1L+Fp}9nSy_1{eIj;yjUgP$3Is}99Dw&PJ?~JK?>`vcGkD%6==at+R zj<-Y_$-gi5>S&h+lrH1vs>~165CSYG?;Zbq%P2gEg8JM7<|tjRHU_O{7KkJT@0Kv1 zu%a3`T-W6ZZXlB9T3O6O&?~F?x)5Fcu&4p7J%N^dO16CbXJ(~QQ*E`*!W5<5b<=NjZVkam+H3J5 z1nL=pVYc@Zc`IZS6$NO{U+ob&o{b}C7*FTn1<2aVq``)_sG)AOfaiCcX?u$dWwuAK zTJCh78r~B12*Tkeje~+$;Z^*#PdM%EKi0rMw@rA}iV2x$xUm5;Ju&f$DnkizxmR() zlnSnUf>I%Xu?jV#Xt_460h?$Uox+%!Eey1$9VeIPH0K5-V#hz;6`quI>48~Dcp+i4 zvl3h+iTk~2ok0)UHvQM8-vF+PHtKddE7VQZm0H3d#$kbG_FJSO!tF5h!$E#ueK2e5 zf}#dQaC9hz7bAmpYpFm$zmHf=^Wm+?NnhFNMTj?KYYL0ffdOP3PUWOHaKsBnoSHvb zzqGl)T)K8gMmq&Qvc#5CFc+=_A`u*P$T#M~%cehrIA_AT-w`l@@LNZC5Y zst!r&#{|B6QZ8Kcbg@DNpmRgs@?^A49ONpCPI!R?0_V@`(DD!H(NmG1nJFSBc3E2#{)^zi&j4ecUHnTTSYuhEw<@eFI%j zl|nCnjb~Ed*P}O^?KdIiZza7R2BNv(+MSWInz6`!cFnk(3D6@DrbOsw6q~{y?VjFQ zUmF>*Nojmv>J90_&jwJd`HnkpRkZrSHsz zu@4n5o4d{cmB+blI&_`XOuppRWS|#=4-t9ykc=1pL~*9aSF^^ zL^ez7g$Db7qahVa-QI+O5 zHJCj(lG`c*^cQRYFGSGg1-TJQMRC&%93V2LqBxt|K^1tL6{1Uma4f9*guAuz{27;l zYn(;BT2*8wa1d>z85Prq0RS_bdFoGn@<3H4Oo{PVUJe&caFif#6XuOVX&yqOzNLF+AC#D9h(JQyV?7Bgs#o>sn|I+Oo{ z|7fJH-RzmODhb5K$6-=RLjmjAKt zF1yT zhEd1hp8Y}(&5_ZB?J3)Do+H|ZfoeExDVHWH%jTCg+16CFHFfSIpI*)>l2SHx^K$k! z5cGJ7T|$pSh9Czcrakh-!ZD{tKyrl=DvGxhjZheqP`5O&B-ss;p7k{w518m~OH(^` zQmXyELyz>J4f83eWc{D;hiEBDo8J6?a=i#_9eudumcF95f75envHQ<;sIxW{WySZm z4;$9M2`kK56A~JIR-xUCk3GeD)j%4~cP4=arpfqlR@=ojyA1`&Pk#M{{OfaGuKPRC z$~FBj1n3QD_rFajY-y=g509sMfzH%4nZLyxKm%YfbM@Q$BK)cbTHhtprIha%u(Ivq zCTuxIm{VuxeJ~u!cpVpN8sTT$_e(*>OaQDJLln&c&4wvUfGTurs4OWlpRPH2ghp;f!(E%!0KxJQFwu*RFk1{hx>F1xP{)! zNfR7Rfboc1rBfHfC36-_4Tju*^;cP~NpsjY*jk>&W@wraF|D*#4SFQ{5=yi(1xNSB z$Vw&7wk1g%C7GJ3a4TjNa&85~CSc|}k)W1)9!h9r&QF(?3-b}hep4C#dCtUSd7#d={q;speIn^3e`j0u&a}F^AwAWzuhpZ(%x=UC!Utn}UNq33 z&5hZj{nzn^X=E2#qZPys`*lF2Dn2-#+J2|!54L)kT1G{hsKLvTfKVZ_^Au;MqqYy> zaG&|xzgb^@mhbVunz80O$DRl3$}bU;07iCpKp)93g-)Zg9(~z29pJH6)k(qx^wPB# zE+3X%H<|l*Vb6=!s!7AAdX$d&+J$6uofTbsmv@~l3-qf*nr~`UU44}Euyxy-y3PO$ z_fXj~+Oqi}ye?dd7fI!aHQ!aO0)y%v5r<g0;pe4Ngd4xkDG8-K z-Syrj?C@hj&+LF@k&`7I2_U-y2s#so^BY|0J#A8J{2a}nNdC>fB%L!sElDq;rxFw8 zJ)fvOiUBg(eL%F@w~j2y{9G-aSy>EnnCKRnNWw{*1v&kMp-?N&T8-^&oBJRTwgr zr^k|_S0@nBWe2+Yd3GK@SaBdc{Oje07KuK#?_5^^cE(8$hHx4v@7BUzyLF=DxRuKi z-{(NCV@lLFBan_6x|_p4@@qCDu&IOF}l2Ws*RS%$m2a z`nIj;{%50I1d$et1fnlS**B^0pkTIAb4J?FNcB~DR+?2`^MErb&nuuO?r{kwI3Jb@ zEF2h`_AgA~Kvz}(q1v{P+Or4rqxXz;Z8P-tZU`SW1*DFz+Hzg1Kxn4I#K9Lm%qK#) zu9U+e+~=U1*hv-;o=hlw7{ITIGKBOsJ3EI>yxLyiA~azCPycY%out2B{|M0?VFa^F zy0sMh*wrLnoWj_F(f?-9<^tPg)jBZQ{YLs_GG`zrSy&vhs~K%NJRQNC8wINw?WdrM z)B0kIdJO+&&>$s$X$2`BFW5ovlhO$ZS}LVhG&Ju26Nf*|wj+%dgfD z>dO82tQ*Xo2rSzEy1f|>Fy$HjF!GOgwJy~(9B7r9nrHC}H43xfV~>Pp-MB=qs4mSu z_g@83MBBUiX!vPbCVxAhadi89e&Wa%7}x>JT#E9a^!0%A7U{*+-`14XeQ7J3sXdC=*H?*D2{2KJ!_ z=eDCX_n?W`DU*mwAE75n1@5c4@tU10@>{lh?!@d(vNOpg6PrOoM|Akrx1*n_jcs(e z{}&9lGMRf;Aqeqllxq&&_K$MICKogQly>~C*QbUUirS)4YviZA%$r7$6C0@&+f!9D)^uFF1#a?E~$;a4OU5%9R zRvRs9hOTBL5ba$qbT5-toGDUsFV61If|5u(;78NMBlI;YpPn+rAw8_pLxgloNr|3@ z;~a@+?{j>6Gn|`ok}&Pa8K&1{C6h*zC!i{29`o3g$3k-#PX4NqODNODq+BnS>`r$_ z5SA@HC?Gk?LiO2|pFOHUe&~~d&#AqUgzt3~qzB64t{f8fN1xRr`&N;6q5TJkS68ii zEcw-3djNMU*XN?lQZ-bD%Vh4R`%SR`71JSKg+;~=cJl_G$Jl@o2Yl?n5$Gmo0iUq+ z6N%e8<$3>5%G6N8X#h)hfRQVHL6f?|rK)6cWB+l+mdCTHZH@f*ct#H; za2JlRiyGJS+a5-XM5_)ITZgg6ZTa}(5-f`6-NUBB1< zp`MzGMLb#Ctbu|=4D07=49L#5=N8+cakMy(<>7QEM$2%c{nW_4Q#R|Js~;q|&_*zP zNv%dY$p*Tx{N~OOPq@qRi#--L+9Wsxw8FHM;*K8~ z(JIzZB?+pS{CT%jhM%nKkrK~4Ml=n@P*QVn%x!I4KbPH(2>H4hoYCM>?MRDU|F>Jr-$H2sFDD9bGI##!jDt)<@lgv7)oqF1vc9c-h5; zRwMEBW*y%O^*+04do5h`u^y zt26@LUJs@vHC4(jH#>k8nO!zAHJUe@J3^xIjv8c5&=KzD+g!WrcLzAtMSCB`<1 zn6jT06v@*1@5F&E!Clu}pbMN>DIk{x>R+6V9>d5@+s_Qu*Nt*9ED3mM@9n&O9*=Pz zZHJJ~&E@Kr2$m}V9j3l&I(W|{p)XyFB^9?(*a>po37IGwrrw>ENwYAa$j@m29v60E zL5d1;4oAa;m{`&FvQw&rRyaF`@&6s}_@s%hK<$3*~}$Avg?T3m?EzaNbfK8LE(F$li`3ai?s7^ z6?MHB8NcA8Ot%8yRCEa{eG%4?`^l%DDmgC{MON}%&9yQ#{8(BfE?26&J|fJ~(%Oy* zMpL(zPPBvT$SQ`MPuw^Jy+j`#due8;;~Eu^C+gI9JfNY>&v$9e&cIxIIC1mJnre4^d#CJDhhrjSUv z>>UiFO@spZba@Xd7j4pH38WWxWcU^(>SiR;>NN~`n;J$ep@{!l?9rIjI3DRbbVnTc|O21=Tb@k3b14ne!%y4a-(KiuOPrwT(~x*O9U(wnhI7YtLdq|yE7AEH@YlsoSNxDGf*$b79)YMRBq!eXD(OSn}?I! zKz%@kzs~YXahLUpWdjRju5G%kNOC+f&&xE6%RM6~v(XLXU5_RBFMbC%2EvKh~--eZA~N!TasT-|X|ybip$t`9j8&j~hfh*mlux*peX!#|Oc_6b9tv+bUZIy=uMLT^L%BzJ!w7r0ScoiHb?9w?VY;EBWc1=i>_hOXd zq7Pr6ILV2dK(g99Ex6UVNXSQXXQ+>=TT8>Ugv-(%`_v( za#siJj>YoLSQ&l5&$#MXhXU+tXxYH=NJ3nzqrBl>=KVrVM*xqcfRQ8gV$UA`7Kw$k zw#L|8X?D2HW8qmkRE%^+5@X%rOw%QxG4YWn?6tDK)OT`52|g#rQMS>=4AlA%M?XYP zK`>YUCY|M;)iA|^8Vkb4mx{rGe#RkN#Ta=*%yFcbH}_O8aM12HUgWi3a_kjZMO15g zQKZ{L@_VVZvE#F>?lvZ^elDGELdPdvZ6D6K| zoC?Up5Q)O7Mf@}1b`w7e9T@a)cOq*TjEkZPY;w*pk_s5lN8ew;GER4%WcZdM^v97} zt~Ur4tUc6rOuWO4xqfJ+Ew!uEMx7f#BL7dWHv~5guhkt-s%b^VDhziGYP~|S5L2L@ z;)E$>bK~_GvD+wuDp~%+`xSSYD->RvmwuiKb@u|PW{#!m9yA+2^jg;_Zn!=U z$H~$AbX4v->)vBI9%b^od11o#Fg6 z9BBEOp5-{F;3GcZO635a6K?{KTqkO9q!6KEQQGKc^T3+pqFF_W1)N36#vrF+>AYPU zo*mMEkEq|*a3y((YucNwOGU!eLbWIR%=4bvD(-&M@33iIR7zv1A(Fm_%BsN&48W4!}!>bgsN}9 zNIMK>)38_~ZhW~mRK#4`P~?lz%}*m;(4o`EEst$x$Vv-X;(VOI&>*1$jyRpi)fgt()}IS1vxW0iBzBN|9&F^C83v!U~HsP$XQ$z=&|Nz-zYvx^ma5qPZSgdlce?H~6s3HAQ{kKk!a zXxH%5in)QF@$t0@M~zt|2L7HB=Hb6eT-UZE1noxZ%NAYyv4!=aSI3d$s5uc3puyUM zi*swKpTyLP&%|ZFWjU_bK8An!f!vZ#S#vE3Z?6=TKx4n5ha!bPxV{eicEmXauET61rt0K;Db*u?1L2uL;VhexFzypuB#n?<^5ep6`j@3Q*33k@1r}rH>{wcw)|-WY$IEtT zC73LCiL^uk)c8gY?#dEzg$#7uTXlUoTOgEQzC9iMe zWVX#vWg}`w9BO^u#wgSM*&KKv=)WmOZ=FA8kLr9R{vzjR4r_&grR`h^5KcXcdDcD@ zDsW#kw#|Jtu_7f#Ebqc6-N&Jfuo(#Ya$Rz=Fu10k+}crkPDdJsv`a4#J5NSVqTuLaO*3yO zCKi9RXMgq{iz?C2JfzO{C?Rl#1wQCy14MaXgXD#lgMwcewMoX*?I1QwLL^iB+ zS?3pseH619RO<(Uz?xdOdO^c&>xv#uAA%aQMJkq>>`$YdZ8yzgHs#; zTG%cnzM082&|;&~(TUAFJ-U$ws!bkm`ql5#2yC+c{RJ&2SgV5xB5-nJMO3 znHF)hYu z8%OAQP`4CbLe6xgwpK*TUu#s<%!>7uGfVB^P^g^C#skn(Ap*FWL4qCtNwEi00J13A zgE<+uPMu8*C&a5oc~kl4t- z*69qPJZXbWS^o*C_xqOgD7}KqTzq(ujr$p6_cbWipTr`)!JeQd9ljeTC1qeRR!~iS4ldVYTQZv*!BNOvgYR9zHwvR@mPSp%S?|7ZC&k&f_W z4-UXA`qe(612V$ME$6Dx;Ekz?80z7YNaeP2IwL-vKX=Os$o!b0(o=}LqP5|VFwx_a zMvW_|`{svG?YPJzo@qZBEt zsP5BoUN>gl%;X*rj+2NFyzUf*Al6H6V7Qouz@EjBP>NqQ|p4saI=h z?n1Nd)1`(EZ0nCuuISw@-EK9*T(u4ivDa##kmJw@9KgwLS(24KS$Pa``#&$~<*Wo2 zND^wowkhmgPyR_& zu@vXQ`FRy=EFB7(tyscdy#FkJA^A)EuDnP1NQ#9n821$lA$`MbGY-M9x%H>ACMW(4Ce$O_E9NOP^FS zx?N3*mid3M?gmRi6K^NfCI&zmL3qzIWTV;)dijNcY}(m{wrz+HG(?E!MiH}&1_-s@ z0#A>xDTp6=b?q`Ils50KbA6PRxhqvjvU1OorCax-hV?x-pw)F%>cjYShF!|T7Jl2dqN0SuO<3;uc{9Xa!T7eRm{u+o;0jeS_SJjIoc1Q!% zJNvt(t-#a(xU*5{gYpl1c-e5cVfd=?klc&*G~k%8Agu84ZU(fua4xW=B?0Ho1m<0PL(H8{^yC$=liZ=DX8v1hmVdbJ(BC~9x5EQV;qz?4Y( zV{@5C|58}7y;nk-WwB?MQ&1qF1v9%y*^rH*SoKyn&Se9)*h%A1N~nqRJo<*HCKrKs z_~QM<1uDz-byt(5sO_$n0*&o@r|A*leRjo>;)o25#LBol)SDOjZsLK(l(gChtXxcL zg>+D7Y|Hc~sKP_7%sW{}mj#|M+(>cikg|=LrT8CTH?-H;i}JIO4ZPxt zRsfp9jNf<8YRzC1n{%=f*EuQN4`)X4(Crs9DJhg!w#WTkdF#Yi+`kG2US(SSsPf^! z#JhE!5086qajTn&Qm@OvrHYq_vr90QkfBE1hR6ytj@VvL>=dI&VqBy1Lkr1Ke4Jb} z4|a2WYr6LtBd8OXN$z^nVsK|z>HW9Z2U)vf|kPb_o=95lwp0yl3dp(gON9m(U)hXt@UF z8fjt#WmhwUaD*k;MA+MRXfBGjCyaf?cL#xEeG%*UE2072=#hzezOc;{FnHIThLkw* z-^Z+LH_L?rTZQbe(etGvEHZUg_aeXg+ahX1IjdUMA{KMhUrL9d_`94*6*bKWeo@*< zBBqaj)6CEV47+><@8xtWFdq!_Q712L0VVuzO2i%aRdu!w$DBk#Y$9Kr4)Pqh%N!~8rq*7rlp50|Fs9t28H$A(!|4Q|I)B)^ zqn(+?^f)r~FiB|}L|h|J#Dy$U0_YiTw|HQ6zYJ}oh)V3O&aXms7-#1EX9I4feE2|` z8v0xh$EUG$NxsiVwlkTJiDqRjuiXAia=oL5y`8FTYAHc5ZK@t|)c7T)>!jK4==(-~ zQK{*IPcuE7o1@JuOb0L3#4Ct|TzM!hVaRCdN1=)rVV!e9j@@TGnj2~pj54rhN#glt z*K;qIwN;1$^~;c3uONSj0VQixEm>NOlT{YP0dtql;FM3HT1T{D6Ty!w!Ys?rL!a-3I=16AZvS{c0-gs4=S|IeY=g*st^Udk-ubz! zTh+2hvU_ir`UC^!QGEh7@`fcx>C>MJI! zYOAmjN!0iV*+G!R$3?XU0{=4Ftgswfqf$N^%SmYpvQMJ$=m>DL1_pSJ)6Eb64Fmri z(V%d$2#^SiE6*HzKMTWRKEjCFxx95VKqur9^K)`fy_8~dp~cd@&9Nb3pu}-t$20lN zvLMJYS|Fz=3^o8 z7x-Y*j(RbvK#pZyG=7^*HTgoH$EiiUp=G10izj4lHw-9Ve;JAF4M~-)m>0zCG%o&B%>}W7N2yD3j%jzd3Zl58LE zFq!y;JTqjrj2t78;d%$mg_|Waa`{UoPACQftse?S=}2UeihU?9oe5_agjMfIiOnG-mel?mZU0Ou%Y3nMiuJcUaON1ym>R2?np&< zjNZRePgPaL`(Y#w=2C*C0^1E$a!@30eh&s^_xn05%>P@;umf5*SagRnPz9A0i?kFo zAOU?8h51@)JJ{l$bz3xSU`Nj8p^(nzU)x2Pwq|-@*KI}c8g|~YDCLi4OwRYcAsrcX z#C7^F^ZYvpkDuwA$ItYV{vF_d4_Vmx{qe`o>F@Y@z3hoq>FK^T0VpRc#p2Y%mKIrIH_ z`Sp8QUvHzo?esg3lj&~{lj(Q-JqG~c&xZ6d_PkoMYPplcD1WM=7*t9@cGj57*v3!}1ONuz{6on|4KttAl#~nsJ7BFpF z7T#ZlFxA1-j@h&Ikhb9LE)WmIP&w*JepuiHNTDQ0(=#6OU^gHERg$?B7^2Wg@TU}1!q8w%O2^rNwm5qgSgrLV zWqI-?gQ6<{$er4G_{rFV_DiR`rzLG-kK8d?2XXCb^AD#!C? z#;BwJYsUK7NZ=fxa~cjgzT&k=JLUH@qPn#oRfQZxaiSUqYBJNYiv*W1J*{8yt3;&+ z#|pK7=7oI7QZftqj{Z;3Y#4kj`V+$qK9UuG@fqEenJ4yyhp#lFN~U#PFD71*}!&-!!gO{ooqNOyXsw_)e!x0vdLo~T zf7|8C3VOcjxk#@RKR`)zg@`dK zRKSplW6d*uOZ}^-pWChuD?{ZctubJeT*lit{1SRKc%#Jgx)BO06Udq#M==Rqeyu&y zKsYZAm4-kYr*~ZzcpcMPLLxYHI>VrIv;N&Z+NC`C_~W5TLz)ldM6qt=z9rBk$1gIi*jasl$M5kQhFn`SR3FJ7=NQVlg2uZ}o4Ezz{Z~(mX z7cjtrA_RKi-3*%K<2(nit=Nt77#+4(q#2xNHf4qp{2Q?hxrP3Vu}HIIe4++{0LAxy zhh&144gmY%o4@aPz3B5Aw5;oTNO0N<>yP<+5-hEi{$eD$3gDDc#$oLgxeRN;O9}ZO zDlo>`msusJIuA^2b9sVn&QkGQ8c4+1T$4Z$_BKZWE}GjSqh9@5Qbw>EMHv|%(l*_Z zm4Eo*yZo80GDcCK`A5u>dbkOUOfM6RiNSR-Uxh?S*eMa2s5f!yer1B>$9hn*g+-=^ zdjl(VU>^n?8S-|WgVB|4Y2to2T6BuXVW9Ib@?g!7fYZA%sMHmvgyqGC-@-;&-R4T% zlfqI07GF}L0&lJ`{43@RJrBbnQ_iE3?RHd`57q6*i92AT~0AgnCNMW&0;1>vJQ1(61+Mh*=c8O zP7&!Y*qJ%3{F|8Btm-ZZk>m%#s4#$5eIws(Hu90M!6}( zrIE#CbQjM#C~#={@JRQp6pFv4xHaVqUbAws7uL?r zG)O7X?&Fb;)#FbTLW6{?eM~Wfo)(vw&b0AJWkrCVCA}$NyUc6X39US*2k15V$biugkuH&s5w`CcTM7&uz*bpU8a>Bd&OTv^W;u)H zld5cCy2zXuP&s9ja}Z$;0453=)8id~?dqRDx?R)yFh{A9+yFPsj@|BuyrPmczp|)c zC(OZ}rm9#Uo(iSa#MwXM3qqcQnzNfEyky3a;;ny??-| zzH@haSZ^?89qg|U>y`&jLVxrY#DmMiDijWEW{;`99JEnB%B+pnBFbe_Wd%+AMm72rj+S)fehhj@(RX9FV)5<~1%wGMe~flz<{eKFUm7qKQ}Fi^)*M!nWpw>}ecSN||3 z3?(dMH7-XscvSO@7Rx^#miu8~G_dvxdOEEf@cW1e098P$zkmOIqoDcZsRo4S4vOuC z%LHN?G-5rIu9nZMt_cfCo34cy;r~6N?y!HFd8mQqi*+fxa(HI9phj2k)L^#WbQsAs z@2X#GcR@%u9mT4<$YH%915^qDdSBUk$CFZB!?3~@m{bP9Y!lLj70AHdaBtui@Qy4pK#~%lB zolBAX_s|pG%uBr{2=B(+;1s-k>odO73J zxk$MmT%=f@TLNbw!4k{bejxrd2xANL(zBzw9JUKw;Ek}2Iv#)Lf0m}0FhON+GGS`E z_|-2+MN`qWfA9%0eF931*xvm4O(*OFdUy7sO7=W`D5jbqx5{s)C%(3^+#fzHUH#k<~aFb_e&+00j2idm-x#}4bZU< z&0EVLfq3Yd1aSe*9r9-YXJ6VpKRMl|e=@i6o9IcSQPW5h~Wg9ZGHaW*{-Hf_KBv=T^*~wuBl&VTVjzn0!mWTHk0)vmM zh@I)L7nlgLqpc4Nors=(Do30mN*^$LO~^0#0t3L^2d832ZIj@uYSD0`;}tmreCSq$ z{hf}h@~@kdoON$)rYPz+J6p3PYC=;m>y#B;Q1LE<#>eBFaV6r0)z~yRZ?F^UBO(?< z>L9jAvwacLKuVRc1Gzl`;S4z%G21D9l)*;ciz6nIZ0qM~fDq3jxSY916AQLrKfh-+ZY=7SV1cCwM4w%I zJATXjf4>P790W=d2uQgthFx;BDe{jam8rBNXp$oiv((xaDD*mhLq-0LHPp4tX$^%) z!~|M1d^5Vv#YuCrHf$=2Wx_<8c~n%{LSGltI=45zt5L+(C+h4k1v&&diMOZBZqTq< z7>@TN+`Le;w=`x}M_)Is{z(UJ*X7u0N%YJTbpYqbbP6a-8MeMWA?FfxXwuR01N5gq zw7#hmZFbX}C*U6_s{=#ZZo$b(ozm?^U2|zdy6Dck4E*j8$U_b_v_;2yF0%L1SQ1>m zbiYRmSc(0<7!tb~1mwBH3kQw9jjK*yg#)E_Z(-b6D;F$_EgBaBHS2W%Ivm+@857a@ z$wq(VO`YA`KOx5n-#xRd0*)YpjKqL_w6;7+dL$S7B&29hjbPD39fCl!2xF`& z&DPZ>f}ff2dDiESFhMs3BOqvgSaB#j*<%Oq5I1Ip?s4bmKs$@dVH$axtsMUU9wmv& zr@Jgn2H`>PhJLJ<56GuIiN{eo%jP;FZV8ZPGIu`H7m{`8`)4n1o8CV`{Tq!Idqa2K zhhH;V9~W@5Y;3YCqBKVNGm}tn6{2XB)r5h{L1+Mss_hN~X?Ej!Ewl2TJWGZUlLYQK z7^!J_%&LWbK6asD*dEF|oTRQ@j<|Xjrl5XMEN`&&E{}|CEKZS_FHrAX8|}78BGtL~ z8k*yA`}6YOKaDVvlJt0Cu4-RaSBX=FpyN_8sZ*}Y-}|92MV zG{1i_U=B@H`ue`-kYDKIR#k`nT(Ly>o>=393i&?r*F;%I)vK~rklxK~VA5l{EaH~E z-pvDQU4pHd)JNX`NEMVv8s&oQb!R0(*K}1iUWGmxF$lwhFfS0a)XYv6@h|(d}*iU{YLD4X#tdb zQ|M^Ucrh-dt#Ny3)P^4a3|5mu%yeK*(Am`D6Ei!q{(phOX`W8?30)9JLG23^ zSf~J05kQE1;{d*y)KA)|)sU_r49E+Qsgz^pE<_1I25#ltVgC%2qTR~1Kca+r>01j# z2G@(Ps6g{qoDg%HwCDl{u0X|d6P z#j9y>Bv#x43+Vdy8^IB_}MyTIUTx7!xgiL9AHW$L3?Cg4nc(q6dv};(Iiy2DV z1~0L$p`|NLg2tdg38~mIrTJVqHi>j)$1gBf+jm-WD}q4B zDw`cbIFBa1-S%lP$H|yiY8`2zxgn9hFSDm+7jw$ySN0`;Za~siX0R>Rq&=EX;TSpl zHqLMX0AE^Wn?!~gP;vSf0>7GO%VA@d2$%k z2BGe$&d`bjMYJWG=M@G9j?TRs0P6`$wyl)U_tI&e^?yO>3rS{!yqxO%2plv=KDdu? z@c&m(`q+F;6~{y!eJUBdE4te2cJ{r9FfK(r6eV#k<&~kS!f%JyXam+b%h?oua{i`V zhT&$FU1Q4w9=4*hl-IosPbE~jj-G5=A%+nra+VZQ2S6(pN3c9$F8neZ-Tv((!q&6S z^nA-{xOk%y0`FuVd{IE2?~PuMltb}7p7QbR+=#hs*s)LrjzE{nPGPDZd%?ynaD4u zQlTG1{A!znPzFSoiX(TcdDnW0_RMzwe1>k0FRhl)N#+pk3bMtbPM^4=WW}1?;@d+) z#oWxWKKl42-P;d+cUfFw!8}Da{E@7}t%c`1qz1~aEVTK>X`UIl_eO~N`-bK@bMuNG!k#j5f63$Tf`69@HR&i5&03wO{%>AT2ab& z_qKsA#n@AucO zF~zCf7Eb+_ru2e=LQ3PU!5QG>5A!*QVTFbjVa4gd6>2jCWThj^FXCKihf6o)R z9j$NrWWRFc$IRFvQ@#!>kQe1Ou@x<8HI5p#ByRH?Q;J~>UVd-rds*M88*H&HoS?lXF;>C#R*6PIYe^Eq1 zKKXooqa-krxo5pn=k?>Ez-b*>J{hu3*76FU#PAkA^oGTb6b7(8U4K15{|mx+5IO6O zL}?8U3%48kWYC9`Esy3k`TErKeqtL_`G0HI6Cb0wrX(+FERZyY;uvxsOgzEbXCBct z$S!jclT}TgrfJ!!B`i-5i_MM`s+Cmm`mX6 z32G;FOEim~H0-S^+x^!D@uPSDA&D#D?84L{!nG4R1=O!ioO>%AMTuajO82+JGDvYK z7V#=#JZs}+fQAX0p|M>WVaG;RbA5|80*40D+Y{Su4M#IbO(teMg>`Bz-c-NSY5xp6(^(y3 z6*dXXZ44Ckg3=S9$1z@No^OeRUT^2anoN0uV@CU-j>lz zS~wj>NP6icIJ~(6m4e~%?B%^@Y%(?v?}gA|*dOt5d-c8HNQUBQImI-K1~5{{i-*1= z{!k{%ncBkn6x~aQgbrrDp)vnn(R1;VcpTDry-G5Im}&6LxODXvtG(f){B*D2&lNfm zj#`v};W9p>DLHIe8lnzC=qgi2DLDMs*C#ZO2PXrAgCII}up3bzyq~HZEW4_^_mb&! zD-G#7)T*Jfiqq&gp}n+ScPkP%>3|2P>Fi{d3)$_a-P_cVi{q9+R{9pN`N6zNsmFIl z$_Mvjk=rkICzV1LumxUEwX881ScUlkLL7JSDhDyK8@dM(uw6>$Qjo!C<8(CJ^#d-Q z)c<)-Zpa4y|54TUm6KmTlo=3wlJX!hBH8k(KP+C6HC5+Xt>QW0yHMqy2|>Im8<>)M z&Zsv1(|A13nAF-XFG;=8+&R~iR;WWiG=P`@H*l!;<37`AH{XV- zR?1V=1IVRXlng;2FT!#ibt2djU8^&n-9v?}*$SCdk`o7i(mHV(&fyf=PNvW15$I^l3 zX31=TT!XB`XYSM0?il+n&xK~F@e58}oXgtSyNHyna1;fWhhEyn^w;$^IjJQ}G1nr( zx5NwrxJ*aHl!hRy_b?+&_e?ANut_=eS&-3LuKng$b;DE|TRU@PPoy#QfLt$&36|`+ ztYfWDr+m4#XXe)KMh)URILg?C*D-?iNK`a_!^w-6^~`yv;o`vT=+T#VX1KZRqBVJI zzxw`e+vb>IsMn)1S=8wq_G=$QjZ~(FQn61w3;!Jt`?}LV~9Sp)#J%tk@hZ|@F50sgYBbsQ= z&zyEoq|}bc^qeu9bKF$sB%~$-3XlDl zh+s)Bu8blHyv|dOtS{MS@z0YK@_*>mA@s~mzoIuI;@@BT(7|1~nrz+mCy26UPk>*! z7CX^v%+K8ge`Qw7ud`E-eNPK3V<`pqgt{) z3E7r_M`G6@IxkQ~NpDC%&Hl3&bus0_nCx%Lmmz=rJt@#KkY`Sa4=bQlN2c^sn|$T@ z`DXFyy?fRtw%iHw9~Rb* zL+fy3y;AW(SP?Kv20`qs#+3mR3}{NhuBJyzK>U7Td<@-#YOoXJXs(93Kgl(tW*V%fL_>X1Ri8Q&OIFOBM1ZJ5)G~UX zkU{l+=^k*q7NmeW@w)7k)JPN|kqL8hAO%y7qQl?DOaz8Y0D>4J<7qjzZ1$eVmScN9 zPJPu2!{~ZCr&TLSuPUN)Gi!}0?UB1RtV}KIZ}`QU2U0Fek5bRdLn3;-<}{0g>pfg? ziU+pMpaK{mYLo$Fo5WBb+R{2`sJ@?NLSo?Rb+wqZHZtf-YjZ*iRrR6eLgB|xeh7=a zT`Gx$53YFM4Tz{GfmuJwsl{c9Fm6!45lTBH2(f+XY0$VR9I<2eaM#V6nO%+c@6!%Q zC&NcIx?5k+GPlj5AT$CC$Z&jB{glhOqzXqiZBk6b3Ku0^lrue(>yPemN9=$gw3x+L z-bcpFR8l`eg?XVt;LfzovUnXF$ax>dD$7tn9kXGptvEgI92seTK=V^iMw+uktO3>- zPotB!jxYi@Sg6;umXAo!1WaA7E^4K=vaz=o!2IxG`9iYAngb`<5gPvG?u$xhcxD0M z)lP*AOX|SQX}Cihn#w1h+-K*4*Su|X`R-Np@kE$i=edL7RcIyH0cpoZmkj=IK%I*< zMMh#m>|3ger~I8afrJITxGC7yumZWk7Z6bY8rMU&itIToAWy>GAMyZV5t! z)IY`V$-EuIaAbg8qm{((YrE76hT5WMmWfi}P;zc{c-)|sVO$mZagB66v=dBSO2E3E zRp)?xo~bMm3#VP9Ls?l~CoS|WPjJiJR^a*bht)+tFAN#$t~ln4RZ-Wj&C*n8Cs9RYkTvjluG29!1rCOF|9yt6W$%0{J(XVjNG70Kj z0>0*{nx{1fwD6rrfWg4>z>FbY8DY^#)Vvrxhp?rfUzqJ6T_Fy|&Y2NZ8IBn$N085A zZ}t)GFNWtYS{fIZ{4c*J5ZKqlMu4~O*x3zf;+T}`{leGR7i5+Ipg85INQ;;vj41lT zI5Hu*9cS^fp+|cnRplSW65Bg7!5r706sCeT`b`Nd!3tJY@GYT;!x=j&G+!<0>LS`8 zv@Vr`D*3=?8uPvlSH++~4zr#npbbmvqG+b-0m#-aQ?3+CkH4Q`>aPcKIWxXJzOyRM zLn^#zBr8B{5{{3=&m8CKKqgfbKG;xwOsL0R-~(hYH&D2A0OnN*P?vYz`pK2`>1|eD zAK=&wkvN2ARk`>RwH7npHh6O)Xn@7%u|Mko%SWhU$clzcvm`^Q^E}mPDVgvFf=Uri z9oDv}yjAWiU~WT|Zp17)ZlL4~W|Nd#Mww0h==+Mxb$#a4Kz|_P?DnYu(xGr>^F0A0 zTE@zEGivr?-|C8`=1#0aE&D2YojN(B-RXroMBF@CPzt?GM^ltkyZ{TaZ$!qPwr1P?X${*T$}mg|bn=F%yT11(l6$iuw{Dg}F>Uwy0< z#AzcC(Jw6vrS2($M8@xoBdIi@nAa<_uR8dHHr?@J6->ainZsUE`*O)UW-gIJ8ITwR zH;_u*uwauQ*Jq#a%e%V%wF2}lF~YI{&FBabJU67E3MTdvhBYx{qH7G*x2}>ORZV92 z>SIjl#9XK=*`^59z#$$-bF1$^KMHvv18zO7~ zk2NdF6qGg+7Six=H~&^mWXEyvcLc(;zp?O)iPQH1yEue7T`9$&4+rC0aXjWhdh;ri zcM##@Lk>$Czg;0ns1svTSxc-vQ)@%+;qdSrZtM7@i# z7-Itn?Gb^om|`s*(^ar`B35Rp|7)KXh7Y()z7`j41v!~?PP6-A)H8|Jf}t9|#1nka zDEm9QW0JcPsAZ0tsv5>$u6!7}7uYM(x=s8OAD&pFFE68UA z)IWBzI$&iD(J3wnnAA@6xdf2OAfYVk74||dkFHjX$jAYrY*_npow)K6ydD9zJ!MXt z_0D27O%Kru0#v)aL7I&cW+>}ujSIOgJyn>i@+32hX0-NQ2lE|J8Z2jT{srcz96;>| z$~9`%0_35ZAXmeO^EUHgE|g@J@7aSOSc5foc>#p{-eP3j>^~44WmUtHwneh#DE|Sm z0#7Uf@IFV?Nt?%{a~6K@Jj!-|DSA%^Mkht?m@_0yJGIVOfw-^1oIl$41o@aDnI(5!HiY)8JWF!CXWh=B#t zdJWZco%k{xV(8W|w`Tt8?It<6LzkgJRE#pdz>+{uoC%3X3i`g5t}qNA zvW0nD2@`eLOw0%2#TV=+7hL-N(XJ^OnbgnYd+t)v%{uV&1WUuJ{_bWbIp$ZTsPnnh z>lNVgx0+~-)fzrXW$2y}0&AEjCdf{L%3b9|Lq)(eJuM_spJ0b;;_^&V(?lj1-<0oEhNk_N&j(; z=sydAK!6*Bl7DL{vqN<>LkgBylr*-VoO(51_4F9Mll8IJ9}r@0-oZ7e#b(E;}z_QL))h-gwi9Y}*ZvA>6l z+fH+4YOf32LDT4@gwyv(&&Nm#CTSGab`CKjXCrDRH$b@qbFpEa#z`|$dqjMY!ot_E z@Zkw3q_)N;pA*m#S1`M`RX}wsdGnmj-?s0`QSdCX>dXIcs9N;(6*q&`5>%3&YjUMo zHh;xXY?(oY*a$2x%Yr?vSmmKTEU%dmBaCtTO0JdWlQspHOJaP9%EG&mtGKM^KI24h zNRy;ScsVZXcU`mf(p&-!cqs^-t(`V8CUv^1o5E|JmMYmB1*RxKDRluv9DReeDidKH zwk5MkWKjv0Qu?fkxW}W)TKMn(DdYI`g2Jd%MQS9bWAhZt6rWQ?;A>e3>Q0`v(wrutg zAExe7{Mj8eL(&@y>{OA@YQ(k<=mpM$j@kTY@{3%#mCbS2j0z+byEb*ZIx~K&-Ik5DA9d z$bj~k)SpytrO-`^`&sdoQYPitjuz^q$tN!oIGip~!ZaOf&t^qIfeWpsVdSOQzE^M1%bQ6}$+i zh9=+b;#&e-KjUYWrW`CA0BxLr&>>~%)z1JFwaN?<)l`&b$OIhq^(Rt;wKQ~fn?QS6 zwKN&3p#vt>#X{pWC|~uDpLCn@Zq{iakUPDiykAH`0!`e3p1c0vpgu#JPzF0xP)kC; znt8ZS5r*!js)||)4GnOLS(PBuA-#fZe9$s;8Z}p2oud5cehu2eaVPQ=P@|C!x9Hz3 z37DTvVUX zl*^R~Y$|V28DB@8D$YPi@Cf?42}VN=$9bqhopIOe7(|mPkhgoRT|OR^TmIaLdvv)< ztgcnUscX{f2d4I|GqXoVJipIp%p>>|ld6tAFo6bO_BTZr&q!{V1>xJ$7+$kXQMK6= z{?R22)B*ObbG4Ywz7H5CM(2}S(q0<0d$w)Gh&0__CgopJk6||Bf)7_^k?`XNM{!xA zcjS9*s!rw>gda|et~VPK=z7VUXP+nc@27sYkk0npl0-B<96F-IfQ(DmhrP3Syl(Td zGfl126rEPhS?>vHM?RpK54hBV)Bi*bLVresT45a-^PEx#*BJm|N4kfE83_e6_JhHG zkY(F90=zCI2K-nVF);@hi_K1X7iiIrylU@uUKgM5(KPxf>S|AFsPk>CceGbzZcMxk`I_!MFD^U4`e2X3 zVyYmesKk0*=_kGubs}|~fsQ{sVom`qe$!UQrj)iU{cy>Z{mTyVLZ(s|QQWCF^>F`l zEl6IUQ`PL1#xaT<7*h7hi;h>H)Y&nb2K8%{+}x39vSgjVB2EH%NDd^UqR8Q1MD=&7 zn*)cP7fKI^-~1k7TQ)G7NJ?%Y7`u?v1L{wTF*kC~6^KyKIrvB&-)!QUlgwt^<7Z!K zBiIC>6RTRcWns0momeag)JAZ$bN>Q^oPggD9g<`k#q1wBVB>;q`2Rfw-#x!k$;D5k zR<;Rw=1PM_e44XV`Qk72dVwH3fagGAx~;_oGud*&qrUqP(9`K}{fSI}C+|!%K{X!9 zwv4$L_R&!a8q>U+t~PYIaG;E06rk)>#Wjzv4?@g&!G20Kch2iBJ0wZ=ahJ08ckmL~ zg+Kum5o9}o{z%pzx1wNT$Op)+LFWQKrwkvi+A4YB=E`#fZIW~AvZJe}#e^Yv7Hb2O z_xG@SwNPcMeArx-Y7j==uW0)brcReAi?3aTxclkz+6aH)^Uo7|3JW0fX2hheD#8iv z{`=$w)S@Isdu*`&-7`i9ucM6zg~II4exP@yrt5Oe9g~IdV^=@4?qw| zNA?k#(y06>wX4lcePx7+k_h@C_cqVZo?L%U@G6G2FuN@3)CRKZ zdXSF#{8A%Le*uwxZ&+rhkbPwZ!q5e>d3JDslcpr_&tr?jfS0)*)gA##4@`x35*#N% zMH<+v(r~46C_2Sk#dSgXb+OE~-#!#7qlI4;4B{WyL=ek6%nFb??PPc3y$5fd%RG#+ zGz6rutu6iA$$ptI#Na>TKFmT3AFleA+lSE)A;<&>)zQh3HX|!j743qfTl;b#_|Z9~ z;E*v9U<}R5w&$=gbX=t3_k3ENkQuDFz z?r5Zz|8WU?eL<$iPoB9AMGLVPA@LO`-447`9`GF#)!KM?ZU-=ZIXs*z$n~>MJD+kp z-TnUx3*NVgSpFT`M4}(rW(0I3KXP1Ab4>ZduA6>==-WYipPVZ@i-pgM)`C$rG1e;3 zmtfPCjm79-%61@&EFZ=%+-9Ra@^;TmebS<(C`LsvbM|b54W7TU3m~d{el84KJT95# zk1;kuO`Jj*xrD5uKE1%hF*-P%c~uSRw}t&&yxR&@^^T?Tz$0IDAE9#YN+m1GNyb`q z%%59On7n^p-$+&QI8#DlNO-Z+JFo{_a}KEfAS<*k6lVo^Cr@x zl_nF_W0}E#vNLYlNoZ&}KI|z;)d9Gcl~QdWwM_gq*A@e-_=?F1!+=x((z30ex*lZp ze|g2+;nS%Q${1a_>dkL@XB?*ss+9ID!F%h|HyT=oLu+WEm$UyRQvrFNgS(x!sVq5n zVT*N>+?S$H^Fw7R_MH@Vvbmw75y3}HDB1$A&b;U(()A#0)$lQwioy`VpRI;_asF-f zwpat{FL-97U;}tjXV%Avr`wYZE)fVALue1*KGsLIJ4t?@{(lscM0(8Q05a&Le`y8< zjvIPF3lZu-2EHKTmw(MK*pqHn-T@if(9JX)oS>-DD-{UShti%ROpQy9p}-ei+msY%}1tVY`uSUCxk2|uF7W%a*&ZoTKfxgC&_r^UF- zN@*_VBot<_KhrsR`c`K^8-wPY#EJ!zCSBILXA+8*cC6{a(q}nTUeh-*pU1C8uUCPy z+}4irNVXfXiUWym;%mv6ifRp z+=chO=Klsq3*TwEMUD!TBv2OqHVo;}??G~7-2}H^H$TYn9bk9dm{aQ$&9fAyFsZ$# zrbnR|ng4897-jc~v37qv_p^teE*Ft48e#Ff_H57TzZt(E zb7`u1%H~4=`EJR1r9N)2vi*tQGrD%Z)xkWqx0!7JX^(@#|6a{o;#Z5j72Z%XjRL}q z%!X1-uoU0-Th=#p1$Lw3I~i2akV+#}D1&O<%uh(4vX5-E&4zdz1Vca}j$`Jezh&mJ zUvqMO{`}j}t(|)-+}ouN&*9d_+s8Q&zdf@GzXElO1q<#(7)h|@9K;C8E5{*0Zi4t` zMvY$jpg0Y$y>V31`LnDDt!xbg#d0fv>J|e8MAI-Y_AaM#m-&n2?J2RaX-{UecuF&F zar0Grqz-}y6bWkRK?X9~%IcJ-%E8d@kVPcdwY$`on;0YhU8JmhR+y%;PDEf_o+0|! z8mL?kzELwvWELnRzS9P}`q!Ekp1kGa7lC;2eC|O!#%c>v5x7SqNgaDOX?Iw&rY}7A z{$gy4M@??=~SH<+>4?>~Q#Txep|0dj9R${e#MGwG>;c%-9XbWt? zU&zMl!p4M>a->#!p+3%q_Pg#?k0h;ZjG?QSsDTYx{@CN7=bT^fV$jo zU8IJGeVQD@9(h!Jrwq8$KP{@YeNWB61ME6-2(V;<=(vL{9=$t3f4@g;(*-3D zDNUFkK{?%<$E~cx1Qik6RMWWZ^j*Zq7QDDypBNH5n`9T!lmc{HDTvEC)?~+h?H1A7 zJohn#LXKYuurD0L%YXX) z&kDW%@Nc)=pUEYGyPOV-9O_TW_x*uDynN)KZR9r@@$!*P48m{H*v56WK^W~YqQe@a z<#q!rvsuYrVtZaeU7G-z428$_o0Fw?<5#~(0K0IH<=GtmD!|I4l%NNs9))9nh)?Ax z_e)BNTl#(KGvVU=+v++B-)KtVy2&H$WNAV;Zg#yIC!4Jk@7>a)E5GTf#}_8|tED5xi{ao&F^Sy$+ZqMm;ZiagdABe&4S*tHV^&vMfR#h zOZ`$lgIYEviR|adsRasz$p-X~hR?>iZHGcK7Sz(?{njGL;k5>Sr3LCoVq-seQUH15 zJQGC#F{nMif2QA*4s_Vvq0k?ICup|7=UGEFLd8e?N@~_mqx~U4wF_Ik#E_13UlYgQ z`c49%4`U%X?aObcew28%HppSe{|-*L#G$1`cs)mZ&u8m;C^6)W`eYt;5E})tpTeIl_JRn%R`;nbbok5qjgMRZJ1&bjMuB(MwSdBNp`e;&>0H1i|gtn)hvF2T!l^aCGbQsfg76f z>QPp)A7R3Q}93qBI3C)?rY|70^xxHp-Qc@$&{yr@D6v_mzV|jT|n;na>S@SIVhqjJ$7zotp{*KngPTB zy;N@O~+_QgQ}5zn!mvgMLuu(8Dr~I2=olgf z)aPry8k)Gee!mKFeZ;MA5FZkHkuq9B8E_SDHObkh8Q7dX=IKUe)Z#RyIN6<|)1=Uo z7x_9kK9K6dP;v9{vJJlzpj?>J42LECi;a*)p^;@5@pX&i^#OM=qV#d&l^mdX}BDuD;_yH-`fdhScx#kcN{Xs-=#5b<@gZbKq{w=OF!MJK2-gw!I%ahuXd zwp^E=`C?{a$@jlG7vH-+Av4ajC7LDG_d*4N*ZD7AcAA71Xy5zz8*Wl6gy$bg6rI4z z+kG#8vFBj=+}cSrjOhrGA}*|4F%uT#(UZsyk}@oZr_zj>$ed`!D(a$t9ohbb2TtV= z-iMAb1t3|QfhM7KliURd#jeV(WBE)5^LM}QwDGu!BT<}7-tMbtgk9ig@{7WP5FXc6 zow69g$MGE_^gBb}A9rC|cT(LGhVdr_@b4scqVjPo?&3K3r$?BYcM3^BlJ4;Q!+C~cvB!h+>GWu zUSO|RLw`Ya%M7nRIvQ@RmvsFKFVy@Yo^zw^(xDrSDc z#VnK}K2Qi_nG#UYj_n}{Uf%fk z1{H&IyTO1FWn4G8C~c-FurYIUrw5RYS)5^{4h8ODEU+g5{|{Y^r3hNEuA;+48k7lt zTjoI{n79kcn>1)}vWmHDpYxfk^?a1cW&BmSUIVwljO>3XbCKCpt*38C1XjE`0HfsqXYFw**~^actgBS2GFbn z3+0yTq^@PJpd*$!vAVKc;E8s}E(oy7$nA;W!mBbCcXQXQ-S_-`$I3oOE}<}!#S znPkBwy2#_(g+9Nxpq5RVeu!@4l)XCSnmrS|$tNo&4U=7ZFV8_8>@Ftj3I@|<5T8#3 z$y&J)dD6=Pec7y@U3Tp-=f-p0)YZYw4lw?AIS#}>UBzx@WI^=_^^ZS`+Kwi?Q2$P} zeDe|M0M1fS(UM=&@d zAxsxawnwlTW=mS>TVMV4H>XBB+eW?=Ql;#w zogv=r3IS4@mNqXC0gg~!J*vhJY1DCh(+8O4#{qc=m^J=`DU5le3)V^QTPA!xQLTKs zQvsx|GoS(Ccpu^2*pL`Htps#GP&c*3gD9Ef706=|EJ~HZQo0(4ckEAr z15h2gWFQ!3?4jGBa_(D$!({!58h{06my2xE$4oo52jA}F z4SZ`ReAB~4E)xbePUJ~0_u_*BM)JKY$_8f6WxJC+K%qw_FdV3*oqcQ;;< z%~@|uok;ZoBt1Neq)MSXEv2a}L(ii>cz_f4^}vJg&3WoK&TSZ9ffDL78pq#ZR{qnc z{=!vm)dbg^9r{c@3T3=-T3u3mHNJzco~llZcvlnV`5NJ!=Z)_JJUX>R)FzQnXIb;Q zWsh&kDe4Jc0w@*R`n@_No-wN5z9dSHvS_^sbl%AM75D79FiOos_g>65q2PVMvCz+) ztB`_7&}Xc)iXO(qaZ^lAbg*&T7!8>)0Pm76I@(%p2h7-hOsmhsucEY9o2Y~=?<2XK zJeb$ln6*Jv->nnTs^C4o-~ybteTEW5=M?_5p(ba2-G814n>|$=tN#oS4#gPgQ*~BY z{GH^lCCW-d9>u*p!MhSx`9?~qd%G-ZJVRFLt$B)$J@+X4IlB$s?a>Die@IG zDAwRbt*y#VA;)P%EsEDt)1hkl$cKXwi&{pW9pq3rKZm^NDInycZ-3Q{@uPKDmN6$c*J<%7)VFHT&HGj2YR`7OPi1Xe2Km-pk7fzEofw__;vDJysY-= zIC>r5v(3qqQMAt^!|20WoNk1qRs{sZg!URCvXtOle@$>$`Q$RlKzD$kKuev;RC*?w zBX6*!bE$mZw7JL4=jJh!g-Gp7E_e^{yFYhtaYQbFf-NGa019~=Y~C4oxS-rT2&fIFur{JkP?#ttlz*Ej z=S;8i7VmA5w&@F^-%L%Bkee#jB}+l!M08SPThAUagbt()5F1d|@?2|L8!~_!M98Yj zG~!*Oium@IGOXr;`YXAeP-Yk+O!CLG2dmnf>eRkZV&l;{CakALx9r!K*a%+p#)p{F z&GZZ-OAR>v?rqjkN8w9^d8<&enHo8+zm-f-%+jfQ7jT#pg|!O@KNQrtf`OEz2J~IM zY!t?`R}C2ab~<4N>9c&{>YT0-l8a)mz`b^L&kTg)xwM(D9eWer^6f{!PPW{-u^zp{ z3mMR_Sp|uEf|*;}Z~qo0pB}EVBQ)`m&5uP&BQ#GEMP!Osp3-L^X=`Cjv{;hDc8~0c z{S=_^RbS3#XwizgD#i(cY+kmCVm6vX^zgHpZ9d4i=O39sjAkxm(C?ziP0od8M_v$F%GZ{%MtutRG*cIIC^L45h&1B`3KcW!|Fdr?up z9f*|G;7C413j<;_!~=_B#S~@I3XtPiZ-^txLw98iZSjZ9KNNvhxMs<+_Oki7I6FUt zppj1GuAZt+i)qVJB1#GT{lifP&f|6@5k==o3E2|u5}Q(I3BiNee+es0EL<1Sw-;&K zcF>;HAWNudrmV@tgL|Slrs#K0$gfmL*`y!QzkwP=sTmrc{gCLFQ=DO)7_GDl#2>(V zMoLOifLZqFp+?9#<6|?@dHpa(^o5^bt^0QV(+*;uG5`}z?}ad|l6PajW6N3oFvQl7 z1HTjhezo4RxaD-i$tCP^h(t;R7`^)iABDumP=-Et5yce7Ma zNUbO4l8?osBgH9lkIv$YnPx6SK7qKPZ8$@)4o8kqhUKgg1G`r*zC~$z^m?5-dl%0| zvK{L#TN!BD8rj>91G;YGmZqntcKpCE&#&;fgTsr(5$YI4E6RN}jq&7vhmD|kN)`ZN zAtbia&akF>-25~;TS!%AVdb}&^23q#mR)`;OjWdL7VQvbD??t>I6(syG4LAtm z{xO0;Slb4aa`n=8-bA6#CH)vKq(+7Rf5aJF`goU0n2iSf-sRFF?A~2yFN9Q3 z6wKVqXy5}p%|T`;JdVow(NI(qwnHi;c?gAi5qY2@A2yKF#?c`E0EoS^a?Kd|F{Mbe zlF!#auuQH{6PwU;!PM!jUb8f6!ryi#O$s2!wg&7SV$jX^(wrlIudzW?{;xy#o%cj{ z`o((l9BkXK*oslRsVT9rJPhCi3-ZuQ4*1;y-^a{^=WUYFQU03?u$X? z<6bySK2-%HWmXk#LVTg%oeTQ5p2eeN;-ZcLwlNW=R(Rzc88X|p+VO|i5h(h%F3C{##@6k zTA;~hnSJ-B-VFw1@NrU+Y?{a`EQ7m#_bKh@hjvaQ4or-TNwbLfqV;%1v<;=_k`BCW z*4-j*;#{KUA;26+llpU*2@(;ykr|%jeZ6AtlG3B~J;XBfb-BLyJK<&;>Dk#2)mw4| z8F6-AOfU}=!Q4Kpi2`Za%FK08(DFxH`i+S!aEP8vEfrlhR{9UR1CDIfice)X@buOX zr0`b(PjLH1-kaTj=8;k!y0%Ur^-(o%@lhB z%P0dc()S|-kq)3qQMX7q7`AJ2iP=&013&9Sdm$o}!*qE1zZzKPT*S43*H7V>hN@4o4n=?PeK$tl?ZwZ6_D&i<&d7G=tP*5(M+FbBplFVkp=xXX)8WpOe9C00xRTIJYHHI{eQn-2s( zG)0ml5zOz+;tW-YV4l^{2ao1jPQb1^^cfV~1IwO*VOSZ~Lo5|x(_GlKSP_pVRhB;d zc_L4rj{G(+uxsPcVwr!k0^=w}8B_0veD7!j|3EcAmD=M29YW99%SMF61-iWt{?8mZ zE%gBh%46fPC@Fn&C0m`X$nS>F9`W~0A$(W!Eb02M%b34a5I*UI%4r?`r0p(G1+0gN zbBt^KGrdWa`A*zC`zEFYYw=&##9N%a_r|L6wPo|qDpbOxZAh&$EVMus(~)z8DI=gc zl6+d`*sU5m#CWCYAtyDO3MjfU_!hbEJAD?I_mR{Ujc3c^?zqAk>1 zi0Fa?-Q>1~G@1ySnkkhdTLt?)N)yp^TOY?;PW1Fl3ffkFa)Qlv@YvyFoG2|!LK$(- zOTjxnH9$SjsBJ689ac4f)$RotQCU?XX+SL|tyvLheWBJFiDICrU<{8@e50Ls+HC1IQz6JAI^1Szxtj3`Q^=H<3VStPUy)(k>aY(GdXHxaAw})bU8w!wNo8xU zSNW6}N@cDPWodLU9J7(#Z=c+R90DzDnyiR}rZS!WSJw0Z9Y<(#;hf#QS9ohmF0Nb4| zx)T#4{{0F7u*LOIC=C6b1$l=i+A#O>rhxDtVO1{gV!FB*dkA;9X#?$%E~qU1^(9p^ z5|9f%SmD`;5r!^s7Wj|)Z=7(8qbl1mxh;r)mwK^ddVV+Ab>m$`=aCC-FYZFig6pv8 z^9Q8%=_MRf^Xt;twuFTb*;_BJqW$uOc@G zh-_BkZnO)w1&f1z)7n-OBjqW%->i<(sma}=a&PGAkvR%hc}fvskBc;h^!ky(i7e0w z6GX;43{H$*L)L?B-A$ti=<0Hh6T`^s9C>|{RJ?##QM>F?(KYUDot?9l2(?&!uG5idR)4bXp{pf#uU;SN6M&$%UG^hNfJ^T!_E3S8@cX{|$# zs;!NBs|4#yODF93+EAit{805cP6y?1BHTp}JVS(c~$TjKn7iy#^e5L}dna5m`o- zyEpZaR!}oV=DG|Cs749Hpc6YZ4?0Wk{xjra*V1kVSjPZPCem4d0*G(NjW^RCmdfTO z?P}QAeT4FioMaT% z$A}XDF3h~(LQufZRVS{6>sx*5vxa+9<6ZQdu7!f=&D>1uO*ym3{xNym3n&>ov`9*v zIBwLX{YmC67W^Wlzi2g^fyW`KSTAH4``72nt)G#-#=v=wu$c|9ivz;ee{qz~&Jc0Jk;htEcPXaXs8=Jot|*eNH*j1@3b%tm99^%wZe+nQ*8unF z5uz1+zKyRLOOBFa?IWN{YckahMuvV*)>Ukfg|oHc$Zyee zkaz(PBEI+9z-w^n?Hs}--KHvBl^;Uc5k78DuoO;@tc|qYx}Brno;NoDZL`l_bFRE@ znBnS#;rM(RoAvWa9~CF=R_FXV(=jHz$&LqpXpx}A3{A4Dlf;za4vcLn9}QJUMU#e_ zc$RFYJ!-$`!-}3w0Hye^*kKYR<^WC{vRxbye&vq##}zt)!AA@%TuUP!GN$x+3_o?P zF9rWl#6T1dllV2?nbd57eR!AMWE9DV2G%6E4>rWQRZKwy+eHKH-L6I=H9ls`S{fd* zcI%^TxI?wF;guhRewt0%xCWXIlxJ=hO-d!3_O#(`Dru#}`1HI{Xt8;2<%b3$X=fC* zv&>{PECGU?67(!>}&!j8X;A0(}RlidwMtw_ahz4Sd>3|QHh>owB2J7 zdF65fu&WS~4Ya)r8kh3oDLiATxGMR2=^O58m!ZHpWrh=qvN&U4w#D<7Kepck;KVPg=m2_sn%~1(L3^@{y^gB~%FAw#XDJkVV8Mx^) zo*lsy__s6I2l1K(Sx4DnTm@py=aKM*g)7^w8K3HzW3lj;%`0u>RB~#XDC1~h(JVAM zJzQiVB?a5pxq-5~qEb~6s;*fBj&9B4D$9^F`W{4+2H>Ew1irHogc}?+)=K?zzKVmx zBuI&h1GK;TbgR-Qr#FT1cgc?9RajDIYLMZ zFaGK1GA9N@mlf0`H#XM6%sL} ziU-6~Wr8O-Jf2Nn;0{p#Hfg0+&?D^MdPt4fKFWxo<)h1$oG$O4asYR^lfiJwJ8c#g z{F7hFn4i&t0BZ5sbb++137vVP0)`ofdaW0OtWtQM;8r_+SAwj114K$2ZBfHN0&~}IrybVuSGo<#!kSdpXQhuhGodEk=G7`k2pqo_Wz8O!3Ts;4b`6J?wdxw1tKhzm#czgtOnO@=S>wfIv&Xs zSz<(I)q0T^$fT8516@wC9K!co=>ZI%89Jm;;31oxcyu#2~DJUK}TYyv=9Fz`F0 z3u<#CId$-Or$p4>C0NM}A5=|5h+b3hpG+1k%ox?j?O!8jqz((PYK-@b{f z&18B@gsh13+#73xYj5=Fhw=X>Qvn_~+kGHM(=}t}ZAm;j3Fr-d<|V9RmW7)G2-k(r zDB+p~&k8$Z`8e}nb0e(Xrr+A5kHD=3WT_o?)byDm_G_>-C56d7Tv{NVZ=xAHD>Uo6 zgp0N(^+^ReK?9kzTA@(QcHN)AHuMJaVSa)fVnU+aKu~yeatP|#-1AbNR_lq|PSc)! zen?3ptp4F4WyX6Ji;%ufC&*u*MW8mh;?yE{y2BbgBE@JN z#So=RVg#w;PKr#3c;3J}xlJk+7=&GYf*|SKAye%b!;; z6Q)c1C-_5-#~^DO$~ zWf01fAJm-qj|emMi^ihoLNc8gygn`zKvf0<`-&C_;sL*^1rHjDW!KX)gnbIJfH3{c zeFZ@%<}yy^xJ*2}_lXoygZiy1n$#K9+(X}GY54Zj+rThxnJ%hW&@}4-n6CI|%SFSk zZQ5f7DSf0VZr_hb;dkZyRZz$<2!(sR~X8X>1=@W0hyoQ-j?`>p1u(I&+{%>sGw-tx!x$7Y-D zjlavX-&Ve{JX`hN3p<;$jLko|0dr;;ysh5~;nrf1_$-2O3%N5Lz^O?}C|KX6p`h0<4e;kS~(os1IXL5hC>< zBg$FQywqpHLI(;=nxBB&MKDnbJRDaudMd}S5n&GPXw(y+H`xk*C^L1oY$#5iai0g; zW#utDg&1cMXJrY|Eg9sO!&T$BbnDA@0`9=co2WM<8TgaRLainqv}86XZKp$|x)_UWAmAflsg^ z)j=cMPdOI~3$pt(RZ*=RS)=R zO=|wN%y~rQ96Jx2M&`V|KAlj*3WU%zq0fqqL1%Xy0fP3dEp`=M0!z_NHE`t*pFru7 zd(Ix{Wl^MZE;mc(UoOu8n-N*8T9R2DP>*@ZD;=S0quyCb~ zH@c&&K!-U9(xU;+;~86_hfvcas{Nq{nXyG@@=2H()Pyd2IO%8#qHNDVMYF%_N0tm8`5zJ&Qn_wO5=HQ7+}!H%fj!K=tUSE zj8?%?7WQh}giVGneuvi#e8e0+QeX>gJeCYWh$S zJwC_PSLUQHvRb87reC=mbWpwb(B6guf2+F@pNkvfs>1i3mr^T z99=R89WaAAcloBg{GICd^)2{-98U-@}CIn!d z%EJYPHUiDs@^wJ|bzj1ADYg;WxbU!3vUU+}|sI+K$|&qH}|=u~D0&?ewzs?63ioRAQPhv-mB-$2sy{j23L znraaiKX-X#2^>sPc&3aw16EJRgx}spCm_0!0JJmbk-_aUOUN>_x%D1p#aqM}uOaBY zr6a-%lADy(AMV0=LSb7V886ZEFI38c((WbeFZc?r%Cb2m#?zF%eeHFuTUv`5dvhO6 zd=Vjv3^Mqm{hFNq(Ac#izk}kpr&@lDs}s--__#+?fk>Q*U~OlV0+pH_tg6_EGrOjl zN6vN@DXSV$&vhjA+apC1jPN4A0Z!-4gXOosByFD-MHO-nLSHgC>E0X!x1k8)%ln{d z?7xU0$r`>&3WaB}@k?S8r-0&Y(6kC8tOBfpB4F7cZxS5TV&EpWgEh|7&C?9e`-(ws zyl@C$YaYTA`{vwb8F~gYKZQE@ULGQZ5RY3~hoW}CNxz3K6HCRHAcc5O6Y&jz5QtL7 zoDW?intWwu;1O|ZxcrC`Zp24KVfMRWFEBKy^j4$l1P4_LbV{OPeT8Gp=9=9p_N3%8 zcaQVdT0O45?-{*2vO&pkGry@?@498rDjim>7SN@{EZcCNcL%QMG{7(sdBAJIhl5$% zeteX#S#=hR54Ht4u$QsnGkfnyc{(_Jf|A| zTC_i=*a3=^o@UbP%?LQtYiG|gCFQ>Kqu-=k;{L(f4G?Yg8B_Jg1iUYK1kJ1=^)}bq z$%A~3fQ_D&6G8qQ>q`nsQWzs0*5XSRC2+$~Mc>SqzAfd`ve0=l4A=T2fSFnZd~`xb zqw`>x`wr5Gmk|jq`>O%>sqlpS^k7UEv?_WNB>w0#K=V2l-Mckl0m+m~;`C3{-(Ll5 zZIj@95;Afj@Qe?jp=FnNKQw~La}Sv=`OTQ~M4{m@-k+oHwtU^glWpR8C}fyH4V z-F|UAyPN`1kHjODnQ#2q{T>6}WUgWC?EAGaM8&nCUO=M!xYM_pkzfPkB!aIP5pqkND!Q^k_~!CFU?7RqWjhXsvE8?N>_jMIDz z>dBPB^Q&lEty&g8kn*$2^R}MrYs`iT!ZiBCD3>^sXZyY;wdaR%Q%xE23;P~~wiU8M zpdNR{PL6J8>(Q&Aw1@dGL;p3)YXa@d1gl}(KS>e}Wr7bD(hbx#r+GbmZgxd5G+F-& zvMP0pL-CZbDJv!nhWsqiERw(DBxb<=Uk^zH;Uc_B=n1EZC2RGMdyukHDg66f&AH-( zy89PlM<(-Vi?y^HlHS@j)BW73Q)m1L2GJj{VIu=p#x<-Nbf?x!NUAnBv+c9~i5=N6 zlDSJ>kO&zZSe2r&DhtP0aP3;oXVA&auMFG=zRp8&qtLxq zSR-D26(GzPZG=kwL5d_$&B zLRzBk#~a2%&qlMDo(@v-5pEQjpM6}xsA74l-M zN#wQ6qAnV3YOsYP_?BoGJW=T7ADH?!wupi~O33iNCOysa$`~LT;h>{udQ}HfLI&91 zf3Y6Gl8A_=vv=|90@E$=aIKg zn(C`so+d{b%Bj3I5^wtsd8^0uf+$M5s+<5;1|&_1TE$wKsCvY@;;qO1$NsI=GG7VY z6T&Xg0e=kVy85p)@TyD3!TeQ#y1TM~iQ$5{it+$hGtmzrQB%&xven;bMMhptY1vktx|I{;6QNAy$$IWV zMaG9Tn!TH5-fZ&?EPu7AK}@C?%1w1-3-h3GQr*R+;JnU+?zwarelxG{#wcBSTKoBu z_h`>@C8724G*^K5rolvK`V$smC&c--*Y3Kqo)!7UIDhLkrF({uG&kl8^!u(0Ro(fC zV`TcAnf91O1P?tBG*k?;- z8PfNsD^guGaT;XxWets2~JwZJaTS*QLf7T9H&d)&?fIsXz9xEM*O@ocODEWv1wk zsS#1ssUgE=zRhToOjt=gFqDX?^KEnCXLPqonsn<%``H$cEItC#9uB`$zl<0<6nhE)qbgCj~XyFs{+K2fe zK1xj1RM;bgMA1dH3l*N>^7l1xMxUA=$*K5~=Dbmi?$$U!yB>^p3>k%fFlh27f#iE^ zI(Y;8)wXx z&d!%S;6B4q?M)trYuwZ`{RCXrK-2=>`1NUItg|djrH?}@56<}C{}`~MInhffoNu1m z3=Yu8UW2F!$;-wE*6I+Nqxrr*m46yECIZ@?@a=&AN0xvB=f^`5v~|4>wAjnCI^{p7SH74 zU@oAQ6MF3P?wMhV*dL<7(sd)o?=z9-OHkXJZPjj;Gq%uP3IrpW0rDwPLnn)EDtCe- zp{WKBDZ;+K(c$}~quSlbXwm-*ES(l^YH#lT!obp%^HstFRO@~^QJkMOo3XjMf!&E>882mo_)Tis^~&%v4?4AF-Y?uJUA7j2o+h!vNPRd$ z!zZRCqR{0lym*aesM=Kg&&S$`e$$%MD~z26(teytiU{k!302O&fqNJV&QF-j@a`1# zQA;mBv37t!QYe1xE6T~t^^Z-{FJBdlyuyb3ryDlQE7#=NrnYpI-6<&|do0FK?`0?b z+r!`ACPPYMQQp&+vFmx*p5}{APlf69*t8qq7}NrVla{xTCY#jg*e=tdDa|2m@m8Il z`%OdjuW{e;N;5;19|yWgczf2M#6ZO|z$E!Oux=c-4sB84glqv5W$&g7RejbYfOifH zq!gmji@a&A*co~gO#@u%qQ#eZ#XN>i0f*-#m0w_cQ)9O7+8{n-n(xV1oQlQZWL6?nk4>_ht)Ghh4FJM|%}0t23z&0R9=Af<&aQA{7fA z^fLj!{|jP^h!eyEXjH(w+F@OP%}SOn4*1g3aI$NlLv(&~yHndQ<7)a8I0%1ns1}iM zIE-F+>sbc*C~h>^1kcJEZ#t)iI85F zOghdAJ=A&(eYH5zc?t_n7y%IKVp7Y$DkOJ^Bwc{0?H4m8v#Vi0{9DdHwX1+qyeLfG4t`+|7N9lwq266D2eAT^#P3Qk>)MOQ$ z6;~)+UYLZ0gBVRedG*4h6!yYtNH`x`Nv5@;R+or|ht=@DDj#ANdnlsAZ<1kIs`#y+ zpGr_T+|~xd2KtTkdI!1MjQZ>|dt_gtIW8N4=9|XJOoG7V&5LT|@!x6BfU8B`hmasK zwTMusQ0_LDQzANlXSF_V@nz}9^ZMICzR_3r?7UK>Y~`BQ%i*#UTP?=VySD}y&HEh* z9G7lWG>Pn&z3wOC6#Q*BxRC-MtGtHO+HI`%@qir&rC)$2;=PXD9cgzN8|%{X7ueDF zOufY8nZoq}poyz(0?t0Ylk1%r412_uGfv9T!m$(iMw1M zP2_S$G?nyHNp?BdZRw+4(tE#N~llj8Tk zk?LJf(i6oZ+wSy8_>>P&`bg|@3y=44wnuh8YU>HDq9^gDJV(*6&X=NE+Dcql?8<59 zr;QUZPAKB>>REAF@n+vNrcTeQBjV|B`$oi3t!W?`i3vI5PNf|Ia_C?WCJ}akJR3)LHI9eTQkKz0|HZb84R;t zcIg}N%gZTCeA6_~k{|^xlEf%@v7{I)I;w$^sJP6sW1Pw5ni zyuX{WpI-#JIwtIZYCuW$U@6z>#Du-gjtrrY}0dG@Hz_O%y<1S`+3veow#=yY(E zfT-wKJ8k#cHqRmL*x&U`&wyv*wJ40Hz-H*I&tsSrF={UVNn|b-Z3!d^l<>;R@u%hR z-G^(84Gap`PFTbYJaco?1_t1rD(zj8dPxuQ8TXS8jCoS#-a`iZt`HZBW&yG0cejH?#!*2;)@EH=dngDtC|m{riL! z(s;DZuPqtoI^>7$a!FPXBgpu}W^3f>A&CWAIThM{K6?Dr=~U3$MGE9dZN|Y>a!uwc zT3DRBoT$bzu1$KR5 zhbmDixCucmXycF#FLn@CW0v~#egHs%t^!~GV0WUenR{T6`=RrnP1=2X2(J~bcP@iA z73NWPc-XRH@2+ajf1pnK6Vmq=2c4+uKYxE~?nOmTiN~^_7m6zQokiUjKYG5Ym8^S! z#ML^j-}rtKH*0~L@FFx)Pv@U0Dy%izM!_r5;qOM13O;Z*EtokMQT0M0`B`yYuNl6i zHZX&eYw4jOgTu}}zEsVVDY=hi=OrbUHx6G5Cwn0e(^Iv#@6t>lJ%%7^%%4Xv2Y(~W zj0M0=FR$(u6|Sz}_xuX#m8<_5rIdJ{9V8B1z}b-M9}77e6fnX-gtj6YP&Xn zBio+&B1y=Ld&ns6Tf8VFI-JCph{#5D2m6-XFuzN7G|0Ah(8{L(IGUXgbHIsEV z%N`*%d0@4ZdR4eQtDVu!@eg>v6_#xA6lLBWiurlnMSg8?XhsTp?gW*ERe9JtqZTEdu zorMhx_QU0fbw@gr>r>c+B`w$()Exdx_nTVR99gHVA*ge{WWvwbL6{JfM9O}FmOhnw zAEt={X>=&2V&VI#ejHkYbyG{DLW*AM-&X&B?@u@LWd*f8yitI~@H3${7 zkipN=Vvz?GsnEJ*hPr`6QtW1g2fF1jN-&<#%Fo_n$faWS3VleS)k||*1Q*?ec z5J2QSBJCT577?eeFODmJ{E#46QrLOL;BAe{JOxad91V6e-R6TdWB5Dywq8xeHlXGN z=PsE=jEHt-|7#cZgnzBPyYmPI96v0wIHRaQQ<)SK>kA>*AItblIb{4%NWPhUYKfi% z1a4E0?^s|dQ)1^ssoE6v$5^^kEAT+_d-vvwFAAposAU7Agmtp$RMYM3rKy*F^-rJp z0=wq)@Y#?uygMWbomQBUUEzZhA9Ce*_Yhdilok=tO9_tF#+mmeC`>%x7Ps^yGluMe z2b|a9M6kmw(6uyT@)Vi@=>5%7{IY_`^SxIlT~{pr_;lQdpD+?Vc~k`4?F%ZzQ!Z6m)dznEjs zDfuyeL!okHa)6xniYmy*PK@}#)zbT3Rq!fjR=r9*#h1i|Gc#gwH7GfrFvqiP$=Iu# z^;yIsUCt&j)OEIV#P0qTm1g-9vQ|e7XaUL63*?t&nncs}To`ggwlM{Q?1o=Y+9lg3 zRZrhyf%yd@c(Da) z_7LUvVl050WUs~)=9N+|wj+*a2kQZWLeeZ6F$O;r*lcFASAQR!t7Gy;l7mrNDT;(2 zi5$ADz5^Ga7C^pWyyTp=>BzlSBnb~tRJzj<`W2p(dnc^XohvqG1j2~t(Hl0lEf+T- zb%>oqD=ICaJz~&&ecR6u>hhWUtAT#7BoYRnlUHME@9cXs#&+B$fw|yj1_4A` zSnJ-mjC9zExm%m~DP+>w`j5`=ppz#VYp|q%$&3hH#~kC}vCS9|EEYO%nqYhL>t4pkms6r8y!`~pM(+XPK##ycnTQ|~ zjYE(I3aAa2x_~J6HoE2F#Z)+owSMSF=txN z4Bd^KWY{ePf9ve3F}vVcC6cgBD^kz?#0=3Tq;t=X8-v78`GmWU;6^1#B~Ll<-zpGE zA`g9tKmmBrY<++L05YfP^vItjKmah1m+CHAxJmst#}QW&@vHHlQ}m5p;eCkrb_ zhrj+8u~T%P!%D!Vjkg8yy2WF&qpF{M6)+G00DPQDXdnOsMH*P$!@L@uqX`LGYYd`A z-$=!+)mK`7z33;&`vbvJ{QZ+wU^0>yClZUaBnya;n~@(%IV9PFA`X4rSbdKB9FZgP zbF}c~ohNa}A%l$f0N_{&&aM6+H80y0+1RLB(&S)>9*PjvCEs8U51AS7zs!k?H3k-3 zZk^Rbo28LCEQ2tOh#gey8K%H&LGLJ_kA#yL!}QDYBt$LaAxA z3zcpBk-k|LwVI=@Vf6im-i0gS7!Qv*4b;}B+%C1L>5aM4&X<@GprVZe8djWDCq+jcLd#8~-9R56~TruE= zz=K6YQHoodx`ns*jbalmWOA@^w^f{bELX;lID?XV)FJ!W$rz;ofzrCiOb z5|?`WDboI%VSI=`HX=6y2!NxVR3K8mpn|-x?N4nUXIFKeGTKG=*?^uP_4xZm4fXM+q!Gl9qBm0Qlc#3dOf?09cPV%=Zqx4ZSLS{AJ= z$T%0inXM(C00C&^WK6gD=SZ79IZg^dqe4yS)7i&00Hz(@L{x6CU0xPeaa9KO9A7)s z<}KqwAIxiWaIt?uKkCV(l_=mFe>09YEbqQ1E`DOHK*0oBFS=1Zf*B*da*F7hRXyp^ zaiMbRL^52)Uz&Ab!1aqdt_sKCXc2YTZKAOUfsw5000;`NtFZu24lgkcrg%t3?w1b zaZRTfuRXTc!Kd60#OV}R&$B*4vh;ceGA9&JQvY-bAZ8ps^~Nri3GN;gvIQ0e^nE}m zK29XG5C8xG0-g}urP|vt!a_z@A=$sMCkl?F)0*ZBm_J)1NZTBs&^J(n+R->wm4rgq z|7G=uwMLLWE}{m6M1mXP5L0zh^rojAGC^P*&g@0WU*0#`CQH5UAbnc}gl-#vgC#DJ zqd3X0g4Hh8c)wsS=&tutNPUz;*@F8+uL+VTH7V{ypRt)$c7B)GN^uYjcx3&=$0vCw zIgIhd*-6DTH9*t~p%PO*OC6|YYUBMEga1OsY)C8n?mNhR(z7{duEFrP_Kt_biuOaE zLJnZxraCzd_;5T!`u!LmS8$c$HXnyuUz%bI%#z94gUxkM4{lo6C|>_EcT6iB6&yy_Y;n()eeb zra&4vfXJjVINJKhO`W7+Xj+ZcobejR+B}E~?b8u20GDe%P}`L^J_sThnPviF3Go5( zIS99f&T^q!IBLYuLR6KG#ZA*%Y@*m4_inRri&O;|fe*K8!Akx@+3D=sEZ8%ky+I*7 z_h53TWt%WJtRi_q>5Y}|k)Qw;u#D3U@vfj`t)NAiNd6Qm}Hgp{v5>gucRDGSw;ryT9Vo9NL?8PK)jUYkNbN zagpN~Wkz&G?OK>RxeS*m<8bDQdhMHA_b&_Vi?Ky6ixp*Py=}?YVI-XkmEt49Oo+ox z5lW)gn$X1J=uGz$Pz2zB{#5JU7;_UPw=!F5(*D=JW2`xP2fS5Z6gVdD%TL5-7fZ(2 znI)BEMV%+!T=gff5+eud&>&g*3Nh(jX7YIWPSjD%6bNM4<935`3&ek!o`;|A>wh%- z&{aBs##h4v1pKkAx+$8&LL@>x8>Ie5ffpXRz(6=v+G%Wma&kv4fr1T5>aWxqgpLLlI&>EE_(%?HO0 z^UHk>+-7b4>hA3T@maPVE2q9_k9bVaD_8>37}!U;F2U53Es1o;!H;HPwiW@j>$u|l z>gr+v2&<84pS+#l#l4_&_WZW~#>9E4-P>3I0m&2&>aWcaumT0Q@?a+j4?n5|4nr<{Pc%= zv?5Gsos8#Hq^*1w_%8YLH*KbANP7WFzShUo(P166r+dHlIE%sUYjdgF6>+8+b(kSN zgD_LeZ0NW5o+g0wZRp)e)T#z+^Xg{N3oW-`Vmm}|Fsm!YT{yT71DspgW`CFsFBK)dfoqY`7_$}+BNdmR05}BqXX+*->;GROb!J#(0>rN(2p?j* zR&e-v>aHxiBZ2NA!;f^=SJ?J9$qR6-)Djf?%1ywwP%p5!vzTXRn#VI*sz!|`kUIe_ z-5=ZA1&W*VaWiofZ#cyoTv` zd!0o})?l_`jpbW0qN4|_2Hcer9dIJ#TG0Dl%owr%OzRbviL3xVGuwN_zgU;T*7Q}4eSijB}?X( z8dwjfw*+1?@EoR+^>~12heF=8KX2Ey)HIZqfKt-gde~&G^%Gd(ZEs{R8N7_yG>&q} znX(>I4!Ayn35)jIT5L2f*)3%Tbs9;Ed14=^9x~&t&}HQX0wt0jCu1NTyTL)`79J!i za-KF&@^8A{{~KhMXaKH{)sNJpBL~v)X>AdC(JAaNABPn2G%=n?T8D?2g>|)a`_+qn zVQs(*_AHLISzV=sx&HCk2Mg=;-MXc;2K9a^z{e6g06;*$zwtw1*UgV-0doV2B4reOluQhi(c5m6nuy}tD026|=_Kaykviph<4^L)l#_Sx# z#NDDGXDV}RS2KrUZa6`$p(v%QW+8vqA4dMOU$?8Ct$)m{iBY0dGhhC^N4U=DS(F_K z;tu#}eO7EZYCUZbxl2Oa{fwU;=i{4FVBk~mVRb_u2w(hi%`xb2X*-fgM^w;{w+P|2 zig}6LwMf#dN+TlZj)WRK?*r`3#(fon6Gv|Szvi<9?$C8V6Vqh*5lv5YLCpa1+Gn5e zzIT;E&od}Eb*KjcimGsf2k`iOVli3toNuv?STY0{|7W-KSkl&>M%eaU3il9bZ7_hL z25u!K=Z{EB4Fqj-W5)Wdu-ptDWcf8(%=(%eR3{$S=s%g+K>+G8e&Lx4zEu>%5qrgu zWGuqhd4ci>i9YGjXx{?TQRuQeVc${zPVvgcf3lI1;cS^49`hZ(BxWF(4Jt9p8Mvw% zyoeTgG7KL(2d@`&xwj(hzJ*zV{7`kb0wxgXB!KUJse;9_+X$fnm9}fs%Yv}aEd*i( zw$`y+M&I=GM|uSqh6gSj0e6OD!`|B{K(lY5n3mUu5sSrqKN>14$}^_D{4tW6)MHTz zON0y#WX7%8GsgJmgxE(TlmCLEo)qYvwb-^j>M>;_l51=r@Z`_Ktr#DUsX{sA5}v01 zx|%8Qok~OjufZJ5j{fW&l_4)hh3H;qA(gu#tUbZcib<1Gmaoi7nNTq8)7V7$gxFVV z*~DLbDG^NDH3bRI{GQ4j+LaV>n`5eipd51;*XaCgR;}!rqti-hh3m4pB1{-=C1kl>qGYH&@C{MTPK+(>EX96dhwb^G8u!o^m^Z!cZh)0y+(#b$oWO0+H>jbEadTcXnog0z`=pFPU@* zYdJ5<_MB&RS~3daq>6oHydk<=_U9!ii35L)GZ`PZ34LY9KtD?e^agsx1`sB*8G1FJ z7G2L6VK2N`u*3KvSWmkY@EEHmG_+fdE%|(De23V-=AgjlX>tWuC$JhYMO-P z2|gSnZ158(oKRRohao^GSvC36=@Ov9^wto2C3wmyYp;$(9RLZ`gVZBa%o(W@LxDqte!xk;+cAy2!R$KM(8 z53F{ac?|Y4@!v{+En9*?Al!<3lH7;yp-Jx%pg;e9N9A2z2fgz4eBA)ZN<%m)KR#TC z|BC6t_f|U!*g_?1k?T$e1C&Q}@z`1T&rYo$xb+h7Ttdf0T>Q<8(d$^b6$2c8GiGT~Xj&301cxXdCx* z?&L3eL~GY$)StAeng%dkY9u(*4`xP4jdrcA*yi1i0>Y3NwasNYJl0tML#|g(?)6UK zH@*Ndal6mA+nT8Rf<1DfFe98By*E#dn+mn@k5%InFGEQq=L#tEM~X)mc1{IlBM<`% zwZ?dq6jNOr8%>;UF5P7vvXll8?%a^lD(M2*n; z$egzQXJQ&ymanrfc5*kKHo{>O!0>*m)GF&`(mB+&0Y>WhE)6C}&kR{|BMPlcovaIU zkocLC%OeuuORBSsH3EN=d)IRtPvO1w|l8}k>^()+9fmqLX%UeF_na$H=$U~5Y5#ihbCv9V8+8k?^D>?NBE!3WyPVEi$*GOK+VXpJ_gcJcd5=?+NzdgzAFMKQAK`65&n+);SmX6Erb4*Bc>>;Ay&g%z$+I`8P&JGZiO zT7+N*0|4O{v^#&HnWgDiG`{yi3`4vsbwNo8JiCLhu$-iHPfpwOvTF&B1; zS5=#d5&H%83B-l527>eZm#WN-1wuOu>{UYd>MWK?dud=TDARF8dQlkCBrS@RMqDJu z*}=kAcYHgi3usKOafG7Zle%Z|Gy_+)Ed(qjvJtTm$CZoamsr(ku$reDDXT=@CH!mW zLrVQ498zZT41P3O5@pMK;^~Ez&o+(pl3ED?7fQN_mgrE{*yaGbmj2FcudyW{A`U~2 zvDTLxKRBg0NIIxXDgF}X#9`d}tRf&Jv9Uvrd@!81zdljZ)^8Bv(Jx!CD1E~ZTdxdZ zynFKnGCqe4=7<#K1#Kc0W;RP(__4fI{ftinwHAMrUe;TEzPlfrZaGKDyU$_b>yaXpHkV^(~I?X0~|-=2`Fa0P3N zNR?j!yim$r2u?#0L+3;$^kCWwCv{cs^OGX*sSJNRd=cY(w4@CmHI@D5XDO^c-$r@`x3o&JaEN#^v zevT^h`%iIeijNQNh1(cYSZG1zg2nbm+11>m|A69#Qk~zz;Wai>jyfmY(%0G0i#7{4 z1lj)Zb3R-9MlKk7PJw#&f5g!Le}J7A7q1Uwx}$I3u}rf$fN~@SZ#1jN8vGI(_oSei zI3(YDxZ%#-1i-br-0F?x5fMXg-_*a?>Q>7a%FN13|4d$dyWBigT!5fvavHAruG5hh zg{uAGG!4u`RYRm9-m~kOb;0mGMx4a9TC<1Mu}zyI!4oIO$cw+bJObQ z!V5T{-m0O<$o?$( zSS?Mt%h@R%KX53MIU?m#?-R;hBS#*QM?ZH;&chRHufj}|#y4G3|9TAepLBZ=&UDuU zY_>SOdtCWb+x*Gv()S>=vq|a%3S_Y9VepD?8sfi?>_!B{y;MST-ca2QDFp+U-m8&0%N_`D;@9|-K(ca+prsTlin9UrmG)6lxM8fvHsKJ&Q+DL7{ z6xv|x@;IO<5Hny=1b>rYti_fN=*vGIP}cR8kWx~PStd9^277xQv>_`r}B&V&ms?q z`7iRSMLa1dE&e+oTG&>a69Qp)p7hq*Fk7fJf?S$o(QDd}UyR`}cj?1_(i z*ElQH9aN8<>)glN9bD`Ll7gC~=zOIndgeg~D^4@w80V3ZnDC?YLM&1X+g2@+NuGmIB*#Yaxj=yEwJj%X|!+ zH`lQTfYoF_USJgCTzNe4Ro-oL&m&$ZDW0W!-8Mt*a)edIFIXnHr+>5>f>u1}L6dpJ zd&UKrPYMNXQ`wF{MWNe(`D*iwn6VG)hn^sZ89-e{Zk=-^i0x1* z9y{JP`IM>Ui>y9acK|=%x}BJe(HcM#-tjlrIW6L~`iTXjT>@a^ zF^PlGUruS$UCSXDch>OwTC?s>t8ZI;p$8}EzUw7hTB)I9nPNn1#pJ23Ie$ct+4-E< zFKVP)F*9XGMBxhypvH)$uW`QAkd}W%DvO`9qnbs;!w8^hAwCws)sls ziOcGbI2aQXOR!_e{;w(G6R7aM4~l`=N>JW}0tynRN=^-lvLOC?Kf>bZxb3v}}kS)?4F@>j>k>PvD;XQ*+e>lV&IBPWL4 zoq4eznoWNNpk&wWk`muBR86OCEFo9jMD9&XMiPft6>@~X$~gG~k8%e?!R>gMSEJlV z{Dp%(f@p!#{14BnPtz2P{0O^VWHYw|Afz)>Y5`?$iW$y<=3Y8fqRMf_;C|e(sP`ts z){>i)6rlLIW~;czRIS9Hb}|l)^tO=;{mnYzWOb2Hk_))7AK)MKSua~xNkswNN$0=v zf}7qr^e8SYHbE`97Ea|sm)`M6U^C8yI{7^W&Nk{hNakbt`eWEbRus&lYFCG{+{cH^ zOUJj|=9jTCQ0-rNV}ayxV##$yy@lq>E=lRX)P|l_A z_Xbj#-3zUv3z|2>bMd9}KrN1gpGc!%@?SNLhk+7zCZOy=Dw4+7-IN<*zjQ?~29>zz zJL8C#pI?v7lmJPeB2H5Vum|*wQvsuR6Ykhk6 zsWZ%}4K`(nVo^Nt^qjqu1LNE*8w3+V@kY-aji_>@BwHb$<2j&LPo^$I*|beS-9r}p z-^F8=c@@c1iK}I9%vG<{=F8IJ(P?+X95!b8f{Yaigpr_$6NF&?nnrfY!@AjK9UYKY zy@r9g63>aAJ8rLpfe+$d+<$K^x}87wP>J97u!vA`e~jct&d!Zlb2$WeX5_OkHyVv| zE&c4}(_6n%sdT${5_fmOGhckE8DU(KwZFETyG*qAsc*q3{}}lVDe)K>*o5Z96e(s_ zC$0K1pRhKQqH(6eV<>(s7AoSWvqO6TAN!DvV(6 z8fS{JX@?cBhY7G2`Wyy>{Mjk*AO`bcR@^~iW@)qVFzDFa_Z?< zY#97$WN3vL0=mvb|1ij;JrLYg%4$!-xs1&=(eY>k>iu?Co^Z)a)#t)%hE@kJXPBun zjpxPT*)p_Y2u_$SBz~#p*{a&ZDv3^#8#R-e3b&NWw1!*BBx zm14c~z7XBG@6Mac_= zEGHSaV2af-c&&XCXIGl{J(+o<&73e{WD;8PF`0yh8f%pHeTVCqlUl2#hHI1_riJ03 zYu@qydusn51MOZol`=GBdZ6&b6>PuJi7d1~5FwbKI@oe>M8!9KIdtlq>xNRLPWoo4 z01;hjxelI(E`?9Ry;5*%>XqR2MUR_PA^&UW4;P?VbNgX-6UbI%S^Rf-=GNLB~jw3 zdkI$o!YS%{{_TVOE-OQf;~fYgRDiz2sTzrbdFCpY;#ECrP*w$%M;iClDQP1{OInB5 z^oa*<0J94zZfd8VoPH~Q2+C!;#-aSV*0rqnSMA_+jbeI4!6JWAg(t1g>h!T-VC__W zWZZI&f9jW9oBvy6-^_8#ijv%FN`9sq5XpPbNTBpcO2X+ zR?VRNY;C32Y7Nd*={9&9uA8V$gLnfsE+zkw)3vNS?8NW0vbK3sYWFPKRq29OIsY2hoK&A7sMu*3Rv`)j&s?_t zWmO_CfjFg0710!a2@o;6>dF4e- zf)iL`mso70W~~5>J0YFFeFy|V7)lm1=*kg;^;sw8N5(LOXex*% z+}g#I&}9==pmO2@Zic-)L5mAgE3xoKHIKK9ZN z>4<+Uae3a*d9`4nGD&e%jfBK~uQWTz+I8QbgPZ#QY4^$=`b&QGc4h^K-#y(i0;aUUt46@w_xq;CI z9S#n<)ZN<&7Vf_E!wX>~2^!dU-~r&!)#~Sa?(#_hTpF2+qFW|5?ZyJx2cDVIs zI1?Mv86#j>wc(z9xp4KxzrPb_iEt2-CPbs}lk0@tUlV(k!O0q>+r7(EN?;RIR(d+W zZutj0m@#+y|5bV9laE1&#>(_Iws~5tqcm(`_g2ylVpTaua#bVTO_5{HaY3;oI}lh2 zn77hP{MHR2@Pp+Yzs#0wKb<(GmctjAd+?U~QmK|CP4SYgO{$E6!XxArFtnh$f5W*r1*EGt0KMO^bV8neihRg- zEX&j6QrH@ZgYP~Bv!R$>Px!Vyqi`XylyqP7JPABLiX5bre#sYKy0f)#&9%DL&i0SA z7OghcJ34#Fts@_{w~V4O?`URaZ@NXq{XR4C-WPa zgW?JNXUT;-Kb0mQqFdU$n*8pO&e~T;AsMk99z9rXjx}gYewuOwTORF+?DIJ~`=dT3VAVGiLtC=lpq~*&Q&9ijE$NKmx2B5Vu zD(DRc5@|_{R?N`;okan7&kVlU$&*!!MQkNZoQ!V%@%V#6J@eBoB=6t_$Mb!<7s8ZS=AnN|$0a;}wWohKl6Udg_PLc=oT zxN&#va+pKJMn<7UwaKa3Pz_;1m4TDN>p5x~tIcPLP;}1KR-l7F=gSeG@^E(ISdWAs zAe&f~9tKEj*b%Udx8U>i0CgGmR}*7Hxbo827(J1C!{iJfywxkFXM`qv%IjwQH)w>%mP6ey&sEyaxzI~Ie1L`dG>piOX5`h z|7m0sl%Z7tYNO;ZjFq^ssvX#9r2Y^}`~F_y#M&-R0THeFo`|BbcnLy5YeBIbPfaT{ zTUKEXfiqL&>`x?+F7464X4aEt(PL2XI~>1Pqx%>IKu5$u*V!@tK~ry>U3=4k6RK!b z1&mjvF?X|~hM?T)S(v1NOc!W#>F);MP$XUUG>RWkA7+hnLcx9o!(3RYg9b-dmtG-6 zI#x(?GWx+p z8|XBn>DLda4D8}vD}K*Zc-op2AS$rCfG19QYDLJ-ljd@t@35ake#*~Se+s{eE&KEZ z^gnLr!l8CXyJVir!DPd_3_^@=7*K~W(g`^+_7L2u)ZhA-YJey*Z~tgyJzo^~|PQ*9fRPE>w!|)4s*- zieil27s7LYTFCX*91M3u33M7uNM4b;ed!f%JF~Tj-q+EqID6^*c;v9-uuXGhrIIM@ zYxnpGu({Do3FLSAt_2aN+W9W2TgubA3V;JY&3Ig@YisY*ZqgI-8HECAct}cYvTE|E zK#aYxjmqkKmZdWe)}psNXUPSl@agLnLl8GsuGx4Dc&|jgEG`1VfLIr;%-^HLg*u1c z<+u`RT!(I%sFLx0f&~MOwL#A7Ys-ioR4xhrtBGx9m`~v2hNW=Bg{OlBrzU9P7naQIHkdz~ z2uaId8qkZgd-4yai!J1KuW9dmPY=OT&xE!utb-^dU2i?hT{I96*f|BoCjGhTVIVY` z;U8IlP)zF}k!_VEwnpw=2V3+qiDfh`*=@TS2eq8bbS2YBs8h<}yiTzZvhXZHy;@2= zx3<8L#joQLBK>36KOM;i`hV?e00>_2)M)mdaA|El5;0nUEAnT+DK?Ilo#PAG6l(GB zstHM3b)H4F=DA~Jpo%OnaB2^DX#f)CTF}EcO0Uy;*;6F`UmZ(_FVEpPsHhzTVd`S8 zQt2zsrM3NVJY^-A5oXK0iQ#yb3xd~_eji|DcfJ)e6>Z_615b%?@4t2c)Si+?bO zR!35(sJ6QMn=C!(fk8H94^`>&;Fj-!;cUFv7GQ7G)pJ}jG;aQuL18IMER;g(Ghh-nQzB;ZHK?UYxJ z|55ED4K9x;5E=(KH)c)~H){*mq6ii%T7uhu$p@ENA|bZaHG-1 zL>)$YjZ}J|&zXC?!L^U9ulr&sow!%xzMDXm(e18Lh3V!}ia)*J6i*4T#|(!=8&IZ8 z!s0HoCok?KIX|8UP+>7=>w~2~%c1PN7pDulZ0+aLBhg?x2x?rOO@Y``q}O%o7+ z+=bfMNR2=q1$3folW1ETE$Xe}({i{rr<3mYSQ2@g8ys94H!T@whxUKA`Ew)IMI+$K z;nz0As)xYx7()^OvDrf41ejGceJ)R&U_ zMd}bavWgYcmedqL>^m>VP^^VHffU3aWZv?NL0g48nF>#cjj>?Jd_pN(!al?+U6*c6 zc5S--d$hGveh_3m6WgC2TzYu&{4@@Js~+R$T`e>18r=~b=1{lLReAA3ud0rM8&T6- zOXM%`TdrT#kUr!{;h=G}zb$KLUT$r%_Jb??r>>qOFapsyoP@hu9s>qgq zh$DuH(&M64Rplh{3E8_1dxMA%EOv=EHl@a#gRBl!uSo;wtr{7c@_(T_QIV=8m_BE6 zhD}^;AI5_l1kjcbD@Qs%*eqZ+QAU-}uebA9R{4Y5Kpvux1gr}ejS%hhrhh0|B}@?y zcvTWR_J7dHf~~h|OrXTF`xZ&bJc5XSG|sY*$D?0nK8rSbS_MT3ifJ0Ux?0lbz7p=9?;fl}?r9|c6`Q-i1QV1Qbm9dD-}`F-k1zu`&C=@oree^Bd+V?-@2!TREBYhND zWDPWtGT`RXZ3qox`wl6Jrz{yL)b355gr5~}2%(7OUO<*WQT<^|tj4Mwrc(VNKh z9*V5Gap4`IjcyYL?N@YdMQ^=&U*VUA+%xGkqufbELiRuFV@SAj!Fvy&0r|+P`&RMo z`^2es1)4#)-6|66?e&}7*KZdPl&P$E4r872>x;U~h|&>Txi zAhr`7iT_Zosok~WGiE_Ds^tt`VxU)}!4A&udr|(6x}@?N{~3Qz(7NJ*vnZiTEoFU+ zFu4QYm(3c5%l#VTk*KD!offu0;j?_?x^%)3FI_r!w{?8;3ks9nf=2A}ZFwm;w))1~ zyRs`h8Vg^;MyTfG?+JB-v38Q)krySKx&$Iq7O7oqhZrY-Bn5g-(l&2mA>uY<@JTmg ztP~`v)TQYb_j~ymQyvkKQ^Ivin}F{)BWqp`$Z7!;9Mu5cc6lZbLwRnGTXS;0=<;Ki zZhYrfg}z|q2@+x9Q_pA!%}63rS$Q905_h%k4bNc}EbW77*nUO$D7-Vw)m&hu$rp(wKd^gy-bhkVrz9=!8UB3RbzE(>R;Mugl)SbF2)f z5|()q?w z3baYMs3?x7>hyYykhzno+LbKe&QsQw3UIt#-xhic5sL4U`N#ElVH#^OUFB216O0kZ6T7X0XMl&JB5)#nl`SM9DGv;QUwrrgpv-lH4oTpcbX zweh&xiZ2j}3^1MQalP?TZ-It&AGwL^rhbqg8H{1XjD8uhQi}mm-;CzOM~S@q|124I zpt69D=d1u*GldCZU<}cUwoL$pS+Q3x7f{6*DjL=_*H{N|mF%-+Rznv?(%`wl9-XQX zt!|iphlTXK)6ksf8^ziFIsKF~m+TEB2m%-KS4?)^6n^!@GbI~*ygM*^9=BDQ;gh*H z`Ug`buD{efc777Nh)pgYE;VMP+zaJaUH#-m3qi>9^)!?es;gncdj%BeQ3F78oFxV% zaN;|XN_$}z$Eds_dzABQUx;Otb4Fu($JTNcK}oSKL@xhVg(r>M>Gi^Fh~@~p6E}YI zE{XVDhYl5wi!&5OwDo44n%>!T~GfffyUfJ*37u7J}dO9q?ih@ z>jKl9y{+o3nAfF$BmK9)%Xx={SPOVa-76B?@D#GmIH0P$AgD*Gogfmj9=AqthAmsW ze#&2=qkLtqE0)??H0W3~E3OWO?8t?>P=)&gG~G_n2{oc1 zPvo1r0TY{F%PN2WF;0?vBe3>`TbuYOcM(KlKnOe-cMvTK#V5?54);)~fPq)r7H^U$M~9dOCEEm{1i-By#$mzwv^B zndi!)^asWbQ-RG>U+-LcZBh6Y%t)oP))y79{9Rf!OmW~wtqHw;QbL_P383SmOKnm| zcY!Rq)n)84{Y=wF;~8p@sh}9SQ(L&JGA02 zddPO>Ph|-i+lBE=b23_vm^xa|O#F1j`-E~$RpWT$<^J^~;-*7=~t%(dw}g@ccp(y;^s zAmmiPd6^MxaupikxU?qT@G@7wmq7mA2oQ0*SfIzlus&X(JwFK&Tp1iiZ77K!9=pc1 zi*+6i^{>@wr+!Ux`I3Cgzb5V-^bKXvn}f*dtho|GDn}o}Zph zJ*6@~C=MxF4+Yu$rhWM%OaxN!oJGKS+|FI@c^lO>L6}j)`ve}=ztdv0L7~>&YX$mQ zB6TKVw@R?jFQemb*>jHKQxtNq+cMVR_^YpKag;~Lc`$VtPkD7IVTSc)S+we05ZHtQ zZ*q;m2*(1KKP!_6Tbf{2VE5G6LQLVfmO*Oj+3S1kL=ow0YuDqE673a;zer68lYi_Fjw^1Qoq;5 za>wo{0|JBOi-suZ7?p>GTINGM~40$f)P)`E9Yqod>674!LufhtMq|qlysMiP$#V@Sea| z0yxX4JPTkcZ^!fT=fI-)K{rP@FpSjFv*%HN=SwV0ec))uaU15bufX5M$fVaKeTKiP zUvoUsQ|*aM!-CygKio-<>5X-ilvh2&oFpFMxm8+gLNw-iFORwzXZQ+z%{Z8a zC^ImEY31y_n1c9(=pig4v%G|c6jj7JrO5%~`xI7VM5!=cU(uYpMq`Py7^`Q|N#)SV zhEl{ayVn3WYtF=i^o2H_ftmGxDfobwD(3@3;;q_(>J6)eCguwRu|mYR7S>`Ao*t*%ovoN0Z}zogz}U&mM46kTP5v)$ zJmO0{vBM|S@c{z2U9lx#jgK|~fOfy>9psqOCz^3x1{6|aFt+~+Q|}@SSAM|+zTz_r z!ljzqCf9N5Ki_i_sAd0Qmj3gR3EWcbNPaIO!s>s}ZquzLDkaY_I*Uy(Xq&8mVN^yK zySvtb-?K>tdW6@b|_b%1L9c}d5}eZ9k2)Cx-}^v{yP z6=0=A7bcSpXHa?plV=-tl3fQB&*tijDiaUsvfVZR3{u*-7o5cfsi>8&HpY@)hXXutO94ZU}f;44*jg0 zXKghl$ZB*NeJPuP?tnMG#faw%#PT{iqg;}sr4$;AF5m_c4)tu0-8+eN?ek;`v~N>P zXDpn{V;1)M75^5;Uq9(`@mskKX&?zUzAw)eB@vMkRkfaWZ!%eQi+|ZXX}NN$hnyWh zVw98TGaytN*TR9hU2PxJLS8Sg#>VN2*!?5NBF?;FRlu;Jk&G6c%<}S;u3shMaX*HL zi>cSvy{*`Z9qh!>b)M0KDC1D%DjGd}{^X2SA_5n(f5OBVKZStV>UU}sf$N5WU_cHL zr`}r$99>w(SnnQmK9)z}Z0C=3d(D^dPJMKxIs3K6cr(0j8Ikibp$As4(bdk3RXnSK zVEttbjzvl1vGpTs>?@u%un>x^kFY^n4UmkNiluCYwNaW_962IsdP6QjND(9 zI=BEn+KD-^lE?2#7{SUNn|@FdObAImpL74F<;Ddt;x0r?eDud=(rzgcO&R0 zj=+R9RM_kVmzyU%Uv>!)Ba;(ttD>zzP=uV^pvS%!MSIZ{C16!$|9|f`lTEc>?b^+# zXWGr6u+dkvgRs8gQpzfUGD(MU<4qozQhPIZRFUm?{|AoB7L>YD;Yd!gC7_oLi!&w)K zdOsDnfq1 zK=Chq5w}iaqFR!0`zJV$mRE{^(x%I+7u)zD8BUA11bh)9E!)t*^@&S&8*lV*-jJI2 zqZKOVTVDL~tEFwOHveeI^3v?f;JSDMT{!0f!t@+LxvFjn?T{E2JVM`NlmndPs-g-nL{)nf1}k(6Bd_*20qDW4U4 zBYTViQvGroiJw^PtB&%EOzwu$5hP}Aikb1Yjo3+$Ef`xtIFY4*JVIw>kWl0^IqxIL zm=UMglnye!2nqeV>t4Fi?>*?ErP9Dtm5WeMuWSgbLcMVNA~0$HR}rX6&*emsMlsZZ zw$}g~_%PoY2lEG~O%&` zEJ>w z1uls~y6^fjC5o9am4byBg~ZO_ zaY5bdj~B&K_C7$f&F_e%kRUer`A)cLhY#O_I%iH^w!)v*28?NVnnSEJ=akDU!2E$y zqG;V+m?sq?f3lk^o5f(qzq7Njpg!VJtW8KU*HMNC3J$FI)pG?jzQ#)l>R^dRDfHmVkAB$wNxbB&q3w7A?7Tv&ymF zIlq5);W&?|nBj{B{07ZTqfk7BuI zI^eV~<6=n{<#!{nK2o-WiL%+~9Qk<#yCMjgwu?*VhGZf>2E3=RXmyd? zex$uqa3xIGHJW5%+cqb*ZQHhOPHfvwCblNF%}I8giLD*%|NZK}IajAneW!1`t5LnG z>v_6+t%aD{wwah&loD?WB2!lgpIB4u=o?Om4+dXP$>{FmD$S9c=wvqlV3K{2!u!r8 z@=S;yMvBvr1NdMHUhR?dnLNeCxj zWf5#kNvZC>i))CfBD{FcHw2Fj3rvb^*DQc8nS4K0QL)=QtgZ1TIObWZ9FKaJnhacb zb%34`K;cs-y6@KHZK>Kpy1y+o^s_C=Q4V^@z;BSuV9`oxmrjb;u$lvJMB&L#*+66V zdl$<4rRj`IDE^fr=VHJSJF0-vQVlyG3@1vIfv`M@moMuB}a zTG>T-h%loeg!ol({l@~&h_{UhnZkV})FM&-8H#9C(uqkp;PS6d_iz5=nYZ(xjDfL~ z0et@k*($y|jRWnG)aAkkOYW48z2c_e`=!lhSm{2YLSv8T>YfoQn`u6Z8Vh5>+jV{$ zWLteku0LP~dbR=vI` zC)}?5+a%4oNQq%l>(5=*iZgO`Xb1g0<|FDz2G?{^|COtrpt+{CPrU*+4fB*s zbe@vf4^guNjBp9zC2AEEOT5q4|3~h!gUuYFLZ||CVN3qwah+vx{7p`w+PdOi+ZWv8 zAYDgIeH5pb_cQmZ&qbb38PTrWqeihJpDU!>P9q{0K6gZ>&Z62(fiF$0qoe3zcw@de zz69dxO-uN=O`#_AqU;w7qG&*rE=b`%A>AB3(Wi<94++JN2^ocn5_N0AV^YN9rngB- zmSXM&o;BQm0@=2w{{_`{s`HBJoD)?9iJX3%!RR%l{QCkfmvYSfo^2Qhc(WfD9KdBL z@c+uCOnVaC3YtobS~ENbQR)&Z23m}euAcvGlGNHvO(2N8$#ZEqsWw$qt)iP3zl*3x zVnEa^(44e2hReom#Iu23eK&5?>=vrbR7mu@bp)C2YLw_+S zO)QL!TM?iMyUJ=Y8;r-s#yoqhaxf;>HGm-Qoiq;<`^yD537g4vH!X%1p&~xjd+8H! zdrY{1^mjtT!M|K0WbO7;5T5kpU|SVh1m_T6Z6@D!U0a`2{4xLv+E~KAjRZv|b-J22 zw@!|8vl1^TEm%%ID3XQcH*ogB&qPauy1T-ClU}KC|Lr1+r1d&y6~miAv2+;%tJ9eM z^$Sghem1Sfcg+^LV9gcH`Oun}jlFq5;$~6je&Je=u0Io}@IkR6ym{TUj2}nf&YIMn z!lJN9P8Bv(et~fE3rz|zdmpt=8BYko=*1RDaFjaQ%ZIYXB;N*w-lims*&Kr`d=SkQ zTx-m-lDgj~+^yqn1nft=9eBI)lLK;<55Df2AV{nJeviHV$iaMDE{U?-KEM zFP&B=vJgb+&C@eQE6CeP-KJcU5dpYx8EAlK1Td#{3zP{wWV)3xYv!Pa>__gt3B7+v zdp4@pwbPWCiefs)FJECdjaJ5Umf7xj}ZT0{{oRK{g6~uJ4)`m zxq-U5SugKsnzh35LlUglni0`T!X|I$_}kv;T8_w|KBS=Kt$9fD_%Y+Gz8&!3N?Y|B zcjE9#@>??Jg$l>jeiJ0&orypXR*!x}V?yP(P43SAL=Dv~5xam9TrG6t<#V;<0s%ci z480V}&5};7Qh?-Ndd>A8LRIV|z^Z--;p=l269~>Q7xY{~_fc}5kVTKl+~zdi3W()# zD^6Aa^ycEKsyWjkk2G`=8NPvM>Vd*(5X1a9nN z4%fEfNr|HErMN#Fa6%;FnTy{&jYsIrIzEigYULhb&ZGW>&-M$N76K#i6BW)>#xoks z#1Q9ONnPUJ51YvZ1_G5C=7zn!pWK3#RM*r`0&_S1jk9SCo$Vt*i{`b81COoforjYk z=b`*Oi@m8F?J}!r(qYcg^IL24BaI&cNkD&6?iq9bxD{Bh^{9BkyA?Sc&0 zZ-e!eb|s>TpROTBb_U~|@~-=K44TXj#OfyzB- zie{t0J|_H>#7Kl~#T2f5JS0v8Kvlsbxh4$8_1P*| z>fC%|ASJk0sb}Hu?Yt2QBUhJZ>b0$+y5|XgjcIx8(8!OZt^i0@z>wK`*}QO(sl2P~ zP$pbkCFKpIE*^P-?N#&PqMHXpuDGXI4UfAMXKK%Z#osUq4UvlV;Hz0$;t6IVASF@z z52ilaUO%WKtfo|j;#OFfw5;;bNO{#9-`mlm!6Y~ZWdrguS*>~8nO>V&k(?=<{?fPc zn?YNMSLNiRyueuF#?)}yIT4sIuDN_CLg3tKZopch-ii^&SU}5n%+M_Q%c?ZL{P%5# z_;MQVe>0kNxp*Hk?jx6I2&&x3F z>%7vK*V3|3$P2eCZ@d5#?q>~lTeY-gq#sx_@}0nd0lA16c7D&yiQNbh2qIC@|H`+XsnCl%x~@kEm9@oEnS*(&+W~E|3xE?5caOR z^@EQqxn#j)VK8eZkbv+ue*9VO)6pxe{T{Q1>o~2Ax`HnkavpBRLn@mY50D7jz^3aE z`QyL{=@-$4H6ubF0};LbN^}_nL*gdGJ=;wbk#POxt6s~jU?!)BP1vO<)_>wtqD~Nv zleV|pIj77#r;O)8_?G5oO|CjZtEH31C~pXL}B^uaN@pSZ4a2yH;7U(%&vo>%{iVcRZ^5Pd$u)juxWYuiV)AI z|E8mmO!v*ibdky*V!-;SDDN@94k12c;>E)7=VLeYEz)d%2F3>rrosSXT}RH?*~5d6 z0aCEyI%dZ8pG9rlkp-2i`}?_~IGTvZNeqnRSRkoQO--@@URXx_bc8K3keK_Q%KjOS zHq{bKXL#18gWoua)9RiikDm+`-&j$1zfle}gNIv<4>UngGQsdgMF+AVFu*4?NGvgG z%8=|qnN6z&dlMVFaGvH-e$X}a8u-p8sBN#^gjW^`vn}#@a zAYSl&$psJIsTJF`UJ~Kj09W~bgI<@{PEip#+u2ZzZcKY%$R?Z;UlF9x@peZKpI_vp zrBrZ5ssVps0ISXJ$;>s>`Y4!n#XlTcjZkAwV*t*m7kY}8oYbe==>imTgmLAxlLLCx zb3>mDbk>LlKzo6F9l*nE<4#%I=vN@67zJM1WX^fRv`qS*-b3Tcq7ueA#o{i`Ba&^u zzET$R7LVlqn=E^ctU;+0?XpFJP5g`S2@eEBONmx^IDotrqi?;LpPh){M86^2xQh__ zKM8Lnf-+x_?KW$epk&OOhTAw&vM%zXnm(F=n!fP$t~wDWlnP*L1OzWcl*wdrVA%4> zY#Sa)4pZQE>Q9Gm%j?MhPsaJVPS80^b-oDuv#^rd8q$Z$%ZDTz|L-#pnNil|SLGF! za=qPtDz&od#k^D6&-}2Lh%tNvM&ljfzVgd#R?pYrng@29s8xTBNhxH`1j?0rn*Yeu zLZ=Q|=OeN$Jo~bh%%O`Ih+{Vj#9iE=7(rW4*`XHkN9)x3_&T)lXc-*foJ#au$E&h3nyrgJ>|seik3^dLH~EqBQD z0&sZL?reXLjKs_#Wr$#G82oHq3=weKalb8`-IfH zzN;R_sX@gpZ~sW1>3UvE{Ix7jj?0$`{d(Rm9SujI9a2r7P6cL$wUQ7RuAr{ORIJvh ztOrOJ$AvHa#v8#<*iLK_$~)&-ci$vgF3u%P?Zo79$~r~;`pVenmfIN5shGki<=Ds1s1zTt!CatH+Th&O8{umG z$>X&M|KrCRNM(;x7Eu`?Z)mb2dKDWKO`3cPIBCdC4|#RO;)u!^^Q`~pHkq&F@ChFE zGdx1wWicj)hW%(Sa}0LXK#mn|M$?l2&bxqs{tm)Q1bb=R8sF=yZ1(h3tCQl<(hg+y zN+2!3|Mwqvhd+O;)1w%>#8(!NY?pTh8cN!*#b>YuN#&X4NiWA`O2BG_8;6Gyc22sA zRL{~ww^Th$Z5(y(=C%v;-G!#_5(ZI#|JCi`$s!!-#8@!)j>T zEH2#rPA0QbuvpFjsg?0zd(J0Z|9g0c$-9Sy^U~`|Ta_HmK%ZTg93YRPblOq{W~NZ~ zDpgCFvvnDIosShc2hlG{&hAqmhRnJDscvtX&Aubqru&tW*4;+GMHE8cd`qo@6>*y)w zJ4Tog!rhZ=$NZUp4reOmIjawP0)!#III>PcAG&3Wch5;xiM+*s{P!;IRhbxH=f+lx zqjn5&cUKI_`qY8>>n&NlCG)Cj9gs2fb<{K9Eb51E_I400Uas06C-3{6fBH~$sKDxF z`Eqb2L|&J}AP}BaK>y%-5G2j5#Dgn(fJj8eMsJki&tcrh3gx2KI=mD2ftJnQ|HY*a~TS-jsa%C%QV@4R){ z(YY<5Z^Y(LR6yZ#qcAAUO0ZQ^ej`hv0S7;}(Wo_57A+?{xk(r(vSz+!&Ba=2d{3lj z=;EqZc)WXVWkGQw-JS%=wndapX?1I1s7nM8wNa+E4<(+TCY>PL0Emr`ZM44MEDB46h~`o%z;3Z^FlIhM z_>>()u*w}@`IN+n^DJU(HBKPMyiX}sY>BM(^Y{c8u|5j#H$Sm)APi%h zYEVAp_#I>}NZX9X`}dR!sRCWh(iWS3M_w8!)0a982Vqrcg+M%V0MI<-hEf3WBXXCn zl1a&^A-cG`nzSm13aupMKjeXd$6QiX7&c`i?*GQTlLV}=O>}7Vngev_okbP-Oi{&UdWGs<-7zYVJzzQ?8- z_^2B2Cu+~}r<=So@z&-R7VE77GAvn%i|5-$=i^Y8{vivuYii_*ae33`615=0aG_ki z$x4-a08z203*U+yUkIIuR^@%XknjX3n7vG$6w!o~#AebrvlDjnIv82pVx--R72 zUS5<){QL`J*>sJ+AbVsKHvYhNc6J`hy(}c^&}!i0CiZczH{ou(jImW;iN`KZzv3kN z3K<{7$+HkWBu1O)K)LAHBX73dOm`QTHDgS8`n80cTMH|ql|E3u#*?GKm0D32;Pnm3 z0Y6U-iB)jI6m9dOj!0!P3g`~!Rp#yJY#d@j9<5QG9AK>i_1O6CruzvEkNda911hgu z*GRuPB_h;Ey8hkc9O?a}UL!p}KD4yZDbi&*{O<}V1KDLn?iY$00b^<5+#wE|dAf28 z_Tjnon0JNrb@05;*g>tRti?UYQ|@6ICphV%5-_A5;2PU-5u$;npNIXXU*_Oji9waA z1X9^mXtpaIG&m99pDeJ$74K6*#)gi7$Ji*~d84g_Uohz*OOG<*0m4KNOVNmyzM1%O zy4aD7g4O9PWaV$OEcoy{kh=e8e$wNBj#eZqVft~`lzZg~=|$C#VV7wwFMYbY5+5P* zLo2di{?BwxzW9DQnxN^xdg&9zGE6-Ic|9NF9;CxF7H+jEh*E167ar#H2(kCh&xr6# z>?wo74O(&4KO&2S=B17U2Alq3nA*U-|738lEDiM{36Ec}0b!sus@1=%0f)LmzB4Xv z%rI87x`#WW2Jo5up`s(gMT!;tFip~BXgB{t;yIH#AojaM$Xqm=#^+{G6e7UXChffW z`?>*N?=^28wmJr!c5X5ZXXla>>}!>e&8xAwf0u25$OL@PeuJ1Lik?!=){^`My_HH@0LA-;cbNuG(3Pf@V^V=X;r1_z?Vi*5StI!RM*n4bpkwT-KN+NX&K&SPL3a05|Gjq#;$HUx);0VmHuMpw z)_Hvq2JG3s{auc-vqbX|C`xu&ECo4U#{%0=f$a+~ul65a(gU3V1I{Jh zA6{C>AEp}@yUc5w!5{v`U%l-ge!^dW4#f{Xo})%y0LWi)#=_0j{7;%6el#HN-;Fz0 zfk{)(L!U*u20_YoMaRI!;Lc6$muKS-XWz#U&d+6p>NdK?#wcA&l_w|#+SAY6IXIIhAUefig@Cz`;SX1rUG`f06Q;VUMD^Rk%OJxi#j`QcQ&v1pR9qMNnd}|zX6WH zFCXGT085a6U>=BjYvZebi=?yGc*p&FZ%5eK+PJe7WoIku`s(%N<>14a1RGcg;{H=F zq-^_m{Cs)vE*Sl-Y&&pwYZs^ib6o@CUg>=H%QqJ8kw5sj`z-u+?%Yrl3N-!R*#`cx zdA&I2e)gP+I({Z3swfO6!lDn7T=NxrhpOx|g1M z;v2d9Ao1QCpqct7{_Is!weZCA)teG%NDk1hm^k?28bJ9cO@gwQ@c2>vYe2iGvjp(+ z0{#)W^Z58R1R}ZaPFi@`_ylnae+q8jb~Xg>6sMiN@&^=d-llCoKltnRD?7Mf+=P8N zC*K-tkIwZ(R_3mI;ozF$@wzij>*j@V80SMT5X0*?n5fLnvRZpJW@_}tX}S>h*RIc# zhTOBm6eJ*j)GX};ig`eapKbl>ki2u=A|WWO`x6t?CRH<$1X~fj>XqDbC~;CrW$=(e znUE?mF{MFo?Wz+`&NS;tQ-J7EPsZGwhmeq4?27se)BGz6J#F-C@-$`MJNPQAEHLNN zShQp|-Hwx~V@9Q0#2^=k;6-w)gWq?hQt*4?_E0hlgW%C7m#selW@Z$uSxXTzc}p8r z=V6J@1BXU21{y;9eGZP%^m!KImR{#^=hBrlE~67ez)AeD_b(bCSWQl}q2YQdyhG+G zo8W{dkQ)n1GKe!5_!CZs__M;TQe1>%x$qu+FzK zITBl%QCeQsx=x?;Al@EjER?zQnh8zg3Qu`6x#4NPmh-W*cwG9JdSafKBsy_rH{Dgg z4WdAleV>DPtnrQLRy8g#Nl9B3GTCCV#&9W_!2P|0W9LyxJJzSdn37vPU1%q!iLFZJ zmHT@wZsp@I%oxDRt3{`&mvB|n=P~C1a{_aFt#k^hGz@KK8&Mmgw>DEVTR7b=ecFC9QjZzFr%|!*H-`a;% zM}rA1tMRDzH6eR!H`GZUJPiBdKoNdU*LT!AWLdcP@8fS}FS}07r)>{eC>wb0fjZ{7s9rh8eR zqI~`Mq~2nCg`!iUjX`aNOkYpO80-^a7SPUci&*@+* z`~m{~e@;zuiwsV=d~nZHssCGk_* zmrIT>)yU3}UAp748B0Z-0Lu?Z+8Lct6UX#`8+`M|5cPA??MxVs`-d-VX8|Du?3=z|5fwJc;jB=6 z#S5?VSlT!SLQ%-}w^Z=fRVp7J9ArExd%iDKjKm}bb%H ze9Y8d!g#dqeLuT<%Y0+LSo8#V#@A!Zie~}-B>|A;;!LF!4&!6vqNX~M?wyliBtsbk-d4jnCma=Jvq7O zD{1&5ofT&dbIu9UgU0_#3Z`>T2Cv|X_+F83%y8yP!~%e{44T!s#jT(qMxoQBo23Gh zXc|^@q;>lS7N0yGbGkgb!qXh&v6f%c32JKj(5S=M-nLmh`K&i&-e#+TlP8KI%C+!W)4+%AY4<9L&n556KEh=2 zXM3w@HWJcq51!VEK}omXLj{8kwJkn1)^E7}swp)OdkncOZ_k<+{OL3tWAn^UT>-_O zz#&qonBeIk)vS<#aany3v|XeNj8K97qyZ;A_GheL_b!oIxMtyS(WHu$nP%>7nY_8Q z=uvVuTSfA5VR4P7th}{$=1PfAJi-e+Co;CSCjG9RR3KMZ7*Bj2@u2+e(7Fjx^ImS^ zlNmghkYNbFDTm;F1%Z~wpHCKNAvu7qiMp(I16rl%LVvFM>Y+xeoMsS4<3Wg{B zM0&A0&TW>M^2_KzV{*4nMo*ICn1(K_XExgE#_!-Ni8 zU9N@|gpQlP6YaOm4z?t-%R_r*#FBVWW(cH++8xhalGen@JeA?i z{uV)DL1tc0e)3|5G$HJ7ANdPt8)o>RR3nc#k$RPuWl+b~iKg|u_^Vse3n*fUh>HwZ z`~x$e)a#Q;>SlC?JS*XGHThD{JeQ62>2)x>MS2h%TL7dv|M9Uv#278hJqEShnBCc^ zDL?iK+v~*ja#>^|*y4GgiS@9J#?dHbL`Od`I-lT$1uQN4U&D-=OQhv9LXq?9*e=^*qj+Ln{m^tO&Dg;J=QpoKh z)UF0CN&|@dm-<(+Zq0JmE&dj`JC|NbM)}-`jO4TtrGpzFjwYVLa}|U*Rt?h6Kb+}T zmcstA5$LFz(|u;22CS(u2#^HpCY1e$GjSB$KW6ifkj6~KAj@3cIez#zKJHbDy@1J= zYz&NZQ3=)>9sF1?tI#6mzoJ5%mZsCl@z|Fphg5A9K_J|In^HfzQuR8;$U%GXc!TiG z>&RowLRFCa&#FQQux-}j@8397^qkGP*&Jw(8O9+ zLBUiYylfl2^!7OBc@J8^ek$NOp7xix*>oO5>LEtfsv|Y!as+{?tF!!qVJ-kaDP&+t zoIitoCKMJQ5yc^&vD}OIH+6aw$phTRYXvBHFRjtznE|qh$_nw?x5|j)C&V*tI_BvQ z#O#Y?Pg7fiX%)BGT&ap1)=qV6N~d-oF)CR!Q;`gb#BV^L$uTUy_Y@96WOBN~lqhu; zn@5toQq?CJ>-!?sK znH}MKhivw8OOLp`YR1UHL(Q``ceCR&>?(_5O@=88e&m6G$Ja7nQItRQ;Z z1ZT_n+Q9FAR=!%Xyzyd&=9wVILK?(h#t@`J%#R&bedX#vZ+X%h**8Fhh8}6LXX293 ze(R}`a{Al_h(+HO8O%A4o;n4>T@V}ann68C3L#xcgXIF0zoSz3(v^5~L?tziLEB9y zsnGfDuuU`r;qk_uif?=G^nm#G8%kc}k37aNUumm{?Z4Jx^@1URQKIlWJas!_(I^O) zZSAc{3NLqx+it0iLD~r$4k>+ec2&y93)KFL8Vsd-C1?~)vUHyPkh8M{wk##z#4+GbS(o7 zIg^h7D+p%_;eO57pzEPd%9PIdr;7gaJ zjP02{((`e+=D=qPOKpA^y~51y-oZD3N2f|@5PE&wIY&PDO2*w~tc#R6tua{*J5t-Zn8mK=Y~sNIGtnfK8MDL{6yx#+KGxBidK>oN zMg@* zj8XPB!TWU>>~X|3NP!^3ibmnXq5IZ)AFIRCQ)qmG+ABK@f}cBWZ0bA#wI)UL^bytd zFU|daWB0;B@niI%k2e~1gY(A+@tUFHD+ga|-%$40+aUYzN#YkoXFEFE(OY`MA{saR zJTu%@p@cCti%RbJR1(6x?*&OJ@wi( z!e0vY?U&)v=9jCQa|#`9UVB?ojbe zSoWrgcxpE|t%Qb^{=Y82@E^333`AdkF}b1u)BMk4bL)?KkcZIxp6>yUcki9qUU)h2 zZC{k=bmibQoYn%Us% za7S?O$P~-FaV~I8uJkj*Gvp^(_Onf>Fhqel@lAN+0{cmA4C$sIe-$@HKSBdaNmd^= z{4!;8%`Q2&$tobiyCqen4Lj4rep+LnHAdKyAOT$p#W$h2I}9V*Cp_=TBiqUZiBo_+Mt39>99J91f~26X9+q zoM7HqR;ec^2c!}qRz_Q%#p6f-NeNk_S;`Oxm2U{RXkfMr!Z9u>p4FYNN4IEjb1n-h zRyH)0WlRc92dmon{Xaqh?H!FJU-mLYaoB%TKL$*eP{tk%Fv|ldIxKoCG^ssX2S@54%(%YT!y}UTKUw6=;U@tn!HE{A8+J3a0 z{gM9XA`i0q9<7aMi+2ZNKIMMIXAclSqWkeNLApe&&_Z$2Ru4AjT`O(QO!j@`!pOHi z8=q4nk!D%djYc=+-aPU>iMDJRQ zz(#BzA|WS;V_Ucm8U|O&B@>ZDbODANRuYa)Hc&KQ8=oSb5j<6l=_x##YlydioVhJ$ zN9B!w`o+pxFklG0!H*c#KR47p_psh&_iwBgiD06H`^bV+mHnN>7>K5JIza-vOt6VQ zqYih~BPD(ROi*tTdclAbl% zD#nX&@6xh~QK|?r0TuC`w7#Uon_Nw3aI3otNHS498%#xcQoY>(0I#Iv*jr3<5(V~4 zEs)%?=MTRfSV_(KXvUk8KNTAcY{2G<&Tc`0+jYyKKG4nrUJgSHyZ{p?Ji}v#g}gjn z*Xz;Rr)r#@C;-|)#i5Oan?bkV4Uh;K_o9=T>=U1**Bkts^O1I*L{1cC`a_hv-W|GM zMIl~^4%xAa8*gl1%6Cqx=Q_%+F#eM%pDrnhhWXX^BZu|pPWs0%YoI|uIaAG4$cdG< z_)+(q!lYA9RGNV%A^p8y#eY%JdtS6fB}@HN5i0T1M8y=D8y3clAiC}gWT96e14ZYP znF@`Me(c;4uS_e~;6V=|@kR~ovc$U)rK9N}mSYN6z|itQQ2J)hwuq$cU(Swi{cm_D zElgv1sN{m2n8L6f;rw=Fc47V?SJ|%0Ks%NyMt@WyTg*}&_-~PP8AxHAgBVsr^;X}N zn^iFR;E*^kmQ9Y)K4W#RsiGSW(M=tXM6Q1x(ir^c94)T+x7)Id3NwJ(-I7+o@*v~n z^p7L$#a}mL30d%xR-;%>Jv(E{giNveW8OQohOlMfdzsLj9JRaTOlC2Z=PUdhXVPla zhGP|Wn#&B2$gO_~F19bTOKvj~{qY4$a1KuQTYNE~T$IKHx%|N0dnOk64>B)!%Mle$ zFUq*+zP6;jU3Y&+L6?;?)@t;iNLgs`_8`;3*K-VsMfD>FBPC=9waAOp4oN;)tZK?G zfkJ%we+m^4>BdgOlD~ZXNABCf%+u}@GWLX^@;{hq|25Sn38!y*fJc&Mz3>7#L#i=5Ir=Mo@A_G0qu7x-3 zuA(xVrXT}M3IqGJ9qxlZ(-A(+Y05Ar#q(UXIg86(=)Z6fc&U~(MYmCbEuY<46>^q6 zXi$k1kG+BTe!bT7LtMazNj=)KH~;Fz`f4_Q0u8~2&ytt{h_iSe{IMbVw3YNVX?W53 z)szqe%Tfi`ygX&UM=aglVa*CeTPQ#SAEGStLrf1nfs!SbKK1K zs2afx?h8dOYTV$`W~0h{b~5-Yj-J$R1!>X1o^;=EftJ4Ko?n=k578bWZvE9xrt$AC z(^PGa#PCYs@;V{L9x?mhAeAQ(ahI+PM5*}_3B;*gdsy^SJA-~L;&B4U1(mwDGI2Uw zZKk*gbx@kpvCdm9*^B}Z_lvzrdgfpe%UbE#A!5Yaq(hu2t*ovH(sz#WIIM!b8G$CX zQ49MQDfSZ)2jQKv7uB6(v~pnLVz8~!_{3Z?uw2I5sn7bMp0)G$&tG*9-z4rm`>5|b-ome;YV0$@ZlD=>e5WkPc~i4@j* zoQ1N4N=a}uSqZ5WXHxwsPmKsS-&b2lf#mo+g~_O0eyaTqwNIs*q~4VenaQe@XKi;A;zi%^k%+s4jb>bURUmgDYSin!`ZuzHF zbUTQ_d2H~+G%$!A=>;{9LG{-1Aa+E+n%`NLbBPNMXIK>rm#G;H9weGde}sB`zTp#S zK1v|BFg{=#{Rn~E1M+W&=M-4HGTr>FbrG0pHCt{sbeK3FF z_|HX`E&n|ODGNl1RT=ZtXo3eE^dP!QHwcDwhTcRz*y~;U@yQF1Y&}jJXY|=O2-JoU z!ScmUC#!1Rv2JTNx5PfQ4>#cCqICjXOA=S87)H^O0LRoglk*D(S)8nA9^=~^OaSQ$ zH4}kEP&Sy_5d``~&39uiPa<-I5{KZ#kG?>@5rO6$3L=v7*#YK9H%t+JJYsncC7sIu zj1}t3=Y9o%L|v64SRPaSYaKf3t>?kTWm(LAX1S+(B(RZYp)xu<&@?=G&5vf~@WMEG z@y_n2YkpqtDJ$H-_6~7OZhOgP|7wjT%pen&q2H|zW%b(M>9j=B3=G5&7mJc7uN9>; zwUdYBJ*eyXHCqB49hu}JPdR~xNZmkT4UCB^tU8%c*A7>v%uhuis>fTP>c>)LSL|Og z#=zBt#-#b$e}(x^QDd?>b(KNZ%XA*I?p3oNis-UP8Nmc6uIN4gz?pwEac9~};oco* zxc^TQtTu}U*9E$j@5#?1ud*&Q7soa&!OgQpzY#y$rsJIIOKFUL+%M56d~aS<457x`Fyj&g0EV-ycw!JEZIT<}zq%`w)3IN%ca3LB*krhQ7bs zwRY(i$D@m?qH8JU;ZyDx_m8-D(>49_^UY;$5u~lM^_!pwopEC3*WP_LoKH83C z(f>T!sQ`7i^|zT%5qBN;2_Sf)w$_DlnQu4!TItLu^#cR4D}9$)?~i>xfT=&`7>Nd) zYauCX>2zs|YXa|ECcb09hTARUVi1B#xPSND9SUUY?Oti8;Y3jy0z)@9(;8FbGOnr~ zvi0*XM{h08J*;tMA|Cq~h4b%clwg%OeBD;%aA!yvjqT?W6p`&2-`EkJEjV<|q3fJk z_zptPbu+i60abGD?tq7ugx6Nvc~ft+ zbLX#bS+aYb%x7qQ3gu5@)lE3(+$HX!)t%ykW{h8)r?&7N=+#U~s$;4QSDmPwIG()u z9+ZeHGxr@mA<4BL3ng-+bLp&XACcWmgNsvFKb1*dPr-P%BXI^GauS-o;CLjcAV*_2 z-jD)Jq@EnzlOHKeP=QVrO@(i8=h7F9 z#D%yY_1$C#=&dDzIt@!ibwlQ|Tjb!@KdM?$gZ*Vawz&g}3fn+8$Z=cSkR2 zXU`G4fDrZXkAj`z58MjUxX+maubPKBfaF^G3$2aLv^+|ePno=qZ@f36P?IZ*^(Ka~ zHR+SJcR@CXE*#B-5dtUSmh&CX6p0b4Li40Ari``r!q!}90It^GP=j41}+2_Uf zEBlF=5Nlx!S>g0TkIeX;bud+GUk8`<_|67fp#;~c0l0;xM5i{lz%Qm4>o-UkcZd!f zr*8X{S6iJ*?dIFL6ahvIc}HWQqikKQR1(NH))9RooF=oEVkmrpw3sH8Sw>=Nq_wcH z{Bt7d+-BGhV>w-E&U8|pE#5)F*D*3gOcJIj*GoVuHT5=*`? zUEnT+x{|-)sv)9_)q9<`PVXyM7|U9Xlr!%Wycqv-JY&$Fto@KAT0Ga0%$SG&F1i0iT1IcjYIsR$85{tCi*Cx?Q-O3xh${PtCgF9h6F@~AQL`k6{vDO4B$x(n z&iJQe-??svv8<|CB#p*B+RB4+dJidne;T+o)W6SK3}T|nty~6kYaTw0x2bPAub1%; zrC=Ocvj}DD!P&^*ZL8Mz@|RA?42b_v9AYj+~eU*s*9==t_R!_q8bRw}UK* zv4}0hGFH#cy9x3X15x=zt&j|81DFi((Wa9{-vO|_NXJX*z6Eq^aL3kW2_vW|?+7bt z3L{Hl+(LU`TjRf7DtK1*z?*9q?8m6*J7?wmRM?e*a4_OW;^n47jqXb*L9ckbsLzRW<<@9{F<^^35OM9O} zkw7nPoLE8i<@)KSmXrgiK{j{)!qMKXhV?TelYq7RpxeG{2OjS{P7P4Sr|B3=HxK zg(i)=6x+y?Z~36BZ*G|iQf*QdnxS)lb;H)iqieyd@)4YWY+{d--(uccKAsz-EH$u~ zV{udlYtFUNS@L?Vg6i0YAi06*+*rj5%>RKtb__3iA^2JJpPAhNZQ@l<9)r7-%&zOS zolh}~PO2>m5k2v~4qrE3$*wu@?KXdo$3)9m$(YSpauWGB&{T~3qgbk~c+Jhz|i!*gio!Hq@E9m2QTvapN^BKyv zaeFU|cMH`}kbLb0oo;%Jl7s|=Y#Vmz6qGAYnJMg72M{M446;#bre4nwE2NHXzPN_l zd)W)A@aKR+C`oqId?;I2eu#guhukbc70IpVlyn12TV}|h&jHF8UY|~Vw-PT)k&ku8 zPvbbt`l0!tUmdnu9%RB3_%MS|z>b#6tnX9!hmgpZz#ZMfE5$Zjm%Knfe3KkIncxq~ z6cav-#ofp3P-yiZ@?mx9yKZk?4$_H6n|vf2V-k9*zgmPi9W78rr??_2)adqF{|7%n zz`rzxdqoT~=C29n$FtOfP&fY|qpiqS^ACSKegm>FbT;2fa0b&#Eyd}jYg7{yz5j&* zQt$z7s*c`6oZgBJ>-=+|YF-)#MYkoyVOWF}ttcFGtHB0j%0?x>VoPTRv%1kY9Z=+u zIrILeGX!uKs|v0KpC?}?DwU_C95Dq@2X`-(CEFg|Rg85tkKY!v43`Y5v*q1y!8XXZ zhANfI$7n<{tvBLm+cO@LcEx?B9h`03`EDm$Ht(%^HzR zfo#}yrQOgqITLP>l3-d>j7M;z>EZFp*cK@K4TG4BNPn62$Le|SMu>{L22G#+lipH8 zXsKh)zKJT$faEH#8dU+Fz%^Xf4ySjiTB$-b6m7u^WE9>56QS|h!cTx!6QIU5r%+lS z6Wo$i zbGrx}Mh0O;Y3`skD3G$FJwaM>#Z#n*5umcf!be$3T-IFcjL>Pe!FdotQn9%Rw0z9Y zh7Bf5cbHTOyVGK{eHCpZlgA}&F`tW;#f7Yc>m-%DUe;{i3KfF;bL!$vt8^*}tG3le zC(BBJ0}4nmzHY8IqGg7pXmS>@t@a2z;Hpnv~?MVZc;p+XoH{gMuUC-*KzwMaX?xBw16k%-Be zT!bRBjd1uALkBG6Uz>Y3;zt?Gt5k+g^>6G_YR+^@JOn)A?lF+Jko+K{W4+Pfs0&cB zs&G&a*|Y}BFtPPmG|@?2v;JvQFO$CmNJGxexQh7E3Tb{0=MYld;yBcs`nX8gukzwZ zp|A^6l-tFH!t<81)TT{;H(}{eDXqqBO%+`(UM^q9h18i4P;j7Ui^v3dRRh6 zs{Oo4_WZ<~RA=$w3|2UasWAC%0}pKo0dfkYNoGURz>0kkg_u}CsBA8zr?sWzIvrM? zN+^6<*w}LodnkGL zQwHjfxt?y8&=OSw1x0Y&H0zu)`FW|F$P>e48WUGWP=lPe^AL8Lv7{#f31>!51V$Jp zejaWQ85kBPrVqHk=5s-qtGBJ+^#`LEdI}8M+f`5LD-rIos;CDUx#AnBy(wE=a6c6YW0mfQ*RhMLra>7 zWTKZG7A)l!T?_ATKX|zioD5?Propqk+ghQQhS`piYVQ`Pj+2b?As=#8mTc-5an*0g z8h5fa7qt}o;mBJIdmHLg$a*u4qrV6Zl-}OR#4<|e--u-siK{bsvegpYIPR4zeT2cm zCHXX&F6?r;oSS==+pB#2O$}sFC6^vbtl05DcXrALPekG(b`hQz>&z2gR^?)9r21&& z0Bx zU;t}UjRGv`0Og}uTvu20(2@8}=&mEeZBVYy{O9T}_oDiBn|Y{Jv6+v1MOCx6{Vpl4 z7;=DN46;XeYgDm9Imh_jl|79W`ycrx3KA+t`Mw|Wh#UWfqjD>OcoST`2z_I>FQn_1 zhejY#rNIj7mVM}sAJUerghf1IiBw`9v=&hUG4X5A{Fuat(&CskAPWE+dtP8ZW*isTJhhoPgP*nHJ}E%xdO)azN%L1?Uh9qZ zsV7hI*?1seD_t>C3nQL-Q3q0Ft^?tsljKwZd`MJy7%+rBJYVS!1~>x%oW5gEbx&H! zd3@n4FHM)R47kPEPP66FKZy)-7VY zS@22tm;&ioCDaiHjAUo8_|C#^4cck(0oq>piNU5zDcP!o=3CP8J?bz&0~Np?Nekvd z;b&{+L&Hw4V%Qs6h*7Sx@Eln&)v1)9F@90YCw^G0N8Pi?CIls~!W7QOTQTMLy&U)q z({a3$|7G$=f*XyvKuQoCm&tuST|ZHp$ZUAFt)scm!FFi?Blh-;(qsI{!WFqdknePVlQNcQo z#B(v=&Bm0f6>l0*JvojmL0&tc{*(=LsG`gVYK)h_D3--c=s2|nOtm~_cdW5H@MLzj z`_Xw87NES5R2Slu%MZ&m9jocp^)_7j%nwU0VI9fAD5v6HGQO@7Gv{l{$9%o-a)x~qdZjFfgymt+sB%I7B$l4jz zwEP1jTXIU21@HW~EQk3x#}Qye80(#U)Iu?Kt2){s^VRE|TK5;wwj<$3Dg{VYiSe~` z48vElI!aa?07;{kXE0H2WO5yJe&FOs_$fYh4Xv7QgWDduD5`9N-uut*8F_KiH!Btx z`_#BzUa3$1L)3m~*(YBFC{{%f5YF3@BvT&{sa9%o?KB9KBcL2}-Um!Hp5;;BiQ!Fe6~8ZcpB~4K@GN0)ypqrGTwH-8+60Lzk9*2$qK!@#Ue@rE`Hy_YhB zmtVDnX2}i{8*5E)R~zcv3W(-6g3UQdxS+tB))E}~RqMzjX!VsOU!oW&sWMq_Xhgp* zV}rHKQ8QF`TPJl8SBwfNMaFx^XXlnw*O%?nV)5mFO8RLjyECFF3@BMDB8KK0y$(FK5*LU|mHxZp zZTQ5=SqNhn^0E}0|0}q2I0GNSCR9|3sH@2yzqfd^EO+4Xiq2O7R>8v}%Pm9cpJuiX z>yS4=AVSVQm}6F!5s)Uw_IV3|Iy_{=u{%92QI`n2^Tx*89HG6cn3Z5#HB{3SG?PZ40rC;39B!9gNZgbxX!UJ~rB*7aA=fBRmC<`F zCycbY=#LX-=rPJn1yoSGwg#loBQl3-xcvxzS01$Yxo9$g(O^Qi5A^5ERz+Why|6ox zkfoB?a~%zK<#MePGroQF&EkPr@)jwSJYDRCFlgG{EbAq?KwVb{*;dsr0;<+gQo@hy zRbW^_VF-ZsQYTkxCTN5_j3%`f&KZ2DfL|unwga1wt1zU*`oS`UVI$ER;D;c?7O}Sb zRpsW_Z=)a3ZKL(#AC;4>0c}vfJ+!_41vS1UvzU4g#u5qVC{CmMoSX#>rX%iT9D!q| zPx?nzl@28v{SWqtlK z9CZ|C5@ba?af=58`y1hcSVOqmji%VHvWH5M18$y>nTi=3R4d~~#|M~=2M-$Nhl zTEK;JhWYtGXt-gWZcHxxs?QHkebsDq#-4P0>LL$eVm%MKkO~$;>jg-QU)I1(kK3gX zHQ9vM>9vBYOL$7t51c@g@?VmRT1Ad7k#OIgCZf9UqlGtK9&R!dgMp^mawfFoxZ&-rhbQR7FdR7`x`Q2trcU6f*9? zkzP>&KcLD2tE)_}VZ2s71`}ouADuLwPdHLSXUxNvNmm9!sCo-Ie=z~ZbyKks(}ICw z#7+iE4tcw(hD|cfR z3KYL`mueXOpLxjKI*VQ{A4F3$4(u0_+Y~^~vX+GF)P76gM9>=nvLi);SCPB)>Oc+} zq`Hv~-wE4NJhsv{nO2QYGG~2>V)re?ZfuE-1QH=`$2i=PSWAG;_T#gvuw~}fe0iC0 zDe`g!A!Pa+XZJutLeuiX;_ZaZ3mzAuM4M`D=v@zJ`@X`fv_sQ1XxYbSCk|*o1Lgt? zGQzskJd6`wF}VDde9KkXtVTS{-Dvq94Sx>|>ip6r^F^Odx*7{I&fHe zs3)PiZ&l>dElH=c8kOP?imX_<&scQJVFRZax5IWJf(LY51$wpN0K7k-f1Zm@eBV8X&X+hJZ%H4h3 zN&j6fU)4od37euw+iEX&U-N=!j6FAXuOcwQ6wmc1JpT$|F^m?*o|e6ubR4?}>Rfbz zgen|^)LtH(%EqO`gc?)%__FL#_dqZ)H%*WjN`dlch^2lKA3if*sg&i_9a}hBaly4Z zU?HpybDEIER&gYU7&7eiV6rK{RIm(W^Q1SwZd|^?FBbm=!?~SL(Y+fr<4(tG4HSsc5U7~d`vCc3Y20tDk}8hCW{#FUONVS$AC34cX&(JwIilE{QR9=e zw4h??z$`^dI=yd;Uf({aY#<^^yywt@SL+|Z>7jv8oE1AA}pt`XHbovCW9%=C;AKAXNn)Z4oQ z)JoGUn5kmMs>;gFfg6 zg#|Tl|6_XLWz?mmaIqsZf_dgRcW8)etaAuIRonWdKvq$E7@0Pak|BABkL*T;3-5B^ zeb=Xow$9UJCWXW3*<`>*|7Cv{2!?jTQ(^r_f8>!9KdeIJ6{(@Cq5?K1qjt{fRwHDN zxK|lE#Ra)y8loWXG$^y_K#sfn?)=X3q=F#SDUhmPug8S)hkyi;=#?gM(crquE(t@7 zIP;rj2wj7R>^k|C4#Ec$KFieWM4b$A!aG;Xr~J$E`#h)yHr#J#eVS1)mKu*8D-MGf z&scK{E=tkxKu-33jWSO&q-{~If*Cz1cfi)8N$jS`8am#1BSx|2lm(kJMYGDrGq)*KW{MycJ0Lf;vAe@OV3?9k&ZH18f^~ zVm3_?&!{A`9WfV6^Z=ZavTbxhebamqy1<0mquq5!yj^uZ3=p85)8!)euW|!^zl{&f zl0GX3TQp{$Khl6W_5~OR{DmN#xR%A>$He2mBZQ21lF5U}SLXyr-Swe&yOQ>`geqFz zgn?fULPnGLzVF;4)3cod>-F|$3DMf>@skgCwa2t_Sq5jvDLBOfO+_|r4BRLz11XEp zTPVZ22K%JEEK!+h(Jh$*8F1NX>n~Cn1PR6`u4*(|ZMZ!DNAIJhkPk zmZx9v1+Pu08g|yP)(X0`(Bqi0sSd0fY)-L;*}<&)*Xpw;?(stIkPGVe*_czUb7NTV z+k`6;rYbA2%+GXUX+sy%xQO#wu6L_YEBU}Te*{B_&GSoyxM=!`_*^*HO0)TSo(P$a z$aS=_{h{|Xk<5vZ*Bp*`{>GnBW18eY;7q*Y%bp{@GAV;Lk&2bp53}sX zy5r6=op*kS7;%zz0EY@1Y#K+)rd;wqO*#}uMU;{;cA76jq}1hwU+r8lLpe` ztfSa1vP*8uPXlgKJinSci6Bo{`sy*HbP&4cW7u!k#VN5-%qTq1%)16=h#RP%HZHJb z9_6ZDE|)No#p<);++U!ip*lz`QW&CbCS*W5_<{^nIIP6_kl#(#Q|e#ILjxLOT{|95 z=~^vL%<~7-;dLJsiEPl)@C0j*ylfEx>P)=g*78w2O>31Y0<3KLBO}(u-}DuLh|bpY zi6^9yw!)-^{5OUShq)}EX^KoX?%ez%QJ#;uT3__QfJPBne%jkmFLfSLepTuX3B0)kwh4b~&%LykG6dgS!@nea?*!m~ z-6gj~tMn^h9%EXNMXQgwSRsX~FVS11N#Xt_zcFIWFQ5Ix$|F&g>FOLqz`P1pX4;;F zPSPQW8045esL^dlqP9L`p*Oeh?2_W+>crjAtOFfrTT*5UvKH69Z-}ZvlLp@^FTuvEGLuUWKo zZ3dRl04nl|0qYc*OR8bJH_|gAF$&-4{Cmc_t;9kJux8SQBuRV_-598zug7d=Z zoD06*G3J=$MeJLCaePT7Kc8ROrVSQo384A*FcxQDx)nW>Kf;>Ki5b7K-67gQP4782 z2#x%~f=T!H66?{IKpi{W!PzEB9njI$jfkBuT2T*R-z4}mOWX9s5!&W+xxCDjgmX%E z`;s{ofL#L3YQOVcR2kM8S_(KZXazL6Lq^mUYBy%m8|?2XJR{FkKY4OP(~G72eRwMeID?wn)D5KokVT9!Y@6{qu~mcKOSvW_L(w z(=JXYS}9p<&sgO_e+JZbHivD0vX8kJ5>8_3=R5|8In#s8KzM(!kQM(PR{wa-nB|Sg znvv5-Y2)Av{{}SB$_~(;w20z{cYq25W(b_w%XR;9|S#6YSciI)tN=P#elvuw%AZElXi zvd0ZeZxW4@eiFK~BRbh2gas>i4-AVjA`o{(Av13P%;#PH`ZFiL{94XC8O&W{)eVG( z3BZHf>)MPDNas&1I!aNbncSYG_Bt9Fo!{M>m4axFY)E(`Fp?2EIt^Jv=azN*IBN0& zUdrUY(nGC0OoX@TZ&1JErkGBn4ycwdc~KYA>oW3g4Y^!uZiiMV`{5M%*C}) z2x+$HCJnqdg?Cu+LT=$oc_i`Takm>vt9;g%-1ivMRZWTtT?ZM$Jn9nhVWbE{BT7FA?B)i6!lIc59pd@~g{0$j?|QQ1IW@gD6&>$8}fx1%2H$2Rz`P!>2# zMy@%Z;k(`5m35+cdX+R~!^19h>_wQZ2xn|`ue5l8fR8$sk^@2Gso$}6^qv19Khq^g ztOYWl7E4;q(7>Lf?)j4*?+x-i^??Lp2I{{=f5OL^JgEWNyn`Ta@WEiZ7ovmTER}}} zmeCSDn#^AS>Q<6*Bf0et4ODIi22e?bs1rqu=;5VaAMF>mVtQJsh$=)Hio=I{UEa(f z)Pz9PCcfMq?E~N4cH@(|k!RvF#me90dclz%#1HWS43gV4kv`NFJ{Or&6$$R?a3(jO z+DR6l)3Xzefz!C(dKVjqka~%5$D5^`-_vIrHQCPOr3Aryk=;S?r6smxk8uN8)A^{} zIFW-RZj4BhMI_OeFp4FzhYQY8r^+T}rVrB@tG6+9wf=EgZo%V(UBSk^$80KwS-9cD zB{zfw+zXby^#Pno?yk=W;V4g`$k)eC==f_;!Ij}*>An-4K#yhANy}_Bls8>JN8~Mg zOxknxAraTzcrUo2?2*$op~^WPNv1vxsCu&P@|Bnu9UzK;ZWdyf(J>bEfQ(>Nv<2Rj zZK4N2bW%^d1;Nc>NF@_;Wre)IL0__WvtJ{c%-9SSNJS1b#V&euhW`4W4Bu?)5^0_7 zowGzqazmPM0jq3KDE4dN%mggQ%THd|W}cGCi`|V%v0Nn?iGkf|fex9wjW^%_4Vf3U z{qb*C;s~c>IrI^UrXE)9&$ixWMRvRgk{>)55F)^zwVMGQ&F)&C%v!Dtr_t&IZ_h=` zyCBU=J3ckVtHBAMDJsB?ZDCN_&)m4NUT=~~1SJe@oL2@vE1!AS!EJ><{)>`1X!R9Zhu z&Gy_Le$6Kus^o$5eJ1L0|0ha4 zu;wu!MgU+ec<)huoi>rvh^;5B#yla&med>nOyrWMACNHwa1K1q!^j<1%h8hc|1`-3 z4&?z;6@m-x#SnZ%V!&f7#xup0tOzBCW8uF0aT4HsQPhb#7gv)g_T-H8NXvo%Qr;l0 zJjX9Quao93$q=~VM6K;~U{D*5G@eD;Nq`WJY6$K&BzOffCm7V=yPGDhF-X!f!Qn_7 z7yNWl5M_{_e7Y1hcTCoVmqhJ6>c64v2z}CGg!p<0Y&YlXN?7zUlCY0zjnYt@tD9r| zneoYRcB0PGk9);y2X$J9%ArDGq-X~8O1VoMib3pA#&YiKFTLM8MDSDRBlpwG^d7xtLMUWuZ${x;wwU>9regdbG0&C$%7A zs1txDiw|4ek66RyN$8)emoKl4KW4)mx7H;$ybT(djJ<0CD@ zPs1J&ry)xE1Btl0Od5-0rBGzXl9EubKKoZe04TbOf|7CI8Zcv@6^&P@1nzbt+!Gz+ zr(TeIMeyZ0RTz z1sW|6adblbf$YAp`uGzSKI9{jx-a%n=2yiMRbH>X{HAKI+jqBVZYW4jo30Kg0)NKUMFH9gFlIoCMvndX0gT$VO>k1%-cnXc(je1=U(CKp2 zC%Dq|B*x}rFW7W?B~|3z8nL=q(Olp$lnm+0LKx(-GXrTg=NrY_B^W@=M$u1T!-YE( z5r0spq{>^x|7~M0YfuUs&sbv4W@iLc1l_2Y$Co>(Iic*j zi+Y4kpw!3HaYU?I%E2_cBMee!56QbL7yQLrU4()wv|V6rZgsDDD&k{pI%s~bLuC7M zp@`^gJj`l0NZ_>_krY4}56Cfdy$5j3=jv;5HnN9|<9o~fQjVJ=9u6lGoQKGNW7cm) zzI}o-A;ICTQIcx`T;;AHUi#!u6pJw^o}6RCY{n^2TA_=O=se?BS+J|3S(*ITfwwgr}FnYjq=I^}k6i%iE`Kr=6jA46gLiYQfXn4s1jV zHsV%*zhY?v?l%Fa+3*=IkHLUTmTNE#4eqEQ1qYV&?^|W{I1LU00Il3$q`6f0cs*%g zFkwA2qF`EZ++$V8<}0njoKGil{hjAEJ`PUK7x>u)_V(C#LpPodb+G3Gznf$clIvky(#;j3R2%F06RK}A+MdV z9(|ai%|*ZAB+nzQy&kFIm147gM3^@B%6p0QZjav8LxEsKCtt|8cb?^Pn48Jp&BYRV z6fbe}zu+(RHM;lWUG?xz2|*Z5IDg~`UVUza=ce;byY;@q)5kMfn(_(}7KudB5}3|( zCn84YgYS_4Bt3Be)rw@?0`#TiD&HCy<{Mcsj|7C8)2zpO8SOPq^yJYC)Y zs&H+B7reuQaL0av_GGLA_FGL^L9b=al_q6Sl3`CC$I&b^71O2j{d;1XU-aO~-p|oS zH-Y}>_1jR+SXJkK4uEm2k?jQ}1lWriFZRR{$Cdp?zh27W=t!a%vxaz2_xWHOuhnG- zCc_)%4ZQgF8grX)0t9NnS#Mz@Cfu`$esxYLeDHHwAJ9#TKRHOvx3kQg^1~EyyS@Tn zWGCFZLpbf?4tW~Z^(h!Ww53!b?tzV4C5)A`&AEMCq06?Y-gmGEgY`GG#<*V%GZuij ze6_^u3*m5}v}{+PdIvOUt*F6*EG5#>3qds>USY;M!(5#0P8SIc&^34rj4P`)cXfqgpu|8ymB0uN76zFNb#*de)2a=;oS^yL#~NG3tXnI`rxbNW)$w*Uv|3-1BZfK#_s~Uh2M~%|->fR%I@Nr(1l;vi zONgWA`JBB`2QDs-vq zRPT6a&9l*O`i+7ZGk>nL31UB= zymL)r&a-{*f14YKvdR)*S=z0od#i;^Ql2H~(DU5i&!@K(7cb}!&ThG!mUt6zZNttPfef?1c{`0io!cXz+I!@t0?iam1*KajBT9TMyrHrPr6U_7N=o?Rh*LdGtyNp%axzS`-Y#b{G{gXu4qt zi0%sd^@4B_{&aT|Tat}Xx5^b`+3f2Q z`NTxfIO&}nYGwTneVT(lp}-Hz0>p%@oFY{)d@b?hr)LoyL& zR2mSQG(yAt{)O;h`65IH%_aC!4X%0O&WV+AvDT)QtnF(H>ZZT&{cUMSuws>JgVVz7Ha=|O-K zGM}gyj0?RGo9n;adN;)+i*nfy`wRg&9kF<5Dx)l&gSb+EvO8w_65%V6 znJI;g$$=Mg^N_myBLUYhZ%SByw?#`r!tGn1O*s%ENK1A>Pg3NXw>rbDpmqOH3O0Hn z(|cdBN7gXR;U_8OM}s_;@W6qZ)H1ZdUNv3r)nMGc#j%0Y&elUPq&r3sR4^2v1As}* zj?CWR*D0}$v-Ou&I(IRKgfL0j`NPhdNb<8pG4fPhTiSkGLC{@@pky@wsX$bkHL)nV zL5IwkEeeF|s-h}sbf~;ISO8AJ#84Qa;-`{y;W&T4cK+>ePtM=J50#seRKZy7=u{U^ z>xj2KrPuZ|k~9`^zt?ay;QsPorP8yu*L%DLfK##?0-5HF2pJEue=E1n>uOT*=@n>N zo7TE=eG-2OPT978Rk@$d-ny-=`$RV5aLrjh#LzzX3Wtr>b)3v4 z2m7IqDTDGAv}+}catoii6JioYFG(Ce{jWFtedIsHS}2 zl{%sA7yZFK&<<)8`iVWf1WB#RL#{*HS)hf8?Pk<{PGb6QNHBW-J~pW5MY(W1s%i&E7B&ArpWy+{sfecpO`2T%d)ZlZDp%JX;hZTFnfO`k`O3`) zA$5NPO1j~|ePi@k+{|m;B|$L-n7rCI_%~J8R&}mkMO=2oxSED_B)foBXaJ8u27suP ziu{DdxqCn)!<1Ck<8s@&tycW+FS=dBhyY*{6{aaUFYnJ)mYVH$s6rkdA;5 zQO+5u^DQMx#ORzv=%or;&6mQ5SfL4+5M*O57cnE?D@$|x4N!P;>oZ?efFyPr^f9oN zc#2=V*x0cj@x18E)I>k1Px9oHf1Yrt)}fQEQP(6MQyjl^g^D0?B>s@f9&Cco%hkv* zlRScc0sLRU8TcA5$E1^$!zMCv5p64z<{9^_*c@o7f~uw8!g-v=~;}kf?!#-qB6Tni3ZMXc9w~+z^sr*%V-{i zFZy;QRsOoeudBR^J4?a7hO;skrK?D0*7!&6bmC-f(7)$utg<_{oa_Z5^b;UXc+S_= zAy4zK_Lu>PV3i4qgs`r#{Hq2-Q#`L@j*{9O_07LGjWr)3k?Qw%94p7*7*aIZdc8PS z{_L^}W2~=mW8+8K8xDYq#|Ea3d@N#}O^iMxZSro6m7SS0+T2Bv0N&I{fzXJ?hW)Zn zKs8BHx;scYgNOJTd}d&yrRv*jg+&XXLN3rUdt|rjB~}1ibPfm-mzmCl?#teg!4R^7 zWgR(P0NTR9Cx!8%;rbX>VaQjT7U?+;;FsiB&23VtoJ{i_{I8+ZTaNfChB(^aKZ!hj zw4=iibs;Uyxm*!)ds0E8S>4lZ_z1FT`5=*u9rb?Y@=6_XyWlp~Ih`h%Rn4pE`_f_k zg$Xe%J8rCmH99d>;Q&KCKV)VT0A+GSoT+Wm<`&`|=xLIn%STFsD|%P~euMpBeUZJt zqY~zU)^43!)Rq|L$`jq90!^hp@I?`6o-ua1{X)i@+E6=4vE4`ngZ z_!U~7{pUWsP3`Jf=s_y=94z(BL_j+ zo!&{&j#uRawvJb0-_3K@y8JH`z|8l?M-;!2b>FCW3Dif+4SY`~FH5JjhG7yPIho`b zV;qYUS$Bo2DkXmiwM*sBa7#BuP6ZZ-}~(_2cxL=g?-p!>3Ct--pGj)P>sI(s{HIXcVp+%xyKt$hhzd+WI=}uZEyh=Y2{n0gzo# zI!$%4=K;z73?>8PIpBh7h3f=mg}>-6ChEP`ANbcb2Ej58g7bXBgHom49S!J&!6rZU#kRs?*Bw4L)a`|} zaton;Wim)t$G(bt-2(*>7M78Gg(fD#ymgTzlpC^&>*@F0)06_~{beOjnYpPaH(DkL z&s^xJUP{3Uks;T41ksB(W~xOw^_^f z&AL1&8pia~>l5mVVT@W90eR+z7A^D+kJij$Hq&@J(ujwN!&f#2qD_c2G}_?)Q@0qb z|4f}L8j6A8o**&UY2b@W2Ci@2sbp;`@P@=d7QQZ!ou|PJadB21O^TSM1-F|W_NBw5 zlfV|-HjxJ>uLSPfk|l!1>f0n9+jz^p@j(+Qe7tln9^_#LHz#L((x*6`@$J5+jg^Cr zICx{*a?bqzMv%F&E+V+4c<>6FSW()}Vt9AaWeMbH6mD;>sApC8@J1sJ?A>?T$(TR$ zXVwl{gVKDda)ShbmLv|-YL(eijt+yJLTgu*cW)e>Hg|76#G+cedMaKKD=)BH+i(4Y zs7}>c<0sH2+tGgvvy`u{<2ZatT@5-D>$bw;H#gre5G|WAnX-|2adg4ThC2j!ZS$X7 zHjDpo-K@?WRN1r0TYNVVCRuwMwQ*xR4n3&M-M|NAaj=EJz}l|Pp(_OM$7E*$G~&ZJ zImvVDuXhDyttQy}r{Z>bY+fbms!681K><-ydKSVB$QRmfFsEyf;Om>jw(*b9#&J=V zMkb8av^9>D!I7%!*b!f4!_dUE!pc>~N;0X^FFQzE+?G!xY7)Hb_;xAmMnQL4vRK1a zV5{CMhehHnNL3eZD^6u5pBSS>3^@?!-UEDr1U@T@zw|N^wQpI8g_vCqvW+~J7b%9d zq}r9CFvt>=R48!e%sla*gBTDrJFZ;lUs^m91w46?ndrvzl(&=cO1WvzWYH@QSp?1o z4hvW4-@7^ffhQ9sjhYF^Y8lkNM&A3=XxU6+>GCBNnlRsA5LUkHtURS48naes4L)&J zaaQu2Gk-?YM31$lVE96<6L)EVTA`YTDzBD)hyzE&?4?AI+7ibkA=*28sxr*NXy*e9 zyg8UZ-P|7d3GRT|sxJ?Fr{^KUJp-V{kon_uF9XE)O{GM>KY z3>@>4Xby~D7hohWA~t|+RLY~Az+8#$pgy*KBwbEG;EA#$g{RiC!z1*7%mJg}M^L(h zvC5QO8OJ*gO^kl=278%el5t*Y&1hq8(H_^Dbv>LLim>%O*iXG+X|XS5gl(1Ao7vwN zX9u5R4fjI|8i8atl}Xj$N^0y8x=3K9pYD+_HfSJ$zgP=GUQ6MkzY*$(B{#K6V#y*J zy_SY)0Xu>7(RRUJV4==Ty&CJsyU3ki{q-5>VO3E_e&-1{e~w3k28E<(&L?p0bIhdddet% zy`1ag(R7N?=8PB(RWjhX7DK_EN9$kv&&^51NX;bJH3papyrfLBu7AS@-SKC>z93}U zCcA^2^8Z%Z1m(xt(LE_a{ApS!8r7J)Np)DxIA!7T;2+z)|X_#kIERFP8STHuYuQ7pkfp82=?h=jcf<0~f2&(DaqS>v^m{`EZkTN>JM64_?jPDV~4 zCTP{CMj_vO(a0{Cva(Tu9gPAYL%bxj6XaCf6U$@(Vvs6Vx913M`2tsyP0} zpfycJoJd9B;L3zVW9!Zx&ZDUzN<1k_^!M5@p(_b(8q-^tKAKeHUxF3kkce2j&UR-#n8nU<)4_PFd?U7{3`##g;e*c>vB z?^u2h$epgf3oOr2epeuqi+cj>{~HI(`K5Yn`cStdKsQ+S;flZ_i|nD+kwa5k3DEX| zYCAsEm_R25*0J`KL8luC$!XDnElD7w-DJ=GTqzMxa8Yq4(zt%*)F$VfWCa-Z%;kN8 zM%)q7w-jSmkYt#&JP}$fae$=d=0zu0FiK2J_qfd$0|o3ld_{1P2Bo|dsl$k*FSw^E z|A%*@0D`JHy&Yw&l_o0-53PZI6xXBHrHC+KDc`gGjKh4mmzEe$95?BW(QK99%#}yuSj~j8xBN zEq|o<*psYGvMfdVmi&y3f|4cLIPPmm2CUfw^=Pn*%WXi0f*2Q?vUK1#1UyzTtMzDE5m-su%%sa8hTfHgk)1jK6|pq!tL0Sq3jZ`#X6|O_H0RDlKj~8JtlhMM z{fKTJBWX@sSmC%VRH_ZP{z?IH=l0gKDfZ`qdd8Zg6fEDshyIUmwuAmYeob%eHUAX0 za*@Q{{Ws_f`^*gaP%uG>Sp8)X($i!v7T=;W2GM)t9rL^EcRmpFC7N*5-5jhQvNPG2 z?g>BpjY8377CuDGIwWo;!o=ttD1`!$`(5QfG%y*yyJJ{EF3Y4|9}#YtfTUy$&nA>f zyogsO^W{x<-zLgoVT~w6lx~i8UH!{`pJ-i1;tdO7#s|!;H%DY=3P;hR7j`*58TfVx zF3`8qYMSfES*Qm|fU!PMMB?XxX76jJZ3s$Ft2LM}hnc9TrP|-`H-`;4+9>^NiS`<8 zz%h&aCW}L2|8EoUzalmi!90Q!#ipM5bR<=A&+;Qtgaem77*3dQG^gj%ZAUk5XFbcC z!%g1qno6V8XX7H=Dx4U|NxuQ{?W?U+*nb@+<9%^!>f-l)Xl^BOnw)E$OS-qhxRX>N zuC+I%gV64e6`curj59*RVbm_rFu;G0_LqzG$%J+0sQ+8x*seP@+eR)uREPXN9Lrv^ zTz7&UI=aZD^|q@MSA5BP!OEu&07e%7Oux8Z*IFL%53R1W;{9VH!d$;gk_~6-#*Q|fUibuEBA-J5dU1wYR$;M^Sxkr` z2Y7PVOp@|1qrCijS{?4bf`4Po9EkBXyR_}$Zm9M!`k7i%^FkIi^Y=Oy`w*m4&knHT z7Il;z6^ zhQp`Pd1HTEf}DqCs54t1XnTe4R18}`4hYE1Z>rbpmqEYZBd{(5!Fo%)Mk3{ia}fiv zm=ZDFl>-ly^fiJ{HH8soTwzgB=dF_DbQf_gZHQ^ddRM29?v@F8epf)Ts>=5>j zpfN^7M!St)TpD-%s9(lLirVvFL0o!+GE%#Ua}C+L)&Mj{eUE`SjO+gLmFrWD+=@@*7`6N`J)-MyuviS!u#%PMNU{_U^MqS^qhKz5uHm+XSS;LMM zb8MD6r3*l5z|i7v-anqwY>pQ>%LcrJAjaod{^Jji-nNP$7nMI17%N+J9eW-Yy7}jF~iwO=`dq zooR5Lq>^Rh>z_$P@HE4|#u(8e^E8+91<}g;`bSdbzjRj^ z96Zz?A(qLt;_A2FiNuO$Ds+BeK37Lc%gk_P7 z+=X~&{|eleYxVm$(w9vq#Ac3&Z}Dw$J7yy?sD#>iwt@wQasPeiG2P;Z??tt|*ki+x zoCXz1j=kTy!nr3JCR{pHDue>)?JL;Ku!Z&G$z>RZXZ3%n#{v%V_|h~S3u`^|E?pk_ zfw@N(Xvd+9^!f`Rq)hm{4MC|ezCSSdGbsn$sX1a4?}I>;kIYDM?dIpm)`VTer+uJ9 zZD3m5HPyeJL=URGS0Ht25j)^Bzmgsz6NGq-6FQXBlEO219$T0rwdxHWK(Way7+sTL zqIJdzakDgpXD%9~!{(~$t`MqmhmkRJ0Obc%20mGI)dPf^SQZ~Zpx{vmosmr(zFUIy z8KM3nPJnQ;;m^B1->Mr(UIM#ROYSV)I9W9cgt2n3RyiZ~=({X5S>2}O)Z$UPm-f#_ zEe8LFiU)WJ5{yLZ8*bmYcVG);uGU$h$v^pV7{Wh;Qo;-Y*yXh-;_s-Zcgo<_Q}PI7^Vl^cB64J9Qb-=+0_U*tfQV?FKnd_9y>pxjILm z9L1{-%wzOP1)DKW0?3Xu;ykzIjc2OpMZO-Gp_#E#m!D&Ib9wFoQ{D2L_|E?&e|L!C zXQk6-t15~&b+Zb;D-+oXqDPb_6p|w&COoEJ)V$*ECSeE9{#)D?rF72YG?m{(bY#f3 zm6)&zX`0Z#JyCrhy4<8$tepIHZ68&Gj8tEBZZ30Hg%kD)dxcfR*Q6dgxyZ$2)MTpO zA#hDwc@>2Hy*wQp!ARVS+8U^aWq9W(6MahXKP$hdWDD~7F60y+;5*P^Ltzg#l=oO(YOpywaJ56BbX&8D*fJ#5#|wYlN0_iWEX1OvRC{ERnHW?l(uX&UPA{~PZU z8um&TS59mJ2X`cdZ7aU-9##V%oMM4g?H62WAi3}1HM5tXsj{|7Q}#*43)bHyT>ZC@ zr4J#0>&=%Cv|mn+X@_>gXShUC%53Fv(KWbQhO0u%kxy4_&~NLm#el zAUwnbckV_k#%{U_%Cd2oJIuya%9qlsREmayfY+esO=Mb!!q0NC5v3Pw{92N0+ zmd80n=v2_}XO7|LkFW9V{*QV@nQ|&upTqFJNnAj>fmftNC1fpRoJJsFms^1t<4=VPYi^oJM5gCR~}N&QlLu#e=P#a=eQn4oMNl014eoU)(AxaPV#j(jg%^mi9kebUH@pH(-eOPZ*A5Gl14DldJ%sWwX$WZ?|1N6_^mr%DroQ; z&fF;xNGI;kjZXcUP0YdDXxM9-G&!WT)sRYp)gWFA|8lODESUdz_bGge)Zwm8s9-*h zw#Mek0ew4Op?BuZ7CU0fgxS}74m_2w`1U((C=C==j8@?}Cg4;#eSn0CY0i09XTtgp zGi?x>C!MLe?7-k+O1iFjkU-{gM!0JjEIk&^R)iU@U!`%U2}Q!yO_Frd~#u8;n z_wqDLx)jzeQSVhkHBJ2vIgutdh!v(OMk2==^hO4jA;DxphJEAg0^Btv^=<{d4!WvW z)9OG!)MDi}HA=+!@4kXoW5*0Jl+jMw6lj|^-A!Vl(&ke)n+7J-(|IB%{n@k5;E2Aq z$)MG#+se&wei|GnhP$%|GtY{OFOubhehVk3Q``{{dA#2!6CpHfrHMBi`r_$YqEw~C zVtNcvrP8zZ7;HjZQ_#0L0wfre_(V@U*BDcE-X#Fg0s(-kA{@S_7#5AX4iW*;tA&-X zm^5dl*XD?b@#mIb;o6bZ=MSRax-vLpzQFfBn;bv1;H}X0|){mzh9U*V`UUA;XGbWKT=&U<=Xc& zi?D!7$=3eFZZ1}DKIu*afriGH$qeJfMkwG56GE=KW5c(r6+J%d221ZNDB^lo;)iQZ zUTz%p>yNK53!r)og2UH3{+74d<{f)XF%XA9&9?=g6r(ws>b_5g=y6$u6^J`NmM7ig z-^*l9{SH)hn)5-KNzR&OOR1Acv}iD=1^dD5c4S1!G{|gn3=`4hq1}Rh;Y~vfd9e5r z{UXLt1wWAiXMwtQH+s5L&io3UDc@L~O;8y$_`;9H(xS z^WvqY1Y&t#J6k4@aI<(m9Vbsp3)@&lFGY~m$rWN135@Xk!4J3=_R@5h4mb|s2ed4VO2K38{) z&Ua75%Q4LtE%kc1)ijH4p_AUi6?3>1tK+qls6VLg`7waCaPS87X1_>Nx6KQLi1Rj&1&4%xr(D z?{Beyr~twoeaF;pwM?ITmCJXwUba+-kXEq}4u*TD8w73&uOo;yVfQ8amLs$W=TuX& z&Y13mBtxITPqW+s#F)V!#R5;ZLAcLQTuowl0YETxH_;K3S^bwi0Tx1N6Dw40cM{%Z z#*vLTvB&G<(?gp5$8?OID%h!`y`q@_SPb1j7%~xeg-SaP(KzkNkH$+P1H9$>{2u-! zepulc)#RG0K+IYbe%J5X47_fQBU_lO|8`IV%9IMBt$6u#n3W#toQHtjZ2_ZFqY(6-tNPZ(?r{4+)fG6Z>ydb|)QW$3Qz-F2aDfTG0*7H)V|FZp)S3!Og# zsk{P|Wd}}xJmUkb0##wNVg|ppBbIneB|D}K2>Z@^B};JK;~+{gFVTkxVjJnkx}@ov z%c)TFQOe=hP@>i3X8#YdnQ=2NKhJ3uIFb{TYxqmRl@#7-4Gz1RE>Y)h*S0KGu8ZKOpvAax+3qMF+BM_UjxW}K< za6-wHr_6bm&c>)NJ!!5zU&ll&h28|Syp2z&M7A6KE8nxyhFFfcnArT@O$-ib*|PJl zg|i_^q2Zm55VcIs&RhR@cX*O$G4sl_=R2Klg)hfpo`2O6wL0$m=7Qygt!^i~lq72a zVy5k{fQ>k}X_F=>V{4skQU;25~6Bg0_R>UaHI7~$vP|nc>ica%`%cdEF}c= zA+h&uXLpK+fkDDqRSaRZ1BCYo(2k@HJf!at8wOCTRIH#q64#h~blzs7Rfa8X@hkra zaB*1l3U)Lovkx2)op?g3vh5Opn?ILW$OvZ z#YoX2%)87&T*PI7_P0$KSM+ob0-H+hlutA;08x310vDMK zsNa2dc4HDn@)nn)9D|D}7*BraF>vC}UD2~X`f)Gn<`F2>${I}gp^SMj zV~eA6ioVu8UwiH1)O*AYZ!JSc7K!q4Eh$P$53@mz6rJacYN*ibQWg@?t^aV02TMZw^MR!eWv1km1}A224Q4f8tgJ zz-7;HNOfhj3##8a&mmvKhE@?1LQjQ@Q#Ja!`qPgf8$y4KB_g@|CTBlkn!RdGV$s}q zM-4#-(z7_TCXbJW>9HYa3Jm!L8c=ukeW$Q#^;r$f;t0#xDL}zONUyzr?<;)wgv=P6 zv1^?JgS_vc+Z9E?5ocEPTo};fBNG zekPgTVgiyS?PLBQAlyMObY_X4;BO;PKz;a$KmCfh_BgUj z1oyp2ei7LS!)sDJgZ24DL?8v84{jE4PkB(Y)-rh_GOY!!Wftm-=W^R3G3=`)bb<9NOUZ_FVM{Zx-}R7J z1`++{05d=Y20tdqOn0?tx&G|Ulf#e)UXCv+1e{j{Ywbu3~t+AdlnNZ2WdbDQ?x#WcD>Dn70wPC63^w3aFT+%Eh>U- z-{tU8{zl!tM$PvqopMGAacI!v@pSd8?a8vQWQTLyyp+c0k zYh?Qz?xT84CGTqiY$vdOMmcP@9dU1G$LT#sXGED&b28I*4V;g}POh&J>VcfDJ{kXS zc}n&>(LKl7A>x;2AuA~KQVzpv-jR-B__{6+amXYBP*oc>!+ zREy0lDSMdFa@r|&XZ*#xC#r=3U6Xv5XA%1)>;Wo{fJC775|1j0Fx*lCz+VYLUS3nv z90ApD7KVcHo+O%b3u;S`7FPS=^nY*Yq-J%=;p3j1sDD7ew zt(Pn*jBOnny@EbP*ZU^So)|$Vwrli@{es6JMws!QI2N%%S~8y+*XCanC<8)zk~cU3 z*;1%&BmDZt{#lYt=Dcw1*qji11Y9b#H2CNkz=Ayv8G|g%D(T4US>kXdLKE(Zruv{C z#v=fMTW4F94_-U}f5R`uUryOR%@dAgVze?pqyU#>if}oO+zIUe1JV!&4cYecgC#C{ zhg>Dz)2mu$uN}eOKe^Urp<%W|cCF7KCdG0m^-)C0;Ga&S*c0kK$y4<~m2Lu4{fkEU z^1QcCN;u<+Bdc7TnHMNrL8(8SWH$I(pF&T_>GgXCB?b?CoM)l%I08P(;r2KF9l@I+2fbQ+Euqaa8g5#<=T~8Y}1b z>YV+(JtY0lI@!5C3y1rFde`NzrcRn+G^SR9)R@LeZ!kI|AoBWbwW~sW!4{x?dK-a} zk;I&6m?RfutZ{1qJkZ1??I%5XkugGog`M4d9V}40Kz-Wib{=}jK)APc!1r!>8-;#Jr!eK=& z-&j%_H(#kp^73?sR0QBo3sD-0Ibyot&Ued~p~;i|Hb3JQ(EIpSLki6MU3(kZDTfMR zqM4Ysx^)jxkRG&ET5Rafwv4s>u;BISD1y?=DQ043OM><1CAYDc-|&Z3?V|KPC<#NX znFU6#TX{Nfar!c|%B2WxQ`b2Pg5P45LCuKKoU|o;&$%rkYUp-6u&p_z=n(4Pe4Bvz zz`i#@FO&^xguvHtfV8R+$pfCpQz^LI%SJ^Fd1*@iWati1NTv+%R7Z*F6K{X z`~kaO`Xg^He>=46U70LdL+6S&xV9p?PNn%R>3O`h#Q-~@DpRgrkz1{j4(fCGqfRIv64)*nQyP*ymc_~f#~*buQi#eC)N;QvQa z31zV8K3rb%8*QfrUTr*?5VWJ|Dw{}@xXv*cX2U0k$3TYHMQ0JzT_AijwIE|2m*@{Q zgPL*RKc-?8=bYi=aifA@0Ha=a`eKlPE^d?fW#cR(hvn?da0he9xXhps!|$hT#TKoK<2Ebt`@P;K!^F zg-3qFMn*ae<8(XsWO&N!@%!V&Byvt+8$kk*SfLD2@_s-FV*=Z`@X(;A_UdgO@hBfg@9ujHc9q<;RKYUlDl6Kl_Bwpumu#+fJI~xYVkLpOwHuho zgo<>UEjsDd5QGuogcrv9(2g#W-TQ-YM`s1>{EeFBG>XNYZo)emXc^N1C^eV6_gOb& zp3W5=xe!&F(%7P|1k+@ZUmqkb|kQ;kIqAV zG5kRo^B8j*k@d*f(@D2)MT4Pk6rgwPMA{O+NNV*n&r*uWbNaq=P5EK+>=K5#Iy9T zklbnc&U&D}vFeUidw^|I6FpMofH?MwRUIy553WLWnO5KN+~kLk{LeahF$Yx5SEeK&Au(UNFOx^!QahB3UgU)C}DADwK!Me zmLWH4wj33fF>So@YO${F$I~l5o!`*bkCRwZ7RE8>X_KkeJfScGJxTy~8K+Go(_sSY zr$X9y^whu^xDK0my8@<9C?0>FpB`lbSzg$wU}219*XY=gGzcJpI{Tx{|WFDe%nLyDz_l=XR1nj|N*yGoe zhH6QuAwEd5od^WiM`=ws~QST(REox|R86P`kCg~WRB@jWdO$e0dQ zTI&(aG|H#Ch(L%3to|;G9shwnR=LqNO>U!aJf~fp+y(~XspTtXSR4z*r@PmA zHi37=kApN0Tb5P9mo?k1)xeR^P}r*>@_UE!ll|&*9Jl#PdGKp{ufvNwDy?!PHP6&; zhA2CDr|LaM;St3_7|`wXjt_jD`T#Z+DsDo@Qz$^f1s_j40Ngzb?MFf6-FsQHRoN>$ zKx5f)l@bGjM}1RdV?$E1QYX>dPdtD3j441$wabu;1oDo^5%LYXCeI=VAm*}3xm&*M zi8CPf;C#C=7vt5XWgtiCq0ZRyLh%uejbow$lzb2v#*@GVdE%ni$m?U}x9SU}9y=aR zRf^TruFjX4R#S3?xr5roFD#d=&)Ba34Dz&0bxoh|$VPc~v+VQM$=9(2j{`dj|Bsm&P7%NEMG2{NzLvS%)XZn`($p$)4k7d!)J%sS&}%2yB1w& z)oE04wBp%yz9pz(_a4xfv`S7-*q0WR^c(48xYht}PZi?My@$SS^^uMh=6e~^l%T#6 zQus%2+S}1Gi{G<7JVt~4)0Z5WdKP;3ffx?o5)5u!|2CUziuq5rF~f+FLxS*T&5{iG zkZj&PmQ+QbYm@7YTsJ(A0TtYo+Ab15jwdjm-ZlEdyj`aX0iZ>I$~k2!ROb z*L79H*edCeTm|sG*t7u5I!X1CYj4<*7AZ~j|=00%pV#&m0=_T zhDO+Z79hPTy)JKdYNx%TE8j)I@Y-l4BgzzHxS9fwG8vI*JH`7>p1MA?+%$t-o(d89YM7QNp4xIdQvF>U|uS; zp9 zrPvC)L!SuX+re%Qiqz47-;JgmsPrH-O2HV5k-~Tur)SA;bId*|G7W-qQj^nO#%N7S zWV((Tzs)ABD={(OBs*CXR!!ff4q80jsbpC*U8%_jW{EsLMp#SAf^khP z>GZ0)B4oM5#JcB2tuM`_RTN+21Lb^Zx8oDCJGY*O8dnLT=F%#(`dIuoX7!q-AXYh9 zHpat#z%T+pV(Mm?R-gj0uqus77Uwh=@oFkw2Uvlxs28_V5l%X~Yan3YV^oy4ic0QCe+{}I&+aq>Qh!a0B2-{DkrX66Mjj>@e;Ze6i zzU}-8^p}c0dNKZI$iifb_r=!5$fFc&(D6tas&G+DG-z>*wUq7vW2nUvQgi{7H79Wl zYm%_Dwxm2cmo6G{ z84tn!BaFllBhYZ;O3g2eNWyf0hACr>k|Iht@?ke>n|nz?=tSGyUJ@Qv*wlrd#Oxx z=zCY>2piH$g7KA-z+(AFJdy!O7pHhdox?lD`bkDOy>3xR_IXL)Y928BTIAwEgzPQh zBS%b2-dfShTPo8`H2!*!Z3sjn@CxmG#OlQ>+?2Ku*7<(-94x~1K-V+n;{{`(i~?(B zI@@>JsHlu==IsW%GQX=CIK|i)?ZxT#oa>*RIrwL29*Dm6rS{tsT1G@!T4s|hXjIa3 zuj2{nBJ)@?mg!LT79ma@N(iX7wEJd}nVMH2w=ItmyqbO0#nG`^M-d08bZO;mZc$Qt zpGSOJ9DPPogi;8V56Vj@jw1BZTtr6^uPU#K$`JO0yJR|*M`ZMbaUQefJ0*9^laQxv zY)K`C$$lg>w?AZK2E(N9vvZkMmnsXA#~)JmXYhOw9)^vBxr=a?rM()MKeMTt5d(9m zdRSv8))NqNB;rrRJ%qzRvMX(Dmz%%b1oTp7_bX>Paic?kcPBjOv0bPai9ORngym-lA(FR{tm6XfF+^u90MxwT_+P z%Dbosg|ejz)3WHy5Kkc_3>ti$OSS2AJaxK63Q;AtmhQP@$_M*B$a8MuoFYG5nR~}W z@p2i&f8<+wtZehOLi=sB&7X)I2-I{LA?FnJ87(Af>{k}&f}`I-o@$;le);bw9^~_T zGhe8t%DxRc@0~Nr+WUHQGYdzMTJ%SaNMTx3s|bExdDoL^zv`o_ebdUuHj@zbkIk999t)&q%1L`!fd)?q8l8ml-hfvs^Kgp*-&MR0qy_8pnP zWUg?iljJ#?S^D=`k7CObOw`1>Q&yN9%4Sb}_7Dc^pK4K4N+KZ|9?(Z>+~Ut&tQxAe zJkG5{pAfZIX=lqYwO*XrPl3H%_s0&CCg#rGPvWR*Ya|OYtj+;t)S23SzLjH%YUEw| z7Vlx?GYMK##g*ZU0c%ZcWutr)rdvA&PoMXOMkx4<)PPC+EOEB%Q)Ha;fMH(J!vT?_ z*E8ESFyWb2=|iwqqtm^2DK)58_RB|n7UBh`Z%K?J*y$h-Q6ZX4kn4dua>JCLPJqp% zgEWlGYT6EWNnULei@^=UC|H1MfyboaToA&DYDdNm$H3nT+$%sB^lsl)BR2Aj&_iEw9 z&MnubmjHzcFiE&2DENvntb{(H^5zMi3r|fCaBn;9fQcA4YBE*1Qb*U}-rvxO_+(`G zr1``&g;F%7xK=v5+$`$_09*fRP$A6`f6RH=;1%TG2}?AyF(gJ8&G>Is%DnSBKg~Q8 z;vT%#XxkMkH0sGZ?q*{7iac%Tq4G!)Ln%|_9|Syq9bA-f=c)_Xx$mX?Y+nhWqz6p! zj$ay&t|VPV=|PPXOsol?f{C|_MIZL4_cl8z2sTM~L% zXXSytS>tF0sM~(Cb-oWy>q|SC)lN$9g1_LT-q_9XeVJ4;A)bwQmj%nXDJ-|#H}p;F zN^v+%kf$9*ODvSZHsE_&aW)e1lQYpuKR4HnTCyZu5vJ=e`BLWFLWIz2-%j4S(XZn{ zqm_CiSJ}J)`G`KSY%OKHKs*Ho((KM4LwEaq3=jUo1vMFOaWQn}FlWu2(kC@JDnz}W zV2>n4zetLRLVP}Q6fuK@%`T)(J)KJvth7!h_;Wmev7*}H*YR{2k2n>m<3eUfiJR9N zULzR`URr-<)V0G8Qa_}xDQoAGV+LhqjIQ8SAJN=lW^DenBgdlE#RIVC)CN-l2v9t{ zdipd~f(Ab3Pm41I`Bv2U1PL>|1T^Dw)onxj(9O&AzJ~hS8u(} zSVC)RP&XyOKkWMw9uiP<)o`Y5@nBO=yWW=TKRj--beYPtk0oRUGNQ zeA}!?>}6kufRW*#!2e&=$3Yz?NaOn-NP4XH1c>$%SM~&9>6?yCk$`!2d(a!qxkP(g za$lsHntXo`0&TC>1B@Rvw}6&XcFX!o!(Un{tSaSJ>dCi)hvae~5wdl#!uE2`U%H!l z4Ykm(25D2MGnWDzJrFMibK3ehRsC4`KPF0$rX~l>q_=&5sozb2!5r*dgQA z?Yl{1-Vzl=gAVy4@Ca~?5F_fi51kiE^TmD`jX#OWz;Ti(oYMJ%G|Y`h+kM+LM|pZ$ zt|o4)W-jf=mt=?jo}#g|G!$v@V%x|#tmU1_G_Q&pW^eDvb&`?=X&>R;Gq5)8yr>B39hvR zH8ZR+DsS%OLydg4Wnv2Z0cmXiIFC}6$9U`^4U@5nwt2Q6IjMMFR~bk(eBDR^uEg%r z9D5Q6_}xN4gR;^r58DTRooDQhG#X)MGxS@ytZJSuvR#4`V;q?(IvG}F4Q+nKfQM=P zQO6U~%v3n+yZJ3NGs2V%&o!DbV=|L$=j;2n?8yTY^%B!%edczQd_u#zdY~Z{T}XM> zckPGOzc9W(V=?xdsqr6vIll{2}iaW%zxxXgcnMt3Qa5K9oeb&aPw8`9z zaQT&dIAJTd#(N`CApa$eI*D@HbKf9Vx4A1}Ai8}u(%dywaF_GKb$MU#=pY2Xs1P8b z9MJ}u8WUSs{sMvz)HHcGqv1dwDVWkm1L9ZpPczjV*dkM#MFrwT$X=wmDFi~wsV`zJ z6Vj9=*LG4Ax$3pK`)2^+q=z}#Tk{QbTBMve)INU2A5(z{LbxYjtDJUZ7q}oUD0eiQ zpg9J;_TgV3r9#!GVWwN7+ox_A_fY-*ptr5#@ZIy)))Z6Xk9~YP{yZMneGEmSp9kr# zk97U%^_vUuAvg|B5HVfHweSj13&T;~jOYM(!ChVF4G_#f+h?N&nZGQbcAS*60Ixgq zA&Gh)X;(Er_{s8l|WeBp``Hay~0BmT-K zlA$u-q5CYk1mA0Jv+UgGScw9px3)(O5~b46S^$+SDYmQesM@g@wavp#si*Catv}PA z-lxgL#;s@?0kI*ygI)DxaH5KCo1Wk?(>~^KJwo4tEITZrSc=k(y8JZJbU?1xRIQ)j zq~6%ojQ=$02Y;zfisC4!z0m6tBv~ zU=Lpbmj;vd;d!U%Zjg^b@Yl=DPjJq z%=sExjg64$8MXoFZAe{ht5kW4PnC=jz~XbfC`^ll@}eJz;M+NMZf+*)&b$w^&5}%A zD;5O(*v8y*Lh*Ga4n88FIy+n+WU1sMfT^VP6$Q@gM+Z2))MZ zhk!F|B<<7GFh;pZ*&P8M7fI2lt&r@>q{v5P;z?*5Ev*S3omY%tbi5|UUSxo;FSw&c z6q#+9MQE{fv1~~=3E*SghpvLSnK{VC-YVzZ7iskSFCqZ>Alr_hT9>X^p^=4zP)wfd z5-ok%Eo-(*dtSH|hQ*|ul&5SSVOAvKU4!R?M-73kPf`H*u>2p}H+P}=!j{Yh<3fRX zowYb9=R9A_A7)9z?$`L=dq{{YAfvYCw=H}aC88hn7c{h)A>Y4%N%J!XEi@e#G;HQ4 zpk4Od<;b}qI-6q`l<_s6L8QJJR+dvuB&$7QmTSRLxC|5wS&cDb-C+{;dkG+J-Y7@0 zX4YyO6LeYP)ZBDK=@;%+!nywWi#8RRwF^5xa7Z{@+T!9d>!_`Qi6spdlqDCfNt11U zG7iisZL;A|djv7}?K-DZCNbHxGeixc2^pdJ-D1Sg>$+(`<$n>O%({@ZT}|5B5Ownd zQWEAemfC6jA%-_4ajwKwT$gJ{$V7f5k2|bxRyeOInz{$))3avqK<5;`k2-Ce^!x8Z z$aWH-U=y!^^}knt2w%2j*T7Sq4W|VLRFbmoNSn?&OuBMZbiO0tHz(F#;=jP_-*^$~ z`K+U8uHA+R@9J5L1;0Hf+gj*1%J4q1#?vDd^R7S?ND)29=j0tirKtVY6mDF$vd0K2#w)a;b70}`d*o^w{7EqU&MxN z(Y9QHFix1Z^b|%Y4Y=!V-NE2F#?ar0x`B!3K0x{Sdm zBlmOsn9XZ`;YXvgk3i9K4gklnZBo+e!GE!SJyFpGLsvDVY5+S-|5foFo3{H|@z#=E zKhQ=)*^>|7WRN6ngtxu=;xV(ka6aSW&a~a`NsgMdNW9c@#IY!8q}QtHe{+}e$kHWg z3t5ML@+MHRxq6+8T(NLzUw5X&c+Z?`GXrBx>n3YG?IfN^!99=zG(TeDyyr$AUfYkV z?nD)jpeEGNXLY@`wd&h0k#I=)N_>Nbn?6JBElz)j*NzKW2LRLhmO<5Mqy6@4wN|45dbV$JFzr$#M{`RO2*w`P~$vmllYR>8;? z%{9!k(X6y`NhgsnIdH^GwdS2dkiz3%;4*}(L$~}3MoPQCPWH3bTogYR=3YtCc8Z&# zRK9D{@llr;s+1+~WaYXe_(%iSdiiwr|2Tyz4&8#m)^s~89>nxT5@#S&pL~vr!?^1v zSKM2cnpK|WNhOh(Y_pE(l;avs-7x~M=u-9$l*JY}{KeU#|6^_GE@v$-5i|t0*KlXH zrSVS#|0TBR0$B+bv5&pb3-KbMeaY)Y`@9aiHHiR^`!L)}tKte6m`d7g{3mio9%PGp zcW#oXs$ou(3BU!B2XzhIKpB*wujk;Tsuh*TQ>O)Ip9Wv<*bbu=k`og$>0QxW02`4W zxs`X?GZ;7J(tWtof97&p65wc(MV2AXuY4{$IyeB5bU@>chy@*sr*{%;mbr#J=k6tv zM|b2tB07ZnWNrvf;PFm{qVA(*CAKUisDrMRA-`B*L*}{{jbphOt z=<8==p9Pp_f)5gxkwWG1H6KcXzbR4vt3rq7f)R#pt^a#X_tvP{Qbo+Q>%-(tl$9c{ zq)gh&Taa1hNW`~}s8P{?g2yws5{-I>ciboC4dQSb`KDs3@Z11_UmY7WVd?yHI#Lxp ziv{muP>ed-oI+y0hpjgQvD&^XCemEQ8SXAlQ1|ro4FUkv|le*L@DD^mj zs#@%)&vqn%5?59RlodRi_Fr2b#cbb@K=Vn^bwp~=dzjJubEQRlOtuR}YU|B)gn)nN zz7t3xljjIc3S`-9M=b5oO+ozeWYQbepj2Zp{~~JL08jNu+VFD|{&Xt?kgWna?{8rzqi=nscb9{0Mkr-r|lUN4zeu3SA zHcqQOasIbc0cjan{_%CmN8(>n@HWb%j-E0QmmQQKQ0pR%?6RXmHc8LVLn@O*z=)M7 zHgssDKhDm05q501R&XhM1x-TPc}-M0vup;jk#8cJc`rmixd(o@oR{KUYG{_rFCeDMmNMNS7l#$*uiV3d zOQ{w*#S|X@8quL?pj!A0yvg$(4JJl^YDTIgf|rJOl{->riLxY2s!7K2>{rzv_Jd^O zoGPc680#AM(EcrBBT!#b{w@-z#lfFqC3BDfTl3kyg%Fa=PZ#QV6mnJFbP9MJDk#oUkxGz+AMvAC2s5>SYW7M-${ zLfejh<6Ok(9~?SDmL{hedq-y)`()mW3)V4BF8IUJvpQ4>(&zKVtG0z+4zCf{_O0Iq ztpPa~KIBTEUtds&Hn17vlLao(BbS#^E7F3!i=I*5`O`7@G4jVLlCBhm_k(-@T*pTU z#~F2b%ej0QYqwA)*oe{Z;;Z`D!GVtEQkAIivU&O*=BK3@qe>xRdi98wuSgMPsOFkn zr!fStht6O-k5xY}BjzS8){5cCCO^g-qo=iad}^%9JwpRJuw2M}NdTHf9OsjUGQ*Hr^EJX@^LP0QitR5|($AD<#_@N>|KUy?8Sg2-=Hm#j;7x7&hZ!5<9j7XG)UE0#e%Qr*I5 zF&NoLRzNH}kU*C2dZP#Y^Jf)#miS5%I~w8Ggdfi%H)k*2tLk}umb}%eU`RccYyLG$ zAcz=)1(2$1ix`25@l2xemN(_4kdH&VIj{ZLCuc74gJkL|3GV?Dk};@klV)xxk|$Pn z`f;aQOu7>)v#WxQMcDl?&*i>DJhL9;NP5|fb19%NAaLN*{87AtRt;C-ca-|!12_F; z($Ta?*rB75R$?$)_uD2L=ZV)&phdY*YFmCvOXQuD4BMFhQ0YL$BB?IFk?dfLC`9&Zl|ggTsp6qXha_R+6y0Pm;}brM1w;yCs&s_i1w=D6~iJwG$<;ue@&;NBaIKdCBx?r+-W$g?0=tOPiCox~#wyhd0Sqx=ZKcnR_X_HYmQ z<|)+p8+^=Ar*c;)tCW8k$9`vwHR4Jst?^8_U=J0UWyPmPE*@I3rI3yPJbf4>jv0F~ z4h>zg&W_$(lg(zFd|9#?JkgsmDBxtCHgBm^&1?Z?L<)IwQP)7UEcbqNq)>}8UF~z? zK>Zoj7II-xA{9lLA{N!AIORY_TY#Skte6OtF_6E-{tyQgag~K41HC~fLC$&dBnMob zW0xjckgUtLZL`a^ZQDkdZQHhO+qP|V*~WX%n)_+yKSXA(ojWofZTOvzEnJ%8ocaup zaE5Rp`rBbGAE7ncvyEVf6wD#VsZZyZ8y#Ad4;;A9&Qx%2(FEe7*zWI*QS;+2)TrIc zvr3YbLwqm39o4uEu%uAocd}rBPE)IOIpb}0a+M6dV`ovW&H(xKFX2P&ggB2$WgtTV z@SUu*8})Wv*Ys5!KX@KpP8fR__Vn~O-Nnmnk;qM{PnjZ9>2H{O0sxo`*0e>DdmUaQ z{J$4A+ILV~&6Hs9u08)N()hv%UQi@Wq{iKgo>K3O7Enm+}*@wi97oVTx@qBn5E>lv#^{(Lod-$9F z2-q-X)o`y}*+Std?k)vFN#ae#@77_&+!Ue_YwbMJp~+Cln;((F%mG|RcdYNUaL_u6 z7WV*0rYCpR0JqKv7q}sH@_VH#g-bG3?Vzh>LSJ3afE(*~yLUqVBpjR+1*mW^ZQm6& zjgJk#OPhc3ncTQ^{dl7CO+i{4usp>USS5YJT)~IvPYT^y-PMU_E-7vOoX97C_mC~gpUVHGgZ-a$Z z%jXxV=f2af7CtUS?;OKHr7X>BL&d2D>dcd7oRV|~5Mur;*57h7PM4(jrP{;fHeZ+% zKX`(*9?sMVr)zvi>A|H7Q|f%P->r6)4e;aON5?>an5hnJ9$2=l!|y{U+IaEVK5pZa zHrajPP`?Zu7m%t$0<3@k9f{7_v1xvlO+6{+GiW<|8MZ#>^#Ht`d4a)rMR<#nxLG5N zOfAk56tS74QOWb-6b`)i!ysZg`v?KKZlEAk?gC6(%2XDhHMd0UK6nr z{V*4X_6W<*0le%%SVOVHaD2F%h`+;d5}i(3JXTkQC*&QQz#>S}lTfsa%}J;g>dR{* z;NEsGI|aT(5+e?;!Kus~-`uCT==5D>NB=$fm65 zE+eAor2mswHM0_$vkK<#n0QBAi`?V5pZ;!T$#wlFGSiOz!tJ;ICNd=fBwOn$4WITw zSvt!LF#q^36<$eGm}ksN3n;I&tsbTR*$r6Pmpig{U0u;`INeDmMNapfve~lI!(V zxV>K|yh5=GR|G|ILOt$RO$=7^?9GH)MA1PwJPZgrM)rPPaOKH?>1VCc4Ay;b*>uGR z3rSfw`e)(ecFri^OMQ_PueRKkY~9y7%^Jhk0>cgdIiva4 zVK%=V4z6xjJ_K-{zkp?3AsOFPH)lew?H0y|bTH#nj9~bFZo>+$gdnn%Yb?G>|iHOHDB_3l2QBFy4)3nQb=-H!_)$9x9ApPMeJL*PQe&$)7>0bO^j%>t7N;&euw@PqlIZ*XJ;Gd7fAPbLrj;1N3P;2 zX0-+J?4>E|d6?ZWu?Q|^aI7?;R@)|+9--S)O9*nKRZVYPyri-7k5N79wY1-iI7J_% z^zTSnegZ-J6u6c{rPZpFW2=q{e%f!BgFfanx-5=(8114lYF|*#fNFVMU(~^I<_~hw z^h@6S$JOkWby&0aeoJyLf0D8w6feBnf7X_~N_S7%4z2FdNph~3NhhjN$o3grHeUO{ zj+=~&vdXB)=sc9Mq@;H`&%X0)wka?7QHZP)K zC_Ks_ek|r9Y`|gg^7KB+Tm`9hxm>zb8!Wx1I&n=oAZmPg_3U5lo19w1+XYH zb?)xHBEjm zr=(Km_Unp!^6HKKC4+t~(8{=#p>Hz8Wan8IW6?@%zFu_?aESLXuga@D*h$?6zx$=8 z5$BD_uK7+cYlnV8|UgeNi*Lj93x{!k4J?nHY^ns8uQ6arjpNQT^T z;}VQp<`=7)J8rskv_@hC2r{_rbq5E7M$V49{cw;)r#1)s*vMv2qh2uwDg~p`pKDEH zg}M`?u?R#7ezTGWI22y+3IvHs+SPngY+27G6wk=doNh_BY8(?>#?Zg0z^Od^<2Qs; z7e*82Xyk0$XH%2;w`uH#f4}Jb?^{(SPVv#5c+fP`JIH`exX>&yzlt}+iQO;#L(cJr zj-dZ7=UQ5niojfnM@(`5I6#-NRCA(1sKE9P^Msbeh1P*+OeSUh;`xK~T^&HQc%TCF zf-S~gd;HaYs-XB>fOgzxdEBs7+}Vz7o#0wGvIQ+j%A%yPZ&fJO=T9&|=&8*w^jOp$%kO zlT6$#nDJi2YGPgMCWM%I!kkd|v=N~U&k5ME)t9MlrR|>Ak$wwwzZJItd@(I=I9y0v z|LE=sJ@lUFIcz3r=~($v{Ib66((0McKj}g02l5Z;zRA#e_iA34i_b#{Aq%2D39MrS zliS#DCLYXacav8BT%RvwZrZV|m^1|+^v&`wY&ijdZhO@6k(wk2;U4K*iIIkih1Vta zbU7SKc;k~vT_cw0NRuLcGb=QxnxBA8aHyclzEC)_#COWdZ`D3w`VY6LTreIA9tF6r zi%s;Q0%T*cVA%;3Q1;CvwAyb91%Z1ogwc@H%H*wHQPpg#7q%A(ySI4(hsOm5$Zq1(kX@mj*Fuk1OMyOa~ncq$P%e$WcuUV<wYL1NpfnrEG2oh_9KHzQ1 zM`Y|hRF$oD)5-t(wr)Jt{O^!>;Ub1bU2a|F$Q80@3)p__01ObX?0j{ee`q_Q zv!&9_MBN;r20^E-T7=aP#HA==jY9PB?@Rr$Mh%CW`q?(dHi5zc`b(#6`p^$Q#O;!m zFNMmNBeP}|vfeej*)Y4en2lA&SPU9z4xddU&diwy%Czc}lt*j1Un&D`KApB^w~>U8 z$sN8%viz>qsz4xfh$pRJEGsi?Su9{i4)+1#to1E8A#M)+9FMVornk z7>CQDn6UzqHB~`Zbt3@(l}a&d&+drrkP+|GTr$Fd@rS?B?N#9gY@Zvb{D=$^$|>Ht zsG92a%<5$g_ySIk>fKFVO860my|2(gAYO_4(XEu8u%r)%50z>Wf40^Od&r3W>;JHBBFyf_dIuE_T7-P`QJFbz6imqG)iiaumkXC*1qWI8B1t zjH?SUJeC_8tD9)$#k?`-e2k*@FAZbI;}FRQJRblMKc?AsXgS5{m-F(L9*q-tY9^{8 zhKJNb`>^h(>Hgrj@A%cJXrn3|gg6cp&6NNB270tS@gJEV%!^2j#Ra^?RfO)Eaew?!w!19@(l>6uLOF2V$`irYHm^a`kZ4))hn} zOW)c#L-l`mC5?ML-Uzmlr-}m@UY01GA@^k}_D*@0a22+k2O&`gSd-}3j56#v%0e5q z$+{5)swq02Z;f*tE1k_W2$tEWbdzZXf^+%0#6`<7MVo<}umoHrw=E33PO{?^RClZk zzO)b!mkdigr{ny%K4b_aQ1>=QJD6{)d-3$5kx}I6KLm9Cl5=VP}0oG&x!o~ zu)y2|f4d_Dkswyw?T*9nxd?ka@t(aSP~#z4T&*A?qA2eF zmXR2`64H5y)-L)@9+j3j_6^%>h&W~+z~#n#6+%|@GhW=u)$8uEt_;q7BwYiGL2= zSQXb+(}G2(cr7wj{HphlEJa9|TA z0&^Q2rxf&t#UfXYMg?*$;7?KhB<~*|pF?S}okTU@42lV_=|NfY8i`39ihqT}sx!l% z=mxpO{PhjLL;ua&1)UY_uj0oN2HOFxq}&e7bZcTSTZT>Yt_e^tp~soOVz6{0$5Kz) zi)qahF;^`{6xC?0%EsyK{h_6CIKDzhl!0@h!L^x$UPVwU6k}wfnm%n;M74=`vif_hLB?fW68y6%Cbew&msHt?L1INXLM0>C&>`3P3r2 z_;ZPkuX<)Z8}wyJgCC+TH;26olHKKP%>y(pr>V_LbsEHl(UY@-XW5p{q_$J+n6T<< zW-*AX;7A&!8(f(wEJ&Vw)280e|L&TkV9}5o)Y#jCoSlmQz5dDaNr!X*^z0b@ygq%G4P{i)iVytrM!i|w*CJ7*8 zw4Yz5e?=gaw*yt(LiUV2G~221&V+*&l20VX94$@`<){<&48;Y`acA$JNV|UqjWVb^ zpF+an{rlTQ4U9jkhGXD5WaS+pt$wRY`yyLt`ZQsaW{3lp3WiV9^-@1&%(jCLrtNH| z+DW`D$@MIzxujsPa<_Vz(>?hg7%TIKfT!VU3r^p)(jwsuQV#fl$;F{cs!^0<5Kpt4 zkH0eTE*p%#c)(BTXx$9=bS_uJ1S~^=n${6OR?}Jsw8I%r$#*hIW&f$m81Y7ibZkl- z0ZKK;DpHY5Li6$u<|uae6ofSSm7F!SFUXZ3=5+)q{*iCUV!D;kbmt-J{Af4>!%%77 z8XJh@#OPw6JMaWS?&ck#;++JG+0ln<{f!ZYxOH!WlB8n>psa7jqH5@Phw_DokH0=P z4e5i^@8sGh=q(WE`wmoQhS%G8CB*sF=ZG0t(07JE_Mp7;gw~(u*-|HWreglcj6hTt zcc7?wbSRqF!jMx(wi}8{H5I_9ryYTqA}CS~(DOwyfRG_fMrn4`QL_zVCJ~YU_+w5O z%6PDIEPIf3j`Z8Vjj->iKFi{NA>a31xj}RlS^`grsL=D?@eq^6e1PhM4diG48(Fe0 z(03;=R5tKHgAb3OuH?e7<}&9*EH5>>ODn&mJZK$GCM}FH|5~-}iEcP~jKeYAGFtK!x&x=s|S=v;!6dR`si6$aZo|$->;d4N=8iEX- zY-M$&9BhMg49?aGJXwvcS3pcnH8Bod0UKZ-*Ds)*L8x~9Y?bGUzbGfvPZH)c!3m8N z!ukDk`Er}M{6{V1H4G|7>g>4!Ip2#m7k-<$b7 zj|ws=&f6M?2m4M3#K(|lNR7!q|d9_{Ujwwo^VrrtmE~t9=$CS z`MNJTt5$YA<9q)>M?ttgxs)T)e3SNWrz35P#qxBJqm*H1(05AL6TMrp(D}rB(~Px@ z2G_tk@%023&1Zj?5EGTE#wd(@Tg^_M-U6BLSbLfegIhc2fbZJ9FJ&3;cHvf>z_|~& zR>A!{s}+-fM!g_O!N}}ym#b&SG-Ojwh?(-G`vNh_)|i~9KZ))#A3PJa1+7}~!PYA*)C1| zgi++0WYPUy-hS=%YYs~AhKqJBrsLEXonyyTmfn4jfz7J*xy_RM%O6Mq&_;$&q9gy% zkl4BaWYin{hcRZuv%&5{3;lDKXHmK3^&6;tx6sB(>+p4MN#L7_cLVxjC*o$QBe@-S zY~kCWz{@V)Xjx-KP)J4AZ9Ot9g!@#R&PB~fznq0O zG?2=)hQ%ml7`u@XuqXeyHR6%^_UCO-<$1r;Z%byrc;#u=5!mrtN+Zbzp9Zd_scEX4 zKbSsCRt=(mo6K4o9<&PUY=Z^zibV%nR8-l?AE&OQ``>=|`;0Iw=*&BL;GHyBCx<7_ki zPl|zaVrw*)(O$?J?MhXGQ=73K1UseZBUqXU&4ukxjwXXYDJ#UD)@2~ecq@GUcoW~x zIJ?9)LGaf8F)wzpOvSzXkbtEXKgteZcs{GsU(|v2Pa~cbebd3 zhc4ps;PqTSEXHh{kftZH&oBVgzi8EpgmiE#aL@wo7J@&hKbTvPc;4pO5|3WUP(e?F zxleJLBnZTCEU0EJEBi&o#zO~-U2s$<#J=Io8)alq`x52G+ zFEvhn#!x_=AnUoS$EL^uQqV~xyPI1*g`s8oHu4u2vhR_*Fevhm(`oyRw?bWuxq}>`6ih*1IKv5 zm#!<@eLT7De4IgRnZv^2HbZ;^ok=w8Ssww z2cxk2m8m_xH}nSFeHA9CsP`G7z{Zdp`)`A5`PQ}(N|A(+Ch4tJezb@BKJJGpi`EU+ z5yl=b!Je7?1_l*3U8{M685@|M`?_5$Lc|Mu{G=n0Dh3d1`8rkVX1`mZ8-;er;F#f< z&JlKQ`yk>2(Agwo;^=!ov!pSmY@`2`97ZS@QO6G0@=81Zea}y0S8ZAX>Ko$_b;jl_ zHb68QQg!#4SKN5hbjUA<9I2? z7sHg1^b?1)TsL79J{&s5yLu@Y3trf45#<_KTEWMY--;&XM7c-VV9Akqc7`BIAgnNP zFZq2ar)-dW8zNY^`h`)3UWjOi=n_!x=xfaL=Wn%@ddy5Zfy- zXkW}GoRnb-QihW{z+zt$gm}^-HHDXA943}-L&V(^bwiWiPe3}9%7W$IH{Mw7+G=p< z3Z>oi(Xk(6WP|Obj%j*2O~;^zuYb)(*E^cDk`W>eiOB9f4fqbT7I{515J91$8gEU; zM0yI-t553~1R?WEaB^(2@J0Hz0uJ=H-iEM06-(Y^FGL^bZ^Q+pL129)7pz8+t$>e% zOg-0iX5o@Uipu&qAvTDS?VvPmc%2COw9bx);@ZZ|7DAOKZb*7NJHJHF=dpH6#|Z$3XPFKy+I)>G>!6*?~kxEfeO zo&PWqv!}~2kH-8W{8!c|{aH!1i}p7*y+UJ=`S&%Uit>k%tFZ;n(hm+jGMEeXckH#F zWTC79((?m(EMoJd5*byQ<$3*}UP?xQ(R4@9Ec;@8V`E$1F27jRR!-h}!3^Ky<90yjnEN%Uh^$|XMWoJ~hW ziM(bJ*259VOd*{M+z-I2ELR#kCj6OLGOD83i%psUqRY#ejx=iHPVqx7K}ryd5ydAT zPl8TDLE3prSk`YvUlN&Fwj>`Ilgj%0D_RCW=9SeqI#oM~PJc!Dx-UzOF&}cs|Det^ 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
DIG1M6lTVPm@Tm0b3 z?Qfm(%u4LxE~^^QTK*ixCr8V0wW95(a5VO^W$<*~XwqmYJXf6IEzom^HyX#r&bf^AmRdrg??LSATMq=dfR8Jqt$7<+ zP&6S)@vA(N$}8}GS_u*3>UM3qj%uCqF|}Eh-_RE(6S8-94AlK{I9Mg0M_UhF>!P^u zyeBDq&wSi57>?XSp?XfLnTiY0=i%?5VPqlaaoamsVKj{?pm9G{Jy>8jj4~z2aX3H& zRb7Acl#n<9=w5fHI_EL5|1|Q` zL;Y;JIxQoV;N_`GXRzixCQsY8UK+oYt*UG{!$z4MA6><<;ml;UM}$p`As7z9%EUAb zls&+7I&OC;mwl7i)Q_ZOL)Mu#A$czt5y?QRx9Y}5W-G&YgQQ_`%wj#sRWI1IJHSr@ zssB5wCYw7IMBCSVz91lblQ9~D+=k}YD}=P&h`&JrC&STR(O(cHHWh6?J}@na+|ln! z#-*tq2ZW3Wqs%u*yoCxjNLtd@lt0BNV|^<>qx^u&$)Wd64Z#TJnOn^7 za36nP{!OWS9{(>C>;Qq0pth)LhZCi0l6{6W(GEww*1FnWny;Sye%R!f2ABw(t~84Ax|=&zp~W1{xh z7wO~{rc@sQ>oo10br;0i0R~Jmi!-H)n~9EdbeF-UrIBV@`C+|@9YiHtQSsZrud_~6vWx|CQLW~{V#2ecHm&&< zbba6Yg5w2c47d*B9Tcs0C9JR>k5ifUt}D057@4N8qKHxV^&I~oOH0E1>uZ9New-)Y z>TH`B{w8UHxb0^^S8`>qQhv;g)Dd&ej!n$+sMoaF%@QgCxu-9NZulJ>iw-vGHdRaj zV5{e$cTkX=Htn(;wuG$2?6ptoY3z>od-${eUiN(2Hr0^*l}LIO=esC=SW}aFGxx=O zIAEquGm8|kS;mpouIZAvU`u3ht~v*T+)}`i6sh}()3lDhr-CC!rRk%<{So=11 z!GHg2B(g@>RV7f~tk9fBg3CYv=)T=|HR=nRmKmPXE z0YUM8kicW02ZmmsFaH4eeK(M05ybNo{1K&t399Gg(_E-*B^;X{GhAe7Zj?$u{vxr1&yzKVdY$2(J6JwnLu&(CZ&Osa;BL56M z!h1H?-Y9I+ct@Xt>pK<=6G?QSk_t}j_-U{*;EDYit`Csur&~2MUPh>P}^clb>&lMa~b7yjnD9SK68<7-`zO5=;5d7 zilz9(TOucuM8+pSRF}UY zn_OcJ+FFauHWLnOQ$W@AS|lXTOBc0NhxmdIMZWfnsL2OP4hRt2ATMCeS+u3?U!#f2 zh*T~(Hr3%(8EQVomI_CC2a{R+Jh%C9COgD6AoyJWOyyuL*ai?+pFd?RxZUvx?eYV8 z^U*}jhv9Q7Hp49P7@hUS)rkifwBnL;nt;!omSy+4R`gDWi-{I@+fEfA4CB0hHRT
qKFYNS7V!1NUqkkE2An^0ovh(LN0P2~gf54L|hyJ567IbnIpPd(L&M>ei< zZ`Og1ga*Q*01dy7YjTleDcF_8D7-E1rU{#dSH+E=OGPjt9}K^#yaAf1T(TsW+$Dn& z$Z=5Aa3MN2ITFisLX{M+(>8vd%)iTs)9)BA)dboC=c7+sa^@{$>zS@Llov~!=CLrn zON5xsX9=Hwl^RRab5pYIQV}sLCnP0@*UL8W^eb&G0{5p;Lc1}$5ezrulWUYguM0q< zG=kmYTsIB!!T7|s@jW9i`xo)3AM8Kc7Hq)wOT!o4cQA6n?2Oa%pDd&OeTUbp2S4)H zblw0nOOQSU19OazSk%xIv@%(Ws6@r!)bLM~rW+ahOxAYsp*;3wKF5hi;Fb zpx26!BRoN(Q`tUn+_*+leBOf#W`3w(d0ykI0@7MbTW$m8?%v>U`83~wXDQ*a1H0w@xz3(mr+|rc)6}{rz zGYUP#JIv(FsV11pF5wA-2 zUV|_R!`^G~ilia@2EluQi<-4j4JX%$-MERowN$7tAv=z-*a}^}7VS12iSBIb|2z`| zIfM@dZYAam-DtFCu?wNKTo|SMLXsJLNhi0c{IziZ3hOMi1@E!d?+ehmR{#UrdGp$( zqzNl^PUC%D&N85l*`Z*f7TkF97AJ(t7$o3j2AyR?VQcXwNwZ#PH~R&6*FxML&5wX% z9ERjT%=WE^xY^T9HW1d&tyF5nX2a#NU$A^srB5uqFgsaNt$ky$LGC+8rrX0r$V;{E z_u#<<&6k8|DG2v^#^118;^F7w-(10RPgYwyZI|pEk4?jDpjb@^9n&-F(Bb~|J5Z1V z1@bR@c1IR@UukWWaU!kWMhg#RCfAPQ8hVy@Np%l9KC@;%6Kfs%R(&__B-bmYWIeTX zFe^*G8#}q!^yDix7!l*AcQ(aprgZD04DxW|S9_7DGR2i`I;)%{7ami80r-UU@AOY3 zCL9muKba#?cWjCG#JqBh-vObXwI^BFtj-(=32UpBHQY8HV`=CW=H+&^MpRy08}<{j z`qyki+R(KP-wmguN$JW*PajOrAHWqWS#q$-(wJRfnG&1vw`nhOUue>!Qzv0#I1jPj zO2PT&5M$q?-`SBvjYbUiUjd@4L+rvLp*#LH#?tVOFG>G;GlQL}TAb!QAc&ZnG8H34 z;x=2Q-FR|7Pvx*Uf6o>+uwR+mKaMhn1F+w-Y+(rm`n~zzcW>DXcO0U@-x~0v z($Ms3&AFwEtfmx`_hA5|UC4AL^G_1_Z**2GL*X(caN|R^<8K~x5e%ft8$JWO=KZsN zPSc)nBWNYDql@c?3ajGY*qL8eSdFcWjXP%jOi9 zv&slOkO}?9#|qf%&Xe(Elj6a0cc0r|sllqEJe2h(CTBeAo z?|6&-o$dps<#6`b38R>ao;xSowzKlsUgvNbN8wA+aP~?M!AHB!e zCw@v9Pi?C&uUJ=G>R5G@sKesO(Bgvd$o0n3v2XfS<%HuK>MzJ`_1>DFz=da`u5`aL z%IslmsAGC{C4Z=UDO7xYqNTk%nHfU_rcM+fko@$rasO|9c>Or%X!4^lrkQ=&M60(w z2dI%o=P$rz$!8xk*67;>Wu@I~;fgwafe5yI|5q2_95E*#Lq<${n<2M%yskLaXj##G z4=b`AWz@FxyZDJ4KDqwjVr4sa`%1Sm9^+mcd#aRFhc-RR$cQ%tV8Nt1(%kSzl-*`> zDDP3UiP?JXsR7gbbuyP<0QChK)2`V1A6zKs1C>LH;O7V;vPY!4c2pUG3@J~(6mng# zS*C{^L0cQC1%g*0x zGje|GIC#gt{yyNO{TwaKH8fiUj^U&fvVxP)66q< zwxhFolFPbZp3_=i#mlSc(9^)Q3o|mXuU6mg81E;u#84`_8Nh(2+nfEWkUog&&&$ClC+9>pm=3xnBF+w}M&0Yu6E8q+SMUn?;4PZ|iwPHw`c`3+nu z{Or`1c(l=i6ze*=KFV!7C|Ui^p2mOw19gJrrTu;Tu&@{LUm-bk*HNwX$$Dt)%24w5 z4`v*t5f!ESZE*o~Oz@Z+?+lPa2J*WgCB#OeW&T$;eyO`ExGaYJK2~3bp0saNCUCNLfNT-#xec`S_*lpCnb~hPHP&;!jo> zy03#`yIQgo%=szLDMMR|c~xU|J+{*8qNx#JkyRYP=G;QUuDHLBS9Nnq5%Ut*sj=9P(C5tGa9S zGJ6(H3n-|gk1<8BGUeQ{F`_G3GMtS?THH)+kV3CDmWqRz$P989j_=Su11CUY8kJ6 zqGB^tx`-uMc&LtbB5lPaDoLmEZu_;}dfNwvS=S8~)3f|N zbbslrS2)!S$S!p5np7C8R#$nmcQR7!=$r6Hk}?bW1|wb#hmWtH_=mL_b;?pNBZvqU z!G~-qZR+$bURAOUd%m>e0pSdixG#)H2OeJ z%!3c6PU0E*^jJ>xzkbV8^*`W{9t*f9E3Z(3C}D}}b1HSDSQf}wYQ*p(O43|oZHBFI zZ3I#gIKwywf3Gckxd&a?Ukh5iP$1>ROxc?|A6RRcm{=rrkkwmW#j3x^S%%g*m=nkC zsG2ilxqZ>zjzU~4VZyKNJu>jJH0Z0%%tjcM>D&p3fcxfKWyE}elhfq4(>i8(WyTB1^cRD_sb<%IHOS~kYOS{n9_f1g;W%)kEYfPg!_PW}fB|@X zzAKya10%zV6(lx+cpJ_iZo#=pqYXuF!BB2S6D~a6ds=W??F=Q9+6!3(;Qcf zYlB5c8kG_y9L2Hh!9Ym@yIE>Z7L5qWf^>Hqp7BSW1HF_+-&lT)lWqJkk-Pa0=~MRR zclz48NP=Q)$<(RHziBOQik9|Wu{~5ozj8V`DQ~*p7eqDYq$xFCJY^!pY>pnXKx#+3 zB;{j3buQpS!01QbWQ%lji}b3jx|zpse%MsozNXD4YHnbf!9eImhdz{6WCs5v@$|MX zFnr}mDRc=|Hu;M<3m|guk@7kzhwfH~TqF7qu1%c+v!;(g2b~+YIZVPNg*jcn3E8`@q`U-XIF!rU`8J-vrtQQgRD z5swE*Lx2{qu7g{z$?;@Iduc;qmwxRg*K$vpO$$1Npj;@X%eO;VY`0CnPQ*X%=;UwB z%tVK#90_vZKuDkp<(%xB1`AJZ7u4G#N@kc4{oyUsTCy*$)w+j|_9=O#Od2ELkss@f zj~A9+RtSHr0(afp(kUq$>=F3S?&mELT02V3!&bhS$J}PBDgofM>ZhFRiI6JFyS$S9 z@cyc56wCK%(>EKckp5S?9l_dGm-6vVRs9(Au%dh>m{izMR89RRhdgJ#H58+`rD=hc zN$5>03F`{;J} zc+Z_ysi=gcnYW^(2~`FJr#yE;X-s<*^RR1#6x@WiQ57Ud+Hy=3Is!K^B%%R^k^`i? zfQgXO=C-XQ1uEcf_ytg3GOD-C)G}}0oGoY05IgLL!7p+e_xsF0?7F5}I-Z)!-yaPz z7EpT^&eES_066QGwdT$z6lEHU;K3E60K7Q+8H;v?JL>r4%!p@J#-{4$2&Vu>i&(8UQn6ZdEpzlyv} z(MeC@YvvRsIgVqGb#LGcJkjzQROg9l4o^eo=|;=C`#(eYJidTsoRyQ|X~3QK@#Dmk zDOBNhUlJoH-P?tHf>=dQ7mzCyRiOpW!I(s|x>~mI*>|(GK9?}|)Vd#!nM{6(lF&87 zNS$kw=BoYIGt4XB%b;05e097i0J59y%tV2kAVt7yb4g~(&XGnxh2U|G#Jc7fPS>J+Zvovj^jL!1nEFvoyl@*Z`$RlKa#Mw4G4RpWUbz>=T*3oYaYWO$gi$dlW zr>JWH^=m=l_r7~1(q0|l-`Mm35*YXjaG5Zwg4Q>@H*^KSqbOGZKTz3x$9bOhDL7A2 z(m&~{It@4GV}NooCCb&oM*>IT^M$?GcO2`$Xo~OQERFUrySVSK3;!mUBK+s{@rbG} zoCLF(a3b9FP>0`&U7vs4LP=nxiL18|!(~=Hm~Thh#tVSh1Fs4LjAKWeqy6e2zdgx4 zhJhZRb!$JtIpvjIg}Q|cH8Js3$#UOcryqf8*&MVmPh$^Eqo(QP0*P;UI^IXal2PLa z`4|SQ4GSfG4^ngZ)ft&`yb0>+e5Y0do9pIL49hd)dxS84kEKBdGAN`hctqA+GWh0L zimBCqLn1L*daoI%bBt9?02e5s+I`IAr?{jo~;KR5Ljo3$1-4h%6fhfxe_36a^m4xr8{4 zT$g<;TsT974?Arx-&xT7)yPy@8ve=rN2*3kG+WchvN3jUew{pWt6|_;`eY6DV5uqH zky;BLzJrpgcalvK8%Y0yQ1k5+q=*7eY@bpOH`SsB!M__(Mh91)ER)OH>4~1p+nDjX z=|m+L@Hy<|{Ts`>q)SBY{?Gd%Mh(yKbs4j~UP~K~%<_?8zcp<57J$d2R^Fio^FUZ= z<16v)1@ycvbo0_3HK0o9F9v5*|36;`DKEMk+Oebh){7I|es9SVohhkuKhy4Z_r@ma zS-1*z0&6TfwfCA;M_DnMfL3BG~q&K)Y~C{3oc z0C`piD)wmuWpql55kL{zG3HabdrIZdlBOUU5WmF_-MbUlWBp?w_6|U2uZd{k#G^K` z*cgGIOpw_f=@I$5>R0y$q~7_zBu^;Ir83&QcxD1Mxf zU&gsyC(*sh5DoTW5e|*pQJ$4X6I_J;L-rDlVl{OgH0<4`m9S*__H0Mk8}aC7Ds5r= zNdtlSF-zfoL+ikB#ckmsz|5e`XIp}UnfgY34l$Jv4mA@Z0dfRw5K!cwUJmh?Y)AS& zF8((C_sBpr^oZBo5mAV1{Tg&Ib+e-Z-!K|dM$6nWHn$dG2*$#{-)qH^AkUfq^~~8B;LnT=hJ5&3{rNH7Ox-X`kG@{;vdNQM zU9{v7kNnbjY22UWOkH+1=t_7r^63=wkOy91=&fST+r|RX>b&GxJEyD>?IT7#52DzA zq-GEH_ld41^t3m0s>>Hict$xpxuabKK_2LK1d#{OVvcq)@YM%sLMP@vb1CR4Wk2q` z4=Bp&g~v-n`j!p4uCL$8)6HYxkeit1eu)EqZ2pR<$#@M)?ybc_Cjv8$K_mqr%m9_Z!$2Ah<_3I6O^v(K^qlIurjXkCfQg8UdHRBZfG%KJEc{Bgw&N zmwr)73q>9jn<>cUp-9t)vbQIIUD9|DKczA^3tl1Fy%rB_cd5ZM_Y6}j9X%mxP7wrd zA~3QHKcmVk^0uvLm-Q@z#!p8;d!_m-a>#g!;BKae@RSb z0MdE+HgRT#NBl~IQf|s@W7o9OuRbC_Snr;*I!x#AjZ{0=WSy|^ICD}~ z+C3n@O{kpinY0kMF+5DtSPOO_RWB@K36W`3gb#Ra{GFWvgGN%S)1{5l1klP@fED90 zpI^bn4pQ3%&2FzfKs+UU+B&>dsU88p&Oqi5~2^!(>KEH!uP6-QQ1UeoV> z5nT6pj-tD~{NN826xi(4mdKoC;z}snB?ZK_?1#B$7EdVD*9P2~;9@$AAe=CMu(Br5@&ZfCXK>F z8IQ&Tr!E6Y_ZN?lLA!CUe@SN-dHW#24G|(%wVFhA=bq^Fuk(0SyH(Zfn0kaZ`D}~o zXhSDVzLx-CW-L-Yupn95K;QT#Pt3o`ztAmozxYqMXT5?@hz5haSG&Q|`6$@w$55VU zy>L{AlKG5Z8t~f<>LNly?N&dOLFU*T9kj-)HWvuvR0w&U3P6ZMGAZdDFvKb_5V*9v z)@A+}?=02ML03T|$MVH)FH7hXu$pWExuP9jazfujV;=b^7l;He&gUo_z1gyYDPga; zwpzE(#0QWR?rc0|5D*L1xhcC#`X_3JLuTvmC2&q%o2<`ZFnJ1msg^eOq0y|t6A9(# z$rGbWcmm+}`jv&t5x-k3&Xw2tGDQbwD1d`8@&@R5474y%EXNKR!xtI1-@)ytRz=;;*QGw$8^CSMA##lRdP&>6+sN6+Zj!@&}o z(tX#EEf9~hrjC^OKNxDppk*w)1?@A~lQ{|>t!lu8S18UmL{H!MRoQ5a7Cn8n>|4Bj zgm^7;)==yY+^Z7W2~gui6(!rk8FmCzOedlpSba<`1t$LvSb(j^=dEQJh6@WSiB&^y zXgQ^b_o0XQG8YU<`B?a8Jmx&|uW^-t_WSAkr7&fWXu_ z*NK%O+Zq==z+vFzX-Qo4w!NxMwHmkl1+%1T)XOYOJv1uGL{mH<{RsN~2ZO0YWi9ejE{7!YHhYcsRrU@$+dG zmK{C^UB7U6DO^~3<$-Es9W8p!o?Ybg%B&*ShVGi^#FyTS;N$*7(zG8tD?Q1`N14d+eXn-bezDD>>^txm*bsO)g8zAq$;ZFzc5e zc@k*{F=0&<_bFX1B@R6*;DO0ddJhR}N#wc=PwSA%gUKXSq<=NG9>F0e%2qoWv^xI; zT|y==H>U=4qh2!j6RU1rTqTqx%n(#eJ-EYySi4mt=BJS|4IwvMwXY(xWy>BGn1t8) zH??Miwa1{W70*$)$eY{l`6z<*{joagv^pg?0!{0T087ZD>#v)EVF~+Oy=wY?Lq4nG z;v8jUguo5Q$D9ZU{X6MKKy%->77$|j_q?(P{XIon?s_X-r0?gjS;Eqx$2LWn$}B4a zwmo!+2*JV6KukBo3)9<;Lbcc-hInn~EhLnQ(*Vw>Bb*%s6kOhUY3yI`GJz27N& zx1b*!lSrmM`5x2G3fk3M$z^T{GCOyfA1aYm+O-++G>e&-PuVV+el4JL4k%QwoRbkL zt&;3;)3VHF-_Mu>^LgVUz9Wx#$GQiWx}J`5!ja(~sNv~uPbqh@gxcW>IS7Zpvq0}7 zGcQ6@D)LpcNodB@8OE&Zj2`zPKtO=*U2xOG+8U8{zXN(iNwyGeipCwtmUefSFGP6w zf!1{*Hz4yAQfMS7RK3lhbC{|5xBwRALf`0*O(8>C77iLn9i>$%t;gilE6LN+d}a!0B^KIaXcL zqBkF%S#p(G{aqPB#JwDqfO$lT6YNv_Z?au-zY-HqrAY^9rgNq`!$1AL&JKzWykgF` z4{5ulWu!yb4@}Nx`{ff0b>>0HWa9`H1#9b`Y*H=R_cIA!J?haV1cCmrS;hYMs4}Nr z9Q1LGpKz6ysWEhHfDToMrWmzpc3Um=X+S+H!~}i#51dZyhM^ROVyq}ccGm?Vvg>$Y z|6Tt(PXd5py^y0Xcw#Lg=(sv4Iw5BZf8ww0>_{K121FK0d&hyaB!$0Huh<~y_J=|A zC3T7&&!V5W_xBLzGiAIEb& zG(mb0^s!clhj1w3%4akvBRh-We&XfObd=+^%SfjrP(R3JOV(zHUyS?cX^m>^Bsv-lSAE3MfT zl3Kz;gJ%kjr@PwxvHG+?Fwd%|M4Pv=&`f`zLk_ImDT z_dG1Vrx9aRjk_(&C#BJTpJ4@U7ztE^!a? zvOoWCx)HAO&cNzJAfg2VV^CVGcPc?K9ow4CCY52(-m8C8l^Vb}4B+8EO^d`Cxiybw ziFkRs9}u@Q?BfINWH24NMZ#i2pNtD7?_D-=&<~p79QBjH01rDzw! zeSO><)SLqUMeU1Q6U^E%^R$Nw%R^#__%%#T9r5FQsE7@hG;P|9dK7?X4e-cPGfmAl zWlkuz2qGbY&myd=b=iXP4M=Dj7NHMB2x)rBzWSic{92pS6f!c-U8(p4q!_1$?BjqX z6PF9(8+}Exj{zrMOFj2-4*Y#>F-{1*$D7ZRmRm%m9^oTY{E9KM)mG%RA5cDNj{JPX zd)Ny%86BX30L1~1$ezX4o;h7q3SWkK<|BU`n2|2-Y94F5HDm5m!EIAyBsXOFtDtUzX5 zon@eK6ovG-&-u<#5G>9P;2GtNZT-Lf?gGH@m^hyq*BWaj5EyZ+G0HD1*qGoUI)N#1&U*wkY zbqzav{>1yBn&l^d+OC8_+-krQ56%#8kLfqm=yuA1?|(@^Ps#;LViPE__EK`Jm_t2A|-zdIqeY@KL&hnzuC=a zf{)rUKH)@kxK&1MOi#~%wZ!JnI?lL+HVsNAX48O-Dvdc3FkCqWSX#1G7>gpXM&qO{w zESM6OkpDZ(l)Qx2nCeAVkVReBpie19l#PM7PHqbWR+;lfe`vwl$T4@%7^set5;iQ8 zI*F?|DXBBE#eRw7k?!P@FnLPzSWLJrWiS!wbQFH{oZa+UqALJZ6o=^=#gX4Gyqx@A z;1iz*|4Z=&S?PP0bYp~yB&64~FAmdbWrN!pJPXH5F2N7bGhfNZl792`#0!$ZFCWAX zfxT%L8ouw`86k2AR{G@?_{{Hwo4`{lBuZ&TgV37ENC_J+6P_{^qCqHljIPAOzFG?S zD<9bVV&L|KKYZhE&eUl$j~t3{X6o{B&4&Z>nm`s#QvCq^0Qf*3FvL z1!?9R$^2{|_T~B$zG%2YZeQCoIua!~TGUSBdx4Sqk2IauIY>xFrzD0mR16z&E-@*x z0|^M!7SeU5BJnHdnTtc2;`?WRbj-0URcm^m1WTjsg(ZK^<-&y zYmm>HfsmULWy3QDU%?azVH$T-Se!`w2?2TmLA1`mo`x;rAtcHQ=$ijw>ysZ2mqQ19 zK|&!4?n`#^`^@F*<>Ibrvpf<`tWuIl+Z~Xi0hmF3Rx5O2_VqM{kcR(%HML@B+#vX& z24(vYESkH4KlcLfeb|3!bV6LE|AJG+79qH(p1 z5V;$nP^M89NZEZ;$Ob*&*#E=(cP9azAm#Q-morsL35^iJgHxd3m7hJSagxAS@OL?ix! z!}NBcBUIXlrIA(^Us*T(%+NO&LvbQ1>V&URLwBGsNyg63U^G|u^i z_GBO@2t8IsJori|R8%D3*aQa^1AoJ*|82r1WrraA2vO$t9OWMIOSHkKZ3I1aenhGb zio`}sg`jHbR5U*5IP)RBq{*8cna#I)sB=N>$u5pkg`CEE~N{IK9|U_ZV#kPQkk9hSKR+sU6;qy-c%e) zI+|r`BaiJQlit6Dq0}RAe8|a`){XGP0eME@d>JH(s3H)Tbi)%w14{({ukF3b?J4j# zeq-RM%@m_-83Tbl^LB>QffE(fu?KZ7#LsEOhf3JyIzU>qs{8l$a%WN#=eQz5+NguU zP$DcA3SJOo-@kuJtkh~h>sALSA^U9vBW)AOjR3-bD1~C(j%9J_(k;zRy(?8zvYmm` zmB4!b3iekI{v_hoBp~YR-`vB%HrszcdX1|4&p^hzU=1F*WPw4+RdakhUoUQ%AWO(k{4DwW_)?#|C&aW3 zv{4JqT%Cs#i5WajR9Im3TX2U5{dKqi00NhwUWkLg zF$3~dh!1YUl+QoWAx8aSCz?J?&8m1`itvfUaUINy5g_I9Y5E>_!r)a^RaM%d1XPp( zY-4`8Tl&OxcUM5o`=tb|YrEoUF(r}bog1GUhp39QDyxDaDag^c&8T1P&z22|-s~|! zIXT?lN#_>qjtl|c2@{ZwNhO)=DZ;2dWsVdL^odGjrqsR{iFoNl$<`5({T=V^oE@-9GwWTC!sth#$H64*= zgiQs~g2~LUpQy>7DNGpVTBS4P7RCvJDj51edVe4#9o~U;cu^uephJL-coGFMIxZo? z&PSVm3oW5eZBB|&joN)$D56+1sjqXf2P={Fa)j(Dj;y|GH7Cv2LGpMYKUl;O%gQF9 zZAk-{>y*#>3Gzs&n={1jz0^UjpGM6a8pf5}Le^;ogX^r6%ltJVafcjkbcOub*XZ`F zbs9(Kkz3*8Abfn0cH#`S*!vdX+oP`Pp4~`0X~{Mt)PowiiB%a`=tXCHduSLO@UOtR zgcl76dm0j(blfq5-`TMRc!M+!ZTxRGp+KJC6ydZGT!Ex7JY4F=;R&2K?KNIiLu?ZC z-sV|UluE<|^3WlC3g`h}+({+ZFmdXh+TnuV^F2*<=v8Cy{=%GU7Sqy5d&OoMp%e~K z#nR-bvO~x*Bp;FOL5Axm&L-gal2nd-G{9R7h3G@J%kGjBZKl#s(3qKx51;~|DUu#q z>M51eg2~OiURH_{8pgj4UZn6wyQ$e^_|{yybT#J#tqOnmi$QBzmGTI!_}K4$OuMAJ zLMzylsCm8M?=fDxgm8MeMa7l9v9tGC<*jV<;avwZ@ggyHqqNvPa%&hH0a!uX7_UHq zLm%&^jgPe?@^%tC0e}@F#EZu#43%;jucO=1B3t zG@x>+bqG#ydiVb#QoC##JP*M*+pKD=AssFrOhBYU{FLyvF2qYR>ie{e@&8(bz+1&z z=l&INyLlc%+yO*0%OE`7e_F0(7;j$Bd}zSt4*xQ}y5Ogy`TS_*a?nr9H<~Fx=Gk$H z4rCH++9|hQzJyf|GXoJYUj4F1pmzL!V(N^wbjxQl`lQ0`i z5Iu4*DeDyYp@R7B)Pn(^`Ca)2@#4{H_Jh1jP6XsEjaq^oDWjlkqOUb zaa|@blIX!k&e?7ji`Iq@5PyZA9Q_Q%dkW!Gym9E3X*#EzF|6z^BKVtKheCifNdGh2 z;0C+-zV@ZWx#7oXxQ2GvOImhzSYb12uARubf&A(c3|yt{Ms+$qu0kCH!%35vC`qrgt`PuITIvaXJ_RHw}O4g-n9k*y@wBYo#>E>K)I9pjY z1{6_X3Rv_S*m|d0Na;#o3`Vr}Z>^Ym9pC%qQ0Ui5HOtF-^#qBab*a4RE#I-UPopC< z8UduTL$#|O@5|h@U~nX9q%Bn(57NS5uqsYPC5l>qvXICA-!Kh_f4V{HiN3}Uya)gl zI1WukRrG+5E?BpNuzS7VoQX!*+0<ZMJRvumEYz)(cBq+HtNj%ZWv}>4OP5E>*uvM7r?j&Wt}jM<e z3jRNWeVKG0YOw;hj+NfD96_maXV(r;?YCjY)}=FXIYv5EXK~RdQ1z(i#C$i!n={oh z@k7F$Qpa}K0AqW&sEH@cVy6|vzKr;Um%kR5uuT-tVa3OvtKCfP zCoSsn1GhN1$EhX~B2YrQ`Xlf%;mJX1$20cz&&5+gNNo^@=3YHKPsEn6Y5&x=6GXL8nv=b$SQFxuYhTh6?;xVlxr}$CE&|8NgSZApk)oJm~e@= zxZeIQw(ENGfVD?iir^WYEJdq~5$y7546|2sVQig+=G{uyINuSj$dhOnnSp=^mS?|` zm%`xHZN6(V@z7O2C%%dZcGz1-R{JpHgqZa#NntD+Q+Cmg3_yq85;jCg|FN70%f@$XlcanZ9*{&|3aA8 zB?UPQ#@8e4&Ak6+43IoBiT^ZTJ`t==OLA-;3>0G7y3jBHSU{)0mzKxB-R`9QV?KTB z^)W!(SvM>l`WOJ?JoLPQdIWVX+D(IS^4C?jQU*rPL&eA%Iy3di5Sg+VnTb za0S~UHfI;>wCtT0H`Ff1W`EYar^(Y~R)_Vy#vmgUvq4Q)J_2ycZsT!7)dC*e3vP8U zlZzraK@M>v0`u-0W;>xf>8sGDFU33kQ#ffsEOxlR^}bw2ahSjyHq3advt$x7yavjP zsz|^yUT0O6&3MmMtMu1dgDlx0Hj7RMp5`1DiH4UA2<@eJEA=X0F~c4Fcp-)L zI6<4IqOhlmK2X#-;O2amXPbbLo2YPed)(Y42~xYl7RaFvR4A3N`7>|f;sPfTO5d1P zX>d$G%epai=tk_MC#g{v^Bi-RsO&9Q(4agQ{Y7RB5m1=0FtAK^HKoU3dgsL-r<-2x zN#Yc_cySa|S>#<*C41;LVtc@zi=6*LH*>?#UW@kM{Jb0}AdSc^;50hS-V}mbf{&Z! zbHF1rYOJTU&qmh;+>l5OcEtusJaZy#>#N>>8aiI^Gxd{coti&dNLG1M0fsmA z(HVVyj@WrJlbYl1MAqJp^CGDU)v*Em|88?%3F4~Gv*69#WMeODh2M{Jd!LApnmYIA zJQLNCe~%!>kXBru7)-c|UM&AJHioq?P3IAXN_eAjV-fXINCsW7xd3a=*fvw^scp=1 z_xgxlq5_CRLL(Un5SHjaFgSa*Br@>~t*|0H39Lw`FD-wLef=Xap*SedlxT4rd1*z! z?9#^@76cTUnHhoScuy*GBH?sd^SCO0;_CyuaJYr~yA4uVE7=swc%; z$P(4wm%jBzzVe?eRxijAH|t7 z+1YIbo8vvToc_mMz*5QP6Gr{o?8OWCm!!(jKP3IMu9z%k)1C7P!jM~)p~!Q$_nu=QK#r=+oZtb z;UzkeZx5TK8kr6bn3sf3_>PoyYmQjOE@z~arT~bo;b(<{@DGY+U-S`rBA-AxGXDMg zLe6%m%uaYIcWZ-Q4Q0@#69Zeq_la9-8gxTWUyB&Kx%M`l#PR%{IqF7CrVH+NN6P;{ z{<`hR$E_(el^P@W|0=gH0M6!!jqX7!{7*d5Ppmm{&2HAOY?Xslx}J6m9aZbHKA|%Q z+v66DVH4CcV_a&-qTnW^$;!=?q6I~uyX{kr;C2eo@ShEwq||p$+%ef(v0e^O_rFrf zX9_Z@Laj<0CRGf9ka^&7>1cWz$tpESsQadAkLE0@Y;keNKUP8MVEl}M3RAbA5Szb^ z^V(a=&Vi#q`&ws|TCgl4pi=LFE~Al#QESer86;b+@cTDdav zR_sKoE*8bjL2AK|fp}oG)Z14Ng4*_BAVXtk40vY$fB$`S2Sw{j|9O`O-1xT1!pKGn zjKCriAqo&IN;8wDA1W_zD)Ry{J8+>!o5+l;V4D(xupR9OktTc41~30Y+Qr$>;q}9B8p^IzF*>g%$b1egQv}{+NCmCDQv^ovPK{LAfyS>w;>~|1?EI&R|A*q95*+ zEDRkW9;q$I9M8&I{pMEdFcawgNcWK=#7%8uC)!w!CUjO9ZNs!a1Ei+eyQiDuN z4RPuR1FZu_Hv452-#GdQDU_{Qdx07w9NHgw5;uJc-z<^p(Hn<80QV|n$7jcsCtvFi zRt{&JA^n+&a2NcUyskMy|OA5LFEEX?V-sGLrP<{S=sT3oQJTLyKLV1EFG zx|Bo>6OHlf3dm3up!)b~PuZSmcX4f6dS+urgH+6$yhc(+x`Y#cs-ZCiX9ydHkN{903wkYp9kT zKH+}i{RtBYc-yqb_h0SuO*%mM3A~7_1^u~lSLH25%NnDZ)v2Tce5n~}d11S@J9 zz2JYl|1q6QyuG25*&xH7b{Qb&3UDLdx9caP2+-Uv+5EHEdhG6vN&xITRJSg~ir;@Xu^g;u+|Pe-BFzrdyoIHGChKiL6iMmf#D^ zN|e>bO9h_ z`$^DPu$J6uu4r;y!w5ZqEt0xrGSBkW}6VIPeI%2UC$6rikVk==- z+IlGnH@8Nt)+#y{C}p!#}DKA4kg)wZLZs z%UQH>FRdS|(QO&=G_{B5K?PSY;DE?6HvI0=8M%>6KzATFAm1&W(Q|j8IL%@tX%iYQ zI4uLmi;#NX%Ub#k zm*HJ6E7jEWYN2wkX{>g3wNNQhbom$~=M%*B2O*>At8rv{Q5HVe<-i4=xQk7UuLOW_ zzg`KJ`61cyT?lv}l96nxU1*x5)C}@+qzlfcEa{0!xZe}MC4QFw3x##zx4;oRB{(mO z0xBH5Z&TjuCQ=%CRwOKrHQh(v8Rn++*Fvp!70`UH&KI3B%Ou=6oH=fp?gIY%V$7`R+BzE|*A)DmgiHW@uT3r7r(N&|+^o9zAxU{5MAGTuKr`Ekn#-PE$CuX%ALoO&APEAjl^ONwo!Cv8f?ynJ~Ms8T8T@O|Z1{?K$Frx{`LTtJRvNDk&2hFN)onFxI|?;aAd zRnATb-wb$W|9}5|bO%}nD}W*rAcFpt8|ULVkuQ@^FyDMlA76*{2AFHe-F9?FWGZH0K-Y#H z58@p9tQGj*S!6R{6>qsb@Pwitsp2UyjD${g`&b z0Fu;1qDXX5VtKb%Ftugd1M!Gn-j2TI?(65s$&TLczj6-bV1e}@4SWh{3Arlo54e`*_{ZEb%7xx5R_X8#vpb3MSQL9 z$-O^fz4)!+_Zb^B>-=$_QgRq{VQj!z6KDBo@mU5c$;~Q4z!7xkX43^M__t3oacF~? zK`dvVKCMzlkWw-rEE#eUl5 zBG&x-S4JD#b&ygLmm(ATvCTMJ(8f5Dp+G<`U0yzCbmuY#0&kq^qI0)Xe>-G5f`Fq; zLi}D`B1Z6V+JlYHE>{n;GN_~D+nuku7n8#LDOOJcHm4CJX~9uYZ5-w(3E`-_#cxDf zzw=cO^21v`dS#{Vr05`b9E<+%k&Y`8gAF3U~};`k;b)Q z76wg^Z`o;V14iy_%a|jZw9RN)rq@0uGm}-CMkA_5YRk9Cm`)CE!{wYd&U1stczf&^ zS7^_~V%Lpqx=x(Ioh98EPkaTo*oQkg`e}cjsINg)!d3(dK57N24>#Bhm?SJyH}4;& zSoVm~Th%@8ZTLIYer*0HxhfsVQBtSySVLlCNpTFWo%%aNWBs^& zH|1=FS`!Gy?~^i=EN}RglCjvrXd`#OXDb`01N-+V$!8Y>srzE1<=JCLJ;HkZQx$Iv zcwIH_lIoIqW+<57vQePVOwP}~E=0(`)VZ=UsPFwM zY_S9?0AOH?iF4L|zf}+<39oPt+aX&~%aJX;un{0nHloLjtDt>VM*Kq+!!m-cuC3s^k zu)y-kfvqecC5{gEj!J*6(WrN$=GQ#B^GjB%Eg4P9PI`~DM;^E!+SdCkmJ1agoy)77 zd&!n?=^UM*PHujvYO}|GKPN;;PO(Lr_S>=>fQbT<5I{*G^`a@R`)bV?77D3-r+Cwc zSen;@gATV+mVJOufy+{O*mhQg#bggQ`u@m6O3Q3LbhPH{|0_Z^*ud?w{;>Ua&G)ew znejlK03m{m>^Q8rhM#={0<_sdpWRYhG7YMF$qwgAOT^KJKJ}+VXQ3bLAqf^+8Nh{% z&;hdEz+!DuCln^eQZ_lkxRTy`uwsQ1E#q228zq-8%Tkvr+~j%s2-%QB-S=*+pLeWi zR!mcerB&{cTtXwga{<^@E8X2TLi}HxtR75JC-n3`yXC+FBL8@#R^4C|szT-v9BB0T z@qUKpL3TV7dZP`5SFATO`yOpDB1uw@z4vHEYB*meg0?PK2f*ZhvU$x_xlM<_lEfO8 zeHN@_Fu?XE;)W%<*hM3CK=i-ypSt3UMs19}rk#jh5ad;W`D!+U*E#me-zEohEL$eXsL-5nTD z`0j1l_INXV)4MEe8%edRBn5fIvti>PZ%B%qK9a=NuGZ0~qd%0z=>G-5ojz2=$3VbO`u534QASY%2iO zykCi$&r*BaY)1L&(X0{#bzCGwJtf6N1Eljs4(GVz0Iy%LBytO-;B@ZvQ)85vD8r1} z{ZLb6H=!Y4XCmHbX99Z?sr=BNMo&Chnx`y7++xyz0@PvAoUwNt9A!;m1t;$GKmK|HBzRqAMZ^*^+v0gB?u3S&w5^{3pbDqnw ziO13iI8pwMz~^KJbZ9WaN*``ts@#-MAVV>N@_S6A+b;(dwj8CiyZkFl@s4O7oE{N8 z*%Y7>?)2q7rFR>i-rsS zV=3&%YXYsV?cl&HxD%{GT)G7HG{7i%WAoiX4AW$+6NYz=LzDJQec9Y)!ah!~B$M_; zZ_nf7u~iH9AX9@70?tzV{>#(sSRBw=`D1`^T1wyEA^8WzNK+Z#GRa+KX;F%n@QH1< ztVQJ-dI*gVZ5$qGhD_+qp2d{zo6bl^%mhSvKBuAwy@VGm4iZG*I42{hu8wPPHai#c zeZ@pj-e^}|VBe`i!Il}cNfoMehx+Gldru=@5d7KtPf#PC0jn8w*E7-p*dl3Bbr{*Nj`jV^P+#qS6j>bqJ;YVK(6GZ~kmu zU1#a;cy7K1Ry^FAN((o`7Abw`<9BqWiwHKYEp6%s3oHE_z^#t2qA67$WJGZNa;o*t zDaz|(cw9VyAgstJjn$D7(G;_>8sTda(-Xn?+4E+L6J7?6hAWrAY;67>@L z_^0$V%&i*WF(=X@#$`TeCYc@Zv8QCHIbL|NC|j-ALbGZ~PdYtk5wXGT$I-Vetn_RF zn{vms;$Ke3{& z_z|xotY;kH4lVNC>qGuO91#KAkYDdJ3(wohSU4x~O<9&39-yIl7X~2~47C@h`sGUR z!6;eE`_hg-hmfB;{BD_APpr+x8QQs;k5-{%`5iAO6W@e78s8GfMi~2lxqS3 z;kFY`+?aK-sLEu$3Ath$A_ctcXB*@LdK=u;Kon1*x3cAFIIg^IvXyq(okf*S&nI8f z;YJW<9!Z&z<0u@^e7I0m)5Q05tzlr;dEN5_DKOtXwIz(j-&#(JK22tbsGxi4(Nh&D zMi0O3d?0mq@L+)WJ*{050l;C~G*wz?8iddK8B|6}CciUuTrM2U)5pKuHp*dA=;S9j zJnGn2I`$}xCq!r=2X9r8;IKFtyb0iyN@{Q@#^QP-fN2@`soys(=G7f80m>N2bDhm4 zFuR;#yfqnO9~LGddl28+Ym29tHZb+Zd`m*C7pZWn+^5(I@xJ1JUIq{r&CJ|bdqjgf z6W*)+A`d=5>UNkyd4Hya?AtK}gj*K{Z?YSXU4Dg-+(pgPApZoqt;fm&j@L$%Bu1OZ zujj2a3%IgHz~C(NcMN)b?PcYkv@0(%9W&PbD|+ecG<6&Gxd$x zJeVsi|AG4gLda;r$W3|p@uxI)7SvD|W8K4`qd#T}zyE&g#M(3>RtD(IR?tg6gqp+P z+)b5G@I3o$MzDwmKw5YoZdbC67}-V9Fh3bNkyBD3k&X9bh#3b>%XzbOTE*@sv@s6O zP+=m{Ook&!ic7<@(^@8A?;yde+h#i8A{n)}ed)E3R}(Z46M77UZWAg!%tN_Dn6POi zsjS9hPT8@C$mB}mIy5OidYy~PO=iCLAzRe(VRRm>4@szfcBFQ%rmBDnGo>La8 zXTFfqpGY7%gj*I8dBu7^S3`Zh8U=zgi;SEaeG8F=x{>Jh*s%&OTg>O@ zPGuyho28dwZJD?dnDZTbrR85WCTD?DJEFxV7U)R52i)a}YnRn%#-7XLMZzKm(S2lK zk;lXbrmuXAe@PM_qoLf;Fo=b5j%GVX1T7V%#TjU|)k$g1mB<@*6`qh$?^`JXZ?)^o zG+_d8nD(IO7cawztz|(BAg$sm`xzV6m}ui1=Dt_KfV+Rkc;~!w$LCJ(WpBI@+X>Zk zUuXqyi5*#*gX)#wAF;oLrU0w4O)eK<_Sq`= zB6M*YwvAoX*x7~>@{8?9=jd%z zyi!e#0_F~)zQx9LT3)B3JWh*?g5G)w>;%=pL%RwAdjB}u`y3({MW+#j6i3r15J%p4 zt;4#7=$l_#vmN(?K0BaqwmG^r4S`;wW}?I5L63*YXUp4Tm|PHDoBCt9(DCCqqgu?m z(8uFW^{AI$`F?|*L6m1TasWVjV#6G%qaDHWHm3CC1bm05_&T z7)xqJhsi{dMdmgBM<&=rKh`_g5;&v)e6!44d@lQx(*-zDP+TZpw$vc9jm|B_nDU2E z{d3+OHKSlQdg5fltmWW!kMI`h*}#`Zw&s@r_=&Qw)xX&~wnu(R56y6*AXTC)uX*cd ziVBx@ku@M$={CQQ7XKMBZWbM9#_N#_*Qyun;Os;g19=tbh4rKv<8>NgKwxy4(0iLZ z7J#R>z$a<3UyLZ=N|3Z*rNZmZAR^xi+#V(*i%A7xf2;N>^yQNVIvOJkLb21kRBq4Q zzTYz#Z#o#(5zSfj#7@jf4jeVCRoKv(#AY+?IKr?_k&lz!f_ua(F_d;o`Aa9cEC_pd zJ4Y|8{x^L`#?{r(mcQ>SE1gX;6+iF55HD77`@Xj?A&zbc=$2-G_ah@3R5Y40 z?_c${v{_80HpBA$=bO<1hB{P_bv$vnB&tQ(Ly!VAV2F8a*^C)VtSNp)e@(pFi>p#{(nm4QM!-{|<@-L@&X9LJs3wh8s-u-S?JNV-IUvxe zolO<0hT{)#cO_HAsbN;9C;3?ylFgB3pUA4rUVfMI+oQQ=sq3g2=_S`}h8wYU;OF>P!PMo5CWpS!%G@rW_t??Wre|8)+*g+Zm3#Gd~_FnAcd@-`+5tH&zW#4`v)kwHm zsUFYh=X;Teaezm^jaVwK8}2eL4n)CCA8N8a3bgwVbC+(q)oCRQ=P`{YB5i7Ozxkea zY{qP+Npl@L%2-Jk zu;ukAP3-x*?oH7d*XRYtu{m+Rb8lODPI#oKl_>7U!6Lu9BCM9cRH}S@|d-qOE#tj1P@bpud>wJt=Wb*O%qIX?Tm*cuwXL%$IWWM3BjifC-zBI z!EeXJ7sVMRnX#rvVmRwZVk6k?#5)5m*m%?_#^B482P#PHT7_;?HD|@BxWTJSY4AV} zGv2nuG2mcOe~rSkN=Q87nWWgZ62LHP{f3)tlWkt4vbFn3d5jF&>H>zJJN7n6)k5Pv zMBhXA5Jgkww(8;*wSSP}b_FL~E*HiJEeuvxk5dGU*(U+edh;ZAQdaRF7p~LQJflTG zIT&baev)eM^SLmN{m8$`V^q0Ks+T0y@5c^`GrWs{5U=%Sq3_aacaTm}37iWcIX6?1 ztD2p1ssAQ_-L2s}{3jY1d0I2MZKiA-*^DG5`4T?)C{2T#FaQiBB#~U800001of~J{ z(Cq>`D~W_;!rNnvPQ)`osIP|4es+3`$)4rfI51wCIeN#6FHf%rA9ia|LnzT%aDac8 zO;$w75^;!j8HU~3hww$)FonH@LBs(#^MzPRG&sh_D{^hzE$00@rSf-!(Pwn?iFzJ7 z6~Yc=xJZ{da-m)qwg65Z+gXpqB*6Ye&Ol0gd$}(I2uLIJ(a*xgYybp0*zeKY@tDp z?fWuu6FZpip`P2tesRfup>nrS-@kq$B86+&o@S$0g$J!mo>xvV?RK=#BMcJ1BAc$Z z9737SlEAJzzbmF1m#U{~TqY$f>ThK{$hZ)Dk@Rp1bDok5WermJ4z3I}CAnpE{S)|3xI2FmJUCUX4 zV&Z+Qg|vNe$Jm{Wy+SA21LKzuceB}AVohmrN<{Ifs0dzrB5rDNqHeePW4VGfM{ULKPL`#;|h7 zk5W}0o#%^r+oo~!kn+0b%q7iF(GffA8kUrID9QpmnI6&a{C#~-8GuWxDcPtvrL12r z_UuwE!5X%j?&*r~73xv27nYTtXkV0P$Csbc$X> z=3xjwp`C`($7|Xu=#|}q_rumSR!zqm{Zv2VUt@T#hbhLvnjn`U@{*0|2BEy53%0lA zilWV?3&2QK)2MA+^~^T}V1+>AAe9M&uqHO1Suk1nuxV#kN;aw#TxhL90_$<~BL^`h)8@ zm1;Q`IQyNmiq};B)v)9RZ>}VK96(!3uYYn2R3V9D7b=;YofCJmfRW3g2N2@}++{*wCOA;bwD{T9YLS_tML8s=_8$@EiU@Op@26H8z5p6Wc3i!ZXQLoO zal}SzFES}%XRS3Y{^4Xqel$25@F3sJ4v^y!Ok?py;@)z2yxpkO$#NUYS^msHS%)Yg z0Y24ZHqUs4z355YYtkm8p4)Pl32tK61QwS-RMjxZEbx4Lmm6GNtAYudr%5qKUPp4L-*|vyIp_@&U=>c2gb5Z1&ZY;Dr>t;dx8u0$t&15(G1$gzY_e`}9{)-uecd@a zE|3_6V&SnTN$H?PA3#4s@FXmX0Sz876_nT@;MT%15HgIGxZI%+kRd^fok)SI`t2gKO@Qck=nCx+YvyumCMO zxnUO))G2$jd31waxgrSI8wa~L{!|aDET~AG{D}x+@afeh;4Z#7&-=oqZxY-=ZWsE` zr>^)X8?^zr|x=J2fk4;JzuT0OEXoF#zWHq_rx7-n6t$=6dAB*>yIQg#^Zdp ztMya_WGTG?yKOTrrSp`EFV%I@a!0E)@B_TlSM43hJ1xVDxDkP+T~yonNoZpI(4yMz zZu|b&INY+duSu-1pLHr?1lm0{=pcxzVg>Yk4-{@(R$)B(b`H6sy~8M^bg$2!Q|nuE zT{yl{ZKVlCuHnxbe|jpJ_K`GaqHzRuL}Dw~xVw4L24Ow2e8eEZ=t(140XbLcKIjN% z6T`EWOA)-w(B;gfP<=^VjF-1BIDtqhlZ`_1?sz>5T&%JF7BQp-OlFO}Xusv()z&`t z05a}{#kN;pMH{ZPvN3#_O;r4cz?UL#;Z)9YuULw}vEFj*E31YrTeqd!<9oVSl?_e+ zz*0H8Kef{s75%KK-kBn}K?%2I13~kJD~jJ;Ex?XP0W`@4)_Yos&&^R5+EK%A@anI| z=pc%^s(pZRc0CUUM)yct@CJ8ETt^dQmugC6Kk4&_IZA&P(jT+!cTMI@|6p60L=;+X zY;B6aT)_++!a1QSY3L5!8dwZwkbe0vcwh;PqN=6uRn_Nb>hKZI0GxuKE4OZXJ-@yf zit=gEZU1pD+4Fjms4^Qx5mErxf)hX#ejkPf?mmcsg+qA~2tOJpBmz@N;!h=ddH!gP zpDt~h5Rxs=K$X5!pUaKCwrLGeC5R?-l=5r3CZ`pM*67$T0MsO6^@Zq z0AX8OHXcQkxgc`1Q)|cDm!Xj#R-S8;hL}#+1kG}>de2fX?%&)E2_AQQcD1Exy&RX; zVdyVy3llE0G`WTkfm5@sLM*SyB&tO>n%;KO7=JE;wvv}q{<^d9?{(0~rxPOhnP!{5 zc!z8#wEqBZ;2}hH^;x$8^$kwL&oXAOX9FpED_Z9h99o}8Q3M*pEm?F1`6QTuBY`)L zDbE6SPQ30Dxh#6h)4?Qu8C`y`-~FbrVOFsM$gvezM;2b7cC23?*-&;E>^D$pr{(FH4si7y{bu0bBkpTY#Km*shPZLx?>8g99v41H!=SI;l``ypkgRBE9qO=C}S<%Bcy zI8`j9IQ({V@#m5Gkek&bQXJ9M6&v5#D^$Ud!-zSP;j4-}2i39Y&0`b+#ZRH`u`EvT zB_%8;w&2>@h0o^Aq8O^m!JS0GOR!c4r3V2RR_;W%%u>;FSL_UEs z3rNi?ljEy#^DZDm^f{lf@>UF|$#Hz_-u1dO1QI zJeA~qb10%s-nvnYLUvlz7zUtFy6FO?78cXCZX&I+QcBN@p$Dwrnm2KNDRPILc_ZQNcsNTl;~+V>05bnhB+a$dPQnKgsAq37acGO z1Va&B^?A7e70Z{O;k7QVa6kL7gTV>?Efg*p68TaShJqRj_<4TxNyD+cl2&Z*n2?oj z1=^vB=&1`Q%We-c^jx!*Q~LNt+`sKl1sL#%2_*z8)-iv$o*R1qJ>9Jw>v#05K!Q|~ zcu4Z2JC;vSXvZO+p=F`i=|_vX?aFh%c?c%srVG#F*my)j)NwqgVxG!GHmTgr~9IGk;VIn}sDSBnhgyJd&(FL)AU`?9E}B%Tx-63GR`KGv~VXL+|MR z+JtE91x0{vfy6luEr@liMtBqxb-klK5)00J>QHFIH!R~a(VE^DsY;JHQf+5&JX8oV zUZPF?1@%b_ay`>!UIdPXUvgGm7yC!d&>pb37r7sDnokA5JC?!_Xt%LNStSph?O18t zkGBRL+K{OIe#|NflU;5YckgRs^);wbh2_j+-2fPQ{hMfMgsDT8*qQQZ-#7WWa6lTG zM7$Q~&O23zaJF$3g_U@PfIYJGo{0%fzjJ^WG$%~tEO2cS3Y8#y5q2r^jJk{ z$x&V}_ubS!6SBEFoV098@6f3jwcty|0oLty#ul{>qn6A-bCKijya28dl|SBonEc+| zd|@nqwr!(7LSuOAK8+}+D@}u)RAmSZL?(N5{2yeH5Q^$5OPVQ{NB(ukZVR2PnK~TU zYcs~`*|0=RfL%hqhnN%iDfL;jyg=r{O#r;j)shTP%7ottcN6;&o9E7Is*nac{iM#F z`&BrAa{MY}O-9=m^u3$@&esDArmbd>AQ)U8nYRS0gX#07AGbDP7lE`CnytF$F?9|TuJ9E3fAHdil0~xNJ}ah63{}F zDrQsjAx6icLur;}%x=C2gidIOcmZR6V-s_RBo@a!;KDGS;?Pjx+{4+M!z$xGFRicx zVu6+cGRKIc3C6*S&`l9l{09CvfGi3^lRZCY&ds0)$vIT9^|O?K z!U5i%@=T|y-Y;(}oFz=~!c_MLql!ElHVSmgc!kQP_4Ux{<G#IFhr+Z~`~zGIS-w zgwKyN+Y}2HHBWiyqWT1zgYNCe0PWGe_t-o<-syYt2Qn2vq%rTRHkKmAEedEBn_k z8lFHdTwiECu%@~9^JG74H`}hmjzFk`LeDN?e*t=X%D_1GX3o%Vaw&3u7pD_sXHtr6 z>~Jw$z%tg@DhgRq2%6v*bi%&!(oQ0qX>?VB%rc$*sQfk}c*w_PhC$Zhe)^rra)rG1 zJQrj;5_S@6HAJ(ST0nM29fT+KrK#3d%MMat`($Pn&loCd(l~W>4wdEWA&CSthvtmF zFl|ny*obzP&OQQ{!SZs`Y@>EGQNYiHH- zh;6IAXUQ`F&HKxp5dK_D<>0a}(n6X{&3Cp7ZmR!WOLl9I!80)5DST7w;aU)gIW}w5 zpNj^5Uxqq_Jy(U$oFPp~t%8JT*F(1&T;*?!nP*EkQ)zLT=p()z}7vpyLl;svmAdmTVA%L5W-)Lh5Y9>Q>U zw%YXGq(`yId|Sk)3UTu?+j+40J`1s_ERHR zlgFtMJMs3Jt$8e_NUTIZ-L2s}=>UlLw;A4K;jacOvGBow0fdC41<}L!Iv~ISbwMl} z;3lf%@=EU2JMloWGAL^^Y8{J1+RcscBS`JT=`g)Dvj>!n%u25@xFJ0%8 ziszAZ=FS2FZlvL6SXQ$bQnL}>>`Bv8b~M5IIow1hQ79aeC?<|ZR$@f$p4+fal-9e5$)_+1`@LT#9a(Z#MSCNh8j@+dDBnk3 zj2qxY3cz6>{|K_cBaH~7FG|(;ZuGPA!rSdttU*;MT5Dhl&fNMXRD9JwF=(4^G?f{3 zwYCk3B&3yhOu-|1H~MOt->>2H03jR2Vt2IG;P^)eBTm^p8Kebt$DEl;>6V%RoO8OU z{%eV&q*yLZjm7IUPeb!H!nI*EhwPQRsRP9NHkr+Sub+Ssc4TZV+I9WtJyuRlKR=clO?9sV_sgUWR_PJ?09>%y2m6dYk_;hWJ#p z{h$d;mjVik-o%hzG~=h)?X^vxePKCf^qlxostQPtAumzCER+|??lStLcWK@k$2dOt zUZriiS9U#TxAwhF{6LM;qgr&s24L7hSJUjH0Pci1{B4b)e(!26>H+Z-p?`cj`vA>T z1Ll5f;Rr#mhj@rIhXVzlNK&45DsRsp>uYXOIJt-B-G8N_$QS@FSvUt8GEI+wla8VP-3APs;|5;T+lWjc2hJLyJQDieOr-fA#ef z7C}_gOCmw=jJv&zo6gI$i-O$r28y}_gV9|VlM=4XNgL-a+Cwl%Q6Y8tkBX68k`_|E z_zyn)E6MT6 zAwNRo$X!X0jD;hc_nl@<)xw9#q=Z69dQfcPLWQtm9sgd(Z<&z85gJx(Z}CYQvuFU< z3a4F^) z=jnX{u4m@NVZ4g5I1!R-uU&eE`KrgCw7EfwIw%d}UNVEW++Qaib*HxskhC-G^ZVC@ z;+@+JdtSI)coN70{1M8*7QFY0Y8QX z;)cZ5n<-%l>E+8@a6navN(LwyU114`fK~BySiQAaA$uk@9!VWznM1d2{H7RZl&WWbMI_`GaP6ryH=KZoGl=~Pyv)`1rDEJJ zVeDZlXmM8i58!W_2&+SMVKZI;Pql#gVJ0lNFMzQakjW>}baMU4gGXT@H?_Qp6k0Zv zUmfsmA~psvt5F@al1D$*5;~lhD2JKP;0tOyUy$5Y$bm~t_=375t0S?sLQ2)q2upAh z#-R8%*f9;o0iZ1yiSTY*pY)n>6@B5cCTEm4yG*EV`4OE+jF$)iPV)4n49E$`yj;)2 zLLj7*?q#CY$GA7qN~Hx`)-=XA+`^z7r@h!&?oG_2mDAEBbb*45*axwB;Mz$o@IHDN zfh@{OpRLdB?Y%|%Im>t0W521P$>s6KD^PJ|ZqhThJd~m}NW_F*#{eb!V{_>SPhg!y zUG)rYsP3|$K6eMmD?8ij8d|6yld-vl2)FO9vvh+Da_of9vlYMup@UHbaB#lk*I zC5olMF9qnDzqEc5gcSTcpB#jteq}*WtWE`d0^gxtMJZWig&j>~A_UNA=KOSuK=JQV zBZp8rK>`u?8qh&)m|8K9X=C7BL7Ds@sBLRiI*4hyr{%6wR9#rnjY~tV9XMtEAk$SH zAMJ4xLOq8dsXVGB-L4(E+7t8y4PxwjMhHAGwrxZ`(mSxf`lFPZv846*i$Jyfft zeG0)l8p-tA@>E{G-mL<@NkZJLD8eDVpVomYp2s@c%t81xcMY=Rt$e!t#(>}I^ttP3 z@{d}8p9S0GQk0rUfhjRgb_6U~s}NL33q5YhAA-%dbazav;d+|R>g;FHJrN|>Z%P0l zlY6gEZ(iVAN|husrMOT2Q8fxrH2Jc+py(3v@~Gy7)jc~>nVWW%bz-2vn>)MwAB7DZ zCS&xR_bn*=Chf87*U*qy)c*z$B|b_P*J)m#QP^q*=8|n83pgFFVYV(4Aqdxc*gAUv z6|;~UWc31il(w3WD@T9Pb$k-s{T}g1s)5UwN=&+~oaN`%wqCi@x`C@6GNm?B)H&D? zwMI}fD`IkhgXG~8Iq6hEndZy-Jho;GAk1}mVd#Y>CCs1mtEez>y#8AMgwt;G*_WX4 z*MFapT#p`@Wv*8c(j}s>w#P20qxpsB={>v*AH=-cc%MhbSp7gVSr-B(Awj`1Ud2EG zqNbETP>ZHiiWJ?`_$djXs~kwhTk^Dh#LclFw4GCvXhC#^$HpDop1EV&wr$(CZQHhO z+qP{xHa0QXRq~b?7rD{wSR2oEG1Sdhx?P1CEzloIwU47>*uce zfuBL~*}B)Z!P66UXHT;*+uc+Cj8`%~%2ujT`P2eCbptoGq>)f+UlUnZco6-;3w-Z% z4K6z%)Hd^QrF^4o36?bm=9XLBmF}Ck1-GH#J+^yMnbiUD36Ica6{#?-CD)j+=T#$1 zIuMSS8g=wSC?oX(a!se%eB|zcbmWn9^+=;;e%Xkp4n%s$I-|uy7-T^+E@@L1DNl7= z%&Cp_ES#v84H`cJH99a0hEb;(Err)idK|py1-${zf}T{r)hDRaqt~2TLVTRoM2q8m z@Pww6sm*X@U`58WN3kE$R)FMxN6w6*cBQ03D-!2^R{f|bab8^IKinfjJD-`Sxe4@> z$HE;Bgp)eXauGC}22!z1t7Wz4(b=9LE_tJPUYQL7!M@K%t)1MK_!ICYN`OE#s=VCl zK5^efjYHlk`2fsQP%F}}CR-_v@Y_Rkbe(oTGywg)`6NP#{K(0lJ=`1(pj>h=E$`mg zt6Sslf3@2pH9g6U*xd*h@oMV~r;@Je(TjN>v~4TpxMwF7e@PWwlOfdnYUah}KuOT8 zlm-;fmv3)x>|)`w5UByKxM0VQ?YC7W=PIuS9AYr9dF_U7Hu8n_LL}b(F&O5BwtCa@Rb#AlBZSk+OcTu_`M!JOH5rLO>I zUSxUn)K)h2hhH}$Wb<}DE|M3Z-CWTH{Mr)XriEe@Y4TSef&*mrgs%-3WptUVE{=0d zS7vXNJy>x~QL6-yQ1hK96lTSuE*LbdNh}AiA<(0gfSY}#^&e#<+;*!+9}BpNuBpS) zL1FHhyO*KZK880qzkBQ11|1Sa%tg^K;%NX1hJCswWo;Fhv5Mnpv~cZ#Z6eqW7O>TV zQofKDL|NFUX^3rz_u4D`;!;T_dmoYl#dI05xeHZk-JjWe(A^#TC*ib2{_0~~u^*gX z6G1X$BWXOsgk)%BlF7LxxPQWXd)85_3@xbYy-k7P*oPvDrku6h#-z=G9`e(8ME%sS zDEFDg5EPC&=@WBE<1fQI(Z7%CB2c`BsCa%?#MWYj4#QhKir zKBRLza7GY@4~Z1hF~}N-sgjXxxrmLR;>YYHSDtogi~#nNRjFa>2{>yrW-e4f+HH=Q_r6-2XjchG!)}k>b?9mIQ|y@ z^=3l>c&S+%&}X~BzBpwl5tM_;+!)f}7GxEm|$qTgM4 zc`Vts%%M4krW=B#Pqk|Glz#a!XljpF+FS&m%M%T^gj~xO`bg66^#{kCy}4(4^UolJ z3Koe>9E%juaxu3SOToAE4E;MBYQgj3e&I)N58f;q#C+HdU9eXL>lvsXxJ=SMI7gW8 zw5)kvCvW)hnrH5Qw8yFMw;Co^s|3%N!Vo7)bX%cs)(V!uy4i`R&!rWcld#Z?@GVe^VE z8}^I?|4QAT-3GDT2Ggjxjppm*=OI5t^gNJZRS%v+JWF;*xFX823|GewPFF2a<~)F@2&tg7Ywv7+lANxM(GjBLrvx&DKm?)7&4SIS2Vf zOMJtzr;50icygt!Yh&fc`t{F@zeoL^;I?fR#HN$am8XB2U$l+?xz5Bz9-j)*>_@c-fZj}NiBDV#7hx39 z*Sdf{#07`D9N&lwq?hQf;Q*y^k}x+;&;e~=|L`$oK|f-|@u)F?%ti*2gOEqIvGpUw zk;f>3@N7fgMUcan6_etB^h5NHsuH{5{c`i1WZ^w$Z6j}S!{-_C@_$;!Yuyht3OO3uC1@|Hfh&vi;llC@>8iavNfY_ioSj;;_&7`4 z!{xBu$NR)VESPj591SgLnk7sDMAztmnKA+>ZSwK3i2(Gj83IL{HQTCK{&=DP9R=(Hd^Nnr4UT%MMaB z+Q6vff*Y3Th|l@gH04GKxtj7?U0C10E0m}5>a-rjPj+95u$<+KsF$gl$C-UBanfzO zF%Vf@L=LlRgjBt9}(g#}|IK%}6X2 z4In^onio0rqwP8SY|IFv?Q>Pzz`-r~N&(H~%#k4bR}0VgD)k$?vs_;KnI=BC9Akn# z{XE}jMS*0lygxwDXNfzeJ>E?Ed=oT`?VH^Qh3h4i$O#~HY9sZ0oV+J&{9lX^v9U^GPo1&vr`b+%FQC-~5i4YY$*atq!#o7w4J6XKS znjj5ViV9pNM!yq?%<@*D`Zr&Ov)V6em6jN0fm3AaQ=lEp%ic%WBQ>}jMbWXMw~LMc z1v)mPni9C05nvA_C}4&0_ist0hXRAEn?K3ZG}#>eVHUd{W%#uS*CS6vXMRQ~RH>L^ zRz6Ajuq%@9uW!g-3w$^;eryO@?$i=~O$kSpo~E3BG}wc^!6{LKOR-{C0at^g zY$zc4#|`nrhhQ`{wDPn53&tzc2k|T45#Jq(bAnkhlK)c99Nyjp+uFOsfZI2AD7@dM z!)otynx0SCzyE#%DV8d@`11)4AWWc*34Uo{|4fZtgEbDyr0oci1y*kcRG3j+|Xa`oObY?uT&SCL``D%%(^HHn{D@U7*A&L0V&%y|8 z%Z*S-vIqrtduN)d^-JNqeS(+DZRJ&|V=N2;kU-=(BP`g(zo>Yn3uh@E>8p&+DmW>~ zEKE~~4D7gRkz%NrQUylOKQJC5;d@ez<~dPZLy9aeP15!-p0^5hST( zi6It1n3pB{X9D|o3*Z)1uSeT{mD_ZBi3FlKw1d%;BGGPx`C0iPt*(y^sLkVCyn?70GEzpS^ph75f$le$8+#aR3WG350nzvQz$AnrzV5qQS%< z@LV|2GizG$>#mNA$?)Z{-K@Y~MZqgN7!H?k(Q_ZDXT1=AmNdVKSWOQK`AMX63OE`f^sXLhg$@Dmcux6B$1zfqCKlcp9 zpY7EOoaP*q^>`rJ*VigXhGIW0$~^59%+1V&W5c|$&N!p3cG|ok;b$tH-#7XnEjyz& zD~h+y;b(A(k!Bs4N&dH9SQn68m^DuEd*_}_^jvx$Ue{s~u$&y-na?dij)pclLf@JB zKpntM33jA-|Lv44n{GI^-ab!dJ9u-6Mp;Th08{FypNz*yc8T_JMisSFvvng&0XJSk zc%Ono$|ZP$`{tRG<$Uv|{@BBULV%_++sHA80}3V9mUlIo0QtHf)Q&CGk8V|RBPShL z=80DpHE7m#z?FB(*B~$B;JwY6(<@qa!6o?TKy6!n^d)u&tL}mZPTg?XVn-nTBY-U4 za>2b&2#6L~yE7xefp?}S%h#v`iS5rqr3+$5FX65Ny8l*NLr!;YG)h*kvaE0qD1Pl1 z01WH611>{1LKJ7%O{w4E> z(Po^vI)V}Sh0zV6)A)vIQdsiV^za0|*YuPp9$=v63^>nZj48iQI`>?2x$rHk@GEe~vl*xK_ z_r3;rZ4v=#lt|(1Q81;p>sg2Tdgf6_l?UK=zJq@k5ZPiZc=^H0u2BM|(22dijqvxb z_;R0#i+K~@%R&C-F3z3gQ0#YAgN2{-lEXWsg~QNN!u1{S>;~jUjyuLC>+v}F2f~K= zAx+f$s$pmQd-_ntlIo_7wGwda5d){1Y5V*SjmZ8c0_%3%{J#kWCoztqFtfTuhaXG3 zaqS&mFN4Psj3{2ss{iU|nXc}qS9o{y}glI`tW#`iOIZC5 zy}PkNJ2oHJc_F4SB;_9)Vo`2^lEmt1cSmBRaQhC7(uJ$wi0+0A+g22Ydeg)}eRLfy zgCO`p>v@!Q_eZZztIF>?CpYB`cj=nkC zYR5;WLn*(8?DRTa@KEZ%!VDNQiHXt}L0t4{=oGJ&4Sm$=jN zY-yIaEYqoZ)iI>w=o*l0Y9r6W9dKI5xjkvoBmMR%hX6m~ZnYCRVMeZ1SO2+%=`GxSuh_qrRP>Y*ze9Kf9|){D->;`i=VoZ&@g83k9qD0N_idaosavdAjYBP@L_P=g zV`X|{T+r)7=ADHWw!AkVP-7k6+Gba`cM&M+l3&CzfwLdM>DBH1?sei!;e;z;^q2yo z1EZ*A_nvQ|H1Q307`bnOBIGO{PIMfRX!I&0>dbT@XN_ZnN~`2GZ%_p|6D!5-&zOj-(+d6s)y5~QYlmNv%H5lh ze$)4G|E6dB`r6}1ybfI;3DftenK*30-0b+6@w!~=5h02I*k8&4E5Dgns@3Um)vdeq z61*=2o>*olsd&OFTtI0?VwwS!%n{aW+ecvlBpRFzkXyvliVO{-<~zCwU4UDGqJNhKvF-yD4h* zqDhc6MU-KS)M;^4=l+@%-!Mn?A*;+=neeDsAb;dQr>5riT#k&EzMuqH?N))yCGWwP zt68BO;cU?2z-{K}k@#^D0L}2wRjzr*y;uTrvH{ijhCseY{vB1HPsLrjo-yxC3IxEd zhNPr$EI{$+81yK>NAlwKuqQ-nrEe%pyL8rA$4sc@(Hf}S z2L(8o76C^ab?Q~3GC8O!5KZG|@K1EdznR+|>|myNj%ZTAf{l~XMwqe1h{*3U;S9Mp z!#Le6^<{AqEogUFO}XHxvVC~6B4~{psxldo#8!14c2wq3RJ}sMX7`H4XH!O0_LqPi zVFtDbfrZ=EPA=FjFE- zX)n`6a7P!KdN91xA9XVZ3iXHUr0qh^9{D?lvyav>?b>jYuUVxatrsL@%+Y-;gNaG1 zYwDD0S5*{GQz!tD@d>Y$R;1y|K2()VKjehFf~2w|rAcVK;QA$wiGtnbi%je4Qab&S zr?uWlL39mlg1`B+LJ@YiQK~k7lv%MJMu0v~lo2wa6(~=$WV&TgELYlD1eO5#DWKveoJAb5s$qAmbhL&#STu{$XBe}W0RU^hnyF}>C!UgC#Rdkwc-5}WoeLaZ z-6xf~Vw?6Yd59E)p0&I)b2{IR-K8srONJ~LJ0^NBltfD#*6+1EOPvi-gjAzWR)=MJ z(8y9Qgt~0wiY5`DTO2G6O6&Vg?e7V*t`QDZ;!VAjdB@sbcASC_0{3*hr*HRr>@tnq zus^TsJ!9;AB68LzsWj8%b3kMyR!lh!@J4g4Q*Gmc^LP;xXv`YUyJ&&=voI{^nb){l z_47MY7zx#`PPgRSx(0W#x1)_uqNpni23pjf#ZPFI%@ZHu>921MWU`9)5l95`=Z6Z5 zS8xw+Fg8VA5k#@O72-YdV$wl7B+D;j8B|It;W6k#%mV1?^X-Or5Sh%KkN4nhPy*z5 zUBYVF{F6fsbq;W!Kqy@ zQ5&b7I3W5sQ+*~h*0;}>i#;$Fm{UM&Q$Y6{Ru}g0=JgDI80OP>4Wy}Z9x-tNz?$*C@BE~-JhisPXsI|cjfRSX-S5>nn# zgRzmdWA4(*_kX7EVAvSL$WXY^enq6zq(U#DIaTl7~ z3T9qiPFAEmlq&-khGbR4Z5)trd>|D4fwh!bZcpICb{mpLZyt3}diVwucsHf3zKXNW zta@wx?_ed~GCOX%%-V4&vyxDSYcQ=NFn0=|kG`ouRPSS+OL~HBWV%;)t?_6V92d2y z^PbJQu^{dPwW7ca3wYpJyc*R7{svP#cC2FXA7ATgCR%5qK|)6%(JyO^cd`-$`hH!o zt0c`J>tQ$c)elcPC6kpJk{6Cc0MKB~ zR0Id}LtR*fWmnBvWgV~|CFDG*Bkfi}tGJfIny}L%j9MddS<%bJ_~b(2^0bNXqgP>1 z!eVE}z(3RHs;!e8f6#t7VZ)dedjl?*5KtpG))r|JL||M{Gg<~~`EFi56wJ_<3X}D; zc)7SiHB)5bwT7}IpIKEJYGe%r`t-EbW8Yt&KZMKj(fB6+EG|1}5v*ZRyJS=!d{KXs zFNoQHNVXsi2nJg|oeUipKZxf;qz~*Jo0h^P3T37h>Kn zRv3=UzQvq2O;rA|fw3}#P;V%-z8zWfN$XwFeSWBW1}?M!Bc765FWKtMzR-Fcz$i0r zw$~kkDjFM-tg_hbsb%J)2l<8fXD}G`&VsQ5IkzD620AEbgid1Bx-s%ypmW6p9+dVy zsxF$5xt}S9S;$p?>()gyhA}(Js4bcCcSinani;{?sOaC@rhb zyTLYp@)xIC>BzK!oKb`)W!s82Q1ghDyZu_Jx6ZZy%dP{bVP-cUu<}9e9KUlKU~u1R zj$dxvUZC~ndhf5?(q9OLQsHT5(eDF$Av(ItW(SxEQo=JkO(8mkpspvg^*vjHL%@+# z^q9b-pz6GkkyJ&~kxZOJux)0zPd)ZqF+7*@Q&(e8KdHG!0EfG^UIpMotAb64Y1nGqg)srOwP@W^Q+Z&`)!@_e0uX*j6{rmHrWQ7pPt zm?V@TVg?$gl^@Z?F|_M~ljyGxt279fVlhk3+nwz*xPMZ%?~4ntil}3#x$x_I!<351 zJf-!y>`i1u%JW7dtWRva1ekr~K!18>RB@|T;`HN1Yk4AEDzCIr`Rva=k>8FVGkS$I zAd&zlT<0Rf-CMV|lU-Fb(W|vY1FmSx!msaPZ6|063xv76_(t(sMRGNVBN8-u#iu&O zd!tEb?T=K!Nqn0Ak_2yv9`DT=?@u_uc7A`LHrzitPr@7&uL(6l)=L=62*FVQ0_O%K zO?mvM4PEW|>#gv^?sZanG0`vKb)xj`5JAX*7JCzyw4)Lx0dM>D)FZ`-BF3><4kU_( z2or(p7vQJMG2u^(&x@B6RO_gf0O^1MHy6YKy6Rux)RPKw?Wznl!$8Ut{%CkJJNNJU zl9mKozwbv_EA*uK?HALh>c>B5rS*!Qw+`7I0ueTh*T#{aPg7n};l15JtXb&rG<+0@ z>S45ZfyeHOqPsU`T~wB?0(q7N0d!a$vO)3Kl0!H4asGCB0WKD$Me(cCi$$&vQc~(_b#wh+tYu)E&LUm>Y8t_HL~lJZI|3jmj7I)n>a``0ksZTP6h%Gl!sN}? znxUaJU)$;+gMC$?**~Nc5c~r&-OxwYH-Y2Av|oY>gKHTpSFAJWYxUcJ+c}F)6Jc0( z5ens{Az?$909kdvu(EEnwJ3LLs4;^H4ao->94Q}B{dyY`%O;qN+DR@CVEdYu?3tx! zV72qbyt{k7B6FSl4B~A;YH$<27|h(s5_caubM5MS^qf?gz@n|%-_8W%P?-uds+`{0 zbK2)Ok#dm3m9U1ZUN<&+Efoak&R6$8$QpGxH;(u09O3{bCXyG-jO>ITb=g7hJ&&-p zTWH+0A%kMC)sZX>G@9S+5AD?YWQKkJoYaI955qoed5l#E%Ly8yjppUE z*>X!(V(Z7pg&UO(ZfPW=R`e!!x?q-UhxwDqVhcmKzGlZljNZBGR{nw z;5Zj$sFh6%PW+uP48V_dbK^z1QW;Ct<-a;9X9B#;<_oj8^_%J>@;#N z*)1Nx`|B14wvIkf6KeKp&(E{|f$y!B{!TK<$CqqfJji zgcwh4(QQG{?2e(h*WFZ+*>enP)x%5Kfzr;dHhEB~kQeKKxH1j3ShGnvQEC*c3vr z8{_2p@c!bEep|65C+7SZkjehpBzzuv4hR;Xcw(@v#kw>gjT(wz>6oJbMuRnx2U5EbJ}Zd^Zjt?FZ24M=@UIp^gFT|=WpmdVR5E+-gpKmFXK28 zKB;+)*JXRqE=94}U+XTMnSn-|szaq9{Wv0ZvZ*Ba|Mtr8U)?V)_^=0iw`hd}r1(20 zke*JmXKzGU+TTWeU(8O3K2H6b8ZV1L+Mau(Gz7qnB>ipd^`1+g7+t#}Tkf+hc{ z{|lnLl%;yM0mnWcj+VM|>&1D5U`EEl^}0`?J$XPT`|JDj5Ct0h1!J^LNll|O&6?_G z*)W$VqKd05iQ|>PyVrAyHsRV*y%DLdjQVP2tjA1PW`0CL&#%h65MNuw68Z!<2Sht> z9y4ECAECd!9%HB|k1$ccXw`nD(4qPe<%IrMM2$x|i}Yh2fwVc?s}50pJRTMY#uWY$ zq(J%kr}UoT?7gn(7tpHS)omO4^TFFGw?)4>J&K=5!;w%Z$gvOae}CzJ5r)Smbb>G# ziZj7rnRtJ_ZsG?A6>!Ars$PSwARUXtPcl_C5G|a4p_j zV_|_-M`)U_$sZ8dDPZ z*HeU7vK9kL@cvw@ES1pdOih?wgzH#zgC2M9-{lcbyOm4(P1~XW%Z7tKN>LJ@!<80M z)M-fvE4}LNC^UY@-s*poP@!p4_SAO;QtlH_x)n7ELi!;NBIO2Ce;w>*C_fEX_4Bus zawF0_K#}E9m-_RZTuMeKJ(xP?n2HFUn_A7gSnuTr$1Q@`i62q+d1rETZnma6k@6jU~OA?@wGrT z`T+^s@3rE97jK_OnL9{1i+VOwr12zX_{)eK$8nqp9 z___viI3NFe`0+M2Zi5u5&+ymMj=;iY@Wpt)DZ6C*0|S1Gz}%4{@jzY@<95a5QN-rH z8Gpn2yb1X=@rImn8^RWegBxXMdw{ z1u@>*#HIP9Z7-|CaC%@T$)U-V8xH0mN@K4aN5JHF5m5?h5tNeD%07b9bt&!?Bj3nF ztBCHMzcKHSEDGdctxUtbeY&OO#hQl}S11Hi4ul>6QxZ{FdtNCvi^xk3c~;a~d(SD8 zPf$(&xh;g?mnK=^_^02^iF?>X5|7cjveU5=#2_%4xn*?)%mBEw@65nG$Ei46dJ16@ zGNbWP>oGMObkDKb*44TxR*&KEo9@Cgl*s?~9J)VNLd0PyjR#MgxyBcw@)mHWY z;Tbxs?m9y8elf(h%XMy0_%goSbM13A1H^e!XoaD^{Xwm0qT-xGa_DP`+^2_R*$f=` z@HSiBGaz>EyOsHOe)EBn`I#-HLQf5I{-t?VV(|uEK!uGeo5Ji`6amqWanMG`U@rJU zqsgU9(?@5Ac(FA5`u2yUns_3QJQDWTRTYA|=@g{~@dGD!LG>WAj25qm>NShD&2Xc& zqZ0{b85j!OJXSe#vMa>|fgoRFRc2Hc)gl28Zrr~S6EP4@^7{AG8F}ZxJG-r1FifY& z>U?`TWAie2Ms52=du5dFNGY8N$+kz!SxQ%947YRXAK{d7s6e1J(&P7^{_9|*Hr|J+ z6`%u@FY48J>YV17jc0r;gD?ZX5WQhDah+r!Mda}&Qjo@&N#!2VC!nv%N2Vg(9cmWB z8(6NoU{hGtZf2x=@iT1}$%w6GD1wY1oYDymc&*cSz>O96QmVrcis^ z_iF7sPlLz4f6im*i8tv#eg&9ij(;70p+CVz9u6rWh<}9(sYQ0h4@Xq4{j#k1`cQT>2Q6fcEZw4^PO0a@VR?mbJ%Bi2c$?sV zEdA;%Js|#&sac;GT#w|c0EJOcXNoe#J_|gevu`&UUNYj8>21&_{Jh_NP5|*;^!5SK z@<^tZD-tk=y&8NuVL*ETC;a<7R_M8h%4926NO??gdNy-UtUYv3a_IDhk`QeEVSJNG z)M?|mn|YQmcCA~*<6A33qs)n{p>@;c3Nr92N3TDCw4g@$I%IST$h-|f+7Rdim_ex8 zpf74XD>`8GA5+dSr@NBS$%bb*2*Kr$wYM+B*x9H+@H^MRM$^wcr%ZaPocaDG7~&Mb;NXXB^Aj-~$I zX=n@Vk@x}j=73kckv@ts&_*4g?M>|p5mzdKh^2%0V7N741Yp2P2r~}Rek0?V8TP$vN7yV=;BS$Y9AlxmqJr zwpKgsC;n^~YH*9QyV2IA?T7Uf2VTh1pOewA3aBBf(i*yT2iZO}R!RyKI^kx(AsBv& zOvbNUdU=sm(%|o2D-@q4w&Czq1eyaRtba?xD-F_r_HAwMnUQ;rl7Hnb>8-3t#qr0oo~MA-W1E!BUB? z5XKUwXJ@(B<$^ug>^1pAZ#KtMD&zE)FVk{-!MOg1iKsW0$p<1gbjw}`wjt%8yAGOb zdB_n+f(_wc-#1W`QCiJO4Le?K$h$6!PE?>nEH*DJeLb|nu1^pR>p4IZ77=M&fix8T zYU@+>VC4=+Zh6B|k!U`#*mT;E#b<3?IhS%>(9c>S#Es1M!v&eQb$WOBg#}5dZA%M- z)Z^zuP|@->qSXC>kaVRan?u4dmXoE+=swa|dyKm43dmBw%#v`3E%FZ;K;L~D2+zsiV55HWsPpHxEr{R$XA<}cBJ`3m-qt~*aP(&B;`|gNF`YmDNG@h zV~1!}J@70h1PrzXq;dP}Ca*>k3#t6fBL*X5bWzt`w9chL|U#&ipn zlA$N`>ISe2z@5K-64jdpL(mK79rRTI8$8inXE_&19;s;tO3|P>5zMQCDj!uN7tZ?0 z{QJS6aGX~b{whd}40y!hj5ikia22b&nmJLO6MW|zl`dnOvh1DqR2|b>ZHK0&QQY_- zYBgTRGXZ?Y%B0e z=%>!^bOta}xygB8KIN8W87DO$Yk1&!Vre{3UknO4Hsl;l&$1A!*l$Uk8g5 z;g~V}M@?nB8P8t1XY_lr39fS+9z+j5d);dwIOOLk4W}VV;}Zr}LT#gbzH@DeYaioT z5qp#-0(S85tj^fN^QdG5$jT>*1@rfKK5x%Hc2w)C?JD_{pfw)|-uKfiBjr*y)?9pbq8%)A}pu;pN`X=bhqtdV5t$Iuj z9=sgMahicw8z}3A|KPG5+U!>~Z!m1BzEI+(kUuu;0x*!%=EXCuT+pYOZ<3T?{@Rtc zK$jJ|3|(M#QXPVw0|m#O_{<^C+dYy4$7T2QR8}4*OkI?Q z4|}I|!vt+aJz+%8svW#A#=c@Tx-1r5Vn&$hb7>^38t(IF*9?e=rz7YJ2P@MDA^wre zRBK!vP7u570$2jQBCoQ>OH<)Sax~>V8sOM*gx48VZlif*U=-C5JS#d=7Fjg~o~O`8 zmG>pT>DI@c=mBM;TcPWUQ^(}~(?R_79w`scHZUJN$Z_T+TH|q24WQyK>vB-22xQkN zCXmK6i-iJKRBzE-MGK&PoPNEUPkYGwaVArKuqx=-Jfz~R3;h+XbemL;q1Q1cQhaTJs5GI$#Bu8H-hpt0xOjR(jOqWLm>u>}U^~hk? zyaK>?kQV{#ODF@t{d`+pbMp^VvukB7m9|(#ZOO0<64pdZO#Ncf6B!?^u#@bnBi4Ez zq6|z`>}NL)vk>G`c>+!b?(bL_Ll#j5mqo$D# zWZzatARA#8CcgOJ9%oXt_vy&R60q5^3xIT8YzgJG8^dm2QL1gvUJ1O{ue!|8cfxundb~7 z{;RPyFh|FDpvGH-c~l7^^}Y??MVuT2^;LnLtk5%$z!N8G_g#f3x;)5a^j=UKrnKs8 z*cF0jxP4N!BmQe=xW(7VX3RBbr+}mE9|c3PA9Orl(u?6A{rY&;tXmlHl?N?ENqn+F zvN1!WOo59O839Gz(I`dn6j!CX42cN7FRQ`~Lf4Hp?8Zm&{n;o-&#vIkw(t!qE`y8? z9*E5M&usqUe1T~DL{-2^lcc1-uS{=y*8}Q%Qq8#!uJoyltc?URsX8IX7;WzC-ccBX z<5TU4x|?~xR97gavdpQnXVScR*(9KjMm=#nx%S=$h~o&#@|`1^y`G17u7Nfvf9xGO zqVd|gdQIi84GGXR;|#}_`90|=tFwv-!8=CJgM%xq!DxC>SiCWUhG)nw*^`vv%q~p- z1hKd#w_eB(hAc7jtbqEv#!!c9iRKK;%4`-k7vcnpt%L?{-(Ia=PsQJ6a|qf=Q6u}W zF5`|vNF$8lbt+WU91htTm?@VVEh$D0vH zN)sWN$pQ`)!oY?6a~d?vU<#~n^ch`6S8%Q2yH)X!VTBb@lZPZ+OOhdJ-2Us2H@3&% zu1CqtVS(8N4!bHTOt=k7J4b5gdQZUy7=e0)@L`iRyI*BjORV5~ua|y+`iDI&O#hlB z|1y>br~u=If#0aSj&KeylPxfX>y&XVeqOyCGZn+t)i|x6{xBR}-&C$kB>J5Q)dd=} z-Ko?t6ogg}ln%AaNt?oJiO$Hvc1cz;)G2v8 zeIEU>hfl0Na_-Z*YXKW}Mb+k5c$SJgSn0MC0J~|M%uvDfAh*$@%ac{*R)mG<+7)ls znB*w+>n4Y1SyWLjrhL7&{3KoKD|PVDs#?@pH?jVgds?{N?v=!fT5OTYH0r}zAkhOu z9CQ5xyQXp1M*&YpK2p(PU!Pkinb5wUz*&COYJ7vs* zAr>PcqjQF`F$^gRW}HChflt~k6~+y8D}+BOD)5L_6R7PaF#w#4k%DyQ{_ko?(;025{XyU8?oPX5O~nD0NEXI8&?97zK)^g2t~h@Ea-%*NT!OP zlw>c7pWHD8pmWwWot;xfG?^sXcO~6Ekftft>4q-QsLx(QXtdzN4+z0+BD! zaFJxOt;uFHezB+`NeSpBPeV?J=^DRp@?|3n7Ja`kqxlys%UnD&EovtiX%84X4*M~5 zKg%!|9FR32A^Rp)mg(iwj+xcKPt%HZpPErVQ7u*>$FQV{n*=>IsYD+(X#_bVqk7Li zITpgUwNvt0ag=WARB@Xi41+NhH@tX-vt#igVws=~%o?UZT-cUS5IR@N2eTYVh`mC13*aR>o{p#`Hc_*`Q z&oTFoYQq9h~X`Lp{iAKtex2q>h$eJ=A zk$x4c?LXw1I#|gQ)6k*Aw`N9P$TdzbvxXWqC@l2>Q*kgsd^bW!f>Ea^4gP8rz1x_= z$@?xtHmkiYA!(5k9~t8PvA6BcNoZNI&FaxV_r9R5C{-7E!lC^S+tw_N(AKbcw4R@X zW~i@MR-IFD!P|g9MNc}(a}2IN#3+r138ZZE%eq;B?FVz3uF-PTeX@qS1s1dM=+2`b zyoq$D;CljQ$pleK5GY2NmV5OxZAi;-a$St1E$QBS=s${TTx5M> z_g8duV$Ddf8ZYgWLfYfM0cYm5iOw@I7qSw)h<@()1dDQy*_Hlc@Uj+yBmuSRO3{Gq zgihk%^bz#!w2~r=v<|Gnay7+E8SrRNjht1>!mIAA;$yPIJGY*Kh!c*)0(nTLTR@_i znJD`qVH_pW*foMJf1o1H-jBB1q8I6^jPW!&6^1hXprWzw020$^O$c0_^P5i1i^Z9G zQX(#efBzcOB>kL)6Zh7gTJ^3r9MeRI(8gY{L#)gQ;lr*}>ZF~D+&Uv}MCKybNk|6f5p-a9QwNxln36g8C82ns!`b9(rIe2K_ zzlJT>eA)E<@NTJN9K*ne*EMbd;q?iFgi-NJ^9j5f^iKQH@nMu?wU_@|anUaEUg9rY zUEd$wT`up)aGEVgApt21bIrha=WU3Md6rw#!ci|SG$jLmv2e506J$ZC-;OVHf~PSA zx~F-IK8C(vkePu!7tU<7WUN|{WiX-OF*2Qv{m?49x1id4L4Me=g1e|0n2rcHxEKyG z2%Cp4&h6-DND`VraoNwd91q79$+a~eA`Y=xk<{1ZsPiVjeiBxwIJOB#XLWPe)t{m6 z*V)W~;jCz!J+{Kn!=Y-Kv*0Bqv%Lzg)g1U@!IZ8wIfibq=Fntx*l;;M(1+BD!(KQ`-2Dc$oi*HX(e7Kuy4rR)HMIdfC@laz5b$)s=$b8j4 zm2vknqd)b;fv2hk)wXz`2tCO+O>1_7{6oz*`D~bfbCTr5#p?;S^zF>TY3qbf)U3;o z$e~qJ-ja%&E-|zrR<~>&ACbrzxLP-;;zh56eC0pnYn+5sBwq#TG<~(hVKO~Bep)`s zAl5qzcZ}_m-=lP|7l>`VuI3YXF@)qfl`-A}nV6_MOQVOC+eX$Uh?f#0VM4wF0Qp=) zregS&kY2wHfSkFoAUSMf1XcaKtd&N?0JAV~(a-CB9`#3x^lHh{qIpxaxjnAc^g`Y) z7%7SNg(;SLG~#iyg^ZTx5fc~^IsqQt4_@5(j*7pG!lt6>rRIKz>#5|61H@Qfx`gF5 zxjsoF1xq|^LU1!8mbl?x5ZQdHy~g(h4*!@oeTc4gu1m_n+{{jTj+!!3{zYDf@4_Hz z-QvE}1z*wx)AF+=qPzfe$4?I%$`?!QAvG zwtbQ+oVzk8d(+TNohbsuxe_;B2nJZ;se>jt*Zleq06jp$zboS%3AM-)g~d&N%PT zPhde!@V%I|uL-AKMCk7pp&l`-??vYaA0v(q+MdHNh}`$NVc$2@ureW2p}rd&J}QA$ zFx5u9$cbOBEuL^+CNVE>%(qfostIzvmKJbf`Mjf{p5WDNZgV|nD1X$qlXK@hC(aXa zgTM_m6{YxclO77HHPrun?!brr$UE}Zx0NyLCl2=Fav$LlqO(yIlvf1rZ*S-mLBn*x zy*ep|?Nl{MhyM|X$=xcj+Ub*!85{{GCcS0J_X?&B3Mi{Di;9o28Tg9!aVQ`KjDmmK zbC!pa#DL%BY;BrF&Y&0QOvH0Qqs_oVT^?&bTe6 z$r^g4*qN9!PR6EI#ttlppBPTFdf^CooSD3~q#!X`)3G~4+8;Wcmc)AD&@=fboQAv& zy^7D8)q`x~`~totrOaxWvz+)dkFEjTSaZxq1-rk&O{gdr5%ioa0GeQ+ypR4|3pXMOxhuQneRo!s9UE*AF9W zImF|n%U%38cHvsw(j`5KO@`an+8AHF5uZ0UU`T8o^RrJggY)z0Fc%54}^ZL0d+E3ARCNBpnKXetW@x!84DR5ID1pC>Oo zd8H1%FEsf-a3efl-{QMb(-5M(s+f`fW=11Lj8^*XI>w9{9hqHKvM)jS$65Rc}D`$U1ZmxI?fb+@0Wczb0 zj6-Yo_b4ajhU?Yy?Sn8S<<8|U4Vm5BX2k8gVXVbI9xtDG_#o^Pwx!16en$YW)Er|* z;_f2}r&9FF(h`prmFT+YDCtM5(yl(naz;7dQwxiyxeJKT>LZ$9@xY%ijdFg%r6-vh z%5U!dlqr-_lw9w{0bft?w^_XC>FC+kJAw|?DjWUv6y@We0R?nj@=>9lmh=j!zyOq6 z3$zdv?C;xw_(R28wP>qp;xxF_o)DPk{sl_P2;a##rZl|Kjq7i};9W>RP1YL1l!ouo zz%FUgsueDg4i1Cw*bwE{K5)$mO9abeyfW&);yndPD;2H)ohAtfneU)-4e_&{cgos) zuRe>Wt~wL7!(X7Vy&7nDXcB*@R$wf3JbbBUp$K^1Ot|rViS{cM#apxK49M5{qF3e< zX5t^iOaN{t>S(mhGj5gG&68bZb2mef>3@zi@NfwRH4OPWbeNyvG=AT~0HSsDsXly3{2c{MP$(#>QRrK9F&sZK{kp1*N^4#qFvUEG39+ z>+291%Kc0P%_i@MeUrS!41C8^#wvzYt_Zy0Ix@TC0z zis$@LI;`PWE)#te3Bb3snN%+p_kx~WtKs_%sJXx(n1RAmec&<~kinRL$B*?d|6qA@ zo0fauKi{M@u>(zDfOBYJH$?-#SaDNT^oqov-=Ce3a(H=!BclR%@I-d{S}3e+r@T%Q z`yaG>=Cwf4%(;I+gF-OBsI*mo&*9vcVt`q;+OLy$)`6j3ID;zci9a{`BRX6%LjApE zFP^CHsqZ`JH7af7tK5{8@%bT|ZO4m$9gH{zwU_pT?#Be?b01e;wX1J0k-TU{{ws&7 z0e0ar02)f8P%(ed%ozi7lh9$SN&!1oBk4||WT+LpEplet;*xy6VD~6#l?(FkI!Zyv zE4(D;%MwZylYde@X^8H*hcyQ>BrHySV=5tJxJ%4N_p)|gFH@a-AK#Ql%5xBP+zhe} z8+H9VSK#nz3XqBXNG$k$tTCc37XZt}D&J?fzKtH{j;WLss+Pk42Qqwn{@!)cpgo@| zA@!^fD=lu1P|2gi*xL`4~4~U3x>qo!AN?@MCPCxAg^D)-?dc% ziNzDNP|8=*b^3QdLV4t4?qk{z3E!W+jkmZ5<7KpxzJC{0qEa}Te5)*jL=Cy_NaF$w; zftd22GZOMsC5!ESXsZTkW`{zI{wvEJkspR68I=$;wPZvRQf`^d61d}lA9h_}2q`%q zE?AI5n>q&O!ER-B42L^9-5Wws4BG6^XdVKzbtvFD#FiIb{sf%a8l;lDGF!8grS$ms zKZW9Epjv&i)9;&c`V5hP9eI{58mo`AvKu?V1Jm5!)W zAh54~+FlzyNxZtHmM|Bgo6iAg+~tX-OU1UbMYemVa#aXK87yYOu9ZWI6gWqgBL->r zCS`s=H$_%#!;NYWz6U@9uRmO1omRFsP1Q3hnCfYa2W@JPmR2zmgKrzPC@a_)XmyT@ z{y)=q4*z-;S;3QLfqwHmH?Lhpo7B)#504T*1ZB_^YTba#aQ38XM@Wn4r4ewC3>{&c zj6dNX3XmRIcTL)@R?6O6f>()ULXz#J;X>jZPrFE1LU^Lo+?rmHhAlV%bRAGwBk~8Y z9?@_OJBLg7nu`K|zBTN>DnuUa8GQE(#2=(SOjT0RbsZTPb8Lx>+i=jH5V7Z#lLI|_ zDT~HOi?^ON6PouWCwu8k^*#HwBEeRPkinbhuuZZ*esD+AMw;Llupw19)omoz_{1@=^4-4biR{ zV57{H6c%qv!f{U9G#+cX+9*B^!{#mDtxPW#^(|0(_&%Wm~C3x@WK#8Z(%;y01CNe=EsG2<>cu)!&cT;92-n;olq=u!m+Xk1%go`85+-1*i)#r|$ zt{Ti}JU`tiW(9~Q92x+-y;0*5E7n+7rKsaLPU4mNK#3#M7;N3uOv#>k^`_J?YoYlu z%_iyBUVV21f8E(n6 z0HJ=A_lO-X!qG%so_%OAhIPV6R+5r1RzDk zUK#-=o?2o%Uh!VC(dv)v^iC?bpyT8mN%$(A-dQ?#n)&e)fmL`-3|QwV9Kz2DS~zES zUWXI)*>AG=A6k(?rpjE*U+>p80CG0@QL^e0x;{C+!Azn6ux$)933^Lg#*EYm+$|T= zgIz!G0+v|d0xI>rQJtp}sje5bvcQQ0G9PUwey+l}E9apPK%*bb2)rAWKk58NbeJr6 z{iCiV7VkODeCN6Z&rg1>Wyw!HLxrcw;iXLEtq-9g992ZFHw=CR4in5(T35nzOeE0v zKEkPm6qw$1G=6lMqMYYg)W+ilu`KoCPx=9cm|ftOU-zHy<=U{j*%3L_+gco4i4td6Bfa%~BpM znH1N`%Bau@3Q*GAmmQzp(Z?A+2JQv(a_dq6DGG%6zA%_(4 zr4Bh=C5Ev8Oqn`Q3Q%t1A}~K7xq3E|1@`wEjH2wNhy(-nEbZD|N>xN!ra~&N)3OOd zlcTZ(W}s$RFdjBYlPrF)Ju(YSbdg59?dyJtF1QKk%o$feOK8`@rD`>EE+7Qx#lr)< z`I9s)r#(f^?!DK~6h~R7Sf*n}mTlxlrK5}#uqf;JAcsC=eD?-dc)EE{E*2)(uVSbq zC!8v(nA>0trYF8q*>M?n(vuDviNpE~0OxwzgI;snYhTZ5h%s&0;2glGxd9a%d{4Q8 zi_f7aHjC;vqmLw`$*Yx)pKVF8(4*5)@dZPC^_|*oWqK^;UjGXfH-=K0#63B1`0HeEt0xDNZjYjD$C5kQ6a=h`Onn{pTsVsch7HiI!O-wPXL~$)#_)PGnoXB z8?&^7LRK)#{w2H2;r`@GPllH)eM|(Y3`mkfH|YrH*(!~3F%xqq#?w+hT8ay~3&%W5t61#3aH38g({qMcR?%sL|{GlaW2l|wv@c%4v zLvj;)0QR5i5KSVhgKEFFp`IuHB(N|Q8;3;Hq+>(omfnq<0r`;JoB1L0^G8`c z)tny-Be1;g@DybFwBcE?l^$yme$}+$@~8)pDDbtY;KWWs1axPyh0d`)=6qU8Kl7{v zfH5Z~8|q6ms6>R})MMOwmnwh0@sh0aN}Q)lZd`FlOdt+(l6%gKTI9+0o;Y1>*gc(rcU(cBheb!kCRt_ZQ@D_ zu+prwCmUGo$uTB3UG==fp4R2wh}8}1GPt2NXwdP?3hJsd6rZg!53xWe+L?hSRo4_d zB2?BeL*Nco^V*@@0GSsT=f9w48$wCx)s2Gd8YNKS-3Cm~DI4ElRevAKl!KK_r9G^> zk_@izS`yOq1Rpm21ce?{fFXY3z_Cb71w?Vh9uNJ*F&)L6a0acuH2+z2)+jaTjP(~G z{Oxqy5YRDz%9CDGtsR)>>vz1fgOY~XdVT~<@7z7aX4-;(lgH{ZPOSKi!MS=rZ*|Dtmd(Ol+ITaT zY?!am&Unhge8ncqW73w#IN@o+GkVfs#*hm8qGQkcoe7(uuv9|AqJi2B|Rc-ixb zH$w_Xr+?P=o}v}tE&v%j0s>=43ZlEQb=pyA?QSwMY?wwgH}QE%u=Z4UuQwkv4WNt@jdF)69weghSr^Ayxjrd-ghmd_69f27Xl#&=LIE`A!$Ylhf+> zBIwG`9Y~h|voW{CeiQ&e3afXhd-w-DLGm!WT+ zkMsLlD6xR6Jn5?VzF|BYj+kdJg)fgAz$ck9)o(y}s^HQMe6N`~y=<5858tGJFBrE_ z=B|l}hDlXqc5n)?5o(i_c*Hke4M4x&+VvbXr@_>4!o+&a<}q0=WF$Q~igA8}H*DmY z``$>E51!rjlzn^B_7ePA zc~V|E%UrVsJ?%dsXo@A93k=>ahCVA7?1nl9adv2}AC2OyMNb-t_)ilVi>4S$?uzhB zR9bSqxMzl7vhpNY7J>fCvCTPytLTz2m%V!<>U7ILn`#0>n$CLC3>2zN#Zsza!UI4Hsg48G}o z6Hk@u(SRD<`>CA`b*IFh+%x)NRb;AfBepm#UsX?0EX}nxooe8_D;n~aX2PL==%TOo zAnBUBcYWq5GtiH#+_Q$XP7Q|ShxkG-Aii`+$V61uY&onaBpbFI%Z^A>|7b<`Ve~iO zBA`{e+MvavoT1nNB9KJBXoX(s--UK4Yl-h>xyU1Rr-~;lx<4_{_ZEe=25NrVx#^Un zGUVLi27cy4_>SNwe*W-GV+c2uxz^bRpHng>EDS5eJ9>8Sv|HX84z|3i_Kit8U6QE% zcr6&Hair%kXn_LaZ+FoJzJ5WY+Vd7su7G12y*T=kFW!iun~)4zg0^&D#BGmM%+aNO zIbM7854&+i8Jx*UIv?{KAaP^?*55%39TuPI#(!&pWYsNaA#g%X(+WkJy&rlN2$;iT zJeyJ20>Oi$etyQKR*ES?SDyd%ryK`o%>XW@x!q&gXA zz_Caipm|VHBHWHMB}AD*Yf$64ZC8GZHh`NtncRL;9b}PM1v)uBqbx}m(D$mL-UhXNM)^y#WyDONNTiV&zGH@O!^@l43@DG} z$cC3vhFMSRR}uv;COW$cOVL{xrfMbxqjY~vHcd>KYfe~FwGruIY%P; zax75dp+@aXOr5OTt-NuE_cl{n996Kp3r z2xji=zm#C&1ptEDI##*O0t54w)yr4P?td%c*8!1HR46jxe-o_R6rBVkuZMK)n+1*3 z_MD=n>{zRc+lX)CFuephwtf#r>fTJ@3(7e52ypOw3Kv^7j;!wzPO$eTND5Rg!n%2N z=c{Qh;)7%$qh{|=qjWNOXqD#|yHwk5D5^i|!E?)7xdSRkIi4FS$a{!6qPFV=Hl%cA z!P$rX3#rEZEJ;!^LI8Z;VCGpTXGdm&d<_3#^_{K|fAKC+@LMI$z_G`p&&ciiE7J!J zXbLN}_j8{IVxYPW-!;P7nqS`%h!bs75$m;7M_su+iFii>VToCmw+d%r|A|bSl`tJe zS}5Es)eLA>eCMa2E%>JWrqlCSu_O!C((S5v?Ik#xjkrx^OlqY8=)AeJ+gmu4OLb&9} z4ScZWUq|xy50gZ*IL2@7L4mtFc{8W6tL&n=wQ5sETK=NwLp&)dCR%ibRXbOeD+H&_ zW58wG4zYn;(Mc=0?p0M5ZqPgirRtfH4;EpLr;nbXHK!#X{uON9s_H)CbCZ2quuTO< zw$%YA1-Y%vy?1!eM72S1M%*3;+K!Kghn~U)1nE9IGmNnZ&9ppIq;?cVBjNy!-j#h; z(^=J!$QHZgg>c3G*Lah1I21Xv_f!eU@B>Zzv(6Avc?is)QAJ{D-!<6z`*7D7epKa- z)ah*sq4c!}-jxarmK?WJY{@)bUd=<8)o^(;Tqr6cNjbKT26RtoJ@1h!IO(5<@HM$n zTOsoX&p&~0O{$)(PVm-F@dKdD6{$=e@I>QRNEwWomB?`Wb88r}pq7fOJOWgF{hGZU zoHV*kml7wF>_H8F?vZzxlUR+>H+F1Lwq(BGfX5F{i9Ice@&V|}3Xz9D^y3igN53nE zm+_@~94+ueDxY&YXchGr=ryM%$o-{si1ni+b@i5)+U3%9@78vB;Cf}=aL+sWfd>@L zG7XOVjh5C_!i!2e=v^7_&D2#`KA{mY&t!{V%2d+A-%JX3By=1b6bMI3urh)iH>@Gt zEpe0rSFK)ukyEcX!Nvwac!mju%pSiz-covl4-5mFOpUT}%OL+Yj36Hr)d4SpKGl&Q z-qoHyf9{GGog3fA)(A1-o!m0OF^}!g5q$7RHA&s$?GgLS?oY^A+yM%kZrYWy_p&I# z&ujaPpEWcB*oOhx((ezQif;x7<|SuT>_~U8J(+fiwcMsn?ev;_`=lpE)yQ;jf~W-cL551|$OyZq&~1-XcGwQXUH@eh({i_j$@1VhWLq6689Zmp@pFtOWb^HcS!smEMu^3FIfcy{mRD63{Drc-%@t?c zq~nLS;~d^wO2h(t=wbokiM-5R&5jYOq&^f2zwX{adAHu3R8vVnk%?yfW~!7pET9JC z4dZPjQS(s;JHy#IA^&4HLCs1D1K<%+2)_z=52NvW_SO8rwgO@_3k8LT;6LZF531eH z)ZXM*|9}n9#!HPMY`}LZjLy4gQOzwd+Bq}tep|1<(J@G+SVdwo8z|g$e_(UsZNWqG0S!?3e>cTT*|fPZYH>9wTdyn1wv6QLgU^jQ(@;gS_#HGno4}zd4II(jj=iHmGA_J~(0sJzT2qB-f^KHz zkK0FoI>|0ss+%ENL(-GZvSv;Jqz1uR$p0^x0$!|fY(ful#T;LU?tVGT ztD8o-tRbe(f)lq?vNa9`4Fb^b6e>{C!d#lu3a|1cpLf~So1j?{mF1v7{^{@`%z{Y= z7)Vr|QKuUMB55PqLMA|4ougki#HcbU2Rpj{wT{+&~9_s7?45#Hm*jhn_hZGSNo{;XV zwFU*yJ-=^NOo1SJuJ&ia9s@`Xlyy_ZgtOG9)7PCCMSs{|ue*7&Y&cCwS-FI7T>)gAsvj#B@ESXk?RccXo=rUczS5++P$^n{%Egu z>TaI=Y+eWa=de-W^kye*k;ad)tYPDKpb_)O0PW)xK|?$wVHSJ~!m%ZVi;4I29&g$< zqEN$e=tfnarZ(+mfwLw9>{xn5RkVziOWl;SOE*Phz9A3MN^ie-D%^=M4Eq(-b zq+R)sCv+NLdN95E#x;I!S$z<&)0H(m{hx7hm4X^sjMED*WlNcJ4=pSJOmy!!T^zcDKuT6Y871fa>)d75 zSqd`Vh0AzpKY3QHPxU}Zl#KxgR7&%qEmFGTj*Qe6=BL}&~N#z zYS;-Of^mp;qpc5iWcb~>WvR?94n0~%>cX(|E864FH}x~{z;RQy<1`=zNnTumC{g%5 zDQ%PI;TvC6#4md%Ev&(1x&I$F3f(*HU2nL(xCB1&Z|P$*Sdi1zy*oRIJZBY=q7-=p zr)PCP*?0G3KTT!AipB9;i^y6EI_ru3j81Cb$V82FPBc|6 zvxkI1A|2|_0FtV_>s_E!I4gkCawfbv^_X;O0 zjI)MtHOLpWPdNOeb2J*~T=_Lk|0m>e{iXqNpe))s9^zm8v8=*xc6kZj#%H$ELm8Aa zxDQxdlG?aNC*b_4p&)>gaej)QA_Bh8zJ7VwDD=8%`@*dj7Dp;9Jogk$3ltjV(q@+r zjuPE=VGPwOmNt|KpEfE1;mpd7jmn_|YQ;I`I@PQu$uQAT8;H($Qb%j*K;K~s9^vW4 zRXA_hrXz68ra=>!+XO397+sC9P7RXe@}Lo{yKM`pK?Z|Ho9guTnpM-R-0!-1U~_`O z?+TG3rdeki(I<}#jGg7RRyXlZ8r23+j-$GfbqrS~0=I+K%OTc@-L~%_Ad&MwI)%3O4tndhsESer>LM_#G;XV7#EG$Z_G|&N7D7d#c_+^^Dw>kqc}Sx=F5eKa;6&lDLumpgYn*%e z6n)j!_8m`E%9f}A^5M*9G5jE{;^x?dPNSvdM2n9)Q_>regbOZNZnZe2u_h@guq92x z6ZnXh^lET+AEIh0%8hI_7O7^l`y-*>A*>b%cQ*b-4EioJb)%6dq<()($?@2ZSB@nk zV5AqCPZ`lP83In+t{gcO<<`~C z(wd@23t>ni67g+DZXr%S&~=P){n3$UwsA4v!R8Vkd_ySd!I>jC5LF*zC!KSdM~FJieRi+ zZ0uJO(nK$kT9a$*$T`+Qwg{N{-X83@stE@k+~Z;8<3TVUI(ha@IfXXjdOcS*)Ou>-nl5TXGx zYsLmXu~DaW6ufV9U#qZjkWO+OS?gC>X&IOlp&V|(Ps(!9w!>zszy-D}+$=}>0!0cL^{|2|M7lK6YXoxNypX6@O@ z;6|e(lwVnScJ+|VbDzw{w+LEMr|96h$o{-rih}tqhc!Cbtn0nDGjN(5N_kM5+Syld zikbCn30aO(3n@vfvcQi9C*(J?$j1kgRKS-hmwhowQ&xU2z!UowO*CGlF0jJwx|H@f zxxRqpc>Sh_?nP>cz2DGK7nO_cu>o3uk!sDNc(vRkYJP(!i6;LkuioLikMp?pVZ-t} zn@CX<=A)Nf?GFM*mW4v^%Rt+~0H%L64LaIQQ6fvJUOIocyQ89#csaH^c;sf8n&fE` zZOMXpSdYq|q##r7HThp_aAO&lIruDFrj8qU5TE7SvohZHo(?lP7~q9Q&YhGv=gsAP zRpO*DafSOF1oL^e8iKSgF2-92$8>c4|rO2or5=o*P%sXRoB!mhWP&ET8reuC& z8j1o3qC#O^0mNCr23lyks+77_6M|ArII{OXS^ypXM-*2fQ8eV3dJ;GdK>spFNP!8> zfPSO>Zl-zx*{$d1f+!m+#j_Ul?v{d`Bxp5}W)%o?OlEnLEAoIshscD53F(*hq#Ov& z%#OG~VMf2P*<%R$V<+@Im;M+wDuYZEBls0zkzGThQJTPc@nGZ%?v45!gilB(t!B)% zc&ayzlUjEc-a3?DqT1}FH7=Q);cB^OswYk;WBI@`s4PIdzsVTkA&~x^o?vX&jfbq4 zJsbxQ@zIoqZQ3`nZu`1tgFI}CVDJz!{~A* z%7-ii>&5YMdr`d24fy!nw*L>D#&9SF!efH{ZoQMsyIZ?i*fj7wGlYI((${I-xX4C( zZOn&|-y3~X0C^2@g2Vc{JZdJ{4!ZhiYJnAJUk9!Kfum{bzZ)kT?9il3Im$SG&OOBP zd1JfbhQ>v!y;=Fv(L!YZKyoRG$LKSl+Kkg?R(V*CLh-UZ4-|GDp?RNETcA-;ULiVO z62g&R<9B*>JX6HW(%Nx*%7lZeyv;v8^YUpqJ2brayC+-RHKLkWhPiw*9Hvt(HG;|u z-CRj=dGcNsH~amyc9?grxwFLPG&m-BzKmiY2D>1&1S7&q2PlyaBYXG;i4#BsBtKqh zxsM`6(0H;0ck!@!m~zIS^MH>khJk^F=fFrMp*X-f*luVXViA@K} zNvvL>?GS%DO#rKYezM;6odtGX@cySm=h`cic$1Xf7a-*ekOvKdS;6JVI0?8I&*^wC zJT}zzx~6MK5~F4qZcTq+CM_;i7jBy5)9rMBsb&HO%dJZoGZS}fj{#0fO~Y-t6OQaz zKf2pXJtJD^^R-_8K_qRyKcRT4zV*vqxGdwGgEt32aUPMOVQHTN5rjQ*;hM37=RTH~ z)#l2+FG=BRS9s6OfCl*7Ao2HV+D~G&qhbcLezp=LDlpGurSNQpQdB>12J1?@B3!x( zQXIF6uTsPv1@FML&c0GUq7Dc znCjm_80#BlV?jtoorVPJ&i*+h8;S6znrbPhcpcdvzFLG3b(6%HKGHp}pM2|f?pu$g zT3f$Qm{GtH)1T>@8lK0AoFhI3gdwh$x%jGBr=`kvNkKjGd_HIm@?=56HCdzG{4o@$ z>?M~_W+3LA>_DsAz@mSnnO&=8m)Vif@P8fDY&S)>2a@{rcGW2#_KDbJg5fkgnhmQg z*d8XQv&zOmgHhW3LH*&gwdLfK`Xy_KAQeJZMVYQ1_Utfvm?7M4bZKXDXaq5HUsuDA zkxkPBGFqYM78bgqiSSTc!Llh1-|b$a1Nw(Xzyr;6$Rd#B>`xT-7c?Z@fwX1wUlW&@ zt`detb5LZvFcc}_8sxbf0(93)d4BOvHIyJ3)>!SxeCu3a&6F1prQ&$FRr<*Tx)yU3 zipk%HDvSnnp`W)9^Zl}`+|J`lF8_2P=6HAj)Nu`s9#XWd-D6V_(L?V%SyQz>3GlRq zaPRd1wFnv6l*bxNG)jIT7Sw4$x+pKX2Om^WPz)BX{vUGEM*B?55^5V}nT{gi& z>VZ*{$xYkvele5ycqp2fhrHB3CS<|?7!%!Ltf5=)GF2OqC6)qAJ$%kH9eMvArI{K6 z*6DMldpLKGc|cGJcbpFh97*7gON(V*@O=9EyBHFPH{#}g&jk-Zl+-#PX`SJfk&&uT zBmuQhx5HXAu=mn^zUm#XCUh@HDLog`$FT&^{LnEvRq-c~u)fjP$I6*Q0jJaGk!sYC(Gln_KSOW1#`^hiqu01(8GaNsiKdyp}$-kvKfF=%l7;f?JKsiKi zIdufnaQ>{66&1uU~`PH2yBCdS`0sAcC}nq4jaVs>ogUF8 zciBj!hh;B=D$n?DQtice1_USXNu*is)b;d6f2`RSPmb}J^Q zwc`{|6YW+!?A7+zHqP{9S>EA@#eB3^U2x$#4~q{Sk1?azI8;+7E;X^6UYXGR3UUJ| z{FfI3gPv5E=;GOmb29Z<9>^9Wo(ux9C^wfr^x5P3<|a`sB%b1SRmo8ZzfN8Tqf zEzb?{^=eRWzxVr%wP7#-hQu~g!mB|PM^H8;=7u&d*Lt(u)5RzLAwNsPB51c;P9WsE zKPt6SGohKx2~ttM8=B7|x09AvD8wfhi1YI|^;(bkF1uGp`ZP$wJ1{UpKjscjERN#R z?zS)3q6)mU@UYFDYc8$vI;r327HEmMb-#?D-502pG95Lw(E>p;A;ulv`YdJ{FN)Va z7AgDQtH$c|xFFQbq;U0d)K9g6L^|1N`X*%~BLJ6o-TG_Ok(SIhVH1*D&K~?KM%+s9 z!H2YCfTn80ze!d&9%}A?70YKd!Y?c`yeqS$T>YMREBo~j>{Z~))6P!#W%)XBL? z=0;46mGh;Zo6UmwmxQWlo;Wg->ZU@;P}Uwjqhmsz3Xj;D&KlwZa5pHgcM%ZleV%o$ zc;3mkjM2GgBMxz1%eGYmNSh)+sHQ!2Ta#DSm0-QjhSlWrr?!z)##f_vZEs{=}E5E9VPCLq`tB=U!mXncJmki zAXwT8!QSU`Fo=xE8o+_<M&A_r3Gqig!t0JWwp>@XiU(1Vxv%& z-J9vE300h}v|KceUB*mv=28|U9%cOZ@E}!yCnHwyRXOhZ7L<2>G-Ii%rOc>^eWU{g zbvpQ;ES@TR8Nsc_7h=7y)% zY!A24Q6OjeKJbANrz2xG8)aM9+NrrOICo1)DwTZA$2cMMUEH?RNVtNR#C`?zz!}DM z;n4pCq!NaxP=Iy`f%bl^6GE&^;Tf2M;=l2WXe^(%NH4#m(baSw{bLg(IY znqbr@j>HsKg@_c@LpzB_Wr$TR&&BSEz~{oVSk=N>%mWG-^X>>8_h|hmli@Z!jXjco zVs-iR&0YF)3lq3YmKpugx;$Oi@0j^L8(RT%DnVax{AMpiKdYVYJBYCfL{&Z4rxKs< z*Cehby=K~?RygggNyX3mM;RpT#Qqt61 zv5Vqi1)fYhQ5eCAkq@WM5y=N~_(ipcU>)Wp!!fNY>m^d%mJykzlc_cUXWzj0-vGzy z0TNB_=}^v_YNe6_o^9FO%^DG8w=Aj_&<^{zK7(;u%`xTy4eC(_m!5yYU~bbc`FcaR zsvQ=5d7b&$xl5!wztGf(a0 zDsqehxl#>C!}e}$F|hOWa9Yb92m;%YPI;#8htkPK>Ov_1Judf2YpTEB14!0XSKXN6 z9^Vw;;x9>a1_RLzamgYnal`Z4!E~a>usY$y7UaqTD9Rodknup_ zvhZ-o2UyZAWbDrpSxP{<4^a_|d)SGKnPj2QBRa9m*an$1hW7b-w|hdPMGwpi&x}2| z4zdVrBt|)}9FRa=_^fyr#nCIR@&x?vB73Fcr{=guIkj9)zC?tn-eGy)Ot`$&s9|FU zIiOb5H@z1R*cDxtroR6jihF;rxeDhgBs7S>S*?{K=W*ix99Vheu0_;+DT0_*>O|d# zA;={~0(5X*c=P$E^fCB|t-MOY}Ne<|= z!mUJ%cbsD?rr=J`bfNF8!wJtNuDxC{-b&*#&ev?ivOpxqxSzT>sd=o6tAw(A0Tkg^ZgI$E+nCCYk{ys1DBNFr6KVt0V8!6Zxa3Kg$=f4 zh`^>&fG9#ni6}0}8G?(0dqyT>dg{qAUPUg%r%Q6N@nsHf$dCrueFPoyoEHf70FgZ)JR0*9n7)Cn(~ZR=L4Zt z*aro~s?F(u8XpL#iNMQ}P`DDq+;J6W+n)Z%V3%ji`eL$qW#vQF4T^WKzR4joMVGd? zpwA~Hs>cCnLCPDgmj70dfW*u3)t#(Ijiv3I%d|!|pBRyaxx(m%V{Zv!_G9H>UavZt34H~9kZbYj?z{3WjpC%Ub8Fz}?u8wacfKDci2X~6gB-=QU+wqE?!7~q znFV@8Y>UG|FA)mb$YgkBr<-7T?-hS4_&4^+uP35W`QQ1(#ZdKC)6l@n+I2jCzB;jB zYN8)y`uF(LNBK~_$I^4Q3;eO3jxLIqGf^-9b~p$#7?;>$tJKEdL)WFEEDbGiUX)aA zk@HSe$sGd}vXv#>Fy^^6Q~wuP5GkKoW8|q<05)LJv?9$4bM-8U$$NMx*cpnDO6DE0 zNpZh*XmsQi<13Hp^xa8`$%5fO@xjj4&BpuMveQX#%!uozEr0PeTOHx!FGL(Km?HR% zTDWGcF5*Zx-r!Y|LcgTbentyg$uyQ2yrDN#)c2(JJZ(Q&`jZjtf}IZb z5uyXv^Vs(;qObWv`meIELV^_PS5Oy$UPjSuigNDwnYz_JeA2w`>%q3V`tvq*)JCO)n-(O9Qn+Vm_ONrl2Ugr3nQZM{E;keE6?}}@UGHf78i_{ zxx0E8WFa?;*oZr50?Bx)hsMl%zm|Mwb-R2IzU}-#NicXbxcjLzx(0BqxqN^jyuK}C z7xL-O7U{+>%*P8cwf(p`b-5h&Ga}c=w=c4|E=xa`_Yb|ZiJuF)wf{o_6h` z({+NL5tIlGa|+#)KC-?af~0_Bk_+h2qGKS|8`puuZ633=M-=pxCIzVd(2#k|_TzI9 zp}^tr^02=*d%}p$H&h5J8<7qNAg$_9GyZI?k6!q$g()*OF%bpFIy@|zNKxZ6FlNg( z1@Lg%k8)Ds1=+oOGli|@^<@<(K&0sewgLJX=D%z407SgGjc9^v4o8lO!{9Fr&Qp9j z>r{mI55)?R$;=2+PfkN^+$5Wi$GH@Y;^v?$05_239oIrC=PyjWRzJi>Z@ag6prXMH z)@QG7i}QbCOY(!Lta6|MtDuEyUCgs;KT+^Mw)>xBYLRhotRJ^ShheD`Hh_Ci@JIkj zK(@a>_91T+igU@*Vco?&lY|$b`8BW?ZuvZ%G}k0EIqS40X|p>=&3QU%?9n}(Vu!|3 zRdVtH<(b2}na@0Oknf)!Odan6;~azY-!>QZC(19?9_S({?q#>F`m7zJ-KW>J@JMAO zLQ<6tI?0+2{4`%`Lumc}U94Ny0$V}u*>3HglCw&YT0&=ZKa&7?U4M0-t=&?5z28oD zq)=M0Sq0)_PFq*dtIf1l8r+lFjoK)zrzTCPJzu8sT@5Ab2??uD1a*|qCwu6~Id(g$ zk~-BFtK74Zw+u@DJku=XVIgn$^GZnL*n>14@{S9P{*EzbE@JnmGuA^Z0tbeGYSg;Q z!iSL1Yf*BwBrz4lz#q4-S3JHU9n= z9=pud0o*nAdTLx33k^B{A!j#i|6a|o$NN>&tW#rWAReSJ8U0*^NrYFHp9f62LAG*~ zf95e1Tl->JK&?+CQx=s-yaFrkn@Tvvh%87kB4@ z>{_AJSQH*u1S!@OCtT1fgJARIEdb)H=vf;0js@zD2H$@^{bpm*>YMnT6LkE+rt#G5 z_79iOBbBI7m7}+jN~kySMoGc6mao~`rdItLK1C7;6?({73wrdYrixq(GImt>_E+5; zmBb4l0tPGm{e*oWd~^FT&?sVG9CV<^hT9HnkjKnZ3-CJArK9O+drtsty9pMf_%Ot+ z{wkU2QftcuETug0#V;azU*CA(6PcyIXc;&w7H;o)mREUk^|v=q2#(zfbQbH0hM0TS zrE#wd^$Hk2t});)cM7%z>71eB$c>7v%f-w9^)U-$13xA1m_@vNt1j8{ptgrOnOHbj zpqDZvzSD0F0&nL-yF)Gx(6F0=QLKr+)Kq=*a#Oxq#5tB#kTq;7+?M1jV!XcV5%$Ro|0tQ^)fu5-0*cDuJsnCw!Soz;e<5 zGTS?b{jEW8wlyY?RY8r;ha+&|t_{gD>xMyfiTwoGF$}mA;`iY{ zaHb{~Gsn7x=po_^8PZ_G6fs<@B?lV#D4O^Ef!{4?o3&i8o7&FTySeksV&JwAfuW;lKZ9ja2|DJsP_6$u1s zX!}#vosPnPIm|ZXv1r$0w&=GVSbh=xNI!#snlhdGv(F7Bs}$J}{zS{%4ZJL#y%0ox z9GPZde!3zL7%W-B0g4cO{IAX6?+-O77Y?mkoasHtFkoTgb9eA}*}uB5nubW`?w0ks z$v4p+20a#$f)r3aB4kRN${oNh(YWV-k*KjpC`yYk<;>@(5b#8i;i)`1jabI-vE{Ec zkQMAj!{|D$d-gCHDpzHLA>7wn89%qnyJrFH!mHDnOO9zAO|vgH>b7h^>d>@XH0Ic3 zDFnK17_YAk$(*avLE^OKD=#>Fp;ymZ-Hsax_#?|}&Lk|*JLdXenMIwmd4nO(ss)AP zbl{_bECK2u-!2dDRD{er6N11Zb#{y991?{!x;G7;bX-eRtp7XJYa#v1`tb9v$0o&M zQvqc?H%Mc`L=tv(i-~p!JGar(nducY=$t&vHS?>1ZIJ(HW=OkAtLp!6u(xGLrq|fg zSO=w-L=@ido>@urAPmB|JDc@J#P@yEe#Fjwcd}9jq@7LgYzB5Z`Jy1oGz2q{ZHvNQ zryIWAg~XxJyBJGZRrNAopHA~A-ssCaWkg{AbvK*;8XqxP>gpu}ewRa!&*_+! zALZO#X-@S?`Gud1!0rDxEF?;i9wH@f*T$9rt_B7{*NPAASZg0nE~hg?2d`B9rVy(o zymx2c6A4g=xem%q+Z@By$y#wU<)s26#zY2otBa=*m{79rW@?n|N-nshRv*i+345ec zxJSiF=A8CEjB2KRvXX*d^FxH-2$cjw*HuhHHb zA}xxK;ryTlR>M>q(3G6}iww&%N(gBEry0hruGrbZmVAD;iJwVx5^3=|rbk+p@x>sw zX}(Q{%iWKhHB&>IMl73#Er=ueVlQgW3q=23ia5-z5rW2lVTsENc`uC>5bX2(twbU)3rYe_fKypsb_BHf{prfJQEZ1+NJm)n16n zcnl7#6$9D$}<%|?Ss5TB18wr(WkV%WDR;{|W^Sav5*a-1CT3GZp;5A6xui)3_t zBU1!=b_FHI2>JTYqowmiavjSz)DEiL7odMFe?MLdZ8$EoF8A>)<*kDsp#}UM6Bk#` zPE~c;b~(EJ(_l?Tz*)P)WoxDco0z5U4{1XETLyB zbA_`6X^{6F6mGE&d+u|^FPQ(Dk3^YgIwX- z*~p_&*PWO3F4lKvRQ1CyFE7i4X4`@A{nj)-ff}w?UIG!%U-4U6Z}+1_7pXLso*~i8 zOQ7@RSIwNT9pNKC(Dg4ZGE*|urO@(e+SYD1kJ-p1^WbU1DPvm^dR01T2sOs^UedKr zo8&G)aUY@p*^bgRk-6+Dg|uAr!%!TwrvGYxs0fP3dY-MX%{o-+#Bl1LN)V}xnO${c z2|Q?Ot!?KTbbvOYmlP}FigYy&*U!!6RyspjR*0k7?o9#?2=#*8U3p_f7dJY&1%W8e~fxyeYIL8@RlyPqUXvdMru zG>Z9-A+&Hs?Rx&EhtES+Ztu+eN!m}H#ussq6%E2v6iMn;TO7j1ITU#qPZeYh3IS&C z#neV##3I400u@xYro{4V%IW*{$EQPZ3t+Y~o(x&TE4d1zA- z=B_HYa;cpT4TCH$a{16ZsSs&8g)0Z)am3n8Itq)=hKY~n^~e!}-9U5KuAZ5K$$VDe zL1XjQymFVC6D;AqA&hkmwmkYrO`HP#i`GD?DU&R^8 zK-VYjE`m95T%t~gl-m?U%Bmp4$}ZcMkd&>&WK#JUkDRRmTw}I7MSK1(Y8hH^gz`T@ z&>Ee?(A42Vzy@Vk#cM{Xc8Rp!ShKZG8s_dm!dA5bC!?q{& z`4X*!GMJ;6Py+se9VE9z3igX*n!Q5=L(+$F;N0pu<*B*}{VXX5d+pl+Lv4WG%0A3?nhgS%}T0A43dQy9)2tzq^op1MYj_ZTJe4 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

)hKt2ADam&9Nq!1!ILZp^0O~Uz-dBQw-4=6 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≫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

R7-Xi~6)NbC_@n8|`4{t@L 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%0A$(-4KCOm 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 O@XkjFTNKsR-2VWfh#m$2 literal 0 HcmV?d00001 diff --git a/packaging/cura_background_dmg.png b/packaging/cura_background_dmg.png new file mode 100644 index 0000000000000000000000000000000000000000..e83860829345c336c61f93dbcc38e7f333974891 GIT binary patch literal 57851 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 + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser 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 +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file From 429a59d9ecc68d2c549d7aead0df4c5d6a992868 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 6 Apr 2022 05:40:26 +0200 Subject: [PATCH 142/213] Fixed rez executable not being used Contributes to CURA-8640 --- cmake/macoscreatedmg.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/macoscreatedmg.cmake b/cmake/macoscreatedmg.cmake index 0ade3250..696c7bd0 100644 --- a/cmake/macoscreatedmg.cmake +++ b/cmake/macoscreatedmg.cmake @@ -13,7 +13,7 @@ GetFromEnvironmentOrCache( GetFromEnvironmentOrCache( NAME - REX_EXECUTABLE + REZ_EXECUTABLE DEFAULT /Library/Developer/CommandLineTools/usr/bin/Rez DESCRIPTION @@ -33,7 +33,7 @@ add_custom_command( --app-drop-link 520 272 --eula "${CMAKE_SOURCE_DIR}/packaging/cura_license.txt" --background "$source_dir/packaging/cura_background_dmg.png" - --rez /Library/Developer/CommandLineTools/usr/bin/Rez + --rez ${REZ_EXECUTABLE} "${installer_DIR}" "${installer_DIR}/dist/Ultimaker-Cura.app" DEPENDS pyinstaller install-python-requirements Cura create_installer_dir) From 7e7504f6d9fc4d816835e535c6391fd77764da42 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 6 Apr 2022 05:42:23 +0200 Subject: [PATCH 143/213] Add the create-dmg target Contributes to CURA-8640 --- cmake/macoscreatedmg.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/macoscreatedmg.cmake b/cmake/macoscreatedmg.cmake index 696c7bd0..928baa27 100644 --- a/cmake/macoscreatedmg.cmake +++ b/cmake/macoscreatedmg.cmake @@ -19,6 +19,7 @@ GetFromEnvironmentOrCache( DESCRIPTION "The path to the Rez (Resource compiler)") +add_custom_target(create-dmg ALL COMMENT "Create the MacOS dmg") add_custom_command( TARGET create-dmg From c188996a37cd32c5210da9ad8523e34e2c2560d3 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 6 Apr 2022 05:58:23 +0200 Subject: [PATCH 144/213] Added function to sign the dmg Contributes to CURA-8640 --- CMakeLists.txt | 1 + cmake/macoscreatedmg.cmake | 12 +++++++---- cmake/macossigninstaller.cmake | 39 ++++++++++++++++++++++++++++++++++ cmake/pyinstaller.cmake | 19 +++++++++++------ 4 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 cmake/macossigninstaller.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index ed3705c7..a542cc76 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,4 +43,5 @@ include(projects/cura.cmake) include(cmake/pyinstaller.cmake) if(APPLE) include(cmake/macoscreatedmg.cmake) + include(cmake/macossigninstaller.cmake) endif() \ No newline at end of file diff --git a/cmake/macoscreatedmg.cmake b/cmake/macoscreatedmg.cmake index 928baa27..0b304661 100644 --- a/cmake/macoscreatedmg.cmake +++ b/cmake/macoscreatedmg.cmake @@ -8,6 +8,7 @@ GetFromEnvironmentOrCache( CREATE_DMG_EXECUTABLE DEFAULT /usr/local/bin/create-dmg + FILEPATH DESCRIPTION "The path to the create-dmg executable") @@ -16,9 +17,12 @@ GetFromEnvironmentOrCache( REZ_EXECUTABLE DEFAULT /Library/Developer/CommandLineTools/usr/bin/Rez + FILEPATH DESCRIPTION "The path to the Rez (Resource compiler)") +set(DMG_PATH "${installer_DIR}/Ultimaker-Cura-${CURA_VERSION}-MacOS.dmg") + add_custom_target(create-dmg ALL COMMENT "Create the MacOS dmg") add_custom_command( TARGET @@ -26,16 +30,16 @@ add_custom_command( WORKING_DIRECTORY ${installer_DIR} COMMAND - ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${CREATE_DMG_EXECUTABLE} --window-pos 640 360 + ${CREATE_DMG_EXECUTABLE} --window-pos 640 360 --volicon "${CMAKE_SOURCE_DIR}/packaging/VolumeIcons_Cura.icns" --window-size 690 503 --icon-size 90 --icon "Ultimaker-Cura.app" 169 272 --app-drop-link 520 272 --eula "${CMAKE_SOURCE_DIR}/packaging/cura_license.txt" - --background "$source_dir/packaging/cura_background_dmg.png" + --background "${CMAKE_SOURCE_DIR}/packaging/cura_background_dmg.png" --rez ${REZ_EXECUTABLE} - "${installer_DIR}" - "${installer_DIR}/dist/Ultimaker-Cura.app" + ${DMG_PATH} + ${ULTIMAKER_CURA_APP_PATH} DEPENDS pyinstaller install-python-requirements Cura create_installer_dir) add_dependencies(create-dmg pyinstaller install-python-requirements Cura create_installer_dir) \ No newline at end of file diff --git a/cmake/macossigninstaller.cmake b/cmake/macossigninstaller.cmake new file mode 100644 index 00000000..a4a04bca --- /dev/null +++ b/cmake/macossigninstaller.cmake @@ -0,0 +1,39 @@ +# Copyright (c) 2022 Ultimaker B.V. +# cura-build-environment is released under the terms of the AGPLv3 or higher. + +GetFromEnvironmentOrCache( + NAME + CODESIGN_IDENTITY + DESCRIPTION + "The Apple codesign identity") + +GetFromEnvironmentOrCache( + NAME + CODESIGN_EXECUTABLE + DEFAULT + /usr/bin/codesign + FILEPATH + DESCRIPTION + "The path to the codesign executable") + +GetFromEnvironmentOrCache( + NAME + CODESIGN_DOMAIN + DEFAULT + nl.ultimaker.cura.dmg + DESCRIPTION + "The codesign domain to be used") + +add_custom_target(sign-dmg ALL COMMENT "Sign the MacOS dmg") +add_custom_command( + TARGET + sign-dmg + WORKING_DIRECTORY + ${installer_DIR} + COMMAND + ${CODESIGN_EXECUTABLE} -s "${CODESIGN_IDENTITY}" + --timestamp + -i "${CODESIGN_DOMAIN}" + "${DMG_PATH}" + DEPENDS create-dmg pyinstaller install-python-requirements Cura create_installer_dir) +add_dependencies(sign-dmg create-dmg pyinstaller install-python-requirements Cura create_installer_dir) \ No newline at end of file diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index 77a61e3c..144cf2c9 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -9,15 +9,20 @@ set(pyinstaller_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/pyinstaller) set(cura_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/cura_app.py) set(curaengine_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/CuraEngine) set(installer_DIR ${CMAKE_INSTALL_PREFIX}/installer) +set(ULTIMAKER_CURA_PATH ${installer_DIR}/dist/Ultimaker-Cura) +if(APPLE) + set(ULTIMAKER_CURA_APP_PATH ${ULTIMAKER_CURA_PATH}.app) -if(APPLE AND DEFINED CODESIGN_IDENTITY) - GetFromEnvironmentOrCache( - NAME - CODESIGN_IDENTITY - DESCRIPTION - "The Apple codesign identity") -set(extra_pyinstaller_args "--codesign-identity \"${CODESIGN_IDENTITY}\" --osx-entitlements-file \"${CMAKE_SOURCE_DIR}\\signing\\cura.entitlements\" --osx-bundle-identifier \"nl.ultimaker.cura.dmg\" ") + if(DEFINED CODESIGN_IDENTITY) + GetFromEnvironmentOrCache( + NAME + CODESIGN_IDENTITY + DESCRIPTION + "The Apple codesign identity") + + set(extra_pyinstaller_args "--codesign-identity \"${CODESIGN_IDENTITY}\" --osx-entitlements-file \"${CMAKE_SOURCE_DIR}\\signing\\cura.entitlements\" --osx-bundle-identifier \"nl.ultimaker.cura.dmg\" ") + endif() else() set(extra_pyinstaller_args ) endif() From a820bfaad21d252ead95cf5aacdcb6f77bf4f42f Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 6 Apr 2022 06:19:33 +0200 Subject: [PATCH 145/213] Added function to notarize the dmg Contributes to CURA-8640 --- CMakeLists.txt | 6 +- ...createdmg.cmake => macos-create-dmg.cmake} | 0 cmake/macos-notarize-dmg.cmake | 69 +++++++++++++++++++ cmake/macos-sign-dmg.cmake | 50 ++++++++++++++ cmake/macossigninstaller.cmake | 39 ----------- cmake/pyinstaller.cmake | 2 +- 6 files changed, 124 insertions(+), 42 deletions(-) rename cmake/{macoscreatedmg.cmake => macos-create-dmg.cmake} (100%) create mode 100644 cmake/macos-notarize-dmg.cmake create mode 100644 cmake/macos-sign-dmg.cmake delete mode 100644 cmake/macossigninstaller.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index a542cc76..efd7ebb9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,7 +41,9 @@ include(projects/cura.cmake) # Collect the artifacts with pyinstaller include(cmake/pyinstaller.cmake) + if(APPLE) - include(cmake/macoscreatedmg.cmake) - include(cmake/macossigninstaller.cmake) + include(cmake/macos-create-dmg.cmake) + include(cmake/macos-sign-dmg.cmake) + include(cmake/macos-notarize-dmg.cmake) endif() \ No newline at end of file diff --git a/cmake/macoscreatedmg.cmake b/cmake/macos-create-dmg.cmake similarity index 100% rename from cmake/macoscreatedmg.cmake rename to cmake/macos-create-dmg.cmake diff --git a/cmake/macos-notarize-dmg.cmake b/cmake/macos-notarize-dmg.cmake new file mode 100644 index 00000000..a0d5a413 --- /dev/null +++ b/cmake/macos-notarize-dmg.cmake @@ -0,0 +1,69 @@ +# Copyright (c) 2022 Ultimaker B.V. +# cura-build-environment is released under the terms of the AGPLv3 or higher. + +GetFromEnvironmentOrCache( + NAME + SIGN_DMG + DEFAULT + ON + BOOL + DESCRIPTION + "Sign the dmg") + +if(SIGN_DMG) + GetFromEnvironmentOrCache( + NAME + NOTARIZE_DMG + DEFAULT + ON + BOOL + DESCRIPTION + "Notarize the dmg") + + if(NOTARIZE_DMG) + GetFromEnvironmentOrCache( + NAME + NOTARIZE_USER + REQUIRED + DESCRIPTION + "The Apple notarizing username") + + GetFromEnvironmentOrCache( + NAME + NOTARIZE_PASSWORD + REQUIRED + DESCRIPTION + "The Apple password of the notarizing user") + + GetFromEnvironmentOrCache( + NAME + ALTOOL_EXECUTABLE + DEFAULT + /Applications/Xcode.app/Contents/Developer/usr/bin/altool + FILEPATH + DESCRIPTION + "The path to the altool executable") + + GetFromEnvironmentOrCache( + NAME + ULTIMAKER_CURA_DOMAIN + DEFAULT + nl.ultimaker.cura.dmg + DESCRIPTION + "The Ultimaker Cura domain to be used (usually reversed)") + + add_custom_target(notarize-dmg ALL COMMENT "Notarize the MacOS dmg") + add_custom_command( + TARGET + notarize-dmg + WORKING_DIRECTORY + ${installer_DIR} + COMMAND xcrun ${ALTOOL_EXECUTABLE} --notarize-app + --primary-bundle-id "${ULTIMAKER_CURA_DOMAIN}" + --username "${NOTARIZE_USER}" + --password "${NOTARIZE_PASSWORD}" + --file "${DMG_PATH}" + DEPENDS sign-dmg create-dmg pyinstaller install-python-requirements Cura create_installer_dir) + add_dependencies(notarize-dmg create-dmg pyinstaller install-python-requirements Cura create_installer_dir) + endif() +endif() \ No newline at end of file diff --git a/cmake/macos-sign-dmg.cmake b/cmake/macos-sign-dmg.cmake new file mode 100644 index 00000000..4a0a232e --- /dev/null +++ b/cmake/macos-sign-dmg.cmake @@ -0,0 +1,50 @@ +# Copyright (c) 2022 Ultimaker B.V. +# cura-build-environment is released under the terms of the AGPLv3 or higher. + +GetFromEnvironmentOrCache( + NAME + SIGN_DMG + DEFAULT + ON + BOOL + DESCRIPTION + "Sign the dmg") + +if(SIGN_DMG) + GetFromEnvironmentOrCache( + NAME + CODESIGN_IDENTITY + DESCRIPTION + "The Apple codesign identity") + + GetFromEnvironmentOrCache( + NAME + CODESIGN_EXECUTABLE + DEFAULT + /usr/bin/codesign + FILEPATH + DESCRIPTION + "The path to the codesign executable") + + GetFromEnvironmentOrCache( + NAME + ULTIMAKER_CURA_DOMAIN + DEFAULT + nl.ultimaker.cura.dmg + DESCRIPTION + "The Ultimaker Cura domain to be used (usually reversed)") + + add_custom_target(sign-dmg ALL COMMENT "Sign the MacOS dmg") + add_custom_command( + TARGET + sign-dmg + WORKING_DIRECTORY + ${installer_DIR} + COMMAND + ${CODESIGN_EXECUTABLE} -s "${CODESIGN_IDENTITY}" + --timestamp + -i "${ULTIMAKER_CURA_DOMAIN}" + "${DMG_PATH}" + DEPENDS create-dmg pyinstaller install-python-requirements Cura create_installer_dir) + add_dependencies(sign-dmg create-dmg pyinstaller install-python-requirements Cura create_installer_dir) +endif() \ No newline at end of file diff --git a/cmake/macossigninstaller.cmake b/cmake/macossigninstaller.cmake deleted file mode 100644 index a4a04bca..00000000 --- a/cmake/macossigninstaller.cmake +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (c) 2022 Ultimaker B.V. -# cura-build-environment is released under the terms of the AGPLv3 or higher. - -GetFromEnvironmentOrCache( - NAME - CODESIGN_IDENTITY - DESCRIPTION - "The Apple codesign identity") - -GetFromEnvironmentOrCache( - NAME - CODESIGN_EXECUTABLE - DEFAULT - /usr/bin/codesign - FILEPATH - DESCRIPTION - "The path to the codesign executable") - -GetFromEnvironmentOrCache( - NAME - CODESIGN_DOMAIN - DEFAULT - nl.ultimaker.cura.dmg - DESCRIPTION - "The codesign domain to be used") - -add_custom_target(sign-dmg ALL COMMENT "Sign the MacOS dmg") -add_custom_command( - TARGET - sign-dmg - WORKING_DIRECTORY - ${installer_DIR} - COMMAND - ${CODESIGN_EXECUTABLE} -s "${CODESIGN_IDENTITY}" - --timestamp - -i "${CODESIGN_DOMAIN}" - "${DMG_PATH}" - DEPENDS create-dmg pyinstaller install-python-requirements Cura create_installer_dir) -add_dependencies(sign-dmg create-dmg pyinstaller install-python-requirements Cura create_installer_dir) \ No newline at end of file diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index 144cf2c9..34c60a1f 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -20,7 +20,7 @@ if(APPLE) CODESIGN_IDENTITY DESCRIPTION "The Apple codesign identity") - + set(SIGN_DMG ON) set(extra_pyinstaller_args "--codesign-identity \"${CODESIGN_IDENTITY}\" --osx-entitlements-file \"${CMAKE_SOURCE_DIR}\\signing\\cura.entitlements\" --osx-bundle-identifier \"nl.ultimaker.cura.dmg\" ") endif() else() From 11cc1c2080c2213816b05b627618a6496b9d7e13 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 6 Apr 2022 06:26:43 +0200 Subject: [PATCH 146/213] Simplified used variables Contributes to CURA-8640 --- cmake/macos-notarize-dmg.cmake | 17 ------- cmake/macos-sign-dmg.cmake | 23 ---------- cmake/pyinstaller.cmake | 84 ++++++++++++++++++++-------------- 3 files changed, 49 insertions(+), 75 deletions(-) diff --git a/cmake/macos-notarize-dmg.cmake b/cmake/macos-notarize-dmg.cmake index a0d5a413..b041be63 100644 --- a/cmake/macos-notarize-dmg.cmake +++ b/cmake/macos-notarize-dmg.cmake @@ -1,15 +1,6 @@ # Copyright (c) 2022 Ultimaker B.V. # cura-build-environment is released under the terms of the AGPLv3 or higher. -GetFromEnvironmentOrCache( - NAME - SIGN_DMG - DEFAULT - ON - BOOL - DESCRIPTION - "Sign the dmg") - if(SIGN_DMG) GetFromEnvironmentOrCache( NAME @@ -44,14 +35,6 @@ if(SIGN_DMG) DESCRIPTION "The path to the altool executable") - GetFromEnvironmentOrCache( - NAME - ULTIMAKER_CURA_DOMAIN - DEFAULT - nl.ultimaker.cura.dmg - DESCRIPTION - "The Ultimaker Cura domain to be used (usually reversed)") - add_custom_target(notarize-dmg ALL COMMENT "Notarize the MacOS dmg") add_custom_command( TARGET diff --git a/cmake/macos-sign-dmg.cmake b/cmake/macos-sign-dmg.cmake index 4a0a232e..3ea76c25 100644 --- a/cmake/macos-sign-dmg.cmake +++ b/cmake/macos-sign-dmg.cmake @@ -1,22 +1,7 @@ # Copyright (c) 2022 Ultimaker B.V. # cura-build-environment is released under the terms of the AGPLv3 or higher. -GetFromEnvironmentOrCache( - NAME - SIGN_DMG - DEFAULT - ON - BOOL - DESCRIPTION - "Sign the dmg") - if(SIGN_DMG) - GetFromEnvironmentOrCache( - NAME - CODESIGN_IDENTITY - DESCRIPTION - "The Apple codesign identity") - GetFromEnvironmentOrCache( NAME CODESIGN_EXECUTABLE @@ -26,14 +11,6 @@ if(SIGN_DMG) DESCRIPTION "The path to the codesign executable") - GetFromEnvironmentOrCache( - NAME - ULTIMAKER_CURA_DOMAIN - DEFAULT - nl.ultimaker.cura.dmg - DESCRIPTION - "The Ultimaker Cura domain to be used (usually reversed)") - add_custom_target(sign-dmg ALL COMMENT "Sign the MacOS dmg") add_custom_command( TARGET diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index 34c60a1f..8695067e 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -4,55 +4,69 @@ # Sets up a virtual environment using the Python interpreter - set(pyinstaller_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/pyinstaller) set(cura_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/cura_app.py) set(curaengine_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/CuraEngine) set(installer_DIR ${CMAKE_INSTALL_PREFIX}/installer) set(ULTIMAKER_CURA_PATH ${installer_DIR}/dist/Ultimaker-Cura) -if(APPLE) - set(ULTIMAKER_CURA_APP_PATH ${ULTIMAKER_CURA_PATH}.app) +if (APPLE) + set(ULTIMAKER_CURA_APP_PATH ${ULTIMAKER_CURA_PATH}.app) + GetFromEnvironmentOrCache( + NAME + SIGN_DMG + DEFAULT + ON + BOOL + DESCRIPTION + "Sign the dmg") - if(DEFINED CODESIGN_IDENTITY) - GetFromEnvironmentOrCache( - NAME - CODESIGN_IDENTITY - DESCRIPTION - "The Apple codesign identity") - set(SIGN_DMG ON) - set(extra_pyinstaller_args "--codesign-identity \"${CODESIGN_IDENTITY}\" --osx-entitlements-file \"${CMAKE_SOURCE_DIR}\\signing\\cura.entitlements\" --osx-bundle-identifier \"nl.ultimaker.cura.dmg\" ") - endif() -else() - set(extra_pyinstaller_args ) -endif() + if (SIGN_DMG) + GetFromEnvironmentOrCache( + NAME + CODESIGN_IDENTITY + REQUIRED + DESCRIPTION + "The Apple codesign identity") + GetFromEnvironmentOrCache( + NAME + ULTIMAKER_CURA_DOMAIN + DEFAULT + nl.ultimaker.cura.dmg + DESCRIPTION + "The Ultimaker Cura domain to be used (usually reversed)") + set(extra_pyinstaller_args "--codesign-identity \"${CODESIGN_IDENTITY}\" --osx-entitlements-file \"${CMAKE_SOURCE_DIR}\\signing\\cura.entitlements\" --osx-bundle-identifier \"${ULTIMAKER_CURA_DOMAIN}\" ") + endif () +else () + set(extra_pyinstaller_args) +endif () add_custom_target(create_installer_dir ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${installer_DIR}) add_custom_target(pyinstaller ALL COMMENT "Collect the build artifacts in a single installer") add_custom_command( TARGET - pyinstaller + pyinstaller WORKING_DIRECTORY - ${installer_DIR} + ${installer_DIR} COMMAND - ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${pyinstaller_EXECUTABLE} ${cura_EXECUTABLE} - --collect-all cura - --collect-all UM - --collect-all serial #Used only in plug-ins. - --collect-all Charon - --hidden-import pySavitar - --hidden-import pyArcus - --hidden-import pynest2d - --hidden-import PyQt6.QtNetwork - --hidden-import zeroconf - --add-binary "${curaengine_EXECUTABLE}:." - --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins:plugins" - --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins:plugins" - --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources:resources" - --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources:resources" - --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/:resources/qml/UM/" - --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} - --name "Ultimaker-Cura" + ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${pyinstaller_EXECUTABLE} ${cura_EXECUTABLE} + --collect-all cura + --collect-all UM + --collect-all serial #Used only in plug-ins. + --collect-all Charon + --hidden-import pySavitar + --hidden-import pyArcus + --hidden-import pynest2d + --hidden-import PyQt6.QtNetwork + --hidden-import zeroconf + --add-binary "${curaengine_EXECUTABLE}:." + --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins:plugins" + --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins:plugins" + --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources:resources" + --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources:resources" + --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/:resources/qml/UM/" + --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} + --name "Ultimaker-Cura" DEPENDS install-python-requirements Cura create_installer_dir) add_dependencies(pyinstaller install-python-requirements Cura create_installer_dir) \ No newline at end of file From 6f3e76a7a828b45d1a112f3bbe8c7f6a5eb95a76 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 6 Apr 2022 06:29:56 +0200 Subject: [PATCH 147/213] Couple of fixes Contributes to CURA-8640 --- cmake/macos-create-dmg.cmake | 2 -- cmake/macos-notarize-dmg.cmake | 2 +- cmake/pyinstaller.cmake | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/cmake/macos-create-dmg.cmake b/cmake/macos-create-dmg.cmake index 0b304661..8a026559 100644 --- a/cmake/macos-create-dmg.cmake +++ b/cmake/macos-create-dmg.cmake @@ -1,8 +1,6 @@ # Copyright (c) 2022 Ultimaker B.V. # cura-build-environment is released under the terms of the AGPLv3 or higher. -add_custom_target(create-dmg ALL COMMENT "Create the dmg from the pyinstaller output") - GetFromEnvironmentOrCache( NAME CREATE_DMG_EXECUTABLE diff --git a/cmake/macos-notarize-dmg.cmake b/cmake/macos-notarize-dmg.cmake index b041be63..62d4b217 100644 --- a/cmake/macos-notarize-dmg.cmake +++ b/cmake/macos-notarize-dmg.cmake @@ -6,7 +6,7 @@ if(SIGN_DMG) NAME NOTARIZE_DMG DEFAULT - ON + TRUE BOOL DESCRIPTION "Notarize the dmg") diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index 8695067e..c0795e59 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -16,7 +16,7 @@ if (APPLE) NAME SIGN_DMG DEFAULT - ON + TRUE BOOL DESCRIPTION "Sign the dmg") From 43bbb39dd757c94f29fb7802c4198a7121222f24 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 6 Apr 2022 06:38:58 +0200 Subject: [PATCH 148/213] Fixed required variable handling when empty Contributes to CURA-8640 --- cmake/GetFromEnvironmentOrCache.cmake | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmake/GetFromEnvironmentOrCache.cmake b/cmake/GetFromEnvironmentOrCache.cmake index ec0cbb4c..a59e0648 100644 --- a/cmake/GetFromEnvironmentOrCache.cmake +++ b/cmake/GetFromEnvironmentOrCache.cmake @@ -31,8 +31,9 @@ function(GetFromEnvironmentOrCache) elseif(DEFINED VAR_DEFAULT) set(VAR_VALUE ${VAR_DEFAULT}) message(STATUS "Using default value for ${VAR_NAME}: ${VAR_VALUE}") - elseif(${VAR_REQUIRED}) - message(SEND_ERROR "Could net set ${VAR_NAME}, either provide commandline arg, environment variable or default value") + endif() + if(VAR_REQUIRED AND NOT VAR_VALUE) + message(SEND_ERROR "${VAR_NAME} is a required variable, either provide a commandline arg, environment variable or default value") else() set(VAR_VALUE "") message(STATUS "Using empty default value for ${VAR_NAME}") From b75d669ee7bc428723e6beac9af851d5dc35ce3c Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 6 Apr 2022 06:47:16 +0200 Subject: [PATCH 149/213] Set Cura version globally since it is also used by CuraEngine Contributes to CURA-8640 --- CMakeLists.txt | 43 ++++++++++++++++++++++++++++++++++++++++++- projects/cura.cmake | 39 --------------------------------------- 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index efd7ebb9..8bd5a220 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,7 +12,7 @@ GetFromEnvironmentOrCache( "Specify the minimum version of the target platform (e.g. macOS or iOS)") project(cura-build-environment) -cmake_minimum_required(VERSION 3.18) +cmake_minimum_required(VERSION 3.20) include(cmake/conan.cmake) @@ -25,6 +25,47 @@ if(N_PROC EQUAL 0) set(N_PROC 1) endif() +# Create the version-related variables +GetFromEnvironmentOrCache( + NAME + CURA_VERSION_MAJOR + DEFAULT + 5 + DESCRIPTION + "Cura Major Version") +GetFromEnvironmentOrCache( + NAME + CURA_VERSION_MINOR + DEFAULT + 0 + DESCRIPTION + "Cura Minor Version") +GetFromEnvironmentOrCache( + NAME + CURA_VERSION_PATCH + DEFAULT + 0 + DESCRIPTION + "Cura Patch Version") +GetFromEnvironmentOrCache( + NAME + CURA_VERSION_EXTRA + DESCRIPTION + "Cura Extra Version Information") +if(NOT ${CURA_VERSION_EXTRA} STREQUAL "") + set(CURA_VERSION_EXTRA "-${CURA_VERSION_EXTRA}") +endif() +set(_default_cura_version "${CURA_VERSION_MAJOR}.${CURA_VERSION_MINOR}.${CURA_VERSION_PATCH}${CURA_VERSION_EXTRA}") +if(${_default_cura_version} VERSION_GREATER 0.0.0) + set(CURA_VERSION ${_default_cura_version}) +endif() +GetFromEnvironmentOrCache( + NAME + CURA_VERSION + DESCRIPTION + "Cura Extra Version Information" + REQUIRED) + add_custom_target(projects) include(projects/python.cmake) diff --git a/projects/cura.cmake b/projects/cura.cmake index 86a861c6..11e66da1 100644 --- a/projects/cura.cmake +++ b/projects/cura.cmake @@ -6,45 +6,6 @@ GetFromEnvironmentOrCache( DESCRIPTION "The name of the tag or branch to build for Cura") -# Create the version-related variables -GetFromEnvironmentOrCache( - NAME - CURA_VERSION_MAJOR - DESCRIPTION - "Cura Major Version") -GetFromEnvironmentOrCache( - NAME - CURA_VERSION_MINOR - DEFAULT - 0 - DESCRIPTION - "Cura Minor Version") -GetFromEnvironmentOrCache( - NAME - CURA_VERSION_PATCH - DEFAULT - 0 - DESCRIPTION - "Cura Patch Version") -GetFromEnvironmentOrCache( - NAME - CURA_VERSION_EXTRA - DESCRIPTION - "Cura Extra Version Information") -if(NOT ${CURA_VERSION_EXTRA} STREQUAL "") - set(CURA_VERSION_EXTRA "-${CURA_VERSION_EXTRA}") -endif() -set(_default_cura_version "${CURA_VERSION_MAJOR}.${CURA_VERSION_MINOR}.${CURA_VERSION_PATCH}${CURA_VERSION_EXTRA}") -if(${_default_cura_version} VERSION_GREATER 0.0.0) - set(CURA_VERSION ${_default_cura_version}) -endif() -GetFromEnvironmentOrCache( - NAME - CURA_VERSION - DESCRIPTION - "Cura Extra Version Information" - REQUIRED) - GetFromEnvironmentOrCache( NAME CURA_DEBUGMODE From d4b6f1aca05f35a8d08653a80ba35bfac024da8e Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 6 Apr 2022 07:17:47 +0200 Subject: [PATCH 150/213] Fixed version defaults somehow a difference between hoe it's handled on Mac and Linux Contributes to CURA-8640 --- CMakeLists.txt | 11 +++++------ cmake/GetFromEnvironmentOrCache.cmake | 23 ++++++++++------------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8bd5a220..cd8af946 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,21 +30,21 @@ GetFromEnvironmentOrCache( NAME CURA_VERSION_MAJOR DEFAULT - 5 + "5" DESCRIPTION "Cura Major Version") GetFromEnvironmentOrCache( NAME CURA_VERSION_MINOR DEFAULT - 0 + "0" DESCRIPTION "Cura Minor Version") GetFromEnvironmentOrCache( NAME CURA_VERSION_PATCH DEFAULT - 0 + "0" DESCRIPTION "Cura Patch Version") GetFromEnvironmentOrCache( @@ -56,12 +56,11 @@ if(NOT ${CURA_VERSION_EXTRA} STREQUAL "") set(CURA_VERSION_EXTRA "-${CURA_VERSION_EXTRA}") endif() set(_default_cura_version "${CURA_VERSION_MAJOR}.${CURA_VERSION_MINOR}.${CURA_VERSION_PATCH}${CURA_VERSION_EXTRA}") -if(${_default_cura_version} VERSION_GREATER 0.0.0) - set(CURA_VERSION ${_default_cura_version}) -endif() GetFromEnvironmentOrCache( NAME CURA_VERSION + DEFAULT + ${_default_cura_version} DESCRIPTION "Cura Extra Version Information" REQUIRED) diff --git a/cmake/GetFromEnvironmentOrCache.cmake b/cmake/GetFromEnvironmentOrCache.cmake index a59e0648..e03d61db 100644 --- a/cmake/GetFromEnvironmentOrCache.cmake +++ b/cmake/GetFromEnvironmentOrCache.cmake @@ -1,6 +1,6 @@ # Copyright 2022 Ultimaker -function(GetFromEnvironmentOrCache) +macro(GetFromEnvironmentOrCache) set(options BOOL FILEPATH PATH STRING INTERNAL REQUIRED) set(oneValueArgs NAME DEFAULT DESCRIPTION) set(multiValueArgs ) @@ -31,11 +31,10 @@ function(GetFromEnvironmentOrCache) elseif(DEFINED VAR_DEFAULT) set(VAR_VALUE ${VAR_DEFAULT}) message(STATUS "Using default value for ${VAR_NAME}: ${VAR_VALUE}") - endif() - if(VAR_REQUIRED AND NOT VAR_VALUE) + elseif(VAR_REQUIRED) message(SEND_ERROR "${VAR_NAME} is a required variable, either provide a commandline arg, environment variable or default value") else() - set(VAR_VALUE "") + set(VAR_VALUE ) message(STATUS "Using empty default value for ${VAR_NAME}") endif() @@ -43,15 +42,13 @@ function(GetFromEnvironmentOrCache) set(VAR_DESCRIPTION "") endif() - if(DEFINED VAR_VALUE) - set(${VAR_NAME} - ${VAR_VALUE} - CACHE - ${VAR_CACHE} - ${VAR_DESCRIPTION} - FORCE) - endif() + set(${VAR_NAME} + "${VAR_VALUE}" + CACHE + ${VAR_CACHE} + ${VAR_DESCRIPTION} + FORCE) else() message(STATUS "Using CMake provided variable ${VAR_NAME}: ${${VAR_NAME}}") endif() -endfunction() \ No newline at end of file +endmacro() \ No newline at end of file From 7fa8a7b017b9b4d101833b7fdefab797e7b3a949 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Wed, 6 Apr 2022 09:39:21 +0200 Subject: [PATCH 151/213] Fixed paths Contributes to CURA-8640 --- cmake/pyinstaller.cmake | 49 ++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index c0795e59..b55b7960 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -7,11 +7,11 @@ set(pyinstaller_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/pyinstaller) set(cura_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/cura_app.py) set(curaengine_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/CuraEngine) -set(installer_DIR ${CMAKE_INSTALL_PREFIX}/installer) -set(ULTIMAKER_CURA_PATH ${installer_DIR}/dist/Ultimaker-Cura) +set(installer_DIR "${CMAKE_INSTALL_PREFIX}/installer") +set(ULTIMAKER_CURA_PATH "${installer_DIR}/dist/Ultimaker-Cura") if (APPLE) - set(ULTIMAKER_CURA_APP_PATH ${ULTIMAKER_CURA_PATH}.app) + set(ULTIMAKER_CURA_APP_PATH "${ULTIMAKER_CURA_PATH}.app") GetFromEnvironmentOrCache( NAME SIGN_DMG @@ -20,7 +20,6 @@ if (APPLE) BOOL DESCRIPTION "Sign the dmg") - if (SIGN_DMG) GetFromEnvironmentOrCache( NAME @@ -35,7 +34,7 @@ if (APPLE) nl.ultimaker.cura.dmg DESCRIPTION "The Ultimaker Cura domain to be used (usually reversed)") - set(extra_pyinstaller_args "--codesign-identity \"${CODESIGN_IDENTITY}\" --osx-entitlements-file \"${CMAKE_SOURCE_DIR}\\signing\\cura.entitlements\" --osx-bundle-identifier \"${ULTIMAKER_CURA_DOMAIN}\" ") + set(extra_pyinstaller_args --codesign-identity "${CODESIGN_IDENTITY}" --osx-entitlements-file "${CMAKE_SOURCE_DIR}/signing/cura.entitlements" --osx-bundle-identifier "${ULTIMAKER_CURA_DOMAIN}" ) endif () else () set(extra_pyinstaller_args) @@ -46,27 +45,27 @@ add_custom_target(pyinstaller ALL COMMENT "Collect the build artifacts in a sing add_custom_command( TARGET - pyinstaller + pyinstaller WORKING_DIRECTORY - ${installer_DIR} + ${installer_DIR} COMMAND - ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${pyinstaller_EXECUTABLE} ${cura_EXECUTABLE} - --collect-all cura - --collect-all UM - --collect-all serial #Used only in plug-ins. - --collect-all Charon - --hidden-import pySavitar - --hidden-import pyArcus - --hidden-import pynest2d - --hidden-import PyQt6.QtNetwork - --hidden-import zeroconf - --add-binary "${curaengine_EXECUTABLE}:." - --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins:plugins" - --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins:plugins" - --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources:resources" - --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources:resources" - --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/:resources/qml/UM/" - --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} - --name "Ultimaker-Cura" + ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${pyinstaller_EXECUTABLE} ${cura_EXECUTABLE} + --collect-all cura + --collect-all UM + --collect-all serial #Used only in plug-ins. + --collect-all Charon + --hidden-import pySavitar + --hidden-import pyArcus + --hidden-import pynest2d + --hidden-import PyQt6.QtNetwork + --hidden-import zeroconf + --add-binary "${curaengine_EXECUTABLE}:." + --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins:plugins" + --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins:plugins" + --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources:resources" + --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources:resources" + --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/:resources/qml/UM/" + --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} + --name "Ultimaker-Cura" DEPENDS install-python-requirements Cura create_installer_dir) add_dependencies(pyinstaller install-python-requirements Cura create_installer_dir) \ No newline at end of file From 523e2e2db12e4b6c1c869fbb6f1a7a34f4a579a5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 6 Apr 2022 14:31:42 +0200 Subject: [PATCH 152/213] Add fuse for using AppImageKit It's necessary because AppImage uses that as the file system when mounted. Contributes to issue CURA-8640. --- docker/linux/gcc/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/linux/gcc/Dockerfile b/docker/linux/gcc/Dockerfile index aedbafe6..7b0111e7 100644 --- a/docker/linux/gcc/Dockerfile +++ b/docker/linux/gcc/Dockerfile @@ -28,6 +28,8 @@ RUN apt-get -qq update \ dh-autoreconf \ libffi-dev \ libssl-dev \ + fuse \ + libfuse2 \ pkg-config RUN wget -q --no-check-certificate http://mirrors.concertpass.com/gcc/releases/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.xz \ From 8857c2123a84f54c6c2c1b5acd405f24be4f3386 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 6 Apr 2022 16:40:40 +0200 Subject: [PATCH 153/213] Many changes for making stuff work on Windows Yeah I know not a proper commit message. But I need to share these changes with Vagos Contributes to Cura-8640 --- cmake/conan.cmake | 10 ++---- conanfile.py | 55 +++++++++++++++++++++++++++++++++ conanfile.txt | 15 --------- projects/arcus.cmake | 6 ++-- projects/charon.cmake | 1 + projects/cura-binary-data.cmake | 1 + projects/cura.cmake | 1 + projects/curaengine.cmake | 2 +- projects/fdm_materials.cmake | 1 + projects/libnest2d.cmake | 1 + projects/pynest2d.cmake | 8 +++-- projects/requirements.txt | 19 +++++------- projects/savitar.cmake | 8 +++-- projects/uranium.cmake | 1 + 14 files changed, 85 insertions(+), 44 deletions(-) create mode 100644 conanfile.py delete mode 100644 conanfile.txt diff --git a/cmake/conan.cmake b/cmake/conan.cmake index 974f5b63..950f4478 100644 --- a/cmake/conan.cmake +++ b/cmake/conan.cmake @@ -15,15 +15,9 @@ conan_check(VERSION 1.46.0 REQUIRED) conan_cmake_run( BASIC_SETUP CONANFILE - conanfile.txt - GENERATORS - VirtualRunEnv - VirtualBuildEnv - CMakeDeps - CMakeToolchain - json + conanfile.py PROFILE - cura_release.jinja + default BUILD missing ) diff --git a/conanfile.py b/conanfile.py new file mode 100644 index 00000000..b59b0027 --- /dev/null +++ b/conanfile.py @@ -0,0 +1,55 @@ +from pathlib import Path + +from conan import ConanFile +from conan.tools.cmake import CMakeToolchain, CMakeDeps, CMake + +from conans.errors import ConanInvalidConfiguration +from conans.tools import Version +from conan.tools.files import files + +required_conan_version = ">=1.46.2" + + +class CuraBuildEnvironemtConan(ConanFile): + name = "cura-build-environment" + description = "Building Cura dependencies" + topics = ("conan", "python", "pypi", "pip") + settings = "os", "compiler", "build_type", "arch" + build_policy = "missing" + + @property + def _site_packages(self): + return "site-packages" + + def configure(self): + self.options["boost"].header_only = True + + def requirements(self): + self.requires("protobuf/3.17.1") + self.requires("clipper/6.4.2") + self.requires("boost/1.70.0") + self.requires("gtest/1.8.1") + self.requires("nlopt/2.7.0") + + def generate(self): + cmake = CMakeDeps(self) + cmake.generate() + + tc = CMakeToolchain(self) + tc.variables["CHARON_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" + tc.variables["CURA_BRANCH_OR_TAG"] = "origin/qt6_beyond_the_splash" + tc.variables["URANIUM_BRANCH_OR_TAG"] = "origin/qt6_beyond_the_splash" + tc.variables["ARCUS_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" + tc.variables["SAVITAR_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" + tc.variables["LIBNEST2D_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" + tc.variables["PYNEST2D_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" + tc.variables["ARCUS_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" + tc.variables["ARCUS_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" + tc.variables["ARCUS_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" + tc.variables["ARCUS_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" + tc.variables["CURAENGINE_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" + + tc.variables["CURA_VERSION_MAJOR"] = "5" + tc.variables["CURA_VERSION_EXTRA"] = "a+1" + + tc.generate() diff --git a/conanfile.txt b/conanfile.txt deleted file mode 100644 index cb6654f9..00000000 --- a/conanfile.txt +++ /dev/null @@ -1,15 +0,0 @@ -[requires] -protobuf/3.17.1 -clipper/6.4.2 -boost/1.70.0 -gtest/1.8.1 -nlopt/2.7.0 - -[generators] -VirtualRunEnv -VirtualBuildEnv -CMakeDeps -CMakeToolchain -json - -[options] \ No newline at end of file diff --git a/projects/arcus.cmake b/projects/arcus.cmake index a3ad8f7f..03c7d379 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -12,13 +12,15 @@ GetFromEnvironmentOrCache( ExternalProject_Add(Arcus GIT_REPOSITORY https://github.com/Ultimaker/libArcus.git GIT_TAG ${ARCUS_BRANCH_OR_TAG} + CMAKE_GENERATOR ${CMAKE_GENERATOR} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build + -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/${exe_path}/sip-build -DPYTHONPATH=${PYTHONPATH} -DPython_SITELIB_LOCAL=${Python_SITELIB_LOCAL} - -DPython_ROOT=${Python_ROOT} + -DPython_ROOT=${CMAKE_INSTALL_PREFIX} + -DPython_EXECUTABLE=${Python_VENV_EXECUTABLE} DEPENDS install-python-requirements) add_dependencies(projects Arcus) diff --git a/projects/charon.cmake b/projects/charon.cmake index 9eacb67b..98880505 100644 --- a/projects/charon.cmake +++ b/projects/charon.cmake @@ -12,6 +12,7 @@ GetFromEnvironmentOrCache( ExternalProject_Add(Charon GIT_REPOSITORY https://github.com/Ultimaker/libCharon GIT_TAG ${CHARON_BRANCH_OR_TAG} + CMAKE_GENERATOR ${CMAKE_GENERATOR} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} diff --git a/projects/cura-binary-data.cmake b/projects/cura-binary-data.cmake index 278775fd..5761582c 100644 --- a/projects/cura-binary-data.cmake +++ b/projects/cura-binary-data.cmake @@ -14,6 +14,7 @@ ExternalProject_Add(cura-binary-data GIT_TAG ${CURABINARYDATA_BRANCH_OR_TAG} GIT_SHALLOW 1 STEP_TARGETS update + CMAKE_GENERATOR ${CMAKE_GENERATOR} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} diff --git a/projects/cura.cmake b/projects/cura.cmake index 11e66da1..869f5055 100644 --- a/projects/cura.cmake +++ b/projects/cura.cmake @@ -55,6 +55,7 @@ ExternalProject_Add(Cura GIT_TAG ${CURA_BRANCH_OR_TAG} GIT_SHALLOW 1 STEP_TARGETS update + CMAKE_GENERATOR ${CMAKE_GENERATOR} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} diff --git a/projects/curaengine.cmake b/projects/curaengine.cmake index 90cff877..2375d2ee 100644 --- a/projects/curaengine.cmake +++ b/projects/curaengine.cmake @@ -21,7 +21,7 @@ ExternalProject_Add(CuraEngine GIT_TAG ${CURAENGINE_BRANCH_OR_TAG} GIT_SHALLOW 1 STEP_TARGETS update - CMAKE_GENERATOR "$,MinGW Makefiles,${CMAKE_GENERATOR}>" + CMAKE_GENERATOR ${CMAKE_GENERATOR} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} diff --git a/projects/fdm_materials.cmake b/projects/fdm_materials.cmake index cf7cdb68..ac0dd635 100644 --- a/projects/fdm_materials.cmake +++ b/projects/fdm_materials.cmake @@ -14,6 +14,7 @@ ExternalProject_Add(fdm_materials GIT_TAG ${FDMMATERIALS_BRANCH_OR_TAG} GIT_SHALLOW 1 STEP_TARGETS update + CMAKE_GENERATOR ${CMAKE_GENERATOR} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} diff --git a/projects/libnest2d.cmake b/projects/libnest2d.cmake index 48b7405b..d77c1329 100644 --- a/projects/libnest2d.cmake +++ b/projects/libnest2d.cmake @@ -12,6 +12,7 @@ GetFromEnvironmentOrCache( ExternalProject_Add(libnest2d GIT_REPOSITORY https://github.com/Ultimaker/libnest2d.git GIT_TAG ${LIBNEST2D_BRANCH_OR_TAG} + CMAKE_GENERATOR ${CMAKE_GENERATOR} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index 5de48472..f1b6e915 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -12,13 +12,15 @@ GetFromEnvironmentOrCache( ExternalProject_Add(pynest2d GIT_REPOSITORY https://github.com/Ultimaker/pynest2d.git GIT_TAG ${PYNEST2D_BRANCH_OR_TAG} + CMAKE_GENERATOR ${CMAKE_GENERATOR} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build + -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/${exe_path}/sip-build -DPYTHONPATH=${PYTHONPATH} - -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ - -DPython_ROOT=${Python_ROOT} + -DPython_SITELIB_LOCAL=${Python_SITELIB_LOCAL} + -DPython_ROOT=${CMAKE_INSTALL_PREFIX} + -DPython_EXECUTABLE=${Python_VENV_EXECUTABLE} DEPENDS libnest2d install-python-requirements) add_dependencies(projects pynest2d) diff --git a/projects/requirements.txt b/projects/requirements.txt index a8546913..f6c118bb 100644 --- a/projects/requirements.txt +++ b/projects/requirements.txt @@ -124,13 +124,11 @@ mypy==0.931 \ --hash=sha256:ff3bf387c14c805ab1388185dd22d6b210824e164d4bb324b195ff34e322d166 # cryptography is needed before we collect/install PyQt5 -cffi==1.14.1 \ - --hash=sha256:267adcf6e68d77ba154334a3e4fc921b8e63cbb38ca00d33d40655d4228502bc \ - --hash=sha256:6923d077d9ae9e8bacbdb1c07ae78405a9306c8fd1af13bfa06ca891095eb995 \ - --hash=sha256:98be759efdb5e5fa161e46d404f4e0ce388e72fbf7d9baf010aff16689e22abe \ - --hash=sha256:b1d6ebc891607e71fd9da71688fcf332a6630b7f5b7f5549e6e631821c0e5d90 \ - --hash=sha256:b2a2b0d276a136146e012154baefaea2758ef1f56ae9f4e01c612b0831e0bd2f \ - --hash=sha256:d3148b6ba3923c5850ea197a91a42683f946dba7e8eb82dfa211ab7e708de939 +cffi==1.15.0 \ + --hash=sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954 \ + --hash=sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0 \ + --hash=sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3 \ + --hash=sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2 pycparser==2.20 \ --hash=sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705 @@ -200,8 +198,8 @@ decorator==4.4.0 \ idna==2.8 \ --hash=sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407 \ --hash=sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c -netifaces==0.10.9 \ - --hash=sha256:2dee9ffdd16292878336a58d04a20f0ffe95555465fee7c9bd23b3490ef2abf3 +netifaces==0.11.0 \ + --hash=sha256:043a79146eb2907edf439899f262b3dfe41717d34124298ed281139a8b93ca32 networkx==2.6.2 \ --hash=sha256:2306f1950ce772c5a59a57f5486d59bb9cab98497c45fc49cbc45ac0dec119bb \ --hash=sha256:5fcb7004be69e8fbdf07dcb502efa5c77cadcaad6982164134eeb9721f826c2e @@ -368,6 +366,3 @@ pywin32-ctypes==0.2.0; \ sys_platform=="win32" \ --hash=sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942 \ --hash=sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98 -cx-Logging==3.0; \ - sys_platform=="win32" \ - --hash=sha256:ba8a7465facf7b98d8f494030fb481a2e8aeee29dc191e10383bb54ed42bdb34 diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 3d3b4596..15d2f13c 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -12,13 +12,15 @@ GetFromEnvironmentOrCache( ExternalProject_Add(Savitar GIT_REPOSITORY https://github.com/ultimaker/libSavitar.git GIT_TAG ${SAVITAR_BRANCH_OR_TAG} + CMAKE_GENERATOR ${CMAKE_GENERATOR} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/bin/sip-build + -DSIP_BUILD_EXECUTABLE=${CMAKE_INSTALL_PREFIX}/${exe_path}/sip-build -DPYTHONPATH=${PYTHONPATH} - -DPython_SITELIB_LOCAL=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/ - -DPython_ROOT=${Python_ROOT} + -DPython_SITELIB_LOCAL=${Python_SITELIB_LOCAL} + -DPython_ROOT=${CMAKE_INSTALL_PREFIX} + -DPython_EXECUTABLE=${Python_VENV_EXECUTABLE} DEPENDS install-python-requirements) add_dependencies(projects Savitar) diff --git a/projects/uranium.cmake b/projects/uranium.cmake index 161e94d0..3de25ab9 100644 --- a/projects/uranium.cmake +++ b/projects/uranium.cmake @@ -18,6 +18,7 @@ GetFromEnvironmentOrCache( ExternalProject_Add(Uranium GIT_REPOSITORY https://github.com/ultimaker/Uranium GIT_TAG ${URANIUM_BRANCH_OR_TAG} + CMAKE_GENERATOR ${CMAKE_GENERATOR} CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} From fb6594a1bcc36d78f7450a7423231f14d81e9193 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 7 Apr 2022 05:23:18 +0200 Subject: [PATCH 154/213] Using boost 1.78 This allows us to Compile CuraEngine with the Visual Studio compiler No More MinGW for us! You have served us well but it's time to part and each go our seperate way. Contributes to Cura-8640 --- conanfile.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index b59b0027..aa5ce319 100644 --- a/conanfile.py +++ b/conanfile.py @@ -27,7 +27,7 @@ def configure(self): def requirements(self): self.requires("protobuf/3.17.1") self.requires("clipper/6.4.2") - self.requires("boost/1.70.0") + self.requires("boost/1.78.0") self.requires("gtest/1.8.1") self.requires("nlopt/2.7.0") @@ -36,6 +36,12 @@ def generate(self): cmake.generate() tc = CMakeToolchain(self) + + # Don't use Visual Studio as the CMAKE_GENERATOR + if self.settings.compiler == "Visual Studio": + tc.blocks["generic_system"].values["generator_platform"] = None + tc.blocks["generic_system"].values["toolset"] = None + tc.variables["CHARON_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" tc.variables["CURA_BRANCH_OR_TAG"] = "origin/qt6_beyond_the_splash" tc.variables["URANIUM_BRANCH_OR_TAG"] = "origin/qt6_beyond_the_splash" From b1f37532acd8c82bd69b85130cbefb4623deacce Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 7 Apr 2022 05:23:29 +0200 Subject: [PATCH 155/213] Using boost 1.78 This allows us to Compile CuraEngine with the Visual Studio compiler No More MinGW for us! You have served us well but it's time to part and each go our seperate way. Contributes to Cura-8640 --- conanfile.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/conanfile.py b/conanfile.py index aa5ce319..1fb7bca1 100644 --- a/conanfile.py +++ b/conanfile.py @@ -17,10 +17,6 @@ class CuraBuildEnvironemtConan(ConanFile): settings = "os", "compiler", "build_type", "arch" build_policy = "missing" - @property - def _site_packages(self): - return "site-packages" - def configure(self): self.options["boost"].header_only = True From b06acf23505be06fd0b67d3fc02971648b0f5381 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 7 Apr 2022 07:14:43 +0200 Subject: [PATCH 156/213] Add rapidjson and stb as dependencies Cleaned up the CuraEngine and allowed for reuse of clipper, boost, rapidjson and stb Contributes to Cura-8640 --- conanfile.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conanfile.py b/conanfile.py index 1fb7bca1..2fabb0c8 100644 --- a/conanfile.py +++ b/conanfile.py @@ -26,6 +26,8 @@ def requirements(self): self.requires("boost/1.78.0") self.requires("gtest/1.8.1") self.requires("nlopt/2.7.0") + self.requires("rapidjson/1.1.0") + self.requires("stb/20200203") def generate(self): cmake = CMakeDeps(self) From c1206e5786cc1bcbb282cee0fe459932292515ef Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 7 Apr 2022 08:09:08 +0200 Subject: [PATCH 157/213] Specified the correct dependency traversal tree Contributes to Cura-8640 --- CMakeLists.txt | 10 ++++------ cmake/pyinstaller.cmake | 5 ++--- projects/arcus.cmake | 5 ++--- projects/charon.cmake | 5 ++--- projects/cura-binary-data.cmake | 2 +- projects/cura.cmake | 6 ++---- projects/curaengine.cmake | 5 ++--- projects/fdm_materials.cmake | 2 +- projects/libnest2d.cmake | 3 +-- projects/pynest2d.cmake | 5 ++--- projects/python.cmake | 7 ++----- projects/savitar.cmake | 5 ++--- projects/uranium.cmake | 5 ++--- 13 files changed, 25 insertions(+), 40 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cd8af946..5d0402bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,19 +65,17 @@ GetFromEnvironmentOrCache( "Cura Extra Version Information" REQUIRED) -add_custom_target(projects) - include(projects/python.cmake) -include(projects/uranium.cmake) include(projects/charon.cmake) +include(projects/savitar.cmake) +include(projects/arcus.cmake) +include(projects/uranium.cmake) include(projects/libnest2d.cmake) include(projects/pynest2d.cmake) -include(projects/arcus.cmake) -include(projects/savitar.cmake) include(projects/curaengine.cmake) +include(projects/cura.cmake) include(projects/fdm_materials.cmake) include(projects/cura-binary-data.cmake) -include(projects/cura.cmake) # Collect the artifacts with pyinstaller include(cmake/pyinstaller.cmake) diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index b55b7960..b1337d38 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -66,6 +66,5 @@ add_custom_command( --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources:resources" --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/:resources/qml/UM/" --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} - --name "Ultimaker-Cura" - DEPENDS install-python-requirements Cura create_installer_dir) -add_dependencies(pyinstaller install-python-requirements Cura create_installer_dir) \ No newline at end of file + --name "Ultimaker-Cura") +add_dependencies(pyinstaller create_installer_dir install-python-requirements Cura fdm_materials cura-binary-data) \ No newline at end of file diff --git a/projects/arcus.cmake b/projects/arcus.cmake index 03c7d379..082de5ac 100644 --- a/projects/arcus.cmake +++ b/projects/arcus.cmake @@ -21,6 +21,5 @@ ExternalProject_Add(Arcus -DPYTHONPATH=${PYTHONPATH} -DPython_SITELIB_LOCAL=${Python_SITELIB_LOCAL} -DPython_ROOT=${CMAKE_INSTALL_PREFIX} - -DPython_EXECUTABLE=${Python_VENV_EXECUTABLE} - DEPENDS install-python-requirements) -add_dependencies(projects Arcus) + -DPython_EXECUTABLE=${Python_VENV_EXECUTABLE}) +add_dependencies(Arcus install-python-requirements) diff --git a/projects/charon.cmake b/projects/charon.cmake index 98880505..016799ff 100644 --- a/projects/charon.cmake +++ b/projects/charon.cmake @@ -18,6 +18,5 @@ ExternalProject_Add(Charon -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DPython_ROOT=${Python_ROOT} - -DPython_SITELIB_LOCAL=${Python_SITELIB_LOCAL} - DEPENDS create-virtual-env) -add_dependencies(projects Charon) + -DPython_SITELIB_LOCAL=${Python_SITELIB_LOCAL}) +add_dependencies(Charon install-python-requirements) diff --git a/projects/cura-binary-data.cmake b/projects/cura-binary-data.cmake index 5761582c..92aa03c7 100644 --- a/projects/cura-binary-data.cmake +++ b/projects/cura-binary-data.cmake @@ -19,4 +19,4 @@ ExternalProject_Add(cura-binary-data -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) -add_dependencies(projects cura-binary-data) +add_dependencies(cura-binary-data Cura Uranium) diff --git a/projects/cura.cmake b/projects/cura.cmake index 869f5055..9b5e67c1 100644 --- a/projects/cura.cmake +++ b/projects/cura.cmake @@ -71,7 +71,5 @@ ExternalProject_Add(Cura -DCURA_CLOUD_ACCOUNT_API_ROOT=${CURA_CLOUD_ACCOUNT_API_ROOT} -DCURA_DIGITAL_FACTORY_URL=${CURA_DIGITAL_FACTORY_URL} -DCURA_MARKETPLACE_ROOT=${CURA_MARKETPLACE_ROOT} - -DCURA_NO_INSTALL_PLUGINS=${CURA_NO_INSTALL_PLUGINS} - DEPENDS install-python-requirements CuraEngine Uranium pynest2d Charon Savitar fdm_materials cura-binary-data -) -add_dependencies(projects Cura) + -DCURA_NO_INSTALL_PLUGINS=${CURA_NO_INSTALL_PLUGINS}) +add_dependencies(Cura install-python-requirements Arcus Savitar Uranium CuraEngine) diff --git a/projects/curaengine.cmake b/projects/curaengine.cmake index 2375d2ee..513faddc 100644 --- a/projects/curaengine.cmake +++ b/projects/curaengine.cmake @@ -26,6 +26,5 @@ ExternalProject_Add(CuraEngine -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - -DCURA_ENGINE_VERSION=${CURA_ENGINE_VERSION} - DEPENDS Arcus) -add_dependencies(projects CuraEngine) \ No newline at end of file + -DCURA_ENGINE_VERSION=${CURA_ENGINE_VERSION}) +add_dependencies(CuraEngine Arcus) \ No newline at end of file diff --git a/projects/fdm_materials.cmake b/projects/fdm_materials.cmake index ac0dd635..d25d5196 100644 --- a/projects/fdm_materials.cmake +++ b/projects/fdm_materials.cmake @@ -19,4 +19,4 @@ ExternalProject_Add(fdm_materials -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) -add_dependencies(projects fdm_materials) +add_dependencies(fdm_materials Cura) diff --git a/projects/libnest2d.cmake b/projects/libnest2d.cmake index d77c1329..b561ea0c 100644 --- a/projects/libnest2d.cmake +++ b/projects/libnest2d.cmake @@ -16,5 +16,4 @@ ExternalProject_Add(libnest2d CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) -add_dependencies(projects libnest2d) \ No newline at end of file + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) \ No newline at end of file diff --git a/projects/pynest2d.cmake b/projects/pynest2d.cmake index f1b6e915..df4b99f1 100644 --- a/projects/pynest2d.cmake +++ b/projects/pynest2d.cmake @@ -21,6 +21,5 @@ ExternalProject_Add(pynest2d -DPYTHONPATH=${PYTHONPATH} -DPython_SITELIB_LOCAL=${Python_SITELIB_LOCAL} -DPython_ROOT=${CMAKE_INSTALL_PREFIX} - -DPython_EXECUTABLE=${Python_VENV_EXECUTABLE} - DEPENDS libnest2d install-python-requirements) -add_dependencies(projects pynest2d) + -DPython_EXECUTABLE=${Python_VENV_EXECUTABLE}) +add_dependencies(pynest2d install-python-requirements libnest2d) diff --git a/projects/python.cmake b/projects/python.cmake index 5b83ed26..d955b39c 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -44,14 +44,11 @@ set(Python_SITELIB_LOCAL ${CMAKE_INSTALL_PREFIX}/${lib_path}/site-packages/) add_custom_target(create-virtual-env ALL COMMENT "Create Virtual Environment") add_custom_command( TARGET create-virtual-env - COMMAND ${Python_EXECUTABLE} -m venv ${CMAKE_INSTALL_PREFIX} - MAIN_DEPENDENCY ${Python_EXECUTABLE}) + COMMAND ${Python_EXECUTABLE} -m venv ${CMAKE_INSTALL_PREFIX}) add_custom_target(install-python-requirements ALL COMMENT "Install python requirements in virtual environment") add_custom_command( TARGET install-python-requirements - COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${Python_VENV_EXECUTABLE} -m pip install --prefix ${CMAKE_INSTALL_PREFIX} --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt - MAIN_DEPENDENCY ${Python_VENV_EXECUTABLE} - DEPENDS create-virtual-env) + COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${Python_VENV_EXECUTABLE} -m pip install --prefix ${CMAKE_INSTALL_PREFIX} --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt) add_dependencies(install-python-requirements create-virtual-env) diff --git a/projects/savitar.cmake b/projects/savitar.cmake index 15d2f13c..4ca0987c 100644 --- a/projects/savitar.cmake +++ b/projects/savitar.cmake @@ -21,6 +21,5 @@ ExternalProject_Add(Savitar -DPYTHONPATH=${PYTHONPATH} -DPython_SITELIB_LOCAL=${Python_SITELIB_LOCAL} -DPython_ROOT=${CMAKE_INSTALL_PREFIX} - -DPython_EXECUTABLE=${Python_VENV_EXECUTABLE} - DEPENDS install-python-requirements) -add_dependencies(projects Savitar) + -DPython_EXECUTABLE=${Python_VENV_EXECUTABLE}) +add_dependencies(Savitar install-python-requirements) diff --git a/projects/uranium.cmake b/projects/uranium.cmake index 3de25ab9..14c46be9 100644 --- a/projects/uranium.cmake +++ b/projects/uranium.cmake @@ -25,6 +25,5 @@ ExternalProject_Add(Uranium -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DPython_ROOT=${Python_ROOT} -DPython_SITELIB_LOCAL=${Python_SITELIB_LOCAL} - -DUM_NO_INSTALL_PLUGINS=${CURA_NO_INSTALL_PLUGINS} - DEPENDS install-python-requirements) -add_dependencies(projects Uranium) + -DUM_NO_INSTALL_PLUGINS=${CURA_NO_INSTALL_PLUGINS}) +add_dependencies(Uranium install-python-requirements Arcus Savitar) From f256ac64ec13b9813978320ef38ae4a176f15b3f Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 7 Apr 2022 08:09:52 +0200 Subject: [PATCH 158/213] Fixed windows paths Contributes to Cura-8640 --- cmake/pyinstaller.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index b1337d38..4f74f811 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -4,9 +4,9 @@ # Sets up a virtual environment using the Python interpreter -set(pyinstaller_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/pyinstaller) +set(pyinstaller_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/${exe_path}/pyinstaller) set(cura_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/cura_app.py) -set(curaengine_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/CuraEngine) +set(curaengine_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/CuraEngine${exe_ext}) set(installer_DIR "${CMAKE_INSTALL_PREFIX}/installer") set(ULTIMAKER_CURA_PATH "${installer_DIR}/dist/Ultimaker-Cura") From 3289f43c3f3df749ffae715e912550113f14731f Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 7 Apr 2022 08:18:43 +0200 Subject: [PATCH 159/213] Fixed windows path seperator Contributes to Cura-8640 --- cmake/pyinstaller.cmake | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index 4f74f811..819707de 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -59,12 +59,12 @@ add_custom_command( --hidden-import pynest2d --hidden-import PyQt6.QtNetwork --hidden-import zeroconf - --add-binary "${curaengine_EXECUTABLE}:." - --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins:plugins" - --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins:plugins" - --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources:resources" - --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources:resources" - --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/:resources/qml/UM/" + --add-binary "${curaengine_EXECUTABLE}${env_path_sep}." + --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins${env_path_sep}plugins" + --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins${env_path_sep}plugins" + --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources${env_path_sep}resources" + --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources${env_path_sep}resources" + --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/${env_path_sep}resources/qml/UM/" --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} --name "Ultimaker-Cura") add_dependencies(pyinstaller create_installer_dir install-python-requirements Cura fdm_materials cura-binary-data) \ No newline at end of file From 5b602f8f048949de8eeb311a029bbac35c9c42d7 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 7 Apr 2022 08:19:34 +0200 Subject: [PATCH 160/213] Added missing dependency pynest2d to Cura Contributes to Cura-8640 --- projects/cura.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/cura.cmake b/projects/cura.cmake index 9b5e67c1..ea753ccc 100644 --- a/projects/cura.cmake +++ b/projects/cura.cmake @@ -72,4 +72,4 @@ ExternalProject_Add(Cura -DCURA_DIGITAL_FACTORY_URL=${CURA_DIGITAL_FACTORY_URL} -DCURA_MARKETPLACE_ROOT=${CURA_MARKETPLACE_ROOT} -DCURA_NO_INSTALL_PLUGINS=${CURA_NO_INSTALL_PLUGINS}) -add_dependencies(Cura install-python-requirements Arcus Savitar Uranium CuraEngine) +add_dependencies(Cura install-python-requirements Arcus Savitar Uranium CuraEngine pynest2d) From 31bed9dd5e859c12b3bb8309b3faaea2a74e7f10 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 7 Apr 2022 10:14:45 +0200 Subject: [PATCH 161/213] Added missing dependency Charon to Cura Contributes to Cura-8640 --- projects/cura.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/cura.cmake b/projects/cura.cmake index ea753ccc..05035042 100644 --- a/projects/cura.cmake +++ b/projects/cura.cmake @@ -72,4 +72,4 @@ ExternalProject_Add(Cura -DCURA_DIGITAL_FACTORY_URL=${CURA_DIGITAL_FACTORY_URL} -DCURA_MARKETPLACE_ROOT=${CURA_MARKETPLACE_ROOT} -DCURA_NO_INSTALL_PLUGINS=${CURA_NO_INSTALL_PLUGINS}) -add_dependencies(Cura install-python-requirements Arcus Savitar Uranium CuraEngine pynest2d) +add_dependencies(Cura install-python-requirements Arcus Savitar Uranium CuraEngine pynest2d Charon) From 32b6c2b9db59834b9f24df5b66bbe30b051d79d1 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 7 Apr 2022 10:49:58 +0200 Subject: [PATCH 162/213] Added Cura binary branch to conanfile These branches are just for easy debugging. These CMake variables should be set by the rundeck script in the end. Contributes to Cura-8640 --- conanfile.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/conanfile.py b/conanfile.py index 2fabb0c8..23a235f5 100644 --- a/conanfile.py +++ b/conanfile.py @@ -48,10 +48,8 @@ def generate(self): tc.variables["LIBNEST2D_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" tc.variables["PYNEST2D_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" tc.variables["ARCUS_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" - tc.variables["ARCUS_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" - tc.variables["ARCUS_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" - tc.variables["ARCUS_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" tc.variables["CURAENGINE_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6_upgrade" + tc.variables["CURABINARYDATA_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6" tc.variables["CURA_VERSION_MAJOR"] = "5" tc.variables["CURA_VERSION_EXTRA"] = "a+1" From 13917deca971f7bcdd631d52eadd7eb4c0cd4cd3 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 7 Apr 2022 11:13:36 +0200 Subject: [PATCH 163/213] Differentiate between Lib and lib Contributes to Cura-8640 --- cmake/pyinstaller.cmake | 6 +++--- projects/python.cmake | 8 +++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index 819707de..25bfd6f3 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -60,11 +60,11 @@ add_custom_command( --hidden-import PyQt6.QtNetwork --hidden-import zeroconf --add-binary "${curaengine_EXECUTABLE}${env_path_sep}." - --add-data "${CMAKE_INSTALL_PREFIX}/lib/cura/plugins${env_path_sep}plugins" - --add-data "${CMAKE_INSTALL_PREFIX}/lib/uranium/plugins${env_path_sep}plugins" + --add-data "${CMAKE_INSTALL_PREFIX}/${lib_path}/cura/plugins${env_path_sep}plugins" + --add-data "${CMAKE_INSTALL_PREFIX}/${lib_path}/uranium/plugins${env_path_sep}plugins" --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources${env_path_sep}resources" --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources${env_path_sep}resources" --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/${env_path_sep}resources/qml/UM/" --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} --name "Ultimaker-Cura") -add_dependencies(pyinstaller create_installer_dir install-python-requirements Cura fdm_materials cura-binary-data) \ No newline at end of file +#add_dependencies(pyinstaller create_installer_dir install-python-requirements Cura fdm_materials cura-binary-data) \ No newline at end of file diff --git a/projects/python.cmake b/projects/python.cmake index d955b39c..fe3d1a87 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -29,17 +29,19 @@ if(WIN32) set(exe_ext ".exe") set(exe_path "Scripts") set(lib_path "Lib") + set(python_lib_path "${python_lib_path}") else() set(ext .so) set(env_path_sep ":") set(exe_ext "") set(exe_path "bin") - set(lib_path "lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}") + set(lib_path "lib") + set(python_lib_path "${lib_path}/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}") endif() -set(PYTHONPATH ${CMAKE_INSTALL_PREFIX}/${lib_path}/site-packages) +set(PYTHONPATH ${CMAKE_INSTALL_PREFIX}/${python_lib_path}/site-packages) set(Python_VENV_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/${exe_path}/python${exe_ext}) -set(Python_SITELIB_LOCAL ${CMAKE_INSTALL_PREFIX}/${lib_path}/site-packages/) +set(Python_SITELIB_LOCAL ${CMAKE_INSTALL_PREFIX}/${python_lib_path}/site-packages/) add_custom_target(create-virtual-env ALL COMMENT "Create Virtual Environment") add_custom_command( From 0a0f964e521b501ff48fd507cea6f82b365c0ca5 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 7 Apr 2022 11:42:07 +0200 Subject: [PATCH 164/213] Moved some OS specific code to dedicated module Contributes to Cura-8640 --- cmake/os.cmake | 19 +++++++++++++++++++ cmake/pyinstaller.cmake | 5 +++-- projects/python.cmake | 20 +------------------- 3 files changed, 23 insertions(+), 21 deletions(-) create mode 100644 cmake/os.cmake diff --git a/cmake/os.cmake b/cmake/os.cmake new file mode 100644 index 00000000..8be8ac3c --- /dev/null +++ b/cmake/os.cmake @@ -0,0 +1,19 @@ +if(WIN32) + set(ext .pyd) + set(env_path_sep ";") + set(exe_ext ".exe") + set(exe_path "Scripts") + set(lib_path "Lib") + set(python_lib_path "${lib_path}") +else() + set(ext .so) + set(env_path_sep ":") + set(exe_ext "") + set(exe_path "bin") + set(lib_path "lib") + set(python_lib_path "${lib_path}/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}") +endif() + +set(PYTHONPATH ${CMAKE_INSTALL_PREFIX}/${python_lib_path}/site-packages) +set(Python_VENV_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/${exe_path}/python${exe_ext}) +set(Python_SITELIB_LOCAL ${CMAKE_INSTALL_PREFIX}/${python_lib_path}/site-packages/) \ No newline at end of file diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index 25bfd6f3..89244987 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -42,7 +42,7 @@ endif () add_custom_target(create_installer_dir ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${installer_DIR}) add_custom_target(pyinstaller ALL COMMENT "Collect the build artifacts in a single installer") - +include(${CMAKE_SOURCE_DIR}/cmake/os.cmake) add_custom_command( TARGET pyinstaller @@ -58,6 +58,7 @@ add_custom_command( --hidden-import pyArcus --hidden-import pynest2d --hidden-import PyQt6.QtNetwork + --hidden-import logging.handlers --hidden-import zeroconf --add-binary "${curaengine_EXECUTABLE}${env_path_sep}." --add-data "${CMAKE_INSTALL_PREFIX}/${lib_path}/cura/plugins${env_path_sep}plugins" @@ -67,4 +68,4 @@ add_custom_command( --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/${env_path_sep}resources/qml/UM/" --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} --name "Ultimaker-Cura") -#add_dependencies(pyinstaller create_installer_dir install-python-requirements Cura fdm_materials cura-binary-data) \ No newline at end of file +add_dependencies(pyinstaller create_installer_dir)# install-python-requirements Cura fdm_materials cura-binary-data) \ No newline at end of file diff --git a/projects/python.cmake b/projects/python.cmake index fe3d1a87..53341ae2 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -23,25 +23,7 @@ else() endif() message(STATUS "Using Python ${Python_VERSION}") -if(WIN32) - set(ext .pyd) - set(env_path_sep ";") - set(exe_ext ".exe") - set(exe_path "Scripts") - set(lib_path "Lib") - set(python_lib_path "${python_lib_path}") -else() - set(ext .so) - set(env_path_sep ":") - set(exe_ext "") - set(exe_path "bin") - set(lib_path "lib") - set(python_lib_path "${lib_path}/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}") -endif() - -set(PYTHONPATH ${CMAKE_INSTALL_PREFIX}/${python_lib_path}/site-packages) -set(Python_VENV_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/${exe_path}/python${exe_ext}) -set(Python_SITELIB_LOCAL ${CMAKE_INSTALL_PREFIX}/${python_lib_path}/site-packages/) +include(${CMAKE_SOURCE_DIR}/cmake/os.cmake) add_custom_target(create-virtual-env ALL COMMENT "Create Virtual Environment") add_custom_command( From fbb8d7803289ac684d52d97109f4362ea8aadec5 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 7 Apr 2022 12:21:52 +0200 Subject: [PATCH 165/213] Install python reqs in two phases and add setuptools It could happen on occasion that requirements weren't ready Installing the wheel and setuptools before moving to all other requirements solved that. Contributes to Cura-8640 --- cmake/pyinstaller.cmake | 2 +- projects/base_requirements.txt | 6 ++++++ projects/python.cmake | 9 +++++++-- projects/requirements.txt | 8 -------- 4 files changed, 14 insertions(+), 11 deletions(-) create mode 100644 projects/base_requirements.txt diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index 89244987..670eb309 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -68,4 +68,4 @@ add_custom_command( --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/${env_path_sep}resources/qml/UM/" --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} --name "Ultimaker-Cura") -add_dependencies(pyinstaller create_installer_dir)# install-python-requirements Cura fdm_materials cura-binary-data) \ No newline at end of file +add_dependencies(pyinstaller create_installer_dir Cura fdm_materials cura-binary-data) \ No newline at end of file diff --git a/projects/base_requirements.txt b/projects/base_requirements.txt new file mode 100644 index 00000000..aca700c2 --- /dev/null +++ b/projects/base_requirements.txt @@ -0,0 +1,6 @@ +wheel==0.37.1 \ + --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 \ + --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a +setuptools==62.0.0 \ + --hash=sha256:7999cbd87f1b6e1f33bf47efa368b224bed5e27b5ef2c4d46580186cbcb1a86a \ + --hash=sha256:a65e3802053e99fc64c6b3b29c11132943d5b8c8facbcc461157511546510967 diff --git a/projects/python.cmake b/projects/python.cmake index 53341ae2..195a8e0c 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -30,9 +30,14 @@ add_custom_command( TARGET create-virtual-env COMMAND ${Python_EXECUTABLE} -m venv ${CMAKE_INSTALL_PREFIX}) +add_custom_target(install-base-python-requirements ALL COMMENT "Install base python requirements in virtual environment") +add_custom_command( + TARGET install-base-python-requirements + COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${Python_VENV_EXECUTABLE} -m pip install --prefix ${CMAKE_INSTALL_PREFIX} --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/base_requirements.txt) +add_dependencies(install-base-python-requirements create-virtual-env) + add_custom_target(install-python-requirements ALL COMMENT "Install python requirements in virtual environment") add_custom_command( TARGET install-python-requirements COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}" ${Python_VENV_EXECUTABLE} -m pip install --prefix ${CMAKE_INSTALL_PREFIX} --require-hashes -r ${CMAKE_SOURCE_DIR}/projects/requirements.txt) - -add_dependencies(install-python-requirements create-virtual-env) +add_dependencies(install-python-requirements install-base-python-requirements) diff --git a/projects/requirements.txt b/projects/requirements.txt index f6c118bb..e9b9aafb 100644 --- a/projects/requirements.txt +++ b/projects/requirements.txt @@ -1,12 +1,4 @@ -# These hashes were generated with: -# hashin --verbose --python-version --requirements-file= == == ... -# make sure you use the verbose flag and personally inspect the hosts that were used when generating -# When updating a major Python version these need to be updates as well - -wheel==0.37.1 \ - --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 \ - --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a cython==0.29.26 \ --hash=sha256:af377d543a762867da11fcf6e558f7a4a535ff8693f30cce123fab10c00fa312 \ --hash=sha256:f5e15ff892c8afad64931ee3dd723c4755c2c516606f9aae7613bebfac62b0f6 \ From b46afbca4be7dbb123c5c39cfcfb3d68dc84c4b0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 7 Apr 2022 13:15:13 +0200 Subject: [PATCH 166/213] Basis of creating AppImage on Linux as output It's making one. Some of the paths are still wrong though, I'm afraid. Let's see how we can resolve that. Contributes to issue CURA-8640. --- CMakeLists.txt | 1 + cmake/pyinstaller.cmake | 2 +- packaging/cura-icon_128x128.png | Bin 0 -> 4553 bytes packaging/cura-icon_256x256.png | Bin 0 -> 16304 bytes packaging/cura-icon_64x64.png | Bin 0 -> 1927 bytes packaging/cura.appdata.xml | 18 ++++++++++++++++ packaging/cura.desktop.in | 14 ++++++++++++ packaging/cura.sh | 14 ++++++++++++ projects/appimagekit.cmake | 37 ++++++++++++++++++++++++-------- 9 files changed, 76 insertions(+), 10 deletions(-) create mode 100644 packaging/cura-icon_128x128.png create mode 100644 packaging/cura-icon_256x256.png create mode 100644 packaging/cura-icon_64x64.png create mode 100644 packaging/cura.appdata.xml create mode 100644 packaging/cura.desktop.in create mode 100644 packaging/cura.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d0402bf..1474650a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,6 +65,7 @@ GetFromEnvironmentOrCache( "Cura Extra Version Information" REQUIRED) +include(projects/appimagekit.cmake) include(projects/python.cmake) include(projects/charon.cmake) include(projects/savitar.cmake) diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index 670eb309..71b64042 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -8,7 +8,7 @@ set(pyinstaller_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/${exe_path}/pyinstaller) set(cura_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/cura_app.py) set(curaengine_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/CuraEngine${exe_ext}) set(installer_DIR "${CMAKE_INSTALL_PREFIX}/installer") -set(ULTIMAKER_CURA_PATH "${installer_DIR}/dist/Ultimaker-Cura") +set(ULTIMAKER_CURA_PATH "${installer_DIR}/dist/Ultimaker-Cura" CACHE INTERNAL "ultimaker_cura_path") if (APPLE) set(ULTIMAKER_CURA_APP_PATH "${ULTIMAKER_CURA_PATH}.app") diff --git a/packaging/cura-icon_128x128.png b/packaging/cura-icon_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..7f70fe330ea38e6cbe67242825823eab04e3783d GIT binary patch literal 4553 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 literal 0 HcmV?d00001 diff --git a/packaging/cura-icon_256x256.png b/packaging/cura-icon_256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ddbd94c410d4cea407907e03b7482e5350cbda GIT binary patch literal 16304 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 I8x`~a0DWGIsQ>@~ literal 0 HcmV?d00001 diff --git a/packaging/cura-icon_64x64.png b/packaging/cura-icon_64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..5bfbf782ce0367032d28e7d96197af50697ce386 GIT binary patch literal 1927 zcmWlZXH?T!8iy~05-BSq@z+HeGV}3j;vc@Y_-Y53(`XR15PyeiRf*OsC*RgX?n21%T(t zx~l=20H}MPKI!WQ`>U&~DwT?K{sZa!e@W--NEhl!7aB+x8cF_;CX#n-O{=LWll{&?N}H1z|`Kc*e`W(N|`js!q|LRcLL z3%V0wbs?;7BoHD+0(%g)6k$X6BJ4gSs1FVJgt9tORu{_ZMgt*IG_VH^>_yq#C|ioM zdr&saeJERo2KA!weh>`(D5nqQ$WRUp11M(@<;YR)Aj*XvLb<~zcLe3hQQi>B8%B9B zkD|dNXz(Z&)Q1JhFbe+mnk#6qB_u@D6oqQnH#m_UIElsIn$4<5t$qc|UW0_RWSArp8A z^b{U4jSHr50ki^#Hw81eP=O1TxDbX}TsVh|W^obpys=PeESxbG&Kiqmj789M#;|!2 zvapR^Pi8legCLD$UMrc`W(5guwF++go2ZF$RYHqyqeZvVV!J%!y8Z9=hGfVDnX+p+ zgV%E8w;%V%7fr?&PsJBc#}_LSASH_Q7enbU$8syj@*vd{r47?>+h^Z)%t~Z)E#H`L zku9|JFZ7T9uYY`T;2TQ=6HChZ&&v5PaFE^?T<#*9o-Q^C?Cw}4_Mn>`$_Ul_S+e$GHyY&sp#+&SmT327Me|1}oh>CKV z$^u{^c{y$SdVUmgiQ_z~z9zZiXQZ{)%ayuQx&8`EnU0w2G{Q}qz+Pclij&u1LX)lRyekPv8-y52-}X~2$ z%vn@c6>2u|%IJ@mm(LJl|18&#@7|?}gUs5l$>f4^g->K}L)Cv&)|pzj^gtJ{+F7++ z`|;fpqd#eNy5svj-o`*sHr#g6f|1?!Lyz`JrZSDL6oU-n{P3kOp@AJ*;;8Owj)Q=B z=HsYGx>-!TbSVQ6fs*~{^8-e)nuF~1x$pr?!_&U@GhQ@9hlZ~njSdHIR^f4;M+(&) zRu$ul*A=~%OK0zd#T43%+~U|R}9Bm4a1Upmr?EZ2h|(lI0LuFfXQL(dhLrmf>&m&bB#juLA6 z9;L>uyt7NO*0ce-Of9hc;jhOR=gb-duMoHDus?vRi&MnA&LQG28S3pxxYehv;%0eE zNspt={;X#K1?v=_l}xRZ=J>Hw`fAx5Wh=Z_-8YP`684#HCJXcRQ*NL2JGOJdUb6Xj zOTPVK9F09^&!p5}!F$sF>YlFdoyH0ulAu>CzxMV&%}?y(MCZ&93dS9Oq{xos8%EL< zj^`~RGqjuc99gRCjx{tW+`qe6Rfdbb1ch2P3ynQCf<`^D_ogFeo>qH8PJlI1kQJDx zR`k59-5G<=JIE7U75D!FTuJk_1rY~2Klzh6b{ci^PO3(|%^oa^aiD7VxzC}Uk)?ta+(q{S#j}j*iZP@1rpvf63$qY4lW1_!9t5dJ<@n|ln zD2S-d7f+lz@trK&g1(C%Q5oZ%d?40Wok`2d3sd-N1B0F|BTv}R{Bo@u61kRLvd%XH z6P-S(SDmsfw`1J`xwPsD+l*O45$>K5*M z_Sm~;Z@i>8xF>FIscGT&+s1EVK1ihRpuE?xF_=+&f5WzN!>Fb-^;Kz9j)BkC(9MVV z$=v0gYB48EAN59Kn>4o6P^@F5C3*xY@d)!o@IEZumwtO7Bo<2CfNIb_C8cSF?GFQMB + + com.ultimaker.cura + CC0-1.0 + LGPL-3.0 + Ultimaker Cura +

Slicer to prepare your 3D printing projects + +

Ultimaker Cura is a slicer, an application that prepares your model for 3D printing. Optimized, expert-tested profiles for 3D printers and materials mean you can start printing reliably in no time. And with industry-standard software integration, you can streamline your workflow for maximum efficiency.

+
+ https://ultimaker.com/en/software/ultimaker-cura + + + Print preparation screen + https://raw.githubusercontent.com/Ultimaker/Cura/master/screenshot.png + + + diff --git a/packaging/cura.desktop.in b/packaging/cura.desktop.in new file mode 100644 index 00000000..c616a672 --- /dev/null +++ b/packaging/cura.desktop.in @@ -0,0 +1,14 @@ +[Desktop Entry] +Name=Cura +Name[de]=Cura +GenericName=3D Printing Software +GenericName[de]=3D-Druck-Software +Comment=Cura converts 3D models into paths for a 3D printer. It prepares your print for maximum accuracy, minimum printing time and good reliability with many extra features that make your print come out great. +Exec=cura.sh %F +Icon=cura-icon +Terminal=false +Type=Application +MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;image/bmp;image/gif;image/jpeg;image/png;text/x-gcode;application/x-amf;application/x-ply;application/x-ctm;model/vnd.collada+xml;model/gltf-binary;model/gltf+json;model/vnd.collada+xml+zip; +Categories=Graphics; +Keywords=3D;Printing; +X-AppImage-Version=@CURA_VERSION@ diff --git a/packaging/cura.sh b/packaging/cura.sh new file mode 100644 index 00000000..59d9be44 --- /dev/null +++ b/packaging/cura.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +scriptdir=$(dirname $0) + +export PYTHONPATH="$scriptdir/lib/python3.10" +export QT_PLUGIN_PATH="$scriptdir/qt/plugins" +export QML2_IMPORT_PATH="$scriptdir/qt/qml" +export QT_QPA_FONTDIR=/usr/share/fonts +export QT_XKB_CONFIG_ROOT=/usr/share/X11/xkb + +# Use the openssl.cnf packaged in the AppImage +export OPENSSL_CONF="$scriptdir/openssl.cnf" + +Ultimaker-Cura "$@" diff --git a/projects/appimagekit.cmake b/projects/appimagekit.cmake index 5d4d777b..d02d24f4 100644 --- a/projects/appimagekit.cmake +++ b/projects/appimagekit.cmake @@ -1,17 +1,36 @@ -if(BUILD_OS_LINUX) +#Copyright (c) 2022 Ultimaker B.V. +#Cura's build system is released under the terms of the AGPLv3 or higher. + +if(CMAKE_SYSTEM_NAME MATCHES "Linux") set(_appimagetool_path "${CMAKE_INSTALL_PREFIX}/bin/appimagetool.AppImage") set(_apprun_path "${CMAKE_INSTALL_PREFIX}/bin/AppRun") - set(_appimagetool_sha256 "d918b4df547b388ef253f3c9e7f6529ca81a885395c31f619d9aaf7030499a13") - set(_apprun_sha256 "e8f44f56bb23e105905850250d9d87fb1a5cf64211ad141b85864b1b7a092332") + set(_appimagetool_sha256 "d918b4df547b388ef253f3c9e7f6529ca81a885395c31f619d9aaf7030499a13") + set(_apprun_sha256 "e8f44f56bb23e105905850250d9d87fb1a5cf64211ad141b85864b1b7a092332") + + #Put correct version in cura.desktop. + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop @ONLY) add_custom_target(AppImageKit ALL COMMENT "Installing AppImageKit tools to ${CMAKE_INSTALL_PREFIX}/bin/" COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_INSTALL_PREFIX}/bin/ - COMMAND curl -o "${_appimagetool_path}" -SL https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage - COMMAND echo "${_appimagetool_sha256} ${_appimagetool_path}" | sha256sum --check - COMMAND chmod a+x "${_appimagetool_path}" - COMMAND curl -o "${_apprun_path}" -SL https://github.com/AppImage/AppImageKit/releases/download/12/AppRun-x86_64 - COMMAND echo "${_apprun_sha256} ${_apprun_path}" | sha256sum --check - COMMAND chmod a+x "${_apprun_path}" + COMMAND curl -o "${_appimagetool_path}" -SL https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage + COMMAND echo "${_appimagetool_sha256} ${_appimagetool_path}" | sha256sum --check + COMMAND chmod a+x "${_appimagetool_path}" + COMMAND curl -o "${_apprun_path}" -SL https://github.com/AppImage/AppImageKit/releases/download/12/AppRun-x86_64 + COMMAND echo "${_apprun_sha256} ${_apprun_path}" | sha256sum --check + COMMAND chmod a+x "${_apprun_path}" + ) + + set(_appimage_filename "Ultimaker_Cura-${CURA_VERSION}.AppImage") + add_custom_target(packaging ALL + COMMENT "Package into an AppImage file." + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura-icon_256x256.png ${ULTIMAKER_CURA_PATH}/cura-icon.png + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop ${ULTIMAKER_CURA_PATH}/cura.desktop + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura.sh ${ULTIMAKER_CURA_PATH}/AppRun + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura.appdata.xml ${ULTIMAKER_CURA_PATH}/cura.appdata.xml + COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/${_appimage_filename} #Remove old one if it existed. + COMMAND ${_appimagetool_path} --appimage-extract-and-run ${ULTIMAKER_CURA_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${_appimage_filename} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) + add_dependencies(packaging pyinstaller AppImageKit) endif() From 882c1fb55daaa91e00c15c7dd8902c24e524ed45 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 7 Apr 2022 13:24:46 +0200 Subject: [PATCH 167/213] Execute full path to executable Otherwise it'll search the /home/trin/.local/bin:/home/trin/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/home/trin/.local/bin:/home/trin/bin:/home/trin/Gedeeld/Projects/Clones/llvm-project/build-linux-from-instructions-12/install/lib:/home/trin/Gedeeld/Projects/Clones/llvm-project/build-linux-from-instructions-12/install/bin for the Ultimaker-Cura executable and won't find it. I could probably have used ./Ultimaker-Cura but this seems a bit more stable to me, if we want to move stuff around. And it works. Contributes to issue CURA-8640. --- packaging/cura.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/cura.sh b/packaging/cura.sh index 59d9be44..75d62e16 100644 --- a/packaging/cura.sh +++ b/packaging/cura.sh @@ -11,4 +11,4 @@ export QT_XKB_CONFIG_ROOT=/usr/share/X11/xkb # Use the openssl.cnf packaged in the AppImage export OPENSSL_CONF="$scriptdir/openssl.cnf" -Ultimaker-Cura "$@" +$scriptdir/Ultimaker-Cura "$@" From d283d6cca117f7ca4505f051c0ea123da5bef59c Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 7 Apr 2022 14:11:53 +0200 Subject: [PATCH 168/213] Add some missing modules Contributes to Cura-8640 --- cmake/pyinstaller.cmake | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index 71b64042..6a352098 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -10,7 +10,7 @@ set(curaengine_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/CuraEngine${exe_ext}) set(installer_DIR "${CMAKE_INSTALL_PREFIX}/installer") set(ULTIMAKER_CURA_PATH "${installer_DIR}/dist/Ultimaker-Cura" CACHE INTERNAL "ultimaker_cura_path") -if (APPLE) +if(APPLE) set(ULTIMAKER_CURA_APP_PATH "${ULTIMAKER_CURA_PATH}.app") GetFromEnvironmentOrCache( NAME @@ -36,7 +36,9 @@ if (APPLE) "The Ultimaker Cura domain to be used (usually reversed)") set(extra_pyinstaller_args --codesign-identity "${CODESIGN_IDENTITY}" --osx-entitlements-file "${CMAKE_SOURCE_DIR}/signing/cura.entitlements" --osx-bundle-identifier "${ULTIMAKER_CURA_DOMAIN}" ) endif () -else () +elseif(WIN32) + set(extra_pyinstaller_args --hidden-import fcntl --collect-all win32ctypes) +else() set(extra_pyinstaller_args) endif () @@ -59,7 +61,9 @@ add_custom_command( --hidden-import pynest2d --hidden-import PyQt6.QtNetwork --hidden-import logging.handlers + --collect-all sqlite3 --hidden-import zeroconf + --collect-all trimesh --add-binary "${curaengine_EXECUTABLE}${env_path_sep}." --add-data "${CMAKE_INSTALL_PREFIX}/${lib_path}/cura/plugins${env_path_sep}plugins" --add-data "${CMAKE_INSTALL_PREFIX}/${lib_path}/uranium/plugins${env_path_sep}plugins" From 9cf02567359fff3d829b6a1678460cbb58c591ba Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 7 Apr 2022 16:22:24 +0200 Subject: [PATCH 169/213] moved appimagekit to cmake module dir It's a tool not an actual requirement of Cura Contributes to Cura-8640 --- CMakeLists.txt | 5 ++++- cmake/appimagekit.cmake | 34 ++++++++++++++++++++++++++++++++++ projects/appimagekit.cmake | 36 ------------------------------------ 3 files changed, 38 insertions(+), 37 deletions(-) create mode 100644 cmake/appimagekit.cmake delete mode 100644 projects/appimagekit.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 1474650a..d9ece9ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,7 +65,6 @@ GetFromEnvironmentOrCache( "Cura Extra Version Information" REQUIRED) -include(projects/appimagekit.cmake) include(projects/python.cmake) include(projects/charon.cmake) include(projects/savitar.cmake) @@ -85,4 +84,8 @@ if(APPLE) include(cmake/macos-create-dmg.cmake) include(cmake/macos-sign-dmg.cmake) include(cmake/macos-notarize-dmg.cmake) +endif() + +if(Linux) + include(cmake/appimagekit.cmake) endif() \ No newline at end of file diff --git a/cmake/appimagekit.cmake b/cmake/appimagekit.cmake new file mode 100644 index 00000000..f4954e86 --- /dev/null +++ b/cmake/appimagekit.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2022 Ultimaker B.V. +# Cura's build system is released under the terms of the AGPLv3 or higher. + +set(_appimagetool_path "${CMAKE_INSTALL_PREFIX}/bin/appimagetool.AppImage") +set(_apprun_path "${CMAKE_INSTALL_PREFIX}/bin/AppRun") +set(_appimagetool_sha256 "d918b4df547b388ef253f3c9e7f6529ca81a885395c31f619d9aaf7030499a13") +set(_apprun_sha256 "e8f44f56bb23e105905850250d9d87fb1a5cf64211ad141b85864b1b7a092332") + +#Put correct version in cura.desktop. +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop @ONLY) + +add_custom_target(AppImageKit ALL + COMMENT "Installing AppImageKit tools to ${CMAKE_INSTALL_PREFIX}/bin/" + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_INSTALL_PREFIX}/bin/ + COMMAND curl -o "${_appimagetool_path}" -SL https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage + COMMAND echo "${_appimagetool_sha256} ${_appimagetool_path}" | sha256sum --check + COMMAND chmod a+x "${_appimagetool_path}" + COMMAND curl -o "${_apprun_path}" -SL https://github.com/AppImage/AppImageKit/releases/download/12/AppRun-x86_64 + COMMAND echo "${_apprun_sha256} ${_apprun_path}" | sha256sum --check + COMMAND chmod a+x "${_apprun_path}" +) + +set(_appimage_filename "Ultimaker_Cura-${CURA_VERSION}.AppImage") +add_custom_target(packaging ALL + COMMENT "Package into an AppImage file." + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura-icon_256x256.png ${ULTIMAKER_CURA_PATH}/cura-icon.png + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop ${ULTIMAKER_CURA_PATH}/cura.desktop + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura.sh ${ULTIMAKER_CURA_PATH}/AppRun + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura.appdata.xml ${ULTIMAKER_CURA_PATH}/cura.appdata.xml + COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/${_appimage_filename} #Remove old one if it existed. + COMMAND ${_appimagetool_path} --appimage-extract-and-run ${ULTIMAKER_CURA_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${_appimage_filename} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} +) +add_dependencies(packaging pyinstaller AppImageKit) diff --git a/projects/appimagekit.cmake b/projects/appimagekit.cmake deleted file mode 100644 index d02d24f4..00000000 --- a/projects/appimagekit.cmake +++ /dev/null @@ -1,36 +0,0 @@ -#Copyright (c) 2022 Ultimaker B.V. -#Cura's build system is released under the terms of the AGPLv3 or higher. - -if(CMAKE_SYSTEM_NAME MATCHES "Linux") - set(_appimagetool_path "${CMAKE_INSTALL_PREFIX}/bin/appimagetool.AppImage") - set(_apprun_path "${CMAKE_INSTALL_PREFIX}/bin/AppRun") - set(_appimagetool_sha256 "d918b4df547b388ef253f3c9e7f6529ca81a885395c31f619d9aaf7030499a13") - set(_apprun_sha256 "e8f44f56bb23e105905850250d9d87fb1a5cf64211ad141b85864b1b7a092332") - - #Put correct version in cura.desktop. - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop @ONLY) - - add_custom_target(AppImageKit ALL - COMMENT "Installing AppImageKit tools to ${CMAKE_INSTALL_PREFIX}/bin/" - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_INSTALL_PREFIX}/bin/ - COMMAND curl -o "${_appimagetool_path}" -SL https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage - COMMAND echo "${_appimagetool_sha256} ${_appimagetool_path}" | sha256sum --check - COMMAND chmod a+x "${_appimagetool_path}" - COMMAND curl -o "${_apprun_path}" -SL https://github.com/AppImage/AppImageKit/releases/download/12/AppRun-x86_64 - COMMAND echo "${_apprun_sha256} ${_apprun_path}" | sha256sum --check - COMMAND chmod a+x "${_apprun_path}" - ) - - set(_appimage_filename "Ultimaker_Cura-${CURA_VERSION}.AppImage") - add_custom_target(packaging ALL - COMMENT "Package into an AppImage file." - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura-icon_256x256.png ${ULTIMAKER_CURA_PATH}/cura-icon.png - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop ${ULTIMAKER_CURA_PATH}/cura.desktop - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura.sh ${ULTIMAKER_CURA_PATH}/AppRun - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura.appdata.xml ${ULTIMAKER_CURA_PATH}/cura.appdata.xml - COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/${_appimage_filename} #Remove old one if it existed. - COMMAND ${_appimagetool_path} --appimage-extract-and-run ${ULTIMAKER_CURA_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${_appimage_filename} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) - add_dependencies(packaging pyinstaller AppImageKit) -endif() From 3395e8aa61f8c3cca24b37b2746a7d446a369a88 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 7 Apr 2022 20:18:33 +0200 Subject: [PATCH 170/213] Fixed Icon for the executable on Windows Somehow it still shows the pyinstaller icon in the taskmanager Contributes to Cura-8640 --- cmake/pyinstaller.cmake | 30 +++++++++++++++--------------- packaging/Cura.ico | Bin 0 -> 35426 bytes packaging/cura.icns | Bin 0 -> 201875 bytes 3 files changed, 15 insertions(+), 15 deletions(-) create mode 100644 packaging/Cura.ico create mode 100644 packaging/cura.icns diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index 6a352098..e0b3cc48 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -1,7 +1,5 @@ # Copyright (c) 2022 Ultimaker B.V. # cura-build-environment is released under the terms of the AGPLv3 or higher. -# -# Sets up a virtual environment using the Python interpreter set(pyinstaller_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/${exe_path}/pyinstaller) @@ -9,8 +7,9 @@ set(cura_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/cura_app.py) set(curaengine_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/CuraEngine${exe_ext}) set(installer_DIR "${CMAKE_INSTALL_PREFIX}/installer") set(ULTIMAKER_CURA_PATH "${installer_DIR}/dist/Ultimaker-Cura" CACHE INTERNAL "ultimaker_cura_path") +set(extra_pyinstaller_args ) -if(APPLE) +if (APPLE) set(ULTIMAKER_CURA_APP_PATH "${ULTIMAKER_CURA_PATH}.app") GetFromEnvironmentOrCache( NAME @@ -27,19 +26,20 @@ if(APPLE) REQUIRED DESCRIPTION "The Apple codesign identity") - GetFromEnvironmentOrCache( - NAME - ULTIMAKER_CURA_DOMAIN - DEFAULT - nl.ultimaker.cura.dmg - DESCRIPTION - "The Ultimaker Cura domain to be used (usually reversed)") - set(extra_pyinstaller_args --codesign-identity "${CODESIGN_IDENTITY}" --osx-entitlements-file "${CMAKE_SOURCE_DIR}/signing/cura.entitlements" --osx-bundle-identifier "${ULTIMAKER_CURA_DOMAIN}" ) + GetFromEnvironmentOrCache( + NAME + ULTIMAKER_CURA_DOMAIN + DEFAULT + nl.ultimaker.cura.dmg + DESCRIPTION + "The Ultimaker Cura domain to be used (usually reversed)") + list(APPEND extra_pyinstaller_args --codesign-identity "${CODESIGN_IDENTITY}" --osx-entitlements-file "${CMAKE_SOURCE_DIR}/signing/cura.entitlements" --osx-bundle-identifier "${ULTIMAKER_CURA_DOMAIN}") endif () -elseif(WIN32) - set(extra_pyinstaller_args --hidden-import fcntl --collect-all win32ctypes) -else() - set(extra_pyinstaller_args) + list(APPEND extra_pyinstaller_args --icon ${CMAKE_SOURCE_DIR}/packaging/cura.icns) +endif () + +if (WIN32) + list(APPEND extra_pyinstaller_args --hidden-import fcntl --collect-all win32ctypes --icon ${CMAKE_SOURCE_DIR}/packaging/Cura.ico) endif () add_custom_target(create_installer_dir ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${installer_DIR}) diff --git a/packaging/Cura.ico b/packaging/Cura.ico new file mode 100644 index 0000000000000000000000000000000000000000..b1d34e54d0309088a0d71312191d8f2be614d194 GIT binary patch literal 35426 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 literal 0 HcmV?d00001 From f8dfcbe556aa2eeb8bc1b7b2eea3c620142590e5 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 7 Apr 2022 20:19:05 +0200 Subject: [PATCH 171/213] Added NSIS installer for on Windows Contributes to Cura-8640 --- cmake/common-cpackconfig.cmake | 74 ++++++++++ cmake/nsis.cmake | 43 ++++++ packaging/NSIS/CharStrStrip.nsh | 69 +++++++++ packaging/NSIS/FileAssociation.nsh | 217 +++++++++++++++++++++++++++++ packaging/cura_banner_nsis.bmp | Bin 0 -> 206040 bytes projects/cura.cmake | 2 +- 6 files changed, 404 insertions(+), 1 deletion(-) create mode 100644 cmake/common-cpackconfig.cmake create mode 100644 cmake/nsis.cmake create mode 100644 packaging/NSIS/CharStrStrip.nsh create mode 100644 packaging/NSIS/FileAssociation.nsh create mode 100644 packaging/cura_banner_nsis.bmp diff --git a/cmake/common-cpackconfig.cmake b/cmake/common-cpackconfig.cmake new file mode 100644 index 00000000..02f35e6f --- /dev/null +++ b/cmake/common-cpackconfig.cmake @@ -0,0 +1,74 @@ +install(DIRECTORY ${ULTIMAKER_CURA_PATH}/ + DESTINATION "." + USE_SOURCE_PERMISSIONS + COMPONENT "_cura" # Note: _ prefix is necessary to make sure the Cura component is always listed first + ) + +if (CURA_BUILDTYPE STREQUAL "") + cpack_add_component(_cura + DISPLAY_NAME "Ultimaker Cura" + Description "Ultimaker Cura Executable and Data Files" + REQUIRED + ) +else () + cpack_add_component(_cura + DISPLAY_NAME "Ultimaker Cura ${CURA_BUILDTYPE}" + Description "Ultimaker Cura ${CURA_BUILDTYPE} Executable and Data Files" + REQUIRED + ) +endif () + +include(InstallRequiredSystemLibraries) +install (PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION ".") + +# ======================================== +# CPack Common Settings +# ======================================== + +if (CURA_BUILDTYPE STREQUAL "") + set(CPACK_PACKAGE_NAME "Ultimaker Cura") +else () + set(CPACK_PACKAGE_NAME "Ultimaker Cura ${CURA_BUILDTYPE}") +endif () +string(REPLACE " " "_" CPACK_FILE_NAME_NO_SPACES "${CPACK_PACKAGE_NAME}") + +set(CPACK_PACKAGE_VENDOR "Ultimaker B.V.") +set(CPACK_PACKAGE_HOMEPAGE_URL "https://ultimaker.com") + +# MSI only supports version format like "x.x.x.x" where x is an integer from 0 to 65534 +set(CPACK_PACKAGE_VERSION_MAJOR ${CURA_VERSION_MAJOR}) +set(CPACK_PACKAGE_VERSION_MINOR ${CURA_VERSION_MINOR}) +set(CPACK_PACKAGE_VERSION_PATCH ${CURA_VERSION_PATCH}) + +# Use full version x.x.x string in install directory for both installers, +# so that IT can easily automatically upgrade to a newer patch version, +# but also uninstall only the desired EXE installation. Also differentiate +# between build types +if (CURA_BUILDTYPE STREQUAL "") + set(CPACK_PACKAGE_NAME "Ultimaker Cura ${CURA_VERSION}") +else () + set(CPACK_PACKAGE_NAME "Ultimaker Cura ${CURA_BUILDTYPE} ${CURA_VERSION}") +endif () + +set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/packaging/Cura.ico") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Ultimaker Cura - 3D Printing Software") +set(CPACK_PACKAGE_CONTACT "Ultimaker Cura ") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/packaging/cura_license.txt") +set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/packaging/Cura.ico") + +# Differentiate between a normal Cura installation and that of a different build type +if (CURA_BUILDTYPE STREQUAL "") + set(CPACK_CREATE_DESKTOP_LINKS Cura "Ultimaker Cura ${CURA_VERSION}") + set(CPACK_PACKAGE_EXECUTABLES Cura "Ultimaker Cura ${CURA_VERSION}") + set(CPACK_PACKAGE_INSTALL_DIRECTORY "Ultimaker Cura ${CURA_VERSION}") +else () + set(CPACK_CREATE_DESKTOP_LINKS Cura "Ultimaker Cura ${CURA_BUILDTYPE} ${CURA_VERSION}") + set(CPACK_PACKAGE_EXECUTABLES Cura "Ultimaker Cura ${CURA_BUILDTYPE} ${CURA_VERSION}") + set(CPACK_PACKAGE_INSTALL_DIRECTORY "Ultimaker Cura ${CURA_BUILDTYPE} ${CURA_VERSION}") +endif () + +# Use processor name +STRING(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" CPACK_SYSTEM_NAME) +set(CPACK_PACKAGE_FILE_NAME "${CPACK_FILE_NAME_NO_SPACES}-${CURA_VERSION}-${CPACK_SYSTEM_NAME}") + +set(CPACK_THREADS -1) diff --git a/cmake/nsis.cmake b/cmake/nsis.cmake new file mode 100644 index 00000000..dfd9876a --- /dev/null +++ b/cmake/nsis.cmake @@ -0,0 +1,43 @@ +# Copyright (c) 2022 Ultimaker B.V. +# Cura's build system is released under the terms of the AGPLv3 or higher. + +# Only NSIS needs to have arduino and vcredist +install(DIRECTORY ${CMAKE_INSTALL_PREFIX}/arduino + DESTINATION "." + COMPONENT "arduino" + ) + +install(FILES ${CMAKE_INSTALL_PREFIX}/VC_redist.x64.exe + DESTINATION "." + COMPONENT "vcredist" + ) + +cpack_add_component(vcredist DISPLAY_NAME "Visual Studio 2015-2022 Redistributable") +cpack_add_component(arduino DISPLAY_NAME "Arduino Drivers") + +set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) +set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".") +set(CPACK_NSIS_STARTMENU_DIRECTORY "Ultimaker Cura") +set(CPACK_NSIS_DISPLAY_NAME "Ultimaker Cura") +set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/packaging/Cura.ico") +set(CPACK_NSIS_MUI_UNIICON "${CMAKE_SOURCE_DIR}/packaging/Cura.ico") +set(CPACK_NSIS_INSTALLED_ICON_NAME "Ultimaker-Cura.exe") +set(CPACK_NSIS_HELP_LINK "https://github.com/Ultimaker/Cura") +set(CPACK_NSIS_URL_INFO_ABOUT "https://ultimaker.com/en/support/software") +set(CPACK_NSIS_MENU_LINKS + "https://ultimaker.com/en/support/software" "Online Documentation" + "https://github.com/Ultimaker/Cura" "Development Resources" + ) + +set(CPACK_NSIS_MUI_WELCOMEFINISHPAGE_BITMAP ${CMAKE_SOURCE_DIR}/packaging/cura_banner_nsis.bmp) +set(CPACK_NSIS_MUI_UNWELCOMEFINISHPAGE_BITMAP ${CMAKE_SOURCE_DIR}/packaging/cura_banner_nsis.bmp) +set(CPACK_NSIS_INSTALLER_MUI_FINISHPAGE_RUN_CODE "!define MUI_FINISHPAGE_RUN \\\"$WINDIR\\\\explorer.exe\\\"\n!define MUI_FINISHPAGE_RUN_PARAMETERS \\\"$INSTDIR\\\\Ultimaker-Cura.exe\\\"") # Hack to ensure Cura is not started with admin rights + +add_custom_target(packaging ALL COMMENT "Package into a NSIS installer.") +add_custom_command( + TARGET packaging POST_BUILD + # NOTE: Needs testing here, whether CPACK_SYSTEM_NAME is working good for 64bit builds, too. + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/packaging/NSIS "${CMAKE_CURRENT_BINARY_DIR}/_CPack_Packages/${CPACK_SYSTEM_NAME}/NSIS" + COMMENT "Copying NSIS scripts from [${CMAKE_SOURCE_DIR}/packaging/NSIS] to [${CMAKE_CURRENT_BINARY_DIR}/_CPack_Packages/${CPACK_SYSTEM_NAME}/NSIS]" +) +add_dependencies(packaging pyinstaller) \ No newline at end of file diff --git a/packaging/NSIS/CharStrStrip.nsh b/packaging/NSIS/CharStrStrip.nsh new file mode 100644 index 00000000..bb64ca2d --- /dev/null +++ b/packaging/NSIS/CharStrStrip.nsh @@ -0,0 +1,69 @@ +Function CharStrip +Exch $R0 #char +Exch +Exch $R1 #in string +Push $R2 +Push $R3 +Push $R4 + StrCpy $R2 -1 + IntOp $R2 $R2 + 1 + StrCpy $R3 $R1 1 $R2 + StrCmp $R3 "" +8 + StrCmp $R3 $R0 0 -3 + StrCpy $R3 $R1 $R2 + IntOp $R2 $R2 + 1 + StrCpy $R4 $R1 "" $R2 + StrCpy $R1 $R3$R4 + IntOp $R2 $R2 - 2 + Goto -9 + StrCpy $R0 $R1 +Pop $R4 +Pop $R3 +Pop $R2 +Pop $R1 +Exch $R0 +FunctionEnd +!macro CharStrip Char InStr OutVar + Push '${InStr}' + Push '${Char}' + Call CharStrip + Pop '${OutVar}' +!macroend +!define CharStrip '!insertmacro CharStrip' + +Function StrStrip +Exch $R0 #string +Exch +Exch $R1 #in string +Push $R2 +Push $R3 +Push $R4 +Push $R5 + StrLen $R5 $R0 + StrCpy $R2 -1 + IntOp $R2 $R2 + 1 + StrCpy $R3 $R1 $R5 $R2 + StrCmp $R3 "" +9 + StrCmp $R3 $R0 0 -3 + StrCpy $R3 $R1 $R2 + IntOp $R2 $R2 + $R5 + StrCpy $R4 $R1 "" $R2 + StrCpy $R1 $R3$R4 + IntOp $R2 $R2 - $R5 + IntOp $R2 $R2 - 1 + Goto -10 + StrCpy $R0 $R1 +Pop $R5 +Pop $R4 +Pop $R3 +Pop $R2 +Pop $R1 +Exch $R0 +FunctionEnd +!macro StrStrip Str InStr OutVar + Push '${InStr}' + Push '${Str}' + Call StrStrip + Pop '${OutVar}' +!macroend +!define StrStrip '!insertmacro StrStrip' \ No newline at end of file diff --git a/packaging/NSIS/FileAssociation.nsh b/packaging/NSIS/FileAssociation.nsh new file mode 100644 index 00000000..bf7f69f1 --- /dev/null +++ b/packaging/NSIS/FileAssociation.nsh @@ -0,0 +1,217 @@ +/* +_____________________________________________________________________________ + + File Association +_____________________________________________________________________________ + + Based on code taken from http://nsis.sourceforge.net/File_Association + + Usage in script: + 1. !include "FileAssociation.nsh" + 2. [Section|Function] + ${FileAssociationFunction} "Param1" "Param2" "..." $var + [SectionEnd|FunctionEnd] + + FileAssociationFunction=[RegisterExtension|UnRegisterExtension] + +_____________________________________________________________________________ + + ${RegisterExtension} "[executable]" "[extension]" "[description]" + +"[executable]" ; executable which opens the file format + ; +"[extension]" ; extension, which represents the file format to open + ; +"[description]" ; description for the extension. This will be display in Windows Explorer. + ; + + + ${UnRegisterExtension} "[extension]" "[description]" + +"[extension]" ; extension, which represents the file format to open + ; +"[description]" ; description for the extension. This will be display in Windows Explorer. + ; + +_____________________________________________________________________________ + + Macros +_____________________________________________________________________________ + + Change log window verbosity (default: 3=no script) + + Example: + !include "FileAssociation.nsh" + !insertmacro RegisterExtension + ${FileAssociation_VERBOSE} 4 # all verbosity + !insertmacro UnRegisterExtension + ${FileAssociation_VERBOSE} 3 # no script +*/ + + +!ifndef FileAssociation_INCLUDED +!define FileAssociation_INCLUDED + +!include Util.nsh + +!verbose push +!verbose 3 +!ifndef _FileAssociation_VERBOSE + !define _FileAssociation_VERBOSE 3 +!endif +!verbose ${_FileAssociation_VERBOSE} +!define FileAssociation_VERBOSE `!insertmacro FileAssociation_VERBOSE` +!verbose pop + +!macro FileAssociation_VERBOSE _VERBOSE + !verbose push + !verbose 3 + !undef _FileAssociation_VERBOSE + !define _FileAssociation_VERBOSE ${_VERBOSE} + !verbose pop +!macroend + +!macro RegisterExtensionCall _EXECUTABLE _EXTENSION _APPNAME _DESCRIPTION + !verbose push + !verbose ${_FileAssociation_VERBOSE} + Push `${_DESCRIPTION}` + Push `${_APPNAME}` + Push `${_EXTENSION}` + Push `${_EXECUTABLE}` + ${CallArtificialFunction} RegisterExtension_ + !verbose pop +!macroend + +!macro UnRegisterExtensionCall _EXTENSION _APPNAME + !verbose push + !verbose ${_FileAssociation_VERBOSE} + Push `${_EXTENSION}` + Push `${_APPNAME}` + ${CallArtificialFunction} UnRegisterExtension_ + !verbose pop +!macroend + + + +!define RegisterExtension `!insertmacro RegisterExtensionCall` +!define un.RegisterExtension `!insertmacro RegisterExtensionCall` + +!macro RegisterExtension +!macroend + +!macro un.RegisterExtension +!macroend + +!macro RegisterExtension_ + !verbose push + !verbose ${_FileAssociation_VERBOSE} + + Exch $R3 ; Save value of $R3 and replace with ${_EXECUTABLE} + Exch + Exch $R2 ; Save value of $R2 and replace with ${_EXTENSION} + Exch + Exch 2 + Exch $R1 ; Save value of $R1 and replace with {_APPNAME} + Exch 2 + Exch 3 + Exch $R0 ; Save value of $R0 and replace with ${_DESCRIPTION} + Exch 3 + Push $0 ; Save value of $0 + Push $1 ; Save value of $1 + +;; Make a backup of the previous key +; Find the idea nice, but never saw an application doing that.. Let's skip it! +; +; ReadRegStr $1 HKCR "$R2" "" ; read current file association +; StrCmp "$1" "" NoBackup ; If it is not set.. +; StrCmp "$1" "$R1" NoBackup ; or the same value, as ours now, +; WriteRegStr HKCR "$R2" "backup_val" "$1" ; then backup the current value. +;NoBackup: + ; Setting default association + WriteRegStr HKCR "$R2" "" "$R1" + ; Also an instruction to set the default association for Explorer + ; The change takes effect after restarting explorer.exe + DeleteRegKey /ifempty HKCR "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\$R2" + + ReadRegStr $0 HKCR "$R1" "" + StrCmp $0 "" 0 Skip + WriteRegStr HKCR "$R1" "" "$R0" + WriteRegStr HKCR "$R1\shell" "" "open" + WriteRegStr HKCR "$R1\DefaultIcon" "" "$R3,0" +Skip: + WriteRegStr HKCR "$R1\shell\open\command" "" '"$R3" "%1"' + WriteRegStr HKCR "$R2\OpenWithProgids" "$R1" "" ; Setting a OpenWith entry + +; Uncomment if you want a "Edit with XY" entry +; WriteRegStr HKCR "$R1\shell\edit" "" "Edit $R0" +; WriteRegStr HKCR "$R1\shell\edit\command" "" '"$R3" "%1"' + +; Uncomment if you want a "Print with XY" entry.. Woohoom, even better.. +; WriteRegStr HKCR "$R1\shell\print" "" "Print $R0" +; WriteRegStr HKCR "$R1\shell\print\command" "" '"$R3" "%1"' + +; Uncomment if you want a "Slice with Ultimaker Cura".. Oh my god! +; WriteRegStr HKCR "$R1\shell\slice" "" "Slice with Ultimaker Cura" +; WriteRegStr HKCR "$R1\shell\slice\command" "" '"$R3" "%1"' + + Pop $1 ; Recover value of $1 + Pop $0 ; Recover value of $0 + Pop $R3 ; Recover value of $R3 + Pop $R2 ; Recover value of $R2 + Pop $R1 ; Recover value of $R1 + Pop $R0 ; Recover value of $R0 +!macroend + +!define UnRegisterExtension `!insertmacro UnRegisterExtensionCall` +!define un.UnRegisterExtension `!insertmacro UnRegisterExtensionCall` + +!macro UnRegisterExtension +!macroend + +!macro un.UnRegisterExtension +!macroend + +!macro UnRegisterExtension_ + !verbose push + !verbose ${_FileAssociation_VERBOSE} + + Exch $R1 ; Save value of $R1 and replace with ${_APPNAME} + Exch + Exch $R0 ; Save value of $R0 and replace with ${_EXTENSION} + Exch + Push $0 ; Save value of $0 + Push $1 ; Save value of $1 + + DeleteRegKey HKCR "$R0\OpenWithProgids\$R1" ; Delete "Open with.." entry + +;; Backing up previous value +; Just like I mentioned before. Unneeded stuff.. +; ReadRegStr $1 HKCR "$R0" "" +; StrCmp $1 "$R1" 0 NoOwn ; only do this if we own it +; ReadRegStr $1 HKCR $R0 "backup_val" +; StrCmp $1 "" 0 Restore ; if backup="" then delete the whole key + DeleteRegKey /ifempty HKCR "$R0\OpenWithProgids" + WriteRegStr HKCR "$R0" "" "" ; BETTER: Setting it to nothing, if it was ours. The user can choose what she/he wants to use afterwards + ; Emptying the key - In my opinion safer then removing it. + ; However, see above to see why this is turned off. + ;WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\$R2\UserChoice" "ProgId" "" + DeleteRegKey /ifempty HKCR "$R0" +; Goto NoOwn + +;Restore: +; WriteRegStr HKCR "$R0" "" $1 ; Set back'ed up value +; DeleteRegValue HKCR "$R0" "backup_val" ; Remove the backup +; DeleteRegKey HKCR "$R1" ; Delete key with association name settings +; Goto NoOwn + +;NoOwn: + + Pop $1 ; Recover value of $1 + Pop $0 ; Recover value of $0 + Pop $R1 ; Recover value of $R1 + Pop $R0 ; Recover value of $R0 + + !verbose pop +!macroend + +!endif # !FileAssociation_INCLUDED \ No newline at end of file diff --git a/packaging/cura_banner_nsis.bmp b/packaging/cura_banner_nsis.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8643510664da4e6b45190778be04464b14098a18 GIT binary patch literal 206040 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 Date: Thu, 7 Apr 2022 21:20:27 +0200 Subject: [PATCH 172/213] Small fixes to the Windows NSIS installer Contributes to Cura-8640 --- CMakeLists.txt | 7 +++++++ cmake/common-cpackconfig.cmake | 6 +++--- cmake/nsis.cmake | 19 ++++++++++--------- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d9ece9ce..92ae7813 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,4 +88,11 @@ endif() if(Linux) include(cmake/appimagekit.cmake) +endif() + +if(WIN32) + include(CPackComponent) + include(cmake/common-cpackconfig.cmake) + include(cmake/nsis.cmake) + include(CPack) endif() \ No newline at end of file diff --git a/cmake/common-cpackconfig.cmake b/cmake/common-cpackconfig.cmake index 02f35e6f..d4ca57ce 100644 --- a/cmake/common-cpackconfig.cmake +++ b/cmake/common-cpackconfig.cmake @@ -50,11 +50,11 @@ else () set(CPACK_PACKAGE_NAME "Ultimaker Cura ${CURA_BUILDTYPE} ${CURA_VERSION}") endif () -set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/packaging/Cura.ico") +set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Ultimaker Cura - 3D Printing Software") set(CPACK_PACKAGE_CONTACT "Ultimaker Cura ") -set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/packaging/cura_license.txt") -set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/packaging/Cura.ico") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}\\\\packaging\\\\cura_license.txt") +set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico") # Differentiate between a normal Cura installation and that of a different build type if (CURA_BUILDTYPE STREQUAL "") diff --git a/cmake/nsis.cmake b/cmake/nsis.cmake index dfd9876a..3f7efc24 100644 --- a/cmake/nsis.cmake +++ b/cmake/nsis.cmake @@ -19,8 +19,8 @@ set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".") set(CPACK_NSIS_STARTMENU_DIRECTORY "Ultimaker Cura") set(CPACK_NSIS_DISPLAY_NAME "Ultimaker Cura") -set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/packaging/Cura.ico") -set(CPACK_NSIS_MUI_UNIICON "${CMAKE_SOURCE_DIR}/packaging/Cura.ico") +set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico") +set(CPACK_NSIS_MUI_UNIICON "${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico") set(CPACK_NSIS_INSTALLED_ICON_NAME "Ultimaker-Cura.exe") set(CPACK_NSIS_HELP_LINK "https://github.com/Ultimaker/Cura") set(CPACK_NSIS_URL_INFO_ABOUT "https://ultimaker.com/en/support/software") @@ -29,15 +29,16 @@ set(CPACK_NSIS_MENU_LINKS "https://github.com/Ultimaker/Cura" "Development Resources" ) -set(CPACK_NSIS_MUI_WELCOMEFINISHPAGE_BITMAP ${CMAKE_SOURCE_DIR}/packaging/cura_banner_nsis.bmp) -set(CPACK_NSIS_MUI_UNWELCOMEFINISHPAGE_BITMAP ${CMAKE_SOURCE_DIR}/packaging/cura_banner_nsis.bmp) +set(CPACK_NSIS_MUI_WELCOMEFINISHPAGE_BITMAP ${CMAKE_SOURCE_DIR}\\\\packaging\\\\cura_banner_nsis.bmp) +set(CPACK_NSIS_MUI_UNWELCOMEFINISHPAGE_BITMAP ${CMAKE_SOURCE_DIR}\\\\packaging\\\\cura_banner_nsis.bmp) set(CPACK_NSIS_INSTALLER_MUI_FINISHPAGE_RUN_CODE "!define MUI_FINISHPAGE_RUN \\\"$WINDIR\\\\explorer.exe\\\"\n!define MUI_FINISHPAGE_RUN_PARAMETERS \\\"$INSTDIR\\\\Ultimaker-Cura.exe\\\"") # Hack to ensure Cura is not started with admin rights -add_custom_target(packaging ALL COMMENT "Package into a NSIS installer.") -add_custom_command( - TARGET packaging POST_BUILD - # NOTE: Needs testing here, whether CPACK_SYSTEM_NAME is working good for 64bit builds, too. +add_custom_target(packaging COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/packaging/NSIS "${CMAKE_CURRENT_BINARY_DIR}/_CPack_Packages/${CPACK_SYSTEM_NAME}/NSIS" COMMENT "Copying NSIS scripts from [${CMAKE_SOURCE_DIR}/packaging/NSIS] to [${CMAKE_CURRENT_BINARY_DIR}/_CPack_Packages/${CPACK_SYSTEM_NAME}/NSIS]" -) + COMMAND "${CMAKE_COMMAND}" --build . --target package + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + COMMENT "Package into a NSIS installer." + VERBATIM + ) add_dependencies(packaging pyinstaller) \ No newline at end of file From f89de3a8ad9e5d5904fdf6f4b0f17257e7187d1d Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 8 Apr 2022 04:01:10 +0200 Subject: [PATCH 173/213] Should check on UNIX not Linux Contributes to CURA-8640 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 92ae7813..28b741ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,7 +86,7 @@ if(APPLE) include(cmake/macos-notarize-dmg.cmake) endif() -if(Linux) +if(UNIX) include(cmake/appimagekit.cmake) endif() From 814401d161aa666defffeb2edb896dae9f451bae Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 8 Apr 2022 10:36:36 +0200 Subject: [PATCH 174/213] Use only major.minor.patch version for NSIS Contributes to CURA-8640 --- cmake/common-cpackconfig.cmake | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/cmake/common-cpackconfig.cmake b/cmake/common-cpackconfig.cmake index d4ca57ce..f61ffda1 100644 --- a/cmake/common-cpackconfig.cmake +++ b/cmake/common-cpackconfig.cmake @@ -39,6 +39,7 @@ set(CPACK_PACKAGE_HOMEPAGE_URL "https://ultimaker.com") set(CPACK_PACKAGE_VERSION_MAJOR ${CURA_VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${CURA_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${CURA_VERSION_PATCH}) +set(NSIS_CURA_VERSION ${CURA_VERSION_MAJOR}.${CURA_VERSION_MINOR}.${CURA_VERSION_PATCH}) # Use full version x.x.x string in install directory for both installers, # so that IT can easily automatically upgrade to a newer patch version, @@ -58,13 +59,13 @@ set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico") # Differentiate between a normal Cura installation and that of a different build type if (CURA_BUILDTYPE STREQUAL "") - set(CPACK_CREATE_DESKTOP_LINKS Cura "Ultimaker Cura ${CURA_VERSION}") - set(CPACK_PACKAGE_EXECUTABLES Cura "Ultimaker Cura ${CURA_VERSION}") - set(CPACK_PACKAGE_INSTALL_DIRECTORY "Ultimaker Cura ${CURA_VERSION}") + set(CPACK_CREATE_DESKTOP_LINKS Cura "Ultimaker Cura ${NSIS_CURA_VERSION}") + set(CPACK_PACKAGE_EXECUTABLES Cura "Ultimaker Cura ${NSIS_CURA_VERSION}") + set(CPACK_PACKAGE_INSTALL_DIRECTORY "Ultimaker Cura ${NSIS_CURA_VERSION}") else () - set(CPACK_CREATE_DESKTOP_LINKS Cura "Ultimaker Cura ${CURA_BUILDTYPE} ${CURA_VERSION}") - set(CPACK_PACKAGE_EXECUTABLES Cura "Ultimaker Cura ${CURA_BUILDTYPE} ${CURA_VERSION}") - set(CPACK_PACKAGE_INSTALL_DIRECTORY "Ultimaker Cura ${CURA_BUILDTYPE} ${CURA_VERSION}") + set(CPACK_CREATE_DESKTOP_LINKS Cura "Ultimaker Cura ${CURA_BUILDTYPE} ${NSIS_CURA_VERSION}") + set(CPACK_PACKAGE_EXECUTABLES Cura "Ultimaker Cura ${CURA_BUILDTYPE} ${NSIS_CURA_VERSION}") + set(CPACK_PACKAGE_INSTALL_DIRECTORY "Ultimaker Cura ${CURA_BUILDTYPE} ${NSIS_CURA_VERSION}") endif () # Use processor name From 676787240a3cdceb5e4b42eded3d28916301daa2 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 8 Apr 2022 11:40:08 +0200 Subject: [PATCH 175/213] Revert "Add fuse for using AppImageKit" This reverts commit 523e2e2db12e4b6c1c869fbb6f1a7a34f4a579a5. --- docker/linux/gcc/Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/docker/linux/gcc/Dockerfile b/docker/linux/gcc/Dockerfile index 7b0111e7..aedbafe6 100644 --- a/docker/linux/gcc/Dockerfile +++ b/docker/linux/gcc/Dockerfile @@ -28,8 +28,6 @@ RUN apt-get -qq update \ dh-autoreconf \ libffi-dev \ libssl-dev \ - fuse \ - libfuse2 \ pkg-config RUN wget -q --no-check-certificate http://mirrors.concertpass.com/gcc/releases/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.xz \ From 56c60ee23a64f3415be3e00cf802dc9102a5cc79 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 8 Apr 2022 12:11:17 +0200 Subject: [PATCH 176/213] Uniform filename for the installer Results in: - Ultimaker-Cura-5.0.0-a+1-linux.AppImage - Ultimaker-Cura-5.0.0-a+1-windows.exe - Ultimaker-Cura-5.0.0-a+1-mac.dmg or - Ultimaker-Cura-Internal-5.0.0-a+1-linux.AppImage - etc. or - Ultimaker-Cura-Enterprise-5.0.0-a+1-windows.msi Contributes to CURA-8640 --- cmake/common-cpackconfig.cmake | 4 ++-- cmake/installer-filename.cmake | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 cmake/installer-filename.cmake diff --git a/cmake/common-cpackconfig.cmake b/cmake/common-cpackconfig.cmake index f61ffda1..910d24d5 100644 --- a/cmake/common-cpackconfig.cmake +++ b/cmake/common-cpackconfig.cmake @@ -24,13 +24,13 @@ install (PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION ".") # ======================================== # CPack Common Settings # ======================================== +include(installer-filename.cmake) if (CURA_BUILDTYPE STREQUAL "") set(CPACK_PACKAGE_NAME "Ultimaker Cura") else () set(CPACK_PACKAGE_NAME "Ultimaker Cura ${CURA_BUILDTYPE}") endif () -string(REPLACE " " "_" CPACK_FILE_NAME_NO_SPACES "${CPACK_PACKAGE_NAME}") set(CPACK_PACKAGE_VENDOR "Ultimaker B.V.") set(CPACK_PACKAGE_HOMEPAGE_URL "https://ultimaker.com") @@ -70,6 +70,6 @@ endif () # Use processor name STRING(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" CPACK_SYSTEM_NAME) -set(CPACK_PACKAGE_FILE_NAME "${CPACK_FILE_NAME_NO_SPACES}-${CURA_VERSION}-${CPACK_SYSTEM_NAME}") +set(CPACK_PACKAGE_FILE_NAME ${INSTALLER_FILENAME}) set(CPACK_THREADS -1) diff --git a/cmake/installer-filename.cmake b/cmake/installer-filename.cmake new file mode 100644 index 00000000..f831646b --- /dev/null +++ b/cmake/installer-filename.cmake @@ -0,0 +1,28 @@ +# Copyright (c) 2022 Ultimaker B.V. +# Cura's build system is released under the terms of the AGPLv3 or higher. + +set(INSTALLER_BASE_FILENAME "Ultimaker-Cura") +if(NOT CURA_BUILDTYPE STREQUAL "") + string(REPLACE " " "_" CURA_BUILDTYPE_NO_SPACES "${CURA_BUILDTYPE}") + set(INSTALLER_BASE_FILENAME ${INSTALLER_BASE_FILENAME}-${CURA_BUILDTYPE_NO_SPACES}) +endif() +set(INSTALLER_BASE_FILENAME ${INSTALLER_BASE_FILENAME}-${CURA_VERSION}) + +if(WIN32) + set(INSTALLER_BASE_FILENAME ${INSTALLER_BASE_FILENAME}-windows) +endif() + +if(UNIX) + set(INSTALLER_BASE_FILENAME ${INSTALLER_BASE_FILENAME}-linux) +endif() + +if(APPLE) + set(INSTALLER_BASE_FILENAME ${INSTALLER_BASE_FILENAME}-mac) +endif() + +if(INSTALLER_EXT) + set(INSTALLER_FILENAME ${INSTALLER_BASE_FILENAME}.${INSTALLER_EXT}) +else() + set(INSTALLER_FILENAME ${INSTALLER_BASE_FILENAME}) +endif() + From cd78b1c2ef4985faefea3edce703e9581c9a9ecd Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 8 Apr 2022 12:13:03 +0200 Subject: [PATCH 177/213] Don't ship VC_redist Since the CMake include(InstallRequiredSystemLibraries) Should package all the headers Contributes to CURA-8640 --- cmake/nsis.cmake | 6 ------ 1 file changed, 6 deletions(-) diff --git a/cmake/nsis.cmake b/cmake/nsis.cmake index 3f7efc24..308e3ecb 100644 --- a/cmake/nsis.cmake +++ b/cmake/nsis.cmake @@ -7,12 +7,6 @@ install(DIRECTORY ${CMAKE_INSTALL_PREFIX}/arduino COMPONENT "arduino" ) -install(FILES ${CMAKE_INSTALL_PREFIX}/VC_redist.x64.exe - DESTINATION "." - COMPONENT "vcredist" - ) - -cpack_add_component(vcredist DISPLAY_NAME "Visual Studio 2015-2022 Redistributable") cpack_add_component(arduino DISPLAY_NAME "Arduino Drivers") set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) From 07aa0716cc9b3a7015040e476aeeb37a4e2df031 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 8 Apr 2022 12:13:52 +0200 Subject: [PATCH 178/213] Moved the appimage tool to the docker image And use the installer-filename tool Contributes to CURA-8640 --- cmake/appimagekit.cmake | 31 ++++++++----------------------- docker/linux/.env | 2 +- docker/linux/base/Dockerfile | 10 +++++++++- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/cmake/appimagekit.cmake b/cmake/appimagekit.cmake index f4954e86..2d1957d6 100644 --- a/cmake/appimagekit.cmake +++ b/cmake/appimagekit.cmake @@ -1,34 +1,19 @@ # Copyright (c) 2022 Ultimaker B.V. # Cura's build system is released under the terms of the AGPLv3 or higher. - -set(_appimagetool_path "${CMAKE_INSTALL_PREFIX}/bin/appimagetool.AppImage") -set(_apprun_path "${CMAKE_INSTALL_PREFIX}/bin/AppRun") -set(_appimagetool_sha256 "d918b4df547b388ef253f3c9e7f6529ca81a885395c31f619d9aaf7030499a13") -set(_apprun_sha256 "e8f44f56bb23e105905850250d9d87fb1a5cf64211ad141b85864b1b7a092332") +set(INSTALLER_EXT AppImage) +include(installer-filename.cmake) #Put correct version in cura.desktop. -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop @ONLY) - -add_custom_target(AppImageKit ALL - COMMENT "Installing AppImageKit tools to ${CMAKE_INSTALL_PREFIX}/bin/" - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_INSTALL_PREFIX}/bin/ - COMMAND curl -o "${_appimagetool_path}" -SL https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage - COMMAND echo "${_appimagetool_sha256} ${_appimagetool_path}" | sha256sum --check - COMMAND chmod a+x "${_appimagetool_path}" - COMMAND curl -o "${_apprun_path}" -SL https://github.com/AppImage/AppImageKit/releases/download/12/AppRun-x86_64 - COMMAND echo "${_apprun_sha256} ${_apprun_path}" | sha256sum --check - COMMAND chmod a+x "${_apprun_path}" -) +configure_file(${CMAKE_SOURCE_DIR}/packaging/cura.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop @ONLY) -set(_appimage_filename "Ultimaker_Cura-${CURA_VERSION}.AppImage") add_custom_target(packaging ALL COMMENT "Package into an AppImage file." - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura-icon_256x256.png ${ULTIMAKER_CURA_PATH}/cura-icon.png + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packaging/cura-icon_256x256.png ${ULTIMAKER_CURA_PATH}/cura-icon.png COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop ${ULTIMAKER_CURA_PATH}/cura.desktop - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura.sh ${ULTIMAKER_CURA_PATH}/AppRun - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/packaging/cura.appdata.xml ${ULTIMAKER_CURA_PATH}/cura.appdata.xml - COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/${_appimage_filename} #Remove old one if it existed. - COMMAND ${_appimagetool_path} --appimage-extract-and-run ${ULTIMAKER_CURA_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${_appimage_filename} + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packaging/cura.sh ${ULTIMAKER_CURA_PATH}/AppRun + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packaging/cura.appdata.xml ${ULTIMAKER_CURA_PATH}/cura.appdata.xml + COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} #Remove old one if it existed. + COMMAND appimage --appimage-extract-and-run ${ULTIMAKER_CURA_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) add_dependencies(packaging pyinstaller AppImageKit) diff --git a/docker/linux/.env b/docker/linux/.env index 82e4b69a..7e5da2cf 100644 --- a/docker/linux/.env +++ b/docker/linux/.env @@ -1,5 +1,5 @@ CONAN_VERSION=1.47.0 -DOCKER_TAG=1.47.0 +DOCKER_TAG=0.1.0 DOCKER_USERNAME=ultimaker # This versions are mandatory by 'conan-io/conan-center-index' diff --git a/docker/linux/base/Dockerfile b/docker/linux/base/Dockerfile index d0e1d200..bb54b939 100644 --- a/docker/linux/base/Dockerfile +++ b/docker/linux/base/Dockerfile @@ -105,6 +105,13 @@ RUN apt-get -qq update \ libxcb-dri3-dev \ uuid-dev \ libxcb-util-dev \ + ninja-build \ + patchelf \ + desktop-file-utils \ + libgdk-pixbuf2.0-dev \ + fakeroot \ + strace \ + fuse \ && rm -rf /var/lib/apt/lists/* \ && useradd -ms /bin/bash conan \ && printf "conan:conan" | chpasswd \ @@ -154,7 +161,8 @@ RUN apt-get -qq update \ && rm -rf /tmp/* \ && runuser -u conan -- printf 'eval "$(pyenv init -)"\n' >> /home/conan/.bashrc \ && runuser -u conan -- printf 'eval "$(pyenv virtualenv-init -)"\n' >> ~/.bashrc \ - && mkdir -p /home/conan/env \ + && wget --no-check-certificate --quiet https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O /usr/local/bin/appimagetool \ + && chmod +x /usr/local/bin/appimagetool \ && chown -R conan:conan /opt/pyenv \ && chown -R conan:conan /opt/conan From 21261bd1fdb0d9a2a03f33aa9ed7197ffad18811 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 8 Apr 2022 12:33:13 +0200 Subject: [PATCH 179/213] use full path point to installer-filename tool Contributes to CURA-8640 --- cmake/appimagekit.cmake | 5 +++-- cmake/common-cpackconfig.cmake | 2 +- cmake/macos-create-dmg.cmake | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cmake/appimagekit.cmake b/cmake/appimagekit.cmake index 2d1957d6..16b7a08c 100644 --- a/cmake/appimagekit.cmake +++ b/cmake/appimagekit.cmake @@ -1,7 +1,8 @@ # Copyright (c) 2022 Ultimaker B.V. # Cura's build system is released under the terms of the AGPLv3 or higher. + set(INSTALLER_EXT AppImage) -include(installer-filename.cmake) +include(${CMAKE_SOURCE_DIR}/cmake/installer-filename.cmake) #Put correct version in cura.desktop. configure_file(${CMAKE_SOURCE_DIR}/packaging/cura.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop @ONLY) @@ -16,4 +17,4 @@ add_custom_target(packaging ALL COMMAND appimage --appimage-extract-and-run ${ULTIMAKER_CURA_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) -add_dependencies(packaging pyinstaller AppImageKit) +add_dependencies(packaging pyinstaller) diff --git a/cmake/common-cpackconfig.cmake b/cmake/common-cpackconfig.cmake index 910d24d5..70df61ba 100644 --- a/cmake/common-cpackconfig.cmake +++ b/cmake/common-cpackconfig.cmake @@ -24,7 +24,7 @@ install (PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION ".") # ======================================== # CPack Common Settings # ======================================== -include(installer-filename.cmake) +include(${CMAKE_SOURCE_DIR}/cmake/installer-filename.cmake) if (CURA_BUILDTYPE STREQUAL "") set(CPACK_PACKAGE_NAME "Ultimaker Cura") diff --git a/cmake/macos-create-dmg.cmake b/cmake/macos-create-dmg.cmake index 8a026559..ab789f1d 100644 --- a/cmake/macos-create-dmg.cmake +++ b/cmake/macos-create-dmg.cmake @@ -19,7 +19,9 @@ GetFromEnvironmentOrCache( DESCRIPTION "The path to the Rez (Resource compiler)") -set(DMG_PATH "${installer_DIR}/Ultimaker-Cura-${CURA_VERSION}-MacOS.dmg") +set(INSTALLER_EXT dmg) +include(${CMAKE_SOURCE_DIR}/cmake/installer-filename.cmake) +set(DMG_PATH ${installer_DIR}/${INSTALLER_FILENAME}) add_custom_target(create-dmg ALL COMMENT "Create the MacOS dmg") add_custom_command( From 13e98842d1531bd2e422662f959ac5246fc2f58f Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 8 Apr 2022 12:42:39 +0200 Subject: [PATCH 180/213] Make InstallRequiredSystemLibs Optional Contributes to CURA-8640 --- cmake/common-cpackconfig.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/common-cpackconfig.cmake b/cmake/common-cpackconfig.cmake index 70df61ba..e013c8b9 100644 --- a/cmake/common-cpackconfig.cmake +++ b/cmake/common-cpackconfig.cmake @@ -19,7 +19,9 @@ else () endif () include(InstallRequiredSystemLibraries) +set(CMAKE_INSTALL_SYSTEM_RUNTIME_COMPONENT VC_Runtime_Libs) install (PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION ".") +cpack_add_component(VC_Runtime_Libs DISPLAY_NAME "Windows Runtime libraries") # ======================================== # CPack Common Settings From d5dbe8145b37a77fa7664ee49bdf7055a8b0119e Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 8 Apr 2022 13:06:25 +0200 Subject: [PATCH 181/213] Allow for the package appimage target to work in/out side of docker Setting the APPIMAGE_EXTRA_AND_RUN=1 as ENV allows reusing the target packaging on a non docker environment https://github.com/AppImage/AppImageKit/issues/912#issuecomment-528669441 Contributes to CURA-8640 --- cmake/appimagekit.cmake | 4 ++-- docker/linux/.env | 2 +- docker/linux/base/Dockerfile | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/cmake/appimagekit.cmake b/cmake/appimagekit.cmake index 16b7a08c..66a55b41 100644 --- a/cmake/appimagekit.cmake +++ b/cmake/appimagekit.cmake @@ -13,8 +13,8 @@ add_custom_target(packaging ALL COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop ${ULTIMAKER_CURA_PATH}/cura.desktop COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packaging/cura.sh ${ULTIMAKER_CURA_PATH}/AppRun COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packaging/cura.appdata.xml ${ULTIMAKER_CURA_PATH}/cura.appdata.xml - COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} #Remove old one if it existed. - COMMAND appimage --appimage-extract-and-run ${ULTIMAKER_CURA_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} + COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} + COMMAND appimage ${ULTIMAKER_CURA_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) add_dependencies(packaging pyinstaller) diff --git a/docker/linux/.env b/docker/linux/.env index 7e5da2cf..9f89c4a7 100644 --- a/docker/linux/.env +++ b/docker/linux/.env @@ -1,5 +1,5 @@ CONAN_VERSION=1.47.0 -DOCKER_TAG=0.1.0 +DOCKER_TAG=0.1.1 DOCKER_USERNAME=ultimaker # This versions are mandatory by 'conan-io/conan-center-index' diff --git a/docker/linux/base/Dockerfile b/docker/linux/base/Dockerfile index bb54b939..bcb344bb 100644 --- a/docker/linux/base/Dockerfile +++ b/docker/linux/base/Dockerfile @@ -10,7 +10,8 @@ ARG PYTHON_VERSION_FULL ENV PYENV_ROOT=/opt/pyenv \ PATH=/usr/local/bin/:/opt/pyenv/versions/${PYTHON_VERSION_FULL}/bin/:/opt/conan/binutils/bin:${PATH} \ LD_LIBRARY_PATH="/home/conan/env:${LD_LIBRARY_PATH}" \ - CONAN_USER_HOME=/home/conan + CONAN_USER_HOME=/home/conan \ + APPIMAGE_EXTRA_AND_RUN=1 ARG CMAKE_VERSION ARG CMAKE_VERSION_FULL From 30bda0840ab429eb70036365326532c9729ede1a Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 8 Apr 2022 14:31:54 +0200 Subject: [PATCH 182/213] Uniform handling over different OSes Contributes to CURA-8640 --- CMakeLists.txt | 12 +++++++----- cmake/{appimagekit.cmake => create-appimage.cmake} | 3 +-- cmake/{macos-create-dmg.cmake => create-dmg.cmake} | 9 ++++----- cmake/installer-filename.cmake | 2 +- .../{macos-notarize-dmg.cmake => notarize-dmg.cmake} | 9 ++++----- cmake/os.cmake | 9 ++++++++- cmake/pyinstaller.cmake | 7 +++++-- cmake/sign-appimage.cmake | 9 +++++++++ cmake/{macos-sign-dmg.cmake => sign-dmg.cmake} | 9 ++++----- projects/python.cmake | 2 -- 10 files changed, 43 insertions(+), 28 deletions(-) rename cmake/{appimagekit.cmake => create-appimage.cmake} (96%) rename cmake/{macos-create-dmg.cmake => create-dmg.cmake} (81%) rename cmake/{macos-notarize-dmg.cmake => notarize-dmg.cmake} (79%) create mode 100644 cmake/sign-appimage.cmake rename cmake/{macos-sign-dmg.cmake => sign-dmg.cmake} (66%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 28b741ec..8fc74cac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,7 @@ project(cura-build-environment) cmake_minimum_required(VERSION 3.20) include(cmake/conan.cmake) +include(cmake/os.cmake) include(ExternalProject) include(GNUInstallDirs) @@ -81,13 +82,14 @@ include(projects/cura-binary-data.cmake) include(cmake/pyinstaller.cmake) if(APPLE) - include(cmake/macos-create-dmg.cmake) - include(cmake/macos-sign-dmg.cmake) - include(cmake/macos-notarize-dmg.cmake) + include(cmake/create-dmg.cmake) + include(cmake/sign-dmg.cmake) + include(cmake/notarize-dmg.cmake) endif() -if(UNIX) - include(cmake/appimagekit.cmake) +if(LINUX) + include(cmake/create-appimage.cmake) + include(cmake/sign-appimage.cmake) endif() if(WIN32) diff --git a/cmake/appimagekit.cmake b/cmake/create-appimage.cmake similarity index 96% rename from cmake/appimagekit.cmake rename to cmake/create-appimage.cmake index 66a55b41..fd3e9fdd 100644 --- a/cmake/appimagekit.cmake +++ b/cmake/create-appimage.cmake @@ -15,6 +15,5 @@ add_custom_target(packaging ALL COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packaging/cura.appdata.xml ${ULTIMAKER_CURA_PATH}/cura.appdata.xml COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} COMMAND appimage ${ULTIMAKER_CURA_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} -) + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_dependencies(packaging pyinstaller) diff --git a/cmake/macos-create-dmg.cmake b/cmake/create-dmg.cmake similarity index 81% rename from cmake/macos-create-dmg.cmake rename to cmake/create-dmg.cmake index ab789f1d..24c4e672 100644 --- a/cmake/macos-create-dmg.cmake +++ b/cmake/create-dmg.cmake @@ -23,10 +23,10 @@ set(INSTALLER_EXT dmg) include(${CMAKE_SOURCE_DIR}/cmake/installer-filename.cmake) set(DMG_PATH ${installer_DIR}/${INSTALLER_FILENAME}) -add_custom_target(create-dmg ALL COMMENT "Create the MacOS dmg") +add_custom_target(packaging ALL COMMENT "Create the MacOS dmg") add_custom_command( TARGET - create-dmg + packaging WORKING_DIRECTORY ${installer_DIR} COMMAND @@ -40,6 +40,5 @@ add_custom_command( --background "${CMAKE_SOURCE_DIR}/packaging/cura_background_dmg.png" --rez ${REZ_EXECUTABLE} ${DMG_PATH} - ${ULTIMAKER_CURA_APP_PATH} - DEPENDS pyinstaller install-python-requirements Cura create_installer_dir) -add_dependencies(create-dmg pyinstaller install-python-requirements Cura create_installer_dir) \ No newline at end of file + ${ULTIMAKER_CURA_APP_PATH}) +add_dependencies(packaging pyinstaller install-python-requirements Cura create_installer_dir) \ No newline at end of file diff --git a/cmake/installer-filename.cmake b/cmake/installer-filename.cmake index f831646b..1eb03889 100644 --- a/cmake/installer-filename.cmake +++ b/cmake/installer-filename.cmake @@ -12,7 +12,7 @@ if(WIN32) set(INSTALLER_BASE_FILENAME ${INSTALLER_BASE_FILENAME}-windows) endif() -if(UNIX) +if(LINUX) set(INSTALLER_BASE_FILENAME ${INSTALLER_BASE_FILENAME}-linux) endif() diff --git a/cmake/macos-notarize-dmg.cmake b/cmake/notarize-dmg.cmake similarity index 79% rename from cmake/macos-notarize-dmg.cmake rename to cmake/notarize-dmg.cmake index 62d4b217..59662806 100644 --- a/cmake/macos-notarize-dmg.cmake +++ b/cmake/notarize-dmg.cmake @@ -35,18 +35,17 @@ if(SIGN_DMG) DESCRIPTION "The path to the altool executable") - add_custom_target(notarize-dmg ALL COMMENT "Notarize the MacOS dmg") + add_custom_target(notarize ALL COMMENT "Notarize the MacOS dmg") add_custom_command( TARGET - notarize-dmg + notarize WORKING_DIRECTORY ${installer_DIR} COMMAND xcrun ${ALTOOL_EXECUTABLE} --notarize-app --primary-bundle-id "${ULTIMAKER_CURA_DOMAIN}" --username "${NOTARIZE_USER}" --password "${NOTARIZE_PASSWORD}" - --file "${DMG_PATH}" - DEPENDS sign-dmg create-dmg pyinstaller install-python-requirements Cura create_installer_dir) - add_dependencies(notarize-dmg create-dmg pyinstaller install-python-requirements Cura create_installer_dir) + --file "${DMG_PATH}") + add_dependencies(notarize signing pyinstaller install-python-requirements Cura create_installer_dir) endif() endif() \ No newline at end of file diff --git a/cmake/os.cmake b/cmake/os.cmake index 8be8ac3c..8e58f18b 100644 --- a/cmake/os.cmake +++ b/cmake/os.cmake @@ -1,3 +1,6 @@ +# Copyright (c) 2022 Ultimaker B.V. +# cura-build-environment is released under the terms of the AGPLv3 or higher. + if(WIN32) set(ext .pyd) set(env_path_sep ";") @@ -16,4 +19,8 @@ endif() set(PYTHONPATH ${CMAKE_INSTALL_PREFIX}/${python_lib_path}/site-packages) set(Python_VENV_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/${exe_path}/python${exe_ext}) -set(Python_SITELIB_LOCAL ${CMAKE_INSTALL_PREFIX}/${python_lib_path}/site-packages/) \ No newline at end of file +set(Python_SITELIB_LOCAL ${CMAKE_INSTALL_PREFIX}/${python_lib_path}/site-packages/) + +if(UNIX AND NOT APPLE) + set(LINUX TRUE) +endif() \ No newline at end of file diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index e0b3cc48..ec76742e 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -1,7 +1,6 @@ # Copyright (c) 2022 Ultimaker B.V. # cura-build-environment is released under the terms of the AGPLv3 or higher. - set(pyinstaller_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/${exe_path}/pyinstaller) set(cura_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/cura_app.py) set(curaengine_EXECUTABLE ${CMAKE_INSTALL_PREFIX}/bin/CuraEngine${exe_ext}) @@ -38,13 +37,17 @@ if (APPLE) list(APPEND extra_pyinstaller_args --icon ${CMAKE_SOURCE_DIR}/packaging/cura.icns) endif () +if(LINUX) + list(APPEND extra_pyinstaller_args --add-binary "/usr/lib/libwayland-cursor.so.0${env_path_sep}.") +endif() + if (WIN32) list(APPEND extra_pyinstaller_args --hidden-import fcntl --collect-all win32ctypes --icon ${CMAKE_SOURCE_DIR}/packaging/Cura.ico) endif () add_custom_target(create_installer_dir ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${installer_DIR}) add_custom_target(pyinstaller ALL COMMENT "Collect the build artifacts in a single installer") -include(${CMAKE_SOURCE_DIR}/cmake/os.cmake) + add_custom_command( TARGET pyinstaller diff --git a/cmake/sign-appimage.cmake b/cmake/sign-appimage.cmake new file mode 100644 index 00000000..d075ab46 --- /dev/null +++ b/cmake/sign-appimage.cmake @@ -0,0 +1,9 @@ +# Copyright (c) 2022 Ultimaker B.V. +# Cura's build system is released under the terms of the AGPLv3 or higher. + +add_custom_target(signing ALL COMMENT "Create the asc file for the AppImage file.") +add_custom_command( + TARGET + signing + COMMAND sha256sum ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} >> ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_BASE_FILENAME}.asc) +add_dependencies(signing packaging) \ No newline at end of file diff --git a/cmake/macos-sign-dmg.cmake b/cmake/sign-dmg.cmake similarity index 66% rename from cmake/macos-sign-dmg.cmake rename to cmake/sign-dmg.cmake index 3ea76c25..9ed2bd93 100644 --- a/cmake/macos-sign-dmg.cmake +++ b/cmake/sign-dmg.cmake @@ -11,17 +11,16 @@ if(SIGN_DMG) DESCRIPTION "The path to the codesign executable") - add_custom_target(sign-dmg ALL COMMENT "Sign the MacOS dmg") + add_custom_target(signing ALL COMMENT "Sign the MacOS dmg") add_custom_command( TARGET - sign-dmg + signing WORKING_DIRECTORY ${installer_DIR} COMMAND ${CODESIGN_EXECUTABLE} -s "${CODESIGN_IDENTITY}" --timestamp -i "${ULTIMAKER_CURA_DOMAIN}" - "${DMG_PATH}" - DEPENDS create-dmg pyinstaller install-python-requirements Cura create_installer_dir) - add_dependencies(sign-dmg create-dmg pyinstaller install-python-requirements Cura create_installer_dir) + "${DMG_PATH}") + add_dependencies(signing packaging pyinstaller install-python-requirements Cura create_installer_dir) endif() \ No newline at end of file diff --git a/projects/python.cmake b/projects/python.cmake index 195a8e0c..0d17d109 100644 --- a/projects/python.cmake +++ b/projects/python.cmake @@ -23,8 +23,6 @@ else() endif() message(STATUS "Using Python ${Python_VERSION}") -include(${CMAKE_SOURCE_DIR}/cmake/os.cmake) - add_custom_target(create-virtual-env ALL COMMENT "Create Virtual Environment") add_custom_command( TARGET create-virtual-env From 867557b2f2bc3b95622388d5d984184c602e6932 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 8 Apr 2022 14:59:45 +0200 Subject: [PATCH 183/213] Add libwayland libs Contributes to CURA-8640 --- docker/linux/.env | 2 +- docker/linux/base/Dockerfile | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docker/linux/.env b/docker/linux/.env index 9f89c4a7..5f076b34 100644 --- a/docker/linux/.env +++ b/docker/linux/.env @@ -1,5 +1,5 @@ CONAN_VERSION=1.47.0 -DOCKER_TAG=0.1.1 +DOCKER_TAG=0.1.2 DOCKER_USERNAME=ultimaker # This versions are mandatory by 'conan-io/conan-center-index' diff --git a/docker/linux/base/Dockerfile b/docker/linux/base/Dockerfile index bcb344bb..24b31020 100644 --- a/docker/linux/base/Dockerfile +++ b/docker/linux/base/Dockerfile @@ -113,6 +113,9 @@ RUN apt-get -qq update \ fakeroot \ strace \ fuse \ + libwayland-cursor0 \ + libwayland-client0 \ + libwayland-egl1 \ && rm -rf /var/lib/apt/lists/* \ && useradd -ms /bin/bash conan \ && printf "conan:conan" | chpasswd \ From f7914d2160013d8b0976a667d94aeced6140cb83 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 8 Apr 2022 16:11:14 +0200 Subject: [PATCH 184/213] Fix the permission of the AppRun Contributes to CURA-8640 --- cmake/apprun-attr.cmake | 6 ++++++ cmake/create-appimage.cmake | 4 ++-- cmake/pyinstaller.cmake | 2 +- packaging/cura.sh | 1 + 4 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 cmake/apprun-attr.cmake diff --git a/cmake/apprun-attr.cmake b/cmake/apprun-attr.cmake new file mode 100644 index 00000000..30fff0b4 --- /dev/null +++ b/cmake/apprun-attr.cmake @@ -0,0 +1,6 @@ +# Copyright (c) 2022 Ultimaker B.V. +# Cura's build system is released under the terms of the AGPLv3 or higher. + +file(COPY${CMAKE_SOURCE_DIR}/packaging/cura.sh + DESTINATION ${ULTIMAKER_CURA_PATH} + FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_WRITE GROUP_READ WORLD_READ OWNER_EXECUTE) \ No newline at end of file diff --git a/cmake/create-appimage.cmake b/cmake/create-appimage.cmake index fd3e9fdd..683d6a5f 100644 --- a/cmake/create-appimage.cmake +++ b/cmake/create-appimage.cmake @@ -9,11 +9,11 @@ configure_file(${CMAKE_SOURCE_DIR}/packaging/cura.desktop.in ${CMAKE_CURRENT_BIN add_custom_target(packaging ALL COMMENT "Package into an AppImage file." + COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/apprun-attr.cmake COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packaging/cura-icon_256x256.png ${ULTIMAKER_CURA_PATH}/cura-icon.png COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop ${ULTIMAKER_CURA_PATH}/cura.desktop - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packaging/cura.sh ${ULTIMAKER_CURA_PATH}/AppRun COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packaging/cura.appdata.xml ${ULTIMAKER_CURA_PATH}/cura.appdata.xml COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} - COMMAND appimage ${ULTIMAKER_CURA_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} + COMMAND appimagetool --appimage-extract-and-run ${ULTIMAKER_CURA_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_dependencies(packaging pyinstaller) diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index ec76742e..8b007558 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -38,7 +38,7 @@ if (APPLE) endif () if(LINUX) - list(APPEND extra_pyinstaller_args --add-binary "/usr/lib/libwayland-cursor.so.0${env_path_sep}.") + list(APPEND extra_pyinstaller_args --add-binary "/usr/lib/x86_64-linux-gnu/libwayland-cursor.so.0.0.0${env_path_sep}.") endif() if (WIN32) diff --git a/packaging/cura.sh b/packaging/cura.sh index 75d62e16..40148141 100644 --- a/packaging/cura.sh +++ b/packaging/cura.sh @@ -3,6 +3,7 @@ scriptdir=$(dirname $0) export PYTHONPATH="$scriptdir/lib/python3.10" +export LD_LIBRARY_PATH=$scriptdir export QT_PLUGIN_PATH="$scriptdir/qt/plugins" export QML2_IMPORT_PATH="$scriptdir/qt/qml" export QT_QPA_FONTDIR=/usr/share/fonts From 5c1eb165f19b499a26bffc9c4889b6d1c4a3ce2a Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 8 Apr 2022 16:23:47 +0200 Subject: [PATCH 185/213] Fix the permission of the AppRun Contributes to CURA-8640 --- cmake/apprun-attr.cmake | 6 ------ cmake/create-appimage.cmake | 6 ++++-- cmake/pyinstaller.cmake | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) delete mode 100644 cmake/apprun-attr.cmake diff --git a/cmake/apprun-attr.cmake b/cmake/apprun-attr.cmake deleted file mode 100644 index 30fff0b4..00000000 --- a/cmake/apprun-attr.cmake +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2022 Ultimaker B.V. -# Cura's build system is released under the terms of the AGPLv3 or higher. - -file(COPY${CMAKE_SOURCE_DIR}/packaging/cura.sh - DESTINATION ${ULTIMAKER_CURA_PATH} - FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_WRITE GROUP_READ WORLD_READ OWNER_EXECUTE) \ No newline at end of file diff --git a/cmake/create-appimage.cmake b/cmake/create-appimage.cmake index 683d6a5f..36ce2478 100644 --- a/cmake/create-appimage.cmake +++ b/cmake/create-appimage.cmake @@ -7,13 +7,15 @@ include(${CMAKE_SOURCE_DIR}/cmake/installer-filename.cmake) #Put correct version in cura.desktop. configure_file(${CMAKE_SOURCE_DIR}/packaging/cura.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop @ONLY) +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/apprun-attr.cmake" "file(COPY ${CMAKE_SOURCE_DIR}/packaging/cura.sh DESTINATION ${ULTIMAKER_CURA_PATH}/ FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_WRITE GROUP_READ WORLD_READ OWNER_EXECUTE)") + add_custom_target(packaging ALL COMMENT "Package into an AppImage file." - COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/apprun-attr.cmake + COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/apprun-attr.cmake COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packaging/cura-icon_256x256.png ${ULTIMAKER_CURA_PATH}/cura-icon.png COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop ${ULTIMAKER_CURA_PATH}/cura.desktop COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packaging/cura.appdata.xml ${ULTIMAKER_CURA_PATH}/cura.appdata.xml COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} COMMAND appimagetool --appimage-extract-and-run ${ULTIMAKER_CURA_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) -add_dependencies(packaging pyinstaller) +#add_dependencies(packaging pyinstaller) diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index 8b007558..20fb26e6 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -38,7 +38,7 @@ if (APPLE) endif () if(LINUX) - list(APPEND extra_pyinstaller_args --add-binary "/usr/lib/x86_64-linux-gnu/libwayland-cursor.so.0.0.0${env_path_sep}.") + list(APPEND extra_pyinstaller_args )#--add-binary "/usr/lib/x86_64-linux-gnu/libwayland-cursor.so.0.0.0${env_path_sep}.") endif() if (WIN32) From 1f54c1677d05f1ec1f9ee1be851b13508c974a30 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 8 Apr 2022 20:49:38 +0200 Subject: [PATCH 186/213] Split up resources in a UM and Cura path Contributes to Cura-8640 --- cmake/pyinstaller.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index 20fb26e6..dbfcbaf9 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -70,8 +70,8 @@ add_custom_command( --add-binary "${curaengine_EXECUTABLE}${env_path_sep}." --add-data "${CMAKE_INSTALL_PREFIX}/${lib_path}/cura/plugins${env_path_sep}plugins" --add-data "${CMAKE_INSTALL_PREFIX}/${lib_path}/uranium/plugins${env_path_sep}plugins" - --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources${env_path_sep}resources" - --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources${env_path_sep}resources" + --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources${env_path_sep}/share/cura/resources" + --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources${env_path_sep}/share/uranium/resources" --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/${env_path_sep}resources/qml/UM/" --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} --name "Ultimaker-Cura") From e6b6406f0a4c9e067b0d6af1575fba8d013019b4 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Fri, 8 Apr 2022 21:04:48 +0200 Subject: [PATCH 187/213] Fix in path Contributes to Cura-8640 --- cmake/pyinstaller.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index dbfcbaf9..5a5620e7 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -70,8 +70,8 @@ add_custom_command( --add-binary "${curaengine_EXECUTABLE}${env_path_sep}." --add-data "${CMAKE_INSTALL_PREFIX}/${lib_path}/cura/plugins${env_path_sep}plugins" --add-data "${CMAKE_INSTALL_PREFIX}/${lib_path}/uranium/plugins${env_path_sep}plugins" - --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources${env_path_sep}/share/cura/resources" - --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources${env_path_sep}/share/uranium/resources" + --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources${env_path_sep}share/cura/resources" + --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources${env_path_sep}share/uranium/resources" --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/${env_path_sep}resources/qml/UM/" --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} --name "Ultimaker-Cura") From d17d0d7055229b59f1ba526c46e062bcfef26b10 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Sat, 9 Apr 2022 10:30:22 +0200 Subject: [PATCH 188/213] Map QML and plugins to correct installer paths Contributes to Cura-8640 --- cmake/pyinstaller.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index 5a5620e7..cc4606d7 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -68,11 +68,11 @@ add_custom_command( --hidden-import zeroconf --collect-all trimesh --add-binary "${curaengine_EXECUTABLE}${env_path_sep}." - --add-data "${CMAKE_INSTALL_PREFIX}/${lib_path}/cura/plugins${env_path_sep}plugins" - --add-data "${CMAKE_INSTALL_PREFIX}/${lib_path}/uranium/plugins${env_path_sep}plugins" + --add-data "${CMAKE_INSTALL_PREFIX}/${lib_path}/cura/plugins${env_path_sep}share/cura/plugins" + --add-data "${CMAKE_INSTALL_PREFIX}/${lib_path}/uranium/plugins${env_path_sep}share/uranium/plugins" --add-data "${CMAKE_INSTALL_PREFIX}/share/cura/resources${env_path_sep}share/cura/resources" --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources${env_path_sep}share/uranium/resources" - --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/${env_path_sep}resources/qml/UM/" + --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/${env_path_sep}PyQt6/Qt6/qml/UM" --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} --name "Ultimaker-Cura") add_dependencies(pyinstaller create_installer_dir Cura fdm_materials cura-binary-data) \ No newline at end of file From adbba85da3384bef5223c47de68ad20a9dcc1e0d Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Sat, 9 Apr 2022 10:32:09 +0200 Subject: [PATCH 189/213] Copy the Cura.ico in the pyinstaller dist folder I hope this will solve the missing icon in the menu Contributes to Cura-8640 --- cmake/pyinstaller.cmake | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmake/pyinstaller.cmake b/cmake/pyinstaller.cmake index cc4606d7..6b5af03e 100644 --- a/cmake/pyinstaller.cmake +++ b/cmake/pyinstaller.cmake @@ -74,5 +74,8 @@ add_custom_command( --add-data "${CMAKE_INSTALL_PREFIX}/share/uranium/resources${env_path_sep}share/uranium/resources" --add-data "${Python_SITELIB_LOCAL}/UM/Qt/qml/UM/${env_path_sep}PyQt6/Qt6/qml/UM" --windowed --clean --noconfirm --log-level INFO ${extra_pyinstaller_args} - --name "Ultimaker-Cura") + --name "Ultimaker-Cura" + COMMAND + ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packaging/Cura.ico ${ULTIMAKER_CURA_PATH}/ +) add_dependencies(pyinstaller create_installer_dir Cura fdm_materials cura-binary-data) \ No newline at end of file From fa71adbbe55ce4d84068bfe886704fc9997fd12f Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Sat, 9 Apr 2022 10:32:46 +0200 Subject: [PATCH 190/213] Added some default values handy for debugging needs to be removed in the end Contributes to Cura-8640 --- conanfile.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/conanfile.py b/conanfile.py index 23a235f5..b44ba17b 100644 --- a/conanfile.py +++ b/conanfile.py @@ -53,5 +53,13 @@ def generate(self): tc.variables["CURA_VERSION_MAJOR"] = "5" tc.variables["CURA_VERSION_EXTRA"] = "a+1" + tc.variables["CURA_DEBUGMODE"] = "OFF" + + tc.variables["CURA_CLOUD_API_VERSION"] = "1" + tc.variables["CURA_CLOUD_API_ROOT"] = "https://api.ultimaker.com" + tc.variables["CURA_CLOUD_ACCOUNT_API_ROOT"] = "https://account.ultimaker.com" + tc.variables["CURA_MARKETPLACE_ROOT"] = "https://marketplace.ultimaker.com" + tc.variables["CURA_DIGITAL_FACTORY_URL"] = "https://digitalfactory.ultimaker.com" + tc.generate() From 875adff48708462cf9e9365cedf48dbbef17b3c9 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Sat, 9 Apr 2022 10:33:22 +0200 Subject: [PATCH 191/213] Allow installer filename postfix to be set via CMake Contributes to Cura-8640 --- cmake/installer-filename.cmake | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/cmake/installer-filename.cmake b/cmake/installer-filename.cmake index 1eb03889..a3780705 100644 --- a/cmake/installer-filename.cmake +++ b/cmake/installer-filename.cmake @@ -1,6 +1,28 @@ # Copyright (c) 2022 Ultimaker B.V. # Cura's build system is released under the terms of the AGPLv3 or higher. +GetFromEnvironmentOrCache( + NAME + POSTFIX_OS_INSTALLER_FILENAME_WINDOWS + DEFAULT + win64 + DESCRIPTION + "postfix for the installer file name when a Windows build is made (default win64): Ultimaker-Cura-5.0.0-b+2-win64.exe") +GetFromEnvironmentOrCache( + NAME + POSTFIX_OS_INSTALLER_FILENAME_LINUX + DEFAULT + linux + DESCRIPTION + "postfix for the installer file name when a Windows build is made (default linux): Ultimaker-Cura-5.0.0-b+2-linux.AppImage") +GetFromEnvironmentOrCache( + NAME + POSTFIX_OS_INSTALLER_FILENAME_MAC + DEFAULT + mac + DESCRIPTION + "postfix for the installer file name when a Windows build is made (default mac): Ultimaker-Cura-5.0.0-b+2-mac.dmg") + set(INSTALLER_BASE_FILENAME "Ultimaker-Cura") if(NOT CURA_BUILDTYPE STREQUAL "") string(REPLACE " " "_" CURA_BUILDTYPE_NO_SPACES "${CURA_BUILDTYPE}") @@ -9,15 +31,15 @@ endif() set(INSTALLER_BASE_FILENAME ${INSTALLER_BASE_FILENAME}-${CURA_VERSION}) if(WIN32) - set(INSTALLER_BASE_FILENAME ${INSTALLER_BASE_FILENAME}-windows) + set(INSTALLER_BASE_FILENAME ${INSTALLER_BASE_FILENAME}-${POSTFIX_OS_INSTALLER_FILENAME_WINDOWS}) endif() if(LINUX) - set(INSTALLER_BASE_FILENAME ${INSTALLER_BASE_FILENAME}-linux) + set(INSTALLER_BASE_FILENAME ${INSTALLER_BASE_FILENAME}-${POSTFIX_OS_INSTALLER_FILENAME_LINUX}) endif() if(APPLE) - set(INSTALLER_BASE_FILENAME ${INSTALLER_BASE_FILENAME}-mac) + set(INSTALLER_BASE_FILENAME ${INSTALLER_BASE_FILENAME}-${POSTFIX_OS_INSTALLER_FILENAME_MAC}) endif() if(INSTALLER_EXT) From b2c950875b8220c0b690b3da0fa65817dfd23dc9 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Sat, 9 Apr 2022 10:41:08 +0200 Subject: [PATCH 192/213] Various tweaks to the NSIS installer Damn that thing is slow. Planning on optimizing this in the future because this it taking longer then the actual building Current scenario: 1. Install files collected by pyinstaller (that is one copy move) 2. CPacks Copies those files again 3. NSIS compresses those files Thinking about tricking NSIS by grabbing the files directly from the pyinstaller location. Saves twice the copying. I might even let pyinstaller do a dry-run and create a NSIS script from the about to be collected files. Since I think pyinstaller doesn't alter any files on Windows. This would just leave a compress operation. food for thought Contributes to Cura-8640 --- cmake/common-cpackconfig.cmake | 15 ++++----------- cmake/nsis.cmake | 12 ++++++++---- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/cmake/common-cpackconfig.cmake b/cmake/common-cpackconfig.cmake index e013c8b9..f27ffa1a 100644 --- a/cmake/common-cpackconfig.cmake +++ b/cmake/common-cpackconfig.cmake @@ -18,14 +18,10 @@ else () ) endif () -include(InstallRequiredSystemLibraries) -set(CMAKE_INSTALL_SYSTEM_RUNTIME_COMPONENT VC_Runtime_Libs) -install (PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION ".") -cpack_add_component(VC_Runtime_Libs DISPLAY_NAME "Windows Runtime libraries") - # ======================================== # CPack Common Settings # ======================================== +set(CPACK_THREADS -1) include(${CMAKE_SOURCE_DIR}/cmake/installer-filename.cmake) if (CURA_BUILDTYPE STREQUAL "") @@ -53,11 +49,11 @@ else () set(CPACK_PACKAGE_NAME "Ultimaker Cura ${CURA_BUILDTYPE} ${CURA_VERSION}") endif () -set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico") +set(CPACK_PACKAGE_ICON ${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Ultimaker Cura - 3D Printing Software") set(CPACK_PACKAGE_CONTACT "Ultimaker Cura ") -set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}\\\\packaging\\\\cura_license.txt") -set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico") +set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}\\\\packaging\\\\cura_license.txt) +set(CPACK_PACKAGE_ICON ${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico) # Differentiate between a normal Cura installation and that of a different build type if (CURA_BUILDTYPE STREQUAL "") @@ -71,7 +67,4 @@ else () endif () # Use processor name -STRING(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" CPACK_SYSTEM_NAME) set(CPACK_PACKAGE_FILE_NAME ${INSTALLER_FILENAME}) - -set(CPACK_THREADS -1) diff --git a/cmake/nsis.cmake b/cmake/nsis.cmake index 308e3ecb..ba35c6b9 100644 --- a/cmake/nsis.cmake +++ b/cmake/nsis.cmake @@ -2,20 +2,24 @@ # Cura's build system is released under the terms of the AGPLv3 or higher. # Only NSIS needs to have arduino and vcredist +include(InstallRequiredSystemLibraries) +install (PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION "." COMPONENT VC_Runtime_Libs) +cpack_add_component(VC_Runtime_Libs DISPLAY_NAME "Windows Runtime libraries") + install(DIRECTORY ${CMAKE_INSTALL_PREFIX}/arduino DESTINATION "." COMPONENT "arduino" ) - cpack_add_component(arduino DISPLAY_NAME "Arduino Drivers") +set(CPACK_NSIS_COMPRESSOR zlib) set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".") set(CPACK_NSIS_STARTMENU_DIRECTORY "Ultimaker Cura") set(CPACK_NSIS_DISPLAY_NAME "Ultimaker Cura") -set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico") -set(CPACK_NSIS_MUI_UNIICON "${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico") -set(CPACK_NSIS_INSTALLED_ICON_NAME "Ultimaker-Cura.exe") +set(CPACK_NSIS_MUI_ICON ${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico) +set(CPACK_NSIS_MUI_UNIICON ${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico) +set(CPACK_NSIS_INSTALLED_ICON_NAME "Cura.ico") set(CPACK_NSIS_HELP_LINK "https://github.com/Ultimaker/Cura") set(CPACK_NSIS_URL_INFO_ABOUT "https://ultimaker.com/en/support/software") set(CPACK_NSIS_MENU_LINKS From 3fa9ce0b257fdf60843f7735397b98d0236cad95 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Sun, 10 Apr 2022 17:36:52 +0200 Subject: [PATCH 193/213] Replace CPack with custom Jinja NSIS parser Damn that CPack is slow. It was copying stuff everywhere, which need not be copied. Cut the time down from 30 minutes to 10 minutes Contributes to Cura-8640 --- CMakeLists.txt | 17 +- cmake/common-cpackconfig.cmake | 70 -------- cmake/nsis.cmake | 62 ++++--- conanfile.py | 6 +- packaging/NSIS/CharStrStrip.nsh | 69 -------- packaging/NSIS/FileAssociation.nsh | 217 ------------------------ packaging/NSIS/Ultimaker-Cura.nsi.jinja | 181 ++++++++++++++++++++ packaging/NSIS/fileassoc.nsh | 134 +++++++++++++++ packaging/NSIS/nsis-configurator.py | 51 ++++++ 9 files changed, 409 insertions(+), 398 deletions(-) delete mode 100644 cmake/common-cpackconfig.cmake delete mode 100644 packaging/NSIS/CharStrStrip.nsh delete mode 100644 packaging/NSIS/FileAssociation.nsh create mode 100644 packaging/NSIS/Ultimaker-Cura.nsi.jinja create mode 100644 packaging/NSIS/fileassoc.nsh create mode 100644 packaging/NSIS/nsis-configurator.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 8fc74cac..ff31fa02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,11 +50,17 @@ GetFromEnvironmentOrCache( "Cura Patch Version") GetFromEnvironmentOrCache( NAME - CURA_VERSION_EXTRA + CURA_VERSION_PRE_RELEASE_TAG DESCRIPTION - "Cura Extra Version Information") -if(NOT ${CURA_VERSION_EXTRA} STREQUAL "") - set(CURA_VERSION_EXTRA "-${CURA_VERSION_EXTRA}") + "Cura pre release tag Version Information a, b or rc") +GetFromEnvironmentOrCache( + NAME + CURA_VERSION_BUILD + DESCRIPTION + "Cura Version build") +set(CURA_VERSION_EXTRA ) +if(NOT ${CURA_VERSION_PRE_RELEASE_TAG} STREQUAL "") + set(CURA_VERSION_EXTRA "-${CURA_VERSION_PRE_RELEASE_TAG}+${CURA_VERSION_BUILD}") endif() set(_default_cura_version "${CURA_VERSION_MAJOR}.${CURA_VERSION_MINOR}.${CURA_VERSION_PATCH}${CURA_VERSION_EXTRA}") GetFromEnvironmentOrCache( @@ -93,8 +99,5 @@ if(LINUX) endif() if(WIN32) - include(CPackComponent) - include(cmake/common-cpackconfig.cmake) include(cmake/nsis.cmake) - include(CPack) endif() \ No newline at end of file diff --git a/cmake/common-cpackconfig.cmake b/cmake/common-cpackconfig.cmake deleted file mode 100644 index f27ffa1a..00000000 --- a/cmake/common-cpackconfig.cmake +++ /dev/null @@ -1,70 +0,0 @@ -install(DIRECTORY ${ULTIMAKER_CURA_PATH}/ - DESTINATION "." - USE_SOURCE_PERMISSIONS - COMPONENT "_cura" # Note: _ prefix is necessary to make sure the Cura component is always listed first - ) - -if (CURA_BUILDTYPE STREQUAL "") - cpack_add_component(_cura - DISPLAY_NAME "Ultimaker Cura" - Description "Ultimaker Cura Executable and Data Files" - REQUIRED - ) -else () - cpack_add_component(_cura - DISPLAY_NAME "Ultimaker Cura ${CURA_BUILDTYPE}" - Description "Ultimaker Cura ${CURA_BUILDTYPE} Executable and Data Files" - REQUIRED - ) -endif () - -# ======================================== -# CPack Common Settings -# ======================================== -set(CPACK_THREADS -1) -include(${CMAKE_SOURCE_DIR}/cmake/installer-filename.cmake) - -if (CURA_BUILDTYPE STREQUAL "") - set(CPACK_PACKAGE_NAME "Ultimaker Cura") -else () - set(CPACK_PACKAGE_NAME "Ultimaker Cura ${CURA_BUILDTYPE}") -endif () - -set(CPACK_PACKAGE_VENDOR "Ultimaker B.V.") -set(CPACK_PACKAGE_HOMEPAGE_URL "https://ultimaker.com") - -# MSI only supports version format like "x.x.x.x" where x is an integer from 0 to 65534 -set(CPACK_PACKAGE_VERSION_MAJOR ${CURA_VERSION_MAJOR}) -set(CPACK_PACKAGE_VERSION_MINOR ${CURA_VERSION_MINOR}) -set(CPACK_PACKAGE_VERSION_PATCH ${CURA_VERSION_PATCH}) -set(NSIS_CURA_VERSION ${CURA_VERSION_MAJOR}.${CURA_VERSION_MINOR}.${CURA_VERSION_PATCH}) - -# Use full version x.x.x string in install directory for both installers, -# so that IT can easily automatically upgrade to a newer patch version, -# but also uninstall only the desired EXE installation. Also differentiate -# between build types -if (CURA_BUILDTYPE STREQUAL "") - set(CPACK_PACKAGE_NAME "Ultimaker Cura ${CURA_VERSION}") -else () - set(CPACK_PACKAGE_NAME "Ultimaker Cura ${CURA_BUILDTYPE} ${CURA_VERSION}") -endif () - -set(CPACK_PACKAGE_ICON ${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico) -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Ultimaker Cura - 3D Printing Software") -set(CPACK_PACKAGE_CONTACT "Ultimaker Cura ") -set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}\\\\packaging\\\\cura_license.txt) -set(CPACK_PACKAGE_ICON ${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico) - -# Differentiate between a normal Cura installation and that of a different build type -if (CURA_BUILDTYPE STREQUAL "") - set(CPACK_CREATE_DESKTOP_LINKS Cura "Ultimaker Cura ${NSIS_CURA_VERSION}") - set(CPACK_PACKAGE_EXECUTABLES Cura "Ultimaker Cura ${NSIS_CURA_VERSION}") - set(CPACK_PACKAGE_INSTALL_DIRECTORY "Ultimaker Cura ${NSIS_CURA_VERSION}") -else () - set(CPACK_CREATE_DESKTOP_LINKS Cura "Ultimaker Cura ${CURA_BUILDTYPE} ${NSIS_CURA_VERSION}") - set(CPACK_PACKAGE_EXECUTABLES Cura "Ultimaker Cura ${CURA_BUILDTYPE} ${NSIS_CURA_VERSION}") - set(CPACK_PACKAGE_INSTALL_DIRECTORY "Ultimaker Cura ${CURA_BUILDTYPE} ${NSIS_CURA_VERSION}") -endif () - -# Use processor name -set(CPACK_PACKAGE_FILE_NAME ${INSTALLER_FILENAME}) diff --git a/cmake/nsis.cmake b/cmake/nsis.cmake index ba35c6b9..ac0a3a29 100644 --- a/cmake/nsis.cmake +++ b/cmake/nsis.cmake @@ -3,40 +3,36 @@ # Only NSIS needs to have arduino and vcredist include(InstallRequiredSystemLibraries) -install (PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION "." COMPONENT VC_Runtime_Libs) -cpack_add_component(VC_Runtime_Libs DISPLAY_NAME "Windows Runtime libraries") +install(PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION "." COMPONENT VC_Runtime_Libs) +add_custom_target(packaging ALL COMMENT "Package into a NSIS installer.") -install(DIRECTORY ${CMAKE_INSTALL_PREFIX}/arduino - DESTINATION "." - COMPONENT "arduino" - ) -cpack_add_component(arduino DISPLAY_NAME "Arduino Drivers") - -set(CPACK_NSIS_COMPRESSOR zlib) -set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) -set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".") -set(CPACK_NSIS_STARTMENU_DIRECTORY "Ultimaker Cura") -set(CPACK_NSIS_DISPLAY_NAME "Ultimaker Cura") -set(CPACK_NSIS_MUI_ICON ${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico) -set(CPACK_NSIS_MUI_UNIICON ${CMAKE_SOURCE_DIR}\\\\packaging\\\\Cura.ico) -set(CPACK_NSIS_INSTALLED_ICON_NAME "Cura.ico") -set(CPACK_NSIS_HELP_LINK "https://github.com/Ultimaker/Cura") -set(CPACK_NSIS_URL_INFO_ABOUT "https://ultimaker.com/en/support/software") -set(CPACK_NSIS_MENU_LINKS - "https://ultimaker.com/en/support/software" "Online Documentation" - "https://github.com/Ultimaker/Cura" "Development Resources" - ) - -set(CPACK_NSIS_MUI_WELCOMEFINISHPAGE_BITMAP ${CMAKE_SOURCE_DIR}\\\\packaging\\\\cura_banner_nsis.bmp) -set(CPACK_NSIS_MUI_UNWELCOMEFINISHPAGE_BITMAP ${CMAKE_SOURCE_DIR}\\\\packaging\\\\cura_banner_nsis.bmp) -set(CPACK_NSIS_INSTALLER_MUI_FINISHPAGE_RUN_CODE "!define MUI_FINISHPAGE_RUN \\\"$WINDIR\\\\explorer.exe\\\"\n!define MUI_FINISHPAGE_RUN_PARAMETERS \\\"$INSTDIR\\\\Ultimaker-Cura.exe\\\"") # Hack to ensure Cura is not started with admin rights +set(INSTALLER_EXT exe) +include(${CMAKE_SOURCE_DIR}/cmake/installer-filename.cmake) -add_custom_target(packaging - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/packaging/NSIS "${CMAKE_CURRENT_BINARY_DIR}/_CPack_Packages/${CPACK_SYSTEM_NAME}/NSIS" - COMMENT "Copying NSIS scripts from [${CMAKE_SOURCE_DIR}/packaging/NSIS] to [${CMAKE_CURRENT_BINARY_DIR}/_CPack_Packages/${CPACK_SYSTEM_NAME}/NSIS]" - COMMAND "${CMAKE_COMMAND}" --build . --target package - WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" +add_custom_command( + TARGET + packaging + WORKING_DIRECTORY + ${installer_DIR}/dist + COMMAND + ${Python_EXECUTABLE} ${CMAKE_SOURCE_DIR}/packaging/NSIS/nsis-configurator.py + ${ULTIMAKER_CURA_PATH} + ${CMAKE_SOURCE_DIR}/packaging/NSIS/Ultimaker-Cura.nsi.jinja + "Ultimaker Cura" + "Ultimaker-Cura.exe" + ${CURA_VERSION_MAJOR} + ${CURA_VERSION_MINOR} + ${CURA_VERSION_PATCH} + ${CURA_VERSION_BUILD} + "Ultimaker B.V." + "https://ultimaker.com/software/ultimaker-cura" + ${CMAKE_SOURCE_DIR}/packaging/cura_license.txt + LZMA + ${CMAKE_SOURCE_DIR}/packaging/cura_banner_nsis.bmp + ${CMAKE_SOURCE_DIR}/packaging/Cura.ico + ${installer_DIR}/dist/${INSTALLER_FILENAME} + COMMAND + makensis /V2 /P4 ${installer_DIR}/dist/Ultimaker-Cura.nsi COMMENT "Package into a NSIS installer." - VERBATIM ) -add_dependencies(packaging pyinstaller) \ No newline at end of file +#add_dependencies(packaging pyinstaller) \ No newline at end of file diff --git a/conanfile.py b/conanfile.py index b44ba17b..5e0c8389 100644 --- a/conanfile.py +++ b/conanfile.py @@ -52,8 +52,10 @@ def generate(self): tc.variables["CURABINARYDATA_BRANCH_OR_TAG"] = "origin/CURA-8640_PyQt6" tc.variables["CURA_VERSION_MAJOR"] = "5" - tc.variables["CURA_VERSION_EXTRA"] = "a+1" - tc.variables["CURA_DEBUGMODE"] = "OFF" + tc.variables["CURA_VERSION_MINOR"] = "0" + tc.variables["CURA_VERSION_PATCH"] = "0" + tc.variables["CURA_VERSION_PRE_RELEASE_TAG"] = "a" + tc.variables["CURA_VERSION_BUILD"] = "2" tc.variables["CURA_CLOUD_API_VERSION"] = "1" tc.variables["CURA_CLOUD_API_ROOT"] = "https://api.ultimaker.com" diff --git a/packaging/NSIS/CharStrStrip.nsh b/packaging/NSIS/CharStrStrip.nsh deleted file mode 100644 index bb64ca2d..00000000 --- a/packaging/NSIS/CharStrStrip.nsh +++ /dev/null @@ -1,69 +0,0 @@ -Function CharStrip -Exch $R0 #char -Exch -Exch $R1 #in string -Push $R2 -Push $R3 -Push $R4 - StrCpy $R2 -1 - IntOp $R2 $R2 + 1 - StrCpy $R3 $R1 1 $R2 - StrCmp $R3 "" +8 - StrCmp $R3 $R0 0 -3 - StrCpy $R3 $R1 $R2 - IntOp $R2 $R2 + 1 - StrCpy $R4 $R1 "" $R2 - StrCpy $R1 $R3$R4 - IntOp $R2 $R2 - 2 - Goto -9 - StrCpy $R0 $R1 -Pop $R4 -Pop $R3 -Pop $R2 -Pop $R1 -Exch $R0 -FunctionEnd -!macro CharStrip Char InStr OutVar - Push '${InStr}' - Push '${Char}' - Call CharStrip - Pop '${OutVar}' -!macroend -!define CharStrip '!insertmacro CharStrip' - -Function StrStrip -Exch $R0 #string -Exch -Exch $R1 #in string -Push $R2 -Push $R3 -Push $R4 -Push $R5 - StrLen $R5 $R0 - StrCpy $R2 -1 - IntOp $R2 $R2 + 1 - StrCpy $R3 $R1 $R5 $R2 - StrCmp $R3 "" +9 - StrCmp $R3 $R0 0 -3 - StrCpy $R3 $R1 $R2 - IntOp $R2 $R2 + $R5 - StrCpy $R4 $R1 "" $R2 - StrCpy $R1 $R3$R4 - IntOp $R2 $R2 - $R5 - IntOp $R2 $R2 - 1 - Goto -10 - StrCpy $R0 $R1 -Pop $R5 -Pop $R4 -Pop $R3 -Pop $R2 -Pop $R1 -Exch $R0 -FunctionEnd -!macro StrStrip Str InStr OutVar - Push '${InStr}' - Push '${Str}' - Call StrStrip - Pop '${OutVar}' -!macroend -!define StrStrip '!insertmacro StrStrip' \ No newline at end of file diff --git a/packaging/NSIS/FileAssociation.nsh b/packaging/NSIS/FileAssociation.nsh deleted file mode 100644 index bf7f69f1..00000000 --- a/packaging/NSIS/FileAssociation.nsh +++ /dev/null @@ -1,217 +0,0 @@ -/* -_____________________________________________________________________________ - - File Association -_____________________________________________________________________________ - - Based on code taken from http://nsis.sourceforge.net/File_Association - - Usage in script: - 1. !include "FileAssociation.nsh" - 2. [Section|Function] - ${FileAssociationFunction} "Param1" "Param2" "..." $var - [SectionEnd|FunctionEnd] - - FileAssociationFunction=[RegisterExtension|UnRegisterExtension] - -_____________________________________________________________________________ - - ${RegisterExtension} "[executable]" "[extension]" "[description]" - -"[executable]" ; executable which opens the file format - ; -"[extension]" ; extension, which represents the file format to open - ; -"[description]" ; description for the extension. This will be display in Windows Explorer. - ; - - - ${UnRegisterExtension} "[extension]" "[description]" - -"[extension]" ; extension, which represents the file format to open - ; -"[description]" ; description for the extension. This will be display in Windows Explorer. - ; - -_____________________________________________________________________________ - - Macros -_____________________________________________________________________________ - - Change log window verbosity (default: 3=no script) - - Example: - !include "FileAssociation.nsh" - !insertmacro RegisterExtension - ${FileAssociation_VERBOSE} 4 # all verbosity - !insertmacro UnRegisterExtension - ${FileAssociation_VERBOSE} 3 # no script -*/ - - -!ifndef FileAssociation_INCLUDED -!define FileAssociation_INCLUDED - -!include Util.nsh - -!verbose push -!verbose 3 -!ifndef _FileAssociation_VERBOSE - !define _FileAssociation_VERBOSE 3 -!endif -!verbose ${_FileAssociation_VERBOSE} -!define FileAssociation_VERBOSE `!insertmacro FileAssociation_VERBOSE` -!verbose pop - -!macro FileAssociation_VERBOSE _VERBOSE - !verbose push - !verbose 3 - !undef _FileAssociation_VERBOSE - !define _FileAssociation_VERBOSE ${_VERBOSE} - !verbose pop -!macroend - -!macro RegisterExtensionCall _EXECUTABLE _EXTENSION _APPNAME _DESCRIPTION - !verbose push - !verbose ${_FileAssociation_VERBOSE} - Push `${_DESCRIPTION}` - Push `${_APPNAME}` - Push `${_EXTENSION}` - Push `${_EXECUTABLE}` - ${CallArtificialFunction} RegisterExtension_ - !verbose pop -!macroend - -!macro UnRegisterExtensionCall _EXTENSION _APPNAME - !verbose push - !verbose ${_FileAssociation_VERBOSE} - Push `${_EXTENSION}` - Push `${_APPNAME}` - ${CallArtificialFunction} UnRegisterExtension_ - !verbose pop -!macroend - - - -!define RegisterExtension `!insertmacro RegisterExtensionCall` -!define un.RegisterExtension `!insertmacro RegisterExtensionCall` - -!macro RegisterExtension -!macroend - -!macro un.RegisterExtension -!macroend - -!macro RegisterExtension_ - !verbose push - !verbose ${_FileAssociation_VERBOSE} - - Exch $R3 ; Save value of $R3 and replace with ${_EXECUTABLE} - Exch - Exch $R2 ; Save value of $R2 and replace with ${_EXTENSION} - Exch - Exch 2 - Exch $R1 ; Save value of $R1 and replace with {_APPNAME} - Exch 2 - Exch 3 - Exch $R0 ; Save value of $R0 and replace with ${_DESCRIPTION} - Exch 3 - Push $0 ; Save value of $0 - Push $1 ; Save value of $1 - -;; Make a backup of the previous key -; Find the idea nice, but never saw an application doing that.. Let's skip it! -; -; ReadRegStr $1 HKCR "$R2" "" ; read current file association -; StrCmp "$1" "" NoBackup ; If it is not set.. -; StrCmp "$1" "$R1" NoBackup ; or the same value, as ours now, -; WriteRegStr HKCR "$R2" "backup_val" "$1" ; then backup the current value. -;NoBackup: - ; Setting default association - WriteRegStr HKCR "$R2" "" "$R1" - ; Also an instruction to set the default association for Explorer - ; The change takes effect after restarting explorer.exe - DeleteRegKey /ifempty HKCR "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\$R2" - - ReadRegStr $0 HKCR "$R1" "" - StrCmp $0 "" 0 Skip - WriteRegStr HKCR "$R1" "" "$R0" - WriteRegStr HKCR "$R1\shell" "" "open" - WriteRegStr HKCR "$R1\DefaultIcon" "" "$R3,0" -Skip: - WriteRegStr HKCR "$R1\shell\open\command" "" '"$R3" "%1"' - WriteRegStr HKCR "$R2\OpenWithProgids" "$R1" "" ; Setting a OpenWith entry - -; Uncomment if you want a "Edit with XY" entry -; WriteRegStr HKCR "$R1\shell\edit" "" "Edit $R0" -; WriteRegStr HKCR "$R1\shell\edit\command" "" '"$R3" "%1"' - -; Uncomment if you want a "Print with XY" entry.. Woohoom, even better.. -; WriteRegStr HKCR "$R1\shell\print" "" "Print $R0" -; WriteRegStr HKCR "$R1\shell\print\command" "" '"$R3" "%1"' - -; Uncomment if you want a "Slice with Ultimaker Cura".. Oh my god! -; WriteRegStr HKCR "$R1\shell\slice" "" "Slice with Ultimaker Cura" -; WriteRegStr HKCR "$R1\shell\slice\command" "" '"$R3" "%1"' - - Pop $1 ; Recover value of $1 - Pop $0 ; Recover value of $0 - Pop $R3 ; Recover value of $R3 - Pop $R2 ; Recover value of $R2 - Pop $R1 ; Recover value of $R1 - Pop $R0 ; Recover value of $R0 -!macroend - -!define UnRegisterExtension `!insertmacro UnRegisterExtensionCall` -!define un.UnRegisterExtension `!insertmacro UnRegisterExtensionCall` - -!macro UnRegisterExtension -!macroend - -!macro un.UnRegisterExtension -!macroend - -!macro UnRegisterExtension_ - !verbose push - !verbose ${_FileAssociation_VERBOSE} - - Exch $R1 ; Save value of $R1 and replace with ${_APPNAME} - Exch - Exch $R0 ; Save value of $R0 and replace with ${_EXTENSION} - Exch - Push $0 ; Save value of $0 - Push $1 ; Save value of $1 - - DeleteRegKey HKCR "$R0\OpenWithProgids\$R1" ; Delete "Open with.." entry - -;; Backing up previous value -; Just like I mentioned before. Unneeded stuff.. -; ReadRegStr $1 HKCR "$R0" "" -; StrCmp $1 "$R1" 0 NoOwn ; only do this if we own it -; ReadRegStr $1 HKCR $R0 "backup_val" -; StrCmp $1 "" 0 Restore ; if backup="" then delete the whole key - DeleteRegKey /ifempty HKCR "$R0\OpenWithProgids" - WriteRegStr HKCR "$R0" "" "" ; BETTER: Setting it to nothing, if it was ours. The user can choose what she/he wants to use afterwards - ; Emptying the key - In my opinion safer then removing it. - ; However, see above to see why this is turned off. - ;WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\$R2\UserChoice" "ProgId" "" - DeleteRegKey /ifempty HKCR "$R0" -; Goto NoOwn - -;Restore: -; WriteRegStr HKCR "$R0" "" $1 ; Set back'ed up value -; DeleteRegValue HKCR "$R0" "backup_val" ; Remove the backup -; DeleteRegKey HKCR "$R1" ; Delete key with association name settings -; Goto NoOwn - -;NoOwn: - - Pop $1 ; Recover value of $1 - Pop $0 ; Recover value of $0 - Pop $R1 ; Recover value of $R1 - Pop $R0 ; Recover value of $R0 - - !verbose pop -!macroend - -!endif # !FileAssociation_INCLUDED \ No newline at end of file diff --git a/packaging/NSIS/Ultimaker-Cura.nsi.jinja b/packaging/NSIS/Ultimaker-Cura.nsi.jinja new file mode 100644 index 00000000..8e7a63de --- /dev/null +++ b/packaging/NSIS/Ultimaker-Cura.nsi.jinja @@ -0,0 +1,181 @@ +# Copyright (c) 2022 Ultimaker B.V. +# Cura's build system is released under the terms of the AGPLv3 or higher. + +!define APP_NAME "{{ app_name }} {{ version_major }}.{{ version_minor }}.{{ version_patch }}" +!define COMP_NAME "{{ company }}" +!define WEB_SITE "{{ web_site }}" +!define VERSION "{{ version_major }}.{{ version_minor }}.{{ version_patch }}.{{ version_build }}" +!define COPYRIGHT "Copyright (c) {{ year }} {{ company }}" +!define DESCRIPTION "Application" +!define LICENSE_TXT "{{ cura_license_file }}" +!define INSTALLER_NAME "{{ destination }}" +!define MAIN_APP_EXE "{{ main_app }}" +!define INSTALL_TYPE "SetShellVarContext current" +!define REG_ROOT "HKCU" +!define REG_APP_PATH "Software\Microsoft\Windows\CurrentVersion\App Paths\${MAIN_APP_EXE}" +!define UNINSTALL_PATH "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" + +!define REG_START_MENU "Start Menu Folder" + +;Require administrator access +RequestExecutionLevel admin + +var SM_Folder + +###################################################################### + +VIProductVersion "${VERSION}" +VIAddVersionKey "ProductName" "${APP_NAME}" +VIAddVersionKey "CompanyName" "${COMP_NAME}" +VIAddVersionKey "LegalCopyright" "${COPYRIGHT}" +VIAddVersionKey "FileDescription" "${DESCRIPTION}" +VIAddVersionKey "FileVersion" "${VERSION}" + +###################################################################### + +SetCompressor {{ compression_method }} +Name "${APP_NAME}" +Caption "${APP_NAME}" +OutFile "${INSTALLER_NAME}" +BrandingText "${APP_NAME}" +InstallDirRegKey "${REG_ROOT}" "${REG_APP_PATH}" "" +InstallDir "$PROGRAMFILES64\${APP_NAME}" + +###################################################################### + +!include "MUI.nsh" +!include fileassoc.nsh + +!define MUI_ABORTWARNING +!define MUI_UNABORTWARNING + +!define MUI_WELCOMEFINISHPAGE_BITMAP "{{ cura_banner_img }}" +!define MUI_UNWELCOMEFINISHPAGE_BITMAP "{{ cura_banner_img }}" + +!insertmacro MUI_PAGE_WELCOME + +!ifdef LICENSE_TXT +!insertmacro MUI_PAGE_LICENSE "${LICENSE_TXT}" +!endif + +!insertmacro MUI_PAGE_DIRECTORY + +!ifdef REG_START_MENU +!define MUI_STARTMENUPAGE_NODISABLE +!define MUI_STARTMENUPAGE_DEFAULTFOLDER "{{ app_name }}" +!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${REG_ROOT}" +!define MUI_STARTMENUPAGE_REGISTRY_KEY "${UNINSTALL_PATH}" +!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${REG_START_MENU}" +!insertmacro MUI_PAGE_STARTMENU Application $SM_Folder +!endif + +!insertmacro MUI_PAGE_INSTFILES + +!define MUI_FINISHPAGE_RUN "$INSTDIR\${MAIN_APP_EXE}" +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_CONFIRM + +!insertmacro MUI_UNPAGE_INSTFILES + +!insertmacro MUI_UNPAGE_FINISH + +!insertmacro MUI_LANGUAGE "English" + +###################################################################### + +Section -MainProgram +${INSTALL_TYPE} +SetOverwrite ifnewer +{% for out_path, files in mapped_out_paths.items() %}SetOutPath "{{ out_path }}"{% for file in files %} +File "{{ file }}"{% endfor %} +{% endfor %}SectionEnd + +###################################################################### + +Section -Extension_Reg +!insertmacro APP_ASSOCIATE "stl" "Cura.model" "Standard Tessellation Language (STL) files" "$INSTDIR\${MAIN_APP_EXE},0" "Open with {{ app_name }}" "$INSTDIR\${MAIN_APP_EXE} $\"%1$\"" +!insertmacro APP_ASSOCIATE "3mf" "Cura.project" "3D Manufacturing Format (3MF) files" "$INSTDIR\${MAIN_APP_EXE},0" "Open with {{ app_name }}" "$INSTDIR\${MAIN_APP_EXE} $\"%1$\"" +SectionEnd + +Section -Icons_Reg +SetOutPath "$INSTDIR" +WriteUninstaller "$INSTDIR\uninstall.exe" + +!ifdef REG_START_MENU +!insertmacro MUI_STARTMENU_WRITE_BEGIN Application +CreateDirectory "$SMPROGRAMS\$SM_Folder" +CreateShortCut "$SMPROGRAMS\$SM_Folder\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}" +CreateShortCut "$SMPROGRAMS\$SM_Folder\Uninstall ${APP_NAME}.lnk" "$INSTDIR\uninstall.exe" + +!ifdef WEB_SITE +WriteIniStr "$INSTDIR\${APP_NAME} website.url" "InternetShortcut" "URL" "${WEB_SITE}" +CreateShortCut "$SMPROGRAMS\$SM_Folder\${APP_NAME} Website.lnk" "$INSTDIR\${APP_NAME} website.url" +!endif +!insertmacro MUI_STARTMENU_WRITE_END +!endif + +!ifndef REG_START_MENU +CreateDirectory "$SMPROGRAMS\{{ app_name }}" +CreateShortCut "$SMPROGRAMS\{{ app_name }}\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}" +CreateShortCut "$SMPROGRAMS\{{ app_name }}\Uninstall ${APP_NAME}.lnk" "$INSTDIR\uninstall.exe" + +!ifdef WEB_SITE +WriteIniStr "$INSTDIR\${APP_NAME} website.url" "InternetShortcut" "URL" "${WEB_SITE}" +CreateShortCut "$SMPROGRAMS\{{ app_name }}\${APP_NAME} Website.lnk" "$INSTDIR\${APP_NAME} website.url" +!endif +!endif + +WriteRegStr ${REG_ROOT} "${REG_APP_PATH}" "" "$INSTDIR\${MAIN_APP_EXE}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayName" "${APP_NAME}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "UninstallString" "$INSTDIR\uninstall.exe" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayIcon" "$INSTDIR\${MAIN_APP_EXE}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayVersion" "${VERSION}" +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "Publisher" "${COMP_NAME}" + +!ifdef WEB_SITE +WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "URLInfoAbout" "${WEB_SITE}" +!endif +SectionEnd + +###################################################################### + +Section Uninstall +${INSTALL_TYPE}{% for files in mapped_out_paths.values() %}{% for file in files %} +Delete "{{ file }}"{% endfor %}{% endfor %}{% for rem_dir in mapped_out_paths.keys() %} +RmDir "{{ rem_dir }}"{% endfor %} + +Delete "$INSTDIR\uninstall.exe" +!ifdef WEB_SITE +Delete "$INSTDIR\${APP_NAME} website.url" +!endif + +RmDir "$INSTDIR" + +!ifdef REG_START_MENU +!insertmacro MUI_STARTMENU_GETFOLDER "Application" $SM_Folder +Delete "$SMPROGRAMS\$SM_Folder\${APP_NAME}.lnk" +Delete "$SMPROGRAMS\$SM_Folder\Uninstall ${APP_NAME}.lnk" +!ifdef WEB_SITE +Delete "$SMPROGRAMS\$SM_Folder\${APP_NAME} Website.lnk" +!endif +RmDir "$SMPROGRAMS\$SM_Folder" +!endif + +!ifndef REG_START_MENU +Delete "$SMPROGRAMS\{{ app_name }}\${APP_NAME}.lnk" +Delete "$SMPROGRAMS\{{ app_name }}\Uninstall ${APP_NAME}.lnk" +!ifdef WEB_SITE +Delete "$SMPROGRAMS\{{ app_name }}\${APP_NAME} Website.lnk" +!endif +RmDir "$SMPROGRAMS\{{ app_name }}" +!endif + +!insertmacro APP_UNASSOCIATE "stl" "Cura.model" +!insertmacro APP_UNASSOCIATE "3mf" "Cura.project" + +DeleteRegKey ${REG_ROOT} "${REG_APP_PATH}" +DeleteRegKey ${REG_ROOT} "${UNINSTALL_PATH}" +SectionEnd + +###################################################################### diff --git a/packaging/NSIS/fileassoc.nsh b/packaging/NSIS/fileassoc.nsh new file mode 100644 index 00000000..cb0fb2fe --- /dev/null +++ b/packaging/NSIS/fileassoc.nsh @@ -0,0 +1,134 @@ +; fileassoc.nsh +; File association helper macros +; Written by Saivert +; +; Improved by Nikku. +; +; Features automatic backup system and UPDATEFILEASSOC macro for +; shell change notification. +; +; |> How to use <| +; To associate a file with an application so you can double-click it in explorer, use +; the APP_ASSOCIATE macro like this: +; +; Example: +; !insertmacro APP_ASSOCIATE "txt" "myapp.textfile" "Description of txt files" \ +; "$INSTDIR\myapp.exe,0" "Open with myapp" "$INSTDIR\myapp.exe $\"%1$\"" +; +; Never insert the APP_ASSOCIATE macro multiple times, it is only ment +; to associate an application with a single file and using the +; the "open" verb as default. To add more verbs (actions) to a file +; use the APP_ASSOCIATE_ADDVERB macro. +; +; Example: +; !insertmacro APP_ASSOCIATE_ADDVERB "myapp.textfile" "edit" "Edit with myapp" \ +; "$INSTDIR\myapp.exe /edit $\"%1$\"" +; +; To have access to more options when registering the file association use the +; APP_ASSOCIATE_EX macro. Here you can specify the verb and what verb is to be the +; standard action (default verb). +; +; Note, that this script takes into account user versus global installs. +; To properly work you must initialize the SHELL_CONTEXT variable via SetShellVarContext. +; +; And finally: To remove the association from the registry use the APP_UNASSOCIATE +; macro. Here is another example just to wrap it up: +; !insertmacro APP_UNASSOCIATE "txt" "myapp.textfile" +; +; |> Note <| +; When defining your file class string always use the short form of your application title +; then a period (dot) and the type of file. This keeps the file class sort of unique. +; Examples: +; Winamp.Playlist +; NSIS.Script +; Photoshop.JPEGFile +; +; |> Tech info <| +; The registry key layout for a global file association is: +; +; HKEY_LOCAL_MACHINE\Software\Classes +; <".ext"> = +; = <"description"> +; shell +; = <"menu-item text"> +; command = <"command string"> +; +; +; The registry key layout for a per-user file association is: +; +; HKEY_CURRENT_USER\Software\Classes +; <".ext"> = +; = <"description"> +; shell +; = <"menu-item text"> +; command = <"command string"> +; + +!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND + ; Backup the previously associated file class + ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" "" + WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0" + + WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}" + + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}` + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}` + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" "open" + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}` + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}` +!macroend + +!macro APP_ASSOCIATE_EX EXT FILECLASS DESCRIPTION ICON VERB DEFAULTVERB SHELLNEW COMMANDTEXT COMMAND + ; Backup the previously associated file class + ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" "" + WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0" + + WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}" + StrCmp "${SHELLNEW}" "0" +2 + WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}\ShellNew" "NullFile" "" + + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}` + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}` + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" `${DEFAULTVERB}` + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}` + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}` +!macroend + +!macro APP_ASSOCIATE_ADDVERB FILECLASS VERB COMMANDTEXT COMMAND + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}` + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}` +!macroend + +!macro APP_ASSOCIATE_REMOVEVERB FILECLASS VERB + DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}\shell\${VERB}` +!macroend + + +!macro APP_UNASSOCIATE EXT FILECLASS + ; Backup the previously associated file class + ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" `${FILECLASS}_backup` + WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "$R0" + + DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}` +!macroend + +!macro APP_ASSOCIATE_GETFILECLASS OUTPUT EXT + ReadRegStr ${OUTPUT} SHELL_CONTEXT "Software\Classes\.${EXT}" "" +!macroend + + +; !defines for use with SHChangeNotify +!ifdef SHCNE_ASSOCCHANGED +!undef SHCNE_ASSOCCHANGED +!endif +!define SHCNE_ASSOCCHANGED 0x08000000 +!ifdef SHCNF_FLUSH +!undef SHCNF_FLUSH +!endif +!define SHCNF_FLUSH 0x1000 + +!macro UPDATEFILEASSOC +; Using the system.dll plugin to call the SHChangeNotify Win32 API function so we +; can update the shell. + System::Call "shell32::SHChangeNotify(i,i,i,i) (${SHCNE_ASSOCCHANGED}, ${SHCNF_FLUSH}, 0, 0)" +!macroend \ No newline at end of file diff --git a/packaging/NSIS/nsis-configurator.py b/packaging/NSIS/nsis-configurator.py new file mode 100644 index 00000000..2a1ade47 --- /dev/null +++ b/packaging/NSIS/nsis-configurator.py @@ -0,0 +1,51 @@ +import shutil +import sys +from datetime import datetime + +from pathlib import Path + +from jinja2 import Template + +if __name__ == "__main__": + for i, v in enumerate(sys.argv): + print(f"{i} = {v}") + dist_loc = Path(sys.argv[1]) + instdir = Path("$INSTDIR") + dist_paths = [p.relative_to(dist_loc) for p in sorted(dist_loc.rglob("*")) if p.is_file()] + mapped_out_paths = {} + for dist_path in dist_paths: + if "__pycache__" not in dist_path.parts: + out_path = instdir.joinpath(dist_path.parent) + if out_path not in mapped_out_paths: + mapped_out_paths[out_path] = [dist_loc.joinpath(dist_path)] + else: + mapped_out_paths[out_path].append(dist_loc.joinpath(dist_path)) + + jinja_template_path = Path(sys.argv[2]) + with open(jinja_template_path, "r") as f: + template = Template(f.read()) + + nsis_content = template.render( + app_name = sys.argv[3], + main_app = sys.argv[4], + version_major = sys.argv[5], + version_minor = sys.argv[6], + version_patch = sys.argv[7], + version_build = sys.argv[8], + company = sys.argv[9], + web_site = sys.argv[10], + year = datetime.now().year, + cura_license_file = Path(sys.argv[11]), + compression_method = sys.argv[12], # ZLIB, BZIP2 or LZMA + cura_banner_img = Path(sys.argv[13]), + mapped_out_paths = mapped_out_paths, + destination = Path(sys.argv[15]) + ) + + with open(dist_loc.parent.joinpath(jinja_template_path.stem), "w") as f: + f.write(nsis_content) + + shutil.copy(Path(__file__).absolute().parent.joinpath("fileassoc.nsh"), dist_loc.parent.joinpath("fileassoc.nsh")) + icon_path = Path(sys.argv[14]) + shutil.copy(icon_path, dist_loc.joinpath(icon_path.name)) + From 94e0e83d58b6d6e052f1300f2b3ca8133f50e5e4 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Sun, 10 Apr 2022 20:18:56 +0200 Subject: [PATCH 194/213] Fix the permission of the AppRun Contributes to CURA-8640 --- cmake/create-appimage.cmake | 10 +++++----- packaging/{cura.sh => AppRun} | 0 packaging/cura.desktop.in | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) rename packaging/{cura.sh => AppRun} (100%) diff --git a/cmake/create-appimage.cmake b/cmake/create-appimage.cmake index 36ce2478..23a2410d 100644 --- a/cmake/create-appimage.cmake +++ b/cmake/create-appimage.cmake @@ -7,7 +7,7 @@ include(${CMAKE_SOURCE_DIR}/cmake/installer-filename.cmake) #Put correct version in cura.desktop. configure_file(${CMAKE_SOURCE_DIR}/packaging/cura.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop @ONLY) -file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/apprun-attr.cmake" "file(COPY ${CMAKE_SOURCE_DIR}/packaging/cura.sh DESTINATION ${ULTIMAKER_CURA_PATH}/ FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_WRITE GROUP_READ WORLD_READ OWNER_EXECUTE)") +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/apprun-attr.cmake" "file(COPY ${CMAKE_SOURCE_DIR}/packaging/AppRun DESTINATION ${ULTIMAKER_CURA_PATH} FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_WRITE GROUP_READ WORLD_READ OWNER_EXECUTE)") add_custom_target(packaging ALL COMMENT "Package into an AppImage file." @@ -15,7 +15,7 @@ add_custom_target(packaging ALL COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packaging/cura-icon_256x256.png ${ULTIMAKER_CURA_PATH}/cura-icon.png COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/cura.desktop ${ULTIMAKER_CURA_PATH}/cura.desktop COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packaging/cura.appdata.xml ${ULTIMAKER_CURA_PATH}/cura.appdata.xml - COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} - COMMAND appimagetool --appimage-extract-and-run ${ULTIMAKER_CURA_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_FILENAME} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) -#add_dependencies(packaging pyinstaller) + COMMAND ${CMAKE_COMMAND} -E remove ${installer_DIR}/dist/${INSTALLER_FILENAME} + COMMAND appimagetool --appimage-extract-and-run ${ULTIMAKER_CURA_PATH}/ ${installer_DIR}/dist/${INSTALLER_FILENAME} + WORKING_DIRECTORY ${ULTIMAKER_CURA_PATH}) +add_dependencies(packaging pyinstaller) diff --git a/packaging/cura.sh b/packaging/AppRun similarity index 100% rename from packaging/cura.sh rename to packaging/AppRun diff --git a/packaging/cura.desktop.in b/packaging/cura.desktop.in index c616a672..93ae4a60 100644 --- a/packaging/cura.desktop.in +++ b/packaging/cura.desktop.in @@ -1,10 +1,10 @@ [Desktop Entry] -Name=Cura -Name[de]=Cura +Name=Ultimaker Cura +Name[de]=Ultimaker Cura GenericName=3D Printing Software GenericName[de]=3D-Druck-Software Comment=Cura converts 3D models into paths for a 3D printer. It prepares your print for maximum accuracy, minimum printing time and good reliability with many extra features that make your print come out great. -Exec=cura.sh %F +Exec=Ultimaker-Cura %F Icon=cura-icon Terminal=false Type=Application From e430407fe826e8691e3f78297ffbd733312007e7 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Mon, 11 Apr 2022 11:58:13 +0200 Subject: [PATCH 195/213] Bump up build version Contributes to CURA-8640 --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index 5e0c8389..e16abb29 100644 --- a/conanfile.py +++ b/conanfile.py @@ -55,7 +55,7 @@ def generate(self): tc.variables["CURA_VERSION_MINOR"] = "0" tc.variables["CURA_VERSION_PATCH"] = "0" tc.variables["CURA_VERSION_PRE_RELEASE_TAG"] = "a" - tc.variables["CURA_VERSION_BUILD"] = "2" + tc.variables["CURA_VERSION_BUILD"] = "3" tc.variables["CURA_CLOUD_API_VERSION"] = "1" tc.variables["CURA_CLOUD_API_ROOT"] = "https://api.ultimaker.com" From 27c5987a5bc6851603d114e7cff6f4f0bfc42569 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Mon, 11 Apr 2022 16:10:22 +0200 Subject: [PATCH 196/213] use docker volume for conan data Contributes to CURA-8640 --- docker/linux/.env | 2 +- docker/linux/base/Dockerfile | 2 ++ docker/linux/docker-compose.yml | 25 ++++++++++++++----------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/docker/linux/.env b/docker/linux/.env index 5f076b34..9bbfa910 100644 --- a/docker/linux/.env +++ b/docker/linux/.env @@ -1,5 +1,5 @@ CONAN_VERSION=1.47.0 -DOCKER_TAG=0.1.2 +DOCKER_TAG=0.1.4 DOCKER_USERNAME=ultimaker # This versions are mandatory by 'conan-io/conan-center-index' diff --git a/docker/linux/base/Dockerfile b/docker/linux/base/Dockerfile index 24b31020..4d4ae68f 100644 --- a/docker/linux/base/Dockerfile +++ b/docker/linux/base/Dockerfile @@ -120,6 +120,8 @@ RUN apt-get -qq update \ && useradd -ms /bin/bash conan \ && printf "conan:conan" | chpasswd \ && adduser conan sudo \ + && groupadd ultimaker \ + && usermod -a -G ultimaker conan \ && printf "conan ALL= NOPASSWD: ALL\\n" >> /etc/sudoers \ && wget -q --no-check-certificate https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION_FULL}/cmake-${CMAKE_VERSION_FULL}.tar.gz \ && tar -xzf cmake-${CMAKE_VERSION_FULL}.tar.gz \ diff --git a/docker/linux/docker-compose.yml b/docker/linux/docker-compose.yml index 00824ffa..fe3ebde0 100644 --- a/docker/linux/docker-compose.yml +++ b/docker/linux/docker-compose.yml @@ -332,7 +332,7 @@ services: ports: - 2222:22 volumes: - - $HOME/.conan/data:/home/conan/.conan/data + - conan_data:/home/conan/.conan/data gcc6: build: context: gcc @@ -346,7 +346,7 @@ services: ports: - 2222:22 volumes: - - $HOME/.conan/data:/home/conan/.conan/data + - conan_data:/home/conan/.conan/data gcc7: build: context: gcc @@ -360,7 +360,7 @@ services: ports: - 2222:22 volumes: - - $HOME/.conan/data:/home/conan/.conan/data + - conan_data:/home/conan/.conan/data gcc8: build: context: gcc @@ -374,7 +374,7 @@ services: ports: - 2222:22 volumes: - - $HOME/.conan/data:/home/conan/.conan/data + - conan_data:/home/conan/.conan/data gcc9: build: context: gcc @@ -388,7 +388,7 @@ services: ports: - 2222:22 volumes: - - $HOME/.conan/data:/home/conan/.conan/data + - conan_data:/home/conan/.conan/data gcc10: build: context: gcc @@ -402,7 +402,7 @@ services: ports: - 2222:22 volumes: - - $HOME/.conan/data:/home/conan/.conan/data + - conan_data:/home/conan/.conan/data gcc11: build: context: gcc @@ -416,7 +416,7 @@ services: ports: - 2222:22 volumes: - - $HOME/.conan/data:/home/conan/.conan/data + - conan_data:/home/conan/.conan/data clang10: build: context: clang @@ -430,7 +430,7 @@ services: ports: - 2222:22 volumes: - - $HOME/.conan/data:/home/conan/.conan/data + - conan_data:/home/conan/.conan/data clang11: build: context: clang @@ -444,7 +444,7 @@ services: ports: - 2222:22 volumes: - - $HOME/.conan/data:/home/conan/.conan/data + - conan_data:/home/conan/.conan/data clang12: build: context: clang @@ -458,7 +458,7 @@ services: ports: - 2222:22 volumes: - - $HOME/.conan/data:/home/conan/.conan/data + - conan_data:/home/conan/.conan/data clang13: build: context: clang @@ -472,4 +472,7 @@ services: ports: - 2222:22 volumes: - - $HOME/.conan/data:/home/conan/.conan/data + - conan_data:/home/conan/.conan/data + +volumes: + conan_data: \ No newline at end of file From ae409c0e88945ef3dd3f3e121c517a7f57683660 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 12 Apr 2022 16:26:01 +0200 Subject: [PATCH 197/213] Jenkins no longer used and supported by us Contributes to CURA-8640 --- Jenkinsfile | 58 ----------------------------------------------------- 1 file changed, 58 deletions(-) delete mode 100644 Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index b75fa473..00000000 --- a/Jenkinsfile +++ /dev/null @@ -1,58 +0,0 @@ -// Only rebuild the environment when we actually want to rebuild it. -timeout(time: 5, unit: 'DAYS') -{ - input 'This will rebuild the Cura build environment. This is a long process that will block all Cura build slaves from building until it is done. Continue?' -} - -// This will trigger a build of cura-build-environment on each node with the -// label 'cura'. This is done because we need cura-build-environment working on -// all the slaves since it contains all the dependencies for the other projects. -def jobs = [:] -def nodes = node_names('cura') -for(int i = 0; i < nodes.size(); ++i) { - def name = nodes[i]; - - jobs[name] = { - node(name) { - stage('Prepare') { - step([$class: 'WsCleanup']) - - // Clean up the previous installation - try { - if(isUnix()) { - sh "rm -r /opt/ultimaker/cura-build-environment/${env.BRANCH_NAME}" - } else { - bat "rmdir /S /Q C:\\ultimaker\\cura-build-environment\\${env.BRANCH_NAME}" - } - } catch(e) { - // Ignore - } - - checkout scm - } - - stage('Build') { - if(isUnix()) { - dir('build') { - // Build and install the new environment - sh "cmake .. -DCMAKE_INSTALL_PREFIX=/opt/ultimaker/cura-build-environment/${env.BRANCH_NAME} -DCMAKE_PREFIX_PATH=/opt/ultimaker/cura-build-environment/${env.BRANCH_NAME} -DCMAKE_BUILD_TYPE=Release -DINCLUDE_DEVEL=ON" - sh "make" - } - } else { - bat """ - subst Q: . - Q: - mkdir build && cd build - call ../env_win64.bat - cmake .. -DCMAKE_INSTALL_PREFIX=C:/ultimaker/cura-build-environment/${env.BRANCH_NAME} -DCMAKE_PREFIX_PATH=/opt/ultimaker/cura-build-environment/${env.BRANCH_NAME} -DCMAKE_BUILD_TYPE=Release -G "NMake Makefiles" -DINCLUDE_DEVEL=ON - nmake - C: - subst /D Q: - """ - } - } - } - } -} - -parallel jobs From 20492a61d55d3a193ff32ab3834f80ad6f1530bb Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 12 Apr 2022 16:28:09 +0200 Subject: [PATCH 198/213] Remove olf environements scritps Contributes to CURA-8640 --- .dockerignore | 1 - Note.md | 23 ----------------------- env_win32.bat | 5 ----- env_win64.bat | 5 ----- 4 files changed, 34 deletions(-) delete mode 100644 .dockerignore delete mode 100644 Note.md delete mode 100644 env_win32.bat delete mode 100644 env_win64.bat diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index c1c9f4dc..00000000 --- a/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -.git* diff --git a/Note.md b/Note.md deleted file mode 100644 index cd24bbfa..00000000 --- a/Note.md +++ /dev/null @@ -1,23 +0,0 @@ -Build on Mac OS X for 10.9 -========================== - -**References:** - - https://www.felix-schwarz.org/blog/2016/03/how-to-use-the-os-x-109-sdk-with-xcode-73 - -If you install Xcode 7.3, it only ships with OS X 10.11 SDK, and this unfortunately causes problems when you want to -compile code targeting an earlier OS X version, such as 10.9. To fix this, I did what's described in the reference -page linked above. The steps are: - - Quit Xcode 7.3 - - Get Xcode 6.4 which contains SDKs for OS X 10.9 and 10.10. It's probably going to be an - [Xcode_6.4.dmg](https://developer.apple.com/devcenter/download.action?path=/Developer_Tools/Xcode_6.4/Xcode_6.4.dmg) - - Mount the DMG using `hdiutil` probably to /Volumes/Xcode - - The SDKs are located in `Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/` - - `MacOSX10.9.sdk` - - `MacOSX10.10.sdk` - - Copy the required SDKs to `/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/` - - Open file `/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Info.plist` - and remove the following lines: - ``` - MinimumSDKVersion - 10.11 - ``` diff --git a/env_win32.bat b/env_win32.bat deleted file mode 100644 index b0706126..00000000 --- a/env_win32.bat +++ /dev/null @@ -1,5 +0,0 @@ -call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86 - -REM cryptography by default links to OpenSSL 1.1.0 which has different library -REM file names, so we need this flag to be able to link to OpenSSL 1.0.2 -set CRYPTOGRAPHY_WINDOWS_LINK_LEGACY_OPENSSL=1 diff --git a/env_win64.bat b/env_win64.bat deleted file mode 100644 index b344b759..00000000 --- a/env_win64.bat +++ /dev/null @@ -1,5 +0,0 @@ -call "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvars64.bat" -set CFLAGS=-m64 -set CXXFLAGS=-m64 -set LDFLAGS=-m64 - From 23ef10e405580572ecc60df04842023d4f46b36c Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 12 Apr 2022 16:29:22 +0200 Subject: [PATCH 199/213] Don't use and support Docker Windows anymore Contributes to CURA-8640 --- docker/windows/Dockerfile | 54 --------------- docker/windows/Dockerfile-base.vs2019 | 69 -------------------- docker/windows/Dockerfile-build.vs2019 | 21 ------ docker/windows/build_vs2019.cmd | 21 ------ docker/windows/install_vs2019_buildtools.cmd | 17 ----- docker/windows/install_wixtoolset.ps1 | 10 --- docker/windows/setup_envvars.ps1 | 13 ---- 7 files changed, 205 deletions(-) delete mode 100644 docker/windows/Dockerfile delete mode 100644 docker/windows/Dockerfile-base.vs2019 delete mode 100644 docker/windows/Dockerfile-build.vs2019 delete mode 100644 docker/windows/build_vs2019.cmd delete mode 100644 docker/windows/install_vs2019_buildtools.cmd delete mode 100644 docker/windows/install_wixtoolset.ps1 delete mode 100644 docker/windows/setup_envvars.ps1 diff --git a/docker/windows/Dockerfile b/docker/windows/Dockerfile deleted file mode 100644 index 3085b1c5..00000000 --- a/docker/windows/Dockerfile +++ /dev/null @@ -1,54 +0,0 @@ -FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-ltsc2019 - -# Restore the default Windows shell for correct batch processing. -SHELL ["cmd", "/S", "/C"] - -LABEL windows_version="1809" \ - architecture="amd64" \ - vs_version="2019" \ - windows_sdk_version="10" \ - python_version="3.10.4" \ - qt_version="6.2.4" - -COPY install_vs2019_buildtools.cmd install_wixtools.ps1 C:\\Temp - -# Install chocolatey -RUN powershell.exe Set-ExecutionPolicy Bypass -Scope Process -Force; \ - [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; \ - iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) - -# Enable global confirmation -RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ - choco feature enable -n=allowGlobalConfirmation - -# Install other build tools -# - perl, svn, and nasm are needed by OpenSSL for Python -RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ - choco install -y 7zip; \ - choco install -y cmake --installargs 'ADD_CMAKE_TO_PATH=System'; \ - choco install -y git --params '/GitOnlyOnPath /NoAutoCrlf /SChannel'; \ - choco install -y nsis; \ - choco install -y strawberryperl; \ - choco install -y tortoisesvn; \ - choco install -y nasm; \ - choco install -y doxygen.install; \ - choco install -y poedit - -# Install Visual Studio buildtools -RUN C:\\Temp\\src\\docker\\windows\\install_vs2019_buildtools.cmd - -# Get WiX Toolset 3.11.2 -RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ - C:\\Temp\\src\\docker\\windows\\install_wixtoolset.ps1 - -# Set up environment variables. -RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ - C:\\Temp\\src\\docker\\windows\\setup_envvars.ps1 - -# Cleanup -RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ - Remove-Item -Recurse -Force C:\\Temp\\ - -# Define the entry point for the docker container. -# This entry point starts the developer command prompt and launches the PowerShell shell. -ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"] diff --git a/docker/windows/Dockerfile-base.vs2019 b/docker/windows/Dockerfile-base.vs2019 deleted file mode 100644 index 2504f96a..00000000 --- a/docker/windows/Dockerfile-base.vs2019 +++ /dev/null @@ -1,69 +0,0 @@ -# Use the latest Windows Server Core image with .NET Framework 4.8. -FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-ltsc2019 - -# Restore the default Windows shell for correct batch processing. -SHELL ["cmd", "/S", "/C"] - -LABEL windows_version="1809" \ - architecture="amd64" \ - vs_version="2019" \ - windows_sdk_version="10" \ - python_version="3.8.10" \ - qt_version="5.15.2" - -ARG CURA_BUILD_ENV_BUILD_TYPE=Release -ARG CURA_BUILD_ENV_PATH=C:\\cura-build-environment -ARG CURA_BUILD_ENV_WORK_DIR=C:\\temp\\cura-build-environment -ARG CURA_ARCUS_BRANCH_OR_TAG=master -ARG CURA_SAVITAR_BRANCH_OR_TAG=master - -# Install chocolatey -RUN powershell.exe Set-ExecutionPolicy Bypass -Scope Process -Force; \ - [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; \ - iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) - -# Enable global confirmation -RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ - choco feature enable -n=allowGlobalConfirmation - -# Install other build tools -# - perl, svn, and nasm are needed by OpenSSL for Python -RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ - choco install -y 7zip; \ - choco install -y cmake --installargs 'ADD_CMAKE_TO_PATH=System'; \ - choco install -y git --params '/GitOnlyOnPath /NoAutoCrlf /SChannel'; \ - choco install -y nsis; \ - choco install -y strawberryperl; \ - choco install -y tortoisesvn; \ - choco install -y nasm; \ - choco install -y doxygen.install; \ - choco install -y poedit - -# Download mingw -RUN curl -SL --output mingw-8.4.0.zip https://software.ultimaker.com/cura-binary-dependencies/mingw-w64-x86_64-8.4.0-7.0.0-r1.zip - -# Extract and install mingw -RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ - 7z x mingw-8.4.0.zip -oC:\; \ - Remove-Item -Force .\mingw-8.4.0.zip - -ADD . "${CURA_BUILD_ENV_WORK_DIR}"/src - -# Install Visual Studio buildtools -RUN "%CURA_BUILD_ENV_WORK_DIR%"\\src\\docker\\windows\\install_vs2019_buildtools.cmd - -# Get WiX Toolset 3.11.2 -RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ - "%CURA_BUILD_ENV_WORK_DIR%"\\src\\docker\\windows\\install_wixtoolset.ps1 - -# Set up environment variables. -RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ - "%CURA_BUILD_ENV_WORK_DIR%"\\src\\docker\\windows\\setup_envvars.ps1 - -# Cleanup -RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ - Remove-Item -Recurse -Force "%CURA_BUILD_ENV_WORK_DIR%" - -# Define the entry point for the docker container. -# This entry point starts the developer command prompt and launches the PowerShell shell. -ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"] diff --git a/docker/windows/Dockerfile-build.vs2019 b/docker/windows/Dockerfile-build.vs2019 deleted file mode 100644 index 3dbacb51..00000000 --- a/docker/windows/Dockerfile-build.vs2019 +++ /dev/null @@ -1,21 +0,0 @@ -FROM ultimaker/cura-build-environment:win1809-base - -ARG CURA_BUILD_ENV_BUILD_TYPE=Release -ARG CURA_BUILD_ENV_PATH=C:\\cura-build-environment -ARG CURA_BUILD_ENV_WORK_DIR=C:\\temp\\cura-build-environment -ARG CURA_ARCUS_BRANCH_OR_TAG=master -ARG CURA_SAVITAR_BRANCH_OR_TAG=master - -# Add the current sources to the container -ADD . "${CURA_BUILD_ENV_WORK_DIR}"/src - -# Build the build environment. -RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ - cmd /c "%CURA_BUILD_ENV_WORK_DIR%"\\src\\docker\\windows\\build_vs2019.cmd - -# Cleanup -# Note: Using powershell's or cmd's native remove commands fails to remove -# a file that resides within the BoostHeaders sources, due to a long path name. -# Using rm.exe seems to work fine and remove everything from the temp directory. -RUN powershell.exe -NoLogo -ExecutionPolicy Bypass -Command \ - "& 'C:\Program Files\Git\usr\bin\rm.exe' -r -f "%CURA_BUILD_ENV_WORK_DIR%"" diff --git a/docker/windows/build_vs2019.cmd b/docker/windows/build_vs2019.cmd deleted file mode 100644 index 7cd7ffa1..00000000 --- a/docker/windows/build_vs2019.cmd +++ /dev/null @@ -1,21 +0,0 @@ -REM This script builds the cura-build-environment with a Windows Server Core 2019 (1809) docker image. - -@echo OFF - -call "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" amd64 - -set PATH=%CURA_BUILD_ENV_PATH%\bin;%PATH% - -cd %CURA_BUILD_ENV_WORK_DIR% -mkdir build -cd build - -cmake -DCMAKE_BUILD_TYPE=Release ^ - -DCMAKE_PREFIX_PATH="%CURA_BUILD_ENV_PATH%" ^ - -DCMAKE_INSTALL_PREFIX="%CURA_BUILD_ENV_PATH%" ^ - -DBUILD_OS_WIN64=ON ^ - -DCURA_ARCUS_BRANCH_OR_TAG="%ARCUS_BRANCH_OR_TAG%" ^ - -DCURA_SAVITAR_BRANCH_OR_TAG="%SAVITAR_BRANCH_OR_TAG%" ^ - -G "NMake Makefiles" ^ - ..\src -nmake diff --git a/docker/windows/install_vs2019_buildtools.cmd b/docker/windows/install_vs2019_buildtools.cmd deleted file mode 100644 index 9f22efa3..00000000 --- a/docker/windows/install_vs2019_buildtools.cmd +++ /dev/null @@ -1,17 +0,0 @@ -REM This script install the Visual Studio 2019 build tools on a Windows Server Core 2019 (1809) docker image - -REM Download the Build Tools bootstrapper and install them with the -REM Microsoft.VisualStudio.Workload.AzureBuildTools workload, excluding workloads and components with known issues. -curl -SL --output vs_buildtools.exe https://aka.ms/vs/16/release/vs_buildtools.exe -vs_buildtools.exe --quiet --wait --norestart --nocache modify ^ - --installPath "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\BuildTools" ^ - --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 ^ - --add Microsoft.VisualStudio.Component.VC.CMake.Project ^ - --add Microsoft.VisualStudio.Component.Windows10SDK.19041 ^ - --remove Microsoft.VisualStudio.Component.Windows10SDK.10240 ^ - --remove Microsoft.VisualStudio.Component.Windows10SDK.10586 ^ - --remove Microsoft.VisualStudio.Component.Windows10SDK.14393 ^ - --remove Microsoft.VisualStudio.Component.Windows81SDK ^ - || IF "%ERRORLEVEL%"=="3010" EXIT 0 -REM Cleanup -del /q vs_buildtools.exe diff --git a/docker/windows/install_wixtoolset.ps1 b/docker/windows/install_wixtoolset.ps1 deleted file mode 100644 index df83b6a4..00000000 --- a/docker/windows/install_wixtoolset.ps1 +++ /dev/null @@ -1,10 +0,0 @@ -$tmpDir = "C:\temp-cura" -New-Item -Path $tmpDir -ItemType Directory -Force -Invoke-WebRequest -UseBasicParsing ` - -Uri https://github.com/wixtoolset/wix3/releases/download/wix3112rtm/wix311-binaries.zip ` - -OutFile $tmpDir\wix.zip -( Get-FileHash -Algorithm SHA256 $tmpDir\wix.zip ).Hash -eq '2c1888d5d1dba377fc7fa14444cf556963747ff9a0a289a3599cf09da03b9e2e' -7z x $tmpDir\wix.zip -y -aoa -o"$tmpDir\wix" -ls $tmpDir -Move-Item $tmpDir\wix "C:\Program Files (x86)\wixtoolset" -Remove-Item -Recurse -Force -Path $tmpDir diff --git a/docker/windows/setup_envvars.ps1 b/docker/windows/setup_envvars.ps1 deleted file mode 100644 index ee7aa86e..00000000 --- a/docker/windows/setup_envvars.ps1 +++ /dev/null @@ -1,13 +0,0 @@ -# Set up environment variables for the cura-build-environment docker image. - -# chocolatey doesn't seem to add NSIS to PATH, so we add it here. -$newPath = "$env:Path" -$newPath = "$newPath" + ";C:\Program Files (x86)\wixtoolset" -$newPath = "$newPath" + ";C:\Program Files (x86)\NSIS" -$newPath = "$newPath" + ";C:\Program Files (x86)\Poedit\GettextTools\bin" -$newPath = "$newPath" + ";C:\mingw-w64-x86_64-8.4.0-7.0.0-r1\mingw64\bin" -[Environment]::SetEnvironmentVariable("Path", "$newPath", [System.EnvironmentVariableTarget]::Machine) - -# Set Cura build environment variables. -[Environment]::SetEnvironmentVariable("CURA_BUILD_ENV_BUILD_TYPE", "$env:CURA_BUILD_ENV_BUILD_TYPE", [System.EnvironmentVariableTarget]::Machine) -[Environment]::SetEnvironmentVariable("CURA_BUILD_ENV_PATH", "$env:CURA_BUILD_ENV_PATH", [System.EnvironmentVariableTarget]::Machine) From e93117d908ffbd73ee88d28b785bf43616e78161 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Wed, 13 Apr 2022 11:36:28 +0200 Subject: [PATCH 200/213] Allow for easy dev env setup Added a cmake target create-dev-env this will install a virtual environment in a directory of choice. with everything except Cura, Uranium, CuraEngine and cura-binary-data. This target can be used to setup a quick dev env for our most changed projects. Contributes to CURA-8640 --- CMakeLists.txt | 4 +++- cmake/dev.cmake | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 cmake/dev.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index ff31fa02..f42bac1c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,4 +100,6 @@ endif() if(WIN32) include(cmake/nsis.cmake) -endif() \ No newline at end of file +endif() + +include(cmake/dev.cmake) \ No newline at end of file diff --git a/cmake/dev.cmake b/cmake/dev.cmake new file mode 100644 index 00000000..b5ca8ecd --- /dev/null +++ b/cmake/dev.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2022 Ultimaker B.V. +# Cura's build system is released under the terms of the AGPLv3 or higher. + +add_custom_target(create-dev-env COMMENT "Create development virtual environment") +add_dependencies(create-dev-env install-python-requirements Arcus Savitar pynest2d Charon fdm_materials) \ No newline at end of file From 6566efcb648c1d57a2b20f3feeb5d919a0819142 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 14 Apr 2022 07:59:26 +0200 Subject: [PATCH 201/213] bump up build version to 4 Contributes to CURA-8640 --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index e16abb29..1a3d5c43 100644 --- a/conanfile.py +++ b/conanfile.py @@ -55,7 +55,7 @@ def generate(self): tc.variables["CURA_VERSION_MINOR"] = "0" tc.variables["CURA_VERSION_PATCH"] = "0" tc.variables["CURA_VERSION_PRE_RELEASE_TAG"] = "a" - tc.variables["CURA_VERSION_BUILD"] = "3" + tc.variables["CURA_VERSION_BUILD"] = "4" tc.variables["CURA_CLOUD_API_VERSION"] = "1" tc.variables["CURA_CLOUD_API_ROOT"] = "https://api.ultimaker.com" From 8ba86e4b18cbaec8b69eb2867b0daa7fb15da193 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 14 Apr 2022 08:41:12 +0200 Subject: [PATCH 202/213] bump up build version to 5 Contributes to CURA-8640 --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index 1a3d5c43..17b4939f 100644 --- a/conanfile.py +++ b/conanfile.py @@ -55,7 +55,7 @@ def generate(self): tc.variables["CURA_VERSION_MINOR"] = "0" tc.variables["CURA_VERSION_PATCH"] = "0" tc.variables["CURA_VERSION_PRE_RELEASE_TAG"] = "a" - tc.variables["CURA_VERSION_BUILD"] = "4" + tc.variables["CURA_VERSION_BUILD"] = "5" tc.variables["CURA_CLOUD_API_VERSION"] = "1" tc.variables["CURA_CLOUD_API_ROOT"] = "https://api.ultimaker.com" From 55cc1101ba32610f8067c81ee0745187b57f91eb Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 14 Apr 2022 09:39:51 +0200 Subject: [PATCH 203/213] bump up build version to 6 Contributes to CURA-8640 --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index 17b4939f..8b633e74 100644 --- a/conanfile.py +++ b/conanfile.py @@ -55,7 +55,7 @@ def generate(self): tc.variables["CURA_VERSION_MINOR"] = "0" tc.variables["CURA_VERSION_PATCH"] = "0" tc.variables["CURA_VERSION_PRE_RELEASE_TAG"] = "a" - tc.variables["CURA_VERSION_BUILD"] = "5" + tc.variables["CURA_VERSION_BUILD"] = "6" tc.variables["CURA_CLOUD_API_VERSION"] = "1" tc.variables["CURA_CLOUD_API_ROOT"] = "https://api.ultimaker.com" From 6420efc1a2dbd6f26773170c53d5f00af6307b73 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 14 Apr 2022 10:02:04 +0200 Subject: [PATCH 204/213] bump up build version to 7 Contributes to CURA-8640 --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index 8b633e74..9b2e46e8 100644 --- a/conanfile.py +++ b/conanfile.py @@ -55,7 +55,7 @@ def generate(self): tc.variables["CURA_VERSION_MINOR"] = "0" tc.variables["CURA_VERSION_PATCH"] = "0" tc.variables["CURA_VERSION_PRE_RELEASE_TAG"] = "a" - tc.variables["CURA_VERSION_BUILD"] = "6" + tc.variables["CURA_VERSION_BUILD"] = "7" tc.variables["CURA_CLOUD_API_VERSION"] = "1" tc.variables["CURA_CLOUD_API_ROOT"] = "https://api.ultimaker.com" From e1eadff39be00c563ef539c62430eb159d3116ed Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 14 Apr 2022 10:59:10 +0200 Subject: [PATCH 205/213] Update README.md Co-authored-by: Ghostkeeper --- README.md | 118 +++++++++++++++++++++++++++--------------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index f9cbb7cd..612f88ec 100644 --- a/README.md +++ b/README.md @@ -36,84 +36,84 @@ use. It will download and install the following projects: - libsavitar - libarcus - Python dependencies - - wheel - - cython - - pybind11 - - pytest - - more-itertools - - wcwidth - - pluggy - - attrs - - py - - atomicwrites - - colorama - - packaging - - pyparsing - - six - - pytest-benchmark - - py-cpuinfo - - pytest-cov - - coverage - - tomli - - mypy-extensions - - typing-extensions - - typed-ast - - mypy - - cffi - - pycparser - - cryptography - - sys_platform - - cryptography - - sys_platform - - cryptography - - sys_platform - - toml - - sip - - pyinstaller + - Automat + - PyQt6 + - PyQt6-NetworkAuth + - PyQt6-NetworkAuth-Qt6 + - PyQt6-Qt6 + - PyQt6-sip + - SecretStorage + - Twisted - altgraph - - pyinstaller-hooks-contrib - - pefile - - macholib - appdirs + - atomicwrites + - attrs - certifi + - cffi - chardet + - colorama + - constantly + - coverage + - cryptography + - cx-Logging + - cython - decorator + - future + - hyperlink - idna + - ifaddr + - importlib-metadata + - incremental + - jeepney + - keyring + - lxml + - macholib + - more-itertools + - mypy + - mypy-extensions - netifaces - networkx + - numpy - numpy-stl + - packaging + - pefile + - pluggy + - py + - py-cpuinfo + - pybind11 + - pyclipper - pycollada - - PyQt6-sip - - PyQt6 - - PyQt6-Qt6 + - pycparser + - pyinstaller + - pyinstaller-hooks-contrib + - pyparsing - pyserial + - pytest + - pytest-benchmark + - pytest-cov - python-dateutil - python-utils + - pywin32 + - pywin32-ctypes - requests + - scipy - sentry-sdk + - setuptools + - sip + - six + - sys_platform + - toml + - tomli - trimesh + - twisted-iocpsupport + - typed-ast + - typing-extensions - urllib3 - - importlib-metadata + - wcwidth + - wheel + - zeroconf - zipp - - jeepney - - SecretStorage - - keyring - - Twisted - - constantly - - hyperlink - - incremental - zope.interface - - Automat - - twisted-iocpsupport - - zeroconf - - ifaddr - - numpy - - scipy - - pyclipper - - lxml - - pywin32 - - pywin32-ctypes - - cx-Logging The list of dependencies above also have their own dependencies, such as: From c3584ad18d9da21ec1a685a199af3d34b74a486c Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 14 Apr 2022 10:58:25 +0200 Subject: [PATCH 206/213] Don't use processorcount Not needed anymore Contributes to CURA-8640 --- CMakeLists.txt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f42bac1c..08efc07e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,12 +19,6 @@ include(cmake/os.cmake) include(ExternalProject) include(GNUInstallDirs) -include(ProcessorCount) - -ProcessorCount(N_PROC) -if(N_PROC EQUAL 0) - set(N_PROC 1) -endif() # Create the version-related variables GetFromEnvironmentOrCache( From 7d444d9efef71ad33e799c15c8c9ec8a992d8b17 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 14 Apr 2022 11:01:25 +0200 Subject: [PATCH 207/213] Use space-indented Code style Contributes to CURA-8640 --- projects/curaengine.cmake | 44 +++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/projects/curaengine.cmake b/projects/curaengine.cmake index 513faddc..88a754eb 100644 --- a/projects/curaengine.cmake +++ b/projects/curaengine.cmake @@ -2,29 +2,29 @@ # cura-build is released under the terms of the AGPLv3 or higher. GetFromEnvironmentOrCache( - NAME - CURAENGINE_BRANCH_OR_TAG - DEFAULT - master - DESCRIPTION - "The name of the tag or branch to build for CuraEngine") + NAME + CURAENGINE_BRANCH_OR_TAG + DEFAULT + master + DESCRIPTION + "The name of the tag or branch to build for CuraEngine") GetFromEnvironmentOrCache( - NAME - CURA_ENGINE_VERSION - DEFAULT - ${CURA_VERSION} - DESCRIPTION - "The version of CuraEngine") + NAME + CURA_ENGINE_VERSION + DEFAULT + ${CURA_VERSION} + DESCRIPTION + "The version of CuraEngine") ExternalProject_Add(CuraEngine - GIT_REPOSITORY https://github.com/ultimaker/CuraEngine - GIT_TAG ${CURAENGINE_BRANCH_OR_TAG} - GIT_SHALLOW 1 - STEP_TARGETS update - CMAKE_GENERATOR ${CMAKE_GENERATOR} - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - -DCURA_ENGINE_VERSION=${CURA_ENGINE_VERSION}) + GIT_REPOSITORY https://github.com/ultimaker/CuraEngine + GIT_TAG ${CURAENGINE_BRANCH_OR_TAG} + GIT_SHALLOW 1 + STEP_TARGETS update + CMAKE_GENERATOR ${CMAKE_GENERATOR} + CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DCURA_ENGINE_VERSION=${CURA_ENGINE_VERSION}) add_dependencies(CuraEngine Arcus) \ No newline at end of file From a61d06ead04e25f304fce714783b26f24c914e63 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 14 Apr 2022 11:04:05 +0200 Subject: [PATCH 208/213] Make pyinstaller a packaging of packaging again Left over debugging Contributes to CURA-8640 --- cmake/nsis.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/nsis.cmake b/cmake/nsis.cmake index ac0a3a29..6f5fe787 100644 --- a/cmake/nsis.cmake +++ b/cmake/nsis.cmake @@ -35,4 +35,4 @@ add_custom_command( makensis /V2 /P4 ${installer_DIR}/dist/Ultimaker-Cura.nsi COMMENT "Package into a NSIS installer." ) -#add_dependencies(packaging pyinstaller) \ No newline at end of file +add_dependencies(packaging pyinstaller) \ No newline at end of file From fd2ccaa383bf4f63b1aabda1a123e9a28df3dbb7 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 14 Apr 2022 11:24:48 +0200 Subject: [PATCH 209/213] Update nsis-configurator documentation Contributes to CURA-8640 --- cmake/nsis.cmake | 2 +- packaging/NSIS/nsis-configurator.py | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/cmake/nsis.cmake b/cmake/nsis.cmake index 6f5fe787..afd8dc83 100644 --- a/cmake/nsis.cmake +++ b/cmake/nsis.cmake @@ -25,7 +25,7 @@ add_custom_command( ${CURA_VERSION_PATCH} ${CURA_VERSION_BUILD} "Ultimaker B.V." - "https://ultimaker.com/software/ultimaker-cura" + "https://ultimaker.com" ${CMAKE_SOURCE_DIR}/packaging/cura_license.txt LZMA ${CMAKE_SOURCE_DIR}/packaging/cura_banner_nsis.bmp diff --git a/packaging/NSIS/nsis-configurator.py b/packaging/NSIS/nsis-configurator.py index 2a1ade47..ecc6cc8a 100644 --- a/packaging/NSIS/nsis-configurator.py +++ b/packaging/NSIS/nsis-configurator.py @@ -7,6 +7,23 @@ from jinja2 import Template if __name__ == "__main__": + """ + - dist_loc: Location of distribution folder, as output by pyinstaller + - nsi_jinja_loc: Jinja2 template to use + - app_name: Should be "Ultimaker Cura". + - main_app: Name of executable, e.g. Ultimaker-Cura.exe? + - version_major: Major version number of Semver (e.g. 5). + - version_minor: Minor version number of Semver (e.g. 0). + - version_patch: Patch version number of Semver (e.g. 0). + - version_build: A version number that gets manually incremented at each build. + - company: Publisher of the application. Should be "Ultimaker B.V." + - web_site: Website to find more information. Should be "https://ultimaker.com". + - cura_license_file: Path to a license file in Cura. Should point to packaging/cura_license.txt in this repository. + - compression_method: Compression algorithm to use to compress the data inside the executable. Should be ZLIB, ZBIP2 or LZMA. + - cura_banner_img: Path to an image shown on the left in the installer. Should point to packaging/cura_banner_nsis.bmp in this repository. + - icon_path: Path to the icon to use on the installer + - destination: Where to put the installer after it's generated. +` """ for i, v in enumerate(sys.argv): print(f"{i} = {v}") dist_loc = Path(sys.argv[1]) From 25843887c3e7ea78a4d24a4cc80819ffa9659409 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 14 Apr 2022 11:29:44 +0200 Subject: [PATCH 210/213] Apply suggestions from code review Co-authored-by: Ghostkeeper --- projects/cura.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/cura.cmake b/projects/cura.cmake index 09e08422..ee50cacf 100644 --- a/projects/cura.cmake +++ b/projects/cura.cmake @@ -28,12 +28,12 @@ GetFromEnvironmentOrCache( NAME CURA_DIGITAL_FACTORY_URL DESCRIPTION - "The Digit factory url") + "The Ultimaker Digital Factory URL") GetFromEnvironmentOrCache( NAME CURA_MARKETPLACE_ROOT DESCRIPTION - "The marketplace root") + "The Cura Marketplace API root URL") GetFromEnvironmentOrCache( NAME URANIUM_SCRIPTS_DIR From 4e29550a6a179b3a9845f11c2eb54b2ef35f2231 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 14 Apr 2022 12:11:20 +0200 Subject: [PATCH 211/213] Update Version Build metadata description. See semver.org Contributes to CURA-8640 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 08efc07e..c5d3de29 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,7 +51,7 @@ GetFromEnvironmentOrCache( NAME CURA_VERSION_BUILD DESCRIPTION - "Cura Version build") + "Cura Version buildmetadata ignored when determining version precedence. Only used to identify a build.") set(CURA_VERSION_EXTRA ) if(NOT ${CURA_VERSION_PRE_RELEASE_TAG} STREQUAL "") set(CURA_VERSION_EXTRA "-${CURA_VERSION_PRE_RELEASE_TAG}+${CURA_VERSION_BUILD}") From f5860b9b22ee53eeba2d7a0d76f168e47003ba21 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Thu, 14 Apr 2022 12:14:24 +0200 Subject: [PATCH 212/213] Removed support for GCC 5 & 6 Since these don't give support for C++17 Contributes to CURA-8640 --- docker/linux/.env | 2 - docker/linux/docker-compose.yml | 81 --------------------------------- 2 files changed, 83 deletions(-) diff --git a/docker/linux/.env b/docker/linux/.env index 9bbfa910..b2ad9dfd 100644 --- a/docker/linux/.env +++ b/docker/linux/.env @@ -12,8 +12,6 @@ LIBSTDCPP_PATCH_VERSION=28 LIBSTDCPP_MAJOR_VERSION=10 # Exact compiler versions -GCC5_VERSION=5.5.0 -GCC6_VERSION=6.5.0 GCC7_VERSION=7.5.0 GCC8_VERSION=8.4.0 GCC9_VERSION=9.3.0 diff --git a/docker/linux/docker-compose.yml b/docker/linux/docker-compose.yml index fe3ebde0..79c0afd8 100644 --- a/docker/linux/docker-compose.yml +++ b/docker/linux/docker-compose.yml @@ -14,12 +14,6 @@ x-common-args: &common-args DISTRO: ${DISTRO} DISTRO_VERSION: ${DISTRO_VERSION} -x-gcc5: &gcc5 - GCC_VERSION: ${GCC5_VERSION} - -x-gcc6: &gcc6 - GCC_VERSION: ${GCC6_VERSION} - x-gcc7: &gcc7 GCC_VERSION: ${GCC7_VERSION} @@ -61,28 +55,6 @@ services: tty: true # Builder images - gcc5-builder: - build: - context: gcc - dockerfile: Dockerfile - target: gcc-builder - args: - <<: *common-args - <<: *gcc5 - image: ${DOCKER_USERNAME}/gcc5-builder-${DISTRO}:${DOCKER_TAG} - container_name: gcc5-builder - tty: true - gcc6-builder: - build: - context: gcc - dockerfile: Dockerfile - target: gcc-builder - args: - <<: *common-args - <<: *gcc6 - image: ${DOCKER_USERNAME}/gcc6-builder-${DISTRO}:${DOCKER_TAG} - container_name: gcc6-builder - tty: true gcc7-builder: build: context: gcc @@ -184,30 +156,6 @@ services: tty: true # Deploy images - gcc5-deploy: - build: - context: gcc - dockerfile: Dockerfile - target: deploy - cache_from: - - ${DOCKER_USERNAME}/gcc5-builder-${DISTRO}:${DOCKER_TAG} - args: - <<: *common-args - image: ${DOCKER_USERNAME}/gcc5-deploy-${DISTRO}:${DOCKER_TAG} - container_name: gcc5-deploy - tty: true - gcc6-deploy: - build: - context: gcc - dockerfile: Dockerfile - target: deploy - cache_from: - - ${DOCKER_USERNAME}/gcc6-builder-${DISTRO}:${DOCKER_TAG} - args: - <<: *common-args - image: ${DOCKER_USERNAME}/gcc6-deploy-${DISTRO}:${DOCKER_TAG} - container_name: gcc6-deploy - tty: true gcc7-deploy: build: context: gcc @@ -304,7 +252,6 @@ services: image: ${DOCKER_USERNAME}/clang12-deploy-${DISTRO}:${DOCKER_TAG} container_name: clang12-deploy tty: true - clang13-deploy: build: context: clang @@ -319,34 +266,6 @@ services: tty: true # Images - gcc5: - build: - context: gcc - dockerfile: Dockerfile - args: - <<: *common-args - <<: *gcc5 - image: ${DOCKER_USERNAME}/gcc5-${DISTRO}:${DOCKER_TAG} - container_name: gcc5 - tty: true - ports: - - 2222:22 - volumes: - - conan_data:/home/conan/.conan/data - gcc6: - build: - context: gcc - dockerfile: Dockerfile - args: - <<: *common-args - <<: *gcc6 - image: ${DOCKER_USERNAME}/gcc6-${DISTRO}:${DOCKER_TAG} - container_name: gcc6 - tty: true - ports: - - 2222:22 - volumes: - - conan_data:/home/conan/.conan/data gcc7: build: context: gcc From 6bc73adc8f2bd2c07c3c7cbd0f91ce6c6ef5f58f Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Thu, 14 Apr 2022 12:32:33 +0200 Subject: [PATCH 213/213] Update readme to reflect new usage Contributes to CURA-8640 --- README.md | 77 ++++++------------------------------------------------- 1 file changed, 8 insertions(+), 69 deletions(-) diff --git a/README.md b/README.md index 612f88ec..d77195c6 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ **WIP** This repository contains helper scripts for building Cura from source. It will create a base environment from which -you can (re)build Cura on a regular basis, in an time efficient matter. It consists of the following tools. +which are used to build an installer for the specific OS. ## System Requirements @@ -25,6 +25,8 @@ you can (re)build Cura on a regular basis, in an time efficient matter. It consi - Visual Studio >= 16 - NMake - Docker +- makensis (should be on the PATH) +- jinja2 (should be parth of Conan) ## CMake script @@ -141,81 +143,18 @@ pip install conan > conan config install https://github.com/ultimaker/conan-config.git > ``` - Once Conan is installed and configured, installing the cura-build-environment is easy. The steps below should do the trick. ```bash mkdir build && cd build -conan install .. --build=missing -cmake -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_PREFIX_PATH= -DCMAKE_INSTALL_PREFIX= -. activate_run.sh +cmake -DCMAKE_PREFIX_PATH= -DCMAKE_INSTALL_PREFIX= .. cmake --build . -cmake --install . ``` -_For more detailed explanation and options see the [Conan online documentation](https://docs.conan.io/en/latest/)._ - -The `` should now contain all used dependencies which can be used by the -[cura-build](https://github.com/Ultimaker/cura-build) repository. - -# Recommended usage with Docker image -This repository also contains dockerfiles which will build a cura-builder image for either Windows or Linux. These images -contain all build essentials to both build cura-build-environment and cura-build +The Installer for your OS can now be found in the `/installer/dist/` -## Linux - -Build the docker file -```bash -cd docker/linux -docker build -t cura-build-env: -f Dockerfile . -``` +> On Windows make sure you are working in the x64 Visual Studio 2019/2022 Command Prompt and specify the NMake generator using the +> `cmake -G "NMake Makefiles" -DCMAKE_PREFIX_PATH= -DCMAKE_INSTALL_PREFIX= ..` -This docker image can be used to create a cura-builder which helps us build the cura-build and cura-build-environment. - -First we need to create a build environment -```bash -DOCKER_BUILDKIT=1 docker build --build-arg JFROG_PASSWORD=JmZofe2*EjvoN=?9=4 -f Dockerfile -t cura-build-env -docker run -v /mnt/projects/ultimaker/cura/cura-build-environment:/home/ultimaker/source -v /mnt/projects/ultimaker/cura/cura-build-environment/cmake-build-release-docker/:/home/ultimaker/build -v /mnt/projects/ultimaker/cura/cura-build-environment/install/:/home/ultimaker/install -v /home/peer23peer/.conan/data:/home/ultimaker/.conan/data --name blerker cura-env-builder:latest -``` - -```bash -docker create -t cura-env-builder::/home/ultimaker/source \ --v :/home/ultimaker/build \ --v :/home/ultimaker/install \ --v ~/.conan/data:/home/ultimaker/.conan/data cura-build-env: -``` -> NOTE: -> By specifying the conan data folder we ensure that big dependencies, such as Python -> and Boost can be used in multiple environments and are reused when we are recreating -> the environment from scratch. - -We can then build the environment with: -```bash -cd -docker run cura-env-builder:cura-8640 \ --DLIBNEST2D_BRANCH_OR_TAG= \ --DCMAKE_...... -``` - -Once the environment is build and installed in the path `` we can then check out -the cura-build repository and build Cura using the cura-builder and the previously build cura-build-environment. - -```bash -docker create -t cura-builder::/home/ultimaker/source \ --v :/home/ultimaker/build \ --v :/home/ultimaker/install \ --v :/home/ultimaker/env \ --v ~/.conan/data:/home/ultimaker/.conan/data cura-build-env: -docker run cura-builder:cura-8640 \ --DURANIUM_BRANCH_OR_TAG= \ --DCMAKE_...... -``` \ No newline at end of file +> If you want to see all the options available use a tool such as `ccmake` or `cmake-gui` \ No newline at end of file