From 6e0f104d7e2bd9b15e47d2715494734d96652e23 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Tue, 7 Apr 2020 12:24:16 +0200
Subject: [PATCH] Bump minimal MATLAB version to R2014a

Ref. #1713
---
 .gitlab-ci.yml                                |   2 +-
 .../source/installation-and-configuration.rst |   2 +-
 license.txt                                   |   6 --
 m4/ax_mexopts.m4                              |   6 +-
 macOS/build.sh                                |   4 +-
 matlab/add_path_to_mex_files.m                |   8 +-
 matlab/compute_moments_varendo.m              |   4 +-
 matlab/conditional_variance_decomposition.m   |   4 +-
 ...al_variance_decomposition_ME_mc_analysis.m |   4 +-
 matlab/disp_moments.m                         |   4 +-
 matlab/disp_th_moments.m                      |   6 +-
 matlab/distributions/lpdfgweibull.m           |  24 +++--
 ...tical_conditional_variance_decomposition.m |   2 +-
 ...lated_theoretical_variance_decomposition.m |   2 +-
 matlab/dynare.m                               |   4 +-
 matlab/dynare_config.m                        |  25 +----
 matlab/get_dynare_random_generator_state.m    |  16 +---
 matlab/identification_analysis.m              |   4 +-
 .../missing/is-row-column-matrix/iscolumn.m   |  20 ----
 .../missing/is-row-column-matrix/ismatrix.m   |  19 ----
 matlab/missing/is-row-column-matrix/isrow.m   |  20 ----
 matlab/missing/isdiag/isdiag.m                |  62 ------------
 matlab/missing/narginchk/narginchk.m          |  28 ------
 matlab/missing/stats/wblinv.m                 |   6 +-
 matlab/missing/strjoin/strjoin.m              |  62 ------------
 matlab/missing/strsplit/private/ischarint.m   |  27 ------
 matlab/missing/strsplit/private/ischarnum.m   |  35 -------
 matlab/missing/strsplit/strsplit.m            |  90 ------------------
 matlab/modules/dseries                        |   2 +-
 matlab/modules/reporting                      |   2 +-
 matlab/posterior_analysis.m                   |   4 +-
 matlab/set_dynare_random_generator_state.m    |  22 ++---
 matlab/set_dynare_seed.m                      |  28 ++----
 matlab/simulated_moments_estimation.m         |  10 +-
 matlab/smm_objective.m                        |  10 +-
 matlab/user_has_matlab_license.m              |  11 +--
 matlab/utilities/tests                        |   2 +-
 mex/build/matlab/configure.ac                 |   4 +-
 mex/sources/dynblas.h                         |   5 +-
 mex/sources/dynlapack.h                       |   5 +-
 mex/sources/mjdgges/mjdgges.F08               |  16 ----
 tests/Makefile.am                             |   3 -
 .../BrockMirman_PertParamsDerivs.mod          |   6 --
 tests/bgp/nk-1/nk.mod                         |   2 +-
 tests/bgp/ramsey-1/ramsey.mod                 |   2 +-
 tests/bgp/solow-1/solow.mod                   |   2 +-
 .../example1.mod                              |   4 +-
 tests/data/mod1a.mod                          |   4 -
 tests/data/test.xls                           | Bin 62464 -> 0 bytes
 tests/dates/data_uav.xls                      | Bin 9216 -> 0 bytes
 tests/dates/dseries_interact.mod              |   8 --
 .../LindeTrabandt/LindeTrabandt2019_xfail.mod |   8 --
 tests/identification/kim/kim2.mod             |   6 --
 tests/optimizers/fs2000_3.mod                 |   4 +-
 tests/recursive/data_ca1_xls.xls              | Bin 15872 -> 0 bytes
 tests/recursive/ls2003_bayesian_xls.mod       |   4 -
 tests/run_all_unitary_tests.m                 |   2 +-
 windows/README.txt                            |   2 +-
 windows/build.sh                              |  20 ++--
 windows/deps/Makefile                         |   6 +-
 windows/deps/versions.mk                      |   4 +-
 windows/dynare.nsi                            |  12 +--
 62 files changed, 109 insertions(+), 607 deletions(-)
 delete mode 100644 matlab/missing/is-row-column-matrix/iscolumn.m
 delete mode 100644 matlab/missing/is-row-column-matrix/ismatrix.m
 delete mode 100644 matlab/missing/is-row-column-matrix/isrow.m
 delete mode 100644 matlab/missing/isdiag/isdiag.m
 delete mode 100644 matlab/missing/narginchk/narginchk.m
 delete mode 100644 matlab/missing/strjoin/strjoin.m
 delete mode 100644 matlab/missing/strsplit/private/ischarint.m
 delete mode 100644 matlab/missing/strsplit/private/ischarnum.m
 delete mode 100644 matlab/missing/strsplit/strsplit.m
 delete mode 100644 tests/data/test.xls
 delete mode 100644 tests/dates/data_uav.xls
 delete mode 100644 tests/recursive/data_ca1_xls.xls

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 33f4a41d47..8b5e309453 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,7 +2,7 @@ variables:
   GIT_SUBMODULE_STRATEGY: recursive
   TERM: linux
   MATLAB_VERSION: R2020a
-  OLD_MATLAB_VERSION: R2009b
+  OLD_MATLAB_VERSION: R2014a
 
 # The next stanza creates the version number used for the source tarball and the
 # binary packages. Here are the following possible cases:
diff --git a/doc/manual/source/installation-and-configuration.rst b/doc/manual/source/installation-and-configuration.rst
index 49651c5799..0de229401d 100644
--- a/doc/manual/source/installation-and-configuration.rst
+++ b/doc/manual/source/installation-and-configuration.rst
@@ -14,7 +14,7 @@ are necessary in that case.
 
 In order to run Dynare, you need one of the following:
 
-* MATLAB version 7.9 (R2009b) or above;
+* MATLAB version 8.3 (R2014a) or above;
 * GNU Octave version 4.4 or above, with the statistics package from
   `Octave-Forge`_. Note however that the Dynare installers for Windows and
   macOS require a more specific version of Octave, as indicated on the download
diff --git a/license.txt b/license.txt
index 5bda147d27..18e5e35bb9 100644
--- a/license.txt
+++ b/license.txt
@@ -207,12 +207,6 @@ Copyright: 1993-1996 Kurt Hornik
            2016-2017 Dynare Team
 License: GPL-3+
 
-Files: matlab/missing/strjoin/strjoin.m
-Copyright: 2013-2019 Ben Abbott
-           2007 Muthiah Annamalai
-           2019 Dynare Team
-License: GPL-3+
-
 Files: matlab/lmmcp/catstruct.m
 Copyright: 2005 Jos van der Geest <jos@jasen.nl>
            2013 Christophe Gouel
diff --git a/m4/ax_mexopts.m4 b/m4/ax_mexopts.m4
index 890397b61c..60fda3441a 100644
--- a/m4/ax_mexopts.m4
+++ b/m4/ax_mexopts.m4
@@ -22,7 +22,7 @@ AC_REQUIRE([AX_MATLAB_ARCH])
 AC_REQUIRE([AX_MATLAB_VERSION])
 AC_REQUIRE([AC_PROG_SED])
 
-AX_COMPARE_VERSION([$MATLAB_VERSION], [lt], [7.9], [AC_MSG_ERROR([Your MATLAB is too old, please upgrade to 7.9 (R2009b) at least.])])
+AX_COMPARE_VERSION([$MATLAB_VERSION], [lt], [8.3], [AC_MSG_ERROR([Your MATLAB is too old, please upgrade to 8.3 (R2014a) at least.])])
 
 AC_MSG_CHECKING([for options to compile MEX for MATLAB])
 
@@ -80,10 +80,6 @@ case ${MATLAB_ARCH} in
     ;;
 esac
 
-# Kludge for incompatibility of older MATLABs (≤ R2011a) with recent gcc
-# Include <uchar.h>, because matrix.h needs char16_t
-AX_COMPARE_VERSION([$MATLAB_VERSION], [le], [7.12], [MATLAB_CFLAGS="$MATLAB_CFLAGS -include uchar.h"])
-
 # Converts the MATLAB version number into comparable integers with only major and minor version numbers
 # For example, 7.4.2 will become 0704
 ax_matlab_ver=$(echo "$MATLAB_VERSION" | $SED -e 's/\([[0-9]]*\)\.\([[0-9]]*\).*/Z\1ZZ\2Z/' \
diff --git a/macOS/build.sh b/macOS/build.sh
index 55b78f7caa..c6af350ab1 100755
--- a/macOS/build.sh
+++ b/macOS/build.sh
@@ -88,7 +88,7 @@ make -j"$NTHREADS"
 NAME=dynare-"$VERSION"
 PKGFILES="$ROOTDIR"/macOS/pkg/"$NAME"
 mkdir -p \
-      "$PKGFILES"/mex/matlab/maci64-7.9-9.3 \
+      "$PKGFILES"/mex/matlab/maci64-8.3-9.3 \
       "$PKGFILES"/mex/matlab/maci64-9.4-9.8 \
       "$PKGFILES"/mex/octave \
       "$PKGFILES"/doc/dynare++ \
@@ -107,7 +107,7 @@ cp -p  "$ROOTDIR"/license.txt                                        "$PKGFILES"
 cp -pr "$ROOTDIR"/matlab                                             "$PKGFILES"
 cp -pr "$ROOTDIR"/examples                                           "$PKGFILES"
 
-cp -L  "$ROOTDIR"/mex/matlab/*                                       "$PKGFILES"/mex/matlab/maci64-7.9-9.3
+cp -L  "$ROOTDIR"/mex/matlab/*                                       "$PKGFILES"/mex/matlab/maci64-8.3-9.3
 
 cp -p  "$ROOTDIR"/scripts/dynare.el                                  "$PKGFILES"/scripts
 cp -pr "$ROOTDIR"/contrib/ms-sbvar/TZcode/MatlabFiles                "$PKGFILES"/contrib/ms-sbvar/TZcode
diff --git a/matlab/add_path_to_mex_files.m b/matlab/add_path_to_mex_files.m
index 85f2593030..0f0c4abd87 100644
--- a/matlab/add_path_to_mex_files.m
+++ b/matlab/add_path_to_mex_files.m
@@ -1,6 +1,6 @@
 function mexpath = add_path_to_mex_files(dynareroot, modifypath)
 
-% Copyright (C) 2015-2019 Dynare Team
+% Copyright (C) 2015-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -54,7 +54,7 @@ if isoctave
 else
     % Add win32 specific paths for Dynare Windows package
     if strcmp(computer, 'PCWIN')
-        tmp = [dynareroot '../mex/matlab/win32-7.9-8.6/'];
+        tmp = [dynareroot '../mex/matlab/win32-8.3-8.6/'];
         if exist(tmp, 'dir')
             mexpath = tmp;
             if modifypath
@@ -65,7 +65,7 @@ else
     % Add win64 specific paths for Dynare Windows package
     if strcmp(computer, 'PCWIN64')
         if matlab_ver_less_than('9.4')
-            tmp = [dynareroot '../mex/matlab/win64-7.9-9.3/'];
+            tmp = [dynareroot '../mex/matlab/win64-8.3-9.3/'];
             if exist(tmp, 'dir')
                 mexpath = tmp;
                 if modifypath
@@ -85,7 +85,7 @@ else
     % Add macOS paths for Dynare Mac package
     if strcmp(computer, 'MACI64')
         if matlab_ver_less_than('9.4')
-            tmp = [dynareroot '../mex/matlab/maci64-7.9-9.3/'];
+            tmp = [dynareroot '../mex/matlab/maci64-8.3-9.3/'];
             if exist(tmp, 'dir')
                 mexpath = tmp;
                 if modifypath
diff --git a/matlab/compute_moments_varendo.m b/matlab/compute_moments_varendo.m
index 4bfabce340..21f5201f00 100644
--- a/matlab/compute_moments_varendo.m
+++ b/matlab/compute_moments_varendo.m
@@ -17,7 +17,7 @@ function oo_ = compute_moments_varendo(type, options_, M_, oo_, var_list_)
 % SPECIAL REQUIREMENTS
 %   none
 
-% Copyright (C) 2008-2018 Dynare Team
+% Copyright (C) 2008-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -145,7 +145,7 @@ if M_.exo_nbr > 1
     end
     skipline();
     if ~all(M_.H==0)
-        if isoctave || matlab_ver_less_than('8.1')
+        if isoctave
             [observable_name_requested_vars, varlist_pos] = intersect_stable(var_list_, options_.varobs);
         else
             [observable_name_requested_vars, varlist_pos] = intersect(var_list_, options_.varobs, 'stable');
diff --git a/matlab/conditional_variance_decomposition.m b/matlab/conditional_variance_decomposition.m
index 4ef81da553..45fe803bdc 100644
--- a/matlab/conditional_variance_decomposition.m
+++ b/matlab/conditional_variance_decomposition.m
@@ -17,7 +17,7 @@ function [ConditionalVarianceDecomposition, ConditionalVarianceDecomposition_ME]
 %                                                    h is the number of Steps
 %                                                    p is the number of state innovations and
 
-% Copyright (C) 2010-2017 Dynare Team
+% Copyright (C) 2010-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -89,7 +89,7 @@ end
 % Measurement error
 
 if ~all(StateSpaceModel.measurement_error==0)
-    if isoctave || matlab_ver_less_than('8.1')
+    if isoctave
         [observable_pos,index_subset,index_observables]=intersect_stable(SubsetOfVariables,StateSpaceModel.observable_pos);
     else
         [observable_pos,index_subset,index_observables]=intersect(SubsetOfVariables,StateSpaceModel.observable_pos,'stable');
diff --git a/matlab/conditional_variance_decomposition_ME_mc_analysis.m b/matlab/conditional_variance_decomposition_ME_mc_analysis.m
index cfe9a1b155..a0b5ffdd7a 100644
--- a/matlab/conditional_variance_decomposition_ME_mc_analysis.m
+++ b/matlab/conditional_variance_decomposition_ME_mc_analysis.m
@@ -22,7 +22,7 @@ function oo_ = ...
 % OUTPUTS
 %   oo_          [structure]        Dynare structure where the results are saved.
 
-% Copyright (C) 2017-2018 Dynare Team
+% Copyright (C) 2017-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -63,7 +63,7 @@ if isempty(exogenous_variable_index)
     end
 end
 
-if isoctave || matlab_ver_less_than('8.1')
+if isoctave
     [observable_pos_requested_vars,index_subset,index_observables]=intersect_stable(var_list,options_.varobs);
 else
     [observable_pos_requested_vars,index_subset,index_observables]=intersect(var_list,options_.varobs,'stable');
diff --git a/matlab/disp_moments.m b/matlab/disp_moments.m
index 8223ba4f92..cd819cb99a 100644
--- a/matlab/disp_moments.m
+++ b/matlab/disp_moments.m
@@ -11,7 +11,7 @@ function oo_=disp_moments(y,var_list,M_,options_,oo_)
 % OUTPUTS
 %   oo_                 [structure]    Dynare's results structure,
 
-% Copyright (C) 2001-2019 Dynare Team
+% Copyright (C) 2001-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -50,7 +50,7 @@ y = y(ivar,options_.drop+1:end)';
 
 ME_present=0;
 if ~all(M_.H==0)
-    if isoctave || matlab_ver_less_than('8.1')
+    if isoctave
         [observable_pos_requested_vars, index_subset, index_observables] = intersect_stable(ivar, options_.varobs_id);
     else
         [observable_pos_requested_vars, index_subset, index_observables] = intersect(ivar, options_.varobs_id, 'stable');
diff --git a/matlab/disp_th_moments.m b/matlab/disp_th_moments.m
index 33fdb7100b..6fd28a0d65 100644
--- a/matlab/disp_th_moments.m
+++ b/matlab/disp_th_moments.m
@@ -2,7 +2,7 @@ function oo_ = disp_th_moments(dr, var_list, M_, options_, oo_)
 
 % Display theoretical moments of variables
 
-% Copyright (C) 2001-2018 Dynare Team
+% Copyright (C) 2001-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -55,7 +55,7 @@ oo_.var = oo_.gamma_y{1};
 
 ME_present=0;
 if ~all(M_.H==0)
-    if isoctave || matlab_ver_less_than('8.1')
+    if isoctave
         [observable_pos_requested_vars,index_subset,index_observables]=intersect_stable(ivar,options_.varobs_id);
     else
         [observable_pos_requested_vars,index_subset,index_observables]=intersect(ivar,options_.varobs_id,'stable');
@@ -105,7 +105,7 @@ if size(stationary_vars, 1) > 0
             lh = cellofchararraymaxlength(M_.endo_names(ivar(stationary_vars)))+2;
             dyntable(options_, title, headers, M_.endo_names(ivar(stationary_vars)), 100*oo_.gamma_y{options_.ar+2}(stationary_vars,:), lh, 8, 2);
             if ME_present
-                if isoctave || matlab_ver_less_than('8.1')
+                if isoctave
                     [stationary_observables, pos_index_subset] = intersect_stable(index_subset, stationary_vars);
                 else
                     [stationary_observables, pos_index_subset] = intersect(index_subset, stationary_vars, 'stable');
diff --git a/matlab/distributions/lpdfgweibull.m b/matlab/distributions/lpdfgweibull.m
index 7848b35469..5d31e23802 100644
--- a/matlab/distributions/lpdfgweibull.m
+++ b/matlab/distributions/lpdfgweibull.m
@@ -16,7 +16,7 @@ function [ldens,Dldens,D2ldens] = lpdfgweibull(x,a,b,c)  % --*-- Unitary tests -
 % SPECIAL REQUIREMENTS
 %    none
 
-% Copyright (C) 2015-2017 Dynare Team
+% Copyright (C) 2015-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -205,7 +205,7 @@ end
 %$ density  = @(x) exp(lpdfgweibull(x,shape,scale));
 %$
 %$ try
-%$    if isoctave || matlab_ver_less_than('7.14')
+%$    if isoctave
 %$        s = quadl(density, .0000000001, 100000, 1e-10);
 %$    else
 %$        s = integral(density, 0, 100000);
@@ -228,7 +228,7 @@ end
 %$ density  = @(x) exp(lpdfgweibull(x,shape,scale));
 %$
 %$ try
-%$    if isoctave || matlab_ver_less_than('7.14')
+%$    if isoctave
 %$        s = quadl(density, .0000000001, 100000, 1e-10);
 %$    else
 %$        s = integral(density, 0, 100000);
@@ -251,7 +251,7 @@ end
 %$ density  = @(x) exp(lpdfgweibull(x,shape,scale));
 %$
 %$ try
-%$    if isoctave || matlab_ver_less_than('7.14')
+%$    if isoctave
 %$        s = quadl(density, .0000000001, 100000, 1e-10);
 %$    else
 %$        s = integral(density, 0, 100000);
@@ -262,7 +262,7 @@ end
 %$ end
 %$
 %$ if t(1)
-%$        if isoctave || matlab_ver_less_than('7.14')
+%$        if isoctave
 %$            t(2) = abs(s-1)<5e-5;
 %$        else
 %$            t(2) = abs(s-1)<1e-6;
@@ -280,8 +280,6 @@ end
 %$ try
 %$    if isoctave
 %$        s = quadgk(xdens, .0000000001, 100000, 1e-10);
-%$    elseif matlab_ver_less_than('7.14')
-%$        s = quadgk(xdens, .0000000001, 100000, 'AbsTol', 1e-10);
 %$    else
 %$        s = integral(xdens, 0, 100000);
 %$    end
@@ -303,7 +301,7 @@ end
 %$ xdens = @(x) x.*exp(lpdfgweibull(x,shape,scale));
 %$
 %$ try
-%$    if isoctave || matlab_ver_less_than('7.14')
+%$    if isoctave
 %$        s = quadl(xdens, .0000000001, 100000, 1e-10);
 %$    else
 %$        s = integral(xdens, 0, 100000);
@@ -326,7 +324,7 @@ end
 %$ xdens = @(x) x.*exp(lpdfgweibull(x,shape,scale));
 %$
 %$ try
-%$    if isoctave || matlab_ver_less_than('7.14')
+%$    if isoctave
 %$        s = quadl(xdens, .0000000001, 100000, 1e-10);
 %$    else
 %$        s = integral(xdens, 0, 100000);
@@ -352,7 +350,7 @@ end
 %$ try
 %$    s = NaN(n, 1);
 %$    for i=1:n
-%$        if isoctave || matlab_ver_less_than('7.14')
+%$        if isoctave
 %$             s(i) = quadl(density, .0000000001, .1*i, 1e-10);
 %$        else
 %$            s(i) = integral(density, 0, .1*i);
@@ -383,7 +381,7 @@ end
 %$ try
 %$    s = NaN(n, 1);
 %$    for i=1:n
-%$        if isoctave || matlab_ver_less_than('7.14')
+%$        if isoctave
 %$            s(i) = quadl(density, .0000000001, .1*i, 1e-10);
 %$        else
 %$            s(i) = integral(density, 0, .1*i);
@@ -414,7 +412,7 @@ end
 %$ try
 %$    s = NaN(n, 1);
 %$    for i=1:n
-%$        if isoctave || matlab_ver_less_than('7.14')
+%$        if isoctave
 %$            s(i) = quadl(density, .0000000001, .1*i, 1e-10);
 %$        else
 %$            s(i) = integral(density, 0, .1*i);
@@ -429,7 +427,7 @@ end
 %$    for i=1:n
 %$        x = .1*i;
 %$        q = 1-exp(-(x/scale)^shape);
-%$        if isoctave || matlab_ver_less_than('7.14')
+%$        if isoctave
 %$            t(i+1) = abs(s(i)-q)<5e-5;
 %$        else
 %$            t(i+1) = abs(s(i)-q)<1e-6;
diff --git a/matlab/dsge_simulated_theoretical_conditional_variance_decomposition.m b/matlab/dsge_simulated_theoretical_conditional_variance_decomposition.m
index 540b2e2392..4195b58a91 100644
--- a/matlab/dsge_simulated_theoretical_conditional_variance_decomposition.m
+++ b/matlab/dsge_simulated_theoretical_conditional_variance_decomposition.m
@@ -83,7 +83,7 @@ MaXNumberOfConditionalDecompLines = ceil(options_.MaxNumberOfBytes/NumberOfSaved
 
 ME_present=0;
 if ~all(M_.H==0)
-    if isoctave || matlab_ver_less_than('8.1')
+    if isoctave
         [observable_pos_requested_vars,index_subset,index_observables]=intersect_stable(ivar,options_.varobs_id);
     else
         [observable_pos_requested_vars,index_subset,index_observables]=intersect(ivar,options_.varobs_id,'stable');
diff --git a/matlab/dsge_simulated_theoretical_variance_decomposition.m b/matlab/dsge_simulated_theoretical_variance_decomposition.m
index 7e6942c194..71febcf473 100644
--- a/matlab/dsge_simulated_theoretical_variance_decomposition.m
+++ b/matlab/dsge_simulated_theoretical_variance_decomposition.m
@@ -86,7 +86,7 @@ MaXNumberOfDecompLines = ceil(options_.MaxNumberOfBytes/NumberOfSavedElementsPer
 
 ME_present=0;
 if ~all(M_.H==0)
-    if isoctave || matlab_ver_less_than('8.1')
+    if isoctave
         [observable_pos_requested_vars,index_subset,index_observables]=intersect_stable(ivar,options_.varobs_id);
     else
         [observable_pos_requested_vars,index_subset,index_observables]=intersect(ivar,options_.varobs_id,'stable');
diff --git a/matlab/dynare.m b/matlab/dynare.m
index 32ea530d9a..27b027d675 100644
--- a/matlab/dynare.m
+++ b/matlab/dynare.m
@@ -82,10 +82,10 @@ if isoctave
         skipline()
     end
 else
-    if matlab_ver_less_than('7.9') % Should match the test in mex/build/matlab/configure.ac
+    if matlab_ver_less_than('8.3') % Should match the test in mex/build/matlab/configure.ac
                                    % and in m4/ax_mexopts.m4
         skipline()
-        warning('This version of Dynare has only been tested on MATLAB 7.9 (R2009b) and above. Since your MATLAB version is older than that, Dynare may fail to run, or give unexpected results. Consider upgrading your MATLAB installation, or switch to Octave.');
+        warning('This version of Dynare has only been tested on MATLAB 8.3 (R2014a) and above. Since your MATLAB version is older than that, Dynare may fail to run, or give unexpected results. Consider upgrading your MATLAB installation, or switch to Octave.');
         skipline()
     end
 end
diff --git a/matlab/dynare_config.m b/matlab/dynare_config.m
index 8a08d72b79..ee74ebf11a 100644
--- a/matlab/dynare_config.m
+++ b/matlab/dynare_config.m
@@ -87,8 +87,8 @@ if isoctave && octave_ver_less_than('5')
     p{end+1} = '/missing/ordeig';
 end
 
-%% intersect(…, 'stable') doesn't exist in Octave and in MATLAB < R2013a
-if isoctave || matlab_ver_less_than('8.1')
+%% intersect(…, 'stable') doesn't exist in Octave
+if isoctave
     p{end+1} = '/missing/intersect_stable';
 end
 
@@ -116,33 +116,12 @@ if (isoctave && octave_ver_less_than('5')) || (~isoctave && matlab_ver_less_than
     p{end+1} = '/missing/isfile';
 end
 
-% strsplit and strjoin are missing in MATLAB < R2013a
-if ~isoctave && matlab_ver_less_than('8.1')
-    p{end+1} = '/missing/strsplit';
-    p{end+1} = '/missing/strjoin';
-end
-
 % contains and splitlines don't exist in Octave and in MATLAB < R2016b
 if isoctave || matlab_ver_less_than('9.1')
     p{end+1} = '/missing/contains';
     p{end+1} = '/missing/splitlines';
 end
 
-% isrow, iscolumn and ismatrix are missing in Matlab<R2010b
-if ~isoctave && matlab_ver_less_than('7.11')
-    p{end+1} = '/missing/is-row-column-matrix';
-end
-
-%% isdiag is missing in MATLAB < R2014a
-if ~isoctave && matlab_ver_less_than('8.3')
-    p{end+1} = '/missing/isdiag';
-end
-
-%% narginchk is missing in MATLAB < R2011b
-if ~isoctave && matlab_ver_less_than('7.13')
-    p{end+1} = '/missing/narginchk';
-end
-
 P = cellfun(@(c)[dynareroot(1:end-1) c], p, 'uni',false);
 
 % Get mex files folder(s)
diff --git a/matlab/get_dynare_random_generator_state.m b/matlab/get_dynare_random_generator_state.m
index bf01db4a5f..9aef9a288e 100644
--- a/matlab/get_dynare_random_generator_state.m
+++ b/matlab/get_dynare_random_generator_state.m
@@ -6,7 +6,7 @@ function [state_u,state_n] = get_dynare_random_generator_state()
 % For backward compatibility, we return two vectors, but, in recent
 % versions of Matlab and in Octave, we return two identical vectors.
 
-% Copyright (C) 2010-2017 Dynare Team
+% Copyright (C) 2010-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -23,14 +23,8 @@ function [state_u,state_n] = get_dynare_random_generator_state()
 % You should have received a copy of the GNU General Public License
 % along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
 
-matlab_random_streams = ~isoctave;
-
-if matlab_random_streams% Use new matlab interface.
-    if matlab_ver_less_than('7.12')
-        s = RandStream.getDefaultStream();
-    else
-        s = RandStream.getGlobalStream();
-    end
+if ~isoctave
+    s = RandStream.getGlobalStream();
     if isequal(s.Type,'legacy')
         state_u = rand('state');
         state_n = randn('state');
@@ -38,7 +32,7 @@ if matlab_random_streams% Use new matlab interface.
         state_u = s.State;
         state_n = state_u;
     end
-else% Use old matlab interface.
+else
     state_u = rand('state');
     state_n = randn('state');
-end
\ No newline at end of file
+end
diff --git a/matlab/identification_analysis.m b/matlab/identification_analysis.m
index 75d429182b..a8a9c7e174 100644
--- a/matlab/identification_analysis.m
+++ b/matlab/identification_analysis.m
@@ -327,7 +327,7 @@ if info(1) == 0 %no errors in solution
                 cmm = simulated_moment_uncertainty(ind_dMOMENTS, periods, replic,options_,M_,oo_); %covariance matrix of moments
                 sd = sqrt(diag(cmm));
                 cc = cmm./(sd*sd');
-                if isoctave || matlab_ver_less_than('8.3')
+                if isoctave
                     [VV,DD] = eig(cc);
                     %fix for older Matlab versions that do not support computing left eigenvalues, see http://mathworks.com/help/releases/R2012b/matlab/ref/eig.html
                     [WW,~] = eig(cc.');
@@ -536,4 +536,4 @@ if info(1) == 0 %no errors in solution
                 identification_checks(tilda_dSPECTRUM, 3, tol_rank, tol_sv, totparam_nbr);
         end
     end
-end
\ No newline at end of file
+end
diff --git a/matlab/missing/is-row-column-matrix/iscolumn.m b/matlab/missing/is-row-column-matrix/iscolumn.m
deleted file mode 100644
index 0264efe198..0000000000
--- a/matlab/missing/is-row-column-matrix/iscolumn.m
+++ /dev/null
@@ -1,20 +0,0 @@
-function r = iscolumn(V)
-% Copyright (C) 2018 Dynare Team
-%
-% This file is part of Dynare.
-%
-% Dynare is free software: you can redistribute it and/or modify
-% it under the terms of the GNU General Public License as published by
-% the Free Software Foundation, either version 3 of the License, or
-% (at your option) any later version.
-%
-% Dynare is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
-
-sz = size(V);
-r = (length(sz) == 2) && (sz(2) == 1);
diff --git a/matlab/missing/is-row-column-matrix/ismatrix.m b/matlab/missing/is-row-column-matrix/ismatrix.m
deleted file mode 100644
index e9ed4ef2db..0000000000
--- a/matlab/missing/is-row-column-matrix/ismatrix.m
+++ /dev/null
@@ -1,19 +0,0 @@
-function r = ismatrix(V)
-% Copyright (C) 2018 Dynare Team
-%
-% This file is part of Dynare.
-%
-% Dynare is free software: you can redistribute it and/or modify
-% it under the terms of the GNU General Public License as published by
-% the Free Software Foundation, either version 3 of the License, or
-% (at your option) any later version.
-%
-% Dynare is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
-
-r = (ndims(V) == 2);
diff --git a/matlab/missing/is-row-column-matrix/isrow.m b/matlab/missing/is-row-column-matrix/isrow.m
deleted file mode 100644
index ef53534ede..0000000000
--- a/matlab/missing/is-row-column-matrix/isrow.m
+++ /dev/null
@@ -1,20 +0,0 @@
-function r = isrow(V)
-% Copyright (C) 2018 Dynare Team
-%
-% This file is part of Dynare.
-%
-% Dynare is free software: you can redistribute it and/or modify
-% it under the terms of the GNU General Public License as published by
-% the Free Software Foundation, either version 3 of the License, or
-% (at your option) any later version.
-%
-% Dynare is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
-
-sz = size(V);
-r = (length(sz) == 2) && (sz(1) == 1);
diff --git a/matlab/missing/isdiag/isdiag.m b/matlab/missing/isdiag/isdiag.m
deleted file mode 100644
index 89dcec2f16..0000000000
--- a/matlab/missing/isdiag/isdiag.m
+++ /dev/null
@@ -1,62 +0,0 @@
-function b = isdiag(A) % --*-- Unitary tests --*--
-
-% Copyright (C) 2014-2017 Dynare Team
-%
-% This file is part of Dynare.
-%
-% Dynare is free software: you can redistribute it and/or modify
-% it under the terms of the GNU General Public License as published by
-% the Free Software Foundation, either version 3 of the License, or
-% (at your option) any later version.
-%
-% Dynare is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
-
-if isnumeric(A)
-    if isquare(A)
-        % Find non zero elements in matrix A...
-        [ir, ic] = find(A);
-        % If the non zero elements are on the diagonal, the corresponding elements
-        % in ir and ic (row and column numbers) should be equal.
-        b = isequal(ir, ic);
-    else
-        error('isdiag: Input must be a square matrix!')
-    end
-else
-    error('isdiag: Input must be numeric!')
-end
-
-%@test:1
-%$ A = zeros(3,3);
-%$ t = isdiag(A);
-%$ T = all(t);
-%@eof:1
-
-%@test:2
-%$ A = zeros(3,3); A(1,3) = 1;
-%$ t = ~isdiag(A);
-%$ T = all(t);
-%@eof:2
-
-%@test:3
-%$ A = randn(3,3);
-%$ t = ~isdiag(A);
-%$ T = all(t);
-%@eof:3
-
-%@test:4
-%$ A = diag(randn(3,1));
-%$ t = isdiag(A);
-%$ T = all(t);
-%@eof:4
-
-%@test:5
-%$ A = diag(randn(3,1)); A(1,1) = 0;
-%$ t = isdiag(A);
-%$ T = all(t);
-%@eof:5
diff --git a/matlab/missing/narginchk/narginchk.m b/matlab/missing/narginchk/narginchk.m
deleted file mode 100644
index 645f3afaa7..0000000000
--- a/matlab/missing/narginchk/narginchk.m
+++ /dev/null
@@ -1,28 +0,0 @@
-function narginchk(minArgs,maxArgs)
-
-% Copyright (C) 2019 Dynare Team
-%
-% This file is part of Dynare.
-%
-% Dynare is free software: you can redistribute it and/or modify
-% it under the terms of the GNU General Public License as published by
-% the Free Software Foundation, either version 3 of the License, or
-% (at your option) any later version.
-%
-% Dynare is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
-
-n = evalin('caller', 'nargin;');
-
-if n < minArgs
-    error('narginchk: not enough input arguments');
-end
-
-if n > maxArgs
-    error('narginchk: too many input arguments');
-end
diff --git a/matlab/missing/stats/wblinv.m b/matlab/missing/stats/wblinv.m
index 105a6cf7e8..af537a7c38 100644
--- a/matlab/missing/stats/wblinv.m
+++ b/matlab/missing/stats/wblinv.m
@@ -10,7 +10,7 @@ function t = wblinv(proba, scale, shape)   % --*-- Unitary tests --*--
 % OUTPUTS
 % - t     [double] scalar such that P(X<=t)=proba
 
-% Copyright (C) 2015-2017 Dynare Team
+% Copyright (C) 2015-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -147,7 +147,7 @@ t = exp(log(scale)+log(-log(1-proba))/shape);
 %$           if debug
 %$               [shape, scale, x(k-1)]
 %$           end
-%$           if isoctave || matlab_ver_less_than('7.14')
+%$           if isoctave
 %$               s = quadv(density, 0, x(k-1),1e-10);
 %$           else
 %$               s = integral(density, 0, x(k-1));
@@ -155,7 +155,7 @@ t = exp(log(scale)+log(-log(1-proba))/shape);
 %$           if debug
 %$               [s, abs(p-s)]
 %$           end
-%$         if isoctave || matlab_ver_less_than('7.14')
+%$         if isoctave
 %$           t(k) = abs(p-s)<1e-9;
 %$         else
 %$           t(k) = abs(p-s)<1e-12;
diff --git a/matlab/missing/strjoin/strjoin.m b/matlab/missing/strjoin/strjoin.m
deleted file mode 100644
index 47f21287fc..0000000000
--- a/matlab/missing/strjoin/strjoin.m
+++ /dev/null
@@ -1,62 +0,0 @@
-function rval = strjoin (cstr, delimiter)
-
-% Adapted from Octave's implementation of strjoin
-%
-% Limitation: escaped characters (e.g. '\n') in delimiters will not be
-% interpreted as the characters they represent.
-
-% Copyright (C) 2013-2019 Ben Abbott
-% Copyright (C) 2007 Muthiah Annamalai
-% Copyright (C) 2019 Dynare Team
-%
-% This file is part of Dynare.
-%
-% Dynare is free software: you can redistribute it and/or modify
-% it under the terms of the GNU General Public License as published by
-% the Free Software Foundation, either version 3 of the License, or
-% (at your option) any later version.
-%
-% Dynare is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
-
-if nargin == 1
-    delimiter = ' ';
-elseif nargin < 1 || nargin > 2
-    error('strjoin: must have either one or two arguments')
-end
-if ~(iscellstr(cstr) && (ischar(delimiter) || iscellstr(delimiter)))
-    error('strjoin: first argument must be a cell array, second array either a char array or a cell array')
-end
-
-if numel(cstr) == 1
-    rval = cstr{1};
-    return;
-end
-
-if ischar(delimiter)
-    % There is no equivalent to do_string_escapes in MATLAB
-    %delimiter = do_string_escapes(delimiter);
-    delimiter = {delimiter};
-end
-
-num = numel(cstr);
-if numel(delimiter) == 1 && num > 1
-    delimiter = repmat(delimiter, 1, num);
-    delimiter(end) = {''};
-elseif num > 0 && numel(delimiter) ~= num - 1
-    error('strjoin: the number of delimiters does not match the number of strings');
-else
-    delimiter(end+1) = {''};
-end
-
-if num == 0
-    rval = '';
-else
-    tmp = [cstr(:).'; delimiter(:).'];
-    rval = [tmp{:}];
-end
diff --git a/matlab/missing/strsplit/private/ischarint.m b/matlab/missing/strsplit/private/ischarint.m
deleted file mode 100644
index d325015d4d..0000000000
--- a/matlab/missing/strsplit/private/ischarint.m
+++ /dev/null
@@ -1,27 +0,0 @@
-function l = ischarint(x)
-
-% Returns true if and only if char x represents an integer.
-
-% Copyright © 2018 DynareTeam
-%
-% This file is part of Dynare.
-%
-% Dynare is free software: you can redistribute it and/or modify
-% it under the terms of the GNU General Public License as published by
-% the Free Software Foundation, either version 3 of the License, or
-% (at your option) any later version.
-%
-% Dynare is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
-
-s = warning;
-warning off;
-
-l = isint(str2double(x));
-
-warning(s);
\ No newline at end of file
diff --git a/matlab/missing/strsplit/private/ischarnum.m b/matlab/missing/strsplit/private/ischarnum.m
deleted file mode 100644
index 57b7c7e8cd..0000000000
--- a/matlab/missing/strsplit/private/ischarnum.m
+++ /dev/null
@@ -1,35 +0,0 @@
-function l = ischarnum(x)
-
-% Returns true if and only if char x represents a real number.
-
-% Copyright © 2018 DynareTeam
-%
-% This file is part of Dynare.
-%
-% Dynare is free software: you can redistribute it and/or modify
-% it under the terms of the GNU General Public License as published by
-% the Free Software Foundation, either version 3 of the License, or
-% (at your option) any later version.
-%
-% Dynare is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
-
-l = false;
-
-s = warning;
-warning off;
-
-number = str2double(x);
-
-warning(s);
-
-if ~isempty(number)
-    if isreal(number)
-        l = true;
-    end
-end
\ No newline at end of file
diff --git a/matlab/missing/strsplit/strsplit.m b/matlab/missing/strsplit/strsplit.m
deleted file mode 100644
index 926bb50f38..0000000000
--- a/matlab/missing/strsplit/strsplit.m
+++ /dev/null
@@ -1,90 +0,0 @@
-function tok = strsplit(str, delimiters)
-
-% Splits a string into multiple terms.
-%
-% INPUTS
-% - str        [char]                String to be splitted.
-% - delimiters [char, cell(char)]    Delimiters.
-%
-% OUTPUTS
-% - tok        [cell(char)]          Terms.
-
-% Copyright © 2018 DynareTeam
-%
-% This file is part of Dynare.
-%
-% Dynare is free software: you can redistribute it and/or modify
-% it under the terms of the GNU General Public License as published by
-% the Free Software Foundation, either version 3 of the License, or
-% (at your option) any later version.
-%
-% Dynare is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
-
-remove_empty = true;
-remove_numbers = false;
-
-% Check first input arguments
-assert(ischar(str) && ndims(str)==2 && size(str,1)<=1, 'The first arugment has to be a row char array!');
-
-% Set default value for second input arguments
-if nargin<2
-    delimiters = {' '};
-end
-
-% If second input argument is a char transform it into a sigleton cell of char
-if nargin>1
-    if ischar(delimiters)
-        assert(ndims(delimiters)==2 && size(delimiters,1)==1, 'The second input argument has to be be a char string!');
-        delimiters = {delimiters};
-    end
-end
-
-% Check that `delimiters` is a one dimensional cell
-assert(ndim(delimiters)<=1, 'The second input argument has to be a one dimensional cell array!')
-
-% Check that `delimiters` is a cell of row char arrays
-assert(all(cellfun(@ischar, delimiters)) && all(cellfun(@rows, delimiters)==1), 'The second input argument has to be a cell of row char arrays!')
-
-% If space is one of the delimiters obtain the index in `delimiters`
-idspace = strmatch(' ', delimiters);
-
-% Get the number of delimiters
-n = length(delimiters);
-
-% Remove unnecessary spaces
-delimiters(setdiff(1:n, idspace)) = strtrim(delimiters(setdiff(1:n, idspace)));
-
-% Join all the delimiters (strjoin is not available with matlab version less than R2013a)
-if n>1
-    delimiter = '';
-    for i=1:n
-        if isspace(delimiters{i})
-            delimiter = horzcat(delimiter, '\s');
-        else
-            delimiter = horzcat(delimiter, delimiters{i});
-        end
-        delimiter = horzcat(delimiter,'|');
-    end
-    delimiter = horzcat(delimiter, '\W');
-else
-    delimiter = delimiters{1};
-end
-
-% Get tokens
-tok = regexp(str, delimiter, 'split');
-
-if remove_empty
-    % Remove empty tokens
-    tok = tok(find(~cellfun(@isempty, tok)));
-end
-
-if remove_numbers
-    % Remove numbers
-    tok = tok(find(~cellfun(@ischarnum, tok)));
-end
\ No newline at end of file
diff --git a/matlab/modules/dseries b/matlab/modules/dseries
index 59739c38d9..a4479b5cb5 160000
--- a/matlab/modules/dseries
+++ b/matlab/modules/dseries
@@ -1 +1 @@
-Subproject commit 59739c38d9253990dddf8f6a7c88a81f6a72d66b
+Subproject commit a4479b5cb56b0f2b83d567652735c5410254f0fb
diff --git a/matlab/modules/reporting b/matlab/modules/reporting
index a25d3abdb6..13c98b256d 160000
--- a/matlab/modules/reporting
+++ b/matlab/modules/reporting
@@ -1 +1 @@
-Subproject commit a25d3abdb6312d619352a7b276c70ec98b3d5f00
+Subproject commit 13c98b256d8d42f62692aa9d48d379e897f2ca5e
diff --git a/matlab/posterior_analysis.m b/matlab/posterior_analysis.m
index 16088823d2..65735025c2 100644
--- a/matlab/posterior_analysis.m
+++ b/matlab/posterior_analysis.m
@@ -1,6 +1,6 @@
 function oo_ = posterior_analysis(type,arg1,arg2,arg3,options_,M_,oo_)
 
-% Copyright (C) 2008-2018 Dynare Team
+% Copyright (C) 2008-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -66,7 +66,7 @@ switch type
                                              M_.exo_names,arg2,vartan,arg1,options_.mh_conf_sig,oo_,options_);
     if ~all(M_.H==0)
         if strmatch(arg1,options_.varobs,'exact')
-            if isoctave || matlab_ver_less_than('8.1')
+            if isoctave
                 [observable_name_requested_vars,index_subset,index_observables]=intersect_stable(vartan,options_.varobs);
             else
                 [observable_name_requested_vars,index_subset,index_observables]=intersect(vartan,options_.varobs,'stable');
diff --git a/matlab/set_dynare_random_generator_state.m b/matlab/set_dynare_random_generator_state.m
index 8854576d9e..03df1cb51f 100644
--- a/matlab/set_dynare_random_generator_state.m
+++ b/matlab/set_dynare_random_generator_state.m
@@ -6,7 +6,7 @@ function [state_u,state_n] = set_dynare_random_generator_state(state_u,state_n)
 % For backward compatibility, we return two vectors, but, in recent
 % versions of Matlab and in Octave, we return two identical vectors.
 %
-% Copyright (C) 2010-2017 Dynare Team
+% Copyright (C) 2010-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -23,14 +23,8 @@ function [state_u,state_n] = set_dynare_random_generator_state(state_u,state_n)
 % You should have received a copy of the GNU General Public License
 % along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
 
-matlab_random_streams = ~isoctave;
-
-if matlab_random_streams% Use new matlab interface.
-    if matlab_ver_less_than('7.12')
-        s = RandStream.getDefaultStream();
-    else
-        s = RandStream.getGlobalStream();
-    end
+if ~isoctave
+    s = RandStream.getGlobalStream();
     if isequal(s.Type,'legacy')
         rand('state',state_u);
         randn('state',state_n);
@@ -47,13 +41,9 @@ if matlab_random_streams% Use new matlab interface.
                    'please, contact Dynare''s development team.'])
         end
         s.State = state_u;
-        if matlab_ver_less_than('7.12')
-            RandStream.setDefaultStream(s);
-        else
-            RandStream.setGlobalStream(s);
-        end
+        RandStream.setGlobalStream(s);
     end
-else% Use old matlab interface.
+else
     rand('state',state_u);
     randn('state',state_n);
-end
\ No newline at end of file
+end
diff --git a/matlab/set_dynare_seed.m b/matlab/set_dynare_seed.m
index 89feb1961f..dd6b117f2f 100644
--- a/matlab/set_dynare_seed.m
+++ b/matlab/set_dynare_seed.m
@@ -2,7 +2,7 @@ function set_dynare_seed(a,b)
 % Set seeds depending on matlab (octave) version. This routine is called in dynare_config and can be called by the
 % user in the mod file.
 %
-% Copyright (C) 2010-2017 Dynare Team
+% Copyright (C) 2010-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -32,20 +32,12 @@ if matlab_random_streams% Use new matlab interface.
             options_.DynareRandomStreams.algo = 'mt19937ar';
             options_.DynareRandomStreams.seed = 0;
             s = RandStream(options_.DynareRandomStreams.algo,'Seed',options_.DynareRandomStreams.seed);
-            if matlab_ver_less_than('7.12')
-                reset(RandStream.setDefaultStream(s));
-            else
-                reset(RandStream.setGlobalStream(s));
-            end
+            reset(RandStream.setGlobalStream(s));
             return
         end
         if ischar(a) && strcmpi(a,'reset')
             s = RandStream(options_.DynareRandomStreams.algo,'Seed',options_.DynareRandomStreams.seed);
-            if matlab_ver_less_than('7.12')
-                reset(RandStream.setDefaultStream(s));
-            else
-                reset(RandStream.setGlobalStream(s));
-            end
+            reset(RandStream.setGlobalStream(s));
             return
         end
         if ~ischar(a) || (ischar(a) && strcmpi(a, 'clock'))
@@ -56,11 +48,7 @@ if matlab_random_streams% Use new matlab interface.
                 options_.DynareRandomStreams.seed = a;
             end
             s = RandStream(options_.DynareRandomStreams.algo,'Seed',options_.DynareRandomStreams.seed);
-            if matlab_ver_less_than('7.12')
-                reset(RandStream.setDefaultStream(s));
-            else
-                reset(RandStream.setGlobalStream(s));
-            end
+            reset(RandStream.setGlobalStream(s));
             return
         end
         error('set_dynare_seed:: something is wrong in the calling sequence!')
@@ -84,11 +72,7 @@ if matlab_random_streams% Use new matlab interface.
         options_.DynareRandomStreams.algo = a;
         options_.DynareRandomStreams.seed = b;
         s = RandStream(options_.DynareRandomStreams.algo,'Seed',options_.DynareRandomStreams.seed);
-        if matlab_ver_less_than('7.12')
-            reset(RandStream.setDefaultStream(s));
-        else
-            reset(RandStream.setGlobalStream(s));
-        end
+        reset(RandStream.setGlobalStream(s));
     end
 else% Use old matlab interface.
     if nargin==1
@@ -122,4 +106,4 @@ else% Use old matlab interface.
     else
         error('set_dynare_seed:: Cannot use more than one input argument with your version of Matlab/Octave!')
     end
-end
\ No newline at end of file
+end
diff --git a/matlab/simulated_moments_estimation.m b/matlab/simulated_moments_estimation.m
index 4a99ec77ea..459b6a0060 100644
--- a/matlab/simulated_moments_estimation.m
+++ b/matlab/simulated_moments_estimation.m
@@ -14,7 +14,7 @@ function [param,sigma] = simulated_moments_estimation(dataset,options,parallel)
 % SPECIAL REQUIREMENTS
 %  The user has to provide a file where the moment conditions are defined.
 
-% Copyright (C) 2010-2018 Dynare Team
+% Copyright (C) 2010-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -269,11 +269,7 @@ fprintf(fid,['tmp([' num2str(variance_idx)  ']) = xparams(1:' int2str(nv) ').^2;
 fprintf(fid,'M_.Sigma_e = diag(tmp);')
 
 fprintf(fid,['stream=RandStream(''mt19937ar'',''Seed'',' int2str(slave_number) ');\n']);
-if matlab_ver_less_than('7.12')
-    fprintf(fid,['RandStream.setDefaultStream(stream);\n\n']);
-else
-    fprintf(fid,['RandStream.setGlobalStream(stream);\n\n']);
-end
+fprintf(fid,['RandStream.setGlobalStream(stream);\n\n']);
 
 fprintf(fid,['maxNumCompThreads(' int2str(threads_per_job) ');\n\n']);
 
@@ -299,4 +295,4 @@ if ((job_number>1) && strcmpi(hostname,remotename)) || ~strcmpi(hostname,remoten
     fprintf(fid,'exit');
 end
 
-fclose(fid);
\ No newline at end of file
+fclose(fid);
diff --git a/matlab/smm_objective.m b/matlab/smm_objective.m
index 9ff0e338a8..c355ec4199 100644
--- a/matlab/smm_objective.m
+++ b/matlab/smm_objective.m
@@ -15,7 +15,7 @@ function [r,flag] = smm_objective(xparams,sample_moments,weighting_matrix,option
 % SPECIAL REQUIREMENTS
 %  The user has to provide a file where the moment conditions are defined.
 
-% Copyright (C) 2010-2019 Dynare Team
+% Copyright (C) 2010-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -40,11 +40,7 @@ flag = 1;
 
 if nargin<5
     if isempty(mainStream)
-        if matlab_ver_less_than('7.12')
-            mainStream = RandStream.getDefaultStream;
-        else
-            mainStream = RandStream.getGlobalStream;
-        end
+        mainStream = RandStream.getGlobalStream;
         mainState  = mainStream.State;
     else
         mainStream.State = mainState;
@@ -156,4 +152,4 @@ if (options.optimization_routine>0) && exist('optimization_path.mat')
     new_state = [ r; xparams];
     estimated_parameters_optimization_path = [ estimated_parameters_optimization_path , new_state ];
     save('optimization_path.mat','estimated_parameters_optimization_path');
-end
\ No newline at end of file
+end
diff --git a/matlab/user_has_matlab_license.m b/matlab/user_has_matlab_license.m
index 6f8b3c2261..de5475ae06 100644
--- a/matlab/user_has_matlab_license.m
+++ b/matlab/user_has_matlab_license.m
@@ -11,7 +11,7 @@ function [hasLicense] = user_has_matlab_license(toolbox)
 % SPECIAL REQUIREMENTS
 %   none
 
-% Copyright (C) 2012-2017 Dynare Team
+% Copyright (C) 2012-2020 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -28,11 +28,8 @@ function [hasLicense] = user_has_matlab_license(toolbox)
 % You should have received a copy of the GNU General Public License
 % along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
 
-if matlab_ver_less_than('7.12')
-    hasLicense = license('test', toolbox);
-else
-    [hasLicense, ~] = license('checkout',toolbox);
-end
+[hasLicense, ~] = license('checkout',toolbox);
+
 if ~hasLicense
     return
 end
@@ -68,4 +65,4 @@ else
         hasInstallation=1;
     end
 end
-end
\ No newline at end of file
+end
diff --git a/matlab/utilities/tests b/matlab/utilities/tests
index 371f3f0e6e..bc4df1c1ec 160000
--- a/matlab/utilities/tests
+++ b/matlab/utilities/tests
@@ -1 +1 @@
-Subproject commit 371f3f0e6ec209b4277a2fd7911ccf80570d7473
+Subproject commit bc4df1c1ec89a338424b5eb617fa568a76f14b45
diff --git a/mex/build/matlab/configure.ac b/mex/build/matlab/configure.ac
index bff1456e87..79115300b7 100644
--- a/mex/build/matlab/configure.ac
+++ b/mex/build/matlab/configure.ac
@@ -1,6 +1,6 @@
 dnl Process this file with autoconf to produce a configure script.
 
-dnl Copyright © 2009-2019 Dynare Team
+dnl Copyright © 2009-2020 Dynare Team
 dnl
 dnl This file is part of Dynare.
 dnl
@@ -35,7 +35,7 @@ if test "$ax_enable_matlab" != yes -o "$ax_matlab_version_ok" != yes -o "$ax_mex
   AC_MSG_ERROR([MATLAB cannot be found])
 fi
 
-AX_COMPARE_VERSION([$MATLAB_VERSION], [lt], [7.9], [AC_MSG_ERROR([Your MATLAB is too old, please upgrade to version 7.9 (R2009b) at least (or disable MATLAB support with --disable-matlab).])])
+AX_COMPARE_VERSION([$MATLAB_VERSION], [lt], [8.3], [AC_MSG_ERROR([Your MATLAB is too old, please upgrade to version 8.3 (R2014a) at least (or disable MATLAB support with --disable-matlab).])])
 
 case ${host_os} in
   *cygwin*)
diff --git a/mex/sources/dynblas.h b/mex/sources/dynblas.h
index 384b2e26fe..8215dd2ad3 100644
--- a/mex/sources/dynblas.h
+++ b/mex/sources/dynblas.h
@@ -8,7 +8,7 @@
  * and MATLAB_VERSION (for version 7.4, define it to 0x0704).
  *
  *
- * Copyright © 2009-2013 Dynare Team
+ * Copyright © 2009-2020 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -29,8 +29,7 @@
 #ifndef _DYNBLAS_H
 #define _DYNBLAS_H
 
-/* Starting from version 7.8, MATLAB BLAS expects ptrdiff_t arguments for integers */
-#if defined(MATLAB_MEX_FILE) && MATLAB_VERSION >= 0x0708
+#if defined(MATLAB_MEX_FILE)
 # ifdef __cplusplus
 #  include <cstddef>
 # else
diff --git a/mex/sources/dynlapack.h b/mex/sources/dynlapack.h
index 7e953e8637..c824570a7e 100644
--- a/mex/sources/dynlapack.h
+++ b/mex/sources/dynlapack.h
@@ -8,7 +8,7 @@
  * and MATLAB_VERSION (for version 7.4, define it to 0x0704).
  *
  *
- * Copyright © 2009-2011 Dynare Team
+ * Copyright © 2009-2020 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -29,8 +29,7 @@
 #ifndef _DYNLAPACK_H
 #define _DYNLAPACK_H
 
-/* Starting from version 7.8, MATLAB LAPACK expects ptrdiff_t arguments for integers */
-#if defined(MATLAB_MEX_FILE) && MATLAB_VERSION >= 0x0708
+#if defined(MATLAB_MEX_FILE)
 # ifdef __cplusplus
 #  include <cstddef>
 # else
diff --git a/mex/sources/mjdgges/mjdgges.F08 b/mex/sources/mjdgges/mjdgges.F08
index 5209c01d1d..43996e5036 100644
--- a/mex/sources/mjdgges/mjdgges.F08
+++ b/mex/sources/mjdgges/mjdgges.F08
@@ -55,10 +55,6 @@ subroutine mexFunction(nlhs, plhs, nrhs, prhs) bind(c, name='mexFunction')
 #else
   real(real64), dimension(:), pointer :: gev_r, gev_i
 #endif
-#if defined(MATLAB_MEX_FILE) && MATLAB_VERSION < 0x0904
-  ! Workaround for MKL bug, see below
-  real(real64), dimension(:), allocatable, target :: vsl_target
-#endif
 
   if (nrhs < 2 .or. nrhs > 4 .or. nlhs /= 6) then
      call mexErrMsgTxt("MJDGGES: takes 2, 3 or 4 input arguments and exactly 6 output arguments.")
@@ -113,19 +109,7 @@ subroutine mexFunction(nlhs, plhs, nrhs, prhs) bind(c, name='mexFunction')
 #endif
   info => mxGetPr(plhs(6))
   z => mxGetPr(plhs(3))
-#if defined(MATLAB_MEX_FILE) && MATLAB_VERSION < 0x0904
-  ! The left Schur vectors (VSL) are normally not computed, since JOBVSL="N".
-  ! But old MKL versions (at least the one shipped with MATLAB R2009b/7.9,
-  ! which is MKL 10.1) are buggy, and passing nullptr for VSL leads to a crash.
-  ! Hence we need to allocate space for it.
-  ! The bug seems to be fixed in MATLAB R2010a/7.10 (MKL 10.2), but we use the
-  ! workaround for all versions < R2018a/9.4, since those share the same
-  ! ABI and hence the same executables.
-  allocate(vsl_target(n1*n1))
-  vsl => vsl_target
-#else
   vsl => null()
-#endif
 
   ! Copy input matrices, since we can’t modify them
   associate (a => mxGetPr(prhs(1)), b => mxGetPr(prhs(2)))
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 14baa19a1a..39caeb54d2 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -832,7 +832,6 @@ EXTRA_DIST = \
 	block_bytecode/run_ls2003.m \
 	bvar_a_la_sims/bvar_sample.m \
 	dates/fsdat_simul.m \
-	dates/data_uav.xls \
 	dates/data_uav.xlsx \
 	external_function/extFunDeriv.m \
 	external_function/extFunNoDerivs.m \
@@ -842,7 +841,6 @@ EXTRA_DIST = \
 	expectations/expectation_ss_old_steadystate.m \
 	filter_step_ahead/trend_cycle_decomposition_data.m \
 	steady_state/walsh1_old_ss_steadystate.m \
-	data/test.xls \
 	data/test.xlsx \
 	gsa/morris/nk_est_data.m \
 	gsa/data_ca1.m \
@@ -877,7 +875,6 @@ EXTRA_DIST = \
 	ms-sbvar/archive-files/specification_2v2c.dat \
 	recursive/data_ca1.m \
 	recursive/data_ca1_csv.csv \
-	recursive/data_ca1_xls.xls \
 	recursive/data_ca1_xls.xlsx \
 	kalman_filter_smoother/fsdat_simul.m \
 	kalman/lik_init/fs2000_common.inc \
diff --git a/tests/analytic_derivatives/BrockMirman_PertParamsDerivs.mod b/tests/analytic_derivatives/BrockMirman_PertParamsDerivs.mod
index e2b407c492..4d2809c678 100644
--- a/tests/analytic_derivatives/BrockMirman_PertParamsDerivs.mod
+++ b/tests/analytic_derivatives/BrockMirman_PertParamsDerivs.mod
@@ -125,10 +125,6 @@ end;
 calib_params = M_.params;
 calib_Sigma_e = M_.Sigma_e;
 
-/* Skip test under MATLAB R2009b
-   MATLAB crashes, most likely due to an internal bug */
-if isoctave || ~matlab_ver_less_than('7.10')
-
 stoch_simul(order=@{ORDER},nograph,irf=0,periods=0);
 identification(order=@{ORDER},nograph,no_identification_strength);
 
@@ -475,5 +471,3 @@ for jj = 1:2
         end
     end
 end
-
-end % Skip test under old MATLAB
diff --git a/tests/bgp/nk-1/nk.mod b/tests/bgp/nk-1/nk.mod
index aa0c3721a9..22e877532d 100644
--- a/tests/bgp/nk-1/nk.mod
+++ b/tests/bgp/nk-1/nk.mod
@@ -21,7 +21,7 @@ end;
 verbatim;
 
     bgp.write(M_);
-    if isoctave || matlab_ver_less_than('8.1')
+    if isoctave
         options = optimset('Display', 'iter', 'MaxFunEvals', 1000000,'MaxIter',100000,'Jacobian','on','TolFun',1e-8,'TolX',1e-8);
     else
         options = optimoptions('fsolve','Display','iter','Algorithm','levenberg-marquardt','MaxFunctionEvaluations',1000000,'MaxIterations',100000,'SpecifyObjectiveGradient',true,'FunctionTolerance',1e-8,'StepTolerance',1e-8);
diff --git a/tests/bgp/ramsey-1/ramsey.mod b/tests/bgp/ramsey-1/ramsey.mod
index 54e71e5837..0a66aa14f1 100644
--- a/tests/bgp/ramsey-1/ramsey.mod
+++ b/tests/bgp/ramsey-1/ramsey.mod
@@ -16,7 +16,7 @@ end;
 verbatim;
 
     bgp.write(M_);
-    if isoctave || matlab_ver_less_than('8.1')
+    if isoctave
         options = optimset('Display', 'iter', 'MaxFunEvals', 1000000,'MaxIter',100000,'Jacobian','on','TolFun',1e-6,'TolX',1e-6);
     else
         options = optimoptions('fsolve','Display','iter','Algorithm','levenberg-marquardt','MaxFunctionEvaluations',1000000,'MaxIterations',100000,'SpecifyObjectiveGradient',true,'FunctionTolerance',1e-6,'StepTolerance',1e-6);
diff --git a/tests/bgp/solow-1/solow.mod b/tests/bgp/solow-1/solow.mod
index 7ef45993fc..e4d9fa8be8 100644
--- a/tests/bgp/solow-1/solow.mod
+++ b/tests/bgp/solow-1/solow.mod
@@ -45,7 +45,7 @@ verbatim;
     GY = NaN(MC,1);
     GK = NaN(MC,1);
     EG = NaN(MC,1);
-    if isoctave || matlab_ver_less_than('8.1')
+    if isoctave
         options = optimset('Display', 'off', 'MaxFunEvals', 1000000,'MaxIter',100000,'Jacobian','on','TolFun',1e-8,'TolX',1e-8);
     else
         options = optimoptions('fsolve','Display','off','Algorithm','levenberg-marquardt','MaxFunctionEvaluations',1000000,'MaxIterations',100000,'SpecifyObjectiveGradient',true,'FunctionTolerance',1e-8,'StepTolerance',1e-8);
diff --git a/tests/conditional_variance_decomposition/example1.mod b/tests/conditional_variance_decomposition/example1.mod
index e53ea53824..039fa99ab4 100644
--- a/tests/conditional_variance_decomposition/example1.mod
+++ b/tests/conditional_variance_decomposition/example1.mod
@@ -76,7 +76,7 @@ for i=1:nvar
     SubsetOfVariables(i) = i_tmp;
 end
 
-if isoctave || matlab_ver_less_than('8.1')
+if isoctave
     [observable_pos,index_observables,index_subset]=intersect_stable(SubsetOfVariables,options_.varobs_id);
 else
     [observable_pos,index_observables,index_subset]=intersect(SubsetOfVariables,options_.varobs_id,'stable');
@@ -114,7 +114,7 @@ if max(abs(sum(oo_.variance_decomposition,2)-100))>2
     error(['Variance decomposition at order ',num2str(options_.order),' does not work'])
 end
 
-if isoctave || matlab_ver_less_than('8.1')
+if isoctave
     [observable_pos,index_observables,index_subset]=intersect_stable(SubsetOfVariables,options_.varobs_id);
 else
     [observable_pos,index_observables,index_subset]=intersect(SubsetOfVariables,options_.varobs_id,'stable');
diff --git a/tests/data/mod1a.mod b/tests/data/mod1a.mod
index f475bc52c0..a2f0ff9512 100644
--- a/tests/data/mod1a.mod
+++ b/tests/data/mod1a.mod
@@ -20,8 +20,4 @@ end;
 
 varobs dx dy;
 check;
-if isoctave || ~matlab_ver_less_than('7.14') % xlsread is able to read XLSX without Excel installed since R2012a
 estimation(datafile='test.xlsx',nobs=1000,mh_replic=2000,mh_jscale=1.3);
-else
-estimation(datafile='test.xls',nobs=1000,mh_replic=2000,mh_jscale=1.3);
-end
diff --git a/tests/data/test.xls b/tests/data/test.xls
deleted file mode 100644
index 0855a60d64b2efed348503f2e765c4378350ac7f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 62464
zcmca`Uhu)fjZzO8(10}qGsD0CoD6J8;*1Oo4COGs00Tn_0|Ns{?BD<Y|6#)aN5PN^
zfxl4KGBYqRurM$%ure@!<D8v=fq{d8fq|2Ofq{#Gfq|QWfq{pCfq|ESfq{>Kfq|ca
zfkA+QfkBXgfkB9YfkBvofkA|UfkBjkfkBLcfkB*sfkA?SfkBdifkBFafkB#qfkB3W
zfkBpmfkBRefkB>ufkA<RfkBahfkBCZfkBypfkB0VfkBmlfkBOdfkB;tfkA_TfkBgj
zfkBIbfkB&rfkB6XfkBsnfkBUffkB^vfx&=*fx(c0fx(D@fx(!8fx(1<fx(o4fx(P{
zfx(=Cfx&`-fx(i2fx(J_fx()Afx(7>fx(u6fx(V}fx(`Efx&@+fx(f1fx(G^fx(%9
zfx(4=fx(r5fx(S|fx(@Dfx&};fx(l3fx(M`fx(-Bfx(A?fx(x7fx(Y~fx(}Ffgyl_
zfgzBAfgy;2fgzZIfgyx}fgzNEfgy~6fgzlMfgyr{fgzHCfgy^4fgzfKfgy&0fgzTG
zfgz58fgzrOfgyo`fgzEBfgy>3fgzcJfgy!~fgzQFfgz27fgzoNfgyu|fgzKDfgy{5
zfgziLfgy*1fgzWHfgz89fgzuPfuVqbfuWFrfuV?jfuWdzfdP~cLAVUcu7J|eD8@<!
zG2}DkGn6nWFt{@0F_bVAF;v2`GEuY`11kfv!Nh0+xse!k#Hty!9}xn?gc)-9b8-kU
zFtD*Q?B+cK%JSg6|B!)+VFSxS1||juhDYFZTL3B>oD*}B73c+=z-~xn1i9e=BLjmi
zBMSo~0~5m>1||kRhV@|aJz&xnT>gNwvjQl`gX*L&j1FMe_ku|!Fv-Wj#K6d~9jxaT
zSj3P)is1wU1H=FN37~3>iIIVo(UGBuA(J7IA%_7?7F0G;Nmh=9hhYf=I|GAzYF=tl
zVvZaOAHz~mNo$~IVBo54U|{e7T$V0j`1&7IM#AFsfC5My<W#Wu7vjW0A&5;qE^&~l
z*whbS@g)q5;JOIpLlB0Avo<9BKY+wQ7$&ZXLtF=kxE2m^PORb#3`-&I0aeE!YZ(qG
zOlD$XU}#|Y526Jcn8CDQ0~?qYYG47=!VT<TTBL#Xe*!p_w=(cC>;{{{#t@v5np$E6
z5?KUp>p?|~dl*<46d4p54l;5u9Aso*2<c^Hc+HRms^33=>MaHawh!Pm$ict>Y9oMB
z4G4o$Aqd0R#thsaK<$A23>*v`42_JO3=A9x7#$cGI2;({K7v{bybKH+JPZsR;tUKN
z-x(ML{xArEb0NqCCI*I-N)S=;pMi^kgQ1ND(%MMo5M@XPHABGR0BK!-m`tE138d%}
zKq<O-7?>DR82G_iT@Y-%00RfZpOqgk`6dO}$AiTizzrLaF$@f<pnzpyWNc($VmQd6
z1=gVrCY!)&MHrMpNkh$9O(`TZH?>&7FST4DC_gtbPscC6C^s=jNzKqm%~6y=1JrWC
zuPh)jJyk(1pc!m@3z$@6;9xKYgO~Q|NNf!T4u)pk8%?@5KG<s_u@^EZF>r$035?*<
zP=`^65v<+#r9F&hWC&$o0=3zgK<zXJhF73y1KY;I1d0a+kjFq#$H2hI&j1nwahMnw
zK@?mJ5-X@;AcN4=fsz-x7^n@2E(YpHpo@Vj9CR^IWTT6L+MwuSpag&}25O_Ci-Fp#
z=whHYEV>vdtkA_kZCrFQPza)nf!e_6VxYW$E(U5Nql<ys%;;jEHZ-~zs7;M725MuY
zi-FqQ=whHYIJy|9O^z-GYNMlzf!gfoVxTrWx)`WUk1hsk<0Fgx1*J-8-+_Sv!eeCM
z2lpZOG6;cbP}T+YE<ovzk%5^BRBMCy)09u-ufJcsA0h(MW%sVl`EQ09SOk<Z`59cq
z>+e{2=0Qb3YML!-4#!>Z0E>W9DnCQYymf)i>J#ii=73rh{0!Sv@+JPy3<awJrCff7
zv-!5`WewY*A|P`PT-!6#?r|<y1eB8b8D{x;ue`Fo9c&I814zyF71MVd>r4f!0i|qy
z234sViI{o$P!W)t8EI$lYpsL05R}sS8J;hnVp@Ev0<4AuY|cBQ6sJPvda%i$l+Vv_
z?vCn=?XE^(HJo5IYo32-y?m?%ECR|2{0wXTFUWp;m<86w1y*DF^6km=6o{KaIfI|U
zUgO?&fmslLaf8*&@$9p^<n0PJ2b5Fz8LFQCGP9K`go=RN{5+gdyW;h1um~vU@G~&9
zmt^020P#C7*c_Hi7tZH!OaQ9^<s^Ovapr?+X_p}G;RCB-pDcQH$KD>W8c@#SXJFxd
zvj0{YB*Z|efS<wVmAbR4@I<g0P)_4#xKv#6b9)uU%>rO^VxN7zndsRDRs+g;{0vGz
z?K^v7O2K{?1gp8Bvrf~+dm2~`C@1nW)T`gN2+W6sDk!D#GfXhzZPt;6*aga&{0s|r
zWoKre?F5@63^u2q<<8?Z;+bF(P)_A%=rrE*s3dd}*klo~n({&|3*L-Qum~vU@-yT$
ziD`>f6@hh$g4N93ut(*9buCx~l#}@xDo?&<;Ix?r6#<2_VvyF{#S03+=74fGKSRUb
z#6?}2kXRN6n-lVX)ruv|>0mXWoX*eCKEtT``r{0+ITBzsmv-K2@B3B-Rs+iU{0ve2
zpE{$%O2BF)!D`CC>MmUQBMYnsR1)wrgms*i-m2dVRwD&g(`2+ej)|=otOisv@G}Hn
zeqk3B*9a8>xmlQd=Zf>ztzZ#QNx{#+SH%CpF}eqAjttnGA7*zyoVJ97A*kfwXK;IW
z@aDpmO<-NJU^UTK&C+)tfcPC$lJGN33RHGIA{+=dM-HsUkb8rr-;xrrE>OwB&ycY+
z;PDwrNDRt@)sz|<yy(2tv>#Nffm$udr4L99G}?eJ1{!@p7Xyt(po@V<C(y+}qZR04
zpwSC-G0<oRx)^A516>R>+JP<x8vQ^Q1C55Di-AT*(8WNbCFo+H(Gzqr&}a&}7-)0_
zT?{nZf-VLceL)ukjmDshfktQ0#XzGq=whJJ8+0+yXb!p<sIP}E1{&=_7Xyv{po@V<
zgV4o5qeJLopwS|9G0^A{x)^9Q30VwOyMWRkKZDCVFA@0?NIq8pr%_v%=L?q<LsCB|
zJ@PZ0zARz6JE94k))m2O9?Lv9=3ovH0i{oVhIy>Xaz__<f>XZ|Sk1+=iP<IBAUPkD
zUileJrS_U$u!Gbt%3w8{j%S@P(}(0eQ2OO(ko|L}$VM1a|EYl0yq28wV~ZmsUxCsy
zKf|K%J?v6WrC_^M!D{X&7;l@LIvp$mO5gkp2mM&H=7~%MyIBpaM(v&Bf+tFI!D>M1
zou8p+@xFz>yk|j0K;=c2!tWnUTNi*uK<S^Kq0m?0sg_(d*c=V8IX{<vUbIHO9;^nG
zANU!*{5PAm@QDLd1Y}OOI`_SMS0ObAD1Y!XY-!hNh!C#;o1+Cb$A?jaBYa&MSOk<`
z_!;Ci7R*wOgp`BYU^Sa^8osY&ECQPh%0K)JyYo4wx1E5*jt)ePuWI5(v8iA+p!~$o
z;3G6kVAI-3V3T#hYUHdR<^SIWssBLvi=UxXetN;2`7K~IdSEq)Pd45zWQT+yD8KPD
zEc)@}rOJmgu*v#hH3t@b5Po)W23Q1?|M(e}8a?+H>VSlX0a(oukJ}C3qSV1^K>3lM
zp{zmPFX(kB*e*k`nzmjEiMXN&uo_VQ<YzeaZuPB}bVzA#1XiPZ?7Vb&Tn$(kD8KSE
zT%Gj!ndy`Qs0b*W)8-dyh+ToyK%o4~&*0-$6m-I%8f>x&*qq#*i92`P%>;{p@-sif
z_PZ1JM05B+ML_1TExhsM(&sr~5m5f-XGoLyelNnQ5Nwwj*c?Y&tv#2w%>%0e<#&FD
zKT7@;i?<|!)tH0TO!t*G6TX-O76Ijdeuff0<Fj8~-Jl{MyB@tP5a`#1_ySZO@H3da
zy86obo)lP(CD@#bMekocnw12$3sgSvGaO^d%DcUx8?43(tj4}KEO6c<N3aN}yx?cJ
zCG{{U_Z_6=VGUMuyFxzs#AJvrQ2D{nkbh|5U3=;IU|lv~HLoHxbwBQ!3>E>EC;SZ8
zmhW}l*A1zmZNX|T<(=GkNO~by4XAwKXV^XUrOWr+I;aT9U$qapjNIHICWFcweuh>3
zXC}#XK|;eGY)<6bHCdM|CfkGRI?(7ga+w4Y1C4g0i-AVJ(ZxWc;pk$Z(Q$M!&}ccj
z7-;kyT?{mujxGioT}KxKjkcqUfkxla#XzI+=whJJd2}(*Xg#_ZX!IUk3^baLE(RLi
zM;8N)_M?k|M*q>pK(hhpVxZXpbTQCu0lFAy_5fWBG@F1f2AW+!7X!^Upo@V<anQv;
zvk~ZGpxFs@G0<!Ux)^Bo0$mI=n}I9_s{cUgkDo!<H2JQ9NeVa}JAl)uQHI&U{s+xq
z5m0*MXL#(lers`I8&m|8*1gvm?PyJfh=9^3Kf~VNHf5Xs^nr7%6WE+fvc>J9yJmuQ
zfzm5K!}?pr38xz%wWc#zjRWiBcBxm8d<9Cs{0ym=CYRKNRD#WM0jp85J<%U{4pKvd
z(lbB9=67bx-HIW$yMom?1o5dk-hk8!p!ChppvBdAjK3olY`Ys+&4#{-(rVF=k{XoW
z`56@A<D#}*gqY(FR#Sg1_U4}CO0X_a`sZgjXYpFL{0hWm53ri>x%<*se?w|kP=4TN
z(3w|Y<TnRWmw1BJ%<I1EoYDqqt%LFhKST1Q%-4?+r-1$C1y*xo(Yl|p#~`5r$}jv3
zJ%VAgTw5E#wtIus$UfW?*jEPW2Y~VqKSTL;kA&mAkY1V(SPjq8CI7F?$pz~I<tKgy
z%k3)aSM_SacKL$U6r6e&e}7RcSPdwD@iQ>x?C}<P4(S#7fz@a+MoO{pC4<#~@*6+H
zVa4d=eQJ<8$ser7ZKaitgcrm;p!~<raCXy6KG{#IV7mgqYSaQ1Kk1l4d;!Xj{0w$;
z8&u~erh`om1gmk87A}mu)&Uj)<xhTwd-Jx(tN7)B%?SdlIhi)0VOc7~g`oV(&v5^C
z_@rOEAibGju$r*dyZ$tbL;5A4{L9Y}ovg+cl>@2iL%?dP?-l==FAhlwp#03w5H{y_
zZ2w$H-!~MjX5ys?s|9k9IslZv`57L+IaA*D4APSe1FJFq%qwMb84`w|{LattC{?h*
zT6YH67vW$vXH;(rf2xMG-az@EpJ85*aAl$xB*Y@XY8-g{@;i(meN9k#z|U~()C^g!
z7gNFJM1s{w>$j`;&VZyJQ2D^mu;SXbouV&bBA`6@F-t4uS{kHn1S&8185pFGOv-4j
z0-F;JHb-;qvX1!AQ@|pi@`ImY^)*ZDuzE=B#DLXoDlYhZ&>hki0hK5G4BmSEXYKhQ
zEumPjnqUhtwFQij_8h2u;b-{nfB5Gaha|AcabPuhQ)73obm<4jAgH|IXUOj<DSVg+
z$+_`hHO;S;-uk%Jg8P4<*;V8+2~_`qW?Rw4K(nvtVxZYrbTQEEEV>wIwiaCsG<%CK
z2Aa)97X!`iqKkoMd(p)}v%lzKpxIz_G0^NVx)^A-7+nlBdyFmynoUL*1I;d@i-BgF
z(ZxWs&*);H*=Tez&}tEMu~G)i(P+@@HM%;`suOfE(Cjw47-;SqU91X=9o1OGYOsja
zViBvuB36$k2CDx+>5remqcFs6;z~#^N&u%(w#3uU{^3#JbPP(5{0tL!_9m|Egp@>y
zU^Nz!6T%eMMSxR3D1GuX%=s;txZ(|@G*1Gnkx0DZ^>Z<#<^ZKveg+r&JK?jGAnn0q
zup09MPqy@4NSOjkzx)gp)~9Z9E{3#NQ^0Bx-uoX|cMH<S2c>6z2JM_|9kq};unSYc
zYNnijdq#F;B3J~JzWEtyVv8L%uV?_fFb%Bc!@Y;$OLju~nxOQ~&mdF7Z8XOnVoo|(
z4Rg2a#T)Y=Eoe~s=VxfBajP(~4g;H<0an9butGal2vU!N@&i9ZXN!M<)f7nmmkCy5
zsI>BTwHu_21LY5XhVuHC(|VKK!S2Zdt2zHNpYM<aL>DN(@G}&%^@PVTLTa*Xu$uo*
z=Ulk72@>+4{KL;6tMJ5-7urk90jtqfnzQD*2c$m%%1`_Z*GiO+P1p_@2g?PkIWHxb
z<9Gp5>VfhXKZC_%CokC#koJ2XSdBApn&SHUG_X%W`Hi1}XOT(v^(=@l^1*6uvj2;@
zxe8JPf$|?egHE?zY>5>lmJ7gYKAoECk{bXS(+1^7eugV{DQl1DKzcKUU^QR=EqMCU
z2omz3{K?Ot7Md)j`6~u&dl6X8y*+9RB7z{jPf&j4XE1#K`1i+JNE@pdtmf9{Kh}<4
zAm)JbFF%9Mi}|-#c0*E230MucV$-FWm5_27l%M$-uH-oF{-p?Ub16j4;f6crw<E!^
z1Ipk03>VL4-+jIu;?pv)ntk_nc01jNgeoY%^D{JQZaHv&9b{a$9IR%gw`Pp*GDyt<
z%K!WfGq2Sj{pti6y{`bP`E2*Q={pN#^c7Sd@H2cl_u;@RFUZ_MC0I>lcg^W*N|3%U
zsC?jO_?q4QX0r^WzNrGMVOh@R%C*@89AcpIf}f%NAy-Y86C@>6gVprExO?-0E~M`Z
zDnIxcHZ53gR$9^w)>Q*mV-w-@fI}Q20xD1V89r(Jz5G)j((b7RtNFY-e}RiOB*Z}F
z3qM2qrSt#(>On%I4y-1p=HJU-zL2;8l{fqhuGX8+*kwZ6m-S#Z%~BnziT{hh^<M*8
znFOl;8nK8qVG(P_BG!UMtQCt`8y2y4EMgs4#5%Evbzu?f#v;~(MXVQ#SRWR#ek@`W
zu!v2>A~p$&*kmkXQ?Q6l#UeHhi`aB5Vl%La&BP)$3yaunEMjx8h|R?!HV=!~d^9mo
z{Rc{a{0#Z$eyGhk2`N(=z-e@6&(YHPuOPV*lpgsRY>(IQJN<x^_>EvSG1A?8z6UCS
za}g+g@-zIjS`#|k7Bbq|1Xgoga9>lgKnhq5D82GCuzZkLziSAoBb&i$<iCH=<uixO
zoPp9WKSPqsf0_Pekd|f(SdBremg*xt$UGS+J@YdJF{HipkxmAi+zM86Gw(!(LN%m(
z2c>U*h6|CGE^aD?)GlpcHOE5#{$B7NQkQ_zJ3oW5cq79eGe~c*9jxZY;ugh^m5@>o
zl>Ye{7{wM{NVSHH-F1M~M6MUDWE6soH-hp5KST8<%hT>f(O~y<g4Lw=i%T>9fRqKG
z{K3y~U3~Ao&-LZt61EGhMqowg21PGOnF7i${0w&bvqKIwK;ohstmZ1yWM2DokP;1)
zfA|@6)mD`3*PIJBrw6QN?gR~+N)yQVFepFqGu&&fp5JK#F{c--X8pw1jh`YRqk^FP
z#m`_b*}+vM0%>RTfz^EEFA`g&2C4f&`Hi2U<EU|5nNBy@U;SV;d)>lHmP<f-pP>B5
z&yahzMs@0GNRMX%Sj}dxo@)$!kZ=a&M}CH-pDwnguF3<OGZCzYrOWp2QS}nAFF^T|
zpP@?r*h+mPNL)+;tKkuv#<{p2GKvezulx)b3c}hlk3rl#8LZ~s>*fv4ryw(ep#00v
zu&vDh&d=$P+HMM1O}L`WTE1+^%pxd1^D`Vfxsrc-5Tu_p6|BZkI=U~30aDk3@;5(&
z?d!Wje8rH~(loFdZ@mh`Q+pt82IY5thQh2Vs~4<=g#2`{ngt6p^i5|$(jh4S^E320
zF?Th{LE1Dkz-q4ksD0+C8V3#yP<g=55Pej3R?!Z~*uYG%nnfA!Y~OZ6QVXbj;Af~<
zd412t`H)(37Ff-)O2-dbK9E^nP<g@65Ow>bS;Th8eD-Xx8a2bjl$4K<**;MD!OviK
zNxjEuJ|s@(fYpTCY~3&Q2QtzNDo^+s{HNK?;!uE$aLfg(nY!_~kFWux^#&?m_!%x#
z2nyFMgS4CHfz@oyf9<edt_JKcP<g}8p!5FZ>8xvzHt2k?ng#2B?~$C_1+M=Vpp{9W
z`fni?u|-(K7Gn`xf<<g87O`bm#Fk?bTY*JvB^I$&Sj1Li5nF>rY%LbCby&pKV-eec
zMQkG$u}xUSHe(Unf<<gA7O`zu#I|D*+kr)FCl;|?Sj2W?5!-`BY%dnEeOScyqltm)
zKT!JPXGl<Ff9F;WSx>P5oJRjO)qYhx2+3)n^vKWPwfuio*+j@p)k3hEoVli)27e*F
z2T=OtXZXEPL4wO4GS|HbtY+=eZ-3A1gN(v~(knm1B`f!W)JDh{&SJ2dM7bqaI-en>
z6)64kGq6_GH(Zzn8GQw<d*o*@iuqJ8k_^eQp!Ceoz!B)rtRn#FPk`1U@-zH$FXFHk
zgXBg~`sQaSefI91Nre+QH!cI)wPnJtqkWfb!6Kma&d=~lrP@vCNjy{pG^W%wZKc)G
z$SiQV3`+m}49{nKuDDVQDM40%%~>bG*SMw#vcdwCANUyxn_jHsX7mQ@S_xKT^)Jfn
z>i5ZDlR^1|pW$U`#zq$=NS(9_tY-ap(PO)!AT>QGzwk4t9D0&iu>dmfvKp+WL7_`{
zWfjC6Q2ya(kW@2eubpBHwrdSo&4LLc$AX_i`dgs<#Lsa2`>D7mS0S~+TCke6dNXcL
zdj%O41m!P&29w<ff9frD0h_Z9tmgS|mt$|VW`f-e%5R``MhBlC+!GB}vmUI*Tjtlx
zXTMFsBB1=o&#*}<&7SQ)r1!7^tS0Gb$R_@6ka_}?ANd(3<rUlYt3p!3MzER?mxVUV
zbs;_l<xhTwlk=~>z0U|43D^WyGog_s%GMW>GC}#3pTRKdV@Omq#IDU?H5Rj?HvF)F
zl(3-u%g=E7%C5<a`yi=h3s_BzP~4ep1{JWsK>3-Uf#Gv?rco|r9AYb2jn;32@8O#v
ztDHdjo1Z~-)ncXd%e%n3wt>}jC1&5*X$o2C1Iq9G3?koH=g!>^Y2|DOtGT;~|9^oD
z#D$>z&(CloB;uteHzZ~50ITWmt(8A+16lh6Di8P>*urPO@wb7DK<)&qaXj*G=Dk2j
z8w*rE@H6~&yp*wGBBZsn3#_L9Q%w01KFGQ!P<g@6aN@y=v?b@`!LhR&tVX%9zh_1>
z#2irh!Ox)9XeEEl3=*n)z-so%<<DHK1L?_u$`gKu+!S&9`EiiZ;Jsiq7xy=?GUz~h
za-i~spW(k+d^f{`Sg>9Dz-m(F7Z#eXg0xCO<qbcBz1HNA)-Fg+*$-Buqc&y2jkby4
z`M(2bWfG|VJBUT>5Eik+Sj3KC5j%=S>=+iY<5<K%EAP?A>P})&cM6NxX)I!Au!x<-
zB6bdo*m*2s7qEz3#3FVHi`Zo>Vpp(;UBx1H4U5=yEMhmXh~2~@b_<KxZ7gDUu!!Bo
zB6bgp*nKoHQ2hr=fBXzTkKN@f&xed09ssA&iw~~M>%0po9YE=kpP?><?SPvVB&{C=
zt2roT6TJ0wAh>h@rB8ka=IP-E?$tI>5l~%n$bG}HcXxciIRunm`5Ce*cgj^hgUr?(
z2AdPI{_mtCzaTA5Q2OO($Z4v6VdV)~@puHRW@AWlUBxX(tqDrc{0v8ue{7YU1?dMI
z1*@6J=CkI2Fr?N5rEh+QReXEbGChR&;uu&>v!uI%vN5EV0;P9;2B!3hHiv~FW#w_O
z8dLSRqWYByU|)dJzbM1k`!c6wO(em-I007E`{tX-trW-z8z?{UGlbSpl@B+Dv=~l;
z)x4GvwwIp@=>viC2S3A``kT3%@*u73Q(!gInk2cmi3Wr10_7KehW*pNTXzdXYO>Q{
zH8t4}wWTs3GiRXu!_QEu+;yP!6Qu8Q2CU}6U&R@x`ysId%1`_Zhf6Mm&%Xs}iJt|l
zDSD%*s=XUBn+3{W{0s_5H(r@w2C0G0fz?d@Tv%wcHXQ6zP=4cQn7LrvigGJRo8~-N
z&F(Y*r>`=F^btY%kDuY>i)qKh7TAGxT>z`;e{g<xi7mtzp!~?sFd^mNlH5a(n*JhK
zjeO4boo;TBSzb{7<Y%aFnX=J*J4^(Wes-@q@pY9Nr1S*kSAGU#XQg+^sgQBG%V2Xd
z&YU!u><fttQ2ym-$hdrWC38O{oUee@m?byqEy{t+HG=XpKSP7T-q+XGKzeCc!D^JE
zuHWk00U4P9<!^ol@1M1nxAP#Q!PmfQIy)Y-L@PqZML_wTpW*h3`F<PaAU)LUU^PL%
zm+CzD2uV?({LjyDkEJezXC9<>xdB#l+57M-;~+>~3n~xz8Q5CaN6iw2xaTHVP4uF=
ziN+O>5f@PTz|YW<nP+#q57P6#1y;ji;do?rKEy6idBM*xC-#St)(psq%WbflwddB&
zvr>bsR|1tE{0uBSmJ&<0L+1PMfYlrq=eVhREd(5cpz?&DA?$nXlw;>1W36|=Y8J^v
zTv!tfnMVYbFZ>MLCPEF&&5*db2Uf%3Y%Wn}nFuxqRNnA2h+LGs9hU$ZgSih@bK&Zx
z&E5Ll;QH?YTA2i@|3F(`(CZw~4mWhM$5`|}!6Nn)i`X+PV$ZRNy}%;&5{uX?EMl**
zh`qrg_7;oSJ1k=Fv50}TJ)wuoM=a_-VG;X`MGUlE4c)x2Sk!&PBK94N*bgjXKe34Y
z!Xow?i`XA5Vt=uS{lg*#+WwC0H&FctN`L$eLFcCZl6(jmdwBp(qwPnQR&I8M)Gna(
z$j@+fL$Xi*14w)DAy|!EX@^5eKO`4{(kDN|*OQ4!JC8wHnvcM0Hl#>qsRjgt^8+Zo
z@-rl>wmp|Agw%GA!D<*6pDLS|3(4o8^vlm6@OxJFn+1?u{RFIL^6{0^&#Z!!7ohaa
z&oEEn$+<_~klxHwu$ls!Ex`&J5H+Cm&Ck%ZF8SMaH%OWC46H_x-BIz$_CBzCK<S;I
z;hJzzRz#&TxCVL-R-?`v*IBgyq6?J%`59Q5Bhx%hASK8Pu$t>m!Vfmo2Z42g@&iA^
zHj~5uMBhW|o0niU#^s*6`ZqGbYC!pepCQ^_u58;TNPprLSj~#1^;s4+kZ=a&7k&nV
zB2D+LrywQlYp@!L*&7dkUJHpGQ2ya(5G?s!zwvZ7*cWfWYF0(Ad>Bvx87l+jCw_(}
zA*U}pO@WN&y#=dj%6!ZAv>h@A2+Cjl42N$&S^m%vQct`Ct9hYq9b~*1GS&*pZ~P2Z
zLU$_7;~?Xf@4;$9qvF1NXMyy$K>3fK;j3_3_l|>*5c>dD^Uqyq_lBDgHK6>+&v1Ip
zEtbQDkhQNL!D>ENJGm|002##v<xhSFRXv|eKb}F>*?t16QCoOT->e=|=7RDoKf{BK
zx!r=ikpAdruo`CzA!XGJi0z>K%g>NK?~cr+*<Il9`2tpBQueRuwIie*2FlO;49YtX
z-N{-D>9>6atLc5TP&$?k;$~3(2CZ3DC@wdKl;+>SYHq5{s}tS=Q3J~F{0!+wnX-Gc
zA$8k#u$qo|r<aB=rh{z<<$r#LN|`x)J8U4Mls~{~?&R+ZUIG;Xl?VI`Y};Ry^=yQs
z`JZ4l&H-yKep7^)3@RV^8O*jsDz!91!si!QP4%%w{9D)|X#-SV@H5=}dGO1n8;~B@
zZ?Kx&MDwi^zMF#6A*lS|X9%zC4r29%gwG$annlYuim!Hrq+U>Y!q2et&7S{C<&d84
zU$7dH&rD0t9f!1OK;;WRL&L#^4K{I*^z#p_Mk-Bz+nT$OF?LXS!_P25;)iyBIb<Z@
zKUmG?ljZBz&4>e!e=;y)uB`y==R+>1Ky@M$7In;6#8|M1v0@Qp!y?9xMT`TB7$+7n
zE-Yf)Sj2d+i1A_(<HI7xk3~!Xi<lr5F(E8s!dS#au!xCb5fj5ACXPi+0*ja=7BML-
zV$xW|WUz?IViA+WA|{U}2CDx+>5reG_HgUr2mFvZ1JD*zeunbI@JrkuAY(Y7^vKUp
zBQF|v)Em-!U}OZf%_BEwTF-h3*?|B`pZpAZQqyu<4?{*onZRoPZNJ-Q9S{S~d!Y2n
z&+y16%wZeUWM;4$wF%Fyq7FmGKSAl2pMjx4UHR1`NO{2mR`W`&cG^c{NJ|rxp7|Nr
z)l8&qW23;O3@ca-Z_!)U;A4>b50t+78PYpHI?mUH<VH5InjV$7>as_UVE2I1J3qty
zB^I^&Z#aX^VF#=6oU5AaZwgt72TK3^3{J;?e=Rk%0PEratBJkI`(-mLWGo1jANU!X
z;-Z)mmOw_dIKgVRZ-4joiZ!Ig0LmZy3?IVRbIg!~tZ3i@t2y&dG^pc90N8d=e&J_W
zz<2Ae(2H!aUEE+bF(=J4lDZ*lGC}!=pJ7p3<^L>JH?SHWu$nA+?e%_}g23j0@)JM9
zR9)o>T1NxGYIwnFjCVHZ*FS*74k&-|Gvr?T^0}%O((>Q~s}VnDn8|JcDRV*jji13V
z>%G;E<B+*Mez2O}so!p>t%a<J0p&k_hM*W@p8Oifx=jJF8rQmyA+e_*wH+uw@-sZw
zX|eq*o(6WIAXv@GLq1Op)gUV;LHU!PA$HC7H;HbL5>^PTX5LBD|G_bkkwZ{^<!3m@
z-MwU^Go;Td3|6y!{j;s%e;|EdQ2ym-xc_!;#k{+a7!(1k(fE+EwRb<H-U8)keg?7X
zNruknAho6_SdBw_7f+WWq~-wSZ+?cC4FMBl+aTd123B+Um!Lmi0Hjp`%J2LP&Dz$g
znSUVWh=bK^b^UiLYz8E!fbu^-gNE+y9-Rirc%uYZ&4lFEliQ9#`~@lx_!&~#ZDaZj
zA!EOiU^Vr*2PU>hK=L4{eBfu8a>v!vAWst<hEiZP7Z_4MTOWa>I#7AR&v0wGW%cb~
z$T+GrSk3>1oUcLyA?AR}4}OL$g~_6Qk0I`n0juG*oZQcA59w!v$`gKu%olCH7A41k
z?UDtn`SXM$Jm4cFe}T#ueuj5O1^@I~AtM2DU^Qmve)KO%hK%lj${T)$|JtVe_X^Dc
zn<Eca<FiP`^?`gZxc*Z>E0aKVogx-7B`jjfSj1GYh^b-`Q^O*rjzvrZi<l-BF)b`&
z+E~PNu!!km5!1sWrjJF;0E?I*7BM3%V#Zj+Ot6TVVi7aLB4&<7%mRy;B^EI&EMnGJ
z#B8vL*<um1!y;ynCI+hiK<SU4K}_S=xfEf@yn+HajXGu(Xl;>&^g=-Ck)Pq>q+ds-
z^F!vq6v1j<e_guM!3k1tfzl^GLq&ji^1R)U-AGDcHPYuh_q>XN<a1DZ<!6{Yx76oF
zDP)a<GFXjU@%H@;D<I`5DE;y?tSWQsYkLV<fuaIdV>?yxfa6C<xdTei{0!lC@}Ki$
zAvK~ZSWTj^%{FEh$oMBHee*NyyppMQHybkQr3O}`AADF+<rt(t0ZQ-u3_3O?FRPzJ
z>{17-nJ4;i-~LcY?F&l({0v3TMa?@_LB?=2z-sCR558vMf~=<p<p+KS{vYOyAKyVn
zkTk(+ieL3;M4yMWjzRf@pP^!Jr-Dccq%EukRx{tSG)s^TQZ|9|3qJ!-BbRP#DkS8!
z!D^DNpC7oo4k7}|Kl}`Wdv=`dkAT!<I$$+dZ+!}QmIet`P=4ZP$jWFt+z?U@uK#qw
zYAy$S-elJYsaZk!i=W}dQbYBy4Ul?553J^Gq>SyXBM_58`Hi1JvUts;slJfajQU_T
zDH>t#++raky`cQZ&ybQm@5PP&Sg>6NU^O1W+dgJbC<d2$p!~?s@aSBojlLA5jx+?T
zsoZKFTyq^_J1BqhGd!6YCYmS$=~Wwn)hIrwcD<1U8C?YBSAGVkNB*BGO(8v9W3U>V
zwnIl_9zp6hQ2ym-(CcAqGg<+OFB7mDp1=RgkFr8W3qbjqpCR)lfBxz1kQR(7SWVQ-
zOJ5gxOa%J^l)w2It|ZUM+|mRo-_5{k9yPY_y_W@<!3E`aeunJ(b?>a-L27Yxu$nnS
zTW|h757|))%K!Wfal5^?e7po1Rki@DX|LHW!5;^)3sfHPGh9zDe7%+lGR9yDR^u}5
z-=|UrUvL<L$_IXivu@&M+A0t?TY=S_V0m1-q72eH0hJg03<{;6R79j9V+__{HRqXP
z)-?Ts)U2TLgP+0OJ*(sRMaWJ^8?c(s2AAExuZFZdK;;QPg9exL1p$7@NQo_2jj;Z6
zX0b*{sDjEDeg+Sf32D1rAa>b-)nuGgK3ysXi3?D9!_SbED7&(4g(Wyt?ZIlirS7=g
z_!tSU{~XZDBvAe5h(*i^i<mPOF&8Xiu2{s}u!y;15%a(z=7~kj3yYXH7BL?zV!l|!
z{IH1mV-X9$A{K~6EC`EOFcz^8EMlQp#KN$Mg<}zmz#<ljMJx)7STq)~7%XD3Sj6J6
zh{dCcf$Bd{`r~Ja@^E$AvkOu#JAl(D^K*g3i8CQN4U``F8P=U!7b+b9S?BEtR<qMV
z*=Jz@WIPR&KKU7rtj#lFv}gdQbtkZz`Odp7615=t6O>;08F=?vUHlXeDNmijY9c<x
z?%5;-DF;F6m!F~9d7&2XL`aG60#?(~#I@_71*FUcrDsuwO9AG$T6TQd2l9n0SdE;l
z)PY4`A@et&^v%z3q%|^R$wCuw3E~D;<H;-Je)t@u+ySL`euj@$!j0`;A-UQetj52#
zIjZ?Fqzwy7|NIP9b&t!tUqSjD9$+<}PU$B8sDp$LC_nHssCWzBwDN+CWO{<tRBTPS
zv{n#O`-1WZKSM$Vhrc{@g{l`=O_ucf+b8xxR;hsU3qM1|?e)n^-66AC-e5JE?;TlQ
zKZexnp!~znpyIJ=V)sHw@5%?PM*9Pw@-!{Ts4^%&@iXje^9|j76;jjtg4LWCSaQKl
zFCQElp!~(p;2;<9p1&SaEBJxcl%Fw(JLwM@2>|6ceukViy$piFkT~@RtKo9?x^6!O
z((VD}KYoU%^7<@h1&~@H0IX(HqIFoc31mhPlppyS_SL7K7E6Tmvjf3u)bCukdBFk+
zc~Ji3XV{vyvU6V*WSwmgSdC)TdZB|wkhTaYzw$F2+!O!*LIGrcD;TWiyISDNQa4CC
z1m$0ThW_(WE~`=@VHg5dqj&9hGfO5U3_<yspCMQHrRseNNO}$ht5KTtBza#Lq^$<Z
z-~0@!TfTo&+XtDC3<IkP?Qq+BU?D^Vl;8Oo)=0(o%#?(zu?h#Pc`>Wao>|onoC`qt
zpP%8?UAsTRQy?ib0<4BTQYr9eCuB7ls660j_$=1BH7g6!lZynanfIw7`Ee6umKRh$
z@G~%NxjnCA3M5XWz-kI#mo9wQ32Co@$_svmCb{e7@h*_IY&2NS6SGI6e^*0BGC}1B
zKSMU(De3H5NLwuitj6t{W~o#Iq%{dDPxu)Q73`9A(SWp;V!>*hd^b<obrDiWg31?u
zhRwxC&xO8#^bzC0YVI~auE}(Rte6FrH~b77%nb)FMML_U@nAK^9`Vxyz3ajAe+g)1
z5~%)5#3Gi2MJySMSPB-gR4ig?Sj5t?h-F|A%fup<g+(kIi&zd8v0N--d052qv4|C5
z5i7(ZR)j^Y7>ig57O_$+Vr5vw%CU%5U=gdtB36Y(tQw104HmIlEMj$7#Ol$+Ks5&_
z{qZwgN~;eoo(8G^62NJ6^0dSK@9H39o1pZ_&(M78C|fBvWEEl}Sk1I+roxsPkkS*B
zKKU6qZd{sat_>-PlE7-Fzg)ug?uZMxEC8ifeg?&$+w<Q+&#*`atI?UUrERq_WY!Rr
ze)$;;(%U}WO@WlBDPT2XFP=IqzX%zh0i|bth6O7VU0UZu`W&fXHK&(nWf?R;#=$`8
zo1ft{(_T5FdPoV923GU!q<{V2yO7=<D82JDJlWB;f1);IZ*n?V%_&3IA2SXnfa?iR
z`sZi3c)Vrf3opogNd{Pr80X2Axf+mmE+{|nGyFYV9<?qBQpRP1)d+O`d1mVmsoOyL
zgP*}^hG)IODoELs1y*CW%VyWRy^t9uP=4WODC-tnaL)lUtC|f~!}r{SN7NYN9#H<_
zXINXq*nBh=(ihJGtKrECN@6((DVIU{iJxKBE74!)|3gOea=~i6CLDP>wI0%k2IVh)
z2AS?(3Xh#3cIAQ9sD(b<HZ>P=3JEB`@iXYJF9>e(fvkhb2djDde1n&BIb;S7l>hh{
zHXdgVW~+hpJ`2EVf+9br*@{C#9+V&X8Q3Ksv0vB@DPar2YP4&#yWD0&Rwse-CqKj6
zOie%4Y)CC$1Xi=J<466TFOc>VD8KSE)U3TLGDjIwa}<NsykeQPDxnq<7ohyh&(N^9
zRsOLGB$i9SYMK+c=Kc<a=mO<ueuk;ZM`rKd2<hLHg4IZF?NNK-2N}r(<!^q5DJ6CD
zjxUGw?aIJvHgG-r)8h<@3s8RNXSi{CgPr&~NDsaotVZ=-X&YM=#2irm=Vz#7sZ)3Q
z4ylhTz-k`6m&)D}327~X$^(7|FPWDm`G%0SHkDvCt9m}PiKao!0hJH@3`~Oid>b7g
zbFo!mH3$A37I}UdvVICwUhp$i@4H=l<UJ%bs=;b3=LXar-2f2*l^^^Jw{IjEx-W;c
zFKfVR>?&T`eOd&mr9kBgKg0J$iybD-gTzHGSk1N{{O+0?A#D**`NGd|H=-_}o(H0)
z4y;C`z07lCI%K{BRNnA2FgNDCWORkNxgM<M`qo+J>g;EN>%RuHG6_`wHDVEK!Xnm;
zMXUvjSSuE>HY{T8Sj0N8h;?ES>%t<|jYX^ni&!rfu|6zf{aD06XF{XTl}^N>ZW0!;
z$ymguU=f>&MQj=tvFTXEW?&JUiA8J{7O~k_#O7cTn~Ozk9u~3rXkwuH50w7+8I-oI
zpW<l@Sy$EoPNU1@tu#VvAZZ<x9{Cwkl;@h<(}CooMzET%1uMS(`3ouWLFtp9;g6Z~
zkL~9mv++$}HJoey?RxbAQYV4ZD?dZozst+3d?C7;!D_f06K6N&K=$W?(l0;5nkeQC
zp4`shTC)YL=80gNhk_NPL<6N~eg?NVCmWtX$V!b?uo}PTTc!6^L0a^n^v%x@S}mcz
z<~u}J8(7U}muU(cy&$%O(mOwc>))1~HhahzPCHo5qF)MnYh55^94P(sGsN_)>v%L1
zVsZyqjRljK$Xz{1uLzVML>aDK{kEOiQwZ$lPOzF)JomPSxj_20p!~tl(30X>dBq!|
zs|&1#{dBE(H1w1*P=4WOxMeX_?y&%5G`JhArgPTvKTA9ybtEYN@H5!+SamP#hxFun
zAZmK}CO(`3=@EkR6F<XQLDjTWamd(RFIY|bX5V=Qb&wG@Q2yd)xFwpk^%^t8g?(T(
za%Okc1B)U3V^DtMXIMMca{cKrNcr9mR`X=9Y4N8_NIw9S|M(fQC$n7-)q?bxCxF$w
zmD!Tb{0(x>94J5XGrXUF)B4D6NQplYtmez!zCgw$5ch!cCqIL2w!qm5`H(#llfY_1
za=vEms)hIhlwbK75_4bieG-DWc`{hdiWltWK`M~mIVk_~Gu)l6^TfIVGK)C{tmc1m
z)Pal=NZ$^WpZOV5>w->I?}OAXQ^9JcxOdIr=7jWkK>3@W!83$+mWU!`Rme238r!z-
z+jUkz+G?Qu&d-p!kj<;Z7BVt19jwOFps=<o5@I_j|MN5axpz!se-0$?%mAy=lYRPm
z<|Rn$1XLdIGb}!EM{@lxNKG~qtmZ_1jrlzVNT`C!2Y!Zgs(Q=P+#q`mXMxppu8%Eu
zn>!nv>OkcMKLexYtygQlLRKBm2CF$9@!s^N8zdKi$`5`9*5KTakslx}k2zp9F`wTU
z$IOMa%s}M{KZDQyW2?^pgv9$?u$q_Y=M-YtAY;*>@`azFKXUS~FBc$o%>%0uoE=f&
z;R>1U1C=-Y4B`RVF6ECQxqCiXP5W~OnQQAI_1^-tG6_`wEyN<W2#eTaEMiNrh%Ln;
zwhW8dax7viu!yb1BDM;P*lH|dYp{r|#Ui#2i`aTBVjHlCZNwtB35(cfEMi-*h;79p
zwhfEeb}V8$u!!x%BDM>Q*lsLhd$5S@#Ui#3i`afNF;M*nN`L$eCwSkAGKxZW1uOuk
z(Wwuv?)#bzssBLfk)L7S$sIzM=R;<67J}9Myxb^x-WziE1Soy-Gh}8c?cHAqsV5eJ
z)u=z7l^1yovg#d_Uilg19X2m~ybdxiwHU1CW5C02dAX2vBB1ok&oFD<oa0NOb>tGT
zn%6&{?GfJ(X|aORGe3iL%qpv2-jKR>DOk-LQ}M*sose-JQ2OR)DB8ZfLx*VrxF@#^
ztR{Z>t38*GL26A<dgo_YY53Ja5W2>FIatk-)x0}>TOeoOfYLudgNe|KXWzLXz0Vb3
zH9Rxs&%YD~Da}FofuDi*-PE}n?2x|iO0b&l_mP4khx@>`gYpMI!<mO3bDn&Htc+L%
zR?`x0W&Jq>QeJ@a3qQlxkcJ5_(;+>T)nGLaQ#Q_@bqTUg5|n@V83Ne2(k4%X)Z%Nv
zYLreXs<8w?`bnVt#Lpm+Hl_ID8c2!17OaL-^x5;g^DbcbfbthV!z*hOvmF;8{r+`e
zHM(&Xv#z~@oK^+OZ~P2-r)G<9&4BcM*MrqCPE(N7^M|a10Odb^2CqvIuNP%PR_JU1
ztN9gH=DGGVq=p9NM}CHRWw)(rr66wJ2v+m*=G}-HLXflp%AfoU&vIw2>z@nhPiz9K
zNp19G>kWa7A%pU(D8obx9zm%D0dR@G8LZ~~?JtfM>l45tp#00vAgt1O(p(8LGO-1$
zre<Xy_ueg#l~ADk%+Ihh(s?@%v{$qhtR^pTdDTyS$QcWu{LRmBNMN&bo+QK<+rVlf
zf26LhJ_70Afbu&(!}6}0;vV^aaHwtvt65_rb!)u}WWEiQ|M?jbe?5KGd;roq*#TCg
z<0C0PX%D0g0V)sp8AM|3vMhukb>vR4n$puXo09KBavZ39;Ab#pPMpNX1xaJOz-lsV
z10~P+Li*XD@`9h?-=RkjR$TK3yJt68joJb4i^5YND@#G;2S3A>pV2z<xnAH9+XGf(
z{XX-A%2Y@X6;z(^GyMDh?QxACWVB!}Sk3f#v+jS)f%M=(<qJQ<Yk!%H3wI!AKI{Xl
zu~JC+%V7nHWl(v;&(QC3HC)RYQq%7TtEoM;TAtUc1Kj^RfL11f>Oas8ALxCWLs--u
z#v*nEi`Y>tV#lzE9mgVe0*ly5EMljyh@HkFb_R>sSuA4bu!x<<B6b0b*hMU2m#~Ok
z#v*nFi`Z2xV%M;UUB@DJ1B=*AEMm8?h~35_b_a{tT`Xevu!!A969d(Mp!CPj&=+ak
zaY76-Qg;BHMi(CX#eR1dq|^hYM}CH4^_kL9ERa^@L9iNw84KTZhe66*Q2OL&ICpwM
zbYc{w&3Fi`W`VbQ{d^ZlD;tzv`5BZ9w9NNChlzmJk=7OP*-V4BSV8HRpCM)biTg$y
zAtlifusIjSk{4Odgp?_u^vut|yChfn^=WT#9zF_IqZ#+<lWQQP90a9reujt-U)DA|
zLUs)v1FI=}w@7mOYDk+Jl-~InX0=_FYZZdDe2;_G+?HSWVb4Lx>Htvs=VuVx>aP3r
z4rJZt39y=6{pJU^0wJ?Cp!~qku;sPpmnWAYCZ7bWxz3ffEO8QKXFVu?@H0GE>D%?w
z7_v6+6j+U{d25116vTE=e&J_$9dhg&_vIpR`E?qsX79TNa$Xl8eh1|reg?kB{8epd
zAvMq$uo|!XSL<?^Aw2_7e&T0nS+sr2qdSJ+@Hq=svyk1QFuNGyLQwwVXQ;mWeSM`f
zqz!Qntfog#Z2r2Hka1K{e&c6I+_Ady$bCrJeIBf4-=cjtm#pdon+(c-{0yFNwx5s6
zfwVj>fYr?SULsi01Q}HZ<wt%7pNUycS2Q7M>>^l=L-*IL8D5aO1e8Dd8T#G*<7V4I
z`p1{RYFJZBmS1p%^rb-gm7gKw<H>6~{2{Z3m%(aEesJ2qKLJT~p#00v@Iia(A?6T>
znk!&6X(xi>pUr@*z5(TDeuljsUrLs3F9C=1Rj`^mTjx048b}=p%HRA9b+)-XQ=p^V
z*T8C?1@q^Xnm~4*fbu&(LsJX?A$@a54SgM~#{HuI+7mi{;P3(Ee|`obwH+aBd=Qgw
zfYqcvm{ghN3CT^M@_?Vgf73^+BUX?W=S{GhFS*xGu009ap>c~5biazto3ewyvn|1H
zz6Dkj>ZP$Z>KCNH4k|DB8J_eW%6QWO3B%i9HIsFx>KWNVLIYHO@H5;__;YB+Q^?uh
zcfe{q-&835_*Vut8C0I|GsLcy<qUrgNtt)SYTS>kej@%7QXhlL7k-BMVx~WS@IqQ|
z_rPjyOIk`TV~3Oppz?;F;gZVvUuK^mz5M%NHTmisQv|Dv!Ruchpp{9W`tKnYu}4_M
z9%B)Ef<^2p7O`ho#GYdjdx1slB^I$)Sj1jq5qpD0>@60tcUZ*UV-fp+MeHLMu}@gU
zK4TI4f<^2r7O`(w#J*z@`+-I5Cl;|^Sj2u~5&MHh>@OCve^|u+qltm)KT!JPXSj59
z!S>{QNbl+aIE{+B{En^Cgrs9odgN!ws{Vhagr^alLmq<FT$rzJ)?Nt7SD^IC&yYBC
zTg^99$oSPGu$uq#N;coR4JmU$>6M>h({bt3jrI_eAA{9|{ggd%`6fgcDE;y?=tweO
z;3$E#BA<ZO>|5WuG4nK}B@Rl@{0u9sg>L%kLB=hgg4LwHz1w;DD<ltt(l<XtCWDH^
zldq5wt!H30_m-Z`{`VC!(hExO{0uLq^3}S3f{B3Y<9ipr@UP~A^npO>pPylG?wxa4
z8zFV=3$Qt94dx5jcpz&#LHU87;RfRhuf%4^83HfCY7*9abX<sa1($=M{K3yqwKkjM
zau}p;dj(d*?71f?<s76O1mzcghK%KkR|}3n=JsBL)z~dE^)4)g%%Fhs4?jcH#I!Wm
z2*?hzH()hYPrm-z5eQio3Cd6W43D~J1lWIul(}!gY8JfD{QAxsG7<&KU;GUB?*8!V
z;AjWO={vBR$=shU{aPV4D=5G5Gsrw}3fyD_37_|1H3oIzQU66C<uWM$@iXuzefa(B
zbTinT4`4MHy=GOFrBr}LK>3lML4Bo_pLYbrrys#;#FbV$1zv*04k&-}Gw6p+a`AA0
zgyAQ!8qY(fYo7H(>RM2K<!6|-<Js;Lc94G3XRw-%P^Z%#T9Dp3DF5;^DC*0sdp#B6
z!Y^Poo7TSVRe_!^2FlO;4E^H4tHbQGz%Kj>R%4{yAfA~8nF9mmZ+-?tfn{OmH$rUx
z23EtAb>OD32c*sh<#&FDQ!oGDZR`jE$MScunyRT4uWsCi^gcoPpPwOQg5YD9TaZ!8
zA7C|81cUck)<M!ds660jICMGckmgxPef$%w#`5`Pwe{y9Z5mMdz|XL%p83VvodsYw
z{{pM|?6rB#k#5KcEvUTUXHY)(`l94p$msoVuo`aDw4FBA5chz}4}J!#0|o3-=O8`r
zKVUUl+BxC><sp4UP<g`7@RFxell7Ge*k6CaYSzsB@Wd`R0Bk#`eBo!<HBGTd!3h$l
z|G;Wi+I@W<={*Ik22|egGdNzGdc5%qq^J8Itfu%woVTCjG;se9bmbp<Uk`LGB)S+A
z6XrfaW-MYXSj1Sdh_PW2W5*)KfkliHix?LcF>WkkJXpkdv54_u5#z@qCV)ju5Q~@)
z7BOKgVj@_?M6rm8VG$F@A|`=FOcINj6c#aQEMhWP#ALCE$zc(bM-v0pf1vco&u}Pn
zQ^G_KNIA&B1gZlbY2WbvI%yg>9fQ&%Kf{K1Zk^W`LeeoKSdAp>v)0J}kdg?LKKU8U
z=BRXX^Xh=}3=>$*m1Cb`jSoV~3s8FHXIOgoQEPlYq=aP#tJ!0Ft#*bgq;3PHUw($B
zCk%O4gdlY!3s?<zV)>?~8pw<VC_VEt?0Kuybu$}cJ1ay@<Kpcho5I1igVHxY!_v;M
zB0Da~T2nT#nuCA$xc*!MDP=(Eou8pzK1C=xwG-@9cCeb>1N-#P_(S>=p!Cnr@ae&O
zDW$29x}O8AMz7hQ>s1G&p9IPe{0v6<6C+kHgOoCyU^U8fjix+ug_KsH{K3zl(ylx6
z;KEw4U0h%_fz8#we{w;50m?7@454fXv*WKq+TGk>HL6BVO*Tc4*-%ja;b&-eNRg7T
zfvi5|0jt@2d~5aWpUGg8LHUWF!9Yy2hSvmQ4lh_u$*GBrN9-WAFDQTUGhC_3*J?I_
z?1tn6t2xyns~jJ@0BjB@zwtAKyUkDAyaD11ez2Om>2-f&RzharK>3fK;p?3l;kPYX
z!MX&%YPfV>S3lnXsS!c>k)I(j?pfT-JCL=4f?zdU6iWEkMb?9Lf$}Fm!#q~oM=zQo
z?hyj3d0r*iv-miqHv`JA{0zl+jQiy;Li*yuU^OzXt(U!^xA1`SFF!*hyQzjnIpj<O
z5wMy|uRDAHhC<v7%Fp}^6Egj)6BQx;5(TT7mKK=!jvsQO9w>kFGw4S?EvfT$1G`WR
ztfua!gW>Zq$b2Lyzw<L(KR)yRw9QdqHR513#+xOqye~l7g`oV;&yY7=PUy}wNN7la
z)pX3bUg5eY6RZnV9`G|fz7nJI=7tqi1e6C~P5CGOCK=Mk0+kQ^3}2YtA57qY^kSvJ
z<{Wg_H}Fw{<P=bO!Ow8V%<;kkA4t1L8my+kLTKmr6_7Xul^^^JDj$xj+qyu`Bb5QG
z=|0VUmUA&=tO8V?@G~5<*RYzl0@5ay1*<tW*-PQaYRC>wQ2D~oaKP*7-t!Y6;|FqJ
zHG8*qzfzkx3G53{dBe|8fAHFF?O%}4kO!-o{i>hicUBX){!>6JlR*7HMJ!@USj3dE
zh^b%^Q^g{thDA&ri<kx$F-<IDT3E!iv54tl5!1yYriVpLAB&g)7BNFCVn$fRjIoHB
zU=cILB4&m~%p8lD1r{+&EMitz#H_K1*<cZ~#Uf^hMa&*e3{?Mt(jPxVNbjeqZW@qL
z9R+Y2y*Fdmo-5E%N>F;_XNY?;X{Dedq!*$HR-^Q3k=#BtNT~-(pZp9aF1uW2$<6?$
zekHIPDP`-TPG(3?4wPQ`8Ppzs-(^|{SwWx-R-@qN!~MWf23&7}(l0;5?l*xc^4}q~
zuL@X=ZL9U{Iyp#v14_^Q43-~0ubRjXX+f)k)f}qMd6qs8QnP~6H$Q{Y6TQ%iZIHf{
z8d%NT)_Y;6`XTinD82JDEY|4bR=5wTOVq(?zGWS$5)pC&`vR2y`5Bb%1<rn>1u2C!
zz-m@66<uwm2PwZm`GKFI%G@u0hbm-FMH8&%Q1-nwzb8P>3kKy6eul}@eBF<-8-PvL
z0;_rVF#n1b52QQ=<rjX2%{yj=<iCfM%i3TyFJ(4lu5E<O&4BU`KZDh*lA?V*kTBE%
zt6_Ph+czWB3v4ndKk+k|$yP6lm4J-P>4Md$nABg5F@(&nf$|qW!;)KZyw$THJtsY|
znh*aBZ=HJuX$^q#8$W~9@&DNm1R?dhK3I*D;Y8lHH}&B70_8t`21n_&nYoUTc})Yb
znv6FA@2_8h%oTz1BR|8nT3g;1-H`I#5UhsH>JX#48DvKUD1Y)ZRLyX<@QjDl6GmV)
zQe9u<o;~vb`wNs``57h@O$smPg@lGNSdCI+$<npYAv2wz{L9a<Jt?_`Z+|LSmkC&n
zW;FBtSm-WwP=4lTaJbHU+^7z6(y1v}&FAQnO;@TQW38b4&Cg)VS=JeH8`9%31FLze
z__48<3sU=n@;g7n(Q}t%?`A{pb}$F4DP`@ux+fa4hXj=W`59*K4xiO)2C3;Sz-s(^
z7JpEQE(C`ms660jI6p=G-X~4S*tjKFjr;DSA@{aG=EXtf13!a|K#Bdcvyk?a6<AG;
z{dOM_S4iywDlhmMe804<6Lp5nUR#6Jyj#HVrSvG|tZh*F!O!p|TH|(pFQjI*0jo)6
zQBc~!0IB;y<q1E-GGW=S#y^l-Fm1tVyy}9Y3KW9Dp$aNr_!%}z2Hgnx1F3!Oz-sEl
zHq<a%LskHQ${T)$Ht~fYnnWQjJbSR3gHPQpm+Ccw$3Gp=$|O+z=ZHnj35%FB7BLqr
zVy;-k+^~qbV-fSfBIb!j%nOT{Hx@A;EMmS`#Qd;``C}0az#<liMJx!5STGi`5G-P$
zSj57xh=pSji@+iliA5|5i&!)ku^233u~@|7u!zN@iGk`rQ2OI%SjB43Xjca*K^(wo
zwDRucl{+#ZV~L>j$j|UHCD~QN7BZvb2v*ah8tK}86Ed<7N}v1;OD`#HH)ihz=MX2b
zny4K6Zi_XLTm(w5{0y>rj`DR9koKuFSWQ>l$!Z%1NLc_%zx)iLmFp#H<sd6ZT)=AT
zzgA~^szOc{1*K<x2HujbiJgKF+g-tG@_$6ys5e9Uh@kY%&+zWr*R7>od0_Xrfz?d<
zlRoRYC8UG}rFVV?=DTNm%J)EaYq^8fY&~&+Y4$?MDN~^I&(E-E?_0lT){s#h53m|X
z_q%tE><z&tgYpAE!!&c(8B7w8F!Thg`5bcl_N-LM$RQ|y@H4o)ovSntx-!BGtS0+q
zN8OBC$ovf`zwk4(UVY<rQ4P|@_XexkpHTCC&L&9R56VCM465q!t^t+ZVB3AbYUDdl
zu&#dvDLp~?iJ#$gKu=<~F=Rx`7p&$+c*Ccd{gAz4p!~(pu)!m<@yBCGtKSc-Mp=8c
z#{H*|kO$>Aeg><!cP$l{AvLr=SdCCy-t#+i7J+RC<v)G~`+zs5dz&GB%>b~Pt7czQ
zZ}dXK5R@PJ8C*a3rE1nCf^`Lg)tD_Q=nK5o4;BICPksi@6(uulO(DJr0;~BamjC6X
zHN>Z&{L0VZDRceSCAna*u3#oc22lnzo`6?Uh2r441eAaI8E(vB<_Y=-Y0rg#%}HEq
z`hN01$k;C^Kl3wGd#O9MdP8C-6s%_M@vr$|dm%dzK>3@WVU4rOPlm~m-b@%+P358Y
z|AqHK;tQ1D`57!&PNuQ<L&inI!D`yeCVx$0hQt>r|MN54KXu0@&<N7=jsUBPRH^*H
zJuMvU3s8B$&!E3AGUe5DNKF<AR<k~>y-GI&vaS_WKJYVCG#%RaS_YCfqQGi0ebkkL
zGa$V*P<g@6u<}m&>|Q%hu*uP2HCf%vGdF5hfki;&2S3C8p2~$Qb0BTL7_gdU=~tap
z=FJAH0hK5G43~404?Z`A^u=SrYHq#Zp48d|$xWd0g`Z(z@cdJ|ra}B32UgQ2G&#D>
z1=4;3l{fqhkAHdgNj-psMm$)}^wleRoNOw=^<M&7nFOl;60wLSVG&ElB9?+hEES7b
z8Wyp1EMgg0#4@pnWnmG^#v+!3MJyMKSRNL!d@N!GSi}mkh!tTGE5;&Lf<>$pi&z;J
zv2rY86<EY7v4~Y+5v#@`R)a;X7K>ON7O{FXF;M*nN`L$eLGf?)JH3U>2PA;g=qxkt
z{s4AJ$p}i1{0!#)mo3j1K+1wduo|o5Ppq%ahwL5$rB8l_<j}-LtlIA2k|+tR#$4zI
zOZpv1UjdX}`59(z+4jV98zi46gVjiwMOpZF6oc~~DE;y?tQXn9-1r&NicA5kF)@hu
z4-J6K_JPtfKf}k{iCU)mkUA+9tmeRxJ;{vfkRBl@ee*L&apsB64S|@P23DiDT2iTM
z4rE^=D82JD+|9qS^4|u?zQ%O0n*G)bKY#fQnbiQLe}0CJTCSOWYau<|46vHFIoGoi
z4ncB0C_nHs9PF9)MQ}MJG%~?z65_p&`mclZR6zNIpTR0GDI}N~Qle#n)x>_yF4(gY
z(y9RE7k-Au#K$$VJF>xHm<?9bqUKQ^ejL(b0OcQkhL=;{s@ngAtj)^-tJ(0T$9Sa&
zq~!t1Py7rm3$K_Nzk`HEE?CW+h;{K+MvzflQ2yd)XstiGRN*(oUwL3PeA}Emw?lXF
zgYp|c14p)5_TLwfK6E}<jiCMaGy2yc{YX&$<7e3HVWTR%8M3Cg0IWt>?C!DKA&_zq
zlppyS3fWr~oa`WeF9fTJ?m0j0^qvH8yo2&5KZCZ86`$80NDWj3R#UFH;nb!n4PZ5(
z{L0TzmsnP$s|6XWF9xewU19I><0fRZ0F;0E8MI!hf1h?1(jP4WtNF>1Ui;b}vYrc+
zpZOU!d{BJ*4tl~-DOk;;7Ul1;HzA<`%HN_4pQm|?_AU8u2g)gBU^R~~e9iyA7IJ?G
zD8KVFWIgq%on;T{XP1N3%$u>UcTNRltQD01`5DUe_CIxRg7mX1z;(9lo0bbV77Bs=
z1u75t89H-{mrk1kF{cu2&b@1g=5fYA!WmRP@H0$Ve_)ZCHe@Yj6<E#9dshQ$%^~><
zR9^5igr%@AdAu8<s~W6k*$RF`NqNXDCaC=2XK*^dw8`rRq^Da0R-;n$c(c%7NWK7-
zC;SYyvnonN7$GUD7NRD*`-~>5HaKO1$`^iyf4iG*eyW9}u{yAtkh9ywzqCSH6`=Bl
zpMiV!pAtSjNQ<E!tVZX2<F1Z9&EWd40j*2|)qjmx#G0^(HDeKL!6Md*MXU{rSUVQ6
z4lH7wSj4)ph;?HT>%k({i$$yti&#Gvu?bkjCSnnrghgyJ7O^Q<#HL~qn}$VfIu@}R
zSj1*x5u1fYY&I6LIatKzViB8%MQlEr7${eR(jPyAS>NaQ%zKcQT?06cet-CIPg?^d
z$AZ!$KLg9WzitBWAZz>@!D`}ou1WS?fQ%r4(kDNI*?jizhwei1XA@Y>OcTzI3B8ay
z0F++&860_Yb1(TpR>U-e)tLO_)~M@(l%AmU%g^w4m4Dr@*N{Bi0#<V+Jics`2c(Y(
zO3(ZZKX+@p1^<Ms_-F;I$t_#*>zqEMrvggf{0x1`0)BOhka3<iu$ndlt|O13xA=n6
zJ3qtag@&mGI*|5hJ6O$%9j^M*gCS)BDE;#@Jd)pNz1|U0=5~P9T${xe^ne%Aj|Alh
zeuhJ9cGv})LRNfqg4Gy=D`;}7Lv}}j@&`YId()e^bzG3TtqZJX=DE2((*2Oq0hC|(
z8SXLda8h^-=__=D)qL`rf8y>7$h-?E|L`+>oVeuL!AFp`NDo+zooK0jpA}@x4V0hw
z8GhZBjTL+aDVuu1YMA{N%+dS|sp&!ai=Sch$tE{<=&7N7U^T1mRLajShRh6s@*6)x
zaj=u2b_t{(*$-B;gZHO`VJajvK>3fK;b5Csd(vgd?BfKmnlJs!*T(uo`jMdg$j@+n
z*R0rLIY^6PBDfCF5Gq#j3FiXW0igWJ&+u>0-+!MuAv3s>z~)>t+9|!e64FNm<yU?N
zOX;Pl2O}V>LMDUNFv>Xl{4<;nHV2e{`59&{kNl{j2&sLifYnG_gh>ciL(Bo?XMTq1
zLT>qHS5&~drh?Vf`Ub1JUxd`7p#06xAm}5P;Lr}KkEemvgmC*tD>gzx9+cnt8Tc<1
z#HAKP`nA)+YQ&4<m{n^a=791)Kf}Yh@4r-TgNzN#0IRW^p*lq@8d3v+$^(9eJ9j^A
zJ)sN9gEPTu4ssryxF9(i>_Slaz|ZhI!;`n75purZEU=ng&dNOxXF^VS1(g^43|Fr8
zN?tnx3HjMzHRm$!ub4Cmat=GF{NQI;Q?t_I&=bh|>N#LF$4@HAMaDtueo%SB&%mQ@
zJg?<bI@tEPU^Ryrwl9yeg}4w@zVI^?IK`!^)j@LiJg^#*+lKxVE<?-#l{fqh)-JPS
z>Y%qA&j+h9{rak|j1#i|VF6m11gifQVi8+}MQkw^u_ai<mSPcGhDB^S7O@pr#8zSv
zTZKhzH5RcoSj5(15nG2vY&{mS4OqlBViDVfMQk$`u`O7{wqg<6hDB^U7O@>z#CBp4
z+l57JHx{uySj6^X5!;7FY(JV9sQv?`KYj*H!BqcFCrCeO0XU6LXl0U-wSlZ#0i{QN
zhSQw8znK4V0q2K>U^S_poL8?mKu&7}rB8kaV}~VN_Ruvci@<73e(qp*m<^f#1Ep7f
zhEvTmqmO-pl=zFmYK}1U+`CuQ4K^8+e)$=M;%Bp-jEC$iS^`$1s$df_Ssl`A1f^$w
z1_Q0#-@0`nYy6gi)$GWh@b#|(WS#?*zWEtWJ@H}s!2wxwu?(!{#mPH9uNFgA{ejXu
zKf{r0k#}9rLCU7(U^Oqlo4YRzg^Zqo(my}L(U|)+<(nWUF|GisG5?kHLnti_+!hAq
z2Yv?jyr*koJDQ;)p!Ew+Z3_*TNJ45mQ2yX&sAW5_Ju3jxms$ljC&$My(Zmt5hZ2-u
z_!-jGBa}NH#)3m*HCWBI`MqN8c98lHlz;dc7ApD+1+RqE6KlX~&Nc7c<gEx<i2%w^
z{0vVV;};vYLFT~Lg4M9J{ZqEIhJ+X>fAKTy(Y$;q>>^}Ta2;5UbA+ms`5s7H1eD+S
z86x8Iy5uK7#w6E+)f{+cG0`amGUf)#fBXz_(-+;Ixf0S|*#K5kz30crW+O<bg7PCj
zgP)R9ibN}<r@IlX#-ZoS3EL#d>=7t`@-sxU=JKsP0_p8-0;>s%>M3QagQQGQe&uI4
zAR3=4Tn6b4Zw9Mzm#zp_P=<`Pg7Pmv!xNrU@*ake`L-=!H8&%8H~or*oY@A-&-@Je
z_js(eGa+NPTfu6KlnkN@u0Z-Op#06xu&K6gQDvGxI8L{L)m)Y-Wi1m40>=(0zw<M=
zcU)P2X+30?ZaY{F$5FcoOGZdq1?7K!hF!vXcNR<z1nb%XRujd<ADdnc*{cI85BM3*
z9-i5$VHpQjvlFalyTg9h2c?kq3aEVGXGs2Ba!33lq{qAqtY*%uY25#lA!8Mw@`9h?
z-m}*%NA^H$-wjr?f_HtcKlC&>Q2D{nAQ^Mgea9Bac+VcNniFg1GyF4vxCd08@H5P<
z36I^r7-G&|u$mRKxL9=;Lvk*teBoy}n)R+<U?OBhVINqHPucmWwH%Nd5mesrGaO`n
zJ1v<3(%#(<R`YA!o*fedQ^Ebe188LusQx>MMeGn3vBOxzj$jcxibd=g7O~@4#7<xl
zJBdZ?6c(}5Sj5g?5j%@T>>L)c^H{_#U=h2BMeGt5vCCM*u3!<nibd=i7P0GC#BN{_
zyNN~Y78bGFSj6sN5xa{;>>d`e`)FdI`VW-;_!;t>wx~8lLT2?3fYWGldYugy52QZ<
zN{{>u0`IkKE(jQd^XEaZn!dMMss2uoTm(v={0!@27C5o=K-!guz-m^nJ~~Stx+4OV
zUilebzI*&tcs``%dl;;ykAru*p%7#>2PpmWGjx2~D9#yT3%2VBSdDS&F`Y^4AnPeW
z>6xFQJm>M{o?DPQ;3!zlzg_2^<eEatI8gfLXNY?1d~>HYq+C7*R^w4M^+pUUWE>Tg
z-uW2<4*op0+6mH+JPuZ~n$3E7$a6@!14{q=3?ADG7MjIF^7#p{8sUu-E}i#)tQP>~
z2Y!a!EruW0E`-#qC&6lzeyn<&BMR9y0m>iz3|v>skE-!O`X#5pYTjq;ntdn>GB*Rt
zFZ>KA&jho{-*o`{{WMsOqH6rbpQ(^G1StRTGjs*#DT-Z$m~#fK=Alq=s0Z}+I8c7#
zXV9-&;uU`y(h@%lR+H<lv+JfSWK0{BzxWvv?gW*ILFb&#fz=$ndTCP{7vvNYP=4cQ
z_#C>Q(~KJ?0;<=8HU+PfUJt2(K>3fKp|0EX=g!BFb+#A4=DgCV<oI+6GJXKckNgbk
zW(QMSyC5s|FM`!fyqX*}BOKCV0Oe192ETXv{!U#4(RB%|#y{Ze$B(TL5m0{RXNYs;
z-+#Xw(!070Rx|yaGvnK6NKY4(fB6}{Z2o=TO#xC;UjeI8bv|x<<{e}O6DU9PGw>ua
z-0S`Y>BU|JtNH%J)Iz-k;vP``=4U8TU+>v%4jCJ`238|xTEf|>0ZHMY{Lar%^{>Za
z!zajC{dKUKTEn90`(Hxl&O!N~pJ9eVv(Wp~5Wn95tEp$+rWLsvQg4CE1Ac}DTMzvY
zk%y$8n_xA&?!H*J+(90k5<ukxKSP3y^ITU$NXongR<q-4w+)*Cq{RR#FZdbuf9x@A
zSpc#9Hdu{n*tEVGsgTwHsQln(2yI!L|7<m6MDz|=4evRZZ#Q}&BR8P(grDKtdah+!
ztdJJWU9g(G1HGRQL+?ifl`s4ZPG*V|@9co|hVOyZ6c>cOVfqNEM?vKcKg0C9l3XQa
zkTtaT!D=k?>d!4_4FT7G575daQ2qB1i`XM9Vvn(iJ;5UO6pPq1EMm{Gh`qof_7aQO
zD=cEKv539FBK8)G*gGs@@3Dw|z#{e$i`XYDVxO^yeZeC36^qz6EMniWi2cAK_7jWP
zFDzoev55V_BK8-H*gq^{|Ix%i^&cqx@iRzRt-X3k95RdW0GviAtvy*Sw-7Sg2}+Or
z3>P&v{|e}Zl++KwYTDDyv)-PW0B#+F(kDNIn>l-Vvr`#V1XNaXPVEY7Q-aiOp!CYm
zaIB;KQA~CuI9ERgn=|F>7e~Wekn{3E>6f43V?)yi2Wdzz<Ox{KbnE9v+S4Ipo1pZ}
z&#;5}+A5JRkY3tTuo_#f_zOQDL25Ek`sQc&{*JSBPbI|7&%kPYKhBxMrVAOj1f_R=
zhT~z)JFKP_gWdcbtY-F$?!1d#ZD1FI(my{#Lb+ef?na2oFTiT#9xB$B%!HH|p!~qk
zASkWK%JTqHdcFj!nWy}S_s1<rtqIB>{0vg<vtF-$0GYFV1y+;mmi?qK7&2M~$}jv3
z5~sZsk~<+QYhHuZ<UKb2&-MwT3zUEO8O&yF{k_r*QtG_{t1%U4JL47ysp&!aiJu{l
zLFu#g;|Q=X-h$N>$~aaYa)yjwf$|qW!<QYa#BJ&!?VfjFH47M}^~yOQW51yM#?Qd(
zT(ZDo3Z$%j4_5Oq`uesL4v?NDDF5*@oUT5gZ*>CFgZ}_lb93E-b6ct*yW&9k5p>S@
z>bXKHkox8$Sk0G;@MD2Bkh%?&KlvHnZkge8IUkauK7rMw&Am3QjTbV;0LriY4E+_6
zk1wV|%G}RjHI=6$PkgL}^f^HJm!HARkx#R$0b<S<uo|QLL7NVFL+UM1e&%QJsy!OG
zc{QYG`4z0Dbg@E=x({T$8kE2J83Imp&w3aKsX4xZ)qD?2zRcwh>4AarJ3oUn-{$Zq
zc944FJ6O$gs|=y*vmoIN%K!Wf=koQeFDgJ%!Vj>T^#2Ktfu0Z%P<bHAV0Be)f<^mH
z@Lc0huo|A#>zdiuLSh+IKJYViX?;Dr3p&5>3#_J{L+07-C6JyasJ!53czf$~TE<<-
zJnL_;nz@%hsiY=B>RM3w!Ow6|zV>F=3P>*a16K3eBkcHlCrG;xRG#oNO#J^Z`HU!J
zt?6H|nwvYBO8@PIv<5)s3qQl-IWJUu+955@e_%DjvJ=nB-+`>_0hKrW42sVe9n-uI
ziJkvoH7cjF{_NUS0^a|?z>K-Cj}eO)6BaRMEMhEJ#8|P2v0)Ko$0EjoMT`@R7#9{X
zZY*LvSj2d-i1A?&<HsT<fJICYi<l4=F<~rXB3Q&kv51Lb5fjHECV@pv5{sA=7BOio
zVlr67WU+|JVG)x@69d(Mp!CPjkl+4ju>&h)c8!4<RBx?Y_$S}+J7kp|C_VBs+-1@Y
zm~H~;@i2nbESUS#W>Ns84gjT3eujSg4?pbBK~g^xSj~<s#>3CTA?w#c>6M>>`B+gi
zPa<TuA2V3ZkN=Al4wOOmB!JQ{KSRqu{&~fQkn)QKtmf9nWu~9KTfn6`C_VEtuq<bq
z{bCDb9*7mJhWX7bHqNb(xhqim=4ZJ3NHKDqB4pJA8(59J>B|I{Qb_L;l-~InB)ji7
ziPu5O3wE#?<%Fp1Yf~U<K<S^K;eCo%%dZ=dl86JW=DOzDl;(X9H-qv6KZC=jNv7K?
zA^DsWtVa32&g85t$chF~{@`a=DS2ep&9jhx8y8qj%Cgys-@ZV~Tu^@DXV9qmy1O7b
z8(bfAgVo4y$?#4ugv^|Q@((|Q!s<8k&z^wvIe5To>LTKg#lJKMhYu(}@iV0TRE>W;
z8PcEN1*@^=w3~Kq0%W`ql)v~HK7R0f_~9nx3~@fN8V7HseS0@SRy~078$UzLsrMhM
zzd%Yxez2O7jx331eUR1wDF5*@i2vSYV5|(elR*HihR-p*U||SkEE<#_`59(ac|U26
zfRv|#U^T^uJa^oahlDC9fATZL&)C>G(HT<P34ztPrTpN$z>xv=7bw5-Gkok#NU83H
zxJMYQMt#l$p{<3GlnKhe{0tlSF?d$ELgubSz-pePEINBb2NJ5F{LIg=RN>8~J`+fN
zEDBa5v~7_~g8*dR3MhZ`GaM0IP-;;GnOzeDt2w{->7IUTNQwgGcYcP7d**(x^&tIq
zaj+WQu!$K?=OAeVl>hk|nD=;BMnmsXmjJ6_HuQ@W39JXlGN?S@XLzo8d85Y*h`%Jk
zYGj0F9J<^AX^Vi$2Y!Yvo7^+pPeJM}DX<!k<o^z@PM3kr0hJg042lLFEA~H!wBDq_
zYTo`^W{@fb$tj@ngP$S8x!}E~JfyWG16JdgB)PQR7Ls~F<q1DSKy`AqmM5geDGOFp
z^u)DGe+T4r0#NzF&v3k(ZBhGm$QZI5Sk0aZ59Fun$AjYwRNnA2be|KE_;?4>o|6Zw
z=}}v^`033GaQ{yMtxN*-{}i!^DPa*)#v-PIMNAcom>L!_bu3~USj053h-qOF)5apE
zgGEdii<ll3F?}pz23W)lv4|OA5i`ajW`ae`6pNS{7BO=yVis7$EU}1LVG*;&B4&d{
z%odB79TqWrG%-;92TFhZ3{{Fu@3yx=R>mtZgX+KaX$+SoSs-~BlpgsRgbuHKcjg(S
zpQH#@v#iousAo2$2L?)?{0zx&csuP*LUNH3SWWGe*Zy~RL2d>BrB{B2;FIEStnP<`
zbBHonP4-s3_toBzSr$<G<!4|iTyDQl4^qmgfYmhUP441ygzRkqrDuMIZ||a5Z=Z*Z
zDXD_hOkB0=_(XSzFF@&=pJDyWx+RY0kba38SWW511E=2ofRv}8^v=(q_i);VO}&u*
zjXGFOgsy3x?iYxgLFu2L!C2mx$?YMewXOkHvzx80K3X4AyMXcoKZDM6kDlufA?rUi
z!D_O<uJ5~d4pRSt@&`WylR=pKBo4?r5iPKqo$W@=H(epU5Kw;MXRxvGYn>VjDH*lF
zYAi*Voh)}j+8Lny!_UzEyr^(r5TtC<0jpuQ7jiZE3F)tc@)JLU*22j#46YD2>w?wT
zJG|O`>KjB2D1U+Ozg^iCwGOg^Ne`^%<MXfAR_=nR0p&M-hEtAzII`=Pfa6OatcJNj
zPGsu_Nb3ZY|M(fM?G$^h%n7N*4ZvzH8NRyM=?Do`P=4fRIRCRCxjz<CXB&dmB<;GV
ze*X%j#|+A!{0y=ECf<VoA#-U)U^QmTgXhM4hK#I&@+&`s)w+&J<*On6En~2n-NiB&
zwjF@94?y{spF!ICUhYaaNPEr%tmep>g*$oJAw3mPe&%OLS==FcwF+XgDOk-04h}80
z_mFu+Q2yp;Ft$H4BT*evBbtHL_!#s$WT!*?4$ANR3_@qVeBu^?*lrG1^ZFTwxf~y)
zUkl3r{0ui{&wU>g3yBL0u$oIX$8ypdAS1M(@_?VAFkUiaTQa1!vjnSIeJ+9jR0t%*
zK;;8JgZ!kQ|2W=3S};~%HT(Eh#x5~|w5UMk1wX@ypnWy_dmtkU)?hXF^56764ThW+
z1S&uH8DgjI@Cp44ncc7ftLbu|wMcRTWbZ7fJmF^u$gnUvW&vq&+Je>mUDC2#%M%iY
zpz?*Ep)+&BwC-|9ooxqJ^UB7X=jLjNzd+>;KZDeThnKE%LVAt%%%J@$+XaGNot-PT
zA5_;lpp{7=F-I(7PFTd8v52`~5p%^N=7vSg9gCO;7BNpOVqRFpys?P+U=j1hBIbuh
z%pZ$b02Z-8EMh@e#DcMig<ug2#Ud7lMJybPSOgZaNGxJeSj3{Sh{a$Li^U=qhea$N
zO$=23fzls8!%xPwGfuEWN@@piI)4BE#@m8UNZtdbM}CItsP-q3O#0w*&=IVr;dhO5
z;}6KnH&FWIXK-`>_F~FBh%P6vnk%0!%O)>{)QF(;%Fpm6&%eRG7BUm#3|6C)cE6yi
z2vUN8(l0+lXvmUD^K~He94=rri?WvIeVYR*K|tx5pW$Bg<t;^LAZ4yASk14gTVEaf
z3(0$+^v%!kT7Kg>Az@!|>(~vfMqI4&>7MV9av7A~`5CS$3#qG?KytM^SdHtqy|Iby
zkX#K)|NIORw<-+XS|B5k9$+=w*EHP~hprk0<p+KS{mV7gyVM}FVxC|%y-kl3V$C4q
zgrNMv&){vO(%$+QVvZMBjh(_4m)7_4U>Ab&3qOODM(`nt8pz5TZ?KxL`y6jLo`bBB
z0p%ZlhBb2+oa@^HnGN*;s|omJeYBJf(l!U>Cw>MEA#L?j#gG+`zF;+`rUk(Ve?mq(
zLHUcH;b1}V3gJ>ni1~rlxZXH6Q+O?;<^bh4euhtXDj34JAR+G$R#WCDxM`0wBz8dg
zkDuXxe1OwwWk^ph0IbHU+h`@<Do7ZD@*_XPQv?2UPd-A*_du|kDXEnf28$py5Ga50
zGyD`O|G3*8(k}@Dt6B4_KQ0S;@;E5J@-s|3u=Gy8J)}1i3|8~oG*KjdCuHppDF5;^
zs9$Dw_kIkifkMD))~2nJZukgkF@W+jKSSliWqS`xK;}n7!D{p#H9ic~f%IZQ`J12N
zmh9Zp4d##*RTx-J)r;3t^8Z6xRG|FM&k)(|yZtG2C2%-cjX*Yc9m_FD9SO?+{0vVj
zKdtk3faI?Tuo?+o_BGQKAiL&4<pDp#&Jc@<_1ht#5eZgv#=V5~5_B&)sC?jOxOaK^
z)A^?$wOtfgP43>xw%Tuy(O^({!OswNe2>Wm15<E5jRvdf5nTSzg%#5C29+QD3<Zr}
z1Dq8h^<NBF&D-GRY0X@aS`$>B@H5=)&(2jSfb{ZX!D>XhrOKUs=YUNHl`s4Z9mZ@0
z{m{{ZIIx<6YhMy=E<#!ipz?;FLG<;rciNVa8_?pxY8cLyl)s$a1s?xQKr53#^<N?u
zu_P>F$ymfvu!yB%5lh1&mX1X%1B+ND7O^ZWV%b>4a<GWyViC*3B9@OutN@ExAr`SB
zEMmo2#7eM;m0}Sq!y;CWMXUmgSS1#*DlB5vSj1|uh}B{dtHUBzk0u7H|3K-FpTX0K
znd4&tB+n#()999M$tM>u&jY7*P<rHN(AiQ~wf7|CER003nvRXLStXkwB?u^e@-uKA
zcxI|}88XV01XlA|Z~YO@j|JfJ9h6@A85H7;Z$;jP^zD+tY6L<L$sG5F^lw1vm!IM8
zpL1ufeTD2LNCB(y_x^vSpaL?J2TITU4E|RtRSuto%rK>b)$A2<`ek$gGIj?_-~0@d
z_k^XMuYvTX(!gq-Kb~O{-vMzmD82JDJT5a$f4&YT0_yuRzAb*HC0-5oJ1G70Gkn<H
zcX!nU$cShL*qn7OwiDh;K}rWue&A;i7d&SevlHUxOt6~F)i)}Z>OpD+Q2yX&=&hgn
zKQ|vz?qq@0h=;RCZ~Or%8A17lpW&IejlzjtkX4%5U^UWP5^pV3fy{=2@((|Q<~FIr
z8(JVOh8(b(laI@kTeKl%E+{|oGwg1i^uE9WGFFxgR<mVZ_|a#}CWHM2%3q=kkDp8N
z3KhKq-yxg_R<j~UZpHbhv%qRV`Hi2!@jl<~o_CO%BOk0LRm|n8?+(Z)Hz@z{GZ?;d
zo4$h`(!(eKt4Y@J|DFS_=|TCCpCR9kF>kUo#P5Y*H929e^8YI#ZU*H~euk2Y#M$pT
zApM&nu$t)%u_n^8kbVg$zw$HKt=yI%@D@@Z7lYNj_eq<mJ0lP5W>Eg+XP9P}e1??~
z(()()t6BBC?Jnzfh{>S*%+Ii7Pm+5`BcvZ$3RW|DVtD6=wU7}GQ2yp;xEOciYnnc!
ztyTtBlbOcQBI6GkhXCbweulzbuMZqQ3u%j#gVn@cPjAZchpZz7<$r#LS9$ur=F1_q
zW(8PH){^;KU(0KO-3%%Z_!*v>yH+L7gS4M2!D{|)JUL-%9%LsBsC?jOi1+h&)8h|0
zU#SYLCM?nK1HU(9^d3}R@H1#ur}y<OgPhD>4OSD`w@hVuJ!B_4sQln((DX=QJH7*w
z>T1AhIG_G4->U{`r-I58eg=N#OB_|uH9NInH3yy?2!G}PF&R|8@H1#=zOkFR5RxnF
zz-oT3ZFl~zy#$=!LFElU!!)^+iMRYAZN7T2nu1%AkFq@{g8P3BXk`+p{%gb{)`Uf@
z8H-p87O_?=Vr^K&+OddrU=i!YBG!dPtQ(714;HarEMk3F#QL#_O~4{H5sTO)EMk+f
zh)uyFHWiE5G%RA%v53vUA~q9?*eon!v$2TH!6G&ni`YCYV)N0&K=mIe{qZwgow3%V
zF9*^#Zvdy!c^0oFAKOF9CQy3hXNV0@lRFS@08ZJBU^PxjdloD;gVZjd^vTZ<@ih6f
z$2&-Cv<a-nWp!gfL?0y2fYK{J!#ck##y<{_k;7)N8tH;{T!}9rYsx|Cm!IKmC=YYs
zMMyo`0#+k%F)GE23(_wErDuKyxec=o9{q*P@w9@~C`_N0?34m2tw8CUpW$Qp%aiN0
zAm`k-fz`a}wkle91Ttz0O7Hv(?-^4=E{j6Sop!LAppvvdAJ#zXV^I3%XZT@p?zHiK
z$O_C3u$qkyt=*2xAv^s+`GKE7>g?mmhpHeeeLBHv=B_;9{pBCzWJpl{;AiN2)N|6%
z6;dO1fz{+ET}oNG3NjiD$}jv3k`?!sypn|MS?mU@@!X%)HQ~51IOIY3ho9kiWWvid
zMo6jG16K2Qiv1f0=q_VWe&T1?mNCUvqY^TH)eBZry!>Bn5;VR*`HP=Hvf<N9mx+*4
zuMe!|OhV#`?WvFw4V2&b8N3_6Kd_a6jO+G;)oA$^1Xlip%<X~lA3wv7%y}^fA3|oK
zCV<r}*f^U#`3z*#3zQ%E8Qw3QJ1gu8WdF=Wup0Jjl`2)MAiXP4{^V!KO*`+^tPWW{
zI0>vK$fNmFnFXYm56Z9n49s_S?N^x$X^Tt-t5MX5S~y<@;tNpz<!4~)l1`lQ3^E5c
zg&8#F)^@Z`_QDHZa2SH}Gd~00{WChL2O#y<RIoYD>mKdYXoHMifbus#1A~_SB&{=$
zwUpDqYI=`oWNtNp_zRTZ`56MQpIXf{8PdC&4pwvdbXF$cDah^Wp#0Cz@cFcvp<qTJ
z*!CG<HCOjO_B#;-2~|*ez|YWKb4)h#G^Ea+307l%eV>`sUdS8-sC?jOXtMEpu%{D}
zD`$b#%#C|$amy5vD?#N2KSSk(6(O^IAiezAU^U;oev6o2gXBR_`N7X%abcT*2fG@$
z_MHP(qZ~cQr5jq?fyxtphGoBFM0mGD=11p()o8O_c)VpZ<fJ4}`NGfek40kUIzLFu
zY#vz6lCvGxzqvuiDnR88KSM}dxA2R5klj1;!D_b7NX~zHvJG7SEkG-iK=t23EMkkW
zh%Lq<wgijVQY>Q2u!t?kBDMmH*h(y7tFVZz#v--`i`ZH$V(YMot;Zs^0gKp1EMl9m
zh;7CqwgrpWRxD!Mu!wEPBDMpI*iI~ByReAu#v--{i`ZT)V*9X&?MD*>)qkM$$IrlY
zu>9MH1CX@70Gvi&39C+iHV@K<1*J!RhK&<mX78H}$$JaIYEE~R_+9dy56;z~^vTbV
z@<OVl<sxJ)z#_1k{TE)8Dr|?8R-p9C&oFDraZSk<NSU%2tY+1#b1E)@kaa7d^vloi
z-gl44M(A3~C15qn)A`@6Jp&n=0;OkuhSN*d{9UvRGQPJItS0f&^_=V1ApJH_`sQc&
zf9#Wu>J7-sw`E{89@`$Qxl#xzzd-4opMm}D5Bc&*ke=Lfuo~Vyo!)ofLuwaL`sZi3
z<j?Ys>pY|vvI49oEbI5rCo>?m3n)MEGo<^ie5IaY1P+arU^O2-bxyO+gN){Z@&`Y|
zO9!?6OZGxe4P6CRlXBvV8B0E7#Rn+A@G}Us{hDyn9#Z132CL~_Zp!*>4WwKK<sW{A
z@B7!Slb!@wL%Rm7M&oYt0TnaITr4O*@iVOcn3eU`4$|XU3sy79B3dOz7gG0w@)tkD
z(yeQyUvGqofcm~y?7B+QcR=PoLHUiJL266!-dJ8peY_rQPW;>DzBXBq-V7-J@iWZb
z^Fj2b8Kmd50j%cX3#WNM7$D=Zp!~?saBqjgHh(2Z8*3w2jr{XR4=-dvZbbm)Pksie
zMPC9!Ss?A6O<*+-r?OSf=7gMb2g<Mf48O|Xw`@59=@o4Tt8rkNSIL(H8UF<3Uw#HP
zGmE`$IS@5lz-qp@uCSHZ3mNwY<!63|JsaHZOgBO5zpY?3?~T{a{`4AR7bt)8Gia7<
zZugRh)U4aUYFNs|Zv`ko;sTW4`59){Ss96&L-u2A2dj}adF8#&7;=IuDF5>_v>VDi
z^!fww=?<_ODaY$IDLs(!VNiL%&(L=4!3?n=$ZY6Nu$n1;Gh+@tg!JG+<pV#%w5KUo
z*r9hQ?gFbZ(wQH3DF%|iK;;ELgMQlizL(CB)Vmw3#%#h3(=XbP6G1`c2S3Ai^{JC$
zY9P5_4_J-zPw&E%N<DDu1(hfK3>v13<YZ<*+7NreYJS<3-szqIiFZ)>!q2d~zF1Ni
zx?Xo5Sj~jlFUyZig^a;~${T)$Z4FabdG3LP#(uDxl`LLy+I$7}pt|k=TA2hAJBUT>
z5Eik+Sj3KC5j%=S>=+iY<5<K_U=cfsMeGz7vC~+@&R`Kci$&}l7P0eK#4cbFyNE^X
z5*D$`Sj4Vi5xa^->>3ua>sZ8YU=h2CMeG(9vD;Y0?qCtSi$&}n7P0$iVxamDl>Yb`
zUQLvGvil#T9d`hnM)!yx+ijK&nS}zSM}CF}O}**M10my<2f=EL%+|!tI|4Zw1e8Ac
z8T75cR5ZCka`hpwnpu}Nx0N|UdPSi0%Fl4uHR#jV&5$)9hrwzlshO(RJcZZ}O27OJ
z28$=0UvU}IlRE-dV|L9hBK`zqr5Pwa^D|_$C*_<y0jaZ(g4Im_e(cz81;_{_D1GxY
zIArVHI?W5|H68=2Vb;p+&~)tsw|qhAou8ppMRMus#gM+;aj+VTx*OZ3&xG{bK<S^K
zL4re3qdgnaD>?yIv*)*?eoiW+PX@{l{0uwtd<|`kA+_&Guo_n0Pe&hRK<Xq={@`bD
zzF4Mxehs7zaSE(vf9|VzOCiV%94No=Gu*!{_r>uVq-H%0R`ayuh_aIvWV92MfA|@;
z2xL#(ei@?c3|P$`j+#@k?vPpvl%Mz+;wOGsm?Z=$iOz!66yN4`-SiZ4ssJc|@iUxy
zfAshCLy&p0b6_>yeG4~gxIj)k0p&M-hWF)GOD4>Ltk5|RR`a}|cJHiR5R*aqkDno}
z_0!^=XCQN^7r<)nE}a+7`w$Wup!~?sa8K28&C?rY;E=xvR&&y=wR3L}WaJr?KlvGg
zJ644r(17^j5?IZa<NHk8HbVO1p!~|uAfEVvdx|ZjuX!1)=JMfA(a1Q+2rVf8@-wVx
zd{T6H4`iO~3Rq3VhW}@0*+JTKp#03w;J<m=?mtD4S<I_oHKLm;3s@T=eh1}meuhVS
zlRbr}K+?uFu$rwdzOIfM)!=#pl;8OoUY$DnO8yQcMO_E0vEUV*kj(-)Zv~Y9`5D%|
z>^|qb9TLtrz-kJEzQ}!Wf}GF>Di8P>BoDs}owx>a&cIEun#o1$?R%3UwK%AJ;AhY~
zK1JfX6Qpl<3#`V;C}v(m8{|X<P<g@6aBh{vR~>E0`0#D8nuxUN*&YRu^V~t@2S3AU
z?X#JmBOrdi16H%X%hWK%31SzhJmF`EuxdK-zyMPJ-36=ZoThpI$`MFz0+lcP3{P2w
z6H9+XYUq1lHGhnLo!Kq`X^Vi$8-516+7N})+K@KZeXyGAtWInV(<g!Ze-F^gBvAeL
z5R2F&EMkwbh&{m~_7scQGc01yv539EBK8tZ3{;MS{K3!gXA)mW!AVF;d;s?AeD7-w
z`)5JgT_At)Go1gPZ*esg(pG#3Rul5JW%ZHW5H%ow@-r0O{%Em?5t3RTfz{0UZF-O4
z1!S)^$lv@7o)>=Y(QbgGyT@QPhCHFn%Qivc2NVwc3?F_5*S#o%=z0QH^X1rs2$xfk
zbO#C-euk?HF5b0DgQ$55R&#ve>Fg3A$V?X~ocI~m#z#n9>Vl+>XJ9qUR?YM^l!l}r
zP`L3keBe(tJzfLZG4LF$=J3a<Zzk7ffpa`49Qhe|Lq5G1Pl4<qe*sog|FV4U%9W6E
z0u-+N3`%YH5)(BbVfYfPhDq>7L|WDi`!@^$4EzjCA3PWs7z7wNK5#HFFfcMOFfgz%
zFz_=le=uMG(JUV{z~Y=A1VD0Vn2CW4tPiAzm4Si5j!B4N8yhHQ9FSDXg3SBR3=&~v
z_|FVtrE`cgq=Re(2{M2;?fn1$|38Sw#lXP8$sxeNz$U=3oA(SmNQ{kvfq{pCi6I5#
zVg^PALC{4@AXhW|S^4pjZ&HALJOdL0BSQlN!c0{r7Ldys8yT1w4zg&0b!dahCa_u&
z24w~X1_m`}HKmZu+|*(PztnPtp#0p#JRQIMqTIwBB{f4MHAhhf4F*+0$^sJ8Qx((#
zn!(1mfJrq54hCZ|cxkVW#MWToU})C8(WHChgS{padm)1o11CcY$jJ<h3``6<j5>^9
z?Zz+dVKgH{C<7A%7Xt$mA1G9iFmhxnAV($#C=yAGOb!MHcw~a@z=%w+C?vHoFfb5^
zOo-w^M1oTJzyJULgD@zKfIJIIVIV#z{eWmtY8=JGGXxkJ{{3g>VqgIIP5^Wz83O~u
z0Z96ElV)IG@Xbsv$}i4OD^YN*NKVaBur${VNlZ%3$w_4ZB@?I2v@{Eda`H$<P<cn5
zR<N#r|3M`+6PS%mfYSAY*7=`)`ez8Np2)$Vt-kpts1%>Wz`y`1MnUqRtPD!?pi-Zc
zfq@}`fdN#YFyt^WFmN+4FjRm`S_Xy|1_lOR1_p)+;KG@K;pJZj203s|!N8E4nVgZD
zqmWganUj-PlmZq9xyF!zfdOPb%uOJ6LrtR>h!0{jJTLTKX>g1Y#D<B3<VeN1{10*i
z)77(A=jcfbOrFlcpsn+BoeKj411p+X3<Cp$1h}9Dg(Il;gG30(kGRB1b>pb|!5acW
z4EYTC3?&Q-46Y1$3?&Rj43#7~R*ZoaTy}uU4^W;$FGH{yRtm}+pajamz!1)m&rrmW
z&5#6kM>aO)c*TSmn7~a8P(B8^0k2}HB*^Og#}E!9gEK=uLoP!BgFizOLl#7k1QKLF
zs5J+&8-$6~>IqfI$l%YA!;lK)kxp?jFu}v0So=Z#7lB&E$`H&@%8<*D%a90;dryWu
zhBR=TfJ90dG8yt2@}O$5Q5sPDLG1=&?FWU|8K_~b3@!}$49Q?Oq=Hi*Y3{Lr+7GfD
ngrUabr9kC>30@VXNrLQ!VPbTG+Em1-BUTN}ZV*k39%TCg_jKRD

diff --git a/tests/dates/data_uav.xls b/tests/dates/data_uav.xls
deleted file mode 100644
index d35bdc3ba9e5bc6932d3c5e3b5349f8471bfad41..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9216
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
M%x(}(j2>kB0XMf5BLDyZ

diff --git a/tests/dates/dseries_interact.mod b/tests/dates/dseries_interact.mod
index 50cc5b51db..929b1b4894 100644
--- a/tests/dates/dseries_interact.mod
+++ b/tests/dates/dseries_interact.mod
@@ -41,17 +41,9 @@ varobs log_nn;
 
 %reading Excel sheet from column A on creates quarterly dseries starting in
 %1950
-if isoctave || ~matlab_ver_less_than('7.14') % xlsread is able to read XLSX without Excel installed since R2012a
 estimation(first_obs=2,datafile='data_uav.xlsx', xls_sheet=Tabelle1, xls_range=a1:b54, mh_replic=2, mh_nblocks=1, mh_jscale=1.1, mh_drop=0.8, plot_priors=0, smoother) log_nn nn hh ;
-else
-estimation(first_obs=2,datafile='data_uav.xls', xls_sheet=Tabelle1, xls_range=a1:b54, mh_replic=2, mh_nblocks=1, mh_jscale=1.1, mh_drop=0.8, plot_priors=0, smoother) log_nn nn hh ;
-end
 shock_decomposition( parameter_set=posterior_median ) nn hh;
 
 %reading Excel sheet from column B on creates annual dseries starting with 1
-if isoctave || ~matlab_ver_less_than('7.14') % xlsread is able to read XLSX without Excel installed since R2012a
 estimation(first_obs=2,datafile='data_uav.xlsx', xls_sheet=Tabelle1, xls_range=b1:b54, mh_replic=2, mh_nblocks=1, mh_jscale=1.1, mh_drop=0.8, plot_priors=0, smoother) log_nn nn hh ;
-else
-estimation(first_obs=2,datafile='data_uav.xls', xls_sheet=Tabelle1, xls_range=b1:b54, mh_replic=2, mh_nblocks=1, mh_jscale=1.1, mh_drop=0.8, plot_priors=0, smoother) log_nn nn hh ;
-end
 shock_decomposition( parameter_set=posterior_median ) nn hh;
diff --git a/tests/identification/LindeTrabandt/LindeTrabandt2019_xfail.mod b/tests/identification/LindeTrabandt/LindeTrabandt2019_xfail.mod
index 9494da438e..1dcf57b2de 100644
--- a/tests/identification/LindeTrabandt/LindeTrabandt2019_xfail.mod
+++ b/tests/identification/LindeTrabandt/LindeTrabandt2019_xfail.mod
@@ -370,10 +370,6 @@ steady;
 resid;
 check;
 
-/* Skip test under MATLAB R2009b
-   MATLAB crashes, most likely due to an internal bug */
-if isoctave || ~matlab_ver_less_than('7.10')
-
 identification(order=1,no_identification_strength,analytic_derivation_mode= 0,ar=5); %works
 %identification(no_identification_strength,analytic_derivation_mode= 1,ar=5); %works, this takes the longest due to Kronecker products
 options_.dynatol.x = 1e-9;
@@ -382,7 +378,3 @@ identification(order=1,no_identification_strength,analytic_derivation_mode=-2,ar
 options_.dynatol.x = 1e-5; %this is the default value
 identification(order=1,no_identification_strength,analytic_derivation_mode=-1,ar=5); %works only if GBAR_o_YBAR is uncommented
 identification(order=1,no_identification_strength,analytic_derivation_mode=-2,ar=5); %works only if GBAR_o_YBAR is uncommented
-
-else % Skip test under old MATLAB
-  error('Test failed as expected')
-end
diff --git a/tests/identification/kim/kim2.mod b/tests/identification/kim/kim2.mod
index 48697badd9..6322b8da44 100644
--- a/tests/identification/kim/kim2.mod
+++ b/tests/identification/kim/kim2.mod
@@ -81,10 +81,6 @@ end;
 
 varobs c i;
 
-/* Skip test under MATLAB R2009b
-   MATLAB crashes, most likely due to an internal bug */
-if isoctave || ~matlab_ver_less_than('7.10')
-
 identification(advanced=1,max_dim_cova_group=3);
 //varobs c i lam; //to check if observing lam identifies phi and theta
 //identification(ar=1,advanced=1,max_dim_cova_group=3,prior_mc=250);
@@ -93,5 +89,3 @@ identification(advanced=1,max_dim_cova_group=3);
 
 estim_params_=[]; 
 identification(advanced=1,max_dim_cova_group=3);
-
-end
diff --git a/tests/optimizers/fs2000_3.mod b/tests/optimizers/fs2000_3.mod
index 09d2c59a5e..5efc98d2a4 100644
--- a/tests/optimizers/fs2000_3.mod
+++ b/tests/optimizers/fs2000_3.mod
@@ -1,7 +1,5 @@
 @#include "fs2000.common.inc"
 
-% Skip the test under R2009b, because fminunc fails due to Inf value.
-% It remains to be determined in which version it started to work.
-if exist('fminunc','file') && (isoctave || ~matlab_ver_less_than('7.10'))
+if exist('fminunc','file')
   estimation(mode_compute=3,order=1, datafile='../fs2000/fsdat_simul', nobs=192, mh_replic=0);
 end
diff --git a/tests/recursive/data_ca1_xls.xls b/tests/recursive/data_ca1_xls.xls
deleted file mode 100644
index 062baaeaa9512d5cc7755a6fa06df9aa30f4c27e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 15872
zcmca`Uhu)fjZzO8(10}qGsD0CoD6J8;*1Oo3^Fjj00V<00|Ns{?BD<Y|6#)aN5PN^
zfxl4KGBYqRurM$%ure@!<D8v=fq{d8fq|2Ofq{#Gfq|QWfq{pCfq|ESfq{>Kfq|ca
zfkA+QfkBXgfkB9YfkBvofkA|UfkBjkfkBLcfkB*sfkA?SfdP~@Kv){emW9$#Ye%U8
z4uK$se1?365(WhZSB5->5{4p%N?2AViWXyFWkB`<F`7W>ff#kfsu{H(5dy@78FKh@
zatJUmu(2}i<~;+-^5DGxkb#L|1Is}MCI$wEM+^)MF$@KuvcWkqCs~1BzzOVzL`IMs
z4lpt>*fO#)FfuSPFf+_yU}E57SPz!j114?3B@hDxg9C$t1vmg08NM(&fZg8<CY8V>
z9|IEuBg1yEo?BoMLk2m9JK&OT0;nQmVq{=vbY@6o$YIE2NMa~r$Yd~NkYYH&z`*do
z9;^aXLNYpnWk9MZk(FcNVOYYz&cNWFnwMIXnDYQ!elB77`d<O;2MBRM0VED`99aAd
zM3jL6zc?t=u&Ku-4l)&+`r#|Sgn^L(TR3Y&!v6!v=O7FVXH6X9Iyl6&aENna6=z_8
zx(8GRgREsZpfH(<g@K`g;XjBLXkZ4@f(>k7TBv~qOba)#gK3cl*8d6Mblu7z!0-}m
z3I{_-Vp3{OPO2eDY@!y(Sh$!GNK9D=Ma;N|frUYlL6PAgBL~AlMh1qEUPgx33|XMM
z{zDQ-DFfRF4G_%(X)A!*3?K|jogfTKT_74JX3W6-0n|3w&%nXJ!O+Oa$-uyIfYE`0
zfy048?jxx6z{|kE!Nb77A<n?S@tuJ|;17cixCH`gg|IR(RL18g6|*xi6lA7?SgZ^T
zK_HrmfgvRoL=^sK;9}rln8gBVn<R6HG9-f<Eg&~S+ae$)6Q}_LDd+@H3OXJJCWaIS
zesHlM2rdu=7&sVoon>A>GLy282a7j=n?WFB7#LJRQNp0Z*vP=daF9g{tV0`2Hi6Z`
z8bHlpu@*3?#=yal1_saU)sfg53>*x`VDQpj6N$Z$L5YErAqCvD1{HWZj5>_m+Y-39
zB|NZ)(TohC3``8147K1U83V%xE|4D>z<fpqMg}cm1fPk4fe|LpzyxZ#F))OKy#oql
z4kl1EfSP?epqOJ|VB}{2iGet*45(tD=tUO;MK!t@DD|O>f$TyT19dIX#Xxlsx)>-%
z(ZxW`Qgks;ETfBonyu(!pk^$(7^qo`E(QuKbTLq~7hMb#g6LwPW-+=LC@Y|gftt<e
zVxUxnE(U5=ql<x>+2~@RW;ePRs2Pqf2I{(@i%EehH?%khHQUkEfx3X`VxVR{x|kdm
z^W@RQ{(?IfknRKn1BA!Ozz^<LLU>Hz{0Wm|X5eQ4r8$Tk3j;r>VZy-7#0S<P%COB<
z;RNHhxAqVbMg~y^-zr~bzkTWsbxd5~281X>5Ca2L2Qz~x!_WWglNAo$g6d#l5M>B5
zny~P$)LF0yD9wv9%%0SIr(ycD{UB38O$bqjCa(8?)EgnDGBGeQh%%TfLQDlUQA8Ou
z9xqzMU;Pnk2FTRv$fBRuwtoSe0rG(;!{5jGF-3_Fpdui*3Uu$?^E5^o>{e#5so$j_
zrZO{t+*-g=;@3L$7gPtx)Wxc6f90891=|D4ccKj3N4R}nZha3{!@>YEHO%+=(%HHy
zU{hJZrn*5xfCX&o>)HijpB{dLngKHP&+F$I+iRE)fcy)}xuOh4`;I+uN`sin3O2P<
zVVgIfg$CGER<Nn<G7z`2f=!)g{N><!Uv>wG86Z;+vg8_U_IwF;87S|IGUTuGXt{3n
z1}Xw_>w@`Qx)I`vU{l$^rrJT>$_6&|$+OO~q+5{KVq*ZA%Jed$KKJW2u<JpkhbY4j
z{S5gBC*OiiWe2<U>E$*%hNBW-Q`y0$b_+w?$__SF$GK(4sSDqsIzXnfT+jaHw&pq5
zR8aXN%J9<M!Z@b!2UG;)*0>#u^A^anflcKAoBCT2Vk!sNRNIxE;geggf=%TByH(??
z+^Hw(cfn?WN-$A|-(C!#Cn+$2Lx~gY*7*j8_xhiTf=%TFo2my50Zy=~3r|huT{-76
z)C`bYk8RTYa!Y;_*d9<BD9SJ)i}UcmyC1-6K&f7oA&SMrqc>L)Y$_Lusa#-F+pM(h
z%b5;Ab%0EL)og1Ka_ccz1XPNOGN{z$n4Piw3>5)|K;*=Q^}^}gU{kqKOyvff>clIx
z^I<E*zue#u(7ToPV}3lu9#A<f%J9N5{D0V$-(XXDz#;HtwNQb_H6gI6pc-0~0T!-2
zU{k+r)->_i^%bfE<knwqMXd$vZh%EVCAlcWyw_Iy-Krp_@`6nj^zigt6UGBJl^5(*
zSQ_93oBCcVrc=iql3sbiZrz%{H0tRdNO}d;1)>a}885#u^SlkV2UOySGAxgr8Y4E3
z3v4Q=dm+kT28}H~u&F#oiHmLBenEAB+*-TOewNUyPvF=B)h410%S>bJWUoWifJ#15
z1{wArwfigC!KQ+0a#4oq(3Ax#{X`j#8<_31;D)4mPzfl?a6Lk+G_MF!GJxtMQHC#{
zr%o4m0|_Moa0sL^UV4-C1QM<S;1Gxxf}~dguv_2k$?rY*ngyH|1;8ONd-27P<3Fx|
zT@R|!L>WGID9qdN{~}Zblm@o<u;eIy6$HB#)P@pe$QFQ@DhM`JM0a<K<gQOp9iR}<
z;ZdK^%?A+y)rq1E_J0^>^G=22Eg`U5mswO8S>E9Vn<@l$D?8LwA+V`C`uDtg^5`iz
z6otTUeP_4VD{%5Yusxt!Rg__l!2h1PPaxqc3^w%}Qv<*2aY$?lgG~jsia{lmFxXTb
z%hkUhO@)+%!eCPm?b*{CQv4Ha52#)iWe}0F(E9xYlB-3)ruv2)$ogR+0(Pqi*i<8E
z8V~`S`peUM?Kze|V3&!2O=W)lpZB6Eq<jU{?4k@-T8Un)pI?L3h=NW1J4NnZxFy7`
zqF_^DAs`AiHA;MUwNlbIu**cjrcPbN>QH)b2iOcy+d!1z`!?hD;HMX$BB0oEy!CaL
zprSC?tzuwP?fD_GB?dNi_MF2`?OEHQIzX|NaBUOMb9G3018QA}GI$((8F%sTL$J-_
zV7Ch1aA$82;|H56j$*1f*i@cFv+nCYSP9huGWF2x^(h>_ka`Q$J`rV@Gi|?Qiy0$0
z^+|wDJ!SOP?d?fEu&EMYQ`hrC+$sS!_2UzHx!qH_!L^hGI0QN(bq>vUcnNkrsD&fS
zP<bfsS<eATnI#D}m8C0LU%yriY^o&K)Z2UzQzgNsUey+x&QWt6>{dyzsq5M&-3wj}
zDWgGcBvA%!W3>baCP>PX0-LITetyREKLTJ=rNE}bQkE3h)O!jc#l;IDWr-Bn)JZ<-
zzZbF21G^Q}$`WPh*3a@)^n~PCX|SoBJzjB=tdJT;8f+>owxq$P$`zRxh$g)TyHy%&
z>L<C6aSPoc=?K(L6J>~G=lP@>3dvhCU{li?Cd~Tk3MmO?P)wBpo2otW>dRVANVv*?
zO?_zbxY+a32e3V$mYyiXtW3>fn>CO;EDJVObT60V*{zV2B?~t7JT%A3f=vxqe{@Pk
zmIEAHvS3rar5;U@&xh0wpthnY!}{sn|L*RElrC~$Q!}qGQeS2PDYN9jrozfBIk2f0
zBdXkboFO3~2R1eMQ_IX$CkAjj0<|_p8AN*YSaLtV0*ACb*wm)u2KvjMaDZb=9&D;Q
zv^^jXHudu+kNC;KAHn{W2b(JFdLX7PwAUWgHv$bCptp4u(b}~jbxK&ol(C4ZU=dTr
zBBq8#OdX3DsEdy7K20p@Kq(Ymoi-MApiu&Jb-Gy8f!ZnP>h!UwGr%Hdh(!!kilUom
zj76OZ7BN#SVxXEC-8^$F>Oez?=;|!7sI$T%W{pM628)<27BNsu7u{ZaG<Bf53Y7jt
z8J>t<`XO@*(#BH&r)tN}C7yEIAvsV1oT{ZoAtjpvI8|>7SU1UE;WIc@D}Yn=ixUnq
z7w0|$=L}E^7G;>C5WoJ^zdKM7P>u2NWcQI5fzsf-qKIOuBG}YL*M%jt=I?>(0F~`8
zKQwXFEZqhc0p$TvhN~-XIo+Ll5-I{RHPyIghKrv#*i_KqtSAG_tx8~1{k1pF++PA|
z!z+Q^s!+MGYtpw1VAq3kktl=5S2?vG%MOA~RfdGXm6S?5Pgbz0$|!DC2Ag_e?T&X*
zdm(KvWw5D>H8(Z;-huRMK>1LVL1pI-D>Erb%U=a-YUBp@FHbK*Y77;ysqSKsa8&`D
z`cXgb$}UMr9isv^b$#z`YvwJG@&lBUMH%vs{4Q5IaSQBvRj{d*$EIysBnYY9RKce5
zi$hFR1)FN2FypUl1EkDV1)J(WJMKS=;t8;SL1lp`!-ri-!4GFY0h_7@Hg#FTUhg%t
zAoY+M*wlJx8c+k9s&Zz>hn&lho{k#W)Y~b^fxP;sz@~yq6H$gGD$5flszAzAb+D;A
z9%YZZ=0ie29c=1*XnCm)HnmmlX_3gPr%*FMX+UR7gO0iZ#0*e*B+78)ga2>NfFEGD
zYJg2OVF;L_|5FVdTN+?fVXa&Zu&H-iJ)~B5-+}4?nJQ@@(zDIvE?5LqqKPuFe_3kj
z@(a?!(FB`ny}v)M`WmFp)C8Lft1~shrW!3<@Z3Q2G1Lr@sk4rW<ZR-Aq%}~PD9RwX
zW5(;)(~$PH7TDA`5r1~o#W8{13L5tlWq`FBw7{k&_3tp2`wnrL7C2ldZ+)m(-37^Q
z+Tg*+XRH^)<0oAQhmtnf)ManZ^5{4`+z%R?0F5JxGJx_6D35D{O^xrkrm}$n(rVBK
zo4WF#fcT#G5HmpKvM598x#sfU%MXG5qXRZ|kp`P))b*eCAX9a~A@H0BlCpHbrq<^r
zX3Q(&1=o-|U{k*^ce|}MfV4b7CA%oY<Es1x?_4f{-Kq;Vb>()CJ^iYT;1JLSn+mG4
zL2lIrn;P{>l<Cn;NZVN#Z0hM^%|FUV8o(|C)eWKy773>_Y_CFGuLm~u_-yBEvu8rw
zss}dpI48uddSFv$oqZf8!1)C14n44`_tF)dZ9eY=n+mF3L>cZWzkX0t2kHIkgH1iE
z%+~Hc?>9IE^ueZvb3;tk2b=o1Chg#rslwn8&<C4ZJpF~K*c?cX1=UZY3>9kWB9U_;
z<$wX$)N4*VHnP}2dSwP+Q$ejkPzV@+O<f@VHf+O^rC^sCfK3fbSib%AKFDYVsD=||
zn4DGD`{M+}KZama>n|E+I<h|nyVVfIR70?-6SVAKr>jEBXhX268Hd(B{=^39g@Wox
zQHH+Uy*e8NA*LFEP33*{Gkd8cBm|7WrvB%Egn$v)RB_frfePOteLW+vsh1z5NA<6T
zj8B1TSy2Wy-BgZ*pKrinZwxjy=={0hSik>Zw;F>@oeeeB7;Ng}oF|O`TYf@yfbv%N
zBfa<)Q5V5s0;;D)8MMuwY;$<>9jwL#Z0dnmC)hYPGaLY=R}-+Qury!-HdWoH=b_np
zNcn04cB}f*b7CCFAmIwC=|vf;FHEhtat30mDcIBpkIgoH()<a|Tc%)BVR_3GY-%Cn
zML{Md4saSU1)KVKihsD@Y{+O7sI4H%P<{N~pYB*lnl=NQdhgUB)}Zr{Twn$^6_yLk
zz^00s7X{3^2g$K!U{hDm@)y}V58^UVYeSTQ;q7bY)QOOAH3yrT*=g_QdFKl_T+P9z
z!rW>OHuZwg(`beF=fR<94mNemucLQXlpO(wBB;G0${_dq@220SkdaRdu&J}3|L?M#
z45<q&z^1}VLJP2|pYB$!aGk&g4gm|WsZs(0$}`R$1DgtJ@rW|8e|wncu`CsAvnANn
z@O@v(7A=Ofoh`wp!g^(vU{hmTjvju}$O3NXTY^o!-XgO~^d_W54r()rGL*8mt||1M
z0=CBrY^va%buFo_FTf#S1vV8H0#;yC=k%%c9O{77+*V*yYtGKq)s}*!HBhTdl;Kyv
zw?!v4A#E3Hu&Mc8)`jLF2f(IUgH7EHEeAl$n?xCY6(w9h*s=ud4r{QfG5+&~cg&s(
z76G-}L>WS+Y!zNH<p5L!)OPvP=I+Vd^apIJ4cOFvE=b<80lPK){gJdg+uuQTfO3I0
zlLzaDO^`k`sO2Zhu;yK&()GrhU^TX2w{mP>a`&z$BwTI5rfNe?wFR4+)ZXL!|0rbK
z!4~Y+;%z_UPTkxIHUrdl6lGYlWY?ss{g7Un9oW<bS+93IR(%3?s~y->SUF$^HuaS1
zp`YhZLEK>nHZ?2p!i=m3kkkokeTp)8x%air-ToeIk3HB_vv^tMHG(YQy1*W6YCbz8
z1nj}4a?TH3x6=^P%CHBUy4SZPzI*B?aR12xtxXH+D>-5jbHXC#j77`^i<m1GG0><t
zdi&ZPi#iW1VxCyUys(IQV-fSgBIb)l%nys0KNhh7EMkFJ#6a^L=>84HqAmoBSSS{;
zFf=hx%?FB0QHCt0KL=)igQR!|a0=<QJFa={D+4%%fEHqiGQd)Z12~23v|aR*rw1~+
z>;O(7_ZizKU#o(YzM#|~$}m6kPUPB1NNRQjn>t79wB@{epTViw5hdL@f=w-}Fwv|P
zgOoImU{lQ`&wSp0;WxPa0;MNW25(I(7H)G$TgM4(YOY~n#oNvA!KQ+iogm!m1U6Or
ztvTC*;vG;kK>2wS-_kd4pDzN7fKsF=!{vI*e_4HyaTjN>sZpor2j;9f53YZl!ES}M
z7M#JRI`Ihe&Rz-`p>_tl)$z!=8<!LyvrM2gEy|$bq2#&H=L<OJxqwYIlsoi#-bqNf
zx`0iEl@cysQ!iW#VsDUzjP|&IO%+_j6fVQ|73@|}t`KD?pLyZM#g&jYvn$xtuQf8~
zt+spwhkz@JsjgsC%j5IvD)k{T;R-gj{Oy&ln!-(Bmx1z?D8qvI%!=uKkQpyGu&K|4
zcUYQc-UplN1~wJe3UdRS`t`%My}7YM;QGf6Z0h2sYuV-sjNrNhlru#c%HHnE{bB+c
zX>$jgdS?>H+?%r=gH3e@n+hv^-NB~rKi_&{)*i@ct2@|K>E}0W7tVw9l0bP|ltE`X
zdz#uoNS*8fHr4zOGqbTDBn^0=nCbyGb*I@am3)2%u**Earq*7&&=%tlX&Zn_2T=xZ
zMLoB+DUcBG1e;nbwAn_N2{JbB2{skhvhf6)IxBR`bMI}Cy3!MD>d||bh5uDU+GU{f
zMU<iG*tF=$7a;a{flUo)OP;<&1Jc9sLNV0~Z0hIeS@n`RkP_SrY^vDt?yO1mkg)<#
z2_?!9|7cpWb|oa8c!N#NT_AHPM(is%T)n}j!cvwu*i`1E#PoSjAo<f9Y^t&Oxn&^<
zkbD6u<3t%==BqVtc7@pE12**o=aRyGx{&sg57<;#d&viE>f`xrtZt7Xtxg}Xse(a0
z`y?A#!KngNN{TZ4XLx%3i3+48?h7`xAhdtdw`$0|lP}m*SiSBGHnlK2<!gw_UvTR5
z1)FMdN8obXw?|+RP&q5g&^|A;V8RzjtI`i_s`c&5=jZ)}^vL~CO!Whsx}<xR?z6qC
zpk{!|fhA@~y{|5T)Qq5#T9kqPq`<n<5AT81_=8O~be=Alkpmf%@JBJ#A8ab8>b1Lp
z2O;xL{$RJ3T=-nH@XT&-js=zVq700V6K!O690r>j05-KDWrvi(nz!KC3ILl5%LM^o
zQ@?N0Hw$Zp%!UMjO+9_p)Fr!s3mmSX+Cr2;o;}O|{>hDCQv<=KPP`Cc@n?|~xYP~=
zn+i*>fnZZ>3;Sx$6+u!~AlTFsvX{DUY-a=K3s8L{%5drGrB8|6`@yac0-Nf}@I%4q
z)>W`ugTSVmb3j@PL10tUbb{-iuYt@m1%XXnt`O2(_z^M!4XUw38QzO*I^b##Ndv)P
zQ<GJ9Z8;vs1MW2hgG~j^C4uUsV6drIXHCr0?O+7^HyCVcpZkh#nbn+Nw}R?CQ3gxj
zob3}mAbBeUZ0fsx%I-UOAh8t!HuXL$#H}G<Qx6=`2ypR&gg^+`)VuD#iy4exfI|^f
zYl<>-2KD{%Fou)^p<q+r9+Q*i>4uDUfmZH_GAw6<m>LQ;RmJGBiD?F;90&!QnrY?d
zD=rU76`*=oltF#cx8;gn5PQPFrp~a_Wcd!Aa|i>wl^fa$3j>>~RU_5KkpoHdVPI32
zT3$SV;^vM0Zx{kVt13Q#N<#q#jt`(2ZqSM!&|(UH2Idc-9xy)x3wW^?BLn9L(2OE@
z$q*93#J~mC2hsytBVflQ#IOxCt<L~z6TlS8g4Sy=g48g87A7$=u&|_ah%=;vY=o*|
zVqgR<Uj^|%v)99TofgJAERdfe7&%51kYj`cv^Ivs7~ue|=VD+0#|YSXj2Honf|tyI
zSfeq*09zRc3JwTHju8Xo7~vr!MtG<jBM=u-g#=}L(0XtX1}z{0Wo1w<2Ju0e6tqkQ
zlr2F^KtKyNK;oe6I*Nx!2rx4I`_Ih90N%qPzyVtB#=vj@lCs=D)6%|~$wm3a`DrBz
zt`*6tISQ8My3l3C;H?5qnQ3XD@h6B5GDt=S@G4m{bV9WJ`w!ZK25~n;1VVz+^@G;=
zpMLsh2&|sS!Jw_a`6j4Z+X7zg57NWH0IL2#X&%(b0;P4(qFYdUuYm4(YJu*1ngHGV
zGzYr>X$1qs(J%ipFo2q~AU$6B8Hss$sl_1MafyLk333B+ag4!EJ!dUjasjkTnt{P~
zLLG<=G7}fZ<$sV}Ojpldouel$FnKx$gSO7kb)ZfqE1Fmgbe|R|yg(RK)r0hc{Kmn^
z0AKtJ3M-I2XfFgv{sL%;3j+hg1L(f77vRAG1_sc=c~JTBgMk6Gw*ef`AU;SBs0?u|
zC<sd}D$dN$1Fz!*6)7(H$-$|~rA3(~mEeW~s2%4~S&&+klbM%Y?3|I9m!6seUKS2o
zh2;Yh3@r%BcS$Ts1*bt!@f4h#n3L*UlwSb06ci!B8Hq)yF8Rr5aRrKJLlZp%V*}8j
zJtR~??gFuJ(IC0uimAE(3zR<4%Mfhg1{w%)0Ih*#04+t&XDDLGW=I0>L(9gd9IqH?
zaTq9Vf$}k^M8>NaDhX1*6*SKUUS#jgkk63IP{82Nki?J$RY5!jvLECXkli3mtWMC7
z0Z1()gFizKLn??#76vWm1lbG2#25ndKWH%<NG&TvFheOrE<-LuA_HjepC>~eLmC4p
zPCz0h44Dl140#}hI52497GyW5-2kF-C_@njh1V0P2rGjNLq0<?*bS-R9f+j42Q;w(
svKNM-#^R+w%Y;)vi50IZ;w52rgJ@!Of!a{Ss3TSl$X*yGMh~+60Ertfs{jB1

diff --git a/tests/recursive/ls2003_bayesian_xls.mod b/tests/recursive/ls2003_bayesian_xls.mod
index 0fb926123c..c2795e475e 100644
--- a/tests/recursive/ls2003_bayesian_xls.mod
+++ b/tests/recursive/ls2003_bayesian_xls.mod
@@ -61,8 +61,4 @@ stderr e_ys,inv_gamma_pdf,1.2533,0.6551;
 stderr e_pies,inv_gamma_pdf,1.88,0.9827;
 end;
 
-if isoctave || ~matlab_ver_less_than('7.14') % xlsread is able to read XLSX without Excel installed since R2012a
 estimation(datafile='data_ca1_xls.xlsx',first_obs=8,nobs=[76 79],mh_nblocks=1,prefilter=1,mh_jscale=0.5,mh_replic=2000,forecast=8) y_obs R_obs pie_obs dq de;
-else
-estimation(datafile='data_ca1_xls.xls',first_obs=8,nobs=[76 79],mh_nblocks=1,prefilter=1,mh_jscale=0.5,mh_replic=2000,forecast=8) y_obs R_obs pie_obs dq de;
-end
diff --git a/tests/run_all_unitary_tests.m b/tests/run_all_unitary_tests.m
index a2d21ba65d..e9722569f8 100644
--- a/tests/run_all_unitary_tests.m
+++ b/tests/run_all_unitary_tests.m
@@ -39,7 +39,7 @@ if isoctave
 end
 
 % Set random seed, for reproducibility
-if isoctave || matlab_ver_less_than('7.12')
+if isoctave
     randn('state',1);
     rand('state',1);
 else
diff --git a/windows/README.txt b/windows/README.txt
index f7608c602e..af24e921ba 100644
--- a/windows/README.txt
+++ b/windows/README.txt
@@ -21,7 +21,7 @@ Note: Dynare comes with an automated uninstaller, which you can run from the
 Using Dynare with MATLAB®
 ─────────────────────────
 
-Dynare requires MATLAB® version 7.9 (R2009b) or above. With older versions of
+Dynare requires MATLAB® version 8.3 (R2014a) or above. With older versions of
 MATLAB®, it may fail or give unexpected results.
 
 To use Dynare, you just have to add the ‘matlab’ subdirectory of your Dynare
diff --git a/windows/build.sh b/windows/build.sh
index b402d1c2d1..a4f39ce002 100755
--- a/windows/build.sh
+++ b/windows/build.sh
@@ -108,7 +108,7 @@ cp dynare++/src/dynare++.exe dynare++/32-bit/
 ## Note that we do out-of-tree compilation, since we want to do these in
 ## parallel
 
-# Create Windows 32-bit DLL binaries for MATLAB ≥ R2009b
+# Create Windows 32-bit DLL binaries for MATLAB ≥ R2014a
 build_windows_matlab_mex_32 ()
 {
     mkdir -p "$TMP_DIRECTORY"/matlab-win32/
@@ -118,18 +118,18 @@ build_windows_matlab_mex_32 ()
 		     --with-gsl="$LIB32_MSYS2" \
 		     --with-matio="$LIB32_MSYS2" \
 		     --with-slicot="$LIB32"/Slicot/without-underscore \
-		     --with-matlab="$ROOT_DIRECTORY"/deps/matlab32/R2009b \
-		     MATLAB_VERSION=R2009b \
+		     --with-matlab="$ROOT_DIRECTORY"/deps/matlab32/R2014a \
+		     MATLAB_VERSION=R2014a \
 		     MEXEXT=mexw32 \
 		     PACKAGE_VERSION="$VERSION" \
 		     PACKAGE_STRING="dynare $VERSION"
     make -j"$NTHREADS" all
     i686-w64-mingw32-strip -- **/*.mexw32
-    mkdir -p "$ROOT_DIRECTORY"/../mex/matlab/win32-7.9-8.6
-    mv -- **/*.mexw32 "$ROOT_DIRECTORY"/../mex/matlab/win32-7.9-8.6
+    mkdir -p "$ROOT_DIRECTORY"/../mex/matlab/win32-8.3-8.6
+    mv -- **/*.mexw32 "$ROOT_DIRECTORY"/../mex/matlab/win32-8.3-8.6
 }
 
-# Create Windows 64-bit DLL binaries for MATLAB ≥ R2009b and ≤ R2017b
+# Create Windows 64-bit DLL binaries for MATLAB ≥ R2014a and ≤ R2017b
 build_windows_matlab_mex_64_a ()
 {
     mkdir -p "$TMP_DIRECTORY"/matlab-win64-a/
@@ -139,15 +139,15 @@ build_windows_matlab_mex_64_a ()
 		     --with-gsl="$LIB64_MSYS2" \
 		     --with-matio="$LIB64_MSYS2" \
 		     --with-slicot="$LIB64"/Slicot/without-underscore \
-		     --with-matlab="$ROOT_DIRECTORY"/deps/matlab64/R2009b \
-		     MATLAB_VERSION=R2009b \
+		     --with-matlab="$ROOT_DIRECTORY"/deps/matlab64/R2014a \
+		     MATLAB_VERSION=R2014a \
 		     MEXEXT=mexw64 \
 		     PACKAGE_VERSION="$VERSION" \
 		     PACKAGE_STRING="dynare $VERSION"
     make -j"$NTHREADS" all
     x86_64-w64-mingw32-strip -- **/*.mexw64
-    mkdir -p "$ROOT_DIRECTORY"/../mex/matlab/win64-7.9-9.3
-    mv -- **/*.mexw64 "$ROOT_DIRECTORY"/../mex/matlab/win64-7.9-9.3
+    mkdir -p "$ROOT_DIRECTORY"/../mex/matlab/win64-8.3-9.3
+    mv -- **/*.mexw64 "$ROOT_DIRECTORY"/../mex/matlab/win64-8.3-9.3
 }
 
 # Create Windows 64-bit DLL binaries for MATLAB ≥ R2018a
diff --git a/windows/deps/Makefile b/windows/deps/Makefile
index e51b9b9fbb..82c3968d97 100644
--- a/windows/deps/Makefile
+++ b/windows/deps/Makefile
@@ -1,4 +1,4 @@
-# Copyright © 2017-2019 Dynare Team
+# Copyright © 2017-2020 Dynare Team
 #
 # This file is part of Dynare.
 #
@@ -195,13 +195,13 @@ tarballs/matlab%.tar.xz:
 matlab32: tarballs/matlab32-$(MATLAB32_VERSION).tar.xz
 	rm -rf $@
 	mkdir -p $@
-	tar xf $< --directory $@ --strip-components=1
+	tar xf $< --directory $@
 	touch $@
 
 matlab64: tarballs/matlab64-$(MATLAB64_VERSION).tar.xz
 	rm -rf $@
 	mkdir -p $@
-	tar xf $< --directory $@ --strip-components=1
+	tar xf $< --directory $@
 	touch $@
 
 matlab: matlab32 matlab64
diff --git a/windows/deps/versions.mk b/windows/deps/versions.mk
index 811ee558fd..514d209a61 100644
--- a/windows/deps/versions.mk
+++ b/windows/deps/versions.mk
@@ -5,8 +5,8 @@ OCTAVE_VERSION = 5.2.0
 OCTAVE_W32_BUILD = _1
 OCTAVE_W64_BUILD = _1
 
-MATLAB32_VERSION = 20181204
-MATLAB64_VERSION = 20181204
+MATLAB32_VERSION = 20200407
+MATLAB64_VERSION = 20200407
 
 
 ### MSYS2 packages
diff --git a/windows/dynare.nsi b/windows/dynare.nsi
index 04a4278b64..8e8bea563b 100644
--- a/windows/dynare.nsi
+++ b/windows/dynare.nsi
@@ -91,9 +91,9 @@ SectionEnd
 
 SectionGroup "Dynare support for 64-bit MATLAB and Octave"
 
-Section "MEX files for MATLAB 64-bit, version 7.9 to 9.3 (R2009b to R2017b)"
- SetOutPath $INSTDIR\mex\matlab\win64-7.9-9.3
- File ..\mex\matlab\win64-7.9-9.3\*.mexw64
+Section "MEX files for MATLAB 64-bit, version 8.3 to 9.3 (R2014a to R2017b)"
+ SetOutPath $INSTDIR\mex\matlab\win64-8.3-9.3
+ File ..\mex\matlab\win64-8.3-9.3\*.mexw64
 SectionEnd
 
 Section "MEX files for MATLAB 64-bit, version 9.4 to 9.8 (R2018a to R2020a)"
@@ -116,9 +116,9 @@ SectionGroupEnd
 
 SectionGroup "Dynare support for 32-bit MATLAB and Octave"
 
-Section "MEX files for MATLAB 32-bit, version 7.9 to 8.6 (R2009b to R2015b)"
- SetOutPath $INSTDIR\mex\matlab\win32-7.9-8.6
- File ..\mex\matlab\win32-7.9-8.6\*.mexw32
+Section "MEX files for MATLAB 32-bit, version 8.3 to 8.6 (R2014a to R2015b)"
+ SetOutPath $INSTDIR\mex\matlab\win32-8.3-8.6
+ File ..\mex\matlab\win32-8.3-8.6\*.mexw32
 SectionEnd
 
 Section "MEX files for Octave 5.2.0 (32-bit)"
-- 
GitLab