From 9122acbfbbcd5486c558ade9623bbf2fbfec5dbc Mon Sep 17 00:00:00 2001
From: prabhuomkar
Date: Sun, 5 May 2024 11:44:59 +0530
Subject: [PATCH 1/9] Upgraded pytorch to 2.3.0 latest version
---
CMakeLists.txt | 2 +-
Dockerfile | 2 +-
README.md | 6 +++---
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 31ca192..b4fbabf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,7 +7,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
option(DOWNLOAD_DATASETS "Automatically download required datasets at build-time." ON)
option(CREATE_SCRIPTMODULES "Automatically create all required scriptmodule files at build-time (requires python3)." OFF)
-set(PYTORCH_VERSION "2.1.1")
+set(PYTORCH_VERSION "2.3.0")
set(PYTORCH_MIN_VERSION "1.12.0")
find_package(Torch QUIET PATHS "${CMAKE_SOURCE_DIR}/libtorch")
diff --git a/Dockerfile b/Dockerfile
index ec21d02..f7dfdd9 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -31,7 +31,7 @@ RUN curl --silent --show-error --location --output ~/miniconda.sh https://repo.a
FROM conda AS conda-installs
# Install pytorch for CPU and torchvision.
-ARG PYTORCH_VERSION=2.1.1
+ARG PYTORCH_VERSION=2.3.0
ARG TORCHVISION_VERSION=0.16.1
ENV NO_CUDA=1
RUN conda install pytorch==${PYTORCH_VERSION} torchvision==${TORCHVISION_VERSION} cpuonly -y -c pytorch && conda clean -ya
diff --git a/README.md b/README.md
index a6254b6..f17b503 100644
--- a/README.md
+++ b/README.md
@@ -5,12 +5,12 @@
C++ Implementation of PyTorch Tutorials for Everyone
-
+
-| OS (Compiler)\\LibTorch | 2.1.1 |
+| OS (Compiler)\\LibTorch | 2.3.0 |
| :--------------------- | :--------------------------------------------------------------------------------------------------- |
| macOS (clang 11, 12, 13) | [](https://github.com/prabhuomkar/pytorch-cpp/actions?query=workflow%3Aci-build-macos) |
| Linux (gcc 9, 10, 11) | [](https://github.com/prabhuomkar/pytorch-cpp/actions?query=workflow%3Aci-build-ubuntu) |
@@ -52,7 +52,7 @@ This repository provides tutorial code in C++ for deep learning researchers to l
1. [C++-17](http://www.cplusplus.com/doc/tutorial/introduction/) compatible compiler
2. [CMake](https://cmake.org/download/) (minimum version 3.14)
-3. [LibTorch version >= 1.12.0 and <= 2.1.1](https://pytorch.org/cppdocs/installing.html)
+3. [LibTorch version >= 1.12.0 and <= 2.3.0](https://pytorch.org/cppdocs/installing.html)
4. [Conda](https://docs.conda.io/projects/conda/en/latest/user-guide/install/download.html)
From d1f1920ab9d64f5b0fe2de334fe15a1246d6a808 Mon Sep 17 00:00:00 2001
From: prabhuomkar
Date: Sun, 5 May 2024 12:09:44 +0530
Subject: [PATCH 2/9] updates to CI
---
.github/workflows/build_macos.yml | 10 +++++-----
.github/workflows/build_ubuntu.yml | 10 +++++-----
.github/workflows/build_windows.yml | 4 ++--
3 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/.github/workflows/build_macos.yml b/.github/workflows/build_macos.yml
index cb399b5..c990688 100644
--- a/.github/workflows/build_macos.yml
+++ b/.github/workflows/build_macos.yml
@@ -18,16 +18,16 @@ on:
jobs:
build-mac:
- name: "Macos 11.7 Xcode (Clang)"
- runs-on: macos-11
+ name: "Macos 13.6.6 Xcode (Clang)"
+ runs-on: macos-13
strategy:
matrix:
- xcode: [11.7, 12.4, 13.2.1]
+ xcode: [14.1, 15.2]
steps:
- name: Checkout
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Set up CMake
- uses: jwlawson/actions-setup-cmake@v1.13
+ uses: jwlawson/actions-setup-cmake@v2
with:
cmake-version: '3.14.0'
- name: Set up Xcode
diff --git a/.github/workflows/build_ubuntu.yml b/.github/workflows/build_ubuntu.yml
index 6343a6a..703d355 100644
--- a/.github/workflows/build_ubuntu.yml
+++ b/.github/workflows/build_ubuntu.yml
@@ -18,16 +18,16 @@ on:
jobs:
build-ubuntu:
- name: "Ubuntu 20.04 GCC"
- runs-on: ubuntu-20.04
+ name: "Ubuntu 22.04 GCC"
+ runs-on: ubuntu-22.04
strategy:
matrix:
- gcc: [9, 10, 11]
+ gcc: [11, 12, 13]
steps:
- name: Checkout
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Set up CMake
- uses: jwlawson/actions-setup-cmake@v1.13
+ uses: jwlawson/actions-setup-cmake@v2
with:
cmake-version: '3.14.0'
- name: Set up GCC
diff --git a/.github/workflows/build_windows.yml b/.github/workflows/build_windows.yml
index 54c90c8..896fb17 100644
--- a/.github/workflows/build_windows.yml
+++ b/.github/workflows/build_windows.yml
@@ -35,9 +35,9 @@ jobs:
}
steps:
- name: Checkout
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Set up CMake
- uses: jwlawson/actions-setup-cmake@v1.13
+ uses: jwlawson/actions-setup-cmake@v2
with:
cmake-version: ${{ matrix.config.cmake }}
- name: Cpplint
From fe71ae312c6c6e0cd6ee73a0b515510cb68b1305 Mon Sep 17 00:00:00 2001
From: prabhuomkar
Date: Sun, 5 May 2024 12:41:32 +0530
Subject: [PATCH 3/9] Update macOS download link
---
cmake/fetch_libtorch.cmake | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cmake/fetch_libtorch.cmake b/cmake/fetch_libtorch.cmake
index 92408f1..ad4aa04 100644
--- a/cmake/fetch_libtorch.cmake
+++ b/cmake/fetch_libtorch.cmake
@@ -33,7 +33,7 @@ elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
message(WARNING "MacOS binaries do not support CUDA, will download CPU version instead.")
set(LIBTORCH_DEVICE "cpu")
endif()
- set(LIBTORCH_URL "https://download.pytorch.org/libtorch/cpu/libtorch-macos-${PYTORCH_VERSION}.zip")
+ set(LIBTORCH_URL "https://download.pytorch.org/libtorch/cpu/libtorch-macos-arm64-${PYTORCH_VERSION}.zip")
else()
message(FATAL_ERROR "Unsupported CMake System Name '${CMAKE_SYSTEM_NAME}' (expected 'Windows', 'Linux' or 'Darwin')")
endif()
From ac34883909f16dc201d9d397c79e95f8cae1623e Mon Sep 17 00:00:00 2001
From: prabhuomkar
Date: Sun, 5 May 2024 12:49:47 +0530
Subject: [PATCH 4/9] Updated macOS runner
---
.github/workflows/build_macos.yml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/build_macos.yml b/.github/workflows/build_macos.yml
index c990688..a9fdd3f 100644
--- a/.github/workflows/build_macos.yml
+++ b/.github/workflows/build_macos.yml
@@ -18,11 +18,11 @@ on:
jobs:
build-mac:
- name: "Macos 13.6.6 Xcode (Clang)"
- runs-on: macos-13
+ name: "Macos 14.4.1 arm64 Xcode (Clang)"
+ runs-on: macos-14
strategy:
matrix:
- xcode: [14.1, 15.2]
+ xcode: [14.3.1, 15.3]
steps:
- name: Checkout
uses: actions/checkout@v4
From 717f066e14c7b7a883b0c4551a5449583294ef51 Mon Sep 17 00:00:00 2001
From: prabhuomkar
Date: Sun, 5 May 2024 12:56:11 +0530
Subject: [PATCH 5/9] Correct the configure step
---
.github/workflows/build_macos.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/build_macos.yml b/.github/workflows/build_macos.yml
index a9fdd3f..c9873d0 100644
--- a/.github/workflows/build_macos.yml
+++ b/.github/workflows/build_macos.yml
@@ -37,6 +37,6 @@ jobs:
- name: Cpplint
run: cmake -P cmake/cpplint.cmake
- name: Configure
- run: cmake -B build -D DOWNLOAD_DATASETS=OFF
+ run: cmake -B build -A arm64 -D DOWNLOAD_DATASETS=OFF
- name: Build tutorials
run: cmake --build build --parallel 4
From e92e8e1aedebc8e4d95699d7181eb655f9a93e6b Mon Sep 17 00:00:00 2001
From: prabhuomkar
Date: Sun, 5 May 2024 13:01:05 +0530
Subject: [PATCH 6/9] Updated minimum cmake requirement to be 3.19
---
.github/workflows/build_macos.yml | 2 +-
.github/workflows/build_ubuntu.yml | 2 +-
.github/workflows/build_windows.yml | 2 +-
CMakeLists.txt | 2 +-
README.md | 4 ++--
cmake/check_files.cmake | 2 +-
cmake/copy_torch_dlls.cmake | 2 +-
cmake/cpplint.cmake | 2 +-
cmake/create_torch_dll_hardlinks.cmake | 2 +-
cmake/fetch_cifar10.cmake | 2 +-
cmake/fetch_datasets.cmake | 2 +-
cmake/fetch_flickr8k.cmake | 2 +-
cmake/fetch_imagenette.cmake | 2 +-
cmake/fetch_libtorch.cmake | 2 +-
cmake/fetch_mnist.cmake | 2 +-
cmake/fetch_neural_style_transfer_images.cmake | 2 +-
cmake/fetch_penntreebank.cmake | 2 +-
cmake/find_gz_extractor.cmake | 2 +-
extern/CMakeLists.txt | 2 +-
notebooks/pytorch_cpp_colab_notebook.ipynb | 6 +++---
.../advanced/generative_adversarial_network/CMakeLists.txt | 2 +-
tutorials/advanced/image_captioning/CMakeLists.txt | 2 +-
tutorials/advanced/neural_style_transfer/CMakeLists.txt | 2 +-
tutorials/advanced/variational_autoencoder/CMakeLists.txt | 2 +-
tutorials/basics/feedforward_neural_network/CMakeLists.txt | 2 +-
tutorials/basics/linear_regression/CMakeLists.txt | 2 +-
tutorials/basics/logistic_regression/CMakeLists.txt | 2 +-
tutorials/basics/pytorch_basics/CMakeLists.txt | 2 +-
.../bidirectional_recurrent_neural_network/CMakeLists.txt | 2 +-
.../convolutional_neural_network/CMakeLists.txt | 2 +-
tutorials/intermediate/deep_residual_network/CMakeLists.txt | 2 +-
tutorials/intermediate/language_model/CMakeLists.txt | 2 +-
.../intermediate/recurrent_neural_network/CMakeLists.txt | 2 +-
tutorials/popular/blitz/autograd/CMakeLists.txt | 2 +-
tutorials/popular/blitz/neural_networks/CMakeLists.txt | 2 +-
tutorials/popular/blitz/tensors/CMakeLists.txt | 2 +-
.../popular/blitz/training_a_classifier/CMakeLists.txt | 2 +-
utils/image_io/CMakeLists.txt | 2 +-
38 files changed, 41 insertions(+), 41 deletions(-)
diff --git a/.github/workflows/build_macos.yml b/.github/workflows/build_macos.yml
index c9873d0..ec6d6f4 100644
--- a/.github/workflows/build_macos.yml
+++ b/.github/workflows/build_macos.yml
@@ -29,7 +29,7 @@ jobs:
- name: Set up CMake
uses: jwlawson/actions-setup-cmake@v2
with:
- cmake-version: '3.14.0'
+ cmake-version: '3.19.0'
- name: Set up Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
diff --git a/.github/workflows/build_ubuntu.yml b/.github/workflows/build_ubuntu.yml
index 703d355..d3272b3 100644
--- a/.github/workflows/build_ubuntu.yml
+++ b/.github/workflows/build_ubuntu.yml
@@ -29,7 +29,7 @@ jobs:
- name: Set up CMake
uses: jwlawson/actions-setup-cmake@v2
with:
- cmake-version: '3.14.0'
+ cmake-version: '3.19.0'
- name: Set up GCC
uses: egor-tensin/setup-gcc@v1
with:
diff --git a/.github/workflows/build_windows.yml b/.github/workflows/build_windows.yml
index 896fb17..5398cb8 100644
--- a/.github/workflows/build_windows.yml
+++ b/.github/workflows/build_windows.yml
@@ -26,7 +26,7 @@ jobs:
- {
name: Windows MSVC 2019,
os: windows-2019,
- cmake: '3.14.0'
+ cmake: '3.19.0'
}
- {
name: Windows MSVC 2022,
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b4fbabf..53c2489 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(pytorch-cpp VERSION 1.0.0 LANGUAGES CXX)
diff --git a/README.md b/README.md
index f17b503..15a9499 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
-
+
@@ -51,7 +51,7 @@ This repository provides tutorial code in C++ for deep learning researchers to l
## Requirements
1. [C++-17](http://www.cplusplus.com/doc/tutorial/introduction/) compatible compiler
-2. [CMake](https://cmake.org/download/) (minimum version 3.14)
+2. [CMake](https://cmake.org/download/) (minimum version 3.19)
3. [LibTorch version >= 1.12.0 and <= 2.3.0](https://pytorch.org/cppdocs/installing.html)
4. [Conda](https://docs.conda.io/projects/conda/en/latest/user-guide/install/download.html)
diff --git a/cmake/check_files.cmake b/cmake/check_files.cmake
index ea0f032..efbe20f 100644
--- a/cmake/check_files.cmake
+++ b/cmake/check_files.cmake
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
function(check_files BASE_DIR FILES_TO_CHECK FILE_MD5S MISSING_FILES)
foreach(FILE_TO_CHECK ${${FILES_TO_CHECK}})
diff --git a/cmake/copy_torch_dlls.cmake b/cmake/copy_torch_dlls.cmake
index 308f8c1..122a152 100644
--- a/cmake/copy_torch_dlls.cmake
+++ b/cmake/copy_torch_dlls.cmake
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
function(copy_torch_dlls TARGET_NAME)
# According to https://github.com/pytorch/pytorch/issues/25457
diff --git a/cmake/cpplint.cmake b/cmake/cpplint.cmake
index 4551708..f57ea6d 100644
--- a/cmake/cpplint.cmake
+++ b/cmake/cpplint.cmake
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
find_program(CPPLINT cpplint)
diff --git a/cmake/create_torch_dll_hardlinks.cmake b/cmake/create_torch_dll_hardlinks.cmake
index e02a416..62e0076 100644
--- a/cmake/create_torch_dll_hardlinks.cmake
+++ b/cmake/create_torch_dll_hardlinks.cmake
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
file(GLOB TORCH_DLLS "${TORCH_INSTALL_PREFIX}/lib/*.dll")
diff --git a/cmake/fetch_cifar10.cmake b/cmake/fetch_cifar10.cmake
index 212f49e..2987439 100644
--- a/cmake/fetch_cifar10.cmake
+++ b/cmake/fetch_cifar10.cmake
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
function(fetch_cifar10 DATA_DIR)
set(CIFAR_DIR "${DATA_DIR}/cifar10")
diff --git a/cmake/fetch_datasets.cmake b/cmake/fetch_datasets.cmake
index 47c40a8..930c151 100644
--- a/cmake/fetch_datasets.cmake
+++ b/cmake/fetch_datasets.cmake
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
include(${CMAKE_CURRENT_LIST_DIR}/fetch_mnist.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/fetch_cifar10.cmake)
diff --git a/cmake/fetch_flickr8k.cmake b/cmake/fetch_flickr8k.cmake
index f787803..93c2533 100644
--- a/cmake/fetch_flickr8k.cmake
+++ b/cmake/fetch_flickr8k.cmake
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
function(fetch_flickr8k DATA_DIR)
set(FLICKR8K_DIR "${DATA_DIR}/flickr_8k")
diff --git a/cmake/fetch_imagenette.cmake b/cmake/fetch_imagenette.cmake
index 5f1a1c2..f8c5de4 100644
--- a/cmake/fetch_imagenette.cmake
+++ b/cmake/fetch_imagenette.cmake
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
function(fetch_imagenette DATA_DIR)
set(IMAGENETTE_DIR "${DATA_DIR}/imagenette2-160")
diff --git a/cmake/fetch_libtorch.cmake b/cmake/fetch_libtorch.cmake
index ad4aa04..9264d9c 100644
--- a/cmake/fetch_libtorch.cmake
+++ b/cmake/fetch_libtorch.cmake
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
include(FetchContent)
diff --git a/cmake/fetch_mnist.cmake b/cmake/fetch_mnist.cmake
index 4330f8d..a0bce53 100644
--- a/cmake/fetch_mnist.cmake
+++ b/cmake/fetch_mnist.cmake
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
function(fetch_mnist DATA_DIR)
set(MNIST_DOWNLOAD_DIR "${DATA_DIR}/mnist/download")
diff --git a/cmake/fetch_neural_style_transfer_images.cmake b/cmake/fetch_neural_style_transfer_images.cmake
index 1709108..d1e224c 100644
--- a/cmake/fetch_neural_style_transfer_images.cmake
+++ b/cmake/fetch_neural_style_transfer_images.cmake
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
function(fetch_neural_style_transfer_imagers DATA_DIR)
set(NEURAL_STYLE_TRANSFER_IMAGES_DIR
diff --git a/cmake/fetch_penntreebank.cmake b/cmake/fetch_penntreebank.cmake
index fedb47e..3bdab68 100644
--- a/cmake/fetch_penntreebank.cmake
+++ b/cmake/fetch_penntreebank.cmake
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
function(fetch_penntreebank DATA_DIR)
set(PENNTREEBANK_DIR "${DATA_DIR}/penntreebank")
diff --git a/cmake/find_gz_extractor.cmake b/cmake/find_gz_extractor.cmake
index e17100d..58ac2ac 100644
--- a/cmake/find_gz_extractor.cmake
+++ b/cmake/find_gz_extractor.cmake
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
# Find program that can extract .gz files.
# Based on: https://github.com/Amber-MD/cmake-buildscripts/blob/master/gzip.cmake
diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt
index 02597c1..49789ae 100644
--- a/extern/CMakeLists.txt
+++ b/extern/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(extern VERSION 1.0.0 LANGUAGES CXX)
diff --git a/notebooks/pytorch_cpp_colab_notebook.ipynb b/notebooks/pytorch_cpp_colab_notebook.ipynb
index ac4c27a..64f7807 100644
--- a/notebooks/pytorch_cpp_colab_notebook.ipynb
+++ b/notebooks/pytorch_cpp_colab_notebook.ipynb
@@ -162,9 +162,9 @@
"!rm -rf deps\n",
"!mkdir deps\n",
"%cd /content/deps\n",
- "!wget --no-check-certificate https://www.cmake.org/files/v3.14/cmake-3.14.0-Linux-x86_64.tar.gz\n",
- "!tar -xvf cmake-3.14.0-Linux-x86_64.tar.gz > /dev/null\n",
- "%mv cmake-3.14.0-Linux-x86_64 cmake-install\n",
+ "!wget --no-check-certificate https://www.cmake.org/files/v3.19/cmake-3.19.0-Linux-x86_64.tar.gz\n",
+ "!tar -xvf cmake-3.19.0-Linux-x86_64.tar.gz > /dev/null\n",
+ "%mv cmake-3.19.0-Linux-x86_64 cmake-install\n",
"old_path = %env PATH\n",
"new_path = \"/content/deps/cmake-install:/content/deps/cmake-install/bin:\" + old_path\n",
"%env PATH={new_path}\n",
diff --git a/tutorials/advanced/generative_adversarial_network/CMakeLists.txt b/tutorials/advanced/generative_adversarial_network/CMakeLists.txt
index 97ebaf5..8c7a70c 100644
--- a/tutorials/advanced/generative_adversarial_network/CMakeLists.txt
+++ b/tutorials/advanced/generative_adversarial_network/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(generative-adversarial-network VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/advanced/image_captioning/CMakeLists.txt b/tutorials/advanced/image_captioning/CMakeLists.txt
index 70554e8..a6d1c59 100644
--- a/tutorials/advanced/image_captioning/CMakeLists.txt
+++ b/tutorials/advanced/image_captioning/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(image-captioning VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/advanced/neural_style_transfer/CMakeLists.txt b/tutorials/advanced/neural_style_transfer/CMakeLists.txt
index 9c6b63a..4a9223e 100644
--- a/tutorials/advanced/neural_style_transfer/CMakeLists.txt
+++ b/tutorials/advanced/neural_style_transfer/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(neural-style-transfer VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/advanced/variational_autoencoder/CMakeLists.txt b/tutorials/advanced/variational_autoencoder/CMakeLists.txt
index d254d14..7175039 100644
--- a/tutorials/advanced/variational_autoencoder/CMakeLists.txt
+++ b/tutorials/advanced/variational_autoencoder/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(variational-autoencoder VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/basics/feedforward_neural_network/CMakeLists.txt b/tutorials/basics/feedforward_neural_network/CMakeLists.txt
index 8f552de..2fa0c8e 100644
--- a/tutorials/basics/feedforward_neural_network/CMakeLists.txt
+++ b/tutorials/basics/feedforward_neural_network/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(feedforward-neural-network VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/basics/linear_regression/CMakeLists.txt b/tutorials/basics/linear_regression/CMakeLists.txt
index 8c2f013..76ed471 100644
--- a/tutorials/basics/linear_regression/CMakeLists.txt
+++ b/tutorials/basics/linear_regression/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(linear-regression VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/basics/logistic_regression/CMakeLists.txt b/tutorials/basics/logistic_regression/CMakeLists.txt
index a670a4d..2795178 100644
--- a/tutorials/basics/logistic_regression/CMakeLists.txt
+++ b/tutorials/basics/logistic_regression/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(logistic-regression VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/basics/pytorch_basics/CMakeLists.txt b/tutorials/basics/pytorch_basics/CMakeLists.txt
index 908a432..3c176d8 100644
--- a/tutorials/basics/pytorch_basics/CMakeLists.txt
+++ b/tutorials/basics/pytorch_basics/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(pytorch-basics VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/intermediate/bidirectional_recurrent_neural_network/CMakeLists.txt b/tutorials/intermediate/bidirectional_recurrent_neural_network/CMakeLists.txt
index 00d113a..824b6a9 100644
--- a/tutorials/intermediate/bidirectional_recurrent_neural_network/CMakeLists.txt
+++ b/tutorials/intermediate/bidirectional_recurrent_neural_network/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(bidirectional-recurrent-neural-network VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/intermediate/convolutional_neural_network/CMakeLists.txt b/tutorials/intermediate/convolutional_neural_network/CMakeLists.txt
index 57220b9..f7a0c99 100644
--- a/tutorials/intermediate/convolutional_neural_network/CMakeLists.txt
+++ b/tutorials/intermediate/convolutional_neural_network/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(convolutional-neural-network VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/intermediate/deep_residual_network/CMakeLists.txt b/tutorials/intermediate/deep_residual_network/CMakeLists.txt
index 9f99ad2..198a0f3 100644
--- a/tutorials/intermediate/deep_residual_network/CMakeLists.txt
+++ b/tutorials/intermediate/deep_residual_network/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(deep-residual-network VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/intermediate/language_model/CMakeLists.txt b/tutorials/intermediate/language_model/CMakeLists.txt
index 7d21c80..11d00c0 100644
--- a/tutorials/intermediate/language_model/CMakeLists.txt
+++ b/tutorials/intermediate/language_model/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(language-model VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/intermediate/recurrent_neural_network/CMakeLists.txt b/tutorials/intermediate/recurrent_neural_network/CMakeLists.txt
index 1eebb49..7b2a20b 100644
--- a/tutorials/intermediate/recurrent_neural_network/CMakeLists.txt
+++ b/tutorials/intermediate/recurrent_neural_network/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(recurrent-neural-network VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/popular/blitz/autograd/CMakeLists.txt b/tutorials/popular/blitz/autograd/CMakeLists.txt
index 37f3da4..d6cbe36 100644
--- a/tutorials/popular/blitz/autograd/CMakeLists.txt
+++ b/tutorials/popular/blitz/autograd/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(autograd VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/popular/blitz/neural_networks/CMakeLists.txt b/tutorials/popular/blitz/neural_networks/CMakeLists.txt
index c6f94ef..f914886 100644
--- a/tutorials/popular/blitz/neural_networks/CMakeLists.txt
+++ b/tutorials/popular/blitz/neural_networks/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(neural-networks VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/popular/blitz/tensors/CMakeLists.txt b/tutorials/popular/blitz/tensors/CMakeLists.txt
index 513808b..97bae55 100644
--- a/tutorials/popular/blitz/tensors/CMakeLists.txt
+++ b/tutorials/popular/blitz/tensors/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(tensors VERSION 1.0.0 LANGUAGES CXX)
diff --git a/tutorials/popular/blitz/training_a_classifier/CMakeLists.txt b/tutorials/popular/blitz/training_a_classifier/CMakeLists.txt
index 00d03b2..6ec8e51 100644
--- a/tutorials/popular/blitz/training_a_classifier/CMakeLists.txt
+++ b/tutorials/popular/blitz/training_a_classifier/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(training-a-classifier VERSION 1.0.0 LANGUAGES CXX)
diff --git a/utils/image_io/CMakeLists.txt b/utils/image_io/CMakeLists.txt
index 906407b..080332f 100644
--- a/utils/image_io/CMakeLists.txt
+++ b/utils/image_io/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(image-io VERSION 1.0.0 LANGUAGES CXX)
From 8c389ac3d250cea2fa56a0d5a810a38cb6a07ad3 Mon Sep 17 00:00:00 2001
From: prabhuomkar
Date: Sun, 5 May 2024 13:02:23 +0530
Subject: [PATCH 7/9] Remove explicit arch for macOS runner
---
.github/workflows/build_macos.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/build_macos.yml b/.github/workflows/build_macos.yml
index ec6d6f4..d2443aa 100644
--- a/.github/workflows/build_macos.yml
+++ b/.github/workflows/build_macos.yml
@@ -37,6 +37,6 @@ jobs:
- name: Cpplint
run: cmake -P cmake/cpplint.cmake
- name: Configure
- run: cmake -B build -A arm64 -D DOWNLOAD_DATASETS=OFF
+ run: cmake -B build -D DOWNLOAD_DATASETS=OFF
- name: Build tutorials
run: cmake --build build --parallel 4
From a4212ecc9d891eeafdc290775478cf60ae55a985 Mon Sep 17 00:00:00 2001
From: prabhuomkar
Date: Sun, 5 May 2024 13:16:25 +0530
Subject: [PATCH 8/9] Updated README poster
---
.github/workflows/build_macos.yml | 2 +-
README.md | 2 +-
images/pytorch_cpp.jpg | Bin 0 -> 26428 bytes
images/pytorch_cpp.png | Bin 100260 -> 0 bytes
4 files changed, 2 insertions(+), 2 deletions(-)
create mode 100644 images/pytorch_cpp.jpg
delete mode 100644 images/pytorch_cpp.png
diff --git a/.github/workflows/build_macos.yml b/.github/workflows/build_macos.yml
index d2443aa..9484538 100644
--- a/.github/workflows/build_macos.yml
+++ b/.github/workflows/build_macos.yml
@@ -18,7 +18,7 @@ on:
jobs:
build-mac:
- name: "Macos 14.4.1 arm64 Xcode (Clang)"
+ name: "macOS 14.4.1 arm64 Xcode (Clang)"
runs-on: macos-14
strategy:
matrix:
diff --git a/README.md b/README.md
index 15a9499..6e5c7db 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
C++ Implementation of PyTorch Tutorials for Everyone
diff --git a/images/pytorch_cpp.jpg b/images/pytorch_cpp.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7d4b6d6b7427d0ab801e46d4c073fce28558e578
GIT binary patch
literal 26428
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
Y;_OPWYc
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
literal 0
HcmV?d00001
diff --git a/images/pytorch_cpp.png b/images/pytorch_cpp.png
deleted file mode 100644
index b2f141abfec4092e72ee40cde193b0334d64e651..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 100260
zcmd43bzB@-_CAce6GDPZAh;z!kl^kRf=h6BY22Lv2?Po5?hcJRba02pgS$Jt&CKl1
z?*4}F-!F92)m3$?Zk>DNInOyCLKWo1(NPFcprD}8B_%|ZprGJgprD`ykPsky5UgJO
zhJ3)82+9gVK~+Sd-s!mX(E~gKQ%~!9(Lf!9up6A-_=21W->`gKR-bK@OwBLR6ojrsEvCLQKqXTZCp!~SalKxBS$?l7b{C^2X2>-
z6n~t-4cUI$%}hb|$0?2$A1Tyi7085b?2X9Sncg$8Q1GFUk&*G*8ya&fiHQ9*9P;fW
zg{h;XEjKeW003YDykoMlH(_Sw;^JavVPj@vV}zW+=-_JYsOQ3H?LhhGMgDai5hDi!
zdox={GaGBNr|atJ+c-IXq@Z}Z(Z7HGoTsCi@!xl{cKGYDAP>m=bcC6eiG}%}h8ek-
zJu~d-$e+Xhc&E0DTbnuZ
zvHdmVe|G=JsHb~#E10<$S*nScSs7V7{Bb9C78YLSe?0V$L)HHt`adK821}C@29aNfAM17wEkd#AM~k=H6k(PtNKCWA2|s
zpr`!^BKR!c_uxnebcq99PM8QB+;YB%A<5*6p57L&07
z17mY)Yf>B`vut5km))oFp-#`i3u*rzS_wNk~@Mhftm!-K1wM
z0PZecN2<-9bKPb}!LXS#OD)Z@wUSSFd&W4!jJx*4GYZBAHx4n2;u#^D^1@UvTk+PS
zHM~ZGivyY@fA@=8ps<+C)HgU09?)s%a$1GYJ(%Z*D%X?!etuxlee({J#-bahSE`oNb6TZ%Pga}aYt%EMO|L*6@vEyqes@Pru0Vcp
zQ$S&%K4%Y@eH)2qW76nMH={K8>8yGFO<=pkbBmhz6)J)t35}i7oB;-J^&pP%sNt5$
z+r-*jDm6)kvR3QdqX)IQ#m65bn-sM!^b;Lz&*Up69Yz
z-*X^q;3a551aaJ9pb{It^I5(0?ZZiLBb?3D>$nglD+lA*;S(0lIxNz1z@!0D7X-j~
zb!fcLJ%dDgAZ~iwd3YgZMZA4b#%fQi@J&9=cv?nQtuTr7$bK`9-+qBG;syQJDR~x#mkz4N)IijKnjm
zDgaaSMgVnD!*A7WlnhJlz#I#}SxhU{d~05Dyq85+(==0Y0^A$7$Dc12Tw51>_9~3Q
zP>e2`a_Y5L$ycB_Dmn%LKOSfyIJS99yWVI^D{I|49I+EE`WbIltpW4GMbm0@Q>6#Q
zsZ99eM7s8cdetHgM_!vfU>mVCcBx7WJXo^F0-5YHQ}~7lxkQ!Uci;EazG3K-N>rj#
z;LEUxe$0YO(JCUIvZNL6qlTho4`0M*9cr}@%vt+93hKxB%C8XHu)Ux8WpVP
zibjk#Z55}$4*R-lIXS2Cq~cLb8>Y`txv|e_x)@|O7G0gBNihP~K@g$VS<*-ix-`sq
zJRln}dJR|1pS1;<>opSge!oCYU!qp9h_I_WIf#5zAtgN>B1@MCuI_2CBpGMZv=hroX=yJa4@{
zl#r_&?X0z(L|rCVWo=e~IS1Uixr{TWC4TAntMCMyqi!g+nP%`J7J;gb1XzLnulq
zu60qtO87hb+B(GUDg)nX1JlL*Ih2d&qQHhFbaZ!-W+6JhH;_;QAQoxcaanWA4}V
zzye#yx^)ssu1T!%!X^`^I_Mas^LNZM3%e&Ou(V6)B?u!ckPhA~HNGaCYGdr&?Pk3K
z*Su_5Q@dV(1ualZz+^oygk*>)IXA;uF4?d`fWj3S1Re*uale>39`1dl2EBVL<}X-3
z^5neWR0cH*8HGLPP7?#6wBNr+y_g~_Xx+;R;4n2ESb{h~(jlMWg||Oy4C4&o2@7Lk
z(1>V{o}CIbPCgz)Ichq(Vk!mGJ%rgqfCb8m<`;zB8@~}hn_u_ND9ADZKv<${VL-4U
zBVkS-%X7{(Q^bdfAXAxu@dG2C_3I}$AYK&~vAOK<6lP+kC%>UjCU!8wa;jUj<9${C
z=jHWPk@9)jR8qa1#5Rw&T3T=9a+spOHXBTK;PqS0HDxRgDEpJ3NAww65rFxZGZbTc
zi?_F24u?#Nh~a3ENLF?zj65k=+qK||1>oth=ZuYU)z5rxK_tkeAd#9dXUtU4jCM(3|LYItIG{BC3&I!@g#she
zhV?ig79gqJp0l}M12ywk@pJZC?fe8A_Sw_1Pjpw}1U(MCK0uJiU3%q8TssD2H3-Oi
z=HUBfr_6gpO`d%ej3=A_q{8)m3oCp9>+fr3F&05Lh-RtT+dCC2mE~h&k<0?bvypu<&}+9)zWK
zwBrk1Hcl`Q?E2<8w{`sl;!Z&IiuP*c2XU6Pm3*mz=#wNq>jxe7AZ<;L1F^#+cHvVZ
z@z?!^n%P4kIw(IWo`vT5gb+oYiohR6fc9300GIXfKS0!d+GWQkQKhviGt{b71a3PbjGKZQ*W=W*LXHpcn%v*NIf);YY%pQf&bZa3Jl?{V+_Y$tLh;mgUrM2Cg5Rtjy?
zsI~X(rEzvkw*HwC+R`e#5&s;fG-#f5xB5#}ETi{qCB(ZcGz>2QbOJSl#DCOWee5+K
zA3W=_=L`$hD@@qD3H2CMTq4e~==Ho6t2%s$5=PS|7PaHVa>i#23k`JCw!3lI=$bfM
zVG3Mqj9$C`XLTQ8dxGb$*Jo%N^2@=Dvr2||!}J`fugjFe`5pIpE5LY+Y>C#dm(}Lv
zUv}Nid|q=r^y!>>rR{!!CxE4dj+9}Y)mCVdE)hc#R&@oQpKEF9TBiY8(aJQMu
z<{gk94E@wD=D+;F09XPfd#D}E<&26zrva5RPPv^%?mo3_HhN+vf2rPese0p#!JthZ
zB-X~tNNZ&BYiGSX%r{>0a0
zQ*&q=yfe0salQ?+e$Jryuz~K)0J6D!({cSP?Zc=7rPwkhL%i#AmQ;=MVSq%0X0z^%ac|WEDhDF^)^}anSKx@{6=86M#Zkj918qcv7sK#A&lTdvH{nM{
zNl`DlV#BO&j@SS@xQ*c}t>t2^leh-YwWE}n$BdJyGTZx-U3QDW%
z>j!b{qEmO*-8~NSG!~;Wy+eoAjT{iuw-si`1{k
ze4!%5yP`Ots{j*ojX6zwI!CqGADiBm#Q(T$&sH|C!{1SOg3UO0
zbZzoq(xw4_u9h}iPcCfuVfM_(KQ1t9S9PgcxowkZWF3Zvf9Y$W$X2Dw6<)@xP;J*x
z?*s*umpEIUtr7#bLl3p`Cki&{C$rK*=Gx7;G++O;ea2_|YG9|gY0}FuK4zCO0ytl&
zhllAk+}2Cs$vdR@=>);np=o^9H*hc*l{FGN{I#o){*(VU;^cx}!{BTSw;z2H#t!gX
zLObbwe+^%%C%|$tn$-w1vUcIBEdf4BYw7Y!?CxYrK2kH5EBeysib^WEllkeyDaE()
zVWfaL(;CxJCP)yDZbTfQe-6Ic2SQR?P;9h$m*dTY&=r`N;0i3;d@5CO4e`(#A37`M
z(cdpjFyZxohEhA|NoHeKoDsZ~{{SH5P)@RRJS4Wv-w?MHu1Vke;))ts+KdnfJZxpn
z-Sbtf9e?Oc*w@DRtKL<$+s
z`ZdHge^&aD_zpPZvO#V%=nZ-T^;tV{I0a!}i
zo7Nxih~DeKOK9S{AJj6cZe1K$6wfos&h`tkqN)IAu>q}eKm-dN#LS9V@A8V<26xLW
z%U+}3F^yQ<4_la+u8lP@~Rnm`z7NAnQvH7fgVUR8H
zC)I&5bemPU^+*BxZ)2!RfD!kzXL_CGj
zz{5rrLBMzn`XmKX7bK7Tz@aStvUYN{)suDUGQ-EZwq6E4v0WsQ&F_?q
zpgGSUD|6nm%{TI&r<_f-CQaVeG#a8)l&Oq-TDrdwRbkXp;hG5j3#4vo_
z7|+!yLgp*6%NB3gJa6A|Iqa_Q`F)`)cxIc3&$$lnC)e>-tHIO0VOTo^NI3N(r;D+3
zqW4P!Pp92n+h*x!0(H>BE4Y3`H(_>@$IKezsFsx=bL^J@Mb+vG-)}qCYN{KaSGAR&
zVL1A1vG+JzT6Q|are$8O0d%2zK2AhG&cv1N`nGARVx51`<1=y-n<0@
zh$!2y40a!JUlm*KhPgpA`86wKPAfR2<(yc$Qa$g*Dr+>y3Q&
z;=5-maessWS^I{LF#;RyW|?E1Z!W_Pnr~82IAQ6@Qdb!ZtzVB_>sCvE-_cmz<_65&
zLP@ravpPnF}TTx{UUwUll@3=sn)+$PjbUbpi+{&NZojbn-px0RV8`oiG+XFeqU
z{E>UXK2bUK_R55
z{%5W{wXQu=Wj}K9f1ozWCYWP(cry61C#Pt}0$tap$aYpbljQWQJDS+&{#kKMOP-jL
z<><#bM&ZJ~#Cz)sj5OfXm}_Lr(%>1zj)Q9GI#bs|K*czl_(HVpEk>%P$G(Fq1HeH5
zESf_%4Tz;%C{dO~?ppZJVku~=d!)6vL0U5-S{~G`$Q}-
zR@XyPNOTC%3dn7@ztjr>LXb~c)iwl-M+aknVqLmGaXXus+@7WaLkp`4gPYaIP(TZ&
zHu);V3Yc#1Ie5pbH;#ic%}iIL5$0*-SHL?s1BcJ$-}c`jxr-JaDZ
zjts7=DM_cnQdKP5w;-2du!oCFM8SI0fBH1W5TCDEy%B_}Wkd_Mo#-q|ec$socVdNg
z{#BTOP!aHpai8J@?~1ggTBPGcT#Y#6R`1SIG3t-=5MG$mWOOwK8FW_@g7WM
z2ONSMPKD-cISsV5iyG24UFCFibmB|3fs0ydYA)_KW{qyB-CVNKp>O}RcwZuNg`y;n
z$lp1i-&S=ncE+KLUVwjgLzZ!0p5K1&PRK0(x&>#)_XTwX5hR8`<8IQ
zO_xa$y#ymOVNWB+tnXV}PQYl!xH3qQzj7Y)>uxD!Bthb@uhUT7YSaD^N;&(#cIS54
zBbJ`tm1kNE=*V=wHE-QIXS>3mj8=>^EIY|ke}+uCT~w5oQ$FLcXoht1?#bwQOUy#
z!a}Ej_0kX^_WQX2-I-S$B;j?eyoWrkBhB|=Q(Y*)-xopVue(Ei%Xj6|tj(|YbF()F
zHPmcJMn#R%yjJ7&%0A3GmQ-MpTB0va>TA2v+qAY@Ve69UP(=_kcm5^FKg1b=1`U|4
zG&1i9Kz^yDoad?=Me^~kYM5_+Yog#2+*_RQE1-bCQW^n6q={`Y(x1xj$noIlx)ziR
z`{=yN)bK$IpQVZEXG!9KMtGZ|JFvyh20;bUMrl71r{xD7-1fcwN3(__qI;^H1lH)&
zWubp}#SE0VxSws8pmS+$OY;XzEQ)ayef!E`j`IHK9KdiI(QaZr(^`iSr2+L&|k3#EY;g(eXX(h4Lyx!e!4MOC>)HTb2CRUy!p3jLTV}CAa*y%U&z?5@?9a0&}R853y$hox)XKd+V
z`NZg3nk+!8F8s^xmSOmm9=PH1zdaOLCLB?(qLGnNVRdzNPrOlRh0Pa7?9pTv^?!Sl
z&)B9~IR%BUuC-PEtP)~F&cC-{~=Y2&X{SzF&n}rllz~}JY5j3%dL)sIn+=$t_58R
ziTU5SypJ2=+ttPAuAo)wjb{GhNgobd>D|>U45;P^Qz?rMuqTd1!0hE28uRt|x9dMR
z76rwz(qSw05uW5|^4s|j
zQ;Gwj9|@ms88d-obJ1g+e01m$zCdK=>+hc0HNLPlLpvIF%J0iGhMU4ozVCy
z=`Ji{Yw}e)9$l(!N}H-*NE2N+1#`!{vxJk{!8)8J(vl=maYm>${IOEzqYL74vFfeIlAFoEC`V|vC{l{cd*VPuy9B!LA_lMf{u!dYh4RgBGVx
zcRrcNSR|aeB~qHj^@J~xP7Wayp2pTOv-{)hi1oqw0`Mmiu-VDLN4d3+A1@;oHBJaF&s
z;XhD;mWFmRAkUktZ9))l^i(8m5jagdte#V%$id)hT+*2jfOXM73!`j%ynoaB0##DoS0OS+z`dy$&
zm(AU@_ujmB*{_<@J!P-fguLx_LJc^3h6mIof1j~ZB064fQ>oxKdJ--iBTb?b;f%Pe
zR@IZH`yeZy+i-vEB~`O&w309fY6q`>8^eDUSA3@gAW3SMbVCQDzh(Z#5a_8+PrF-1
z6`8UJWv2>egQNRWZBHHtv;~pH0ecc?t-!ERGcR@*c^rgmRA{+{9G%9kX^EOz*R0F|
zs;iscO%qxb>CJ9>ep&l7#RGQ<2ZXLHAX%U_lBiC_RJVylqc2jidX86zqZU5lG?n~q
z#WvA}>^eI4m0rEkl{DEwoQ>8r9hZ0!D+~KGx=;@>84ji;gg_lgXMopt_S->yhZ6`Z
zduGr(uxsk3qVC^eT^&v?lQ=>Vb1|TF`WCP`>xuCya_2D0b6ODd5hz}~$vr>3cbUJ6Or4jZSJV>Noi4u8Xl|LiMBr+VrG7*&GUIi$o}
zY22byEbpa|6Nks6;+0puZheMx5WddDAccD!WTJCzxa`2$$taALNzEvwXt}&BxqV%v
zLRDjEPsO*mcerTPu+N=RLh5XpruJ}%SZEX;J69|E8YuO{-ba?h0A!N|!C3<{hiwT4
z*P7rCxzp;%l+9k0IbHmKO=fADn%2N0?dzoH>e~XKr*fa4(H^sA+z0}?-|)f!c1Q5H^&vmYX>#f{MSaa+
z5q@0bz9lFGQOJUZTZ!|)7%H&MB}wA-_mdbl({jSGadhi~%iYH23PZ7rxowl&P8KH4
z+icnphbB?}pq5iaST35B8#;_Z@~0}u%0PM6)tZiGs+pOY)p*4OVUjYTdT4D~u2$+f
z{+G6l5I`J8gc@zUO+JDhgxN4`4o06$^;FA=8*)f7#8*3r6NFHi(8sKhvVJcoMo`h3MYMUv2<77-M60O*(T~ZYkACATJvbk=;KmD
z$LuoK(`~XqnV@YNLsozE@jC$_J>7jNl)P+ZElBiCNaYd#~
zLyCS3Tv;v<{sk>IL|tWX^OCyRKk`oM5PZ)fxs%N0VA`MwVv`PsEuRY-0h)eC1}&h`
zmp338T}_j(ubY|oVc}1UOzGoae`^sPOZXmDR@L?gp)!Jl6tK#)IB&Dm;;Bp*ODEWh
zn8xi+)UxU7HeYL1a(8zZJa&Ii^7aVxKM>;|aLW`45-HI$;=3(axxN~VnXEMTxjmLV
z_5aK$>{CMMgV%(GqMyKcX+S$!2yq!MJqRKhIK9CjDFN(Xzds=-Ed1%RnU(KUOt~HE
zJ*45A0q*|sYIcOEpZfuWaeha_FYl?^B5;N*k;Ztx*yyyo2(B~&9S!r{%5<;UZQs)2
zL^=GhOlVm0x-Dq;N0jfv)LbVZ(oIvgccw}-iSoL;!tl$o
zwcY^^w7BK)vHrK!s8YzMLt2Gpiuv19&&N~iiCfl8GMivdoX4^Te6tLsSxNK+3#8pQ
z)GtTOemcivu+hKiflbJ=B_?C5YEWshoB|2H>b4O{G>}w@_lLJQpmT2ieE6kq-RTW!
z?nK_{@a6qNv*KGV(uV{>PI$DGC)-Gj^a%lefWb#CQYmq(EiNvGs&L1$Wd~LMu$sqX
z#&%wByFO7#2`sz&e`}>XqL8ZnPGHFjzMlP6&G5pkO^5v@wvi{>LdEAk2^HGaq-cXjR9cul7M1a??lS3ZsjxOTj7zLGg_xQONLQ?FZm@tuVM?!
zhxf+q{8cK>vsx49dijL9D=AKI-b%-ZLgHq=pU>B{z3AxZ-Ilu(&?&WCGEK|)+KeIN
zQC*TNABP&~E+*}72>qwmC)<4@_=&e$V8O!R6waa#7ajb{=IuO@3$^kA-H=|VBVy*o
z(ukM9RloqDW1mKrdm4zUt}n_mThtD)B)YUZ1Q9znVE;UADReKBKTie$klu>;V&6crt|;@;0C-003L_hr@+8K
z^Cz>%L~xM#?^cA7y{A}ehph}@!*4||#IXQr?lS76%^Pa)Sb&m+(Q5FdtWjg6?nqUh
zb=r}3?>@g{;%Ld`XFm+TlzJl??}zG8b+*P0%5N{vKTZMxscHvwAwb}xC+Xg-W2gM@
zf;N=q1%Y?x8w<`IEZp;n8ZzJOt_Q+dAuhl$zHKB!*k4q(-uQ!ke>4?Nz4fagFm4qg
zw($S*RK6Nm5IzxAVwT(J=4?Axr6psI{9;U=FS7ZrTFUb%GiKn>h#T7pvkq6wyE|BUNQrjoK%7l3LZS79BuaT!vkc{56ttQ>%7}-Vw_xxLp*ud{0MSd1
zdm|@nDh#%h+2DErIAp%bWGvR;da@LG{`)gGwWC5z{<{$g>KI7A_x|nJ@c%YhRP(~P
zfj~-U_R7}#@7Qb&mP;R3)eSa^8qWt@cw)Eo>M0Jyj=sw+`3!5%DwN1-oyzmtB+Z)~
zQHn(^=D|6NN7&OIh?S+Xi-u)`MZxEsUUu;f)h@pxlf-9REC}*x+(UqR8t<1rMSd<+
za`o3QkX%#RSZ&Zw8CK;*Ii6NEIcI@s|G@k6kG$ZUFr3`S^9fRB%~~0yy|*}_%^a$r
zjAE98za{=h#=s>9Y08Pv^1&+i6Cb@--Vp%Y<{}?B$k#e7xroIQEa-oK31HP5+#QqU
zWV+3yJxnbtk5`HF@)~
z`?VhOoIf^172XD}TNA|ruZic(7VS*D*7rE~(5u9k9H?;3D!BbZ7sI(*`zWBX&;6Gn
z>068ar2Ba3g6r*hYM4_Ld>oKH6u9kZnp&haJ|R_ic($-T?8H9B@EA9CKfbpTSxd)K7A+k8%&)>+wamIe~ZUq{R0914Zq?mv?U%0QWIN
z^BZV%8Wzrn4moh&UKW})Xu2mduF81pHDcU8VA-4oZ9n{)=Gnj7T*$|A4I&Jmlm*M;
z3c4$J-7W?J5xnTrUN7}%uxx^6e1jvWWE^mI)x+~Se!(GEtHEq#b*(F*9Ew9Y<(pVl
z9c)!});rltG{)MApRE5S>pt|SiDx9U%;H*1w~0)vH!kN@xE|J?^Xcy8>Zklb1!-Hd
z;FZ8yzm}Q4z^zz_bM0nCt~*@rw*_I{fMc5!z!55;>~7{`LShQR&FB{1xy-sFW}CvT
zHL*Kbr)VKS48EyNAEMR9+Dd)oSgq!2GLF+4m^#muaU^rdggt#u2q2oBO92I7Yu|St
z&y`K#u$)QPaan=iMp`RSE-Z*{bNPS3kQAh0R+B0Y!HdgGscrIh^|WB4P}C%kdcj=1
zLM{kNQ)7Zd&$piNRJ+V-cu`|-m7f|6-Kj#@j0k3c8>7%I|0x3-dUQfW;bR{qXzAoR
z&(}R)S)rE3>2MY~-&5ZnWR3u7q%5mXGA6TX6MaQHtULvZ;^`@#cCrLJC*AGIrwxhb
z5f#$Q&>>fgJq5_Qo0VWvsi~Td4k0SS;^Y5Hi6J=HcjJu!D;4PM9#W*7^MN+<+AbxW
zGzlN3^}M>wiJM{{4tyN#vnoWWLu1YRC0%WkwYN5Ge+Mlr_QvhvC!GY@3H*b9)z{#5
z(PXFrZFdWBy}-mJhxfIx=Y3&j%B7BCE)Hx=s&DT%LYe~=L(-(u*?jL7D}sa5C@xoV
zqFerlgA`KpYpchI_ixBp#^02}yyQ0w_nEK>$cZ52w2mUPsb4|3)+A|O_M0Lxyb`B|
zzCy)JH4g1v>t$3c7w|%P>7ZD~Ccn1HfHNbWgs#6jPO1*4)0?iqCrFqN&XZ!<_WE2C
zaDu#>@w=$7$#_GRuP%UBnvdWXsX?V%c?Xk=!x_1{_^9*dO+#U!T>qtB>zg$7)_{%{
z%*a<&F?2HP6{oXVx4Eewhh4YMR65YgdJodBbQ*bi5DV%>*Crzy}^
z3k5y25?zL^17>A-JHy^XPmmI;#BBf%TL@`v95#nOe{{bPiAB-c+{@{SAm-ud!(3d`
z^*9dX_qaL=yCVjG?dHCb3unv!rjEf=)>uMpXeG7l!Y0{Kxk~{oHmo;aF5)5~EWCSP
z%%p5xgp*jU$`yo8NR2vJIiqTogf16A`uljT7m>8HHoP)yDxE%MM9WK9y*t~o+t|ib?#q+R_VfgFaz;uOTmRLbK
z-+;T0PAXWMC}462och^%v!f>0y%I|1^!<^w#KQMOq15f$O7uAQb98%>s5n`u^ZvG1
z!)?ZSUNb6}pVNdWV&}|8IM266vogJMb`y{cOUyBph(8?_+TSH@sEyX4E|q((_ETGR
zgIkh!)TS#`Mn3XNO
z;X^B(??Cmcp@RM@enKqLagSML2|W#%1z5as(6n$@8;jlf#t2%F65zeco`OL6z18XD
zF2T;0mGiw@>@oX%wBk3iE_wMXq3TR`p}v8vw#x#Zn?orNd1+n*SBwj)jjXS&N7`Wh
z35e;ZZ$QkgM3w=8S1_bwKaVrz)>jTs$p#km)TcOHt97Q&YvJMH4}0}1PO*D*rURy1
z&mc{oG9wGMR`ces-mshThdNp$bR{^gyw25J9ESx`%Q_g}%|4)!aJ#%ZU$JY0M!ec)
zJG+={MFM0mBm@L9hbZbTZ21QISFWzEzVSL$j5q(>8VKF-DRmS6WmLYmF^$xK&FqIa
zHe-t;aTh=9EW1?GScGzqOo~~!%4$o3^w#bYb{lOD7n^}^6VwsFa2X}kdZNuJhxlu}
zcC^((T|K|nx^U&+GdCRxnH4ELQi3So4YGTtVqA(U*@*tiA0&5zez}SMl4fk(s6$EO
zX0y3V>rN+x`yTPfdbcTR(otQg{jnmSBoV)m#`H>KEc&Xp^p=G$#3nJ`g%daPA_~lf97sWr*v6Falh74<=T%upyJZyq~Bz|)0|nY
zYVo)}F`wreLO$qUc17Iz297~La>NN0!JkM=YQJ=zNHOpAMXh*!)DuD2Ja@6JH+Pk)
z38x@$I4TYDTiG0CXqQQ5w3igKRI{y0+RN)<+%(I;
zd}m%bsGd}sh2jM#3J-Di2oWbGOW25HYd7QT=6sWIi8c8#FPmb;FNI4WpfQn4`
z{-?c^;*n^*#qR0YD|OQGOnPawMq@iKi7uhWgdWq|k^=o=F_Z|9jNL>R5B8U8bgonZ
zo^$U~jhx>T@!-+60$b{h+UWJ-xHg8ph#hW8KFn?{ZrZn#rJzJ6?|4)xc$DxV{Q#nQ
z`6ao1X#nc4Z0)z+b960aCP-knj4yNPpMNEHnW@dWQ^Wt1VEpiSSj#n!S&}--fpnRI%t{aBUF61uW$L)Yv0~2K(S_>
zT(S2VGA^~H_vs+#<4lD?uWzN`OKRkWBNP!%w1J`9P5#I0J&1qE)A71q4@_WaOyPD?
za%m7172QX`B;h4?y&-#Nef{-HM7c*kq7Li(D8dC6F
zNcEKu;(-H{)s=J+YBT#(rcq2x=rH@Qo#%DEGtsVhS;B-Ezsv9ht
zIN^&(l5e0VIq&^=UjnIhM&M&NocNw8t8c^(hmS3Fu>4kycVvH4w*8@#154T70{}lj
z_i)@xdaJg4q#zeMTV=B3Td9Plqbw;YX(Gesf71Tu)6NZ=+GIg6sn^v*FNwS55c1n(
z1u{p(ow$r4OggJ_n;^6|YZf86%3J4*^
zYC5|#Qk68+KXbIHZWw;Y5&Skq7WFx&uJP~g-GJG4e_#f|1
z=SR~XurFtQcc;r#fzJCV2mNF6nIGw^SLPqi^7w0dad9o|qU6%$t`~p+RnyG_@?fH|
zmrfSEt1~)W#34&pR7$nXBs2p*
zBnoLapzoLOL)_?ZlFSh~AjngA?oCUXOGf12x5fak?FX~*+(E9383R;>G~P4WMIUI`
zlTmp_kz{6*uGd~76S{fyca<53V{ge@xTBJ&bg~iSr>qW0HlU{i?{(onojLGK6|3X2
zi0Y?IN1>(Sr+F?nE*)4@-}T${;4Ut_>SDLl9J_}xJm#Eli6
zw-=9Ko{Myn?z~+VSR*ou$_AS4DrlE`uIvNS;3Xk$0W>L4{bZ_b(LGd+!qFo*Vd<(I%8!lKdR
zlA@j{2uPZ>me)3FQ+HR8APGhj6r3GyHP&(--
zf**MF)$gSmm*Z8ZS9@r^B0y#YQ4});Hd^t-FWC=qaP%qm8_n{3AOJO7$d}AW=t49l
zJOrVgqfShG`X#FbvR`dbw3z;n9}pDdSMJy)ELe^-;g@!=_;#brL#W=XtZ2(91R0EY
zlB%55eTmj5YYp*QLL7Um9}p!ey~x>e91(tWNuZTf<>{H=jOM~DaDPKZ?W`-P#k$)8
z>zOiNrrRnMB2B7~!zsoKmT>Y86wNyZB6H)iwg!I<8nt0e1V
zPp7kQ>snu#8Y&g1)!f+|YWi!MRvfiWk}&QC{C#z+r55ebHhTSxCQz40&)3%-s&lSn
zbA6<-80b@z8jlb6csmV3vvk-KEZ1oWdi7{A<3lcwZ;R^=#0dNzByo)ZlR?AO(q6(n(X<8!
zJ8xwKn`;A|Kf9c1W;_&Bv(V~!Mt%z=M`Ev4;{KrYLRxDxd=(orn)hgGi2UQ|6=jB(les^TqCR`nbwR|g_6=y0~
zMKG)w-lXBT2gLb2yCdEh;<^j?^87T|4x@;0R(I#qy75;z#8OKN4J6m5c|i;~At6lX
z;&5+lQB$P^XHbvs&40xE)-EZ|agDju!O@5_)tsKZIQ1qcGvERDI{sA6!sw4-!#Kdj
zG+>w}wVDu0Vi0X0jk*OOZigFs)VZDSd?`lsRrSl~?TI<0BNbcGl_YlG2fBU`%i8D+0
zV@isZ+`s-80Ez3Y?_u`G2}d}2Ndb|2G^fY69~4hMHQetxHJ>40DfRHSyWkyv6>z`9
z>lrK}4@vua?1nh2D=?RDi)VlY&I`0L%7x}nwjuF68+HGhM1Drc&=#_M#WlCrJ2t#h
zLwK1Tj$QZlaD8z%dp?f=jy+^a=jX2u{FNEa4V-+yr5+lM3g|W&L}rffX(WF3=`o^d
z7`?NAR+7g5RVq#=Y&9jLN8AmQLALj@mrZ7wb#NmMyZ5X;-wl$HDbv~COcThLIJFWiOqPJ#Vy5Y;J$
zav6W#nU(Hq4KHRjJ{2?KrM8(J*M{79&4anLxSrC)gw1mj$3J>-a5NhAs#vFStx9#M
zIo%w$+GTa-D_1Dc2@Ch@&k>C@ZaZU`dc-5l8#G@-y1|TkVp|M^wPcgi_p;>qUgb3@
zUcY}Jwt_j4_@0gB-`UB3vz3*_qJ~6mxMff%`(ft`%huKGuov~_z{dhHUwl3ID4D?{5|;*xUi-3@x(Fi+1=Pz8DGb%NQ;jCk~7Zll?iC4#4W-sF;c5pB&oh{
zu^PRO+7a8c(XWx@XVwrj|5zAn6nPYw6PHYgrbAxI9~F8(%eLZu
z+>JkZf4Rg=EN|RJ5HRrSMp1UhVFu$J2rjDm+)m-uBz&@sRCrWFOi#ba+gQIo>ZaOh>1@!G3n$RZy)qMwaerS
zfLJqa8tMw4f6J+Hb;DXYOTjnHa|pl-`_iJy6YtLU5(908?p&f?3T%IfBdrtSsxO(M
zzWIhW`U7Ui6w5@GUgZ~`W1o;w@fGlra5fMHmAi~0nb_XmYPU5Rly!|H@lgsWjI#SZ
z#NwUEh~IJ|^QFF79>s@&SD3vz=g4cxuXZBIJr!rfu&uuplt)P2M-NlTNi7AGv)$&V
zTd(+a!Q*S$a_szI5TOl;ITSLS53H^hb=jo+3Zc4eg?HoYjRaVjZnD-!r@c-K@={S4
zBB=IuAnx%M85!wqKbNV2n5-xK(DavOtW?UW#*ZT;OX6V9I412v7Hbj=3$1>TjtsWP
z$Z)VsrxytYFqDOeVb1U*<~NcszKeg0Tu*Uj8zQzRao51BgKb@Mk_Jp~+P9o0{BMs{
zodOJOz_7snnOlf@DN58G73`da9d<>(jH@~Ua9%T`iSwxfe1z4OhC6wGtFtUbxTW!1
zOfgWQ>bvYa@khI&b*aDm7>|4-E17hbq{Nhf+wiJRh2&OpRhHq*6EUty@aJ+W2ll>H
z@BXH`)}u)_)hqlphmsz&$@S1BPX4FjHUq3Khf1e0$w3eE!5Dw?#Zm#Lj&t&zPVT0d
ziQs^^f7C8DL9nP`TP){A7yj{k^ZU;|;_rrM
z>@MXQONc!V2JTAY{3JQ5wp}ADakbH`HoTjD`ywu_*xZbbasyg9Ee&SBhU>9oK&u*f}u2qlA%_9Sl+Pi8Ss}yyGp(lHGF4W7R>T&!#-;wi%K#|iA
z>-83O;t4CkmDzq{_E)MPh=yH(JN)^m_l2_M5$*NWnga{;Hvn3kzDx3i`^|RVIu)#H
z!-vDB)1goNH=|Jx0noeW34L-tHT`PI%u(SxNV+d3nkoCgmSd!`n&Nt^>vP3-NQ>;U
z5Z54!`m_A#SZ+leyCKv%de;>2IYP+I3dVZX0VXw}&0T5u;i{K^ART}S-5R&esyNLd
z40mP2MH++gQ_GBvOQ>Q$*!Q?huOJCgI-PXEXJ2-k^=`?@bc+rQ|*13%_FTrnc79xRN>)Xo!bv<0*9(qbiFOJM`fbF
zbnDQNO)d3!2X|9&IV@{93D$Z^fN%Zd9?xYXN~@#`Yw}w(%d;4M!8GUBBD0T;$327}
zLyn<6ei)3zOW()GpB2y?k~Jj`AR6gQwT4NWDa37U8m(Ha9rE{ehtw&~`Tu^6Do73Y
zdHa!QBFjLJ{L(Giqg#%z%1(UMob4GhN%+WhD^b%g@g6;n4fhT~fhi7zxCkFTWk=8|F+G
zmuIg$Nea)u%wHhB;(J4UCaaW}ZQU>Z@}+IsWt!{8>(F;!hr9HJGx0x4EWn#^r)8s0yd4V{Chk?EvEZm+
z$dNfl(lD2ar-j^#dM@=IeP4j7a=E0-!$3XWV?HB&IqqdXo|Gd5v8shHX(RgJyaJd--olp~_V|2|;VA7=E
zrsICG`buNlmuKw!>xfdV-S9jY3llyjGtF|yWC~B7mhCLl+^6n!+8li3J6w
z{(VefH4O5l|7`z{fBfSbykCZRCt$F84F-eaHb6%E4Qfo`AQNHkf*`W#hd=yb8$2$X
zkVoLEW15*4;VX~YVxS$DN8KT631c}V-QmO~_#*26fvHS*91Mngh^qt~CI-H;AxR(>
z>?{4kOzH%L6!o3&e5ccIfBV~Z5F$!N*h5jB1EFC8tUyaKAnysr3T5iZQ^Z1>tXRPekBX#$r6a=4$@)DquEHCDa=B#NS=C-
zqdxfzF3k8(CgyTTy_7y%ZY21u%Vb*wZz(U~ibuYEyetSvXMOK`-xC)jmm;l4_3z(b
zEU!kk_4$}W-gQ+A&`VVR2l1^bM_hm`v6Hh!Luhdy*opsE`7hik~%KqozdoKF_=YmX7
zun-K9IMVf6(h@AL;a>g;MEN}QKl{V=OSnMbp&m(lktaa{zq(SFq#k8!jF$-`toL}A
zdT&bml)8nw7FhVF7rQjLTe?oJ!;=!1qJDS4I4dyQ%nYlxpD_*z8XKb2(ca`T1ARka
zompLb5f@^3^1wp+;;{BS7uQUws*lI@K|hH1HfXPxV;p^#xJ9|`w%a5g7Yp5n^nKEv
z*KEgI*mPVX
zM>;j>UvL<>XPMHM$-S)dfzyKiTowkz;v8jC?HEt;D3ZK%aW|Zd)tpiO+TsZKvYLxkQfKXFXBumkowf7Vr|wdPN3?N$h`Y`0Ga3sc
zTB41nuV3t|XC71P^zU7P0(emk9a=t1YH_8}@-rlZp{fQ%l5_M$p)e!XlW`0x9>v!u
zV!$i+rl8F6y@?fne*k>kV(`=j)(0P964~|2E3cFZr;SHEl;p8uS0ynqn}`G<8ymVfG>r=(s8J7vN@Gl
zy~H4*B{Cxb!1z8-DdMR}!e8~xoaY*=bgzv&r`ex~y
zL_om3M1!c4fYqXlmxYC>yoVlo=xtomE_Blo1kgnPNxI}fI%R_%xgQ5Bws=Ptz7}Dy
zf$8OF^S_2bupcbsrOi0FCkO3a+Md)^$#a-*{GOE~Gt7{s)GrauA>1cWk6pYR)UgEW
z*Hl>H{SmHOotN}F;m$+)A6K+N2=lu1
zK~lzH9SYy;AA9vzhGB>AB2>yt?jcgY@DziFcI)Hb;oxP%twBEAcU^|_#p-bv-tpG(
z#h9><57SXO#WME6p^3W+^znf;1Nyp(({P=Rv5fTZDWvyMEVj-CV;xVONgEaJF^I&5
z_}C5O2;VCLX~2gtEXhaMK0}7+dkuM#0V27L#q=0NMcF%}FWg~B`z*$_k+d3>e1zpv
z84c21F&0IisBnJ^$^>Ol-jSv+2=BS_C){yd{?t=Xoros`<>{s}>9@d0llxLw-$Ra-
zcgfbUPFPm
zo~4ROyqF@CxocORW^DT6Q0tv1Q+Bd{BJjJL9>~=*=!KQiKP-(0G`T&I#RoYbbYM&X1=m|1Ohoy@z)*TQC|1xXVtnXuzIdIgdQIcY@yh@723)*hb
zZo>A{l-ZFu!%3zr0>N@cEMWs5jhJAH7_}cRzaGNwEf9z%NcwPHMc>nu>8&oV
zOm_0Qxb5L+`I28u)&ld(%I6~tv3?AMRg~T9D5K%O`qi(*ueFQ*OswS$DYtC4
z0cnSFAbi;nFMOJya?nxOBLb|nk7LA{Z>(-cR@Qtrvp)`cbdc(H;sAfouNh?b4wZp3fD
z0ON^B|7eUi^2C))Q>2e^>`6exA}p>3;x5WzD#m^1$f7NTKIzzeX#*(3V6OyOBxtI7
zv}Y>I{|f7t)GK*O9mCioFinMpV?O%HMOXkCDre)|DqSR06>dYnleEYIcCzQi9({a9
zIxLJ4Ct~dP9XxHO!ySVSQ8$J*5cGi}oQL^qXnJb8UgD6Kl%u3u`d*Bib@ayxvG|wG
zA0a4Shx@~IIPVa&&rcwd=3^ng{IRK;0*}aVl0V6tj4fn*4mVu4q3=8n