From 293b0cecaff803a7fe3d6ada7d0109833bb6d3a8 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Mon, 23 Jul 2012 10:53:57 +0200 Subject: [PATCH 001/106] Add patched FindOpenSSL to fix cross-compilation for windows --- cmake/Modules/FindOpenSSL.cmake | 306 ++++++++++++++++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 cmake/Modules/FindOpenSSL.cmake diff --git a/cmake/Modules/FindOpenSSL.cmake b/cmake/Modules/FindOpenSSL.cmake new file mode 100644 index 0000000000..0191714355 --- /dev/null +++ b/cmake/Modules/FindOpenSSL.cmake @@ -0,0 +1,306 @@ +# - Try to find the OpenSSL encryption library +# Once done this will define +# +# OPENSSL_ROOT_DIR - Set this variable to the root installation of OpenSSL +# +# Read-Only variables: +# OPENSSL_FOUND - system has the OpenSSL library +# OPENSSL_INCLUDE_DIR - the OpenSSL include directory +# OPENSSL_LIBRARIES - The libraries needed to use OpenSSL +# OPENSSL_VERSION - This is set to $major.$minor.$revision$path (eg. 0.9.8s) + +#============================================================================= +# Copyright 2006-2009 Kitware, Inc. +# Copyright 2006 Alexander Neundorf +# Copyright 2009-2011 Mathieu Malaterre +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +if (UNIX) + find_package(PkgConfig QUIET) + pkg_check_modules(_OPENSSL QUIET openssl) +endif (UNIX) + +# http://www.slproweb.com/products/Win32OpenSSL.html +SET(_OPENSSL_ROOT_HINTS + $ENV{OPENSSL_ROOT_DIR} + ${OPENSSL_ROOT_DIR} + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (32-bit)_is1;Inno Setup: App Path]" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (64-bit)_is1;Inno Setup: App Path]" + ) +SET(_OPENSSL_ROOT_PATHS + "$ENV{PROGRAMFILES}/OpenSSL" + "$ENV{PROGRAMFILES}/OpenSSL-Win32" + "$ENV{PROGRAMFILES}/OpenSSL-Win64" + "C:/OpenSSL/" + "C:/OpenSSL-Win32/" + "C:/OpenSSL-Win64/" + ) +SET(_OPENSSL_ROOT_HINTS_AND_PATHS + HINTS ${_OPENSSL_ROOT_HINTS} + PATHS ${_OPENSSL_ROOT_PATHS} + ) + +FIND_PATH(OPENSSL_INCLUDE_DIR + NAMES + openssl/ssl.h + HINTS + ${_OPENSSL_INCLUDEDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + include +) + +IF(WIN32 AND NOT CYGWIN) + # MINGW should go here too + IF(MSVC) + # /MD and /MDd are the standard values - if someone wants to use + # others, the libnames have to change here too + # use also ssl and ssleay32 in debug as fallback for openssl < 0.9.8b + # TODO: handle /MT and static lib + # In Visual C++ naming convention each of these four kinds of Windows libraries has it's standard suffix: + # * MD for dynamic-release + # * MDd for dynamic-debug + # * MT for static-release + # * MTd for static-debug + + # Implementation details: + # We are using the libraries located in the VC subdir instead of the parent directory eventhough : + # libeay32MD.lib is identical to ../libeay32.lib, and + # ssleay32MD.lib is identical to ../ssleay32.lib + FIND_LIBRARY(LIB_EAY_DEBUG + NAMES + libeay32MDd + libeay32 + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "VC" + "lib/VC" + ) + + FIND_LIBRARY(LIB_EAY_RELEASE + NAMES + libeay32MD + libeay32 + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "VC" + "lib/VC" + ) + + FIND_LIBRARY(SSL_EAY_DEBUG + NAMES + ssleay32MDd + ssleay32 + ssl + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "VC" + "lib/VC" + ) + + FIND_LIBRARY(SSL_EAY_RELEASE + NAMES + ssleay32MD + ssleay32 + ssl + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "VC" + "lib/VC" + ) + + if( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE ) + set( OPENSSL_LIBRARIES + optimized ${SSL_EAY_RELEASE} debug ${SSL_EAY_DEBUG} + optimized ${LIB_EAY_RELEASE} debug ${LIB_EAY_DEBUG} + ) + else() + set( OPENSSL_LIBRARIES ${SSL_EAY_RELEASE} ${LIB_EAY_RELEASE} ) + endif() + MARK_AS_ADVANCED(SSL_EAY_DEBUG SSL_EAY_RELEASE) + MARK_AS_ADVANCED(LIB_EAY_DEBUG LIB_EAY_RELEASE) + ELSEIF(MINGW) + # same player, for MingW + FIND_LIBRARY(LIB_EAY + NAMES + libeay32 + crypto + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "lib/MinGW" + ) + + FIND_LIBRARY(SSL_EAY + NAMES + ssleay32 + ssl + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "lib/MinGW" + ) + + MARK_AS_ADVANCED(SSL_EAY LIB_EAY) + set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} ) + ELSE(MSVC) + # Not sure what to pick for -say- intel, let's use the toplevel ones and hope someone report issues: + FIND_LIBRARY(LIB_EAY + NAMES + libeay32 + HINTS + ${_OPENSSL_LIBDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + lib + ) + + FIND_LIBRARY(SSL_EAY + NAMES + ssleay32 + HINTS + ${_OPENSSL_LIBDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + lib + ) + + MARK_AS_ADVANCED(SSL_EAY LIB_EAY) + set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} ) + ENDIF(MSVC) +ELSE(WIN32 AND NOT CYGWIN) + + FIND_LIBRARY(OPENSSL_SSL_LIBRARY + NAMES + ssl + ssleay32 + ssleay32MD + HINTS + ${_OPENSSL_LIBDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + lib + ) + + FIND_LIBRARY(OPENSSL_CRYPTO_LIBRARY + NAMES + crypto + HINTS + ${_OPENSSL_LIBDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + lib + ) + + MARK_AS_ADVANCED(OPENSSL_CRYPTO_LIBRARY OPENSSL_SSL_LIBRARY) + + # compat defines + SET(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY}) + SET(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY}) + + SET(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY}) + +ENDIF(WIN32 AND NOT CYGWIN) + +function(from_hex HEX DEC) + string(TOUPPER "${HEX}" HEX) + set(_res 0) + string(LENGTH "${HEX}" _strlen) + + while (_strlen GREATER 0) + math(EXPR _res "${_res} * 16") + string(SUBSTRING "${HEX}" 0 1 NIBBLE) + string(SUBSTRING "${HEX}" 1 -1 HEX) + if (NIBBLE STREQUAL "A") + math(EXPR _res "${_res} + 10") + elseif (NIBBLE STREQUAL "B") + math(EXPR _res "${_res} + 11") + elseif (NIBBLE STREQUAL "C") + math(EXPR _res "${_res} + 12") + elseif (NIBBLE STREQUAL "D") + math(EXPR _res "${_res} + 13") + elseif (NIBBLE STREQUAL "E") + math(EXPR _res "${_res} + 14") + elseif (NIBBLE STREQUAL "F") + math(EXPR _res "${_res} + 15") + else() + math(EXPR _res "${_res} + ${NIBBLE}") + endif() + + string(LENGTH "${HEX}" _strlen) + endwhile() + + set(${DEC} ${_res} PARENT_SCOPE) +endfunction(from_hex) + +if (OPENSSL_INCLUDE_DIR) + if (_OPENSSL_VERSION) + set(OPENSSL_VERSION "${_OPENSSL_VERSION}") + elseif(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h") + file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str + REGEX "^#define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*") + + # The version number is encoded as 0xMNNFFPPS: major minor fix patch status + # The status gives if this is a developer or prerelease and is ignored here. + # Major, minor, and fix directly translate into the version numbers shown in + # the string. The patch field translates to the single character suffix that + # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so + # on. + + string(REGEX REPLACE "^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]).*$" + "\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}") + list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR) + list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR) + from_hex("${OPENSSL_VERSION_MINOR}" OPENSSL_VERSION_MINOR) + list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX) + from_hex("${OPENSSL_VERSION_FIX}" OPENSSL_VERSION_FIX) + list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH) + + if (NOT OPENSSL_VERSION_PATCH STREQUAL "00") + from_hex("${OPENSSL_VERSION_PATCH}" _tmp) + # 96 is the ASCII code of 'a' minus 1 + math(EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96") + unset(_tmp) + # Once anyone knows how OpenSSL would call the patch versions beyond 'z' + # this should be updated to handle that, too. This has not happened yet + # so it is simply ignored here for now. + string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING) + endif (NOT OPENSSL_VERSION_PATCH STREQUAL "00") + + set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}") + endif (_OPENSSL_VERSION) +endif (OPENSSL_INCLUDE_DIR) + +include(FindPackageHandleStandardArgs) + +if (OPENSSL_VERSION) + find_package_handle_standard_args(OpenSSL + REQUIRED_VARS + OPENSSL_LIBRARIES + OPENSSL_INCLUDE_DIR + VERSION_VAR + OPENSSL_VERSION + FAIL_MESSAGE + "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" + ) +else (OPENSSL_VERSION) + find_package_handle_standard_args(OpenSSL "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" + OPENSSL_LIBRARIES + OPENSSL_INCLUDE_DIR + ) +endif (OPENSSL_VERSION) + +MARK_AS_ADVANCED(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES) From 1352f6bc392a8b36149c397d3a355b5dd13f1943 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 24 Jul 2012 09:36:06 +0200 Subject: [PATCH 002/106] MD5 Support WIP --- modules/csync_owncloud.c | 19 +- src/csync_private.h | 1 + src/csync_reconcile.c | 436 +++++++++++++++--------------- src/csync_statedb.c | 26 +- src/csync_update.c | 4 +- src/vio/csync_vio_file_stat.h | 2 + src/vio/csync_vio_local.c | 5 + tests/ownCloud/mocka/ocmod_test.c | 5 +- 8 files changed, 270 insertions(+), 228 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 64f293d0f0..2d1ec4826a 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -89,6 +89,7 @@ typedef struct resource { enum resource_type type; dav_size_t size; time_t modtime; + char md5[33]; struct resource *next; } resource; @@ -136,6 +137,7 @@ static const ne_propname ls_props[] = { { "DAV:", "getlastmodified" }, { "DAV:", "getcontentlength" }, { "DAV:", "resourcetype" }, + { "DAV:", "getetag"}, { NULL, NULL } }; @@ -446,6 +448,7 @@ static void results(void *userdata, struct resource *newres = 0; const char *clength, *modtime = NULL; const char *resourcetype = NULL; + const char *md5sum = NULL; const ne_status *status = NULL; char *path = ne_path_unescape( uri->path ); @@ -485,6 +488,7 @@ static void results(void *userdata, modtime = ne_propset_value( set, &ls_props[0] ); clength = ne_propset_value( set, &ls_props[1] ); resourcetype = ne_propset_value( set, &ls_props[2] ); + md5sum = ne_propset_value( set, &ls_props[3] ); newres->type = resr_normal; if( clength == NULL && resourcetype && strncmp( resourcetype, "", 16 ) == 0) { @@ -503,6 +507,12 @@ static void results(void *userdata, } } + if( md5sum ) { + /* Skip the " around the string coming back from teh ne_propset_value call */ + strncpy( newres->md5, md5sum+1, 32 ); + DEBUG_WEBDAV("OOOOOOOOOOOOOOOOOOOOO %s", newres->md5); + } + /* prepend the new resource to the result list */ newres->next = fetchCtx->list; fetchCtx->list = newres; @@ -609,7 +619,9 @@ static csync_vio_file_stat_t *resourceToFileStat( struct resource *res ) lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; lfs->size = res->size; lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; - + lfs->md5 = c_strdup(res->md5); + DEBUG_WEBDAV("XXXXXXXXXXXXXXXXXXXXX MD5: %s", lfs->md5 ); + lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; return lfs; } @@ -710,10 +722,12 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_PERMISSIONS; + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; buf->fields = _fs.fields; buf->type = _fs.type; buf->mtime = _fs.mtime; + buf->md5 = c_strdup( _fs.md5 ); buf->size = _fs.size; buf->mode = _stat_perms( _fs.type ); @@ -773,12 +787,14 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_PERMISSIONS; + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; buf->fields = lfs->fields; buf->type = lfs->type; buf->mtime = lfs->mtime; buf->size = lfs->size; buf->mode = _stat_perms( lfs->type ); + buf->md5 = c_strdup( lfs->md5 ); csync_vio_file_stat_destroy( lfs ); } @@ -1395,6 +1411,7 @@ static csync_vio_file_stat_t *owncloud_readdir(csync_vio_method_handle_t *dhandl _fs.fields = lfs->fields; _fs.type = lfs->type; _fs.size = lfs->size; + _fs.md5 = c_strdup( lfs->md5 ); } /* DEBUG_WEBDAV("LFS fields: %s: %d", lfs->name, lfs->type ); */ diff --git a/src/csync_private.h b/src/csync_private.h index b0160b5403..009043d9ee 100644 --- a/src/csync_private.h +++ b/src/csync_private.h @@ -159,6 +159,7 @@ struct csync_file_stat_s { mode_t mode; /* u32 */ int nlink; /* u32 */ int type; /* u32 */ + char *md5; enum csync_instructions_e instruction; /* u32 */ char path[1]; /* u8 */ } diff --git a/src/csync_reconcile.c b/src/csync_reconcile.c index a36b351ef5..f9941b3457 100644 --- a/src/csync_reconcile.c +++ b/src/csync_reconcile.c @@ -41,241 +41,241 @@ * source and the destination, have been changed, the newer file wins. */ static int _csync_merge_algorithm_visitor(void *obj, void *data) { - csync_file_stat_t *cur = NULL; - csync_file_stat_t *other = NULL; - CSYNC *ctx = NULL; - c_rbtree_t *tree = NULL; - c_rbnode_t *node = NULL; + csync_file_stat_t *cur = NULL; + csync_file_stat_t *other = NULL; + CSYNC *ctx = NULL; + c_rbtree_t *tree = NULL; + c_rbnode_t *node = NULL; - cur = (csync_file_stat_t *) obj; - ctx = (CSYNC *) data; + cur = (csync_file_stat_t *) obj; + ctx = (CSYNC *) data; - /* we need the opposite tree! */ - switch (ctx->current) { + /* we need the opposite tree! */ + switch (ctx->current) { case LOCAL_REPLICA: - tree = ctx->remote.tree; - break; + tree = ctx->remote.tree; + break; case REMOTE_REPLCIA: - tree = ctx->local.tree; - break; + tree = ctx->local.tree; + break; default: - break; - } - - node = c_rbtree_find(tree, &cur->phash); - /* file only found on current replica */ - if (node == NULL) { - switch(cur->instruction) { - /* file has been modified */ - case CSYNC_INSTRUCTION_EVAL: - cur->instruction = CSYNC_INSTRUCTION_NEW; - break; - /* file has been removed on the opposite replica */ - case CSYNC_INSTRUCTION_NONE: - cur->instruction = CSYNC_INSTRUCTION_REMOVE; - break; - case CSYNC_INSTRUCTION_RENAME: - cur->instruction = CSYNC_INSTRUCTION_NEW; - break; - default: break; } - } else { - /* + + node = c_rbtree_find(tree, &cur->phash); + /* file only found on current replica */ + if (node == NULL) { + switch(cur->instruction) { + /* file has been modified */ + case CSYNC_INSTRUCTION_EVAL: + cur->instruction = CSYNC_INSTRUCTION_NEW; + break; + /* file has been removed on the opposite replica */ + case CSYNC_INSTRUCTION_NONE: + cur->instruction = CSYNC_INSTRUCTION_REMOVE; + break; + case CSYNC_INSTRUCTION_RENAME: + cur->instruction = CSYNC_INSTRUCTION_NEW; + break; + default: + break; + } + } else { + /* * file found on the other replica */ - other = (csync_file_stat_t *) node->data; + other = (csync_file_stat_t *) node->data; - switch (cur->instruction) { - /* file on current replica is new */ - case CSYNC_INSTRUCTION_NEW: - switch (other->instruction) { - /* file on other replica is new too */ - case CSYNC_INSTRUCTION_NEW: - if (cur->modtime > other->modtime) { - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"file new on both, cur is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_CONFLICT; - other->instruction = CSYNC_INSTRUCTION_NONE; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_SYNC; - other->instruction = CSYNC_INSTRUCTION_NONE; - } - - } else if (cur->modtime < other->modtime) { - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"file new on both, other is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_NONE; - other->instruction = CSYNC_INSTRUCTION_CONFLICT; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_NONE; - other->instruction = CSYNC_INSTRUCTION_SYNC; - } - - } else { - /* file are equal */ - cur->instruction = CSYNC_INSTRUCTION_NONE; - other->instruction = CSYNC_INSTRUCTION_NONE; + switch (cur->instruction) { + /* file on current replica is new */ + case CSYNC_INSTRUCTION_NEW: + switch (other->instruction) { + /* file on other replica is new too */ + case CSYNC_INSTRUCTION_NEW: + if (cur->modtime > other->modtime) { + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"file new on both, cur is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_CONFLICT; + other->instruction = CSYNC_INSTRUCTION_NONE; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_SYNC; + other->instruction = CSYNC_INSTRUCTION_NONE; + } + + } else if (cur->modtime < other->modtime) { + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"file new on both, other is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_NONE; + other->instruction = CSYNC_INSTRUCTION_CONFLICT; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_NONE; + other->instruction = CSYNC_INSTRUCTION_SYNC; + } + + } else { + /* file are equal */ + cur->instruction = CSYNC_INSTRUCTION_NONE; + other->instruction = CSYNC_INSTRUCTION_NONE; + } + break; + /* file on other replica has changed too */ + case CSYNC_INSTRUCTION_EVAL: + /* file on current replica is newer */ + if (cur->modtime > other->modtime) { + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"new on cur, modified on other, cur is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_CONFLICT; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_SYNC; + } + + } else { + /* file on opposite replica is newer */ + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"new on cur, modified on other, other is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_NONE; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_NONE; + } + + } + break; + /* file on the other replica has not been modified */ + case CSYNC_INSTRUCTION_NONE: + cur->instruction = CSYNC_INSTRUCTION_SYNC; + break; + default: + break; } break; - /* file on other replica has changed too */ - case CSYNC_INSTRUCTION_EVAL: - /* file on current replica is newer */ - if (cur->modtime > other->modtime) { - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"new on cur, modified on other, cur is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_CONFLICT; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_SYNC; - } - - } else { - /* file on opposite replica is newer */ - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"new on cur, modified on other, other is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_NONE; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_NONE; - } - + /* file on current replica has been modified */ + case CSYNC_INSTRUCTION_EVAL: + switch (other->instruction) { + /* file on other replica is new too */ + case CSYNC_INSTRUCTION_NEW: + if (cur->modtime > other->modtime) { + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"modified on cur, new on other, cur is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_CONFLICT; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_SYNC; + } + + } else { + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"modified on cur, new on other, other is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_NONE; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_NONE; + } + } + break; + /* file on other replica has changed too */ + case CSYNC_INSTRUCTION_EVAL: + /* file on current replica is newer */ + if (cur->modtime > other->modtime) { + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"both modified, cur is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_CONFLICT; + other->instruction= CSYNC_INSTRUCTION_NONE; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_SYNC; + } + + } else { + /* file on opposite replica is newer */ + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"both modified, other is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_NONE; + other->instruction=CSYNC_INSTRUCTION_CONFLICT; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_NONE; + } + } + break; + /* file on the other replica has not been modified */ + case CSYNC_INSTRUCTION_NONE: + cur->instruction = CSYNC_INSTRUCTION_SYNC; + break; + default: + break; } break; - /* file on the other replica has not been modified */ - case CSYNC_INSTRUCTION_NONE: - cur->instruction = CSYNC_INSTRUCTION_SYNC; - break; - default: + default: break; } - break; - /* file on current replica has been modified */ - case CSYNC_INSTRUCTION_EVAL: - switch (other->instruction) { - /* file on other replica is new too */ - case CSYNC_INSTRUCTION_NEW: - if (cur->modtime > other->modtime) { - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"modified on cur, new on other, cur is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_CONFLICT; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_SYNC; - } - - } else { - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"modified on cur, new on other, other is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_NONE; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_NONE; - } - } - break; - /* file on other replica has changed too */ - case CSYNC_INSTRUCTION_EVAL: - /* file on current replica is newer */ - if (cur->modtime > other->modtime) { - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"both modified, cur is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_CONFLICT; - other->instruction= CSYNC_INSTRUCTION_NONE; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_SYNC; - } - - } else { - /* file on opposite replica is newer */ - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"both modified, other is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_NONE; - other->instruction=CSYNC_INSTRUCTION_CONFLICT; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_NONE; - } - } - break; - /* file on the other replica has not been modified */ - case CSYNC_INSTRUCTION_NONE: - cur->instruction = CSYNC_INSTRUCTION_SYNC; - break; - default: - break; - } - break; - default: - break; } - } - - //hide instruction NONE messages when log level is set to debug, - //only show these messages on log level trace - if(cur->instruction ==CSYNC_INSTRUCTION_NONE) - { - if(cur->type == CSYNC_FTW_TYPE_DIR) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, - "%-20s dir: %s", - csync_instruction_str(cur->instruction), - cur->path); - } - else - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, - "%-20s file: %s", - csync_instruction_str(cur->instruction), - cur->path); - } - } - else - { - if(cur->type == CSYNC_FTW_TYPE_DIR) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, - "%-20s dir: %s", - csync_instruction_str(cur->instruction), - cur->path); - } - else - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, - "%-20s file: %s", - csync_instruction_str(cur->instruction), - cur->path); - } - } - - return 0; + + //hide instruction NONE messages when log level is set to debug, + //only show these messages on log level trace + if(cur->instruction ==CSYNC_INSTRUCTION_NONE) + { + if(cur->type == CSYNC_FTW_TYPE_DIR) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, + "%-20s dir: %s", + csync_instruction_str(cur->instruction), + cur->path); + } + else + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, + "%-20s file: %s", + csync_instruction_str(cur->instruction), + cur->path); + } + } + else + { + if(cur->type == CSYNC_FTW_TYPE_DIR) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, + "%-20s dir: %s", + csync_instruction_str(cur->instruction), + cur->path); + } + else + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, + "%-20s file: %s", + csync_instruction_str(cur->instruction), + cur->path); + } + } + + return 0; } int csync_reconcile_updates(CSYNC *ctx) { diff --git a/src/csync_statedb.c b/src/csync_statedb.c index 981a828877..c2a84d440b 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -213,6 +213,7 @@ int csync_statedb_create_tables(CSYNC *ctx) { "gid INTEGER," "mode INTEGER," "modtime INTEGER(8)," + "md5 VARCHAR(32)," "PRIMARY KEY(phash)" ");" ); @@ -232,6 +233,7 @@ int csync_statedb_create_tables(CSYNC *ctx) { "gid INTEGER," "mode INTEGER," "modtime INTEGER(8)," + "md5 VARCHAR(32)," "PRIMARY KEY(phash)" ");" ); @@ -254,6 +256,13 @@ int csync_statedb_create_tables(CSYNC *ctx) { } c_strlist_destroy(result); + result = csync_statedb_query(ctx, + "CREATE INDEX metadata_md5 ON metadata(md5);"); + if (result == NULL) { + return -1; + } + c_strlist_destroy(result); + return 0; } @@ -296,8 +305,8 @@ static int _insert_metadata_visitor(void *obj, void *data) { case CSYNC_INSTRUCTION_CONFLICT: CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "SQL statement: INSERT INTO metadata_temp \n" - "\t\t\t(phash, pathlen, path, inode, uid, gid, mode, modtime) VALUES \n" - "\t\t\t(%llu, %lu, %s, %llu, %u, %u, %u, %lu);", + "\t\t\t(phash, pathlen, path, inode, uid, gid, mode, modtime, md5) VALUES \n" + "\t\t\t(%llu, %lu, %s, %llu, %u, %u, %u, %lu, %s);", (long long unsigned int) fs->phash, (long unsigned int) fs->pathlen, fs->path, @@ -305,14 +314,15 @@ static int _insert_metadata_visitor(void *obj, void *data) { fs->uid, fs->gid, fs->mode, - fs->modtime); + fs->modtime, + fs->md5); /* * The phash needs to be long long unsigned int or it segfaults on PPC */ stmt = sqlite3_mprintf("INSERT INTO metadata_temp " - "(phash, pathlen, path, inode, uid, gid, mode, modtime) VALUES " - "(%llu, %lu, '%q', %llu, %u, %u, %u, %lu);", + "(phash, pathlen, path, inode, uid, gid, mode, modtime, md5) VALUES " + "(%llu, %lu, '%q', %llu, %u, %u, %u, %lu, '%s');", (long long unsigned int) fs->phash, (long unsigned int) fs->pathlen, fs->path, @@ -320,7 +330,8 @@ static int _insert_metadata_visitor(void *obj, void *data) { fs->uid, fs->gid, fs->mode, - fs->modtime); + fs->modtime, + fs->md5); if (stmt == NULL) { return -1; @@ -413,7 +424,7 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx, uint64_t phash) { st->gid = atoi(result->vector[5]); st->mode = atoi(result->vector[6]); st->modtime = strtoul(result->vector[7], NULL, 10); - + st->md5 = c_strdup( result->vector[8] ); c_strlist_destroy(result); return st; @@ -463,6 +474,7 @@ csync_file_stat_t *csync_statedb_get_stat_by_inode(CSYNC *ctx, ino_t inode) { st->gid = atoi(result->vector[5]); st->mode = atoi(result->vector[6]); st->modtime = strtoul(result->vector[7], NULL, 10); + st->md5 = c_strdup(result->vector[8]); c_strlist_destroy(result); diff --git a/src/csync_update.c b/src/csync_update.c index c69ab32782..592e6d1204 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -103,7 +103,8 @@ static int _csync_detect_update(CSYNC *ctx, const char *file, /* we have an update! */ CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "time compare: %lu <-> %lu", fs->mtime, tmp->modtime); - if (fs->mtime > tmp->modtime) { + if( !c_streq(fs->md5, tmp->md5 )) { + // if (!fs->mtime > tmp->modtime) { st->instruction = CSYNC_INSTRUCTION_EVAL; goto out; } @@ -139,6 +140,7 @@ out: st->gid = fs->gid; st->nlink = fs->nlink; st->type = type; + st->md5 = c_strdup(fs->md5); st->phash = h; st->pathlen = len; diff --git a/src/vio/csync_vio_file_stat.h b/src/vio/csync_vio_file_stat.h index 9be23eb229..626c3de519 100644 --- a/src/vio/csync_vio_file_stat.h +++ b/src/vio/csync_vio_file_stat.h @@ -71,6 +71,7 @@ enum csync_vio_file_stat_fields_e { CSYNC_VIO_FILE_STAT_FIELDS_ACL = 1 << 14, CSYNC_VIO_FILE_STAT_FIELDS_UID = 1 << 15, CSYNC_VIO_FILE_STAT_FIELDS_GID = 1 << 16, + CSYNC_VIO_FILE_STAT_FIELDS_MD5 = 1 << 17, }; @@ -82,6 +83,7 @@ struct csync_vio_file_stat_s { void *acl; char *name; + char *md5; uid_t uid; gid_t gid; diff --git a/src/vio/csync_vio_local.c b/src/vio/csync_vio_local.c index 62a01dd0ed..921e8fa8e1 100644 --- a/src/vio/csync_vio_local.c +++ b/src/vio/csync_vio_local.c @@ -35,6 +35,8 @@ #include "c_private.h" #include "c_lib.h" #include "c_string.h" +#include "csync_util.h" +#include "csync_log.h" #include "vio/csync_vio_local.h" @@ -366,6 +368,9 @@ int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->ctime = sb.st_ctime; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_CTIME; + buf->md5 = csync_file_md5( uri ); + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; + c_free_multibyte(wuri); return 0; } diff --git a/tests/ownCloud/mocka/ocmod_test.c b/tests/ownCloud/mocka/ocmod_test.c index 74365c69cc..843f5248ed 100644 --- a/tests/ownCloud/mocka/ocmod_test.c +++ b/tests/ownCloud/mocka/ocmod_test.c @@ -134,6 +134,7 @@ static void fetch_a_context(void **state) { assert_true( fetchCtx->currResource->name != NULL ); printf( " %s -> %s\n", fetchCtx->currResource->uri, fetchCtx->currResource->name ); + printf( " MD5: %s\n", fetchCtx->currResource->md5); fetchCtx->currResource = fetchCtx->currResource->next; } } @@ -299,11 +300,13 @@ int main(void) { const UnitTest tests[] = { unit_test(null_test_success), unit_test(connect_test_success), - unit_test(fetch_a_context), unit_test_setup_teardown(test_setup_dirs, setup_toplevel_dir, teardown_toplevel_dir), unit_test(test_upload_files), + unit_test(fetch_a_context), unit_test(test_download_files), }; + srand(time(NULL)); + return run_tests(tests); } From 91349558995be28e1413043e7e7bf9f69a20ddb4 Mon Sep 17 00:00:00 2001 From: Thomas Mueller Date: Thu, 26 Jul 2012 13:03:37 +0200 Subject: [PATCH 003/106] use custom FindOpenSSL only for cross compilation in any other cases it is used from the local system --- cmake/Modules/FindOpenSSLCross.cmake | 306 +++++++++++++++++++++++++++ src/CMakeLists.txt | 6 +- 2 files changed, 311 insertions(+), 1 deletion(-) create mode 100644 cmake/Modules/FindOpenSSLCross.cmake diff --git a/cmake/Modules/FindOpenSSLCross.cmake b/cmake/Modules/FindOpenSSLCross.cmake new file mode 100644 index 0000000000..0191714355 --- /dev/null +++ b/cmake/Modules/FindOpenSSLCross.cmake @@ -0,0 +1,306 @@ +# - Try to find the OpenSSL encryption library +# Once done this will define +# +# OPENSSL_ROOT_DIR - Set this variable to the root installation of OpenSSL +# +# Read-Only variables: +# OPENSSL_FOUND - system has the OpenSSL library +# OPENSSL_INCLUDE_DIR - the OpenSSL include directory +# OPENSSL_LIBRARIES - The libraries needed to use OpenSSL +# OPENSSL_VERSION - This is set to $major.$minor.$revision$path (eg. 0.9.8s) + +#============================================================================= +# Copyright 2006-2009 Kitware, Inc. +# Copyright 2006 Alexander Neundorf +# Copyright 2009-2011 Mathieu Malaterre +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +if (UNIX) + find_package(PkgConfig QUIET) + pkg_check_modules(_OPENSSL QUIET openssl) +endif (UNIX) + +# http://www.slproweb.com/products/Win32OpenSSL.html +SET(_OPENSSL_ROOT_HINTS + $ENV{OPENSSL_ROOT_DIR} + ${OPENSSL_ROOT_DIR} + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (32-bit)_is1;Inno Setup: App Path]" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (64-bit)_is1;Inno Setup: App Path]" + ) +SET(_OPENSSL_ROOT_PATHS + "$ENV{PROGRAMFILES}/OpenSSL" + "$ENV{PROGRAMFILES}/OpenSSL-Win32" + "$ENV{PROGRAMFILES}/OpenSSL-Win64" + "C:/OpenSSL/" + "C:/OpenSSL-Win32/" + "C:/OpenSSL-Win64/" + ) +SET(_OPENSSL_ROOT_HINTS_AND_PATHS + HINTS ${_OPENSSL_ROOT_HINTS} + PATHS ${_OPENSSL_ROOT_PATHS} + ) + +FIND_PATH(OPENSSL_INCLUDE_DIR + NAMES + openssl/ssl.h + HINTS + ${_OPENSSL_INCLUDEDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + include +) + +IF(WIN32 AND NOT CYGWIN) + # MINGW should go here too + IF(MSVC) + # /MD and /MDd are the standard values - if someone wants to use + # others, the libnames have to change here too + # use also ssl and ssleay32 in debug as fallback for openssl < 0.9.8b + # TODO: handle /MT and static lib + # In Visual C++ naming convention each of these four kinds of Windows libraries has it's standard suffix: + # * MD for dynamic-release + # * MDd for dynamic-debug + # * MT for static-release + # * MTd for static-debug + + # Implementation details: + # We are using the libraries located in the VC subdir instead of the parent directory eventhough : + # libeay32MD.lib is identical to ../libeay32.lib, and + # ssleay32MD.lib is identical to ../ssleay32.lib + FIND_LIBRARY(LIB_EAY_DEBUG + NAMES + libeay32MDd + libeay32 + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "VC" + "lib/VC" + ) + + FIND_LIBRARY(LIB_EAY_RELEASE + NAMES + libeay32MD + libeay32 + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "VC" + "lib/VC" + ) + + FIND_LIBRARY(SSL_EAY_DEBUG + NAMES + ssleay32MDd + ssleay32 + ssl + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "VC" + "lib/VC" + ) + + FIND_LIBRARY(SSL_EAY_RELEASE + NAMES + ssleay32MD + ssleay32 + ssl + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "VC" + "lib/VC" + ) + + if( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE ) + set( OPENSSL_LIBRARIES + optimized ${SSL_EAY_RELEASE} debug ${SSL_EAY_DEBUG} + optimized ${LIB_EAY_RELEASE} debug ${LIB_EAY_DEBUG} + ) + else() + set( OPENSSL_LIBRARIES ${SSL_EAY_RELEASE} ${LIB_EAY_RELEASE} ) + endif() + MARK_AS_ADVANCED(SSL_EAY_DEBUG SSL_EAY_RELEASE) + MARK_AS_ADVANCED(LIB_EAY_DEBUG LIB_EAY_RELEASE) + ELSEIF(MINGW) + # same player, for MingW + FIND_LIBRARY(LIB_EAY + NAMES + libeay32 + crypto + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "lib/MinGW" + ) + + FIND_LIBRARY(SSL_EAY + NAMES + ssleay32 + ssl + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "lib/MinGW" + ) + + MARK_AS_ADVANCED(SSL_EAY LIB_EAY) + set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} ) + ELSE(MSVC) + # Not sure what to pick for -say- intel, let's use the toplevel ones and hope someone report issues: + FIND_LIBRARY(LIB_EAY + NAMES + libeay32 + HINTS + ${_OPENSSL_LIBDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + lib + ) + + FIND_LIBRARY(SSL_EAY + NAMES + ssleay32 + HINTS + ${_OPENSSL_LIBDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + lib + ) + + MARK_AS_ADVANCED(SSL_EAY LIB_EAY) + set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} ) + ENDIF(MSVC) +ELSE(WIN32 AND NOT CYGWIN) + + FIND_LIBRARY(OPENSSL_SSL_LIBRARY + NAMES + ssl + ssleay32 + ssleay32MD + HINTS + ${_OPENSSL_LIBDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + lib + ) + + FIND_LIBRARY(OPENSSL_CRYPTO_LIBRARY + NAMES + crypto + HINTS + ${_OPENSSL_LIBDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + lib + ) + + MARK_AS_ADVANCED(OPENSSL_CRYPTO_LIBRARY OPENSSL_SSL_LIBRARY) + + # compat defines + SET(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY}) + SET(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY}) + + SET(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY}) + +ENDIF(WIN32 AND NOT CYGWIN) + +function(from_hex HEX DEC) + string(TOUPPER "${HEX}" HEX) + set(_res 0) + string(LENGTH "${HEX}" _strlen) + + while (_strlen GREATER 0) + math(EXPR _res "${_res} * 16") + string(SUBSTRING "${HEX}" 0 1 NIBBLE) + string(SUBSTRING "${HEX}" 1 -1 HEX) + if (NIBBLE STREQUAL "A") + math(EXPR _res "${_res} + 10") + elseif (NIBBLE STREQUAL "B") + math(EXPR _res "${_res} + 11") + elseif (NIBBLE STREQUAL "C") + math(EXPR _res "${_res} + 12") + elseif (NIBBLE STREQUAL "D") + math(EXPR _res "${_res} + 13") + elseif (NIBBLE STREQUAL "E") + math(EXPR _res "${_res} + 14") + elseif (NIBBLE STREQUAL "F") + math(EXPR _res "${_res} + 15") + else() + math(EXPR _res "${_res} + ${NIBBLE}") + endif() + + string(LENGTH "${HEX}" _strlen) + endwhile() + + set(${DEC} ${_res} PARENT_SCOPE) +endfunction(from_hex) + +if (OPENSSL_INCLUDE_DIR) + if (_OPENSSL_VERSION) + set(OPENSSL_VERSION "${_OPENSSL_VERSION}") + elseif(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h") + file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str + REGEX "^#define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*") + + # The version number is encoded as 0xMNNFFPPS: major minor fix patch status + # The status gives if this is a developer or prerelease and is ignored here. + # Major, minor, and fix directly translate into the version numbers shown in + # the string. The patch field translates to the single character suffix that + # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so + # on. + + string(REGEX REPLACE "^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]).*$" + "\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}") + list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR) + list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR) + from_hex("${OPENSSL_VERSION_MINOR}" OPENSSL_VERSION_MINOR) + list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX) + from_hex("${OPENSSL_VERSION_FIX}" OPENSSL_VERSION_FIX) + list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH) + + if (NOT OPENSSL_VERSION_PATCH STREQUAL "00") + from_hex("${OPENSSL_VERSION_PATCH}" _tmp) + # 96 is the ASCII code of 'a' minus 1 + math(EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96") + unset(_tmp) + # Once anyone knows how OpenSSL would call the patch versions beyond 'z' + # this should be updated to handle that, too. This has not happened yet + # so it is simply ignored here for now. + string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING) + endif (NOT OPENSSL_VERSION_PATCH STREQUAL "00") + + set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}") + endif (_OPENSSL_VERSION) +endif (OPENSSL_INCLUDE_DIR) + +include(FindPackageHandleStandardArgs) + +if (OPENSSL_VERSION) + find_package_handle_standard_args(OpenSSL + REQUIRED_VARS + OPENSSL_LIBRARIES + OPENSSL_INCLUDE_DIR + VERSION_VAR + OPENSSL_VERSION + FAIL_MESSAGE + "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" + ) +else (OPENSSL_VERSION) + find_package_handle_standard_args(OpenSSL "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" + OPENSSL_LIBRARIES + OPENSSL_INCLUDE_DIR + ) +endif (OPENSSL_VERSION) + +MARK_AS_ADVANCED(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fb77c22f61..e723badc2b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,7 +4,11 @@ add_subdirectory(std) find_package(SQLite3 REQUIRED) find_package(Iniparser REQUIRED) -find_package(OpenSSL REQUIRED) +if(CMAKE_CROSSCOMPILING) + find_package(OpenSSLCross REQUIRED) +else() + find_package(OpenSSL REQUIRED) +endif() set(CSYNC_PUBLIC_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} From c753525085c0e1615a7d5806a4ef070d0c3418a4 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 30 Jul 2012 13:57:57 +0300 Subject: [PATCH 004/106] removed obsolete FindOpenSSL. --- cmake/Modules/FindOpenSSL.cmake | 306 -------------------------------- 1 file changed, 306 deletions(-) delete mode 100644 cmake/Modules/FindOpenSSL.cmake diff --git a/cmake/Modules/FindOpenSSL.cmake b/cmake/Modules/FindOpenSSL.cmake deleted file mode 100644 index 0191714355..0000000000 --- a/cmake/Modules/FindOpenSSL.cmake +++ /dev/null @@ -1,306 +0,0 @@ -# - Try to find the OpenSSL encryption library -# Once done this will define -# -# OPENSSL_ROOT_DIR - Set this variable to the root installation of OpenSSL -# -# Read-Only variables: -# OPENSSL_FOUND - system has the OpenSSL library -# OPENSSL_INCLUDE_DIR - the OpenSSL include directory -# OPENSSL_LIBRARIES - The libraries needed to use OpenSSL -# OPENSSL_VERSION - This is set to $major.$minor.$revision$path (eg. 0.9.8s) - -#============================================================================= -# Copyright 2006-2009 Kitware, Inc. -# Copyright 2006 Alexander Neundorf -# Copyright 2009-2011 Mathieu Malaterre -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= -# (To distribute this file outside of CMake, substitute the full -# License text for the above reference.) - -if (UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_OPENSSL QUIET openssl) -endif (UNIX) - -# http://www.slproweb.com/products/Win32OpenSSL.html -SET(_OPENSSL_ROOT_HINTS - $ENV{OPENSSL_ROOT_DIR} - ${OPENSSL_ROOT_DIR} - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (32-bit)_is1;Inno Setup: App Path]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (64-bit)_is1;Inno Setup: App Path]" - ) -SET(_OPENSSL_ROOT_PATHS - "$ENV{PROGRAMFILES}/OpenSSL" - "$ENV{PROGRAMFILES}/OpenSSL-Win32" - "$ENV{PROGRAMFILES}/OpenSSL-Win64" - "C:/OpenSSL/" - "C:/OpenSSL-Win32/" - "C:/OpenSSL-Win64/" - ) -SET(_OPENSSL_ROOT_HINTS_AND_PATHS - HINTS ${_OPENSSL_ROOT_HINTS} - PATHS ${_OPENSSL_ROOT_PATHS} - ) - -FIND_PATH(OPENSSL_INCLUDE_DIR - NAMES - openssl/ssl.h - HINTS - ${_OPENSSL_INCLUDEDIR} - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - include -) - -IF(WIN32 AND NOT CYGWIN) - # MINGW should go here too - IF(MSVC) - # /MD and /MDd are the standard values - if someone wants to use - # others, the libnames have to change here too - # use also ssl and ssleay32 in debug as fallback for openssl < 0.9.8b - # TODO: handle /MT and static lib - # In Visual C++ naming convention each of these four kinds of Windows libraries has it's standard suffix: - # * MD for dynamic-release - # * MDd for dynamic-debug - # * MT for static-release - # * MTd for static-debug - - # Implementation details: - # We are using the libraries located in the VC subdir instead of the parent directory eventhough : - # libeay32MD.lib is identical to ../libeay32.lib, and - # ssleay32MD.lib is identical to ../ssleay32.lib - FIND_LIBRARY(LIB_EAY_DEBUG - NAMES - libeay32MDd - libeay32 - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - "lib" - "VC" - "lib/VC" - ) - - FIND_LIBRARY(LIB_EAY_RELEASE - NAMES - libeay32MD - libeay32 - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - "lib" - "VC" - "lib/VC" - ) - - FIND_LIBRARY(SSL_EAY_DEBUG - NAMES - ssleay32MDd - ssleay32 - ssl - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - "lib" - "VC" - "lib/VC" - ) - - FIND_LIBRARY(SSL_EAY_RELEASE - NAMES - ssleay32MD - ssleay32 - ssl - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - "lib" - "VC" - "lib/VC" - ) - - if( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE ) - set( OPENSSL_LIBRARIES - optimized ${SSL_EAY_RELEASE} debug ${SSL_EAY_DEBUG} - optimized ${LIB_EAY_RELEASE} debug ${LIB_EAY_DEBUG} - ) - else() - set( OPENSSL_LIBRARIES ${SSL_EAY_RELEASE} ${LIB_EAY_RELEASE} ) - endif() - MARK_AS_ADVANCED(SSL_EAY_DEBUG SSL_EAY_RELEASE) - MARK_AS_ADVANCED(LIB_EAY_DEBUG LIB_EAY_RELEASE) - ELSEIF(MINGW) - # same player, for MingW - FIND_LIBRARY(LIB_EAY - NAMES - libeay32 - crypto - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - "lib" - "lib/MinGW" - ) - - FIND_LIBRARY(SSL_EAY - NAMES - ssleay32 - ssl - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - "lib" - "lib/MinGW" - ) - - MARK_AS_ADVANCED(SSL_EAY LIB_EAY) - set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} ) - ELSE(MSVC) - # Not sure what to pick for -say- intel, let's use the toplevel ones and hope someone report issues: - FIND_LIBRARY(LIB_EAY - NAMES - libeay32 - HINTS - ${_OPENSSL_LIBDIR} - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - lib - ) - - FIND_LIBRARY(SSL_EAY - NAMES - ssleay32 - HINTS - ${_OPENSSL_LIBDIR} - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - lib - ) - - MARK_AS_ADVANCED(SSL_EAY LIB_EAY) - set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} ) - ENDIF(MSVC) -ELSE(WIN32 AND NOT CYGWIN) - - FIND_LIBRARY(OPENSSL_SSL_LIBRARY - NAMES - ssl - ssleay32 - ssleay32MD - HINTS - ${_OPENSSL_LIBDIR} - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - lib - ) - - FIND_LIBRARY(OPENSSL_CRYPTO_LIBRARY - NAMES - crypto - HINTS - ${_OPENSSL_LIBDIR} - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - lib - ) - - MARK_AS_ADVANCED(OPENSSL_CRYPTO_LIBRARY OPENSSL_SSL_LIBRARY) - - # compat defines - SET(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY}) - SET(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY}) - - SET(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY}) - -ENDIF(WIN32 AND NOT CYGWIN) - -function(from_hex HEX DEC) - string(TOUPPER "${HEX}" HEX) - set(_res 0) - string(LENGTH "${HEX}" _strlen) - - while (_strlen GREATER 0) - math(EXPR _res "${_res} * 16") - string(SUBSTRING "${HEX}" 0 1 NIBBLE) - string(SUBSTRING "${HEX}" 1 -1 HEX) - if (NIBBLE STREQUAL "A") - math(EXPR _res "${_res} + 10") - elseif (NIBBLE STREQUAL "B") - math(EXPR _res "${_res} + 11") - elseif (NIBBLE STREQUAL "C") - math(EXPR _res "${_res} + 12") - elseif (NIBBLE STREQUAL "D") - math(EXPR _res "${_res} + 13") - elseif (NIBBLE STREQUAL "E") - math(EXPR _res "${_res} + 14") - elseif (NIBBLE STREQUAL "F") - math(EXPR _res "${_res} + 15") - else() - math(EXPR _res "${_res} + ${NIBBLE}") - endif() - - string(LENGTH "${HEX}" _strlen) - endwhile() - - set(${DEC} ${_res} PARENT_SCOPE) -endfunction(from_hex) - -if (OPENSSL_INCLUDE_DIR) - if (_OPENSSL_VERSION) - set(OPENSSL_VERSION "${_OPENSSL_VERSION}") - elseif(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h") - file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str - REGEX "^#define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*") - - # The version number is encoded as 0xMNNFFPPS: major minor fix patch status - # The status gives if this is a developer or prerelease and is ignored here. - # Major, minor, and fix directly translate into the version numbers shown in - # the string. The patch field translates to the single character suffix that - # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so - # on. - - string(REGEX REPLACE "^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]).*$" - "\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}") - list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR) - list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR) - from_hex("${OPENSSL_VERSION_MINOR}" OPENSSL_VERSION_MINOR) - list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX) - from_hex("${OPENSSL_VERSION_FIX}" OPENSSL_VERSION_FIX) - list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH) - - if (NOT OPENSSL_VERSION_PATCH STREQUAL "00") - from_hex("${OPENSSL_VERSION_PATCH}" _tmp) - # 96 is the ASCII code of 'a' minus 1 - math(EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96") - unset(_tmp) - # Once anyone knows how OpenSSL would call the patch versions beyond 'z' - # this should be updated to handle that, too. This has not happened yet - # so it is simply ignored here for now. - string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING) - endif (NOT OPENSSL_VERSION_PATCH STREQUAL "00") - - set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}") - endif (_OPENSSL_VERSION) -endif (OPENSSL_INCLUDE_DIR) - -include(FindPackageHandleStandardArgs) - -if (OPENSSL_VERSION) - find_package_handle_standard_args(OpenSSL - REQUIRED_VARS - OPENSSL_LIBRARIES - OPENSSL_INCLUDE_DIR - VERSION_VAR - OPENSSL_VERSION - FAIL_MESSAGE - "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" - ) -else (OPENSSL_VERSION) - find_package_handle_standard_args(OpenSSL "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" - OPENSSL_LIBRARIES - OPENSSL_INCLUDE_DIR - ) -endif (OPENSSL_VERSION) - -MARK_AS_ADVANCED(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES) From abef7eb3d240945fe86c0f75528c1408f108bb0a Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 31 Jul 2012 11:40:46 +0300 Subject: [PATCH 005/106] UniqID based syncing, first WIP state. --- modules/csync_owncloud.c | 61 +++++++++++++++++++++++++++++++++++---- src/csync_propagate.c | 6 ++++ src/csync_statedb.c | 22 ++++++++++++++ src/csync_statedb.h | 1 + src/csync_update.c | 20 ++++++++++++- src/csync_util.c | 5 ++++ src/vio/csync_vio.c | 14 +++++++++ src/vio/csync_vio_local.c | 4 ++- 8 files changed, 126 insertions(+), 7 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 2d1ec4826a..9c157324c5 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -118,6 +118,8 @@ struct transfer_context { const char *method; /* the HTTP method, either PUT or GET */ ne_decompress *decompress; /* the decompress context */ int fileWritten; /* flag to indicate that a buffer file was written for PUTs */ + char *md5; + char *clean_uri; }; /* Struct with the WebDAV session */ @@ -141,6 +143,11 @@ static const ne_propname ls_props[] = { { NULL, NULL } }; +struct stat_cache_s { + char *uri; + csync_vio_file_stat_t stat; +}; + /* * local variables. */ @@ -149,6 +156,10 @@ struct dav_session_s dav_session; /* The DAV Session, initialised in dav_connect int _connected = 0; /* flag to indicate if a connection exists, ie. the dav_session is valid */ csync_vio_file_stat_t _fs; +csync_vio_file_stat_t _owc; + +struct stat_cache_s _statCache; + csync_auth_callback _authcb; void *_userdata = NULL; @@ -731,6 +742,21 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->size = _fs.size; buf->mode = _stat_perms( _fs.type ); + } else if( _statCache.uri && c_streq( _statCache.uri, uri )) { + DEBUG_WEBDAV("Found file stat info in statcache!"); + buf->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE; + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; + // buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; + // buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_PERMISSIONS; + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; + + buf->type = _fs.type; + buf->size = _fs.size; + buf->md5 = c_strdup( _fs.md5 ); + + // buf->mode = _stat_perms( _fs.type ); + } else { /* fetch data via a propfind call. */ fetchCtx = c_malloc( sizeof( struct listdir_context )); @@ -934,9 +960,9 @@ static char*_lastDir = NULL; * bool time_sync_required - oC does not require the time sync * int unix_extensions - oC supports unix extensions. */ -static csync_vio_capabilities_t _owncloud_capabilities = { true, false, false, 1 }; +static csync_vio_capabilities_t _owncloud_capabilities = { true, true, false, 1 }; -static csync_vio_capabilities_t *owncloud_get_capabilities(void) +static csync_vio_capabilities_t *owncloud_capabilities(void) { #ifdef _WIN32 _owncloud_capabilities.unix_extensions = 0; @@ -961,6 +987,7 @@ static csync_vio_method_handle_t *owncloud_open(const char *durl, const char *winTmpUtf8 = NULL; csync_stat_t sb; #endif + const char *etag_header = NULL; struct transfer_context *writeCtx = NULL; csync_vio_file_stat_t statBuf; @@ -1022,6 +1049,8 @@ static csync_vio_method_handle_t *owncloud_open(const char *durl, writeCtx = c_malloc( sizeof(struct transfer_context) ); writeCtx->bytes_written = 0; + writeCtx->clean_uri = c_strdup(uri); + if( rc == NE_OK ) { /* open a temp file to store the incoming data */ #ifdef _WIN32 @@ -1079,7 +1108,7 @@ static csync_vio_method_handle_t *owncloud_open(const char *durl, writeCtx->fileWritten = 0; /* flag to indicate if contents was pushed to file */ writeCtx->req = ne_request_create(dav_session.ctx, "PUT", uri); - writeCtx->method = "PUT"; + writeCtx->method = "PUT"; } @@ -1127,6 +1156,13 @@ static csync_vio_method_handle_t *owncloud_open(const char *durl, ne_decompress_destroy( writeCtx->decompress ); } + /* preserve the ETag header */ + etag_header = ne_get_response_header( writeCtx->req, "ETag" ); + if( etag_header ) { + writeCtx->md5 = c_strdup( etag_header ); + DEBUG_WEBDAV("GET Etag: %s", etag_header ); + } + /* delete the request in any case */ ne_request_destroy(writeCtx->req); #else @@ -1174,6 +1210,7 @@ static int owncloud_close(csync_vio_method_handle_t *fhandle) { int ret = 0; size_t len = 0; const _TCHAR *tmpFileName = 0; + const char *etag_header = 0; writeCtx = (struct transfer_context*) fhandle; @@ -1260,6 +1297,13 @@ static int owncloud_close(csync_vio_method_handle_t *fhandle) { ret = -1; } } + + /* get the uniq id request header */ + etag_header = ne_get_response_header( writeCtx->req, "ETag" ); + if( etag_header ) { + DEBUG_WEBDAV("ETag for file : %s", etag_header); + writeCtx->md5 = c_strdup( etag_header ); + } } ne_request_destroy( writeCtx->req ); } else { @@ -1274,6 +1318,13 @@ static int owncloud_close(csync_vio_method_handle_t *fhandle) { /* Remove the local file. */ unlink( writeCtx->tmpFileName ); + /* cache the stat info about the recently written or read file */ + // FIXME: Free the strings + _statCache.stat.size = writeCtx->bytes_written; + _statCache.stat.md5 = writeCtx->md5; + _statCache.stat.name = c_basename( writeCtx->clean_uri ); + _statCache.stat.type = CSYNC_VIO_FILE_TYPE_REGULAR; + /* free mem. Note that the request mem is freed by the ne_request_destroy call */ SAFE_FREE( writeCtx->tmpFileName ); SAFE_FREE( writeCtx ); @@ -1411,7 +1462,7 @@ static csync_vio_file_stat_t *owncloud_readdir(csync_vio_method_handle_t *dhandl _fs.fields = lfs->fields; _fs.type = lfs->type; _fs.size = lfs->size; - _fs.md5 = c_strdup( lfs->md5 ); + _fs.md5 = lfs->md5; } /* DEBUG_WEBDAV("LFS fields: %s: %d", lfs->name, lfs->type ); */ @@ -1601,7 +1652,7 @@ static int owncloud_utimes(const char *uri, const struct timeval *times) { csync_vio_method_t _method = { .method_table_size = sizeof(csync_vio_method_t), - .get_capabilities = owncloud_get_capabilities, + .get_capabilities = owncloud_capabilities, .open = owncloud_open, .creat = owncloud_creat, .close = owncloud_close, diff --git a/src/csync_propagate.c b/src/csync_propagate.c index 87e7f9fa22..1c6a313f8f 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -332,6 +332,12 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { rc = 1; goto out; } + + if( st->md5 ) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "UUUU MD5 sum: %s", st->md5); + } else { + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "MD5 sum is empty"); + } } if (_push_to_tmp_first(ctx)) { diff --git a/src/csync_statedb.c b/src/csync_statedb.c index c2a84d440b..67dfafdf63 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -481,6 +481,28 @@ csync_file_stat_t *csync_statedb_get_stat_by_inode(CSYNC *ctx, ino_t inode) { return st; } +char *csync_statedb_get_uniqId( CSYNC *ctx, uint64_t jHash, csync_vio_file_stat_t *buf ) { + char *ret = NULL; + c_strlist_t *result = NULL; + char *stmt = NULL; + + stmt = sqlite3_mprintf("SELECT md5 FROM metadata WHERE phash='%llu' AND modtime=%llu", jHash, buf->mtime); + result = csync_statedb_query(ctx, stmt); + sqlite3_free(stmt); + if (result == NULL) { + return NULL; + } + + if (result->count == 1) { + /* phash, pathlen, path, inode, uid, gid, mode, modtime */ + ret = c_strdup( result->vector[0] ); + } + + c_strlist_destroy(result); + + return ret; +} + /* query the statedb, caller must free the memory */ c_strlist_t *csync_statedb_query(CSYNC *ctx, const char *statement) { int err = SQLITE_OK; diff --git a/src/csync_statedb.h b/src/csync_statedb.h index 610da59ddf..5d0b683539 100644 --- a/src/csync_statedb.h +++ b/src/csync_statedb.h @@ -61,6 +61,7 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx, uint64_t phash); csync_file_stat_t *csync_statedb_get_stat_by_inode(CSYNC *ctx, ino_t inode); +char *csync_statedb_get_uniqId( CSYNC *ctx, uint64_t jHash, csync_vio_file_stat_t *buf ); /** * @brief A generic statedb query. * diff --git a/src/csync_update.c b/src/csync_update.c index 592e6d1204..96380f8943 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -99,10 +99,26 @@ static int _csync_detect_update(CSYNC *ctx, const char *file, /* Update detection */ if (csync_get_statedb_exists(ctx)) { tmp = csync_statedb_get_stat_by_hash(ctx, h); +#if 0 + /* this code could possibly replace the one in csync_vio.c stat and would be more efficient */ + if(tmp) { + if( ctx->current == LOCAL_REPLICA ) { + if(fs->mtime == tmp->modtime && fs->size == tmp->size) { + /* filesystem modtime is still the same as the db mtime + * thus the md5 sum is still valid. */ + fs->md5 = c_strdup( tmp->md5 ); + } + } + } +#endif if (tmp && tmp->phash == h) { /* we have an update! */ CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "time compare: %lu <-> %lu", fs->mtime, tmp->modtime); + if( !fs->md5) { + st->instruction = CSYNC_INSTRUCTION_EVAL; + goto out; + } if( !c_streq(fs->md5, tmp->md5 )) { // if (!fs->mtime > tmp->modtime) { st->instruction = CSYNC_INSTRUCTION_EVAL; @@ -140,7 +156,9 @@ out: st->gid = fs->gid; st->nlink = fs->nlink; st->type = type; - st->md5 = c_strdup(fs->md5); + st->md5 = NULL; + if( fs->md5 ) + st->md5 = c_strdup(fs->md5); st->phash = h; st->pathlen = len; diff --git a/src/csync_util.c b/src/csync_util.c index 0b68dbaaba..e38305b54a 100644 --- a/src/csync_util.c +++ b/src/csync_util.c @@ -118,6 +118,7 @@ static int _merge_file_trees_visitor(void *obj, void *data) { CSYNC *ctx = NULL; c_rbtree_t *tree = NULL; c_rbnode_t *node = NULL; + char *md5 = NULL; char errbuf[256] = {0}; char *uri = NULL; @@ -178,7 +179,9 @@ static int _merge_file_trees_visitor(void *obj, void *data) { goto out; } } + md5 = fs->md5; fs = c_rbtree_node_data(node); + fs->md5 = md5; switch (ctx->current) { case LOCAL_REPLICA: @@ -218,6 +221,8 @@ static int _merge_file_trees_visitor(void *obj, void *data) { /* update file stat */ fs->inode = vst->inode; fs->modtime = vst->mtime; + // if( vst->md5 ) + // fs->md5 = c_strdup(vst->md5); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "file: %s, instruction: UPDATED", uri); diff --git a/src/vio/csync_vio.c b/src/vio/csync_vio.c index 44650bb315..d36a175e8e 100644 --- a/src/vio/csync_vio.c +++ b/src/vio/csync_vio.c @@ -32,6 +32,8 @@ #include "vio/csync_vio.h" #include "vio/csync_vio_handle_private.h" #include "vio/csync_vio_local.h" +#include "csync_statedb.h" +#include "std/c_jhash.h" #define CSYNC_LOG_CATEGORY_NAME "csync.vio.main" @@ -529,6 +531,9 @@ int csync_vio_rmdir(CSYNC *ctx, const char *uri) { int csync_vio_stat(CSYNC *ctx, const char *uri, csync_vio_file_stat_t *buf) { int rc = -1; + int len = 0; + uint64_t h = 0; + char *file = 0; switch(ctx->replica) { case REMOTE_REPLCIA: @@ -536,6 +541,15 @@ int csync_vio_stat(CSYNC *ctx, const char *uri, csync_vio_file_stat_t *buf) { break; case LOCAL_REPLICA: rc = csync_vio_local_stat(uri, buf); + + file = c_basename(uri); + len = strlen(file); + if( file ) { + h = c_jhash64((uint8_t *) file, len, 0); + buf->md5 = csync_statedb_get_uniqId( ctx, h, buf ); + + SAFE_FREE(file); + } break; default: break; diff --git a/src/vio/csync_vio_local.c b/src/vio/csync_vio_local.c index 921e8fa8e1..6fae084b0e 100644 --- a/src/vio/csync_vio_local.c +++ b/src/vio/csync_vio_local.c @@ -368,7 +368,9 @@ int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->ctime = sb.st_ctime; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_CTIME; - buf->md5 = csync_file_md5( uri ); + /* buf->md5 = csync_file_md5( uri ); */ + /* md5 is queried one level higher because we do not have ctx here. */ + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; c_free_multibyte(wuri); From cbb09aeb0a573e1e8400994639b07086246989b6 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 6 Aug 2012 09:22:21 +0200 Subject: [PATCH 006/106] Sync based on uniqIDs WIP --- modules/csync_owncloud.c | 24 +++++++++++--------- src/csync_propagate.c | 48 ++++++++++++++++++++++++++++++++++++++-- src/csync_statedb.c | 6 +++-- src/vio/csync_vio.c | 2 +- 4 files changed, 64 insertions(+), 16 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 9c157324c5..c3f62e7ee2 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -521,7 +521,6 @@ static void results(void *userdata, if( md5sum ) { /* Skip the " around the string coming back from teh ne_propset_value call */ strncpy( newres->md5, md5sum+1, 32 ); - DEBUG_WEBDAV("OOOOOOOOOOOOOOOOOOOOO %s", newres->md5); } /* prepend the new resource to the result list */ @@ -631,7 +630,6 @@ static csync_vio_file_stat_t *resourceToFileStat( struct resource *res ) lfs->size = res->size; lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; lfs->md5 = c_strdup(res->md5); - DEBUG_WEBDAV("XXXXXXXXXXXXXXXXXXXXX MD5: %s", lfs->md5 ); lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; return lfs; } @@ -728,6 +726,7 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { * stat. If the cache matches, a http call is saved. */ if( _fs.name && strcmp( buf->name, _fs.name ) == 0 ) { + buf->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; @@ -739,10 +738,11 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->type = _fs.type; buf->mtime = _fs.mtime; buf->md5 = c_strdup( _fs.md5 ); - + DEBUG_WEBDAV("stat results from fs cache - md5: %s", _fs.md5); buf->size = _fs.size; buf->mode = _stat_perms( _fs.type ); } else if( _statCache.uri && c_streq( _statCache.uri, uri )) { + DEBUG_WEBDAV("stat results from stat cache"); DEBUG_WEBDAV("Found file stat info in statcache!"); buf->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; @@ -751,13 +751,14 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { // buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_PERMISSIONS; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; - buf->type = _fs.type; - buf->size = _fs.size; - buf->md5 = c_strdup( _fs.md5 ); + buf->type = _statCache.stat.type; + buf->size = _statCache.stat.size; + buf->md5 = c_strdup( _statCache.stat.md5 ); - // buf->mode = _stat_perms( _fs.type ); + // buf->mode = _stat_perms( _statCache.type ); } else { + DEBUG_WEBDAV("stat results fetched."); /* fetch data via a propfind call. */ fetchCtx = c_malloc( sizeof( struct listdir_context )); if( ! fetchCtx ) { @@ -820,16 +821,17 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->mtime = lfs->mtime; buf->size = lfs->size; buf->mode = _stat_perms( lfs->type ); - buf->md5 = c_strdup( lfs->md5 ); + buf->md5 = c_strdup( lfs->md5 ); + DEBUG_WEBDAV("XXXXXXXXXXXXXXX md5: %s", buf->md5 ); csync_vio_file_stat_destroy( lfs ); } free_fetchCtx( fetchCtx ); } } - DEBUG_WEBDAV("STAT result: %s, type=%d", buf->name ? buf->name:"NULL", - buf->type ); + DEBUG_WEBDAV("STAT result: %s, md5: %s", buf->name ? buf->name:"NULL", + buf->md5 ); return 0; } @@ -1462,7 +1464,7 @@ static csync_vio_file_stat_t *owncloud_readdir(csync_vio_method_handle_t *dhandl _fs.fields = lfs->fields; _fs.type = lfs->type; _fs.size = lfs->size; - _fs.md5 = lfs->md5; + _fs.md5 = c_strdup(lfs->md5); } /* DEBUG_WEBDAV("LFS fields: %s: %d", lfs->name, lfs->type ); */ diff --git a/src/csync_propagate.c b/src/csync_propagate.c index 1c6a313f8f..82d5c57f6e 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -56,6 +56,34 @@ static bool _push_to_tmp_first(CSYNC *ctx) return false; } +static char*_get_md5( CSYNC *ctx, const char *uri ) { + char errbuf[256] = {0}; + csync_vio_file_stat_t *tstat = NULL; + char *md5 = NULL; + + tstat = csync_vio_file_stat_new(); + if (tstat == NULL) { + strerror_r(errno, errbuf, sizeof(errbuf)); + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, + "file: %s, command: stat, error: %s", + uri, + errbuf); + } + if ( tstat && csync_vio_stat(ctx, uri, tstat) < 0) { + strerror_r(errno, errbuf, sizeof(errbuf)); + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, + "file: %s, command: stat(for md5), error: %s", + uri, + errbuf); + } else { + md5 = c_strdup(tstat->md5); + } + SAFE_FREE(tstat); + + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Final MD5 for %s: %s", uri, md5 ? md5 : ""); + return md5; +} + static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { enum csync_replica_e srep = -1; enum csync_replica_e drep = -1; @@ -332,12 +360,18 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { rc = 1; goto out; } - +#if 0 if( st->md5 ) { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "UUUU MD5 sum: %s", st->md5); } else { + if( tstat->md5 ) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Target MD5 sum is %s", tstat->md5 ); + st->md5 = c_strdup(tstat->md5 ); + } else { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "MD5 sum is empty"); + } } +#endif } if (_push_to_tmp_first(ctx)) { @@ -392,6 +426,11 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { ctx->replica = drep; csync_vio_utimes(ctx, duri, times); + /* do a stat on the target again to get a valid md5 */ + // if( ! st->md5 ) { + st->md5 = _get_md5( ctx, turi ); + // } + /* set instruction for the statedb merger */ st->instruction = CSYNC_INSTRUCTION_UPDATED; @@ -707,6 +746,9 @@ static int _csync_new_dir(CSYNC *ctx, csync_file_stat_t *st) { csync_vio_utimes(ctx, uri, times); + // if( ! st->md5 ) + st->md5 = _get_md5(ctx, uri); + /* set instruction for the statedb merger */ st->instruction = CSYNC_INSTRUCTION_UPDATED; @@ -783,7 +825,9 @@ static int _csync_sync_dir(CSYNC *ctx, csync_file_stat_t *st) { times[0].tv_usec = times[1].tv_usec = 0; csync_vio_utimes(ctx, uri, times); - + // if( ! st->md5 ) { + st->md5 = _get_md5(ctx, uri); + // } /* set instruction for the statedb merger */ st->instruction = CSYNC_INSTRUCTION_UPDATED; diff --git a/src/csync_statedb.c b/src/csync_statedb.c index 67dfafdf63..62a8b713a6 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -424,7 +424,8 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx, uint64_t phash) { st->gid = atoi(result->vector[5]); st->mode = atoi(result->vector[6]); st->modtime = strtoul(result->vector[7], NULL, 10); - st->md5 = c_strdup( result->vector[8] ); + if( result->vector[8]) + st->md5 = c_strdup( result->vector[8] ); c_strlist_destroy(result); return st; @@ -474,7 +475,8 @@ csync_file_stat_t *csync_statedb_get_stat_by_inode(CSYNC *ctx, ino_t inode) { st->gid = atoi(result->vector[5]); st->mode = atoi(result->vector[6]); st->modtime = strtoul(result->vector[7], NULL, 10); - st->md5 = c_strdup(result->vector[8]); + if( result->vector[8] ) + st->md5 = c_strdup(result->vector[8]); c_strlist_destroy(result); diff --git a/src/vio/csync_vio.c b/src/vio/csync_vio.c index d36a175e8e..b7262a38dc 100644 --- a/src/vio/csync_vio.c +++ b/src/vio/csync_vio.c @@ -547,7 +547,7 @@ int csync_vio_stat(CSYNC *ctx, const char *uri, csync_vio_file_stat_t *buf) { if( file ) { h = c_jhash64((uint8_t *) file, len, 0); buf->md5 = csync_statedb_get_uniqId( ctx, h, buf ); - + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "OOOOOOOOOOOOO vio_stat MD5: %s -> %s", file, buf->md5); SAFE_FREE(file); } break; From b37096354f7984232078c1eba070badcb3861c14 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 14 Aug 2012 16:31:01 +0300 Subject: [PATCH 007/106] Fix url to calculate hash --- src/vio/csync_vio.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/vio/csync_vio.c b/src/vio/csync_vio.c index fbd6e4a6b5..9574551db1 100644 --- a/src/vio/csync_vio.c +++ b/src/vio/csync_vio.c @@ -533,7 +533,9 @@ int csync_vio_stat(CSYNC *ctx, const char *uri, csync_vio_file_stat_t *buf) { int rc = -1; int len = 0; uint64_t h = 0; - char *file = 0; + const char *file = 0; + + file = uri; switch(ctx->replica) { case REMOTE_REPLCIA: @@ -542,13 +544,16 @@ int csync_vio_stat(CSYNC *ctx, const char *uri, csync_vio_file_stat_t *buf) { case LOCAL_REPLICA: rc = csync_vio_local_stat(uri, buf); - file = c_basename(uri); + if (strlen(uri) <= strlen(ctx->local.uri)) { + return -1; + } + file += strlen(ctx->local.uri) + 1; + len = strlen(file); if( file ) { h = c_jhash64((uint8_t *) file, len, 0); buf->md5 = csync_statedb_get_uniqId( ctx, h, buf ); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "OOOOOOOOOOOOO vio_stat MD5: %s -> %s", file, buf->md5); - SAFE_FREE(file); } #ifdef _WIN32 From eb019905e48d2c2640010271ebd7c315e1c8268b Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 14 Aug 2012 16:31:52 +0300 Subject: [PATCH 008/106] Query new id for local repository because of utimes changes. --- src/csync_propagate.c | 64 ++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/src/csync_propagate.c b/src/csync_propagate.c index c5e2320f4d..a717027789 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -61,27 +61,28 @@ static char*_get_md5( CSYNC *ctx, const char *uri ) { csync_vio_file_stat_t *tstat = NULL; char *md5 = NULL; - tstat = csync_vio_file_stat_new(); - if (tstat == NULL) { - strerror_r(errno, errbuf, sizeof(errbuf)); - CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, - "file: %s, command: stat, error: %s", - uri, - errbuf); + if( ctx->current == LOCAL_REPLICA ) { + tstat = csync_vio_file_stat_new(); + if (tstat == NULL) { + strerror_r(errno, errbuf, sizeof(errbuf)); + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, + "file: %s, command: stat, error: %s", + uri, + errbuf); + } + if ( tstat && csync_vio_stat(ctx, uri, tstat) < 0) { + strerror_r(errno, errbuf, sizeof(errbuf)); + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, + "file: %s, command: stat(for md5), error: %s", + uri, + errbuf); + } else { + md5 = c_strdup(tstat->md5); + } + SAFE_FREE(tstat); } - if ( tstat && csync_vio_stat(ctx, uri, tstat) < 0) { - strerror_r(errno, errbuf, sizeof(errbuf)); - CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, - "file: %s, command: stat(for md5), error: %s", - uri, - errbuf); - } else { - md5 = c_strdup(tstat->md5); - } - SAFE_FREE(tstat); - - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Final MD5 for %s: %s", uri, md5 ? md5 : ""); - return md5; + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "MD5 for %s: %s", uri, md5 ? md5 : ""); + return md5; } static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { @@ -360,7 +361,7 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { rc = 1; goto out; } -#if 0 + if( st->md5 ) { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "UUUU MD5 sum: %s", st->md5); } else { @@ -371,7 +372,6 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "MD5 sum is empty"); } } -#endif } if (_push_to_tmp_first(ctx)) { @@ -426,10 +426,16 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { ctx->replica = drep; csync_vio_utimes(ctx, duri, times); + + /* For remote repos, after the utimes call, the ID has changed again */ /* do a stat on the target again to get a valid md5 */ - // if( ! st->md5 ) { - st->md5 = _get_md5( ctx, turi ); - // } + char *tmd5 = _get_md5(ctx, duri); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "FINAL MD5: %s", tmd5 ? tmd5 : ""); + + if(tmd5) { + SAFE_FREE(st->md5); + st->md5 = tmd5; + } /* set instruction for the statedb merger */ st->instruction = CSYNC_INSTRUCTION_UPDATED; @@ -899,9 +905,11 @@ static int _csync_sync_dir(CSYNC *ctx, csync_file_stat_t *st) { times[0].tv_usec = times[1].tv_usec = 0; csync_vio_utimes(ctx, uri, times); - // if( ! st->md5 ) { - st->md5 = _get_md5(ctx, uri); - // } + char *tmd5 = _get_md5(ctx, uri); + if(tmd5) { + SAFE_FREE(st->md5); + st->md5 = tmd5; + } /* set instruction for the statedb merger */ st->instruction = CSYNC_INSTRUCTION_UPDATED; From 142ef140f03f276730f7d50717d738b7dd91f943 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 14 Aug 2012 16:32:23 +0300 Subject: [PATCH 009/106] more logging, ids added. --- src/csync_update.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/csync_update.c b/src/csync_update.c index 14a0408251..517cfc0fd3 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -117,8 +117,8 @@ static int _csync_detect_update(CSYNC *ctx, const char *file, #endif if (tmp && tmp->phash == h) { /* we have an update! */ - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "time compare: %lu <-> %lu", - fs->mtime, tmp->modtime); + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "time compare: %lu <-> %lu, md5: %s <-> %s", + fs->mtime, tmp->modtime, fs->md5, tmp->md5); if( !fs->md5) { st->instruction = CSYNC_INSTRUCTION_EVAL; goto out; From 19f52313a8f9f78a023799a2a2b866b7a58dcaa8 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Wed, 15 Aug 2012 12:46:36 +0300 Subject: [PATCH 010/106] more md5 calculations --- src/csync_propagate.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/csync_propagate.c b/src/csync_propagate.c index a717027789..6295ab8777 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -94,6 +94,7 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { char *duri = NULL; char *turi = NULL; char *tdir = NULL; + char *tmd5 = NULL; csync_vio_handle_t *sfp = NULL; csync_vio_handle_t *dfp = NULL; @@ -429,7 +430,7 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { /* For remote repos, after the utimes call, the ID has changed again */ /* do a stat on the target again to get a valid md5 */ - char *tmd5 = _get_md5(ctx, duri); + tmd5 = _get_md5(ctx, duri); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "FINAL MD5: %s", tmd5 ? tmd5 : ""); if(tmd5) { @@ -756,6 +757,7 @@ static int _csync_new_dir(CSYNC *ctx, csync_file_stat_t *st) { enum csync_replica_e replica_bak; char errbuf[256] = {0}; char *uri = NULL; + char *tmd5 = NULL; struct timeval times[2]; int rc = -1; @@ -826,8 +828,11 @@ static int _csync_new_dir(CSYNC *ctx, csync_file_stat_t *st) { csync_vio_utimes(ctx, uri, times); - // if( ! st->md5 ) - st->md5 = _get_md5(ctx, uri); + tmd5 = _get_md5(ctx, uri); + if(tmd5) { + SAFE_FREE(st->md5); + st->md5 = tmd5; + } /* set instruction for the statedb merger */ st->instruction = CSYNC_INSTRUCTION_UPDATED; @@ -852,6 +857,7 @@ static int _csync_sync_dir(CSYNC *ctx, csync_file_stat_t *st) { enum csync_replica_e replica_bak; char errbuf[256] = {0}; char *uri = NULL; + char *tmd5 = NULL; struct timeval times[2]; int rc = -1; @@ -905,7 +911,7 @@ static int _csync_sync_dir(CSYNC *ctx, csync_file_stat_t *st) { times[0].tv_usec = times[1].tv_usec = 0; csync_vio_utimes(ctx, uri, times); - char *tmd5 = _get_md5(ctx, uri); + tmd5 = _get_md5(ctx, uri); if(tmd5) { SAFE_FREE(st->md5); st->md5 = tmd5; From 01470630905b08a81aef36c047391ec8851a668f Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Wed, 15 Aug 2012 16:32:10 +0300 Subject: [PATCH 011/106] try to propagate EVAL status up by detecting changes in underlying directories. That does not work as the reconciler runs through the directoires in the wrong order, ie. the outermost first. --- src/csync_private.h | 2 ++ src/csync_reconcile.c | 3 +++ src/csync_update.c | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/src/csync_private.h b/src/csync_private.h index 43ce29ffe1..cb809723e6 100644 --- a/src/csync_private.h +++ b/src/csync_private.h @@ -95,6 +95,7 @@ struct csync_s { c_rbtree_t *tree; c_list_t *list; enum csync_replica_e type; + unsigned long changes; } local; struct { @@ -102,6 +103,7 @@ struct csync_s { c_rbtree_t *tree; c_list_t *list; enum csync_replica_e type; + unsigned long changes; } remote; struct { diff --git a/src/csync_reconcile.c b/src/csync_reconcile.c index d8cb49dae6..b86c986b7a 100644 --- a/src/csync_reconcile.c +++ b/src/csync_reconcile.c @@ -152,8 +152,11 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) { } else { /* file are equal */ + /* FIXME: Get the id from the server! */ cur->instruction = CSYNC_INSTRUCTION_NONE; other->instruction = CSYNC_INSTRUCTION_NONE; + + if( !cur->md5 ) cur->md5 = other->md5; } break; /* file on other replica has changed too */ diff --git a/src/csync_update.c b/src/csync_update.c index 517cfc0fd3..f984dc2c56 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -174,12 +174,18 @@ out: SAFE_FREE(st); return -1; } + if( st->instruction != CSYNC_INSTRUCTION_NONE ) { + ctx->local.changes++; + } break; case REMOTE_REPLCIA: if (c_rbtree_insert(ctx->remote.tree, (void *) st) < 0) { SAFE_FREE(st); return -1; } + if( st->instruction != CSYNC_INSTRUCTION_NONE ) { + ctx->remote.changes++; + } break; default: break; @@ -337,11 +343,43 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, } if (flag == CSYNC_FTW_FLAG_DIR && depth) { + long rcnt = ctx->remote.changes; + long lcnt = ctx->local.changes; + + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> before digging into filename (%s): local %u, remote: %u", + filename, ctx->local.changes , ctx->remote.changes ); + rc = csync_ftw(ctx, filename, fn, depth - 1); if (rc < 0) { csync_vio_closedir(ctx, dh); goto done; } + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> change count (%s): local %u - %u, remote: %u - %u", + filename, ctx->local.changes, lcnt, ctx->remote.changes, rcnt); + if( ctx->local.changes != lcnt ) { + csync_file_stat_t *myfs = NULL; + c_rbnode_t *mynode = NULL; + int len; + uint64_t h = 0; + + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> saw changes in subdir(%s), setting SYNC", + filename ); + /* the directory within this directory changed. Set this to sync. */ + + len = strlen(path); + h = c_jhash64((uint8_t *) path, len, 0); + mynode = c_rbtree_find(ctx->local.tree, &h); + + if( mynode ) { + myfs = c_rbtree_node_data( mynode ); + + if( myfs->instruction == CSYNC_INSTRUCTION_NONE ) { + myfs->instruction = CSYNC_INSTRUCTION_EVAL; + } else { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> instruction is not NONE, skip setting to SYNC"); + } + } + } } SAFE_FREE(filename); csync_vio_file_stat_destroy(dirent); From bac0002eeba4816db412d87ea675bdbd0f4e7e4d Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:42:23 +0300 Subject: [PATCH 012/106] Add a visible log entry at program start, easier to read log output. --- src/csync_lock.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/csync_lock.c b/src/csync_lock.c index cec397c01a..ef58c8fe15 100644 --- a/src/csync_lock.c +++ b/src/csync_lock.c @@ -63,6 +63,7 @@ static int _csync_lock_create(const char *lockfile) { goto out; } + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Create temporary lock file: %s", ctmpfile); if ((fd = mkstemp(ctmpfile)) < 0) { strerror_r(errno, errbuf, sizeof(errbuf)); From fcba1cefce52af02eb3f138dacccdc107fcdffdf Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:44:38 +0300 Subject: [PATCH 013/106] Added csync_vio_file_id function and removed unused previous code. --- src/vio/csync_vio.c | 31 +++++++++++++------------------ src/vio/csync_vio.h | 1 + 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/vio/csync_vio.c b/src/vio/csync_vio.c index 9574551db1..eebf040e5a 100644 --- a/src/vio/csync_vio.c +++ b/src/vio/csync_vio.c @@ -214,6 +214,11 @@ int csync_vio_init(CSYNC *ctx, const char *module, const char *args) { return -1; } + if (! VIO_METHOD_HAS_FUNC(m, get_file_id)) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_WARN, "module %s has no get_file_id fn", module); + } + + ctx->module.method = m; return 0; @@ -529,13 +534,16 @@ int csync_vio_rmdir(CSYNC *ctx, const char *uri) { return rc; } +const char *csync_vio_file_id(CSYNC *ctx, const char *path) +{ + const char *re; + /* We always use the remote method here. */ + re = ctx->module.method->get_file_id(path); + return re; +} + int csync_vio_stat(CSYNC *ctx, const char *uri, csync_vio_file_stat_t *buf) { int rc = -1; - int len = 0; - uint64_t h = 0; - const char *file = 0; - - file = uri; switch(ctx->replica) { case REMOTE_REPLCIA: @@ -543,19 +551,6 @@ int csync_vio_stat(CSYNC *ctx, const char *uri, csync_vio_file_stat_t *buf) { break; case LOCAL_REPLICA: rc = csync_vio_local_stat(uri, buf); - - if (strlen(uri) <= strlen(ctx->local.uri)) { - return -1; - } - file += strlen(ctx->local.uri) + 1; - - len = strlen(file); - if( file ) { - h = c_jhash64((uint8_t *) file, len, 0); - buf->md5 = csync_statedb_get_uniqId( ctx, h, buf ); - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "OOOOOOOOOOOOO vio_stat MD5: %s -> %s", file, buf->md5); - } - #ifdef _WIN32 CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Win32: STAT-inode for %s: %llu", uri, buf->inode ); #endif diff --git a/src/vio/csync_vio.h b/src/vio/csync_vio.h index 9db6a1ca1d..715ed626e1 100644 --- a/src/vio/csync_vio.h +++ b/src/vio/csync_vio.h @@ -48,6 +48,7 @@ int csync_vio_mkdir(CSYNC *ctx, const char *uri, mode_t mode); int csync_vio_mkdirs(CSYNC *ctx, const char *uri, mode_t mode); int csync_vio_rmdir(CSYNC *ctx, const char *uri); +const char *csync_vio_file_id(CSYNC *ctx, const char *path); int csync_vio_stat(CSYNC *ctx, const char *uri, csync_vio_file_stat_t *buf); int csync_vio_rename(CSYNC *ctx, const char *olduri, const char *newuri); int csync_vio_unlink(CSYNC *ctx, const char *uri); From 7dcb9ffdeb556eea9362e76e23399d6592d86742 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:45:12 +0300 Subject: [PATCH 014/106] Added id lists to context type and removed change counter. --- src/csync_private.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/csync_private.h b/src/csync_private.h index cb809723e6..6b139af348 100644 --- a/src/csync_private.h +++ b/src/csync_private.h @@ -94,16 +94,16 @@ struct csync_s { char *uri; c_rbtree_t *tree; c_list_t *list; + c_list_t *id_list; enum csync_replica_e type; - unsigned long changes; } local; struct { char *uri; c_rbtree_t *tree; c_list_t *list; + c_list_t *id_list; enum csync_replica_e type; - unsigned long changes; } remote; struct { @@ -137,7 +137,7 @@ struct csync_s { /* error code of the last operation */ enum csync_error_codes_e error_code; - + int status; }; @@ -162,7 +162,7 @@ struct csync_file_stat_s { int nlink; /* u32 */ int type; /* u32 */ - char *md5; + const char *md5; char *destpath; /* for renames */ enum csync_instructions_e instruction; /* u32 */ From 044376430859454fc0500f4607a264620a638dde Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:46:07 +0300 Subject: [PATCH 015/106] Query ids from database for local files, remove bogus code. --- src/csync_update.c | 45 +++++++-------------------------------------- 1 file changed, 7 insertions(+), 38 deletions(-) diff --git a/src/csync_update.c b/src/csync_update.c index f984dc2c56..ca3a3eac08 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -174,18 +174,12 @@ out: SAFE_FREE(st); return -1; } - if( st->instruction != CSYNC_INSTRUCTION_NONE ) { - ctx->local.changes++; - } break; case REMOTE_REPLCIA: if (c_rbtree_insert(ctx->remote.tree, (void *) st) < 0) { SAFE_FREE(st); return -1; } - if( st->instruction != CSYNC_INSTRUCTION_NONE ) { - ctx->remote.changes++; - } break; default: break; @@ -331,6 +325,13 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, flag = CSYNC_FTW_FLAG_NSTAT; } + if( ctx->current == LOCAL_REPLICA ) { + int len = strlen( path ); + uint64_t h = c_jhash64((uint8_t *) path, len, 0); + fs->md5 = csync_statedb_get_uniqId( ctx, h, fs ); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Uniq ID read from Database: %s -> %s", path, fs->md5); + } + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "walk: %s", filename); /* Call walker function for each file */ @@ -343,43 +344,11 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, } if (flag == CSYNC_FTW_FLAG_DIR && depth) { - long rcnt = ctx->remote.changes; - long lcnt = ctx->local.changes; - - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> before digging into filename (%s): local %u, remote: %u", - filename, ctx->local.changes , ctx->remote.changes ); - rc = csync_ftw(ctx, filename, fn, depth - 1); if (rc < 0) { csync_vio_closedir(ctx, dh); goto done; } - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> change count (%s): local %u - %u, remote: %u - %u", - filename, ctx->local.changes, lcnt, ctx->remote.changes, rcnt); - if( ctx->local.changes != lcnt ) { - csync_file_stat_t *myfs = NULL; - c_rbnode_t *mynode = NULL; - int len; - uint64_t h = 0; - - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> saw changes in subdir(%s), setting SYNC", - filename ); - /* the directory within this directory changed. Set this to sync. */ - - len = strlen(path); - h = c_jhash64((uint8_t *) path, len, 0); - mynode = c_rbtree_find(ctx->local.tree, &h); - - if( mynode ) { - myfs = c_rbtree_node_data( mynode ); - - if( myfs->instruction == CSYNC_INSTRUCTION_NONE ) { - myfs->instruction = CSYNC_INSTRUCTION_EVAL; - } else { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> instruction is not NONE, skip setting to SYNC"); - } - } - } } SAFE_FREE(filename); csync_vio_file_stat_destroy(dirent); From 38cf0f2704a794062a1d14675b492308e6c7ef93 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:46:50 +0300 Subject: [PATCH 016/106] Add csync_get_file_id function for modules. --- src/vio/csync_vio_method.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vio/csync_vio_method.h b/src/vio/csync_vio_method.h index 814504f98d..ba1d5d84f0 100644 --- a/src/vio/csync_vio_method.h +++ b/src/vio/csync_vio_method.h @@ -52,7 +52,7 @@ typedef csync_vio_method_t *(*csync_vio_method_init_fn)(const char *method_name, typedef void (*csync_vio_method_finish_fn)(csync_vio_method_t *method); typedef csync_vio_capabilities_t *(*csync_method_get_capabilities_fn)(void); - +typedef const char* (*csync_method_get_file_id_fn)(const char* path); typedef csync_vio_method_handle_t *(*csync_method_open_fn)(const char *durl, int flags, mode_t mode); typedef csync_vio_method_handle_t *(*csync_method_creat_fn)(const char *durl, mode_t mode); typedef int (*csync_method_close_fn)(csync_vio_method_handle_t *fhandle); @@ -79,6 +79,7 @@ typedef int (*csync_method_utimes_fn)(const char *uri, const struct timeval time struct csync_vio_method_s { size_t method_table_size; /* Used for versioning */ csync_method_get_capabilities_fn get_capabilities; + csync_method_get_file_id_fn get_file_id; csync_method_open_fn open; csync_method_creat_fn creat; csync_method_close_fn close; From 972412e43642c8d99a65acc40d0358c180ace552 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:48:15 +0300 Subject: [PATCH 017/106] Update the md5 sum of files in merge. --- src/csync_util.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/csync_util.c b/src/csync_util.c index e38305b54a..4f3af2a024 100644 --- a/src/csync_util.c +++ b/src/csync_util.c @@ -113,12 +113,12 @@ void csync_memstat_check(void) { static int _merge_file_trees_visitor(void *obj, void *data) { csync_file_stat_t *fs = NULL; + csync_file_stat_t *tfs = NULL; csync_vio_file_stat_t *vst = NULL; CSYNC *ctx = NULL; c_rbtree_t *tree = NULL; c_rbnode_t *node = NULL; - char *md5 = NULL; char errbuf[256] = {0}; char *uri = NULL; @@ -179,9 +179,7 @@ static int _merge_file_trees_visitor(void *obj, void *data) { goto out; } } - md5 = fs->md5; fs = c_rbtree_node_data(node); - fs->md5 = md5; switch (ctx->current) { case LOCAL_REPLICA: @@ -221,10 +219,20 @@ static int _merge_file_trees_visitor(void *obj, void *data) { /* update file stat */ fs->inode = vst->inode; fs->modtime = vst->mtime; - // if( vst->md5 ) - // fs->md5 = c_strdup(vst->md5); - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "file: %s, instruction: UPDATED", uri); + /* update with the id from the remote repo */ + node = c_rbtree_find(ctx->remote.tree, &fs->phash); + if (node == NULL) { + rc = -1; + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Unable to find node"); + goto out; + } + + tfs = c_rbtree_node_data(node); + fs->md5 = c_strdup( tfs->md5 ); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "PRE UPDATED %s: %s <-> %s", uri, fs->md5, tfs->md5); + + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "file: %s, instruction: UPDATED (%s)", uri, fs->md5); fs->instruction = CSYNC_INSTRUCTION_NONE; From d9267f7928e64cd5783047f90b627cb3d8618f7f Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:48:56 +0300 Subject: [PATCH 018/106] Handle ID change propagation to the top directory. --- src/csync_propagate.c | 198 +++++++++++++++++++++++++++++++++++------- 1 file changed, 168 insertions(+), 30 deletions(-) diff --git a/src/csync_propagate.c b/src/csync_propagate.c index 6295ab8777..45586c047c 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -28,10 +28,12 @@ #include #include #include +#include #include "csync_private.h" #include "csync_propagate.h" #include "vio/csync_vio.h" +#include "c_jhash.h" #define CSYNC_LOG_CATEGORY_NAME "csync.propagator" #include "csync_log.h" @@ -46,6 +48,27 @@ static int _csync_cleanup_cmp(const void *a, const void *b) { return strcmp(st_a->path, st_b->path); } +static void _store_id_update(CSYNC *ctx, csync_file_stat_t *st) { + c_list_t *list = NULL; + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "SYNCED remember dir: %s", st->path); + + switch (ctx->current) { + case LOCAL_REPLICA: + list = c_list_prepend(ctx->local.id_list, (void*)st); + if( list != NULL ) { + ctx->local.id_list = list; + } + break; + case REMOTE_REPLCIA: + list = c_list_prepend(ctx->remote.id_list, (void*)st); + if(list != NULL ) { + ctx->remote.id_list = list; + } + break; + + } +} + static bool _push_to_tmp_first(CSYNC *ctx) { if( ctx->current == REMOTE_REPLCIA ) return true; /* Always push to tmp for destination local file system */ @@ -56,32 +79,19 @@ static bool _push_to_tmp_first(CSYNC *ctx) return false; } -static char*_get_md5( CSYNC *ctx, const char *uri ) { - char errbuf[256] = {0}; - csync_vio_file_stat_t *tstat = NULL; - char *md5 = NULL; +static const char*_get_md5( CSYNC *ctx, const char *path ) { + const char *md5 = NULL; + char *buf = NULL; - if( ctx->current == LOCAL_REPLICA ) { - tstat = csync_vio_file_stat_new(); - if (tstat == NULL) { - strerror_r(errno, errbuf, sizeof(errbuf)); - CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, - "file: %s, command: stat, error: %s", - uri, - errbuf); - } - if ( tstat && csync_vio_stat(ctx, uri, tstat) < 0) { - strerror_r(errno, errbuf, sizeof(errbuf)); - CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, - "file: %s, command: stat(for md5), error: %s", - uri, - errbuf); - } else { - md5 = c_strdup(tstat->md5); - } - SAFE_FREE(tstat); + /* Always use the remote uri path, local does not have Ids. */ + if (asprintf(&buf, "%s/%s", ctx->remote.uri, path) < 0) { + return 0; } - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "MD5 for %s: %s", uri, md5 ? md5 : ""); + + md5 = csync_vio_file_id(ctx, buf); + + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "MD5 for %s: %s", buf, md5 ? md5 : ""); + SAFE_FREE(buf); return md5; } @@ -94,7 +104,7 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { char *duri = NULL; char *turi = NULL; char *tdir = NULL; - char *tmd5 = NULL; + const char *tmd5 = NULL; csync_vio_handle_t *sfp = NULL; csync_vio_handle_t *dfp = NULL; @@ -430,7 +440,7 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { /* For remote repos, after the utimes call, the ID has changed again */ /* do a stat on the target again to get a valid md5 */ - tmd5 = _get_md5(ctx, duri); + tmd5 = _get_md5(ctx, st->path); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "FINAL MD5: %s", tmd5 ? tmd5 : ""); if(tmd5) { @@ -757,7 +767,7 @@ static int _csync_new_dir(CSYNC *ctx, csync_file_stat_t *st) { enum csync_replica_e replica_bak; char errbuf[256] = {0}; char *uri = NULL; - char *tmd5 = NULL; + const char *tmd5 = NULL; struct timeval times[2]; int rc = -1; @@ -828,7 +838,7 @@ static int _csync_new_dir(CSYNC *ctx, csync_file_stat_t *st) { csync_vio_utimes(ctx, uri, times); - tmd5 = _get_md5(ctx, uri); + tmd5 = _get_md5(ctx, st->path); if(tmd5) { SAFE_FREE(st->md5); st->md5 = tmd5; @@ -857,7 +867,7 @@ static int _csync_sync_dir(CSYNC *ctx, csync_file_stat_t *st) { enum csync_replica_e replica_bak; char errbuf[256] = {0}; char *uri = NULL; - char *tmd5 = NULL; + const char *tmd5 = NULL; struct timeval times[2]; int rc = -1; @@ -911,7 +921,7 @@ static int _csync_sync_dir(CSYNC *ctx, csync_file_stat_t *st) { times[0].tv_usec = times[1].tv_usec = 0; csync_vio_utimes(ctx, uri, times); - tmd5 = _get_md5(ctx, uri); + tmd5 = _get_md5(ctx, st->path); if(tmd5) { SAFE_FREE(st->md5); st->md5 = tmd5; @@ -920,6 +930,7 @@ static int _csync_sync_dir(CSYNC *ctx, csync_file_stat_t *st) { st->instruction = CSYNC_INSTRUCTION_UPDATED; CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "SYNCED dir: %s", uri); + ctx->replica = replica_bak; rc = 0; @@ -1015,6 +1026,120 @@ out: return rc; } +static int _cmp_char( const void *d1, const void *d2 ) +{ + const char *c1 = (const char*) d1; + const char *c2 = (const char*) d2; + // CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "COMPARE: %s <-> %s", c1, c2); + if( c_streq(c1, c2) ) return 0; + return 1; +} + +/* + * This function corrects the unique IDs of parent directories of changed + * files. Other than in the file system, the change of a unique Id propagates + * up to the top dir. To save the correct IDs, in all propagations, pathes + * are recorded in the local and remotes id_list lists. + * In this function, the unique ID is queried for each directory once and + * stored into the according entry. + */ +static int _csync_correct_id(CSYNC *ctx) { + c_list_t *walk = NULL; + c_list_t *seen_dirs = NULL; + c_list_t *list = NULL; + c_rbtree_t *tree = NULL; + const char *replica = NULL; + char *path = NULL; + + switch (ctx->current) { + case LOCAL_REPLICA: + list = ctx->local.id_list; + tree = ctx->local.tree; + replica = "LOCAL_REPLICA"; + break; + case REMOTE_REPLCIA: + list = ctx->remote.id_list; + tree = ctx->remote.tree; + replica = "REMOTE_REPLICA"; + break; + default: + break; + } + + if (list == NULL) { + return 0; + } + + list = c_list_sort(list, _csync_cleanup_cmp); + if (list == NULL) { + return -1; + } + + for (walk = c_list_last(list); walk != NULL; walk = c_list_prev(walk)) { + csync_file_stat_t *st = NULL; + + st = (csync_file_stat_t *) walk->data; + if( st->type == CSYNC_FTW_TYPE_FILE ) { + path = c_dirname( st->path ); + } else if( st->type == CSYNC_FTW_TYPE_DIR ) { + path = c_strdup(st->path); /* Allocate mem for this not to disappoint FREE */ + } else { + /* unhandled path */ + } + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "correct ID on dir: %s", path); + + /* handle the . path */ + if( path && path[0] == '.' ) path = NULL; + + while( path ) { + uint64_t h; + int len; + c_rbnode_t *node = NULL; + + char pathbuf[PATH_MAX] = {'\0' }; + char *old_path = path; + csync_file_stat_t *tfs = NULL; + + /* do stuff with the dir here */ + + if( seen_dirs && c_list_find_custom( seen_dirs, path, _cmp_char)) { + // CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "saw this dir already: %s", path); + } else { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "climb on dir: %s (%s)", path, replica); + seen_dirs = c_list_prepend( seen_dirs, c_strdup(path)); + + /* Find the correct target entry. */ + len = strlen(path); + h = c_jhash64((uint8_t *) path, len, 0); + + node = c_rbtree_find(tree, &h); + if (node == NULL) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Unable to find node"); + } else { + tfs = c_rbtree_node_data(node); + tfs->md5 = _get_md5(ctx, path); + + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "MD5 for dir: %s %s", tfs->path, tfs->md5); + } + } + /* get the parent dir */ + /* copy one byte less, omit the trailing slash */ + strncpy( pathbuf, path, strlen(path)-1 ); + /* and get the path name */ + path = c_dirname( pathbuf ); + /* free the old path memory */ + SAFE_FREE(old_path ); + + /* exit on top directory */ + if( c_streq(path, ".")) { + SAFE_FREE(path); + path = NULL; + } + } + } + return 0; +} + static int _csync_propagation_cleanup(CSYNC *ctx) { c_list_t *list = NULL; c_list_t *walk = NULL; @@ -1084,30 +1209,35 @@ static int _csync_propagation_file_visitor(void *obj, void *data) { CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"FAIL NEW: %s",st->path); goto err; } + _store_id_update(ctx, st); break; case CSYNC_INSTRUCTION_RENAME: if (_csync_rename_file(ctx, st) < 0) { CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"FAIL RENAME: %s",st->path); goto err; } + _store_id_update(ctx, st); break; case CSYNC_INSTRUCTION_SYNC: if (_csync_sync_file(ctx, st) < 0) { CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"FAIL SYNC: %s",st->path); goto err; } + _store_id_update(ctx, st); break; case CSYNC_INSTRUCTION_REMOVE: if (_csync_remove_file(ctx, st) < 0) { CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"FAIL REMOVE: %s",st->path); goto err; } + _store_id_update(ctx, st); break; case CSYNC_INSTRUCTION_CONFLICT: CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"case CSYNC_INSTRUCTION_CONFLICT: %s",st->path); if (_csync_conflict_file(ctx, st) < 0) { goto err; } + _store_id_update(ctx, st); break; default: break; @@ -1148,22 +1278,27 @@ static int _csync_propagation_dir_visitor(void *obj, void *data) { if (_csync_new_dir(ctx, st) < 0) { goto err; } + _store_id_update(ctx, st); break; case CSYNC_INSTRUCTION_SYNC: if (_csync_sync_dir(ctx, st) < 0) { goto err; } + _store_id_update(ctx, st); break; case CSYNC_INSTRUCTION_CONFLICT: CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"directory attributes different"); if (_csync_sync_dir(ctx, st) < 0) { goto err; } + _store_id_update(ctx, st); break; case CSYNC_INSTRUCTION_REMOVE: if (_csync_remove_dir(ctx, st) < 0) { goto err; } + _store_id_update(ctx, st); + break; case CSYNC_INSTRUCTION_RENAME: /* there can't be a rename for dirs. See updater. */ break; @@ -1206,6 +1341,9 @@ int csync_propagate_files(CSYNC *ctx) { return -1; } + if( _csync_correct_id(ctx) < 0) { + return -1; + } return 0; } From 82d22d14944eafb780d57d5b2c16fa7902e1a272 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:50:31 +0300 Subject: [PATCH 019/106] Added get_file_id function. --- modules/csync_owncloud.c | 51 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index b3c27ef0dd..b8de63f140 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -82,6 +82,7 @@ typedef unsigned long dav_size_t; /* Struct to store data for each resource found during an opendir operation. * It represents a single file entry. */ + typedef struct resource { char *uri; /* The complete uri */ char *name; /* The filename only */ @@ -89,7 +90,7 @@ typedef struct resource { enum resource_type type; dav_size_t size; time_t modtime; - char md5[33]; + char* md5; struct resource *next; } resource; @@ -595,8 +596,13 @@ static void results(void *userdata, } if( md5sum ) { - /* Skip the " around the string coming back from teh ne_propset_value call */ - strncpy( newres->md5, md5sum+1, 32 ); + int len = strlen(md5sum)-2; + if( len > 0 ) { + /* Skip the " around the string coming back from the ne_propset_value call */ + newres->md5 = c_malloc(len+1); + strncpy( newres->md5, md5sum+1, len ); + newres->md5[len] = '\0'; + } } /* prepend the new resource to the result list */ @@ -766,6 +772,7 @@ static void free_fetchCtx( struct listdir_context *ctx ) while( res ) { SAFE_FREE(res->uri); SAFE_FREE(res->name); + SAFE_FREE(res->md5); newres = res->next; SAFE_FREE(res); @@ -1058,6 +1065,43 @@ static csync_vio_capabilities_t *owncloud_capabilities(void) return &_owncloud_capabilities; } +static const char* owncloud_file_id( const char *path ) +{ + ne_request *req = NULL; + const char *header = NULL; + char *uri = _cleanPath(path); + char *buf = NULL; + + req = ne_request_create(dav_session.ctx, "HEAD", uri); + ne_request_dispatch(req); + + header = ne_get_response_header(req, "etag"); + + if( ! header ) { + csync_vio_file_stat_t statBuf; + if( owncloud_stat( uri, &statBuf ) == 0 ) { + header = statBuf.md5; + SAFE_FREE(statBuf.name); + } + } + + if( header ) { + if( header [0] == '"' && header[ strlen(header)-1] == '"') { + int len = strlen( header )-2; + buf = c_malloc( len ); + strncpy( buf, header+1, len ); + buf[len] = '\0'; + } else { + buf = c_strdup(header); + } + } + DEBUG_WEBDAV("GET FILE ID FOR %s: %s", path, buf); + ne_request_destroy(req); + SAFE_FREE(uri); + + return buf; +} + static csync_vio_method_handle_t *owncloud_open(const char *durl, int flags, mode_t mode) { @@ -1749,6 +1793,7 @@ static int owncloud_utimes(const char *uri, const struct timeval *times) { csync_vio_method_t _method = { .method_table_size = sizeof(csync_vio_method_t), .get_capabilities = owncloud_capabilities, + .get_file_id = owncloud_file_id, .open = owncloud_open, .creat = owncloud_creat, .close = owncloud_close, From 30d1c9ed9d1d79056c2d3e97c0d7707d7f3a79ec Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 20 Aug 2012 19:09:24 +0300 Subject: [PATCH 020/106] ownCloud: Some code cleanup, added documentation. --- modules/csync_owncloud.c | 59 +++++++++++----------------------------- 1 file changed, 16 insertions(+), 43 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index b8de63f140..1927395ca2 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -150,11 +150,6 @@ static const ne_propname ls_props[] = { { NULL, NULL } }; -struct stat_cache_s { - char *uri; - csync_vio_file_stat_t stat; -}; - /* * local variables. */ @@ -163,10 +158,6 @@ struct dav_session_s dav_session; /* The DAV Session, initialised in dav_connect int _connected = 0; /* flag to indicate if a connection exists, ie. the dav_session is valid */ csync_vio_file_stat_t _fs; -csync_vio_file_stat_t _owc; - -struct stat_cache_s _statCache; - csync_auth_callback _authcb; @@ -814,7 +805,6 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { * stat. If the cache matches, a http call is saved. */ if( _fs.name && strcmp( buf->name, _fs.name ) == 0 ) { - buf->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; @@ -829,24 +819,7 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { DEBUG_WEBDAV("stat results from fs cache - md5: %s", _fs.md5); buf->size = _fs.size; buf->mode = _stat_perms( _fs.type ); - } else if( _statCache.uri && c_streq( _statCache.uri, uri )) { - DEBUG_WEBDAV("stat results from stat cache"); - DEBUG_WEBDAV("Found file stat info in statcache!"); - buf->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE; - buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; - buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; - // buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; - // buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_PERMISSIONS; - buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; - - buf->type = _statCache.stat.type; - buf->size = _statCache.stat.size; - buf->md5 = c_strdup( _statCache.stat.md5 ); - - // buf->mode = _stat_perms( _statCache.type ); - } else { - DEBUG_WEBDAV("stat results fetched."); /* fetch data via a propfind call. */ fetchCtx = c_malloc( sizeof( struct listdir_context )); if( ! fetchCtx ) { @@ -916,7 +889,7 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->mode = _stat_perms( lfs->type ); buf->md5 = c_strdup( lfs->md5 ); - DEBUG_WEBDAV("XXXXXXXXXXXXXXX md5: %s", buf->md5 ); + csync_vio_file_stat_destroy( lfs ); } @@ -1055,7 +1028,7 @@ static char*_lastDir = NULL; * bool time_sync_required - oC does not require the time sync * int unix_extensions - oC supports unix extensions. */ -static csync_vio_capabilities_t _owncloud_capabilities = { true, true, false, 1 }; +static csync_vio_capabilities_t _owncloud_capabilities = { true, false, false, 1 }; static csync_vio_capabilities_t *owncloud_capabilities(void) { @@ -1072,11 +1045,17 @@ static const char* owncloud_file_id( const char *path ) char *uri = _cleanPath(path); char *buf = NULL; + /* Perform an HEAD request to the resource. HEAD delivers the + * ETag header back. */ req = ne_request_create(dav_session.ctx, "HEAD", uri); ne_request_dispatch(req); header = ne_get_response_header(req, "etag"); + /* If the request went wrong or the server did not respond correctly + * (that can happen for collections) a stat call is done which translates + * into a PROPFIND request. + */ if( ! header ) { csync_vio_file_stat_t statBuf; if( owncloud_stat( uri, &statBuf ) == 0 ) { @@ -1085,6 +1064,7 @@ static const char* owncloud_file_id( const char *path ) } } + /* In case the result is surrounded by "" cut them away. */ if( header ) { if( header [0] == '"' && header[ strlen(header)-1] == '"') { int len = strlen( header )-2; @@ -1095,7 +1075,7 @@ static const char* owncloud_file_id( const char *path ) buf = c_strdup(header); } } - DEBUG_WEBDAV("GET FILE ID FOR %s: %s", path, buf); + DEBUG_WEBDAV("Get file ID for %s: %s", path, buf); ne_request_destroy(req); SAFE_FREE(uri); @@ -1401,9 +1381,9 @@ static int owncloud_close(csync_vio_method_handle_t *fhandle) { } if (rc == NE_OK) { if ( ne_get_status( writeCtx->req )->klass != 2 ) { - DEBUG_WEBDAV("Error - PUT status value no 2xx"); - errno = EIO; - ret = -1; + // DEBUG_WEBDAV("Error - PUT status value no 2xx"); + // errno = EIO; + // ret = -1; } } else { DEBUG_WEBDAV("Error - put request on close failed: %d!", rc ); @@ -1419,9 +1399,9 @@ static int owncloud_close(csync_vio_method_handle_t *fhandle) { rc = ne_request_dispatch( writeCtx->req ); if( rc == NE_OK ) { if ( ne_get_status( writeCtx->req )->klass != 2 ) { - DEBUG_WEBDAV("Error - PUT status value no 2xx"); - errno = EIO; - ret = -1; + // DEBUG_WEBDAV("Error - PUT status value no 2xx"); + // errno = EIO; + // ret = -1; } } else { DEBUG_WEBDAV("Error - put request from memory failed: %d!", rc ); @@ -1450,13 +1430,6 @@ static int owncloud_close(csync_vio_method_handle_t *fhandle) { /* Remove the local file. */ unlink( writeCtx->tmpFileName ); - /* cache the stat info about the recently written or read file */ - // FIXME: Free the strings - _statCache.stat.size = writeCtx->bytes_written; - _statCache.stat.md5 = writeCtx->md5; - _statCache.stat.name = c_basename( writeCtx->clean_uri ); - _statCache.stat.type = CSYNC_VIO_FILE_TYPE_REGULAR; - /* free mem. Note that the request mem is freed by the ne_request_destroy call */ SAFE_FREE( writeCtx->tmpFileName ); SAFE_FREE( writeCtx ); From bc1e59a048c1cf7f4606ba037c7a3d07f9910d02 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 20 Aug 2012 19:10:03 +0300 Subject: [PATCH 021/106] Update the md5 also if the instruction is not UPDATE. --- src/csync_propagate.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/csync_propagate.c b/src/csync_propagate.c index 45586c047c..32a8807b64 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -1118,6 +1118,10 @@ static int _csync_correct_id(CSYNC *ctx) { } else { tfs = c_rbtree_node_data(node); tfs->md5 = _get_md5(ctx, path); + if( tfs->instruction != CSYNC_INSTRUCTION_UPDATED ) { + /* set instruction for the statedb merger */ + tfs->instruction = CSYNC_INSTRUCTION_UPDATED; + } CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "MD5 for dir: %s %s", tfs->path, tfs->md5); } From 4a6b0e72417d9a7711dff90d4e57bd46eccead42 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 20 Aug 2012 19:10:29 +0300 Subject: [PATCH 022/106] Remove a database column comment that just blows the log file. --- src/csync_statedb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/csync_statedb.c b/src/csync_statedb.c index 056c93c34d..2c6dad3aa0 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -570,7 +570,7 @@ c_strlist_t *csync_statedb_query(CSYNC *ctx, const char *statement) { /* iterate over columns */ for (i = 0; i < column_count; i++) { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "sqlite3_column_text: %s", (char *) sqlite3_column_text(stmt, i)); + // CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "sqlite3_column_text: %s", (char *) sqlite3_column_text(stmt, i)); if (c_strlist_add(result, (char *) sqlite3_column_text(stmt, i)) < 0) { c_strlist_destroy(result); return NULL; From ec63ab4e1687a2265d398ce1a1c4be6d488eec4e Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 20 Aug 2012 19:11:18 +0300 Subject: [PATCH 023/106] Fix: If no database entry exists, the status is set to NEW. --- src/csync_update.c | 65 +++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/src/csync_update.c b/src/csync_update.c index ca3a3eac08..84023a039e 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -115,39 +115,44 @@ static int _csync_detect_update(CSYNC *ctx, const char *file, } } #endif - if (tmp && tmp->phash == h) { - /* we have an update! */ - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "time compare: %lu <-> %lu, md5: %s <-> %s", - fs->mtime, tmp->modtime, fs->md5, tmp->md5); - if( !fs->md5) { - st->instruction = CSYNC_INSTRUCTION_EVAL; - goto out; - } - if( !c_streq(fs->md5, tmp->md5 )) { - // if (!fs->mtime > tmp->modtime) { - st->instruction = CSYNC_INSTRUCTION_EVAL; - goto out; - } - st->instruction = CSYNC_INSTRUCTION_NONE; - } else { - /* check if it's a file and has been renamed */ - if (type == CSYNC_FTW_TYPE_FILE && ctx->current == LOCAL_REPLICA) { - tmp = csync_statedb_get_stat_by_inode(ctx, fs->inode); - if (tmp && tmp->inode == fs->inode) { - /* inode found so the file has been renamed */ - st->instruction = CSYNC_INSTRUCTION_RENAME; - goto out; + if(tmp) { /* there is an entry in the database */ + if (tmp->phash == h) { + /* we have an update! */ + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "time compare: %lu <-> %lu, md5: %s <-> %s", + fs->mtime, tmp->modtime, fs->md5, tmp->md5); + if( !fs->md5) { + st->instruction = CSYNC_INSTRUCTION_EVAL; + goto out; + } + if( !c_streq(fs->md5, tmp->md5 )) { + // if (!fs->mtime > tmp->modtime) { + st->instruction = CSYNC_INSTRUCTION_EVAL; + goto out; + } + st->instruction = CSYNC_INSTRUCTION_NONE; } else { - /* file not found in statedb */ - st->instruction = CSYNC_INSTRUCTION_NEW; - goto out; + /* check if it's a file and has been renamed */ + if (type == CSYNC_FTW_TYPE_FILE && ctx->current == LOCAL_REPLICA) { + tmp = csync_statedb_get_stat_by_inode(ctx, fs->inode); + if (tmp && tmp->inode == fs->inode) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "inodes: %ld <-> %ld", tmp->inode, fs->inode); + /* inode found so the file has been renamed */ + st->instruction = CSYNC_INSTRUCTION_RENAME; + goto out; + } else { + /* file not found in statedb */ + st->instruction = CSYNC_INSTRUCTION_NEW; + goto out; + } + } + /* directory, remote and file not found in statedb */ + st->instruction = CSYNC_INSTRUCTION_NEW; } - } - /* directory, remote and file not found in statedb */ - st->instruction = CSYNC_INSTRUCTION_NEW; + } else { + st->instruction = CSYNC_INSTRUCTION_NEW; } } else { - st->instruction = CSYNC_INSTRUCTION_NEW; + st->instruction = CSYNC_INSTRUCTION_NEW; } out: @@ -329,7 +334,7 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, int len = strlen( path ); uint64_t h = c_jhash64((uint8_t *) path, len, 0); fs->md5 = csync_statedb_get_uniqId( ctx, h, fs ); - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Uniq ID read from Database: %s -> %s", path, fs->md5); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Uniq ID read from Database: %s -> %s", path, fs->md5 ? fs->md5 : "" ); } CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "walk: %s", filename); From faf1970e3a0f4dc1f950b6858d875eba907bd908 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 20 Aug 2012 19:11:46 +0300 Subject: [PATCH 024/106] Avoid a null pointer dereference. --- src/csync_util.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/csync_util.c b/src/csync_util.c index 4f3af2a024..f4064d16b9 100644 --- a/src/csync_util.c +++ b/src/csync_util.c @@ -229,9 +229,12 @@ static int _merge_file_trees_visitor(void *obj, void *data) { } tfs = c_rbtree_node_data(node); - fs->md5 = c_strdup( tfs->md5 ); - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "PRE UPDATED %s: %s <-> %s", uri, fs->md5, tfs->md5); - + if( tfs->md5 ) { + fs->md5 = c_strdup( tfs->md5 ); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "PRE UPDATED %s: %s <-> %s", uri, fs->md5, tfs->md5); + } else { + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "md5 is empty in merger!"); + } CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "file: %s, instruction: UPDATED (%s)", uri, fs->md5); fs->instruction = CSYNC_INSTRUCTION_NONE; From 21d3ec4d2de937fc49ac87f1a9d636653b0fc44b Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Mon, 23 Jul 2012 10:53:57 +0200 Subject: [PATCH 025/106] Add patched FindOpenSSL to fix cross-compilation for windows --- cmake/Modules/FindOpenSSL.cmake | 306 ++++++++++++++++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 cmake/Modules/FindOpenSSL.cmake diff --git a/cmake/Modules/FindOpenSSL.cmake b/cmake/Modules/FindOpenSSL.cmake new file mode 100644 index 0000000000..0191714355 --- /dev/null +++ b/cmake/Modules/FindOpenSSL.cmake @@ -0,0 +1,306 @@ +# - Try to find the OpenSSL encryption library +# Once done this will define +# +# OPENSSL_ROOT_DIR - Set this variable to the root installation of OpenSSL +# +# Read-Only variables: +# OPENSSL_FOUND - system has the OpenSSL library +# OPENSSL_INCLUDE_DIR - the OpenSSL include directory +# OPENSSL_LIBRARIES - The libraries needed to use OpenSSL +# OPENSSL_VERSION - This is set to $major.$minor.$revision$path (eg. 0.9.8s) + +#============================================================================= +# Copyright 2006-2009 Kitware, Inc. +# Copyright 2006 Alexander Neundorf +# Copyright 2009-2011 Mathieu Malaterre +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +if (UNIX) + find_package(PkgConfig QUIET) + pkg_check_modules(_OPENSSL QUIET openssl) +endif (UNIX) + +# http://www.slproweb.com/products/Win32OpenSSL.html +SET(_OPENSSL_ROOT_HINTS + $ENV{OPENSSL_ROOT_DIR} + ${OPENSSL_ROOT_DIR} + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (32-bit)_is1;Inno Setup: App Path]" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (64-bit)_is1;Inno Setup: App Path]" + ) +SET(_OPENSSL_ROOT_PATHS + "$ENV{PROGRAMFILES}/OpenSSL" + "$ENV{PROGRAMFILES}/OpenSSL-Win32" + "$ENV{PROGRAMFILES}/OpenSSL-Win64" + "C:/OpenSSL/" + "C:/OpenSSL-Win32/" + "C:/OpenSSL-Win64/" + ) +SET(_OPENSSL_ROOT_HINTS_AND_PATHS + HINTS ${_OPENSSL_ROOT_HINTS} + PATHS ${_OPENSSL_ROOT_PATHS} + ) + +FIND_PATH(OPENSSL_INCLUDE_DIR + NAMES + openssl/ssl.h + HINTS + ${_OPENSSL_INCLUDEDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + include +) + +IF(WIN32 AND NOT CYGWIN) + # MINGW should go here too + IF(MSVC) + # /MD and /MDd are the standard values - if someone wants to use + # others, the libnames have to change here too + # use also ssl and ssleay32 in debug as fallback for openssl < 0.9.8b + # TODO: handle /MT and static lib + # In Visual C++ naming convention each of these four kinds of Windows libraries has it's standard suffix: + # * MD for dynamic-release + # * MDd for dynamic-debug + # * MT for static-release + # * MTd for static-debug + + # Implementation details: + # We are using the libraries located in the VC subdir instead of the parent directory eventhough : + # libeay32MD.lib is identical to ../libeay32.lib, and + # ssleay32MD.lib is identical to ../ssleay32.lib + FIND_LIBRARY(LIB_EAY_DEBUG + NAMES + libeay32MDd + libeay32 + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "VC" + "lib/VC" + ) + + FIND_LIBRARY(LIB_EAY_RELEASE + NAMES + libeay32MD + libeay32 + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "VC" + "lib/VC" + ) + + FIND_LIBRARY(SSL_EAY_DEBUG + NAMES + ssleay32MDd + ssleay32 + ssl + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "VC" + "lib/VC" + ) + + FIND_LIBRARY(SSL_EAY_RELEASE + NAMES + ssleay32MD + ssleay32 + ssl + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "VC" + "lib/VC" + ) + + if( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE ) + set( OPENSSL_LIBRARIES + optimized ${SSL_EAY_RELEASE} debug ${SSL_EAY_DEBUG} + optimized ${LIB_EAY_RELEASE} debug ${LIB_EAY_DEBUG} + ) + else() + set( OPENSSL_LIBRARIES ${SSL_EAY_RELEASE} ${LIB_EAY_RELEASE} ) + endif() + MARK_AS_ADVANCED(SSL_EAY_DEBUG SSL_EAY_RELEASE) + MARK_AS_ADVANCED(LIB_EAY_DEBUG LIB_EAY_RELEASE) + ELSEIF(MINGW) + # same player, for MingW + FIND_LIBRARY(LIB_EAY + NAMES + libeay32 + crypto + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "lib/MinGW" + ) + + FIND_LIBRARY(SSL_EAY + NAMES + ssleay32 + ssl + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + "lib" + "lib/MinGW" + ) + + MARK_AS_ADVANCED(SSL_EAY LIB_EAY) + set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} ) + ELSE(MSVC) + # Not sure what to pick for -say- intel, let's use the toplevel ones and hope someone report issues: + FIND_LIBRARY(LIB_EAY + NAMES + libeay32 + HINTS + ${_OPENSSL_LIBDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + lib + ) + + FIND_LIBRARY(SSL_EAY + NAMES + ssleay32 + HINTS + ${_OPENSSL_LIBDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + lib + ) + + MARK_AS_ADVANCED(SSL_EAY LIB_EAY) + set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} ) + ENDIF(MSVC) +ELSE(WIN32 AND NOT CYGWIN) + + FIND_LIBRARY(OPENSSL_SSL_LIBRARY + NAMES + ssl + ssleay32 + ssleay32MD + HINTS + ${_OPENSSL_LIBDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + lib + ) + + FIND_LIBRARY(OPENSSL_CRYPTO_LIBRARY + NAMES + crypto + HINTS + ${_OPENSSL_LIBDIR} + ${_OPENSSL_ROOT_HINTS_AND_PATHS} + PATH_SUFFIXES + lib + ) + + MARK_AS_ADVANCED(OPENSSL_CRYPTO_LIBRARY OPENSSL_SSL_LIBRARY) + + # compat defines + SET(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY}) + SET(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY}) + + SET(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY}) + +ENDIF(WIN32 AND NOT CYGWIN) + +function(from_hex HEX DEC) + string(TOUPPER "${HEX}" HEX) + set(_res 0) + string(LENGTH "${HEX}" _strlen) + + while (_strlen GREATER 0) + math(EXPR _res "${_res} * 16") + string(SUBSTRING "${HEX}" 0 1 NIBBLE) + string(SUBSTRING "${HEX}" 1 -1 HEX) + if (NIBBLE STREQUAL "A") + math(EXPR _res "${_res} + 10") + elseif (NIBBLE STREQUAL "B") + math(EXPR _res "${_res} + 11") + elseif (NIBBLE STREQUAL "C") + math(EXPR _res "${_res} + 12") + elseif (NIBBLE STREQUAL "D") + math(EXPR _res "${_res} + 13") + elseif (NIBBLE STREQUAL "E") + math(EXPR _res "${_res} + 14") + elseif (NIBBLE STREQUAL "F") + math(EXPR _res "${_res} + 15") + else() + math(EXPR _res "${_res} + ${NIBBLE}") + endif() + + string(LENGTH "${HEX}" _strlen) + endwhile() + + set(${DEC} ${_res} PARENT_SCOPE) +endfunction(from_hex) + +if (OPENSSL_INCLUDE_DIR) + if (_OPENSSL_VERSION) + set(OPENSSL_VERSION "${_OPENSSL_VERSION}") + elseif(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h") + file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str + REGEX "^#define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*") + + # The version number is encoded as 0xMNNFFPPS: major minor fix patch status + # The status gives if this is a developer or prerelease and is ignored here. + # Major, minor, and fix directly translate into the version numbers shown in + # the string. The patch field translates to the single character suffix that + # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so + # on. + + string(REGEX REPLACE "^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]).*$" + "\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}") + list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR) + list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR) + from_hex("${OPENSSL_VERSION_MINOR}" OPENSSL_VERSION_MINOR) + list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX) + from_hex("${OPENSSL_VERSION_FIX}" OPENSSL_VERSION_FIX) + list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH) + + if (NOT OPENSSL_VERSION_PATCH STREQUAL "00") + from_hex("${OPENSSL_VERSION_PATCH}" _tmp) + # 96 is the ASCII code of 'a' minus 1 + math(EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96") + unset(_tmp) + # Once anyone knows how OpenSSL would call the patch versions beyond 'z' + # this should be updated to handle that, too. This has not happened yet + # so it is simply ignored here for now. + string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING) + endif (NOT OPENSSL_VERSION_PATCH STREQUAL "00") + + set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}") + endif (_OPENSSL_VERSION) +endif (OPENSSL_INCLUDE_DIR) + +include(FindPackageHandleStandardArgs) + +if (OPENSSL_VERSION) + find_package_handle_standard_args(OpenSSL + REQUIRED_VARS + OPENSSL_LIBRARIES + OPENSSL_INCLUDE_DIR + VERSION_VAR + OPENSSL_VERSION + FAIL_MESSAGE + "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" + ) +else (OPENSSL_VERSION) + find_package_handle_standard_args(OpenSSL "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" + OPENSSL_LIBRARIES + OPENSSL_INCLUDE_DIR + ) +endif (OPENSSL_VERSION) + +MARK_AS_ADVANCED(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES) From 2a40106e70e55f294f5755d03b1b02a1e8862562 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:33:41 +0300 Subject: [PATCH 026/106] Fixed merge conflict. --- src/csync_reconcile.c | 490 +++++++++++++++++++++--------------------- 1 file changed, 245 insertions(+), 245 deletions(-) diff --git a/src/csync_reconcile.c b/src/csync_reconcile.c index 93fb88bce8..7229198dc4 100644 --- a/src/csync_reconcile.c +++ b/src/csync_reconcile.c @@ -43,269 +43,269 @@ * source and the destination, have been changed, the newer file wins. */ static int _csync_merge_algorithm_visitor(void *obj, void *data) { - csync_file_stat_t *cur = NULL; - csync_file_stat_t *other = NULL; - csync_file_stat_t *tmp = NULL; - uint64_t h = 0; - int len = 0; + csync_file_stat_t *cur = NULL; + csync_file_stat_t *other = NULL; + csync_file_stat_t *tmp = NULL; + uint64_t h = 0; + int len = 0; - CSYNC *ctx = NULL; - c_rbtree_t *tree = NULL; - c_rbnode_t *node = NULL; + CSYNC *ctx = NULL; + c_rbtree_t *tree = NULL; + c_rbnode_t *node = NULL; - cur = (csync_file_stat_t *) obj; - ctx = (CSYNC *) data; + cur = (csync_file_stat_t *) obj; + ctx = (CSYNC *) data; - /* we need the opposite tree! */ - switch (ctx->current) { + /* we need the opposite tree! */ + switch (ctx->current) { case LOCAL_REPLICA: - tree = ctx->remote.tree; - break; + tree = ctx->remote.tree; + break; case REMOTE_REPLCIA: - tree = ctx->local.tree; - break; + tree = ctx->local.tree; + break; default: - break; - } - - node = c_rbtree_find(tree, &cur->phash); - /* file only found on current replica */ - if (node == NULL) { - switch(cur->instruction) { - /* file has been modified */ - case CSYNC_INSTRUCTION_EVAL: - cur->instruction = CSYNC_INSTRUCTION_NEW; - break; - /* file has been removed on the opposite replica */ - case CSYNC_INSTRUCTION_NONE: - cur->instruction = CSYNC_INSTRUCTION_REMOVE; - break; - case CSYNC_INSTRUCTION_RENAME: - /* rename support only on the local replica because of inode needed. */ - if(ctx->current == LOCAL_REPLICA ) { - /* use the old name to find the "other" node */ - tmp = csync_statedb_get_stat_by_inode(ctx, cur->inode); - /* Find the opposite node. */ - if( tmp ) { - /* We need to calculate the phash again because of the phash being stored as int in db. */ - if( tmp->path ) { - len = strlen( tmp->path ); - h = c_jhash64((uint8_t *) tmp->path, len, 0); - - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"PHash of temporar opposite: %llu", h); - node = c_rbtree_find(tree, &h); - } - if(node) { - other = (csync_file_stat_t*)node->data; - other->instruction = CSYNC_INSTRUCTION_RENAME; - other->destpath = c_strdup( cur->path ); - cur->instruction = CSYNC_INSTRUCTION_NONE; - } - if( ! other ) { - cur->instruction = CSYNC_INSTRUCTION_NEW; - } - } - } - break; - default: break; } - } else { - /* + + node = c_rbtree_find(tree, &cur->phash); + /* file only found on current replica */ + if (node == NULL) { + switch(cur->instruction) { + /* file has been modified */ + case CSYNC_INSTRUCTION_EVAL: + cur->instruction = CSYNC_INSTRUCTION_NEW; + break; + /* file has been removed on the opposite replica */ + case CSYNC_INSTRUCTION_NONE: + cur->instruction = CSYNC_INSTRUCTION_REMOVE; + break; + case CSYNC_INSTRUCTION_RENAME: + /* rename support only on the local replica because of inode needed. */ + if(ctx->current == LOCAL_REPLICA ) { + /* use the old name to find the "other" node */ + tmp = csync_statedb_get_stat_by_inode(ctx, cur->inode); + /* Find the opposite node. */ + if( tmp ) { + /* We need to calculate the phash again because of the phash being stored as int in db. */ + if( tmp->path ) { + len = strlen( tmp->path ); + h = c_jhash64((uint8_t *) tmp->path, len, 0); + + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"PHash of temporar opposite: %llu", h); + node = c_rbtree_find(tree, &h); + } + if(node) { + other = (csync_file_stat_t*)node->data; + other->instruction = CSYNC_INSTRUCTION_RENAME; + other->destpath = c_strdup( cur->path ); + cur->instruction = CSYNC_INSTRUCTION_NONE; + } + if( ! other ) { + cur->instruction = CSYNC_INSTRUCTION_NEW; + } + } + } + break; + default: + break; + } + } else { + /* * file found on the other replica */ - other = (csync_file_stat_t *) node->data; + other = (csync_file_stat_t *) node->data; - switch (cur->instruction) { - /* file on current replica is new */ - case CSYNC_INSTRUCTION_NEW: - switch (other->instruction) { - /* file on other replica is new too */ - case CSYNC_INSTRUCTION_NEW: - if (cur->modtime > other->modtime) { - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"file new on both, cur is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_CONFLICT; - other->instruction = CSYNC_INSTRUCTION_NONE; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_SYNC; - other->instruction = CSYNC_INSTRUCTION_NONE; - } - - } else if (cur->modtime < other->modtime) { - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"file new on both, other is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_NONE; - other->instruction = CSYNC_INSTRUCTION_CONFLICT; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_NONE; - other->instruction = CSYNC_INSTRUCTION_SYNC; - } - - } else { - /* file are equal */ - cur->instruction = CSYNC_INSTRUCTION_NONE; - other->instruction = CSYNC_INSTRUCTION_NONE; + switch (cur->instruction) { + /* file on current replica is new */ + case CSYNC_INSTRUCTION_NEW: + switch (other->instruction) { + /* file on other replica is new too */ + case CSYNC_INSTRUCTION_NEW: + if (cur->modtime > other->modtime) { + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"file new on both, cur is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_CONFLICT; + other->instruction = CSYNC_INSTRUCTION_NONE; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_SYNC; + other->instruction = CSYNC_INSTRUCTION_NONE; + } + + } else if (cur->modtime < other->modtime) { + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"file new on both, other is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_NONE; + other->instruction = CSYNC_INSTRUCTION_CONFLICT; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_NONE; + other->instruction = CSYNC_INSTRUCTION_SYNC; + } + + } else { + /* file are equal */ + cur->instruction = CSYNC_INSTRUCTION_NONE; + other->instruction = CSYNC_INSTRUCTION_NONE; + } + break; + /* file on other replica has changed too */ + case CSYNC_INSTRUCTION_EVAL: + /* file on current replica is newer */ + if (cur->modtime > other->modtime) { + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"new on cur, modified on other, cur is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_CONFLICT; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_SYNC; + } + + } else { + /* file on opposite replica is newer */ + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"new on cur, modified on other, other is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_NONE; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_NONE; + } + + } + break; + /* file on the other replica has not been modified */ + case CSYNC_INSTRUCTION_NONE: + cur->instruction = CSYNC_INSTRUCTION_SYNC; + break; + default: + break; } break; - /* file on other replica has changed too */ - case CSYNC_INSTRUCTION_EVAL: - /* file on current replica is newer */ - if (cur->modtime > other->modtime) { - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"new on cur, modified on other, cur is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_CONFLICT; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_SYNC; - } - - } else { - /* file on opposite replica is newer */ - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"new on cur, modified on other, other is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_NONE; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_NONE; - } - + /* file on current replica has been modified */ + case CSYNC_INSTRUCTION_EVAL: + switch (other->instruction) { + /* file on other replica is new too */ + case CSYNC_INSTRUCTION_NEW: + if (cur->modtime > other->modtime) { + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"modified on cur, new on other, cur is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_CONFLICT; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_SYNC; + } + + } else { + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"modified on cur, new on other, other is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_NONE; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_NONE; + } + } + break; + /* file on other replica has changed too */ + case CSYNC_INSTRUCTION_EVAL: + /* file on current replica is newer */ + if (cur->modtime > other->modtime) { + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"both modified, cur is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_CONFLICT; + other->instruction= CSYNC_INSTRUCTION_NONE; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_SYNC; + } + + } else { + /* file on opposite replica is newer */ + + if(ctx->options.with_conflict_copys) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"both modified, other is newer PATH=./%s",cur->path); + cur->instruction = CSYNC_INSTRUCTION_NONE; + other->instruction=CSYNC_INSTRUCTION_CONFLICT; + } + else + { + cur->instruction = CSYNC_INSTRUCTION_NONE; + } + } + break; + /* file on the other replica has not been modified */ + case CSYNC_INSTRUCTION_NONE: + cur->instruction = CSYNC_INSTRUCTION_SYNC; + break; + default: + break; } break; - /* file on the other replica has not been modified */ - case CSYNC_INSTRUCTION_NONE: - cur->instruction = CSYNC_INSTRUCTION_SYNC; - break; - default: + default: break; } - break; - /* file on current replica has been modified */ - case CSYNC_INSTRUCTION_EVAL: - switch (other->instruction) { - /* file on other replica is new too */ - case CSYNC_INSTRUCTION_NEW: - if (cur->modtime > other->modtime) { - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"modified on cur, new on other, cur is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_CONFLICT; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_SYNC; - } - - } else { - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"modified on cur, new on other, other is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_NONE; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_NONE; - } - } - break; - /* file on other replica has changed too */ - case CSYNC_INSTRUCTION_EVAL: - /* file on current replica is newer */ - if (cur->modtime > other->modtime) { - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"both modified, cur is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_CONFLICT; - other->instruction= CSYNC_INSTRUCTION_NONE; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_SYNC; - } - - } else { - /* file on opposite replica is newer */ - - if(ctx->options.with_conflict_copys) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"both modified, other is newer PATH=./%s",cur->path); - cur->instruction = CSYNC_INSTRUCTION_NONE; - other->instruction=CSYNC_INSTRUCTION_CONFLICT; - } - else - { - cur->instruction = CSYNC_INSTRUCTION_NONE; - } - } - break; - /* file on the other replica has not been modified */ - case CSYNC_INSTRUCTION_NONE: - cur->instruction = CSYNC_INSTRUCTION_SYNC; - break; - default: - break; - } - break; - default: - break; } - } - - //hide instruction NONE messages when log level is set to debug, - //only show these messages on log level trace - if(cur->instruction ==CSYNC_INSTRUCTION_NONE) - { - if(cur->type == CSYNC_FTW_TYPE_DIR) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, - "%-20s dir: %s", - csync_instruction_str(cur->instruction), - cur->path); - } - else - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, - "%-20s file: %s", - csync_instruction_str(cur->instruction), - cur->path); - } - } - else - { - if(cur->type == CSYNC_FTW_TYPE_DIR) - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, - "%-20s dir: %s", - csync_instruction_str(cur->instruction), - cur->path); - } - else - { - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, - "%-20s file: %s", - csync_instruction_str(cur->instruction), - cur->path); - } - } - - return 0; + + //hide instruction NONE messages when log level is set to debug, + //only show these messages on log level trace + if(cur->instruction ==CSYNC_INSTRUCTION_NONE) + { + if(cur->type == CSYNC_FTW_TYPE_DIR) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, + "%-20s dir: %s", + csync_instruction_str(cur->instruction), + cur->path); + } + else + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, + "%-20s file: %s", + csync_instruction_str(cur->instruction), + cur->path); + } + } + else + { + if(cur->type == CSYNC_FTW_TYPE_DIR) + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, + "%-20s dir: %s", + csync_instruction_str(cur->instruction), + cur->path); + } + else + { + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, + "%-20s file: %s", + csync_instruction_str(cur->instruction), + cur->path); + } + } + + return 0; } int csync_reconcile_updates(CSYNC *ctx) { From 943e960bc03b8c3f8fe0ead3539f638c45d67784 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:34:02 +0300 Subject: [PATCH 027/106] Fixed merge conflict. --- src/csync_private.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/csync_private.h b/src/csync_private.h index a10e40a1c1..2e1b3899cb 100644 --- a/src/csync_private.h +++ b/src/csync_private.h @@ -160,6 +160,7 @@ struct csync_file_stat_s { int nlink; /* u32 */ int type; /* u32 */ char *destpath; /* for renames */ + char *md5; enum csync_instructions_e instruction; /* u32 */ char path[1]; /* u8 */ } From 8e401e662f871d3d0d8c495f204b56785c1c5dfd Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 24 Jul 2012 09:36:06 +0200 Subject: [PATCH 028/106] MD5 Support WIP --- modules/csync_owncloud.c | 19 ++++++++++++++++++- src/csync_statedb.c | 26 +++++++++++++++++++------- src/csync_update.c | 4 +++- src/vio/csync_vio_file_stat.h | 2 ++ src/vio/csync_vio_local.c | 5 +++++ tests/ownCloud/mocka/ocmod_test.c | 5 ++++- 6 files changed, 51 insertions(+), 10 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 4f5cc22f08..c927b04bf9 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -89,6 +89,7 @@ typedef struct resource { enum resource_type type; dav_size_t size; time_t modtime; + char md5[33]; struct resource *next; } resource; @@ -142,6 +143,7 @@ static const ne_propname ls_props[] = { { "DAV:", "getlastmodified" }, { "DAV:", "getcontentlength" }, { "DAV:", "resourcetype" }, + { "DAV:", "getetag"}, { NULL, NULL } }; @@ -522,6 +524,7 @@ static void results(void *userdata, struct resource *newres = 0; const char *clength, *modtime = NULL; const char *resourcetype = NULL; + const char *md5sum = NULL; const ne_status *status = NULL; char *path = ne_path_unescape( uri->path ); @@ -561,6 +564,7 @@ static void results(void *userdata, modtime = ne_propset_value( set, &ls_props[0] ); clength = ne_propset_value( set, &ls_props[1] ); resourcetype = ne_propset_value( set, &ls_props[2] ); + md5sum = ne_propset_value( set, &ls_props[3] ); newres->type = resr_normal; if( clength == NULL && resourcetype && strncmp( resourcetype, "", 16 ) == 0) { @@ -579,6 +583,12 @@ static void results(void *userdata, } } + if( md5sum ) { + /* Skip the " around the string coming back from teh ne_propset_value call */ + strncpy( newres->md5, md5sum+1, 32 ); + DEBUG_WEBDAV("OOOOOOOOOOOOOOOOOOOOO %s", newres->md5); + } + /* prepend the new resource to the result list */ newres->next = fetchCtx->list; fetchCtx->list = newres; @@ -690,7 +700,9 @@ static csync_vio_file_stat_t *resourceToFileStat( struct resource *res ) lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; lfs->size = res->size; lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; - + lfs->md5 = c_strdup(res->md5); + DEBUG_WEBDAV("XXXXXXXXXXXXXXXXXXXXX MD5: %s", lfs->md5 ); + lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; return lfs; } @@ -791,10 +803,12 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_PERMISSIONS; + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; buf->fields = _fs.fields; buf->type = _fs.type; buf->mtime = _fs.mtime; + buf->md5 = c_strdup( _fs.md5 ); buf->size = _fs.size; buf->mode = _stat_perms( _fs.type ); @@ -859,12 +873,14 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_PERMISSIONS; + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; buf->fields = lfs->fields; buf->type = lfs->type; buf->mtime = lfs->mtime; buf->size = lfs->size; buf->mode = _stat_perms( lfs->type ); + buf->md5 = c_strdup( lfs->md5 ); csync_vio_file_stat_destroy( lfs ); } @@ -1486,6 +1502,7 @@ static csync_vio_file_stat_t *owncloud_readdir(csync_vio_method_handle_t *dhandl _fs.fields = lfs->fields; _fs.type = lfs->type; _fs.size = lfs->size; + _fs.md5 = c_strdup( lfs->md5 ); } /* DEBUG_WEBDAV("LFS fields: %s: %d", lfs->name, lfs->type ); */ diff --git a/src/csync_statedb.c b/src/csync_statedb.c index feb85a9596..d70e4bb080 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -213,6 +213,7 @@ int csync_statedb_create_tables(CSYNC *ctx) { "gid INTEGER," "mode INTEGER," "modtime INTEGER(8)," + "md5 VARCHAR(32)," "PRIMARY KEY(phash)" ");" ); @@ -232,6 +233,7 @@ int csync_statedb_create_tables(CSYNC *ctx) { "gid INTEGER," "mode INTEGER," "modtime INTEGER(8)," + "md5 VARCHAR(32)," "PRIMARY KEY(phash)" ");" ); @@ -254,6 +256,13 @@ int csync_statedb_create_tables(CSYNC *ctx) { } c_strlist_destroy(result); + result = csync_statedb_query(ctx, + "CREATE INDEX metadata_md5 ON metadata(md5);"); + if (result == NULL) { + return -1; + } + c_strlist_destroy(result); + return 0; } @@ -296,8 +305,8 @@ static int _insert_metadata_visitor(void *obj, void *data) { case CSYNC_INSTRUCTION_CONFLICT: CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "SQL statement: INSERT INTO metadata_temp \n" - "\t\t\t(phash, pathlen, path, inode, uid, gid, mode, modtime) VALUES \n" - "\t\t\t(%llu, %lu, %s, %llu, %u, %u, %u, %lu);", + "\t\t\t(phash, pathlen, path, inode, uid, gid, mode, modtime, md5) VALUES \n" + "\t\t\t(%llu, %lu, %s, %llu, %u, %u, %u, %lu, %s);", (long long unsigned int) fs->phash, (long unsigned int) fs->pathlen, fs->path, @@ -305,14 +314,15 @@ static int _insert_metadata_visitor(void *obj, void *data) { fs->uid, fs->gid, fs->mode, - fs->modtime); + fs->modtime, + fs->md5); /* * The phash needs to be long long unsigned int or it segfaults on PPC */ stmt = sqlite3_mprintf("INSERT INTO metadata_temp " - "(phash, pathlen, path, inode, uid, gid, mode, modtime) VALUES " - "(%llu, %lu, '%q', %llu, %u, %u, %u, %lu);", + "(phash, pathlen, path, inode, uid, gid, mode, modtime, md5) VALUES " + "(%llu, %lu, '%q', %llu, %u, %u, %u, %lu, '%s');", (long long unsigned int) fs->phash, (long unsigned int) fs->pathlen, fs->path, @@ -320,7 +330,8 @@ static int _insert_metadata_visitor(void *obj, void *data) { fs->uid, fs->gid, fs->mode, - fs->modtime); + fs->modtime, + fs->md5); if (stmt == NULL) { return -1; @@ -413,7 +424,7 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx, uint64_t phash) { st->gid = atoi(result->vector[5]); st->mode = atoi(result->vector[6]); st->modtime = strtoul(result->vector[7], NULL, 10); - + st->md5 = c_strdup( result->vector[8] ); c_strlist_destroy(result); return st; @@ -458,6 +469,7 @@ csync_file_stat_t *csync_statedb_get_stat_by_inode(CSYNC *ctx, uint64_t inode) { st->gid = atoi(result->vector[5]); st->mode = atoi(result->vector[6]); st->modtime = strtoul(result->vector[7], NULL, 10); + st->md5 = c_strdup(result->vector[8]); c_strlist_destroy(result); diff --git a/src/csync_update.c b/src/csync_update.c index 2b44932aef..fdd7146fd6 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -107,7 +107,8 @@ static int _csync_detect_update(CSYNC *ctx, const char *file, /* we have an update! */ CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "time compare: %lu <-> %lu", fs->mtime, tmp->modtime); - if (fs->mtime > tmp->modtime) { + if( !c_streq(fs->md5, tmp->md5 )) { + // if (!fs->mtime > tmp->modtime) { st->instruction = CSYNC_INSTRUCTION_EVAL; goto out; } @@ -143,6 +144,7 @@ out: st->gid = fs->gid; st->nlink = fs->nlink; st->type = type; + st->md5 = c_strdup(fs->md5); st->phash = h; st->pathlen = len; diff --git a/src/vio/csync_vio_file_stat.h b/src/vio/csync_vio_file_stat.h index 09e59280ab..93a7f7084c 100644 --- a/src/vio/csync_vio_file_stat.h +++ b/src/vio/csync_vio_file_stat.h @@ -72,6 +72,7 @@ enum csync_vio_file_stat_fields_e { CSYNC_VIO_FILE_STAT_FIELDS_ACL = 1 << 14, CSYNC_VIO_FILE_STAT_FIELDS_UID = 1 << 15, CSYNC_VIO_FILE_STAT_FIELDS_GID = 1 << 16, + CSYNC_VIO_FILE_STAT_FIELDS_MD5 = 1 << 17, }; @@ -83,6 +84,7 @@ struct csync_vio_file_stat_s { void *acl; char *name; + char *md5; uid_t uid; gid_t gid; diff --git a/src/vio/csync_vio_local.c b/src/vio/csync_vio_local.c index 8835f03ee7..d041cb1bfa 100644 --- a/src/vio/csync_vio_local.c +++ b/src/vio/csync_vio_local.c @@ -35,6 +35,8 @@ #include "c_private.h" #include "c_lib.h" #include "c_string.h" +#include "csync_util.h" +#include "csync_log.h" #include "vio/csync_vio_local.h" @@ -387,6 +389,9 @@ int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->ctime = sb.st_ctime; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_CTIME; + buf->md5 = csync_file_md5( uri ); + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; + c_free_multibyte(wuri); return 0; } diff --git a/tests/ownCloud/mocka/ocmod_test.c b/tests/ownCloud/mocka/ocmod_test.c index 74365c69cc..843f5248ed 100644 --- a/tests/ownCloud/mocka/ocmod_test.c +++ b/tests/ownCloud/mocka/ocmod_test.c @@ -134,6 +134,7 @@ static void fetch_a_context(void **state) { assert_true( fetchCtx->currResource->name != NULL ); printf( " %s -> %s\n", fetchCtx->currResource->uri, fetchCtx->currResource->name ); + printf( " MD5: %s\n", fetchCtx->currResource->md5); fetchCtx->currResource = fetchCtx->currResource->next; } } @@ -299,11 +300,13 @@ int main(void) { const UnitTest tests[] = { unit_test(null_test_success), unit_test(connect_test_success), - unit_test(fetch_a_context), unit_test_setup_teardown(test_setup_dirs, setup_toplevel_dir, teardown_toplevel_dir), unit_test(test_upload_files), + unit_test(fetch_a_context), unit_test(test_download_files), }; + srand(time(NULL)); + return run_tests(tests); } From 64660df84bdce0e259def12a0fbd5604936e8089 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 30 Jul 2012 13:57:57 +0300 Subject: [PATCH 029/106] removed obsolete FindOpenSSL. --- cmake/Modules/FindOpenSSL.cmake | 306 -------------------------------- 1 file changed, 306 deletions(-) delete mode 100644 cmake/Modules/FindOpenSSL.cmake diff --git a/cmake/Modules/FindOpenSSL.cmake b/cmake/Modules/FindOpenSSL.cmake deleted file mode 100644 index 0191714355..0000000000 --- a/cmake/Modules/FindOpenSSL.cmake +++ /dev/null @@ -1,306 +0,0 @@ -# - Try to find the OpenSSL encryption library -# Once done this will define -# -# OPENSSL_ROOT_DIR - Set this variable to the root installation of OpenSSL -# -# Read-Only variables: -# OPENSSL_FOUND - system has the OpenSSL library -# OPENSSL_INCLUDE_DIR - the OpenSSL include directory -# OPENSSL_LIBRARIES - The libraries needed to use OpenSSL -# OPENSSL_VERSION - This is set to $major.$minor.$revision$path (eg. 0.9.8s) - -#============================================================================= -# Copyright 2006-2009 Kitware, Inc. -# Copyright 2006 Alexander Neundorf -# Copyright 2009-2011 Mathieu Malaterre -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= -# (To distribute this file outside of CMake, substitute the full -# License text for the above reference.) - -if (UNIX) - find_package(PkgConfig QUIET) - pkg_check_modules(_OPENSSL QUIET openssl) -endif (UNIX) - -# http://www.slproweb.com/products/Win32OpenSSL.html -SET(_OPENSSL_ROOT_HINTS - $ENV{OPENSSL_ROOT_DIR} - ${OPENSSL_ROOT_DIR} - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (32-bit)_is1;Inno Setup: App Path]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (64-bit)_is1;Inno Setup: App Path]" - ) -SET(_OPENSSL_ROOT_PATHS - "$ENV{PROGRAMFILES}/OpenSSL" - "$ENV{PROGRAMFILES}/OpenSSL-Win32" - "$ENV{PROGRAMFILES}/OpenSSL-Win64" - "C:/OpenSSL/" - "C:/OpenSSL-Win32/" - "C:/OpenSSL-Win64/" - ) -SET(_OPENSSL_ROOT_HINTS_AND_PATHS - HINTS ${_OPENSSL_ROOT_HINTS} - PATHS ${_OPENSSL_ROOT_PATHS} - ) - -FIND_PATH(OPENSSL_INCLUDE_DIR - NAMES - openssl/ssl.h - HINTS - ${_OPENSSL_INCLUDEDIR} - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - include -) - -IF(WIN32 AND NOT CYGWIN) - # MINGW should go here too - IF(MSVC) - # /MD and /MDd are the standard values - if someone wants to use - # others, the libnames have to change here too - # use also ssl and ssleay32 in debug as fallback for openssl < 0.9.8b - # TODO: handle /MT and static lib - # In Visual C++ naming convention each of these four kinds of Windows libraries has it's standard suffix: - # * MD for dynamic-release - # * MDd for dynamic-debug - # * MT for static-release - # * MTd for static-debug - - # Implementation details: - # We are using the libraries located in the VC subdir instead of the parent directory eventhough : - # libeay32MD.lib is identical to ../libeay32.lib, and - # ssleay32MD.lib is identical to ../ssleay32.lib - FIND_LIBRARY(LIB_EAY_DEBUG - NAMES - libeay32MDd - libeay32 - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - "lib" - "VC" - "lib/VC" - ) - - FIND_LIBRARY(LIB_EAY_RELEASE - NAMES - libeay32MD - libeay32 - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - "lib" - "VC" - "lib/VC" - ) - - FIND_LIBRARY(SSL_EAY_DEBUG - NAMES - ssleay32MDd - ssleay32 - ssl - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - "lib" - "VC" - "lib/VC" - ) - - FIND_LIBRARY(SSL_EAY_RELEASE - NAMES - ssleay32MD - ssleay32 - ssl - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - "lib" - "VC" - "lib/VC" - ) - - if( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE ) - set( OPENSSL_LIBRARIES - optimized ${SSL_EAY_RELEASE} debug ${SSL_EAY_DEBUG} - optimized ${LIB_EAY_RELEASE} debug ${LIB_EAY_DEBUG} - ) - else() - set( OPENSSL_LIBRARIES ${SSL_EAY_RELEASE} ${LIB_EAY_RELEASE} ) - endif() - MARK_AS_ADVANCED(SSL_EAY_DEBUG SSL_EAY_RELEASE) - MARK_AS_ADVANCED(LIB_EAY_DEBUG LIB_EAY_RELEASE) - ELSEIF(MINGW) - # same player, for MingW - FIND_LIBRARY(LIB_EAY - NAMES - libeay32 - crypto - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - "lib" - "lib/MinGW" - ) - - FIND_LIBRARY(SSL_EAY - NAMES - ssleay32 - ssl - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - "lib" - "lib/MinGW" - ) - - MARK_AS_ADVANCED(SSL_EAY LIB_EAY) - set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} ) - ELSE(MSVC) - # Not sure what to pick for -say- intel, let's use the toplevel ones and hope someone report issues: - FIND_LIBRARY(LIB_EAY - NAMES - libeay32 - HINTS - ${_OPENSSL_LIBDIR} - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - lib - ) - - FIND_LIBRARY(SSL_EAY - NAMES - ssleay32 - HINTS - ${_OPENSSL_LIBDIR} - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - lib - ) - - MARK_AS_ADVANCED(SSL_EAY LIB_EAY) - set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} ) - ENDIF(MSVC) -ELSE(WIN32 AND NOT CYGWIN) - - FIND_LIBRARY(OPENSSL_SSL_LIBRARY - NAMES - ssl - ssleay32 - ssleay32MD - HINTS - ${_OPENSSL_LIBDIR} - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - lib - ) - - FIND_LIBRARY(OPENSSL_CRYPTO_LIBRARY - NAMES - crypto - HINTS - ${_OPENSSL_LIBDIR} - ${_OPENSSL_ROOT_HINTS_AND_PATHS} - PATH_SUFFIXES - lib - ) - - MARK_AS_ADVANCED(OPENSSL_CRYPTO_LIBRARY OPENSSL_SSL_LIBRARY) - - # compat defines - SET(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY}) - SET(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY}) - - SET(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY}) - -ENDIF(WIN32 AND NOT CYGWIN) - -function(from_hex HEX DEC) - string(TOUPPER "${HEX}" HEX) - set(_res 0) - string(LENGTH "${HEX}" _strlen) - - while (_strlen GREATER 0) - math(EXPR _res "${_res} * 16") - string(SUBSTRING "${HEX}" 0 1 NIBBLE) - string(SUBSTRING "${HEX}" 1 -1 HEX) - if (NIBBLE STREQUAL "A") - math(EXPR _res "${_res} + 10") - elseif (NIBBLE STREQUAL "B") - math(EXPR _res "${_res} + 11") - elseif (NIBBLE STREQUAL "C") - math(EXPR _res "${_res} + 12") - elseif (NIBBLE STREQUAL "D") - math(EXPR _res "${_res} + 13") - elseif (NIBBLE STREQUAL "E") - math(EXPR _res "${_res} + 14") - elseif (NIBBLE STREQUAL "F") - math(EXPR _res "${_res} + 15") - else() - math(EXPR _res "${_res} + ${NIBBLE}") - endif() - - string(LENGTH "${HEX}" _strlen) - endwhile() - - set(${DEC} ${_res} PARENT_SCOPE) -endfunction(from_hex) - -if (OPENSSL_INCLUDE_DIR) - if (_OPENSSL_VERSION) - set(OPENSSL_VERSION "${_OPENSSL_VERSION}") - elseif(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h") - file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str - REGEX "^#define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*") - - # The version number is encoded as 0xMNNFFPPS: major minor fix patch status - # The status gives if this is a developer or prerelease and is ignored here. - # Major, minor, and fix directly translate into the version numbers shown in - # the string. The patch field translates to the single character suffix that - # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so - # on. - - string(REGEX REPLACE "^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]).*$" - "\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}") - list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR) - list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR) - from_hex("${OPENSSL_VERSION_MINOR}" OPENSSL_VERSION_MINOR) - list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX) - from_hex("${OPENSSL_VERSION_FIX}" OPENSSL_VERSION_FIX) - list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH) - - if (NOT OPENSSL_VERSION_PATCH STREQUAL "00") - from_hex("${OPENSSL_VERSION_PATCH}" _tmp) - # 96 is the ASCII code of 'a' minus 1 - math(EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96") - unset(_tmp) - # Once anyone knows how OpenSSL would call the patch versions beyond 'z' - # this should be updated to handle that, too. This has not happened yet - # so it is simply ignored here for now. - string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING) - endif (NOT OPENSSL_VERSION_PATCH STREQUAL "00") - - set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}") - endif (_OPENSSL_VERSION) -endif (OPENSSL_INCLUDE_DIR) - -include(FindPackageHandleStandardArgs) - -if (OPENSSL_VERSION) - find_package_handle_standard_args(OpenSSL - REQUIRED_VARS - OPENSSL_LIBRARIES - OPENSSL_INCLUDE_DIR - VERSION_VAR - OPENSSL_VERSION - FAIL_MESSAGE - "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" - ) -else (OPENSSL_VERSION) - find_package_handle_standard_args(OpenSSL "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" - OPENSSL_LIBRARIES - OPENSSL_INCLUDE_DIR - ) -endif (OPENSSL_VERSION) - -MARK_AS_ADVANCED(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES) From 3e85218be936161cb2aa6039b31922478078fd65 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:35:16 +0300 Subject: [PATCH 030/106] Do not do post copy stat for ownCloud. --- modules/csync_owncloud.c | 59 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index c927b04bf9..9aa66fbaf5 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -118,6 +118,8 @@ struct transfer_context { const char *method; /* the HTTP method, either PUT or GET */ ne_decompress *decompress; /* the decompress context */ int fileWritten; /* flag to indicate that a buffer file was written for PUTs */ + char *md5; + char *clean_uri; }; /* Struct with the WebDAV session */ @@ -147,6 +149,11 @@ static const ne_propname ls_props[] = { { NULL, NULL } }; +struct stat_cache_s { + char *uri; + csync_vio_file_stat_t stat; +}; + /* * local variables. */ @@ -155,6 +162,10 @@ struct dav_session_s dav_session; /* The DAV Session, initialised in dav_connect int _connected = 0; /* flag to indicate if a connection exists, ie. the dav_session is valid */ csync_vio_file_stat_t _fs; +csync_vio_file_stat_t _owc; + +struct stat_cache_s _statCache; + csync_auth_callback _authcb; @@ -812,6 +823,21 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->size = _fs.size; buf->mode = _stat_perms( _fs.type ); + } else if( _statCache.uri && c_streq( _statCache.uri, uri )) { + DEBUG_WEBDAV("Found file stat info in statcache!"); + buf->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE; + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; + // buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; + // buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_PERMISSIONS; + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; + + buf->type = _fs.type; + buf->size = _fs.size; + buf->md5 = c_strdup( _fs.md5 ); + + // buf->mode = _stat_perms( _fs.type ); + } else { /* fetch data via a propfind call. */ fetchCtx = c_malloc( sizeof( struct listdir_context )); @@ -1022,7 +1048,7 @@ static char*_lastDir = NULL; */ static csync_vio_capabilities_t _owncloud_capabilities = { true, false, true, 1 }; -static csync_vio_capabilities_t *owncloud_get_capabilities(void) +static csync_vio_capabilities_t *owncloud_capabilities(void) { #ifdef _WIN32 _owncloud_capabilities.unix_extensions = 0; @@ -1047,6 +1073,7 @@ static csync_vio_method_handle_t *owncloud_open(const char *durl, const char *winTmpUtf8 = NULL; csync_stat_t sb; #endif + const char *etag_header = NULL; struct transfer_context *writeCtx = NULL; csync_vio_file_stat_t statBuf; @@ -1108,6 +1135,8 @@ static csync_vio_method_handle_t *owncloud_open(const char *durl, writeCtx = c_malloc( sizeof(struct transfer_context) ); writeCtx->bytes_written = 0; + writeCtx->clean_uri = c_strdup(uri); + if( rc == NE_OK ) { /* open a temp file to store the incoming data */ #ifdef _WIN32 @@ -1165,7 +1194,7 @@ static csync_vio_method_handle_t *owncloud_open(const char *durl, writeCtx->fileWritten = 0; /* flag to indicate if contents was pushed to file */ writeCtx->req = ne_request_create(dav_session.ctx, "PUT", uri); - writeCtx->method = "PUT"; + writeCtx->method = "PUT"; } @@ -1213,6 +1242,13 @@ static csync_vio_method_handle_t *owncloud_open(const char *durl, ne_decompress_destroy( writeCtx->decompress ); } + /* preserve the ETag header */ + etag_header = ne_get_response_header( writeCtx->req, "ETag" ); + if( etag_header ) { + writeCtx->md5 = c_strdup( etag_header ); + DEBUG_WEBDAV("GET Etag: %s", etag_header ); + } + /* delete the request in any case */ ne_request_destroy(writeCtx->req); #else @@ -1260,6 +1296,7 @@ static int owncloud_close(csync_vio_method_handle_t *fhandle) { int ret = 0; size_t len = 0; const _TCHAR *tmpFileName = 0; + const char *etag_header = 0; writeCtx = (struct transfer_context*) fhandle; @@ -1346,6 +1383,13 @@ static int owncloud_close(csync_vio_method_handle_t *fhandle) { ret = -1; } } + + /* get the uniq id request header */ + etag_header = ne_get_response_header( writeCtx->req, "ETag" ); + if( etag_header ) { + DEBUG_WEBDAV("ETag for file : %s", etag_header); + writeCtx->md5 = c_strdup( etag_header ); + } } ne_request_destroy( writeCtx->req ); } else { @@ -1360,6 +1404,13 @@ static int owncloud_close(csync_vio_method_handle_t *fhandle) { /* Remove the local file. */ unlink( writeCtx->tmpFileName ); + /* cache the stat info about the recently written or read file */ + // FIXME: Free the strings + _statCache.stat.size = writeCtx->bytes_written; + _statCache.stat.md5 = writeCtx->md5; + _statCache.stat.name = c_basename( writeCtx->clean_uri ); + _statCache.stat.type = CSYNC_VIO_FILE_TYPE_REGULAR; + /* free mem. Note that the request mem is freed by the ne_request_destroy call */ SAFE_FREE( writeCtx->tmpFileName ); SAFE_FREE( writeCtx ); @@ -1502,7 +1553,7 @@ static csync_vio_file_stat_t *owncloud_readdir(csync_vio_method_handle_t *dhandl _fs.fields = lfs->fields; _fs.type = lfs->type; _fs.size = lfs->size; - _fs.md5 = c_strdup( lfs->md5 ); + _fs.md5 = lfs->md5; } /* DEBUG_WEBDAV("LFS fields: %s: %d", lfs->name, lfs->type ); */ @@ -1695,7 +1746,7 @@ static int owncloud_utimes(const char *uri, const struct timeval *times) { csync_vio_method_t _method = { .method_table_size = sizeof(csync_vio_method_t), - .get_capabilities = owncloud_get_capabilities, + .get_capabilities = owncloud_capabilities, .open = owncloud_open, .creat = owncloud_creat, .close = owncloud_close, From d2ba37a41993b5b34e21dd02729725303d69db0a Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:38:25 +0300 Subject: [PATCH 031/106] Resolved merge conflict. --- src/vio/csync_vio.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vio/csync_vio.c b/src/vio/csync_vio.c index 3b0c8daaa5..37578486bb 100644 --- a/src/vio/csync_vio.c +++ b/src/vio/csync_vio.c @@ -32,6 +32,8 @@ #include "vio/csync_vio.h" #include "vio/csync_vio_handle_private.h" #include "vio/csync_vio_local.h" +#include "csync_statedb.h" +#include "std/c_jhash.h" #define CSYNC_LOG_CATEGORY_NAME "csync.vio.main" @@ -529,6 +531,9 @@ int csync_vio_rmdir(CSYNC *ctx, const char *uri) { int csync_vio_stat(CSYNC *ctx, const char *uri, csync_vio_file_stat_t *buf) { int rc = -1; + int len = 0; + uint64_t h = 0; + char *file = 0; switch(ctx->replica) { case REMOTE_REPLCIA: @@ -539,7 +544,6 @@ int csync_vio_stat(CSYNC *ctx, const char *uri, csync_vio_file_stat_t *buf) { #ifdef _WIN32 CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Win32: STAT-inode for %s: %llu", uri, buf->inode ); #endif - break; default: break; From ae5394ad75ab76a9d85712d0742ab4a23b554750 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 31 Jul 2012 11:40:46 +0300 Subject: [PATCH 032/106] UniqID based syncing, first WIP state. --- src/csync_propagate.c | 6 ++++++ src/csync_statedb.c | 22 ++++++++++++++++++++++ src/csync_statedb.h | 1 + src/csync_update.c | 20 +++++++++++++++++++- src/csync_util.c | 5 +++++ src/vio/csync_vio_local.c | 4 +++- 6 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/csync_propagate.c b/src/csync_propagate.c index fa59519f0c..09396cd1ed 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -332,6 +332,12 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { rc = 1; goto out; } + + if( st->md5 ) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "UUUU MD5 sum: %s", st->md5); + } else { + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "MD5 sum is empty"); + } } if (_push_to_tmp_first(ctx)) { diff --git a/src/csync_statedb.c b/src/csync_statedb.c index d70e4bb080..47b6d10b35 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -476,6 +476,28 @@ csync_file_stat_t *csync_statedb_get_stat_by_inode(CSYNC *ctx, uint64_t inode) { return st; } +char *csync_statedb_get_uniqId( CSYNC *ctx, uint64_t jHash, csync_vio_file_stat_t *buf ) { + char *ret = NULL; + c_strlist_t *result = NULL; + char *stmt = NULL; + + stmt = sqlite3_mprintf("SELECT md5 FROM metadata WHERE phash='%llu' AND modtime=%llu", jHash, buf->mtime); + result = csync_statedb_query(ctx, stmt); + sqlite3_free(stmt); + if (result == NULL) { + return NULL; + } + + if (result->count == 1) { + /* phash, pathlen, path, inode, uid, gid, mode, modtime */ + ret = c_strdup( result->vector[0] ); + } + + c_strlist_destroy(result); + + return ret; +} + /* query the statedb, caller must free the memory */ c_strlist_t *csync_statedb_query(CSYNC *ctx, const char *statement) { int err = SQLITE_OK; diff --git a/src/csync_statedb.h b/src/csync_statedb.h index 1ec6fe28e5..1ca303e311 100644 --- a/src/csync_statedb.h +++ b/src/csync_statedb.h @@ -61,6 +61,7 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx, uint64_t phash); csync_file_stat_t *csync_statedb_get_stat_by_inode(CSYNC *ctx, uint64_t inode); +char *csync_statedb_get_uniqId( CSYNC *ctx, uint64_t jHash, csync_vio_file_stat_t *buf ); /** * @brief A generic statedb query. * diff --git a/src/csync_update.c b/src/csync_update.c index fdd7146fd6..14a0408251 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -103,10 +103,26 @@ static int _csync_detect_update(CSYNC *ctx, const char *file, */ if (csync_get_statedb_exists(ctx)) { tmp = csync_statedb_get_stat_by_hash(ctx, h); +#if 0 + /* this code could possibly replace the one in csync_vio.c stat and would be more efficient */ + if(tmp) { + if( ctx->current == LOCAL_REPLICA ) { + if(fs->mtime == tmp->modtime && fs->size == tmp->size) { + /* filesystem modtime is still the same as the db mtime + * thus the md5 sum is still valid. */ + fs->md5 = c_strdup( tmp->md5 ); + } + } + } +#endif if (tmp && tmp->phash == h) { /* we have an update! */ CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "time compare: %lu <-> %lu", fs->mtime, tmp->modtime); + if( !fs->md5) { + st->instruction = CSYNC_INSTRUCTION_EVAL; + goto out; + } if( !c_streq(fs->md5, tmp->md5 )) { // if (!fs->mtime > tmp->modtime) { st->instruction = CSYNC_INSTRUCTION_EVAL; @@ -144,7 +160,9 @@ out: st->gid = fs->gid; st->nlink = fs->nlink; st->type = type; - st->md5 = c_strdup(fs->md5); + st->md5 = NULL; + if( fs->md5 ) + st->md5 = c_strdup(fs->md5); st->phash = h; st->pathlen = len; diff --git a/src/csync_util.c b/src/csync_util.c index 0b68dbaaba..e38305b54a 100644 --- a/src/csync_util.c +++ b/src/csync_util.c @@ -118,6 +118,7 @@ static int _merge_file_trees_visitor(void *obj, void *data) { CSYNC *ctx = NULL; c_rbtree_t *tree = NULL; c_rbnode_t *node = NULL; + char *md5 = NULL; char errbuf[256] = {0}; char *uri = NULL; @@ -178,7 +179,9 @@ static int _merge_file_trees_visitor(void *obj, void *data) { goto out; } } + md5 = fs->md5; fs = c_rbtree_node_data(node); + fs->md5 = md5; switch (ctx->current) { case LOCAL_REPLICA: @@ -218,6 +221,8 @@ static int _merge_file_trees_visitor(void *obj, void *data) { /* update file stat */ fs->inode = vst->inode; fs->modtime = vst->mtime; + // if( vst->md5 ) + // fs->md5 = c_strdup(vst->md5); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "file: %s, instruction: UPDATED", uri); diff --git a/src/vio/csync_vio_local.c b/src/vio/csync_vio_local.c index d041cb1bfa..1b700e1864 100644 --- a/src/vio/csync_vio_local.c +++ b/src/vio/csync_vio_local.c @@ -389,7 +389,9 @@ int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->ctime = sb.st_ctime; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_CTIME; - buf->md5 = csync_file_md5( uri ); + /* buf->md5 = csync_file_md5( uri ); */ + /* md5 is queried one level higher because we do not have ctx here. */ + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; c_free_multibyte(wuri); From 0618eb956de03d894748af33364d2b34487e90ae Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:40:36 +0300 Subject: [PATCH 033/106] Merge conflicts solved. --- modules/csync_owncloud.c | 24 +++++++++++--------- src/csync_propagate.c | 48 ++++++++++++++++++++++++++++++++++++++-- src/csync_statedb.c | 6 +++-- 3 files changed, 63 insertions(+), 15 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 9aa66fbaf5..ed44af6ebe 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -597,7 +597,6 @@ static void results(void *userdata, if( md5sum ) { /* Skip the " around the string coming back from teh ne_propset_value call */ strncpy( newres->md5, md5sum+1, 32 ); - DEBUG_WEBDAV("OOOOOOOOOOOOOOOOOOOOO %s", newres->md5); } /* prepend the new resource to the result list */ @@ -712,7 +711,6 @@ static csync_vio_file_stat_t *resourceToFileStat( struct resource *res ) lfs->size = res->size; lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; lfs->md5 = c_strdup(res->md5); - DEBUG_WEBDAV("XXXXXXXXXXXXXXXXXXXXX MD5: %s", lfs->md5 ); lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; return lfs; } @@ -809,6 +807,7 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { * stat. If the cache matches, a http call is saved. */ if( _fs.name && strcmp( buf->name, _fs.name ) == 0 ) { + buf->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; @@ -820,10 +819,11 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->type = _fs.type; buf->mtime = _fs.mtime; buf->md5 = c_strdup( _fs.md5 ); - + DEBUG_WEBDAV("stat results from fs cache - md5: %s", _fs.md5); buf->size = _fs.size; buf->mode = _stat_perms( _fs.type ); } else if( _statCache.uri && c_streq( _statCache.uri, uri )) { + DEBUG_WEBDAV("stat results from stat cache"); DEBUG_WEBDAV("Found file stat info in statcache!"); buf->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; @@ -832,13 +832,14 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { // buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_PERMISSIONS; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; - buf->type = _fs.type; - buf->size = _fs.size; - buf->md5 = c_strdup( _fs.md5 ); + buf->type = _statCache.stat.type; + buf->size = _statCache.stat.size; + buf->md5 = c_strdup( _statCache.stat.md5 ); - // buf->mode = _stat_perms( _fs.type ); + // buf->mode = _stat_perms( _statCache.type ); } else { + DEBUG_WEBDAV("stat results fetched."); /* fetch data via a propfind call. */ fetchCtx = c_malloc( sizeof( struct listdir_context )); if( ! fetchCtx ) { @@ -906,16 +907,17 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->mtime = lfs->mtime; buf->size = lfs->size; buf->mode = _stat_perms( lfs->type ); - buf->md5 = c_strdup( lfs->md5 ); + buf->md5 = c_strdup( lfs->md5 ); + DEBUG_WEBDAV("XXXXXXXXXXXXXXX md5: %s", buf->md5 ); csync_vio_file_stat_destroy( lfs ); } free_fetchCtx( fetchCtx ); } } - DEBUG_WEBDAV("STAT result: %s, type=%d", buf->name ? buf->name:"NULL", - buf->type ); + DEBUG_WEBDAV("STAT result: %s, md5: %s", buf->name ? buf->name:"NULL", + buf->md5 ); return 0; } @@ -1553,7 +1555,7 @@ static csync_vio_file_stat_t *owncloud_readdir(csync_vio_method_handle_t *dhandl _fs.fields = lfs->fields; _fs.type = lfs->type; _fs.size = lfs->size; - _fs.md5 = lfs->md5; + _fs.md5 = c_strdup(lfs->md5); } /* DEBUG_WEBDAV("LFS fields: %s: %d", lfs->name, lfs->type ); */ diff --git a/src/csync_propagate.c b/src/csync_propagate.c index 09396cd1ed..c5e2320f4d 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -56,6 +56,34 @@ static bool _push_to_tmp_first(CSYNC *ctx) return false; } +static char*_get_md5( CSYNC *ctx, const char *uri ) { + char errbuf[256] = {0}; + csync_vio_file_stat_t *tstat = NULL; + char *md5 = NULL; + + tstat = csync_vio_file_stat_new(); + if (tstat == NULL) { + strerror_r(errno, errbuf, sizeof(errbuf)); + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, + "file: %s, command: stat, error: %s", + uri, + errbuf); + } + if ( tstat && csync_vio_stat(ctx, uri, tstat) < 0) { + strerror_r(errno, errbuf, sizeof(errbuf)); + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, + "file: %s, command: stat(for md5), error: %s", + uri, + errbuf); + } else { + md5 = c_strdup(tstat->md5); + } + SAFE_FREE(tstat); + + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Final MD5 for %s: %s", uri, md5 ? md5 : ""); + return md5; +} + static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { enum csync_replica_e srep = -1; enum csync_replica_e drep = -1; @@ -332,12 +360,18 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { rc = 1; goto out; } - +#if 0 if( st->md5 ) { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "UUUU MD5 sum: %s", st->md5); } else { + if( tstat->md5 ) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Target MD5 sum is %s", tstat->md5 ); + st->md5 = c_strdup(tstat->md5 ); + } else { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "MD5 sum is empty"); + } } +#endif } if (_push_to_tmp_first(ctx)) { @@ -392,6 +426,11 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { ctx->replica = drep; csync_vio_utimes(ctx, duri, times); + /* do a stat on the target again to get a valid md5 */ + // if( ! st->md5 ) { + st->md5 = _get_md5( ctx, turi ); + // } + /* set instruction for the statedb merger */ st->instruction = CSYNC_INSTRUCTION_UPDATED; @@ -781,6 +820,9 @@ static int _csync_new_dir(CSYNC *ctx, csync_file_stat_t *st) { csync_vio_utimes(ctx, uri, times); + // if( ! st->md5 ) + st->md5 = _get_md5(ctx, uri); + /* set instruction for the statedb merger */ st->instruction = CSYNC_INSTRUCTION_UPDATED; @@ -857,7 +899,9 @@ static int _csync_sync_dir(CSYNC *ctx, csync_file_stat_t *st) { times[0].tv_usec = times[1].tv_usec = 0; csync_vio_utimes(ctx, uri, times); - + // if( ! st->md5 ) { + st->md5 = _get_md5(ctx, uri); + // } /* set instruction for the statedb merger */ st->instruction = CSYNC_INSTRUCTION_UPDATED; diff --git a/src/csync_statedb.c b/src/csync_statedb.c index 47b6d10b35..056c93c34d 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -424,7 +424,8 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx, uint64_t phash) { st->gid = atoi(result->vector[5]); st->mode = atoi(result->vector[6]); st->modtime = strtoul(result->vector[7], NULL, 10); - st->md5 = c_strdup( result->vector[8] ); + if( result->vector[8]) + st->md5 = c_strdup( result->vector[8] ); c_strlist_destroy(result); return st; @@ -469,7 +470,8 @@ csync_file_stat_t *csync_statedb_get_stat_by_inode(CSYNC *ctx, uint64_t inode) { st->gid = atoi(result->vector[5]); st->mode = atoi(result->vector[6]); st->modtime = strtoul(result->vector[7], NULL, 10); - st->md5 = c_strdup(result->vector[8]); + if( result->vector[8] ) + st->md5 = c_strdup(result->vector[8]); c_strlist_destroy(result); From ae1b8a5682697db6228af9b900aeeacd3993f450 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 14 Aug 2012 16:31:52 +0300 Subject: [PATCH 034/106] Query new id for local repository because of utimes changes. --- src/csync_propagate.c | 64 ++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/src/csync_propagate.c b/src/csync_propagate.c index c5e2320f4d..a717027789 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -61,27 +61,28 @@ static char*_get_md5( CSYNC *ctx, const char *uri ) { csync_vio_file_stat_t *tstat = NULL; char *md5 = NULL; - tstat = csync_vio_file_stat_new(); - if (tstat == NULL) { - strerror_r(errno, errbuf, sizeof(errbuf)); - CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, - "file: %s, command: stat, error: %s", - uri, - errbuf); + if( ctx->current == LOCAL_REPLICA ) { + tstat = csync_vio_file_stat_new(); + if (tstat == NULL) { + strerror_r(errno, errbuf, sizeof(errbuf)); + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, + "file: %s, command: stat, error: %s", + uri, + errbuf); + } + if ( tstat && csync_vio_stat(ctx, uri, tstat) < 0) { + strerror_r(errno, errbuf, sizeof(errbuf)); + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, + "file: %s, command: stat(for md5), error: %s", + uri, + errbuf); + } else { + md5 = c_strdup(tstat->md5); + } + SAFE_FREE(tstat); } - if ( tstat && csync_vio_stat(ctx, uri, tstat) < 0) { - strerror_r(errno, errbuf, sizeof(errbuf)); - CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, - "file: %s, command: stat(for md5), error: %s", - uri, - errbuf); - } else { - md5 = c_strdup(tstat->md5); - } - SAFE_FREE(tstat); - - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Final MD5 for %s: %s", uri, md5 ? md5 : ""); - return md5; + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "MD5 for %s: %s", uri, md5 ? md5 : ""); + return md5; } static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { @@ -360,7 +361,7 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { rc = 1; goto out; } -#if 0 + if( st->md5 ) { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "UUUU MD5 sum: %s", st->md5); } else { @@ -371,7 +372,6 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "MD5 sum is empty"); } } -#endif } if (_push_to_tmp_first(ctx)) { @@ -426,10 +426,16 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { ctx->replica = drep; csync_vio_utimes(ctx, duri, times); + + /* For remote repos, after the utimes call, the ID has changed again */ /* do a stat on the target again to get a valid md5 */ - // if( ! st->md5 ) { - st->md5 = _get_md5( ctx, turi ); - // } + char *tmd5 = _get_md5(ctx, duri); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "FINAL MD5: %s", tmd5 ? tmd5 : ""); + + if(tmd5) { + SAFE_FREE(st->md5); + st->md5 = tmd5; + } /* set instruction for the statedb merger */ st->instruction = CSYNC_INSTRUCTION_UPDATED; @@ -899,9 +905,11 @@ static int _csync_sync_dir(CSYNC *ctx, csync_file_stat_t *st) { times[0].tv_usec = times[1].tv_usec = 0; csync_vio_utimes(ctx, uri, times); - // if( ! st->md5 ) { - st->md5 = _get_md5(ctx, uri); - // } + char *tmd5 = _get_md5(ctx, uri); + if(tmd5) { + SAFE_FREE(st->md5); + st->md5 = tmd5; + } /* set instruction for the statedb merger */ st->instruction = CSYNC_INSTRUCTION_UPDATED; From f2d603108aa321b38e7bc27e7aa1206bedab3e3c Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 14 Aug 2012 16:32:23 +0300 Subject: [PATCH 035/106] more logging, ids added. --- src/csync_update.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/csync_update.c b/src/csync_update.c index 14a0408251..517cfc0fd3 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -117,8 +117,8 @@ static int _csync_detect_update(CSYNC *ctx, const char *file, #endif if (tmp && tmp->phash == h) { /* we have an update! */ - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "time compare: %lu <-> %lu", - fs->mtime, tmp->modtime); + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "time compare: %lu <-> %lu, md5: %s <-> %s", + fs->mtime, tmp->modtime, fs->md5, tmp->md5); if( !fs->md5) { st->instruction = CSYNC_INSTRUCTION_EVAL; goto out; From c2e2f8de001b95c75ebac75c431f6f56dbf560e4 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Wed, 15 Aug 2012 12:46:36 +0300 Subject: [PATCH 036/106] more md5 calculations --- src/csync_propagate.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/csync_propagate.c b/src/csync_propagate.c index a717027789..6295ab8777 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -94,6 +94,7 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { char *duri = NULL; char *turi = NULL; char *tdir = NULL; + char *tmd5 = NULL; csync_vio_handle_t *sfp = NULL; csync_vio_handle_t *dfp = NULL; @@ -429,7 +430,7 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { /* For remote repos, after the utimes call, the ID has changed again */ /* do a stat on the target again to get a valid md5 */ - char *tmd5 = _get_md5(ctx, duri); + tmd5 = _get_md5(ctx, duri); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "FINAL MD5: %s", tmd5 ? tmd5 : ""); if(tmd5) { @@ -756,6 +757,7 @@ static int _csync_new_dir(CSYNC *ctx, csync_file_stat_t *st) { enum csync_replica_e replica_bak; char errbuf[256] = {0}; char *uri = NULL; + char *tmd5 = NULL; struct timeval times[2]; int rc = -1; @@ -826,8 +828,11 @@ static int _csync_new_dir(CSYNC *ctx, csync_file_stat_t *st) { csync_vio_utimes(ctx, uri, times); - // if( ! st->md5 ) - st->md5 = _get_md5(ctx, uri); + tmd5 = _get_md5(ctx, uri); + if(tmd5) { + SAFE_FREE(st->md5); + st->md5 = tmd5; + } /* set instruction for the statedb merger */ st->instruction = CSYNC_INSTRUCTION_UPDATED; @@ -852,6 +857,7 @@ static int _csync_sync_dir(CSYNC *ctx, csync_file_stat_t *st) { enum csync_replica_e replica_bak; char errbuf[256] = {0}; char *uri = NULL; + char *tmd5 = NULL; struct timeval times[2]; int rc = -1; @@ -905,7 +911,7 @@ static int _csync_sync_dir(CSYNC *ctx, csync_file_stat_t *st) { times[0].tv_usec = times[1].tv_usec = 0; csync_vio_utimes(ctx, uri, times); - char *tmd5 = _get_md5(ctx, uri); + tmd5 = _get_md5(ctx, uri); if(tmd5) { SAFE_FREE(st->md5); st->md5 = tmd5; From d8967a2bd1381dce9a5f4aaa4d3a8cf0e8dd9202 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Wed, 15 Aug 2012 16:32:10 +0300 Subject: [PATCH 037/106] try to propagate EVAL status up by detecting changes in underlying directories. That does not work as the reconciler runs through the directoires in the wrong order, ie. the outermost first. --- src/csync_private.h | 2 ++ src/csync_reconcile.c | 3 +++ src/csync_update.c | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/src/csync_private.h b/src/csync_private.h index 2e1b3899cb..e01b43e78a 100644 --- a/src/csync_private.h +++ b/src/csync_private.h @@ -95,6 +95,7 @@ struct csync_s { c_rbtree_t *tree; c_list_t *list; enum csync_replica_e type; + unsigned long changes; } local; struct { @@ -102,6 +103,7 @@ struct csync_s { c_rbtree_t *tree; c_list_t *list; enum csync_replica_e type; + unsigned long changes; } remote; struct { diff --git a/src/csync_reconcile.c b/src/csync_reconcile.c index 7229198dc4..97a78cdaad 100644 --- a/src/csync_reconcile.c +++ b/src/csync_reconcile.c @@ -152,8 +152,11 @@ static int _csync_merge_algorithm_visitor(void *obj, void *data) { } else { /* file are equal */ + /* FIXME: Get the id from the server! */ cur->instruction = CSYNC_INSTRUCTION_NONE; other->instruction = CSYNC_INSTRUCTION_NONE; + + if( !cur->md5 ) cur->md5 = other->md5; } break; /* file on other replica has changed too */ diff --git a/src/csync_update.c b/src/csync_update.c index 517cfc0fd3..f984dc2c56 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -174,12 +174,18 @@ out: SAFE_FREE(st); return -1; } + if( st->instruction != CSYNC_INSTRUCTION_NONE ) { + ctx->local.changes++; + } break; case REMOTE_REPLCIA: if (c_rbtree_insert(ctx->remote.tree, (void *) st) < 0) { SAFE_FREE(st); return -1; } + if( st->instruction != CSYNC_INSTRUCTION_NONE ) { + ctx->remote.changes++; + } break; default: break; @@ -337,11 +343,43 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, } if (flag == CSYNC_FTW_FLAG_DIR && depth) { + long rcnt = ctx->remote.changes; + long lcnt = ctx->local.changes; + + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> before digging into filename (%s): local %u, remote: %u", + filename, ctx->local.changes , ctx->remote.changes ); + rc = csync_ftw(ctx, filename, fn, depth - 1); if (rc < 0) { csync_vio_closedir(ctx, dh); goto done; } + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> change count (%s): local %u - %u, remote: %u - %u", + filename, ctx->local.changes, lcnt, ctx->remote.changes, rcnt); + if( ctx->local.changes != lcnt ) { + csync_file_stat_t *myfs = NULL; + c_rbnode_t *mynode = NULL; + int len; + uint64_t h = 0; + + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> saw changes in subdir(%s), setting SYNC", + filename ); + /* the directory within this directory changed. Set this to sync. */ + + len = strlen(path); + h = c_jhash64((uint8_t *) path, len, 0); + mynode = c_rbtree_find(ctx->local.tree, &h); + + if( mynode ) { + myfs = c_rbtree_node_data( mynode ); + + if( myfs->instruction == CSYNC_INSTRUCTION_NONE ) { + myfs->instruction = CSYNC_INSTRUCTION_EVAL; + } else { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> instruction is not NONE, skip setting to SYNC"); + } + } + } } SAFE_FREE(filename); csync_vio_file_stat_destroy(dirent); From 3fb3f784460a1e0791dce987b9a0db89f3123d00 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:42:23 +0300 Subject: [PATCH 038/106] Add a visible log entry at program start, easier to read log output. --- src/csync_lock.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/csync_lock.c b/src/csync_lock.c index cec397c01a..ef58c8fe15 100644 --- a/src/csync_lock.c +++ b/src/csync_lock.c @@ -63,6 +63,7 @@ static int _csync_lock_create(const char *lockfile) { goto out; } + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Create temporary lock file: %s", ctmpfile); if ((fd = mkstemp(ctmpfile)) < 0) { strerror_r(errno, errbuf, sizeof(errbuf)); From 20f4ee16cc9a1048a52c7f81be0d005455043649 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:42:33 +0300 Subject: [PATCH 039/106] removed unneeded initialisations. --- src/vio/csync_vio.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/vio/csync_vio.c b/src/vio/csync_vio.c index 37578486bb..6bdb7a6374 100644 --- a/src/vio/csync_vio.c +++ b/src/vio/csync_vio.c @@ -214,6 +214,11 @@ int csync_vio_init(CSYNC *ctx, const char *module, const char *args) { return -1; } + if (! VIO_METHOD_HAS_FUNC(m, get_file_id)) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_WARN, "module %s has no get_file_id fn", module); + } + + ctx->module.method = m; return 0; @@ -529,11 +534,16 @@ int csync_vio_rmdir(CSYNC *ctx, const char *uri) { return rc; } +const char *csync_vio_file_id(CSYNC *ctx, const char *path) +{ + const char *re; + /* We always use the remote method here. */ + re = ctx->module.method->get_file_id(path); + return re; +} + int csync_vio_stat(CSYNC *ctx, const char *uri, csync_vio_file_stat_t *buf) { int rc = -1; - int len = 0; - uint64_t h = 0; - char *file = 0; switch(ctx->replica) { case REMOTE_REPLCIA: From ede710843b887b7aa125c5513964380a740e2125 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:44:38 +0300 Subject: [PATCH 040/106] Added csync_vio_file_id function and removed unused previous code. --- src/vio/csync_vio.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vio/csync_vio.h b/src/vio/csync_vio.h index 9db6a1ca1d..715ed626e1 100644 --- a/src/vio/csync_vio.h +++ b/src/vio/csync_vio.h @@ -48,6 +48,7 @@ int csync_vio_mkdir(CSYNC *ctx, const char *uri, mode_t mode); int csync_vio_mkdirs(CSYNC *ctx, const char *uri, mode_t mode); int csync_vio_rmdir(CSYNC *ctx, const char *uri); +const char *csync_vio_file_id(CSYNC *ctx, const char *path); int csync_vio_stat(CSYNC *ctx, const char *uri, csync_vio_file_stat_t *buf); int csync_vio_rename(CSYNC *ctx, const char *olduri, const char *newuri); int csync_vio_unlink(CSYNC *ctx, const char *uri); From 9bd9949d68fa5f3e1f2af55ddac2eff6d6340194 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:43:21 +0300 Subject: [PATCH 041/106] Fixed merge conflict, only one md5 needed. --- src/csync_private.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/csync_private.h b/src/csync_private.h index e01b43e78a..7f55b2213c 100644 --- a/src/csync_private.h +++ b/src/csync_private.h @@ -94,16 +94,16 @@ struct csync_s { char *uri; c_rbtree_t *tree; c_list_t *list; + c_list_t *id_list; enum csync_replica_e type; - unsigned long changes; } local; struct { char *uri; c_rbtree_t *tree; c_list_t *list; + c_list_t *id_list; enum csync_replica_e type; - unsigned long changes; } remote; struct { @@ -137,7 +137,7 @@ struct csync_s { /* error code of the last operation */ enum csync_error_codes_e error_code; - + int status; }; @@ -161,6 +161,7 @@ struct csync_file_stat_s { mode_t mode; /* u32 */ int nlink; /* u32 */ int type; /* u32 */ + char *destpath; /* for renames */ char *md5; enum csync_instructions_e instruction; /* u32 */ From 62b49e8bcc87093f045637d4d34251f020955396 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:46:07 +0300 Subject: [PATCH 042/106] Query ids from database for local files, remove bogus code. --- src/csync_update.c | 45 +++++++-------------------------------------- 1 file changed, 7 insertions(+), 38 deletions(-) diff --git a/src/csync_update.c b/src/csync_update.c index f984dc2c56..ca3a3eac08 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -174,18 +174,12 @@ out: SAFE_FREE(st); return -1; } - if( st->instruction != CSYNC_INSTRUCTION_NONE ) { - ctx->local.changes++; - } break; case REMOTE_REPLCIA: if (c_rbtree_insert(ctx->remote.tree, (void *) st) < 0) { SAFE_FREE(st); return -1; } - if( st->instruction != CSYNC_INSTRUCTION_NONE ) { - ctx->remote.changes++; - } break; default: break; @@ -331,6 +325,13 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, flag = CSYNC_FTW_FLAG_NSTAT; } + if( ctx->current == LOCAL_REPLICA ) { + int len = strlen( path ); + uint64_t h = c_jhash64((uint8_t *) path, len, 0); + fs->md5 = csync_statedb_get_uniqId( ctx, h, fs ); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Uniq ID read from Database: %s -> %s", path, fs->md5); + } + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "walk: %s", filename); /* Call walker function for each file */ @@ -343,43 +344,11 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, } if (flag == CSYNC_FTW_FLAG_DIR && depth) { - long rcnt = ctx->remote.changes; - long lcnt = ctx->local.changes; - - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> before digging into filename (%s): local %u, remote: %u", - filename, ctx->local.changes , ctx->remote.changes ); - rc = csync_ftw(ctx, filename, fn, depth - 1); if (rc < 0) { csync_vio_closedir(ctx, dh); goto done; } - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> change count (%s): local %u - %u, remote: %u - %u", - filename, ctx->local.changes, lcnt, ctx->remote.changes, rcnt); - if( ctx->local.changes != lcnt ) { - csync_file_stat_t *myfs = NULL; - c_rbnode_t *mynode = NULL; - int len; - uint64_t h = 0; - - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> saw changes in subdir(%s), setting SYNC", - filename ); - /* the directory within this directory changed. Set this to sync. */ - - len = strlen(path); - h = c_jhash64((uint8_t *) path, len, 0); - mynode = c_rbtree_find(ctx->local.tree, &h); - - if( mynode ) { - myfs = c_rbtree_node_data( mynode ); - - if( myfs->instruction == CSYNC_INSTRUCTION_NONE ) { - myfs->instruction = CSYNC_INSTRUCTION_EVAL; - } else { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "OOOO> instruction is not NONE, skip setting to SYNC"); - } - } - } } SAFE_FREE(filename); csync_vio_file_stat_destroy(dirent); From e3638ced2c5d84522a0c1313a64027363a920f5f Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:46:50 +0300 Subject: [PATCH 043/106] Add csync_get_file_id function for modules. --- src/vio/csync_vio_method.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vio/csync_vio_method.h b/src/vio/csync_vio_method.h index 814504f98d..ba1d5d84f0 100644 --- a/src/vio/csync_vio_method.h +++ b/src/vio/csync_vio_method.h @@ -52,7 +52,7 @@ typedef csync_vio_method_t *(*csync_vio_method_init_fn)(const char *method_name, typedef void (*csync_vio_method_finish_fn)(csync_vio_method_t *method); typedef csync_vio_capabilities_t *(*csync_method_get_capabilities_fn)(void); - +typedef const char* (*csync_method_get_file_id_fn)(const char* path); typedef csync_vio_method_handle_t *(*csync_method_open_fn)(const char *durl, int flags, mode_t mode); typedef csync_vio_method_handle_t *(*csync_method_creat_fn)(const char *durl, mode_t mode); typedef int (*csync_method_close_fn)(csync_vio_method_handle_t *fhandle); @@ -79,6 +79,7 @@ typedef int (*csync_method_utimes_fn)(const char *uri, const struct timeval time struct csync_vio_method_s { size_t method_table_size; /* Used for versioning */ csync_method_get_capabilities_fn get_capabilities; + csync_method_get_file_id_fn get_file_id; csync_method_open_fn open; csync_method_creat_fn creat; csync_method_close_fn close; From 1c6da9c0bb0c8512ecaa213de462e54fd2ee9e84 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:48:15 +0300 Subject: [PATCH 044/106] Update the md5 sum of files in merge. --- src/csync_util.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/csync_util.c b/src/csync_util.c index e38305b54a..4f3af2a024 100644 --- a/src/csync_util.c +++ b/src/csync_util.c @@ -113,12 +113,12 @@ void csync_memstat_check(void) { static int _merge_file_trees_visitor(void *obj, void *data) { csync_file_stat_t *fs = NULL; + csync_file_stat_t *tfs = NULL; csync_vio_file_stat_t *vst = NULL; CSYNC *ctx = NULL; c_rbtree_t *tree = NULL; c_rbnode_t *node = NULL; - char *md5 = NULL; char errbuf[256] = {0}; char *uri = NULL; @@ -179,9 +179,7 @@ static int _merge_file_trees_visitor(void *obj, void *data) { goto out; } } - md5 = fs->md5; fs = c_rbtree_node_data(node); - fs->md5 = md5; switch (ctx->current) { case LOCAL_REPLICA: @@ -221,10 +219,20 @@ static int _merge_file_trees_visitor(void *obj, void *data) { /* update file stat */ fs->inode = vst->inode; fs->modtime = vst->mtime; - // if( vst->md5 ) - // fs->md5 = c_strdup(vst->md5); - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "file: %s, instruction: UPDATED", uri); + /* update with the id from the remote repo */ + node = c_rbtree_find(ctx->remote.tree, &fs->phash); + if (node == NULL) { + rc = -1; + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Unable to find node"); + goto out; + } + + tfs = c_rbtree_node_data(node); + fs->md5 = c_strdup( tfs->md5 ); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "PRE UPDATED %s: %s <-> %s", uri, fs->md5, tfs->md5); + + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "file: %s, instruction: UPDATED (%s)", uri, fs->md5); fs->instruction = CSYNC_INSTRUCTION_NONE; From f4c9ced446bb4ac4f6618986f2bb3e8e47280915 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:48:56 +0300 Subject: [PATCH 045/106] Handle ID change propagation to the top directory. --- src/csync_propagate.c | 198 +++++++++++++++++++++++++++++++++++------- 1 file changed, 168 insertions(+), 30 deletions(-) diff --git a/src/csync_propagate.c b/src/csync_propagate.c index 6295ab8777..45586c047c 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -28,10 +28,12 @@ #include #include #include +#include #include "csync_private.h" #include "csync_propagate.h" #include "vio/csync_vio.h" +#include "c_jhash.h" #define CSYNC_LOG_CATEGORY_NAME "csync.propagator" #include "csync_log.h" @@ -46,6 +48,27 @@ static int _csync_cleanup_cmp(const void *a, const void *b) { return strcmp(st_a->path, st_b->path); } +static void _store_id_update(CSYNC *ctx, csync_file_stat_t *st) { + c_list_t *list = NULL; + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "SYNCED remember dir: %s", st->path); + + switch (ctx->current) { + case LOCAL_REPLICA: + list = c_list_prepend(ctx->local.id_list, (void*)st); + if( list != NULL ) { + ctx->local.id_list = list; + } + break; + case REMOTE_REPLCIA: + list = c_list_prepend(ctx->remote.id_list, (void*)st); + if(list != NULL ) { + ctx->remote.id_list = list; + } + break; + + } +} + static bool _push_to_tmp_first(CSYNC *ctx) { if( ctx->current == REMOTE_REPLCIA ) return true; /* Always push to tmp for destination local file system */ @@ -56,32 +79,19 @@ static bool _push_to_tmp_first(CSYNC *ctx) return false; } -static char*_get_md5( CSYNC *ctx, const char *uri ) { - char errbuf[256] = {0}; - csync_vio_file_stat_t *tstat = NULL; - char *md5 = NULL; +static const char*_get_md5( CSYNC *ctx, const char *path ) { + const char *md5 = NULL; + char *buf = NULL; - if( ctx->current == LOCAL_REPLICA ) { - tstat = csync_vio_file_stat_new(); - if (tstat == NULL) { - strerror_r(errno, errbuf, sizeof(errbuf)); - CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, - "file: %s, command: stat, error: %s", - uri, - errbuf); - } - if ( tstat && csync_vio_stat(ctx, uri, tstat) < 0) { - strerror_r(errno, errbuf, sizeof(errbuf)); - CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, - "file: %s, command: stat(for md5), error: %s", - uri, - errbuf); - } else { - md5 = c_strdup(tstat->md5); - } - SAFE_FREE(tstat); + /* Always use the remote uri path, local does not have Ids. */ + if (asprintf(&buf, "%s/%s", ctx->remote.uri, path) < 0) { + return 0; } - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "MD5 for %s: %s", uri, md5 ? md5 : ""); + + md5 = csync_vio_file_id(ctx, buf); + + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "MD5 for %s: %s", buf, md5 ? md5 : ""); + SAFE_FREE(buf); return md5; } @@ -94,7 +104,7 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { char *duri = NULL; char *turi = NULL; char *tdir = NULL; - char *tmd5 = NULL; + const char *tmd5 = NULL; csync_vio_handle_t *sfp = NULL; csync_vio_handle_t *dfp = NULL; @@ -430,7 +440,7 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { /* For remote repos, after the utimes call, the ID has changed again */ /* do a stat on the target again to get a valid md5 */ - tmd5 = _get_md5(ctx, duri); + tmd5 = _get_md5(ctx, st->path); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "FINAL MD5: %s", tmd5 ? tmd5 : ""); if(tmd5) { @@ -757,7 +767,7 @@ static int _csync_new_dir(CSYNC *ctx, csync_file_stat_t *st) { enum csync_replica_e replica_bak; char errbuf[256] = {0}; char *uri = NULL; - char *tmd5 = NULL; + const char *tmd5 = NULL; struct timeval times[2]; int rc = -1; @@ -828,7 +838,7 @@ static int _csync_new_dir(CSYNC *ctx, csync_file_stat_t *st) { csync_vio_utimes(ctx, uri, times); - tmd5 = _get_md5(ctx, uri); + tmd5 = _get_md5(ctx, st->path); if(tmd5) { SAFE_FREE(st->md5); st->md5 = tmd5; @@ -857,7 +867,7 @@ static int _csync_sync_dir(CSYNC *ctx, csync_file_stat_t *st) { enum csync_replica_e replica_bak; char errbuf[256] = {0}; char *uri = NULL; - char *tmd5 = NULL; + const char *tmd5 = NULL; struct timeval times[2]; int rc = -1; @@ -911,7 +921,7 @@ static int _csync_sync_dir(CSYNC *ctx, csync_file_stat_t *st) { times[0].tv_usec = times[1].tv_usec = 0; csync_vio_utimes(ctx, uri, times); - tmd5 = _get_md5(ctx, uri); + tmd5 = _get_md5(ctx, st->path); if(tmd5) { SAFE_FREE(st->md5); st->md5 = tmd5; @@ -920,6 +930,7 @@ static int _csync_sync_dir(CSYNC *ctx, csync_file_stat_t *st) { st->instruction = CSYNC_INSTRUCTION_UPDATED; CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "SYNCED dir: %s", uri); + ctx->replica = replica_bak; rc = 0; @@ -1015,6 +1026,120 @@ out: return rc; } +static int _cmp_char( const void *d1, const void *d2 ) +{ + const char *c1 = (const char*) d1; + const char *c2 = (const char*) d2; + // CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "COMPARE: %s <-> %s", c1, c2); + if( c_streq(c1, c2) ) return 0; + return 1; +} + +/* + * This function corrects the unique IDs of parent directories of changed + * files. Other than in the file system, the change of a unique Id propagates + * up to the top dir. To save the correct IDs, in all propagations, pathes + * are recorded in the local and remotes id_list lists. + * In this function, the unique ID is queried for each directory once and + * stored into the according entry. + */ +static int _csync_correct_id(CSYNC *ctx) { + c_list_t *walk = NULL; + c_list_t *seen_dirs = NULL; + c_list_t *list = NULL; + c_rbtree_t *tree = NULL; + const char *replica = NULL; + char *path = NULL; + + switch (ctx->current) { + case LOCAL_REPLICA: + list = ctx->local.id_list; + tree = ctx->local.tree; + replica = "LOCAL_REPLICA"; + break; + case REMOTE_REPLCIA: + list = ctx->remote.id_list; + tree = ctx->remote.tree; + replica = "REMOTE_REPLICA"; + break; + default: + break; + } + + if (list == NULL) { + return 0; + } + + list = c_list_sort(list, _csync_cleanup_cmp); + if (list == NULL) { + return -1; + } + + for (walk = c_list_last(list); walk != NULL; walk = c_list_prev(walk)) { + csync_file_stat_t *st = NULL; + + st = (csync_file_stat_t *) walk->data; + if( st->type == CSYNC_FTW_TYPE_FILE ) { + path = c_dirname( st->path ); + } else if( st->type == CSYNC_FTW_TYPE_DIR ) { + path = c_strdup(st->path); /* Allocate mem for this not to disappoint FREE */ + } else { + /* unhandled path */ + } + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "correct ID on dir: %s", path); + + /* handle the . path */ + if( path && path[0] == '.' ) path = NULL; + + while( path ) { + uint64_t h; + int len; + c_rbnode_t *node = NULL; + + char pathbuf[PATH_MAX] = {'\0' }; + char *old_path = path; + csync_file_stat_t *tfs = NULL; + + /* do stuff with the dir here */ + + if( seen_dirs && c_list_find_custom( seen_dirs, path, _cmp_char)) { + // CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "saw this dir already: %s", path); + } else { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "climb on dir: %s (%s)", path, replica); + seen_dirs = c_list_prepend( seen_dirs, c_strdup(path)); + + /* Find the correct target entry. */ + len = strlen(path); + h = c_jhash64((uint8_t *) path, len, 0); + + node = c_rbtree_find(tree, &h); + if (node == NULL) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Unable to find node"); + } else { + tfs = c_rbtree_node_data(node); + tfs->md5 = _get_md5(ctx, path); + + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "MD5 for dir: %s %s", tfs->path, tfs->md5); + } + } + /* get the parent dir */ + /* copy one byte less, omit the trailing slash */ + strncpy( pathbuf, path, strlen(path)-1 ); + /* and get the path name */ + path = c_dirname( pathbuf ); + /* free the old path memory */ + SAFE_FREE(old_path ); + + /* exit on top directory */ + if( c_streq(path, ".")) { + SAFE_FREE(path); + path = NULL; + } + } + } + return 0; +} + static int _csync_propagation_cleanup(CSYNC *ctx) { c_list_t *list = NULL; c_list_t *walk = NULL; @@ -1084,30 +1209,35 @@ static int _csync_propagation_file_visitor(void *obj, void *data) { CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"FAIL NEW: %s",st->path); goto err; } + _store_id_update(ctx, st); break; case CSYNC_INSTRUCTION_RENAME: if (_csync_rename_file(ctx, st) < 0) { CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"FAIL RENAME: %s",st->path); goto err; } + _store_id_update(ctx, st); break; case CSYNC_INSTRUCTION_SYNC: if (_csync_sync_file(ctx, st) < 0) { CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"FAIL SYNC: %s",st->path); goto err; } + _store_id_update(ctx, st); break; case CSYNC_INSTRUCTION_REMOVE: if (_csync_remove_file(ctx, st) < 0) { CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"FAIL REMOVE: %s",st->path); goto err; } + _store_id_update(ctx, st); break; case CSYNC_INSTRUCTION_CONFLICT: CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"case CSYNC_INSTRUCTION_CONFLICT: %s",st->path); if (_csync_conflict_file(ctx, st) < 0) { goto err; } + _store_id_update(ctx, st); break; default: break; @@ -1148,22 +1278,27 @@ static int _csync_propagation_dir_visitor(void *obj, void *data) { if (_csync_new_dir(ctx, st) < 0) { goto err; } + _store_id_update(ctx, st); break; case CSYNC_INSTRUCTION_SYNC: if (_csync_sync_dir(ctx, st) < 0) { goto err; } + _store_id_update(ctx, st); break; case CSYNC_INSTRUCTION_CONFLICT: CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE,"directory attributes different"); if (_csync_sync_dir(ctx, st) < 0) { goto err; } + _store_id_update(ctx, st); break; case CSYNC_INSTRUCTION_REMOVE: if (_csync_remove_dir(ctx, st) < 0) { goto err; } + _store_id_update(ctx, st); + break; case CSYNC_INSTRUCTION_RENAME: /* there can't be a rename for dirs. See updater. */ break; @@ -1206,6 +1341,9 @@ int csync_propagate_files(CSYNC *ctx) { return -1; } + if( _csync_correct_id(ctx) < 0) { + return -1; + } return 0; } From dba2c1d105835f90a8ef3d9e84c974924ea3ac6c Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 17 Aug 2012 16:50:31 +0300 Subject: [PATCH 046/106] Added get_file_id function. --- modules/csync_owncloud.c | 51 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index ed44af6ebe..e35f728485 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -82,6 +82,7 @@ typedef unsigned long dav_size_t; /* Struct to store data for each resource found during an opendir operation. * It represents a single file entry. */ + typedef struct resource { char *uri; /* The complete uri */ char *name; /* The filename only */ @@ -89,7 +90,7 @@ typedef struct resource { enum resource_type type; dav_size_t size; time_t modtime; - char md5[33]; + char* md5; struct resource *next; } resource; @@ -595,8 +596,13 @@ static void results(void *userdata, } if( md5sum ) { - /* Skip the " around the string coming back from teh ne_propset_value call */ - strncpy( newres->md5, md5sum+1, 32 ); + int len = strlen(md5sum)-2; + if( len > 0 ) { + /* Skip the " around the string coming back from the ne_propset_value call */ + newres->md5 = c_malloc(len+1); + strncpy( newres->md5, md5sum+1, len ); + newres->md5[len] = '\0'; + } } /* prepend the new resource to the result list */ @@ -766,6 +772,7 @@ static void free_fetchCtx( struct listdir_context *ctx ) while( res ) { SAFE_FREE(res->uri); SAFE_FREE(res->name); + SAFE_FREE(res->md5); newres = res->next; SAFE_FREE(res); @@ -1058,6 +1065,43 @@ static csync_vio_capabilities_t *owncloud_capabilities(void) return &_owncloud_capabilities; } +static const char* owncloud_file_id( const char *path ) +{ + ne_request *req = NULL; + const char *header = NULL; + char *uri = _cleanPath(path); + char *buf = NULL; + + req = ne_request_create(dav_session.ctx, "HEAD", uri); + ne_request_dispatch(req); + + header = ne_get_response_header(req, "etag"); + + if( ! header ) { + csync_vio_file_stat_t statBuf; + if( owncloud_stat( uri, &statBuf ) == 0 ) { + header = statBuf.md5; + SAFE_FREE(statBuf.name); + } + } + + if( header ) { + if( header [0] == '"' && header[ strlen(header)-1] == '"') { + int len = strlen( header )-2; + buf = c_malloc( len ); + strncpy( buf, header+1, len ); + buf[len] = '\0'; + } else { + buf = c_strdup(header); + } + } + DEBUG_WEBDAV("GET FILE ID FOR %s: %s", path, buf); + ne_request_destroy(req); + SAFE_FREE(uri); + + return buf; +} + static csync_vio_method_handle_t *owncloud_open(const char *durl, int flags, mode_t mode) { @@ -1749,6 +1793,7 @@ static int owncloud_utimes(const char *uri, const struct timeval *times) { csync_vio_method_t _method = { .method_table_size = sizeof(csync_vio_method_t), .get_capabilities = owncloud_capabilities, + .get_file_id = owncloud_file_id, .open = owncloud_open, .creat = owncloud_creat, .close = owncloud_close, From 868a07c322e2dff5eb99f2635c97271990be5ddb Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 20 Aug 2012 19:10:03 +0300 Subject: [PATCH 047/106] Update the md5 also if the instruction is not UPDATE. --- src/csync_propagate.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/csync_propagate.c b/src/csync_propagate.c index 45586c047c..32a8807b64 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -1118,6 +1118,10 @@ static int _csync_correct_id(CSYNC *ctx) { } else { tfs = c_rbtree_node_data(node); tfs->md5 = _get_md5(ctx, path); + if( tfs->instruction != CSYNC_INSTRUCTION_UPDATED ) { + /* set instruction for the statedb merger */ + tfs->instruction = CSYNC_INSTRUCTION_UPDATED; + } CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "MD5 for dir: %s %s", tfs->path, tfs->md5); } From a0353249f10103da93a3038f3d835b5526aaed51 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 20 Aug 2012 19:10:29 +0300 Subject: [PATCH 048/106] Remove a database column comment that just blows the log file. --- src/csync_statedb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/csync_statedb.c b/src/csync_statedb.c index 056c93c34d..2c6dad3aa0 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -570,7 +570,7 @@ c_strlist_t *csync_statedb_query(CSYNC *ctx, const char *statement) { /* iterate over columns */ for (i = 0; i < column_count; i++) { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "sqlite3_column_text: %s", (char *) sqlite3_column_text(stmt, i)); + // CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "sqlite3_column_text: %s", (char *) sqlite3_column_text(stmt, i)); if (c_strlist_add(result, (char *) sqlite3_column_text(stmt, i)) < 0) { c_strlist_destroy(result); return NULL; From 337c56da66e37d5b33d4b753e5c94487ebeef91b Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 20 Aug 2012 19:11:18 +0300 Subject: [PATCH 049/106] Fix: If no database entry exists, the status is set to NEW. --- src/csync_update.c | 65 +++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/src/csync_update.c b/src/csync_update.c index ca3a3eac08..84023a039e 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -115,39 +115,44 @@ static int _csync_detect_update(CSYNC *ctx, const char *file, } } #endif - if (tmp && tmp->phash == h) { - /* we have an update! */ - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "time compare: %lu <-> %lu, md5: %s <-> %s", - fs->mtime, tmp->modtime, fs->md5, tmp->md5); - if( !fs->md5) { - st->instruction = CSYNC_INSTRUCTION_EVAL; - goto out; - } - if( !c_streq(fs->md5, tmp->md5 )) { - // if (!fs->mtime > tmp->modtime) { - st->instruction = CSYNC_INSTRUCTION_EVAL; - goto out; - } - st->instruction = CSYNC_INSTRUCTION_NONE; - } else { - /* check if it's a file and has been renamed */ - if (type == CSYNC_FTW_TYPE_FILE && ctx->current == LOCAL_REPLICA) { - tmp = csync_statedb_get_stat_by_inode(ctx, fs->inode); - if (tmp && tmp->inode == fs->inode) { - /* inode found so the file has been renamed */ - st->instruction = CSYNC_INSTRUCTION_RENAME; - goto out; + if(tmp) { /* there is an entry in the database */ + if (tmp->phash == h) { + /* we have an update! */ + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "time compare: %lu <-> %lu, md5: %s <-> %s", + fs->mtime, tmp->modtime, fs->md5, tmp->md5); + if( !fs->md5) { + st->instruction = CSYNC_INSTRUCTION_EVAL; + goto out; + } + if( !c_streq(fs->md5, tmp->md5 )) { + // if (!fs->mtime > tmp->modtime) { + st->instruction = CSYNC_INSTRUCTION_EVAL; + goto out; + } + st->instruction = CSYNC_INSTRUCTION_NONE; } else { - /* file not found in statedb */ - st->instruction = CSYNC_INSTRUCTION_NEW; - goto out; + /* check if it's a file and has been renamed */ + if (type == CSYNC_FTW_TYPE_FILE && ctx->current == LOCAL_REPLICA) { + tmp = csync_statedb_get_stat_by_inode(ctx, fs->inode); + if (tmp && tmp->inode == fs->inode) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "inodes: %ld <-> %ld", tmp->inode, fs->inode); + /* inode found so the file has been renamed */ + st->instruction = CSYNC_INSTRUCTION_RENAME; + goto out; + } else { + /* file not found in statedb */ + st->instruction = CSYNC_INSTRUCTION_NEW; + goto out; + } + } + /* directory, remote and file not found in statedb */ + st->instruction = CSYNC_INSTRUCTION_NEW; } - } - /* directory, remote and file not found in statedb */ - st->instruction = CSYNC_INSTRUCTION_NEW; + } else { + st->instruction = CSYNC_INSTRUCTION_NEW; } } else { - st->instruction = CSYNC_INSTRUCTION_NEW; + st->instruction = CSYNC_INSTRUCTION_NEW; } out: @@ -329,7 +334,7 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, int len = strlen( path ); uint64_t h = c_jhash64((uint8_t *) path, len, 0); fs->md5 = csync_statedb_get_uniqId( ctx, h, fs ); - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Uniq ID read from Database: %s -> %s", path, fs->md5); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Uniq ID read from Database: %s -> %s", path, fs->md5 ? fs->md5 : "" ); } CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "walk: %s", filename); From 7f7c2b977c400b71b4dd3b59f16f902b276bffba Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 20 Aug 2012 19:11:46 +0300 Subject: [PATCH 050/106] Avoid a null pointer dereference. --- src/csync_util.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/csync_util.c b/src/csync_util.c index 4f3af2a024..f4064d16b9 100644 --- a/src/csync_util.c +++ b/src/csync_util.c @@ -229,9 +229,12 @@ static int _merge_file_trees_visitor(void *obj, void *data) { } tfs = c_rbtree_node_data(node); - fs->md5 = c_strdup( tfs->md5 ); - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "PRE UPDATED %s: %s <-> %s", uri, fs->md5, tfs->md5); - + if( tfs->md5 ) { + fs->md5 = c_strdup( tfs->md5 ); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "PRE UPDATED %s: %s <-> %s", uri, fs->md5, tfs->md5); + } else { + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "md5 is empty in merger!"); + } CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "file: %s, instruction: UPDATED (%s)", uri, fs->md5); fs->instruction = CSYNC_INSTRUCTION_NONE; From 97a7e46595a22ac94ea29dfb633e41ef55e19e95 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:18:35 +0300 Subject: [PATCH 051/106] Set to INSTRUCTION_UPDATED only for NONE instructions. --- src/csync_propagate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/csync_propagate.c b/src/csync_propagate.c index 32a8807b64..38c2c25b20 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -1118,7 +1118,7 @@ static int _csync_correct_id(CSYNC *ctx) { } else { tfs = c_rbtree_node_data(node); tfs->md5 = _get_md5(ctx, path); - if( tfs->instruction != CSYNC_INSTRUCTION_UPDATED ) { + if( tfs->instruction == CSYNC_INSTRUCTION_NONE ) { /* set instruction for the statedb merger */ tfs->instruction = CSYNC_INSTRUCTION_UPDATED; } From e9cf54681875d14d77be9416e7eab59fb3df2208 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:19:27 +0300 Subject: [PATCH 052/106] Free the memory for the MD5 string. --- src/vio/csync_vio_file_stat.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vio/csync_vio_file_stat.c b/src/vio/csync_vio_file_stat.c index be8d8f4afe..6ba0aa187b 100644 --- a/src/vio/csync_vio_file_stat.c +++ b/src/vio/csync_vio_file_stat.c @@ -46,7 +46,9 @@ void csync_vio_file_stat_destroy(csync_vio_file_stat_t *file_stat) { if (file_stat->fields == CSYNC_VIO_FILE_STAT_FIELDS_CHECKSUM) { SAFE_FREE(file_stat->u.checksum); } - + if (file_stat->fields == CSYNC_VIO_FILE_STAT_FIELDS_MD5) { + SAFE_FREE(file_stat->md5); + } SAFE_FREE(file_stat->name); SAFE_FREE(file_stat); } From 88766588104495c21b26d301b55f861cdf9c0031 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:48:24 +0300 Subject: [PATCH 053/106] Added functions to read the file tree from database. --- src/csync_dbtree.c | 226 +++++++++++++++++++++++++++++++++++++++++++++ src/csync_dbtree.h | 60 ++++++++++++ 2 files changed, 286 insertions(+) create mode 100644 src/csync_dbtree.c create mode 100644 src/csync_dbtree.h diff --git a/src/csync_dbtree.c b/src/csync_dbtree.c new file mode 100644 index 0000000000..47a2f0ba7b --- /dev/null +++ b/src/csync_dbtree.c @@ -0,0 +1,226 @@ +/* + * libcsync -- a library to sync a directory with another + * + * Copyright (c) 2012 by Klaas Freitag + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "config.h" + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "csync_dbtree.h" +#include "c_lib.h" +#include "csync_private.h" +#include "csync_statedb.h" +#include "csync_util.h" + + +#define CSYNC_LOG_CATEGORY_NAME "csync.dbtree" +#include "csync_log.h" + +struct dir_listing { + c_list_t *list; + unsigned int cnt; + c_list_t *entry; + char *dir; +}; + +csync_vio_method_handle_t *csync_dbtree_opendir(CSYNC *ctx, const char *name) +{ + char *stmt = NULL; + char *column = NULL; + const char *path = NULL; + csync_vio_file_stat_t *fs = NULL; + unsigned int c = 0; + c_strlist_t *list = NULL; + struct dir_listing *listing = NULL; + + /* "phash INTEGER(8)," + "pathlen INTEGER," + "path VARCHAR(4096)," + "inode INTEGER," + "uid INTEGER," + "gid INTEGER," + "mode INTEGER," + "modtime INTEGER(8)," + "type INTEGER," + "md5 VARCHAR(32)," + */ + + int col_count = 9; + + path = name + strlen(ctx->remote.uri)+1; + + if( asprintf( &stmt, "SELECT phash, path, inode, uid, gid, mode, modtime, type, md5 " + "FROM metadata WHERE path GLOB('%s/*')", path ) < 0 ) { + return NULL; + } + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "SQL: %s", stmt); + + list = csync_statedb_query( ctx, stmt ); + /* list count must be a multiple of col_count */ + if( list->count % col_count != 0 ) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Wrong size of query result list"); + return NULL; + } + + listing = c_malloc(sizeof(struct dir_listing)); + if( listing == NULL ) { + errno = ENOMEM; + return NULL; + } + + listing->dir = c_strdup(path); + + for( c = 0; c < (list->count / col_count); c++) { + int base = c*col_count; + int cnt = 0; + int tpath_len = 0; + int type = 0; + + char *tpath = list->vector[base+1]; + /* check if the result points to a file directly below the search path + * by checking if there is another / in the result. + * If yes, skip it. + * FIXME: Find a better filter solution here. + */ + tpath += strlen(path)+1; /* jump over the search path */ + tpath_len = strlen( tpath ); + while( cnt < tpath_len ) { + + if(*(tpath+cnt) == '/') { + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Skipping entry: %s", list->vector[base+1]); + break; + } + cnt++; + } + if( cnt < tpath_len ) continue; + + fs = csync_vio_file_stat_new(); + fs->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE; + + column = list->vector[base+0]; /* phash */ + + column = list->vector[base+1]; /* path */ + fs->name = c_strdup(column+strlen(path)+1); + + column = list->vector[base+2]; /* inode */ + fs->inode = atoi(column); + fs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_INODE; + + column = list->vector[base+3]; /* uid */ + fs->uid = atoi(column); + fs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_UID; + + column = list->vector[base+4]; /* gid */ + fs->gid = atoi(column); + fs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_GID; + + column = list->vector[base+5]; /* mode */ + fs->mode = atoi(column); + // fs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_M; + + column = list->vector[base+6]; /* modtime */ + fs->mtime = strtoul(column, NULL, 10); + fs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; + + column = list->vector[base+7]; /* type */ + type = atoi(column); + /* Attention: the type of csync_ftw_type_e which is the source for + * the database entry is different from csync_vio_file_type_e which + * is the target file type here. Mapping is needed! + */ + switch( type ) { + case CSYNC_FTW_TYPE_DIR: + fs->type = CSYNC_VIO_FILE_TYPE_DIRECTORY; + break; + case CSYNC_FTW_TYPE_FILE: + fs->type = CSYNC_VIO_FILE_TYPE_REGULAR; + break; + case CSYNC_FTW_TYPE_SLINK: + fs->type = CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK; + break; + default: + fs->type = CSYNC_VIO_FILE_TYPE_UNKNOWN; + } + fs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; + + column = list->vector[base+8]; /* type */ + fs->md5 = c_strdup(column); + fs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; + + /* store into result list. */ + listing->list = c_list_append( listing->list, fs ); + listing->cnt++; + } + listing->entry = c_list_first( listing->list ); + + return listing; +} + +int csync_dbtree_closedir(CSYNC *ctx, csync_vio_method_handle_t *dhandle) +{ + struct dir_listing *dl = NULL; + int rc = 0; + + c_list_t *entry = NULL; + csync_vio_file_stat_t *fs = NULL; + + if( dhandle != NULL ) { + dl = (struct dir_listing*) dhandle; +#if 0 + entry = c_list_first( dl->list ); + + while( entry ) { + + fs = (csync_vio_file_stat_t*) entry->data; + // csync_vio_file_stat_destroy(fs); + entry = c_list_next(dl->list); + } +#endif + } + return rc; +} + +csync_vio_file_stat_t *csync_dbtree_readdir(CSYNC *ctx, csync_vio_method_handle_t *dhandle) +{ + csync_vio_file_stat_t *fs = NULL; + struct dir_listing *dl = NULL; + + if( dhandle != NULL ) { + dl = (struct dir_listing*) dhandle; + if( dl->entry != NULL ) { + fs = (csync_vio_file_stat_t*) dl->entry->data; + + dl->entry = c_list_next( dl->entry); + } + } + + return fs; +} + +/* vim: set ts=8 sw=2 et cindent: */ diff --git a/src/csync_dbtree.h b/src/csync_dbtree.h new file mode 100644 index 0000000000..297a9995f0 --- /dev/null +++ b/src/csync_dbtree.h @@ -0,0 +1,60 @@ +/* + * libcsync -- a library to sync a directory with another + * + * Copyright (c) 2012 by Klaas Freitag + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** + * @file csync_dbtree.h + * + * @brief Private interface of csync + * + * @defgroup csyncdbtreeInternals csync statedb internals + * @ingroup csyncInternalAPI + * + * @{ + */ + +#ifndef _CSYNC_DBTREE_H +#define _CSYNC_DBTREE_H + +#include "c_lib.h" +#include "csync_private.h" +#include "vio/csync_vio_handle.h" + +/** + * @brief Open a directory based on the statedb. + * + * This function reads the list of files within a directory from statedb and + * builds up a list in memory. + * + * @param ctx The csync context. + * @param name The directory name. + * + * @return 0 on success, less than 0 if an error occured with errno set. + */ +csync_vio_method_handle_t *csync_dbtree_opendir(CSYNC *ctx, const char *name); + +int csync_dbtree_closedir(CSYNC *ctx, csync_vio_method_handle_t *dhandle); + +csync_vio_file_stat_t *csync_dbtree_readdir(CSYNC *ctx, csync_vio_method_handle_t *dhandle); + +/** + * }@ + */ +#endif /* _CSYNC_DBTREE_H */ +/* vim: set ft=c.doxygen ts=8 sw=2 et cindent: */ From e349df9f4c74b8346c90dfd3fbf1e04ab04b2e61 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:49:18 +0300 Subject: [PATCH 054/106] Added flag to indicate to read the remote filetree from db. --- src/csync_private.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/csync_private.h b/src/csync_private.h index 7f55b2213c..14162b2967 100644 --- a/src/csync_private.h +++ b/src/csync_private.h @@ -104,6 +104,7 @@ struct csync_s { c_list_t *list; c_list_t *id_list; enum csync_replica_e type; + int read_from_db; } remote; struct { @@ -163,7 +164,7 @@ struct csync_file_stat_s { int type; /* u32 */ char *destpath; /* for renames */ - char *md5; + const char *md5; enum csync_instructions_e instruction; /* u32 */ char path[1]; /* u8 */ } From 1e41c469f02908b2ae9d45fced62f9899b924dbe Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:49:47 +0300 Subject: [PATCH 055/106] Add the dbtree function module. --- src/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e723badc2b..8357f46eb1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -48,6 +48,7 @@ set(csync_SRCS csync_config.c csync_exclude.c csync_statedb.c + csync_dbtree.c csync_time.c csync_util.c csync_misc.c From 1dc50eea5dd9d3559fd16279ffabb8b71e979a9a Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:50:30 +0300 Subject: [PATCH 056/106] Decide if the file tree is read from db or stat'ed --- src/vio/csync_vio.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/vio/csync_vio.c b/src/vio/csync_vio.c index 6bdb7a6374..11d69da319 100644 --- a/src/vio/csync_vio.c +++ b/src/vio/csync_vio.c @@ -29,6 +29,7 @@ #include /* dlopen(), dlclose(), dlsym() ... */ #include "csync_private.h" +#include "csync_dbtree.h" #include "vio/csync_vio.h" #include "vio/csync_vio_handle_private.h" #include "vio/csync_vio_local.h" @@ -379,7 +380,12 @@ csync_vio_handle_t *csync_vio_opendir(CSYNC *ctx, const char *name) { switch(ctx->replica) { case REMOTE_REPLCIA: - mh = ctx->module.method->opendir(name); + if(ctx->remote.read_from_db) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Reading directory %s from database", name); + mh = csync_dbtree_opendir(ctx, name); + } else { + mh = ctx->module.method->opendir(name); + } break; case LOCAL_REPLICA: mh = csync_vio_local_opendir(name); @@ -406,7 +412,11 @@ int csync_vio_closedir(CSYNC *ctx, csync_vio_handle_t *dhandle) { switch(ctx->replica) { case REMOTE_REPLCIA: - rc = ctx->module.method->closedir(dhandle->method_handle); + if(ctx->remote.read_from_db) { + rc = csync_dbtree_closedir(ctx, dhandle->method_handle); + } else { + rc = ctx->module.method->closedir(dhandle->method_handle); + } break; case LOCAL_REPLICA: rc = csync_vio_local_closedir(dhandle->method_handle); @@ -426,7 +436,11 @@ csync_vio_file_stat_t *csync_vio_readdir(CSYNC *ctx, csync_vio_handle_t *dhandle switch(ctx->replica) { case REMOTE_REPLCIA: - fs = ctx->module.method->readdir(dhandle->method_handle); + if(ctx->remote.read_from_db) { + fs = csync_dbtree_readdir(ctx, dhandle->method_handle); + } else { + fs = ctx->module.method->readdir(dhandle->method_handle); + } break; case LOCAL_REPLICA: fs = csync_vio_local_readdir(dhandle->method_handle); From cf8f31914a8ca84a5b34a4c77ad233a3c9d2a179 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:53:53 +0300 Subject: [PATCH 057/106] Added a file type column to the database. --- src/csync_statedb.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/csync_statedb.c b/src/csync_statedb.c index 2c6dad3aa0..d40f02b55c 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -213,6 +213,7 @@ int csync_statedb_create_tables(CSYNC *ctx) { "gid INTEGER," "mode INTEGER," "modtime INTEGER(8)," + "type INTEGER," "md5 VARCHAR(32)," "PRIMARY KEY(phash)" ");" @@ -233,6 +234,7 @@ int csync_statedb_create_tables(CSYNC *ctx) { "gid INTEGER," "mode INTEGER," "modtime INTEGER(8)," + "type INTEGER," "md5 VARCHAR(32)," "PRIMARY KEY(phash)" ");" @@ -305,8 +307,8 @@ static int _insert_metadata_visitor(void *obj, void *data) { case CSYNC_INSTRUCTION_CONFLICT: CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "SQL statement: INSERT INTO metadata_temp \n" - "\t\t\t(phash, pathlen, path, inode, uid, gid, mode, modtime, md5) VALUES \n" - "\t\t\t(%llu, %lu, %s, %llu, %u, %u, %u, %lu, %s);", + "\t\t\t(phash, pathlen, path, inode, uid, gid, mode, modtime, type, md5) VALUES \n" + "\t\t\t(%llu, %lu, %s, %llu, %u, %u, %u, %lu, %d, %s);", (long long unsigned int) fs->phash, (long unsigned int) fs->pathlen, fs->path, @@ -315,14 +317,15 @@ static int _insert_metadata_visitor(void *obj, void *data) { fs->gid, fs->mode, fs->modtime, + fs->type, fs->md5); /* * The phash needs to be long long unsigned int or it segfaults on PPC */ stmt = sqlite3_mprintf("INSERT INTO metadata_temp " - "(phash, pathlen, path, inode, uid, gid, mode, modtime, md5) VALUES " - "(%llu, %lu, '%q', %llu, %u, %u, %u, %lu, '%s');", + "(phash, pathlen, path, inode, uid, gid, mode, modtime, type, md5) VALUES " + "(%llu, %lu, '%q', %llu, %u, %u, %u, %lu, %d, '%s');", (long long unsigned int) fs->phash, (long unsigned int) fs->pathlen, fs->path, @@ -331,6 +334,7 @@ static int _insert_metadata_visitor(void *obj, void *data) { fs->gid, fs->mode, fs->modtime, + fs->type, fs->md5); if (stmt == NULL) { @@ -424,8 +428,9 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx, uint64_t phash) { st->gid = atoi(result->vector[5]); st->mode = atoi(result->vector[6]); st->modtime = strtoul(result->vector[7], NULL, 10); - if( result->vector[8]) - st->md5 = c_strdup( result->vector[8] ); + st->type = atoi(result->vector[8]); + if( result->vector[9]) + st->md5 = c_strdup( result->vector[9] ); c_strlist_destroy(result); return st; @@ -470,8 +475,9 @@ csync_file_stat_t *csync_statedb_get_stat_by_inode(CSYNC *ctx, uint64_t inode) { st->gid = atoi(result->vector[5]); st->mode = atoi(result->vector[6]); st->modtime = strtoul(result->vector[7], NULL, 10); - if( result->vector[8] ) - st->md5 = c_strdup(result->vector[8]); + st->type = atoi(result->vector[8]); + if( result->vector[9] ) + st->md5 = c_strdup(result->vector[9]); c_strlist_destroy(result); From 5b5fe29eb580f28ec7c84ff969127e520281cbb6 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:54:36 +0300 Subject: [PATCH 058/106] Make sqlite_query function able to deal with multiple row queries. --- src/csync_statedb.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/csync_statedb.c b/src/csync_statedb.c index d40f02b55c..df0a61840c 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -517,6 +517,7 @@ c_strlist_t *csync_statedb_query(CSYNC *ctx, const char *statement) { sqlite3_stmt *stmt; const char *tail = NULL; c_strlist_t *result = NULL; + int row = 0; do { /* compile SQL program into a virtual machine, reattempteing if busy */ @@ -569,7 +570,13 @@ c_strlist_t *csync_statedb_query(CSYNC *ctx, const char *statement) { break; } - result = c_strlist_new(column_count); + row++; + if( result ) { + result = c_strlist_expand(result, row*column_count); + } else { + result = c_strlist_new(column_count); + } + if (result == NULL) { return NULL; } From 2420eeffd1928e5e33020789771ba38adf254b7f Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:55:39 +0300 Subject: [PATCH 059/106] Read remote file tree from db if id has not changed. --- src/csync_update.c | 93 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 90 insertions(+), 3 deletions(-) diff --git a/src/csync_update.c b/src/csync_update.c index 84023a039e..97d9c96d4c 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -229,6 +229,63 @@ int csync_walker(CSYNC *ctx, const char *file, const csync_vio_file_stat_t *fs, return 0; } +/* check if the dirent entries for the directory can be read from db + * instead really calling readdir which is costly over net. + * For that, a single HEAD request is done on the directory to get its + * id. If the ID has not changed remotely, this subtree hasn't changed + * and can be read from db. + */ +static int _check_read_from_db(CSYNC *ctx, const char *uri) { + int len; + uint64_t h; + csync_vio_file_stat_t *fs = NULL; + char *md5_local = NULL; + const char *md5_remote = NULL; + const char *mpath; + c_rbnode_t *node = NULL; + int rc = 0; /* FIXME: Error handling! */ + + if( !c_streq( ctx->remote.uri, uri )) { + /* FIXME: The top uri can not be checked because there is no db entry for it */ + if( strlen(uri) < strlen(ctx->remote.uri)+1 ) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "check_read_from_db: uri is not a remote uri."); + /* FIXME: errno? */ + return -1; + } + mpath = uri + strlen(ctx->remote.uri) + 1; + fs = csync_vio_file_stat_new(); + if(fs == NULL) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "check_read_from_db: memory fault."); + errno = ENOMEM; + return -1; + } + len = strlen( mpath ); + h = c_jhash64((uint8_t *) mpath, len, 0); + + /* search in the local tree for the local file to get the mtime */ + node = c_rbtree_find(ctx->local.tree, &h); + if(node == NULL) { + /* no local file found. */ + } else { + csync_file_stat_t *other = NULL; + /* set the mtime which is needed in statedb_get_uniqid */ + other = (csync_file_stat_t *) node->data; + if( other ) + fs->mtime = other->modtime; + } + md5_local = csync_statedb_get_uniqId( ctx, h, fs ); + md5_remote = csync_vio_file_id(ctx, uri); + + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Compare directory ids for %s: %s -> %s", mpath, md5_local, md5_remote ); + + if( c_streq(md5_local, md5_remote) ) { + ctx->remote.read_from_db = 1; + } + csync_vio_file_stat_destroy(fs); + } + return rc; +} + /* File tree walker */ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, unsigned int depth) { @@ -238,13 +295,30 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, csync_vio_handle_t *dh = NULL; csync_vio_file_stat_t *dirent = NULL; csync_vio_file_stat_t *fs = NULL; + int read_from_db = 0; int rc = 0; + int res = 0; + + bool do_read_from_db = (ctx->current == REMOTE_REPLCIA && ctx->remote.read_from_db); if (uri[0] == '\0') { errno = ENOENT; goto error; } + /* If remote, compare the id with the local id. If equal, read all contents from + * the database. */ + read_from_db = ctx->remote.read_from_db; + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Incoming read_from_db-Flag for %s: %d", + uri, read_from_db ); + if( ctx->current == REMOTE_REPLCIA && !do_read_from_db ) { + _check_read_from_db(ctx, uri); + do_read_from_db = (ctx->current == REMOTE_REPLCIA && ctx->remote.read_from_db); + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Checking for read from db for %s: %d", + uri, ctx->remote.read_from_db ); + + } + if ((dh = csync_vio_opendir(ctx, uri)) == NULL) { /* permission denied */ if (errno == EACCES) { @@ -305,8 +379,16 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, continue; } - fs = csync_vio_file_stat_new(); - if (csync_vio_stat(ctx, filename, fs) == 0) { + /* == see if really stat has to be called. */ + if( do_read_from_db ) { + fs = dirent; + res = 0; + } else { + fs = csync_vio_file_stat_new(); + res = csync_vio_stat(ctx, filename, fs); + } + + if( res == 0) { switch (fs->type) { case CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK: flag = CSYNC_FTW_FLAG_SLINK; @@ -341,7 +423,9 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, /* Call walker function for each file */ rc = fn(ctx, filename, fs, flag); - csync_vio_file_stat_destroy(fs); + + if( ! do_read_from_db ) + csync_vio_file_stat_destroy(fs); if (rc < 0) { csync_vio_closedir(ctx, dh); @@ -360,6 +444,9 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, dirent = NULL; } csync_vio_closedir(ctx, dh); + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Closing walk for %s with read_from_db %d", uri, read_from_db); + + ctx->remote.read_from_db = read_from_db; done: csync_vio_file_stat_destroy(dirent); From 4169c4be0562e65fca7a0a1bd65eb985c3dd5ef2 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 23 Aug 2012 17:57:04 +0300 Subject: [PATCH 060/106] More blackbox testing of csync ownCloud - enhanced test script. --- tests/ownCloud/HTTP/DAV.pm | 2075 +++++++++++++++++ tests/ownCloud/t1.pl | 46 +- tests/ownCloud/toremote1/rtl1/La cédille | 1 + tests/ownCloud/toremote1/rtl11/quitte.pdf | Bin 0 -> 121780 bytes .../toremote1/rtl11/red_is_the_rose.jpg | Bin 0 -> 152719 bytes tests/ownCloud/toremote1/rtl2/kb1.jpg | Bin 0 -> 332617 bytes tests/ownCloud/toremote1/rtl2/émettre.xls | 1 + 7 files changed, 2115 insertions(+), 8 deletions(-) create mode 100644 tests/ownCloud/HTTP/DAV.pm create mode 100644 tests/ownCloud/toremote1/rtl1/La cédille create mode 100644 tests/ownCloud/toremote1/rtl11/quitte.pdf create mode 100644 tests/ownCloud/toremote1/rtl11/red_is_the_rose.jpg create mode 100644 tests/ownCloud/toremote1/rtl2/kb1.jpg create mode 100644 tests/ownCloud/toremote1/rtl2/émettre.xls diff --git a/tests/ownCloud/HTTP/DAV.pm b/tests/ownCloud/HTTP/DAV.pm new file mode 100644 index 0000000000..cdc95ce196 --- /dev/null +++ b/tests/ownCloud/HTTP/DAV.pm @@ -0,0 +1,2075 @@ +# +# Perl WebDAV client library +# + +package HTTP::DAV; + +use LWP; +use XML::DOM; +use Time::Local; +use HTTP::DAV::Lock; +use HTTP::DAV::ResourceList; +use HTTP::DAV::Resource; +use HTTP::DAV::Comms; +use URI::file; +use URI::Escape; +use FileHandle; +use File::Glob; + +#use Carp (cluck); +use Cwd (); # Can't import all of it, cwd clashes with our namespace. + +# Globals +$VERSION = '0.44'; +$VERSION_DATE = '2011/06/19'; + +# Set this up to 3 +$DEBUG = 0; + +use strict; +use vars qw($VERSION $VERSION_DATE $DEBUG); + +sub new { + my $class = shift; + my $self = bless {}, ref($class) || $class; + $self->_init(@_); + return $self; +} + +########################################################################### +sub clone { + my $self = @_; + my $class = ref($self); + my %clone = %{$self}; + bless {%clone}, $class; +} + +########################################################################### +{ + + sub _init { + my ( $self, @p ) = @_; + my ( $uri, $headers, $useragent ) + = HTTP::DAV::Utils::rearrange( [ 'URI', 'HEADERS', 'USERAGENT' ], + @p ); + + $self->{_lockedresourcelist} = HTTP::DAV::ResourceList->new(); + $self->{_comms} = HTTP::DAV::Comms->new( + -useragent => $useragent, + -headers => $headers + ); + if ($uri) { + $self->set_workingresource( $self->new_resource( -uri => $uri ) ); + } + + return $self; + } +} + +sub DebugLevel { + shift if ref( $_[0] ) =~ /HTTP/; + my $level = shift; + $level = 256 if !defined $level || $level eq ""; + + $DEBUG = $level; +} + +###################################################################### +# new_resource acts as a resource factory. +# It will create a new one for you each time you ask. +# Sometimes, if it holds state information about this +# URL, it may return an old populated object. +sub new_resource { + my ($self) = shift; + + #### + # This is the order of the arguments unless used as + # named parameters + my ($uri) = HTTP::DAV::Utils::rearrange( ['URI'], @_ ); + $uri = HTTP::DAV::Utils::make_uri($uri); + + #cluck "new_resource: now $uri\n"; + + my $resource = $self->{_lockedresourcelist}->get_member($uri); + if ($resource) { + print + "new_resource: For $uri, returning existing resource $resource\n" + if $HTTP::DAV::DEBUG > 2; + + # Just reset the url to honour trailing slash status. + $resource->set_uri($uri); + return $resource; + } + else { + print "new_resource: For $uri, creating new resource\n" + if $HTTP::DAV::DEBUG > 2; + return HTTP::DAV::Resource->new( + -Comms => $self->{_comms}, + -LockedResourceList => $self->{_lockedresourcelist}, + -uri => $uri, + -Client => $self + ); + } +} + +########################################################################### +# ACCESSOR METHODS + +# GET +sub get_user_agent { $_[0]->{_comms}->get_user_agent(); } +sub get_last_request { $_[0]->{_comms}->get_last_request(); } +sub get_last_response { $_[0]->{_comms}->get_last_response(); } +sub get_workingresource { $_[0]->{_workingresource} } + +sub get_workingurl { + $_[0]->{_workingresource}->get_uri() + if defined $_[0]->{_workingresource}; +} +sub get_lockedresourcelist { $_[0]->{_lockedresourcelist} } + +# SET +sub set_workingresource { $_[0]->{_workingresource} = $_[1]; } +sub credentials { shift->{_comms}->credentials(@_); } + +###################################################################### +# Error handling + +## Error conditions +my %err = ( + 'ERR_WRONG_ARGS' => 'Wrong number of arguments supplied.', + 'ERR_UNAUTHORIZED' => 'Unauthorized. ', + 'ERR_NULL_RESOURCE' => 'Not connected. Do an open first. ', + 'ERR_RESP_FAIL' => 'Server response: ', + 'ERR_501' => 'Server response: ', + 'ERR_405' => 'Server response: ', + 'ERR_GENERIC' => '', +); + +sub err { + my ( $self, $error, $mesg, $url ) = @_; + + my $err_msg; + $err_msg = ""; + $err_msg .= $err{$error} if defined $err{$error}; + $err_msg .= $mesg if defined $mesg; + $err_msg .= "ERROR" unless defined $err_msg; + + $self->{_message} = $err_msg; + my $callback = $self->{_callback}; + &$callback( 0, $err_msg, $url ) if $callback; + + if ( $self->{_multi_op} ) { + push( @{ $self->{_errors} }, $err_msg ); + } + $self->{_status} = 0; + + return 0; +} + +sub ok { + my ($self, $mesg, $url, $so_far, $length) = @_; + + $self->{_message} = $mesg; + + my $callback = $self->{_callback}; + &$callback(1, $mesg, $url, $so_far, $length) if $callback; + + if ($self->{_multi_op}) { + $self->{_status} = 1 unless $self->{_status} == 0; + } + else { + $self->{_status} = 1; + } + return 1; +} + +sub _start_multi_op { + my ($self, $mesg, $callback) = @_; + $self->{_multi_mesg} = $mesg || ""; + $self->{_status} = 1; + $self->{_errors} = []; + $self->{_multi_op} = 1; + $self->{_callback} = $callback if defined $callback; +} + +sub _end_multi_op { + my ($self) = @_; + $self->{_multi_op} = 0; + $self->{_callback} = undef; + my $message = $self->{_multi_mesg} . " "; + $message .= ( $self->{_status} ) ? "succeeded" : "failed"; + $self->{_message} = $message; + $self->{_multi_mesg} = undef; +} + +sub message { + my ($self) = @_; + return $self->{_message} || ""; +} + +sub errors { + my ($self) = @_; + my $err_ref = $self->{_errors} || []; + return @{ $err_ref }; +} + +sub is_success { + my ($self) = @_; + return $self->{_status}; +} + +###################################################################### +# Operations + +# CWD +sub cwd { + my ( $self, @p ) = @_; + my ($url) = HTTP::DAV::Utils::rearrange( ['URL'], @p ); + + return $self->err('ERR_WRONG_ARGS') if ( !defined $url || $url eq "" ); + return $self->err('ERR_NULL_RESOURCE') + unless $self->get_workingresource(); + + $url = HTTP::DAV::Utils::make_trail_slash($url); + my $new_uri = $self->get_absolute_uri($url); + ($new_uri) = $self->get_globs($new_uri); + + return 0 unless ($new_uri); + + print "cwd: Changing to $new_uri\n" if $DEBUG; + return $self->open($new_uri); +} + +# DELETE +sub delete { + my ( $self, @p ) = @_; + my ( $url, $callback ) + = HTTP::DAV::Utils::rearrange( [ 'URL', 'CALLBACK' ], @p ); + + return $self->err('ERR_WRONG_ARGS') if ( !defined $url || $url eq "" ); + return $self->err('ERR_NULL_RESOURCE') + unless $self->get_workingresource(); + + my $new_url = $self->get_absolute_uri($url); + my @urls = $self->get_globs($new_url); + + $self->_start_multi_op( "delete $url", $callback ) if @urls > 1; + + foreach my $u (@urls) { + my $resource = $self->new_resource( -uri => $u ); + + my $resp = $resource->delete(); + + if ( $resp->is_success ) { + $self->ok( "deleted $u successfully", $u ); + } + else { + $self->err( 'ERR_RESP_FAIL', $resp->message(), $u ); + } + } + + $self->_end_multi_op() if @urls > 1; + + return $self->is_success; +} + +# GET +# Handles globs by doing multiple recursive gets +# GET dir* produces +# _get dir1, to_local +# _get dir2, to_local +# _get dir3, to_local +sub get { + my ( $self, @p ) = @_; + my ( $url, $to, $callback, $chunk ) + = HTTP::DAV::Utils::rearrange( [ 'URL', 'TO', 'CALLBACK', 'CHUNK' ], + @p ); + + return $self->err('ERR_WRONG_ARGS') if ( !defined $url || $url eq "" ); + return $self->err('ERR_NULL_RESOURCE') + unless $self->get_workingresource(); + + $self->_start_multi_op( "get $url", $callback ); + + my $new_url = $self->get_absolute_uri($url); + my (@urls) = $self->get_globs($new_url); + + return 0 unless ( $#urls > -1 ); + + ############ + # HANDLE -TO + # + $to ||= ''; + if ( $to eq '.' ) { + $to = Cwd::getcwd(); + } + + # If the TO argument is a file handle or a scalar + # then check that we only got one glob. If we got multiple + # globs, then we can't keep going because we can't write multiple files + # to one FileHandle. + if ( $#urls > 0 ) { + if ( ref($to) =~ /SCALAR/ ) { + return $self->err( 'ERR_WRONG_ARGS', + "Can't retrieve multiple files to a single scalar\n" ); + } + elsif ( ref($to) =~ /GLOB/ ) { + return $self->err( 'ERR_WRONG_ARGS', + "Can't retrieve multiple files to a single filehandle\n" ); + } + } + + # If it's a dir, remove last '/' from destination. + # Later we need to concatenate the destination filename. + if ( defined $to && $to ne '' && -d $to ) { + $to =~ s{/$}{}; + } + + # Foreach file... do the get. + foreach my $u (@urls) { + my ( $left, $leafname ) = HTTP::DAV::Utils::split_leaf($u); + + # Handle SCALARREF and GLOB cases + my $dest_file = $to; + + # Directories + if ( -d $to ) { + $dest_file = "$to/$leafname"; + + # Multiple targets + } + elsif ( !defined $to || $to eq "" ) { + $dest_file = $leafname; + } + + warn "get: $u -> $dest_file\n" if $DEBUG; + + # Setup the resource based on the passed url and do a propfind. + my $resource = $self->new_resource( -uri => $u ); + my $resp = $resource->propfind( -depth => 1 ); + + if ( $resp->is_error ) { + return $self->err( 'ERR_RESP_FAIL', $resp->message(), $u ); + } + + $self->_get( $resource, $dest_file, $callback, $chunk ); + } + + $self->_end_multi_op(); + return $self->is_success; +} + +# Note: is is expected that $resource has had +# a propfind depth 1 performed on it. +# +sub _get { + my ( $self, @p ) = @_; + my ( $resource, $local_name, $callback, $chunk ) + = HTTP::DAV::Utils::rearrange( + [ 'RESOURCE', 'TO', 'CALLBACK', 'CHUNK' ], @p ); + + my $url = $resource->get_uri(); + + # GET A DIRECTORY + if ( $resource->is_collection ) { + + # If the TO argument is a file handle, a scalar or empty + # then we + # can't keep going because we can't write multiple files + # to one FileHandle, scalar, etc. + if ( ref($local_name) =~ /SCALAR/ ) { + return $self->err( 'ERR_WRONG_ARGS', + "Can't retrieve a collection to a scalar\n", $url ); + } + elsif ( ref($local_name) =~ /GLOB/ ) { + return $self->err( 'ERR_WRONG_ARGS', + "Can't retrieve a collection to a filehandle\n", $url ); + } + elsif ( $local_name eq "" ) { + return $self->err( + 'ERR_GENERIC', + "Can't retrieve a collection without a target directory (-to).", + $url + ); + } + + # Try and make the directory locally + print "MKDIR $local_name (before escape)\n" if $DEBUG > 2; + + $local_name = URI::Escape::uri_unescape($local_name); + if ( !mkdir $local_name ) { + return $self->err( 'ERR_GENERIC', + "mkdir local:$local_name failed: $!" ); + } + + $self->ok("mkdir $local_name"); + + # This is the degenerate case for an empty dir. + print "Made directory $local_name\n" if $DEBUG > 2; + + my $resource_list = $resource->get_resourcelist(); + if ($resource_list) { + + # FOREACH FILE IN COLLECTION, GET IT. + foreach my $progeny_r ( $resource_list->get_resources() ) { + + my $progeny_url = $progeny_r->get_uri(); + print "Found progeny:$progeny_url\n" if $DEBUG > 2; + my $progeny_local_filename + = HTTP::DAV::Utils::get_leafname($progeny_url); + $progeny_local_filename + = URI::Escape::uri_unescape($progeny_local_filename); + + $progeny_local_filename + = URI::file->new($progeny_local_filename) + ->abs("$local_name/"); + + if ( $progeny_r->is_collection() ) { + $progeny_r->propfind( -depth => 1 ); + } + $self->_get( $progeny_r, $progeny_local_filename, $callback, + $chunk ); + + # } else { + # $self->_do_get_tofile($progeny_r,$progeny_local_filename); + # } + } + } + } + + # GET A FILE + else { + my $response; + my $name_ref = ref $local_name; + + if ( $callback || $name_ref =~ /SCALAR/ || $name_ref =~ /GLOB/ ) { + $self->{_so_far} = 0; + + my $fh; + my $put_to_scalar = 0; + + if ( $name_ref =~ /GLOB/ ) { + $fh = $local_name; + } + + elsif ( $name_ref =~ /SCALAR/ ) { + $put_to_scalar = 1; + $$local_name = ""; + } + + else { + $fh = FileHandle->new; + $local_name = URI::Escape::uri_unescape($local_name); + if (! $fh->open(">$local_name") ) { + return $self->err( + 'ERR_GENERIC', + "open \">$local_name\" failed: $!", + $url + ); + } + + # RT #29788, avoid file corruptions on Win32 + binmode $fh; + } + + $self->{_fh} = $fh; + + $response = $resource->get( + -chunk => $chunk, + -progress_callback => + + sub { + my ( $data, $response, $protocol ) = @_; + + $self->{_so_far} += length($data); + + my $fh = $self->{_fh}; + print $fh $data if defined $fh; + + $$local_name .= $data if ($put_to_scalar); + + my $user_callback = $self->{_callback}; + &$user_callback( -1, "transfer in progress", + $url, $self->{_so_far}, $response->content_length(), + $data ) + if defined $user_callback; + + } + + ); # end get( ... ); + + # Close the filehandle if it was set. + if ( defined $self->{_fh} ) { + $self->{_fh}->close(); + delete $self->{_fh}; + } + } + else { + $local_name = URI::Escape::uri_unescape($local_name); + $response = $resource->get( -save_to => $local_name ); + } + + # Handle response + if ( $response->is_error ) { + return $self->err( 'ERR_GENERIC', + "get $url failed: " . $response->message, $url ); + } + else { + return $self->ok( "get $url", $url, $self->{_so_far}, + $response->content_length() ); + } + + } + + return 1; +} + +# LOCK +sub lock { + my ( $self, @p ) = @_; + my ( $url, $owner, $depth, $timeout, $scope, $type, @other ) + = HTTP::DAV::Utils::rearrange( + [ 'URL', 'OWNER', 'DEPTH', 'TIMEOUT', 'SCOPE', 'TYPE' ], @p ); + + return $self->err('ERR_NULL_RESOURCE') + unless $self->get_workingresource(); + + my $resource; + if ($url) { + $url = $self->get_absolute_uri($url); + $resource = $self->new_resource( -uri => $url ); + } + else { + $resource = $self->get_workingresource(); + $url = $resource->get_uri; + } + + # Make the lock + my $resp = $resource->lock( + -owner => $owner, + -depth => $depth, + -timeout => $timeout, + -scope => $scope, + -type => $type + ); + + if ( $resp->is_success() ) { + return $self->ok( "lock $url succeeded", $url ); + } + else { + return $self->err( 'ERR_RESP_FAIL', $resp->message, $url ); + } +} + +# UNLOCK +sub unlock { + my ( $self, @p ) = @_; + my ($url) = HTTP::DAV::Utils::rearrange( ['URL'], @p ); + + return $self->err('ERR_NULL_RESOURCE') + unless $self->get_workingresource(); + + my $resource; + if ($url) { + $url = $self->get_absolute_uri($url); + $resource = $self->new_resource( -uri => $url ); + } + else { + $resource = $self->get_workingresource(); + $url = $resource->get_uri; + } + + # Make the lock + my $resp = $resource->unlock(); + if ( $resp->is_success ) { + return $self->ok( "unlock $url succeeded", $url ); + } + else { + + # The Resource.pm::lock routine has a hack + # where if it doesn't know the locktoken, it will + # just return an empty response with message "Client Error". + # Make a custom message for this case. + my $msg = $resp->message; + if ( $msg =~ /Client error/i ) { + $msg = "No locks found. Try steal"; + return $self->err( 'ERR_GENERIC', $msg, $url ); + } + else { + return $self->err( 'ERR_RESP_FAIL', $msg, $url ); + } + } +} + +sub steal { + my ( $self, @p ) = @_; + my ($url) = HTTP::DAV::Utils::rearrange( ['URL'], @p ); + + return $self->err('ERR_NULL_RESOURCE') + unless $self->get_workingresource(); + + my $resource; + if ($url) { + $url = $self->get_absolute_uri($url); + $resource = $self->new_resource( -uri => $url ); + } + else { + $resource = $self->get_workingresource(); + } + + # Go the steal + my $resp = $resource->forcefully_unlock_all(); + if ( $resp->is_success() ) { + return $self->ok( "steal succeeded", $url ); + } + else { + return $self->err( 'ERR_RESP_FAIL', $resp->message(), $url ); + } +} + +# MKCOL +sub mkcol { + my ( $self, @p ) = @_; + my ($url) = HTTP::DAV::Utils::rearrange( ['URL'], @p ); + + return $self->err('ERR_WRONG_ARGS') if ( !defined $url || $url eq "" ); + return $self->err('ERR_NULL_RESOURCE') + unless $self->get_workingresource(); + + $url = HTTP::DAV::Utils::make_trail_slash($url); + my $new_url = $self->get_absolute_uri($url); + my $resource = $self->new_resource( -uri => $new_url ); + + # Make the lock + my $resp = $resource->mkcol(); + if ( $resp->is_success() ) { + return $self->ok( "mkcol $new_url", $new_url ); + } + else { + return $self->err( 'ERR_RESP_FAIL', $resp->message(), $new_url ); + } +} + +# OPTIONS +sub options { + my ( $self, @p ) = @_; + my ($url) = HTTP::DAV::Utils::rearrange( ['URL'], @p ); + + #return $self->err('ERR_WRONG_ARGS') if (!defined $url || $url eq ""); + return $self->err('ERR_NULL_RESOURCE') + unless $self->get_workingresource(); + + my $resource; + if ($url) { + $url = $self->get_absolute_uri($url); + $resource = $self->new_resource( -uri => $url ); + } + else { + $resource = $self->get_workingresource(); + $url = $resource->get_uri; + } + + # Make the call + my $resp = $resource->options(); + if ( $resp->is_success() ) { + $self->ok( "options $url succeeded", $url ); + return $resource->get_options(); + } + else { + $self->err( 'ERR_RESP_FAIL', $resp->message(), $url ); + return undef; + } +} + +# MOVE +sub move { return shift->_move_copy( "move", @_ ); } +sub copy { return shift->_move_copy( "copy", @_ ); } + +sub _move_copy { + my ( $self, $method, @p ) = @_; + my ( $url, $dest_url, $overwrite, $depth, $text, @other ) + = HTTP::DAV::Utils::rearrange( + [ 'URL', 'DEST', 'OVERWRITE', 'DEPTH', 'TEXT' ], @p ); + + return $self->err('ERR_NULL_RESOURCE') + unless $self->get_workingresource(); + + if (!( defined $url && $url ne "" && defined $dest_url && $dest_url ne "" + ) + ) + { + return $self->err( 'ERR_WRONG_ARGS', + "Must supply a source and destination url" ); + } + + $url = $self->get_absolute_uri($url); + $dest_url = $self->get_absolute_uri($dest_url); + my $resource = $self->new_resource( -uri => $url ); + my $dest_resource = $self->new_resource( -uri => $dest_url ); + + my $resp = $dest_resource->propfind( -depth => 1 ); + if ( $resp->is_success && $dest_resource->is_collection ) { + my $leafname = HTTP::DAV::Utils::get_leafname($url); + $dest_url = "$dest_url/$leafname"; + $dest_resource = $self->new_resource( -uri => $dest_url ); + } + + # Make the lock + $resp = $resource->$method( + -dest => $dest_resource, + -overwrite => $overwrite, + -depth => $depth, + -text => $text, + ); + + if ( $resp->is_success() ) { + return $self->ok( "$method $url to $dest_url succeeded", $url ); + } + else { + return $self->err( 'ERR_RESP_FAIL', $resp->message, $url ); + } +} + +# OPEN +# Must be a collection resource +# $dav->open( -url => http://localhost/test/ ); +# $dav->open( localhost/test/ ); +# $dav->open( -url => localhost:81 ); +# $dav->open( localhost ); +sub open { + my ( $self, @p ) = @_; + my ($url) = HTTP::DAV::Utils::rearrange( ['URL'], @p ); + + my $resource; + if ( defined $url && $url ne "" ) { + $url = HTTP::DAV::Utils::make_trail_slash($url); + $resource = $self->new_resource( -uri => $url ); + } + else { + $resource = $self->get_workingresource(); + $url = $resource->get_uri() if ($resource); + return $self->err('ERR_WRONG_ARGS') + if ( !defined $url || $url eq "" ); + } + + my $response = $resource->propfind( -depth => 0 ); + #print $response->as_string; + # print $resource->as_string; + + my $result = $self->what_happened($url, $resource, $response); + if ($result->{success} == 0) { + return $self->err($result->{error_type}, $result->{error_msg}, $url); + } + + # If it is a collection but the URI doesn't end in a trailing slash. + # Then we need to reopen with the / + elsif ($resource->is_collection + && $url !~ m#/\s*$# ) + { + my $newurl = $url . "/"; + print "Redirecting to $newurl\n" if $DEBUG > 1; + return $self->open($newurl); + } + + # If it is not a collection then we + # can't open it. + # elsif ( !$resource->is_collection ) { + # return $self->err( 'ERR_GENERIC', + # "Operation failed. You can only open a collection (directory)", + # $url ); + # } + else { + $self->set_workingresource($resource); + return $self->ok( "Connected to $url", $url ); + } + + return $self->err( 'ERR_GENERIC', $url ); +} + +# Performs a propfind and then returns the populated +# resource. The resource will have a resourcelist if +# it is a collection. +sub propfind { + my ( $self, @p ) = @_; + my ( $url, $depth ) = HTTP::DAV::Utils::rearrange( [ 'URL', 'DEPTH' ], @p ); + + # depth = 1 is the default + if (! defined $depth) { + $depth = 1; + } + + return $self->err('ERR_NULL_RESOURCE') + unless $self->get_workingresource(); + + my $resource; + if ($url) { + $url = $self->get_absolute_uri($url); + $resource = $self->new_resource( -uri => $url ); + } + else { + $resource = $self->get_workingresource(); + } + + # Make the call + my $resp = $resource->propfind( -depth => $depth ); + if ( $resp->is_success() ) { + $resource->build_ls($resource); + $self->ok( "propfind " . $resource->get_uri() . " succeeded", $url ); + return $resource; + } + else { + return $self->err( 'ERR_RESP_FAIL', $resp->message(), $url ); + } +} + +# Set a property on the resource +sub set_prop { + my ( $self, @p ) = @_; + my ( $url, $namespace, $propname, $propvalue, $nsabbr ) + = HTTP::DAV::Utils::rearrange( + [ 'URL', 'NAMESPACE', 'PROPNAME', 'PROPVALUE', 'NSABBR' ], @p ); + $self->proppatch( + -url => $url, + -namespace => $namespace, + -propname => $propname, + -propvalue => $propvalue, + -action => "set", + -nsabbr => $nsabbr, + ); +} + +# Unsets a property on the resource +sub unset_prop { + my ( $self, @p ) = @_; + my ( $url, $namespace, $propname, $nsabbr ) + = HTTP::DAV::Utils::rearrange( + [ 'URL', 'NAMESPACE', 'PROPNAME', 'NSABBR' ], @p ); + $self->proppatch( + -url => $url, + -namespace => $namespace, + -propname => $propname, + -action => "remove", + -nsabbr => $nsabbr, + ); +} + +# Performs a proppatch on the resource +sub proppatch { + my ( $self, @p ) = @_; + my ( $url, $namespace, $propname, $propvalue, $action, $nsabbr ) + = HTTP::DAV::Utils::rearrange( + [ 'URL', 'NAMESPACE', 'PROPNAME', 'PROPVALUE', 'ACTION', 'NSABBR' ], + @p ); + + return $self->err('ERR_NULL_RESOURCE') + unless $self->get_workingresource(); + + my $resource; + if ($url) { + $url = $self->get_absolute_uri($url); + $resource = $self->new_resource( -uri => $url ); + } + else { + $resource = $self->get_workingresource(); + } + + # Make the call + my $resp = $resource->proppatch( + -namespace => $namespace, + -propname => $propname, + -propvalue => $propvalue, + -action => $action, + -nsabbr => $nsabbr + ); + + if ( $resp->is_success() ) { + $resource->build_ls($resource); + $self->ok( "proppatch " . $resource->get_uri() . " succeeded", $url ); + return $resource; + } + else { + return $self->err( 'ERR_RESP_FAIL', $resp->message(), $url ); + } +} + +###################################################################### +sub put { + my ( $self, @p ) = @_; + my ( $local, $url, $callback, $custom_headers ) + = HTTP::DAV::Utils::rearrange( [ 'LOCAL', 'URL', 'CALLBACK', 'HEADERS' ], @p ); + + if ( ref($local) eq "SCALAR" ) { + $self->_start_multi_op( 'put ' . ${$local}, $callback ); + $self->_put(@p); + } + else { + $self->_start_multi_op( 'put ' . $local, $callback ); + $local =~ s/\ /\\ /g; + my @globs = glob("$local"); + foreach my $file (@globs) { + print "Starting put of $file\n" if $HTTP::DAV::DEBUG > 1; + $self->_put( + -local => $file, + -url => $url, + -callback => $callback, + -headers => $custom_headers, + ); + } + } + $self->_end_multi_op(); + return $self->is_success; +} + +sub _put { + my ( $self, @p ) = @_; + my ( $local, $url, $custom_headers ) + = HTTP::DAV::Utils::rearrange( [ 'LOCAL', 'URL', 'HEADERS' ], @p ); + + return $self->err('ERR_WRONG_ARGS') + if ( !defined $local || $local eq "" ); + return $self->err('ERR_NULL_RESOURCE') + unless $self->get_workingresource(); + + # Check if they passed a reference to content rather than a filename. + my $content_ptr = ( ref($local) eq "SCALAR" ) ? 1 : 0; + + # Setup the resource based on the passed url + # Check if the remote resource exists and is a collection. + $url = $self->get_absolute_uri($url); + my $resource = $self->new_resource($url); + my $response = $resource->propfind( -depth => 0 ); + my $leaf_name; + if ( $response->is_success && $resource->is_collection && !$content_ptr ) + { + + # Add one / to the end of the collection + $url =~ s/\/*$//g; #Strip em + $url .= "/"; #Add one + $leaf_name = HTTP::DAV::Utils::get_leafname($local); + } + else { + $leaf_name = HTTP::DAV::Utils::get_leafname($url); + } + + my $target = $self->get_absolute_uri( $leaf_name, $url ); + + print "$local => $target ($url, $leaf_name)\n"; + + # PUT A DIRECTORY + if ( !$content_ptr && -d $local ) { + + # mkcol + # Return 0 if fail because the error will have already + # been set by the mkcol routine + if ( $self->mkcol($target, -headers => $custom_headers) ) { + if ( !opendir( DIR, $local ) ) { + $self->err( 'ERR_GENERIC', "chdir to \"$local\" failed: $!" ); + } + else { + my @files = readdir(DIR); + close DIR; + foreach my $file (@files) { + next if $file eq "."; + next if $file eq ".."; + my $progeny = "$local/$file"; + $progeny =~ s#//#/#g; # Fold down double slashes + $self->_put( + -local => $progeny, + -url => "$target/$file", + ); + } + } + } + + # PUT A FILE + } + else { + my $content = ""; + my $fail = 0; + if ($content_ptr) { + $content = $$local; + } + else { + if ( !CORE::open( F, $local ) ) { + $self->err( 'ERR_GENERIC', + "Couldn't open local file $local: $!" ); + $fail = 1; + } + else { + binmode F; + while () { $content .= $_; } + close F; + } + } + + if ( !$fail ) { + my $resource = $self->new_resource( -uri => $target ); + my $response = $resource->put($content,$custom_headers); + if ( $response->is_success ) { + $self->ok( "put $target (" . length($content) . " bytes)", + $target ); + } + else { + $self->err( 'ERR_RESP_FAIL', + "put failed " . $response->message(), $target ); + } + } + } +} + +###################################################################### +# UTILITY FUNCTION +# get_absolute_uri: +# Synopsis: $new_url = get_absolute_uri("/foo/bar") +# Takes a URI (or string) +# and returns the absolute URI based +# on the remote current working directory +sub get_absolute_uri { + my ( $self, @p ) = @_; + my ( $rel_uri, $base_uri ) + = HTTP::DAV::Utils::rearrange( [ 'REL_URI', 'BASE_URI' ], @p ); + + local $URI::URL::ABS_REMOTE_LEADING_DOTS = 1; + if ( !defined $base_uri ) { + $base_uri = $self->get_workingresource()->get_uri(); + } + + if ($base_uri) { + my $new_url = URI->new_abs( $rel_uri, $base_uri ); + return $new_url; + } + else { + $rel_uri; + } +} + +## Takes a $dav->get_globs(URI) +# Where URI may contain wildcards at the leaf level: +# URI: +# http://www.host.org/perldav/test*.html +# /perldav/test?.html +# test[12].html +# +# Performs a propfind to determine the url's that match +# +sub get_globs { + my ( $self, $url ) = @_; + my @urls = (); + my ( $left, $leafname ) = HTTP::DAV::Utils::split_leaf($url); + + # We need to unescape it because it may have been encoded. + $leafname = URI::Escape::uri_unescape($leafname); + + if ( $leafname =~ /[\*\?\[]/ ) { + my $resource = $self->new_resource( -uri => $left ); + my $resp = $resource->propfind( -depth => 1 ); + if ( $resp->is_error ) { + $self->err( 'ERR_RESP_FAIL', $resp->message(), $left ); + return (); + } + + $leafname = HTTP::DAV::Utils::glob2regex($leafname); + my $rl = $resource->get_resourcelist(); + if ($rl) { + my $match = 0; + + # We eval this because a bogus leafname could bomb the regex. + eval { + foreach my $progeny ( $rl->get_resources() ) + { + my $progeny_url = $progeny->get_uri; + my $progeny_leaf + = HTTP::DAV::Utils::get_leafname($progeny_url); + if ( $progeny_leaf =~ /^$leafname$/ ) { + print "Matched $progeny_url\n" + if $HTTP::DAV::DEBUG > 1; + $match++; + push( @urls, $progeny_url ); + } + else { + print "Skipped $progeny_url\n" + if $HTTP::DAV::DEBUG > 1; + } + } + }; + $self->err( 'ERR_GENERIC', "No match found" ) unless ($match); + } + } + else { + push( @urls, $url ); + } + + return @urls; +} + +sub what_happened { + my ($self, $url, $resource, $response) = @_; + + if (! $response->is_error()) { + return { success => 1 } + } + + my $error_type; + my $error_msg; + + # Method not allowed + if ($response->status_line =~ m{405}) { + $error_type = 'ERR_405'; + $error_msg = $response->status_line; + } + # 501 most probably means your LWP doesn't support SSL + elsif ($response->status_line =~ m{501}) { + $error_type = 'ERR_501'; + $error_msg = $response->status_line; + } + elsif ($response->www_authenticate) { + $error_type = 'ERR_UNAUTHORIZED'; + $error_msg = $response->www_authenticate; + } + elsif ( !$resource->is_dav_compliant ) { + $error_type = 'ERR_GENERIC'; + $error_msg = qq{The URL "$url" is not DAV enabled or not accessible.}; + } + else { + $error_type = 'ERR_RESP_FAIL'; + my $message = $response->message(); + $error_msg = qq{Could not access $url: $message}; + } + + return { + success => 0, + error_type => $error_type, + error_msg => $error_msg, + } + +} + +1; + +__END__ + + +=head1 NAME + +HTTP::DAV - A WebDAV client library for Perl5 + +=head1 SYNOPSIS + + # DAV script that connects to a webserver, safely makes + # a new directory and uploads all html files in + # the /tmp directory. + + use HTTP::DAV; + + $d = HTTP::DAV->new(); + $url = "http://host.org:8080/dav/"; + + $d->credentials( + -user => "pcollins", + -pass => "mypass", + -url => $url, + -realm => "DAV Realm" + ); + + $d->open( -url => $url ) + or die("Couldn't open $url: " .$d->message . "\n"); + + # Make a null lock on newdir + $d->lock( -url => "$url/newdir", -timeout => "10m" ) + or die "Won't put unless I can lock for 10 minutes\n"; + + # Make a new directory + $d->mkcol( -url => "$url/newdir" ) + or die "Couldn't make newdir at $url\n"; + + # Upload multiple files to newdir. + if ( $d->put( -local => "/tmp/*.html", -url => $url ) ) { + print "successfully uploaded multiple files to $url\n"; + } else { + print "put failed: " . $d->message . "\n"; + } + + $d->unlock( -url => $url ); + +=head1 DESCRIPTION + +HTTP::DAV is a Perl API for interacting with and modifying content on webservers using the WebDAV protocol. Now you can LOCK, DELETE and PUT files and much more on a DAV-enabled webserver. + +HTTP::DAV is part of the PerlDAV project hosted at http://www.webdav.org/perldav/ and has the following features: + +=over 4 + +=item * + +Full RFC2518 method support. OPTIONS, TRACE, GET, HEAD, DELETE, PUT, COPY, MOVE, PROPFIND, PROPPATCH, LOCK, UNLOCK. + +=item * + +A fully object-oriented API. + +=item * + +Recursive GET and PUT for site backups and other scripted transfers. + +=item * + +Transparent lock handling when performing LOCK/COPY/UNLOCK sequences. + +=item * + +http and https support (https requires the Crypt::SSLeay library). See INSTALLATION. + +=item * + +Basic AND Digest authentication support (Digest auth requires the MD5 library). See INSTALLATION. + +=item * + +C, a fully-functional ftp-style interface written on top of the HTTP::DAV API and bundled by default with the HTTP::DAV library. (If you've already installed HTTP::DAV, then dave will also have been installed (probably into /usr/local/bin). You can see it's man page by typing "perldoc dave" or going to http://www.webdav.org/perldav/dave/. + +=item * + +It is built on top of the popular LWP (Library for WWW access in Perl). This means that HTTP::DAV inherits proxy support, redirect handling, basic (and digest) authorization and many other HTTP operations. See C for more information. + +=item * + +Popular server support. HTTP::DAV has been tested against the following servers: mod_dav, IIS5, Xythos webfile server and mydocsonline. The library is growing an impressive interoperability suite which also serves as useful "sample scripts". See "make test" and t/*. + +=back + +C essentially has two API's, one which is accessed through this module directly (HTTP::DAV) and is a simple abstraction to the rest of the HTTP::DAV::* Classes. The other interface consists of the HTTP::DAV::* classes which if required allow you to get "down and dirty" with your DAV and HTTP interactions. + +The methods provided in C should do most of what you want. If, however, you need more control over the client's operations or need more info about the server's responses then you will need to understand the rest of the HTTP::DAV::* interfaces. A good place to start is with the C and C documentation. + +=head1 METHODS + +=head2 METHOD CALLING: Named vs Unnamed parameters + +You can pass parameters to C methods in one of two ways: named or unnamed. + +Named parameters provides for a simpler/easier to use interface. A named interface affords more readability and allows the developer to ignore a specific order on the parameters. (named parameters are also case insensitive) + +Each argument name is preceded by a dash. Neither case nor order matters in the argument list. -url, -Url, and -URL are all acceptable. In fact, only the first argument needs to begin with a dash. If a dash is present in the first argument, C assumes dashes for the subsequent ones. + +Each method can also be called with unnamed parameters which often makes sense for methods with only one parameter. But the developer will need to ensure that the parameters are passed in the correct order (as listed in the docs). + + Doc: method( -url=>$url, [-depth=>$depth] ) + Named: $d->method( -url=>$url, -depth=>$d ); # VALID + Named: $d->method( -Depth=>$d, -Url=>$url ); # VALID + Named: $d->method( Depth=>$d, Url=>$url ); # INVALID (needs -) + Named: $d->method( -Arg2=>$val2 ); # INVALID, ARG1 is not optional + Unnamed: $d->method( $val1 ); # VALID + Unnamed: $d->method( $val2,$val1 ); # INVALID, ARG1 must come first. + +IMPORTANT POINT!!!! If you specify a named parameter first but then forget for the second and third parameters, you WILL get weird things happen. E.g. this is bad: + + $d->method( -url=>$url, $arg2, $arg3 ); # BAD BAD BAD + +=head2 THINGS YOU NEED TO KNOW + +In all of the methods specified in L there are some common concepts you'll need to understand: + +=over 4 + +=item * URLs represent an absolute or relative URI. + + -url=>"host.org/dav_dir/" # Absolute + -url=>"/dav_dir/" # Relative + -url=>"file.txt" # Relative + +You can only use a relative URL if you have already "open"ed an absolute URL. + +The HTTP::DAV module now consistently uses the named parameter: URL. The lower-level HTTP::DAV::Resource interface inconsistently interchanges URL and URI. I'm working to resolve this, in the meantime, you'll just need to remember to use the right one by checking the documentation if you need to mix up your use of both interfaces. + +=item * GLOBS + +Some methods accept wildcards in the URL. A wildcard can be used to indicate that the command should perform the command on all Resources that match the wildcard. These wildcards are called GLOBS. + +The glob may contain the characters "*", "?" and the set operator "[...]" where ... contains multiple characters ([1t2]) or a range such ([1-5]). For the curious, the glob is converted to a regex and then matched: "*" to ".*", "?" to ".", and the [] is left untouched. + +It is important to note that globs only operate at the leaf-level. For instance "/my_dir/*/file.txt" is not a valid glob. + +If a glob matches no URL's the command will fail (which normally means returns 0). + +Globs are useful in conjunction with L to provide feedback as each operation completes. + +See the documentation for each method to determine whether it supports globbing. + +Globs are useful for interactive style applications (see the source code for C as an example). + +Example globs: + + $dav1->delete(-url=>"/my_dir/file[1-3]"); # Matches file1, file2, file3 + $dav1->delete(-url=>"/my_dir/file[1-3]*.txt");# Matches file1*.txt,file2*.txt,file3*.txt + $dav1->delete(-url=>"/my_dir/*/file.txt"); # Invalid. Can only match at leaf-level + +=item * CALLBACKS + +Callbacks are used by some methods (primarily get and put) to give the caller some insight as to how the operation is progressing. A callback allows you to define a subroutine as defined below and pass a reference (\&ref) to the method. + +The rationale behind the callback is that a recursive get/put or an operation against many files (using a C) can actually take a long time to complete. + +Example callback: + + $d->get( -url=>$url, -to=>$to, -callback=>\&mycallback ); + +Your callback function MUST accept arguments as follows: + sub cat_callback { + my($status,$mesg,$url,$so_far,$length,$data) = @_; + ... + } + +The C argument specifies whether the operation has succeeded (1), failed (0), or is in progress (-1). + +The C argument is a status message. The status message could contain any string and often contains useful error messages or success messages. + +The C the remote URL. + +The C, C - these parameters indicate how many bytes have been downloaded and how many we should expect. This is useful for doing "56% to go" style-gauges. + +The C parameter - is the actual data transferred. The C command uses this to print the data to the screen. This value will be empty for C. + +See the source code of C for a useful sample of how to setup a callback. + +Note that these arguments are NOT named parameters. + +All error messages set during a "multi-operation" request (for instance a recursive get/put) are also retrievable via the C function once the operation has completed. See C for more information. + +=back + +=head2 PUBLIC METHODS + +=over 4 + +=item B + +=item B + +Creates a new C client + + $d = HTTP::DAV->new(); + +The C<-useragent> parameter allows you to pass your own B and expects an C object. See the C program for an advanced example of a custom UserAgent that interactively prompts the user for their username and password. + +The C<-headers> parameter allows you to specify a list of headers to be sent along with all requests. This can be either a hashref like: + + { "X-My-Header" => "value", ... } + +or a L object. + +=item B + +sets authorization credentials for a C and/or C. + +When the client hits a protected resource it will check these credentials to see if either the C or C match the authorization response. + +Either C or C must be provided. + +returns no value + +Example: + + $d->credentials( -url=>'myhost.org:8080/test/', + -user=>'pcollins', + -pass=>'mypass'); + +=item B + +sets the debug level to C<$val>. 0=off 3=noisy. + +C<$val> default is 0. + +returns no value. + +When the value is greater than 1, the C module will log all of the client<=>server interactions into /tmp/perldav_debug.txt. + +=back + +=head2 DAV OPERATIONS + +For all of the following operations, URL can be absolute (http://host.org/dav/) or relative (../dir2/). The only operation that requires an absolute URL is open. + +=over 4 + +=item B + +copies one remote resource to another + +=over 4 + +=item C<-url> + +is the remote resource you'd like to copy. Mandatory + +=item C<-dest> + +is the remote target for the copy command. Mandatory + +=item C<-overwrite> + +optionally indicates whether the server should fail if the target exists. Valid values are "T" and "F" (1 and 0 are synonymous). Default is T. + +=item C<-depth> + +optionally indicates whether the server should do a recursive copy or not. Valid values are 0 and (1 or "infinity"). Default is "infinity" (1). + +=back + +The return value is always 1 or 0 indicating success or failure. + +Requires a working resource to be set before being called. See C. + +Note: if either C<'URL'> or C<'DEST'> are locked by this dav client, then the lock headers will be taken care of automatically. If the either of the two URL's are locked by someone else, the server should reject the request. + +B + + $d->open(-url=>"host.org/dav_dir/"); + +Recursively copy dir1/ to dir2/ + + $d->copy(-url=>"dir1/", -dest=>"dir2/"); + +Non-recursively and non-forcefully copy dir1/ to dir2/ + + $d->copy(-url=>"dir1/", -dest=>"dir2/",-overwrite=>0,-depth=>0); + +Create a copy of dir1/file.txt as dir2/file.txt + + $d->cwd(-url=>"dir1/"); + $d->copy("file.txt","../dir2"); + +Create a copy of file.txt as dir2/new_file.txt + + $d->copy("file.txt","/dav_dir/dir2/new_file.txt") + +=item B + +changes the remote working directory. + +This is synonymous to open except that the URL can be relative and may contain a C (the first match in a glob will be used). + + $d->open("host.org/dav_dir/dir1/"); + $d->cwd("../dir2"); + $d->cwd(-url=>"../dir1"); + +The return value is always 1 or 0 indicating success or failure. + +Requires a working resource to be set before being called. See C. + +You can not cwd to files, only collections (directories). + +=item B + +deletes a remote resource. + + $d->open("host.org/dav_dir/"); + $d->delete("index.html"); + $d->delete("./dir1"); + $d->delete(-url=>"/dav_dir/dir2/file*",-callback=>\&mycallback); + +=item C<-url> + +is the remote resource(s) you'd like to delete. It can be a file, directory or C. + +=item C<-callback> is a reference to a callback function which will be called everytime a file is deleted. This is mainly useful when used in conjunction with L deletes. See L + +The return value is always 1 or 0 indicating success or failure. + +Requires a working resource to be set before being called. See C. + +This command will recursively delete directories. BE CAREFUL of uninitialised file variables in situation like this: $d->delete("$dir/$file"). This will trash your $dir if $file is not set. + +=item B + +downloads the file or directory at C to the local location indicated by C. + +=over 4 + +=item C<-url> + +is the remote resource you'd like to get. It can be a file or directory or a "glob". + +=item C<-to> + +is where you'd like to put the remote resource. The -to parameter can be: + + - a B indicating where to save the contents. + + - a B. + + - a reference to a B into which the contents will be saved. + +If the C<-url> matches multiple files (via a glob or a directory download), then the C routine will return an error if you try to use a FileHandle reference or a scalar reference. + +=item C<-callback> + +is a reference to a callback function which will be called everytime a file is completed downloading. The idea of the callback function is that some recursive get's can take a very long time and the user may require some visual feedback. See L for an examples and how to use a callback. + +=back + +The return value of get is always 1 or 0 indicating whether the entire get sequence was a success or if there was ANY failures. For instance, in a recursive get, if the server couldn't open 1 of the 10 remote files, for whatever reason, then the return value will be 0. This is so that you can have your script call the C routine to handle error conditions. + +Previous versions of HTTP::DAV allowed the return value to be the file contents if no -to attribute was supplied. This functionality is deprecated. + +Requires a working resource to be set before being called. See C. + +B + + $d->open("host.org/dav_dir/"); + +Recursively get remote my_dir/ to . + + $d->get("my_dir/","."); + +Recursively get remote my_dir/ to /tmp/my_dir/ calling &mycallback($success,$mesg) everytime a file operation is completed. + + $d->get("my_dir","/tmp",\&mycallback); + +Get remote my_dir/index.html to /tmp/index.html + + $d->get(-url=>"/dav_dir/my_dir/index.html",-to=>"/tmp"); + +Get remote index.html to /tmp/index1.html + + $d->get("index.html","/tmp/index1.html"); + +Get remote index.html to a filehandle + + my $fh = new FileHandle; + $fh->open(">/tmp/index1.html"); + $d->get("index.html",\$fh); + +Get remote index.html as a scalar (into the string $file_contents): + + my $file_contents; + $d->get("index.html",\$file_contents); + +Get all of the files matching the globs file1* and file2*: + + $d->get("file[12]*","/tmp"); + +Get all of the files matching the glob file?.html: + + $d->get("file?.html","/tmp"); # downloads file1.html and file2.html but not file3.html or file1.txt + +Invalid glob: + + $d->get("/dav_dir/*/index.html","/tmp"); # Can not glob like this. + +=item B + +locks a resource. If URL is not specified, it will lock the current working resource (opened resource). + + $d->lock( -url => "index.html", + -owner => "Patrick Collins", + -depth => "infinity", + -scope => "exclusive", + -type => "write", + -timeout => "10h" ) + +See C lock() for details of the above parameters. + +The return value is always 1 or 0 indicating success or failure. + +Requires a working resource to be set before being called. See C. + +When you lock a resource, the lock is held against the current HTTP::DAV object. In fact, the locks are held in a C object. You can operate against all of the locks that you have created as follows: + + ## Print and unlock all locks that we own. + my $rl_obj = $d->get_lockedresourcelist(); + foreach $resource ( $rl_obj->get_resources() ) { + @locks = $resource->get_locks(-owned=>1); + foreach $lock ( @locks ) { + print $resource->get_uri . "\n"; + print $lock->as_string . "\n"; + } + ## Unlock them? + $resource->unlock; + } + +Typically, a simple $d->unlock($uri) will suffice. + +B + + $d->lock($uri, -timeout=>"1d"); + ... + $d->put("/tmp/index.html",$uri); + $d->unlock($uri); + +=item B + +make a remote collection (directory) + +The return value is always 1 or 0 indicating success or failure. + +Requires a working resource to be set before being called. See C. + + $d->open("host.org/dav_dir/"); + $d->mkcol("new_dir"); # Should succeed + $d->mkcol("/dav_dir/new_dir"); # Should succeed + $d->mkcol("/dav_dir/new_dir/xxx/yyy"); # Should fail + +=item B + +moves one remote resource to another + +=over 4 + +=item C<-url> + +is the remote resource you'd like to move. Mandatory + +=item C<-dest> + +is the remote target for the move command. Mandatory + +=item C<-overwrite> + +optionally indicates whether the server should fail if the target exists. Valid values are "T" and "F" (1 and 0 are synonymous). Default is T. + +=back + +Requires a working resource to be set before being called. See C. + +The return value is always 1 or 0 indicating success or failure. + +Note: if either C<'URL'> or C<'DEST'> are locked by this dav client, then the lock headers will be taken care of automatically. If either of the two URL's are locked by someone else, the server should reject the request. + +B + + $d->open(-url=>"host.org/dav_dir/"); + +move dir1/ to dir2/ + + $d->move(-url=>"dir1/", -dest=>"dir2/"); + +non-forcefully move dir1/ to dir2/ + + $d->move(-url=>"dir1/", -dest=>"dir2/",-overwrite=>0); + +Move dir1/file.txt to dir2/file.txt + + $d->cwd(-url=>"dir1/"); + $d->move("file.txt","../dir2"); + +move file.txt to dir2/new_file.txt + + $d->move("file.txt","/dav_dir/dir2/new_file.txt") + +=item B + +opens the directory (collection resource) at URL. + +open will perform a propfind against URL. If the server does not understand the request then the open will fail. + +Similarly, if the server indicates that the resource at URL is NOT a collection, the open command will fail. + +=item B + +Performs an OPTIONS request against the URL or the working resource if URL is not supplied. + +Requires a working resource to be set before being called. See C. + +The return value is a string of comma separated OPTIONS that the server states are legal for URL or undef otherwise. + +A fully compliant DAV server may offer as many methods as: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, COPY, MOVE, PROPFIND, PROPPATCH, LOCK, UNLOCK + +Note: IIS5 does not support PROPPATCH or LOCK on collections. + +Example: + + $options = $d->options($url); + print $options . "\n"; + if ($options=~ /\bPROPPATCH\b/) { + print "OK to proppatch\n"; + } + +Or, put more simply: + + if ( $d->options($url) =~ /\bPROPPATCH\b/ ) { + print "OK to proppatch\n"; + } + +=item B + +Perform a propfind against URL at DEPTH depth. + +C<-depth> can be used to specify how deep the propfind goes. "0" is collection only. "1" is collection and it's immediate members (This is the default value). "infinity" is the entire directory tree. Note that most DAV compliant servers deny "infinity" depth propfinds for security reasons. + +Requires a working resource to be set before being called. See C. + +The return value is an C object on success or 0 on failure. + +The Resource object can be used for interrogating properties or performing other operations. + + ## Print collection or content length + if ( $r=$d->propfind( -url=>"/my_dir", -depth=>1) ) { + if ( $r->is_collection ) { + print "Collection\n" + print $r->get_resourcelist->as_string . "\n" + } else { + print $r->get_property("getcontentlength") ."\n"; + } + } + +Please note that although you may set a different namespace for a property of a resource during a set_prop, HTTP::DAV currently ignores all XML namespaces so you will get clashes if two properties have the same name but in different namespaces. Currently this is unavoidable but I'm working on the solution. + +=item B + +If C<-action> equals "set" then we set a property named C<-propname> to C<-propvalue> in the namespace C<-namespace> for C<-url>. + +If C<-action> equals "remove" then we unset a property named C<-propname> in the namespace C<-namespace> for C<-url>. + +If no action is supplied then the default action is "set". + +The return value is an C object on success or 0 on failure. + +The Resource object can be used for interrogating properties or performing other operations. + +To explicitly set a namespace in which to set the propname then you can use the C<-namespace> and C<-nsabbr> (namespace abbreviation) parameters. But you're welcome to play around with DAV namespaces. + +Requires a working resource to be set before being called. See C. + +It is recommended that you use C and C instead of proppatch for readability. + +C simply calls Cset)> and C calls C"remove")> + +See C and C for examples. + +=item B + +uploads the files or directories at C<-local> to the remote destination at C<-url>. + +C<-local> points to a file, directory or series of files or directories (indicated by a glob). + +If the filename contains any of the characters `*', `?' or `[' it is a candidate for filename substitution, also known as ``globbing''. This word is then regarded as a pattern (``glob-pattern''), and replaced with an alphabetically sorted list of file names which match the pattern. + +One can upload/put a string by passing a reference to a scalar in the -local parameter. See example below. + +put requires a working resource to be set before being called. See C. + +The return value is always 1 or 0 indicating success or failure. + +See L for a description of what the optional callback parameter does. + +You can also pass a C<-headers> argument. That allows to specify custom HTTP headers. It can be either a hashref with header names and values, or a L object. + +B + +Put a string to the server: + + my $myfile = "This is the contents of a file to be uploaded\n"; + $d->put(-local=>\$myfile,-url=>"http://www.host.org/dav_dir/file.txt"); + +Put a local file to the server: + + $d->put(-local=>"/tmp/index.html",-url=>"http://www.host.org/dav_dir/"); + +Put a series of local files to the server: + + In these examples, /tmp contains file1.html, file1, file2.html, + file2.txt, file3.html, file2/ + + $d->put(-local=>"/tmp/file[12]*",-url=>"http://www.host.org/dav_dir/"); + + uploads file1.html, file1, file2.html, file2.txt and the directory file2/ to dav_dir/. + +=item B + +Sets a property named C<-propname> to C<-propvalue> in the namespace C<-namespace> for C<-url>. + +Requires a working resource to be set before being called. See C. + +The return value is an C object on success or 0 on failure. + +The Resource object can be used for interrogating properties or performing other operations. + +Example: + + if ( $r = $d->set_prop(-url=>$url, + -namespace=>"dave", + -propname=>"author", + -propvalue=>"Patrick Collins" + ) ) { + print "Author property set\n"; + } else { + print "set_prop failed:" . $d->message . "\n"; + } + +See the note in propfind about namespace support in HTTP::DAV. They're settable, but not readable. + + + +=item B + +forcefully steals any locks held against URL. + +steal will perform a propfind against URL and then, any locks that are found will be unlocked one by one regardless of whether we own them or not. + +Requires a working resource to be set before being called. See C. + +The return value is always 1 or 0 indicating success or failure. If multiple locks are found and unlocking one of them fails then the operation will be aborted. + + if ($d->steal()) { + print "Steal succeeded\n"; + } else { + print "Steal failed: ". $d->message() . "\n"; + } + +=item B + +unlocks any of our locks on URL. + +Requires a working resource to be set before being called. See C. + +The return value is always 1 or 0 indicating success or failure. + + if ($d->unlock()) { + print "Unlock succeeded\n"; + } else { + print "Unlock failed: ". $d->message() . "\n"; + } + +=item B + +Unsets a property named C<-propname> in the namespace C<-namespace> for C<-url>. +Requires a working resource to be set before being called. See C. + +The return value is an C object on success or 0 on failure. + +The Resource object can be used for interrogating properties or performing other operations. + +Example: + + if ( $r = $d->unset_prop(-url=>$url, + -namespace=>"dave", + -propname=>"author", + ) ) { + print "Author property was unset\n"; + } else { + print "set_prop failed:" . $d->message . "\n"; + } + +See the note in propfind about namespace support in HTTP::DAV. They're settable, but not readable. + +=back + +=head2 ACCESSOR METHODS + +=over 4 + +=item B + +Returns the clients' working C object. + +You may want to interact with the C object +to modify request headers or provide advanced authentication +procedures. See dave for an advanced authentication procedure. + +=item B + +Takes no arguments and returns the clients' last outgoing C object. + +You would only use this to inspect a request that has already occurred. + +If you would like to modify the C BEFORE the HTTP request takes place (for instance to add another header), you will need to get the C using C and interact with that. + +=item B + +Returns the currently "opened" or "working" resource (C). + +The working resource is changed whenever you open a url or use the cwd command. + +e.g. + $r = $d->get_workingresource + print "pwd: " . $r->get_uri . "\n"; + +=item B + +Returns the currently "opened" or "working" C. + +The working resource is changed whenever you open a url or use the cwd command. + + print "pwd: " . $d->get_workingurl . "\n"; + +=item B + +Returns an C object that represents all of the locks we've created using THIS dav client. + + print "pwd: " . $d->get_workingurl . "\n"; + +=item B + +This is a useful utility function which joins C and C and returns a new URI. + +If C is not supplied then the current working resource (as indicated by get_workingurl) is used. If C is not set and there is no current working resource the C will be returned. + +For instance: + $d->open("http://host.org/webdav/dir1/"); + + # Returns "http://host.org/webdav/dir2/" + $d->get_absolute_uri(-rel_uri=>"../dir2"); + + # Returns "http://x.org/dav/dir2/file.txt" + $d->get_absolute_uri(-rel_uri =>"dir2/file.txt", + ->base_uri=>"http://x.org/dav/"); + +Note that it subtly takes care of trailing slashes. + +=back + +=head2 ERROR HANDLING METHODS + +=over 4 + +=item B + +C gets the last success or error message. + +The return value is always a scalar (string) and will change everytime a dav operation is invoked (lock, cwd, put, etc). + +See also C for operations which contain multiple error messages. + +=item B + +Returns an @array of error messages that had been set during a multi-request operation. + +Some of C's operations perform multiple request to the server. At the time of writing only put and get are considered multi-request since they can operate recursively requiring many HTTP requests. + +In these situations you should check the errors array if to determine if any of the requests failed. + +The C function is used for multi-request operations and not to be confused with a multi-status server response. A multi-status server response is when the server responds with multiple error messages for a SINGLE request. To deal with multi-status responses, see C. + + # Recursive put + if (!$d->put( "/tmp/my_dir", $url ) ) { + # Get the overall message + print $d->message; + # Get the individual messages + foreach $err ( $d->errors ) { print " Error:$err\n" } + } + +=item B + +Returns the status of the last DAV operation performed through the HTTP::DAV interface. + +This value will always be the same as the value returned from an HTTP::DAV::method. For instance: + + # This will always evaluate to true + ($d->lock($url) eq $d->is_success) ? + +You may want to use the is_success method if you didn't capture the return value immediately. But in most circumstances you're better off just evaluating as follows: + if($d->lock($url)) { ... } + +=item B + +Takes no arguments and returns the last seen C object. + +You may want to use this if you have just called a propfind and need the individual error messages returned in a MultiStatus. + +If you find that you're using get_last_response() method a lot, you may be better off using the more advanced C interface and interacting with the HTTP::DAV::* interfaces directly as discussed in the intro. For instance, if you find that you're always wanting a detailed understanding of the server's response headers or messages, then you're probably better off using the C methods and interpreting the C directly. + +To perform detailed analysis of the server's response (if for instance you got back a multistatus response) you can call C which will return to you the most recent response object (always the result of the last operation, PUT, PROPFIND, etc). With the returned HTTP::DAV::Response object you can handle multi-status responses. + +For example: + + # Print all of the messages in a multistatus response + if (! $d->unlock($url) ) { + $response = $d->get_last_response(); + if ($response->is_multistatus() ) { + foreach $num ( 0 .. $response->response_count() ) { + ($err_code,$mesg,$url,$desc) = + $response->response_bynum($num); + print "$mesg ($err_code) for $url\n"; + } + } + } + +=back + +=head2 ADVANCED METHODS + +=over 4 + +=item B + +Creates a new resource object with which to play. +This is the preferred way of creating an C object if required. +Why? Because each Resource object needs to sit within a global HTTP::DAV client. +Also, because the new_resource routine checks the C locked resource +list before creating a new object. + + $dav->new_resource( -uri => "http://..." ); + +=item B + +Sets the current working resource to URL. + +You shouldn't need this method. Call open or cwd to set the working resource. + +You CAN call C but you will need to perform a +C immediately following it to ensure that the working +resource is valid. + +=back + +=head1 INSTALLATION, TODO, MAILING LISTS and REVISION HISTORY + +[OUTDATED] + +Please see the primary HTTP::DAV webpage at +(http://www.webdav.org/perldav/http-dav/) +or the README file in this library. + +=head1 SEE ALSO + +You'll want to also read: + +=over * + +=item C + +=item C + +=item C + +=back + +and maybe if you're more inquisitive: + +=over * + +=item C + +=item C + +=item C + +=item C + +=item C + +=item C + +=back + +=head1 AUTHOR AND COPYRIGHT + +This module is Copyright (C) 2001-2008 by + + Patrick Collins + G03 Gloucester Place, Kensington + Sydney, Australia + + Email: pcollins@cpan.org + Phone: +61 2 9663 4916 + +All rights reserved. + +Current co-maintainer of the module is Cosimo Streppone +for Opera Software ASA, L. + +You may distribute this module under the terms of either the +GNU General Public License or the Artistic License, +as specified in the Perl README file. + +=cut diff --git a/tests/ownCloud/t1.pl b/tests/ownCloud/t1.pl index 56191cd60c..8e1c5b46b5 100755 --- a/tests/ownCloud/t1.pl +++ b/tests/ownCloud/t1.pl @@ -7,6 +7,8 @@ # Copyright (C) by Klaas Freitag # +use lib "."; + use Carp::Assert; use Data::Dumper; use HTTP::DAV; @@ -110,7 +112,7 @@ sub csync( $$ ) my $cmd = "LD_LIBRARY_PATH=$ld_libpath $csync $local $url"; print "Starting: $cmd\n"; - system( $cmd ); + system( $cmd ) == 0 or die("CSync died!\n"); } # @@ -192,9 +194,11 @@ sub glob_put( $$$ ) foreach my $lfile( @puts ) { if( $lfile =~ /.*\/(.+)$/g ) { my $rfile = $1; - my $puturl = "$target/$rfile"; + my $puturl = "$target"."$rfile"; print " *** Putting $lfile to $puturl\n"; - $d->put( -local=>$lfile, -url=> $puturl ); + if( ! $d->put( -local=>$lfile, -url=> $puturl ) ) { + print " ### FAILED to put: ". $d->message . '\n'; + } } } } @@ -205,40 +209,51 @@ my $d = HTTP::DAV->new(); $d->credentials( -url=> $owncloud, -realm=>"ownCloud", -user=> $user, -pass=> $passwd ); -$d->DebugLevel(3); +# $d->DebugLevel(3); -my $remoteDir = "t1/"; +my $remoteDir = sprintf( "t1-%#.3o/", rand(1000) ); +print "Working in remote dir $remoteDir\n"; remoteDir( $d, $remoteDir ); # $d->open("localhost/oc/files/webdav.php/t1"); +print "Copy some files to the remote location\n"; remoteDir( $d, $remoteDir . "remoteToLocal1" ); +remoteDir( $d, $remoteDir . "remoteToLocal1/rtl1"); +remoteDir( $d, $remoteDir . "remoteToLocal1/rtl1/rtl11"); +remoteDir( $d, $remoteDir . "remoteToLocal1/rtl2"); # put some files remote. glob_put( $d, 'toremote1/*', $owncloud . $remoteDir . "remoteToLocal1/" ); +glob_put( $d, 'toremote1/rtl1/*', $owncloud . $remoteDir . "remoteToLocal1/rtl1/" ); +glob_put( $d, 'toremote1/rtl1/rtl11/*', $owncloud . $remoteDir . "remoteToLocal1/rtl1/rtl11/" ); +glob_put( $d, 'toremote1/rtl2/*', $owncloud . $remoteDir . "remoteToLocal1/rtl2/" ); my $localDir = "./t1"; +print "Create the local sync dir $localDir\n"; createLocalDir( $localDir ); # call csync, sync local t1 to remote t1 csync( $localDir, $remoteDir ); -print "\nNow assertions:\n"; - # Check if the files from toremote1 are now in t1/remoteToLocal1 # they should have taken the way via the ownCloud. +print "Assert the local file copy\n"; assertLocalDirs( "./toremote1", "$localDir/remoteToLocal1" ); # Check if the synced files from ownCloud have the same timestamp as the local ones. +print "\nNow assert remote 'toremote1' with local \"$localDir/remoteToLocal1\" :\n"; assertLocalAndRemoteDir( $d, "$localDir/remoteToLocal1", $remoteDir . "remoteToLocal1" ); # remove a local file. +print "\nRemove a local file\n"; unlink( "$localDir/remoteToLocal1/kernelcrash.txt" ); csync( $localDir, $remoteDir ); assertLocalAndRemoteDir( $d, "$localDir/remoteToLocal1", $remoteDir . "remoteToLocal1" ); # add local files to a new dir1 +print "\nAdd some more files to local:\n"; my $locDir = $localDir . "/fromLocal1"; mkdir( $locDir ); @@ -248,15 +263,30 @@ foreach my $file ( <./tolocal1/*> ) { copy( $file, $locDir ); } csync( $localDir, $remoteDir ); +print "\nAssert local and remote dirs.\n"; assertLocalAndRemoteDir( $d, $locDir, $remoteDir . "fromLocal1" ); # move a local file +print "\nMove a file locally.\n"; move( "$locDir/kramer.jpg", "$locDir/oldtimer.jpg" ); csync( $localDir, $remoteDir ); assertLocalAndRemoteDir( $d, $locDir, $remoteDir . "fromLocal1" ); +# move a local directory. +print "\nMove a local directory.\n"; +move( "$localDir/remoteToLocal1/rtl1", "$localDir/remoteToLocal1/rtlX"); +csync( $localDir, $remoteDir ); +assertLocalAndRemoteDir( $d, $locDir, $remoteDir . "fromLocal1" ); + +# remove a local dir +print "\nRemove a local directory.\n"; +localCleanup( "$localDir/remoteToLocal1/rtlX" ); +csync( $localDir, $remoteDir ); +assertLocalAndRemoteDir( $d, $locDir, $remoteDir . "fromLocal1" ); + + print "\n###########################################\n"; -print " all cool - tests succeeded.\n"; +print " all cool - tests succeeded in $remoteDir.\n"; print "###########################################\n"; print "\nInterrupt before cleanup in 4 seconds...\n"; diff --git a/tests/ownCloud/toremote1/rtl1/La cédille b/tests/ownCloud/toremote1/rtl1/La cédille new file mode 100644 index 0000000000..055dab2542 --- /dev/null +++ b/tests/ownCloud/toremote1/rtl1/La cédille @@ -0,0 +1 @@ +A new text. diff --git a/tests/ownCloud/toremote1/rtl11/quitte.pdf b/tests/ownCloud/toremote1/rtl11/quitte.pdf new file mode 100644 index 0000000000000000000000000000000000000000..df5495f0a5e449cfe419eb0d38d52a08f71ae514 GIT binary patch literal 121780 zcmb4}Q>-w|x}=wF+qV5J+qP}nwr$(CZQHi_EziIA%$_-uoSSpiovy1+x|8>*DpGl2 zQCdbi7Fa0Kq2i(Lq1K^1SSTg}1_C=nOIRo#9s+u46I(N9a{}gn&Jj7?ynczI!=oSYp^3~XSb+_P_VrXq>Ck#^Xh`P~0RWhN)fwQJj_ zOnpMbJ^?@ZYrstJOyB8ksCaVBDHw~(c3Gtt6cjYsl%Yg&Jixhx{d)ht-U+##>rNY} zhoZZsdp$Mc`2KDk(ED+HT|M!A=k5JId~aRF-R*@wm~cri?ejey)rIlp%?vox4;_r{ z!S^|zt_{Wc`Tnx?ssDoh_Vqcx9!=acg^}MLML_@Fe&-z=WiZkkx$}h5(;ZBp_KcxX^NX!%EYi)bsvyf4rTz*NR{=y0dUEi58g*-@~ci^S#Jo zs~HS6Qxa8?8<{H`C4GcH2ofr`DwO|Pj(+whhgMW*so335)jhD@8>}09;tOGoruT6V zEq1?~wZJv?bvQYZtuG;NjJp_&i%H-at&TY7djS*X`9S{r^@q853=3-`q&|8gmXmHS z15X#H0_og1w4PR}xDIm&S;;$4So#?8&4}!m{o0JFDWj<=a%?jx=AXMjL`7(w9|)JB zw(h%eIe`Gho}%gxOLP<3_7XEiZ$ki??&^<43JE1Jkn?XVQHIjWRy#x5w&J*+MjS{R%wLaf-UIp@x3Gr?1Lc8RTVCV^^cBRT3JFmwRZYTP_pH=2C`cw`h zJU)W%cT3IS5AmiN2X)uH5n{6@h?YY}ZeRKL9M*MDQEcjzEBPzH0?45YVfK0i{HW!_ z8M)-FC&>Y-5QD4OCx>+yeADqja)XUN*bXTFtb>Tb?;A$c4MxjsZH@5d6& z0@jfm6k+u@+4+mCq}Bt){UJ?|89|OdgDJd?n3+dM$X|g{S`RpVa?{@K*zuRz^3X)N zR}5+%5{x$fl;jam<`CnNPuj38oD@-U$ul%vJVJj0o8wROz!T0=ZAmX)W?uFVy17c> zYB{op#sbDSP$;;jlY*^c`oqXkR1SfLUFbV#Kwn!MCAr=CRW8hvqt?aGTs{LK9UCLs zk^#vIsGtPnH`;I9!9Dy%J^UJNh;1rYli-whQ0+vtc8__EAj`mSCJRD;fUFoL;z;ND z{bz$}70IXsBF6{tN4bAPj}5lJ!T>BL4dsaDfth<)Bk@IcA9u|I*qtvIdME8+4`^K{stT&Q195+=)8$aEqOeD+LuT_s*ZTDNhUNgSfH zrW+wTo+uiDi^4y(gA_u17lqqn;+FWXWE0!Xwt}ngvy+U zWMI-DxYj@?h__dBEl*C)L1sqn9F5{;yMUcY^Bq$!#Wg{7 zH_i+3Z}8OF73|~~#5}Ul<~u8U0!=dsC~vJ zWZR9=5_zkC$%HG&|2QCnL)3}Sn*2Z!#tx)stBYn(XN;IBVAj`TH4;rIiVu{GuNuOU zkYd6txh6~DTefYe{mwf5wFX@HD4`e3gn}u99sz*KlBUo}=H>L|Y)ja$Gn-a>R1i7M z77rA1lN8EvKuMO)5n_VzDJS}hNXhtnbmu>BN3dk3gKAp*$@P)*tvupuM>Fp|hJ4K- zC-o?=&GU&rJzJ$(>M3PhnP8PoNE$vjubcAE_uG^b{4rZe7|FR!>09nN zxsun421m}Rq~vr)dqxI6-p0)s$x(oy0%iFI>JY-Tf$@-@kgSW z@?cj5g5$n|pvh|b)h@+1y!4QFfXzbhn~7-)hloZEHk0YXd_{y5W-K;!&`1cbcwB$D z7*J(6a+6i1;8IsbLS1Gk7Vj!R4g|&dz0t&n5#J z%^2Kjj&3d_Im<*D76%09K231BOx;m6R2x-&?$1TJe(sCz$zC-;&Nw$44ilebnxMQ2 zYwDFhYDSdcAif@qE8~SA*AkKW4w-XCAgmG7b-#hcOS)&^Fdnj}uNe~dJ=jEo{`FeL zGAdl8hBi%+5P;cMAtzy%)o?J{Np%s{1X=9m$#sgXqAT-BUgP0f_4MJS=Av=K69l2E z@lX5mWch)*b}zQmOUlBu4F{Yp#eOYR1Nov?o#c0iQFHavv$)l4^B@-yVO$Dlk&xSF z7BOgfgy9Se4=CR8&7`Km!@Vf6a@g7l|A#Lm&2#m%hPm9tTtYe0RUVfz5~F4c`1Y_5 zme>1=bx}*>;pxt$f){sUk&zNT7A>hvCI)WCPoMy$ea@Hzf=(Wfojx+5uxD1TO3$V> znV2Hjt&2^C@YV^rf)TN)d@ZQ5>NT@lA;vTMPQ1*owvky%N|*a+4)NoKC0SiNV^k=t zzOQ(ZO5@|qHXdmJ?lcOk%^Gd!O40h6_1hD&8(u~h8c}L&b3=jjCD0*vjZ?Nn3{=n+ z*7bT3x<}bJEb$2`I5ENcM!vx7xah*o<5bOtsz;M;YO{C_3rNBTjewSIAyGirXeGoT zGE|G73t{Z=gQam)FS!U?H0U)o6?Y8&Fqdjy?uUx2AbFhmIHuX2r+A^kMKPMLMZN^6 zGv!Y*_I79H;Z01i*)0lN;!CSRV9;{C{99}a5P_ma`YvbSOKh;c1qa4jfdLl^450)K z#(id6l_?+_P$(;jpGRH1n5dt6(2}g?GncA(kqD;9xWyqA$`G+s0mKN{HB*x@HM5*L zTV!$|VS1<4nJ0tQ=nkn`sj=~S);_+Xc7>@>mtf73g1$7 zL;DRPa1B(RH(c+!F{*S%MxWau`C(XR3}l;G3*$%*eW4VgotOm`h^Ruh*I5roX&Vnj zVL5ZJe*6M_t*f16BgfR^HEggT%vUQe3x-UK#p7UdVoXlx{%?fjrY2Ea;3JW9nh15b^6kn0*@_JjN#@Zf`L`?Cj z{+(IpO(QMq2Sc_iL;X)x5j|+cz5A&x;5I5m-SBe?5Qrs@!|OyU1BEWO^%s%AcaJTj zND8d837jVqj~?(;7}5{9hY={1}ml@5pexDoMs9Z zC@g~{b{>bj7t+jvyfrFn!@0H*^DJuo4f%;1G(@vVj0(ZEtA5nKrKtxgf_OHSu*gRT zwki&E9y2ZgZ%>9Ds)6a3MK`ok;-1(*p7JxC9drvIhC4lx=O#*7Fjwm`{@p7L)L^6_ zPAcd%2B+9bD$>~rj~K5zu2R-r-U_U`mbm64Z^@GLzinKrRv$}I{aY#hO2Az^{ga8d zQg$FB!?UJUtL3LC^G75KOD{3lkr}X^c)-=^=Gjp}mAkcmV;SZt(@HV1#5fOt;rcuszmE;89)7%SV+gJDc(^y6rxJnys?L?TYnn^^i*_I zA3tCmKqe`QB_bo$LXRtwYZT6der4c_u^`x@j2uFGz`h884aTU)5fan_pUFg2KnE_@ z=Rrgu_H!N8G-bxLc6<3VNB~V%JA}COl$j5p1tQt@`e^^;SGFQ^d!0VM-oEw~r4D|E zve*%~OnJAy2a#`A5Y>!GnpE(r81SSw-p2^>1F3+Z-=-3I{be7sX3u9@U zNpSXHpjhI*FK-NZ*|dMd{THe_jLJAR4jV&n&;oT(4wvz!>bB3j-$fH0oHkv$gF6y1 zvXa5XCA_!+uCT=<^1fO2G%n--+Qo>(it1&PZ3oSuP$()Lxu8Sip)Wttyv|E;DWbY4 zf*q{4a6Lhm)_c8XP8mhwEJ9MmR+oTqC416p(M5`PtA|eePfIVn9f7n)^q^iQa(k)# zMY;jmpID@{wf$J_4Vv-hQmSGX!);ymfo4$<^KDRT70;y_Ah>a^D!VP(GD33}TU?OQ zTTrBBlodQgF4t|F$(-p+L;+NKtZ2P$N7+i2PpksaI|mR!NKN5Acxv<$gP0arK`@ku$b{^C z)(j&8+k|z=!(G3Vx1R?MLPIPQC5q(@9kwYE2K4c>{+a-9_IfMdb?-tgYU(TL;|ka3 zNyNV{qWVV+d@u7xfZup~N3u+qhMu`g>h0n=3iNO?6VK(Hy4kRLyj79e&W4+oUVaT4 zdXNwMjUFmQo^RcXMyiRh=E4wW2}COOtSa+Rm;P!7l#MOi(x&QZwv*|W^lb~M{3^g> zcxn@%IW-XF3gdUq<{;@3TY!iO3MBSRsPIWwz6iO(q7nlBc_?|arp!UWTRLO9A;DB# z*5Zqpv@P?BM0ceix4T~az2XzYI_ThEe0$UwB8vCm8);#cNwMg%_QVm`X_4i93B$CS zYv^*ZL5)zefASI*gd(|y9b;A@C{refJxZKLfofGSuW6oUnAeAoeXqxp^dupYjM&|{>D6}a^*Xw1E>TxAqb2SicsBR*o`f$&v>YYb8 z)E;CzP$a+k!}Z~8hG`d8EP{I-)^mwJw+`Tw^)}5-Y>oe85B;tR%h|~2*@1nkf9s-L|L*>L zTHERSY4|*P9eci;`}O{I{Ca(vLU=o}#R+qsYxBGN@o3<-dL6pmvg^vT{_F8}^H!%< z+9L&D-1lR=J(gm?cS8Mh6gl^czu0$hl-cr`PCxdw@7-lc>$PHh8fWFyGgVU6+ihE| z=keK&vBYE72KT>ONigk5`u={AEVY`~V70$4+)p$4o@wbX+Embml zfQj%UVQLb;DR9bp^rZY6JL#+&hum*6NBPK^nE_=-d?$h)*Nd^t+h*K|`{W_)dk4(51n;x9n?<=QAWs_t>pgrd|X|$=0{4P^V$P6k_?=7qnNgj&4gf2Z7FvTVBBVuw2xqBCtbmJ?BAx?%&_LL>#3N4(p zyEP;4rRAnzMQtd5sa75iKvxP^IF$I~vakL@ic`nMVa(J=lY9+~DV$mDZO9PZNCIG} zZ|!Cyf$^~Bqe@o}+4}sZHNHQz-rZbl@k5$zOcJfC9hOOEkOZ0WhMibM1byQ>JYEbU zZ9J{=?Rc=8C#0w8?1*XV?NmL`x!%+F#_vgW2l_^Vr^mxKxnKRgg!!7{ab`Z?`n)G5 zLQ`U^H0*mz2=OtzF~Q>IRn|K$96EBE;Ljc>-hL3PYOJ6}Ne}gu(b%O3JX-W=#lKG} zO%%ZRSJWs)Sf!Zd#!KavVA{8yRIpspMzxXhRSv$-W;M5ZQ%|srf-69WBSFm>#H2(< zbRj83`_b*J{oY7x33c15K?uq~Sfrm7Z!7JT&#U4N5c!Qp06VbSX@RwEaEw;BP&`klFvSi6CPi2ao- zKw~a9h~@+l^b%d}utCMYcGge^D`ocb^Rz6uGwP$t?wqyE(+cJHdWcZW6?8^63LUPZ z@&z7?{`K<};c011irGs5%It3%RHdqAqhvV``RtV)m^~@nX@)k<*7@W6{&r_bYABN| zEi~fI_g(G%a8fn?9yBL;eEUXtSO@TC@eUT|D#o5CGNh*hpbkQ+)C$Fs%^)RG$C{BU zrSK5CD2V2nxb{~ zfM=}=RV1EjDCGv?!ye>-WUU;Cn$~se#Wlay8k;a9`Gl;*b19BMj~iQ-$bVvIThI{* z1>l4Cvmq+EnzY*y-K}N-5Qm0#Z1R${!I%ycaR9R;2P_v-z?|=JZ3j@`3pHhYA0-|b z<7Nws?dAjORmX)%1e3ehyRnu7a-m}w5sYwT}T#y&=F<~ z$)~w|SLan|(>pKsK@kw=<_%W8>5?H3d~KjGEpPzC6XV(J*zeJ!>_k@_rLWnOlOiwG zJd>l9|8SGr2=r}(C76bxxw1g~HdE_$?y(G=&>69*u#`002S-F_WyD@sPHD9ckXN;K zcPI>ssst)8UAhdAck$rMAlWC0lqX(EHil55GDV29(M)_JI(2x|G1wRs(c-eOMi7_P zSa!D^0x4VS&Z30B=+2jLTYk}MP7v7c_%@Cerf7hL?O)~Z$tp{GYq94+=~zt+1Mje% z*N#Uh&6CxDT>1fNQnb`ls0WoC)KrkPT92{NcD;bFC71 zyG%>K02`a2I`ED%u>99=Gy!5|}#TGBKV4l?-492haq*(2w75LS4rExmBCGi0uo>Krs+1U{LQ zSS{+DiZ#{h)#ah!L8MfCnP2;K^|kP$>cB`^rQl)QLTZI~dT7Uj)Ub9IxWsDZdt4=O zoF{=B;nva(iW(^BH;e#h`d2Y3$CYq{whVuu&c+-TWecC>NuC6b3J&IYPcqGi0T%eo z_PSrCnx{+fC{DiGiz-A;u*NOr{dZP*^XY}RYY>5_DAGxF zfn835!pbN6(_;n?Zv`fe)+ZKE?4dY@Nzqny5{Yz#O0p+@n?}!>5EDpU+Dgn4)`9`U zQAPic`m)i83j(Bsh1G-WF5?tsl!nwU=tLY>M5NblYNwCIQ)%hlLeH9MC&Ma?pb=q-I)K1~Cu*cstozOsj4h3%|mUzgdXAbEsm642G4||hq2JwEd^<0uS|R0mbaoVF%dC0TVBsHCt!SUKy(;Ary3)$r+`#9SS{-p zb@eF8Bhw@VB2vHpQLib1)&JgcPQ?!Q$(l7Bpu@w94+?T7QlIInh7Aax_=gwu8ic1!EOS*=WSBg=95srM5UEB&Wd3xta za47il7wiA-_J3%UK-_=Izil+RV?9a1I!jrM1HU9v%&wqk??=e;`Qv+qqf_+pil4%N zXvg>!zo8yS_VnGLF0h+WxX93~_}k;i19ohzf8`KKu_qNtNH|*7zN<`V9_P4tW_K*+fOg?$!CK?)k!kGe^~gZuq_Kk5rR zVBkp~YLAA$W$=2c$NBj>JGk@X{5reAKl1bY`8BsPUy220Z%e@(Z zfj>G}>x1iqJ+%wd^ZWX8h~)e1c`?0ri0-kYgYWfSN@kyVy2^SAilHC&`?g63Ps`1C zzJC4~P9rz+WGW$-@O*Te@i?yxZ^f+MFA& zGacWH7BX|iS`wzTaK&s6Ts;6oR{SQoaLxF=7(D_KSE;dHVnp5DZBhF7_a)1BIHF{v zQW$Q8e=;>7WR$%9k8=~wIF?rOa<7Io1-7B3L`s@tyQY6fcqsx6O?0D$er8gy z&JpD#=YVwMjVlj?nYQY_Zur0EV=aRS@3#kl4jpAU@9Sey+X*PPrV>ZTL1;Q0(v+D; z$ku`kFA#AYG8l}uyCLpO$wb1&E-+H++6+VeIP8&kwXQ1)P1UYIJUO*Nz=d|pB#2eH zJ|C(0{o%3U=O`RZ@+(Tq>RV2li;eF}^SZG8p(tf6X=dia*H+6Yu7w7y)l``Tdxm!h z!i@I<_;4Iz+WekGH(5@a`Bcb@?l{BzD_XfVR$f)%?v^wz{FO0l&Js5LY z61s?pv<$6`H!fPFAz2f0yT^i$#2FEzB7NkUzFD%VONP=xr_q$M;TOSmui5^tBzlP7 zsr!Z+Ed15-!xVfvG+{x>P`hBrd*JS$@y$TZG&e^*5+R0jwnNMtN^cYB^;oJR6H_X$ zxh^?M6Y|wd5)Re%q{IDs>1&(gA%klq1iT_{VkG^bzqtx9QS$9uN+XyZxmwnzmAO}2 zorG2j*$1f|H%#C2OqsLCK_pL~Rvt!Mjm|CI*sDF)8lzU+Vh)`8R{6f!=&G0;b~J7) zB=-6M)veeR+6^S~YOBO9P)MSpq*G=)#4z`Qa;s6GL!N8Fykt1Y%e?x$nlu$)cH>0?){QlOGtAY$?8iXC+d&1-wsx_Z^v)hSifi#xec?+c(} zB`Beiq|edg4{}II*3%3HtsF)_KVv%rJ z#d+*#K?ohN`EkG*g~&@X+sOtQ<^FylGxjGSfgh}VGCgNSSwj7f-N6yI5ru1%iOONF zt3w_K87;8?YOa&W6hxLZBo~Yni!}QnzkUdt%+PhTmO&J?3RPSQjgnQ-NZfVs#6SXn zb=PgJ!z)|x(b$erw~w${WDt$QhxbC*;_ zlu;Yl%Z{Nqcvd=$DC!poOc2ypHkomx7W=4WYE8&!@s81^VNt&J=`3TYsfH#P+Q((C zZIhFQzs7uibStoED)^<3(mI*;eEA~J~nG)EyIWm^u%d$i~x+1 zbG5^GjghGmuov6aES>}U0!kAwEMq(>A&8-5N{AsgLPTqDkO(Agunhl(3Zr$cBv`U> zJ#P!UD&rgIBz0^cv4QdkDE~qTlBKFS{+$G3y=VwW(o$$;xZYzZl0{+haBKm~_pGJB z%CVZU(zS4WWdW^ofbb#CsOTYJQb&((7X+6e!=%Nc`D;(HQrb{%H}(BATqcxJI4u(j zJlkc4Q3KS-(DXSjjjKH(*5br2B3heFQVc$_yIl$(f2&aAVCfwyIVTvBR>#tsy~2zmIHTeK;3pKtLcbH!4SxhttH-ZD zjSin>ea!r9=ijjAk_q+cPHLoj+2V2zADB#*S$OkKK;x`LYN}yDSzSPDb{FLqCk8Iz zIc1^^jo?=uutn9mn@0IF@vlR#rg=LBn!RiCxEa6?uE{%>W}sbf@=U8HzI=Fs&UNlr zp5qyv#|I$yL%=h+t%ePp4RKUGTj(SIia<>(492%6xrKhV7dVz^y366aU~Ypegd4=BMX}Y2AibB9 z+9AP1?n2s;wri%OD&(asH^PQ2{oDt$v*)2po~(w8AeET|h`{60a*hQ~2pq?UnFt(W zVG}>M+YZ>+g{Ktu8P?L1vzO*eINh8IRz}@q4;IN%S0P@B`*O)QGZpQd`b;YMk(f-{SB*HrYIMATX@R)kaRk8agF1tSh1` zm+eOEP0*avhvDc8h!l1RLlkt3pXZ^`r)Y(8oCl3A>>6;jAxR7=UfsNq$iW>eg7w??c)>Q*>GI^PN|8@GYa!@1XcF0L|uJc;Pi`w zgYe3$Hb|p}8_h@|9j~oL(jfFP1wULYwIkLq%Bqb(>_%DwlKq37Mxw91 zY!}-RwJ{?1RiuH2t7w5r*AL8d32Rd~wdx#&pL6rG+>ndQ4^_$Cla&W_QWjli@^SRY zH%f`9*LK5%zF^VzXA#F8JFepn)(2P<2k(KQWBRa>s8pZVm+RFO_6og$ z0A2A59CMLp?uY0=bHluGl@xvXi#&u3adGaJa`!z6UKv~S8?djZ?EtBodE|7{V4<8Q55&| zZZ}QX-mk;oEj_s3jvvOK&u=}wzU*F~Z>G?+3kDgZ?$fP3c)y=`v=@D?iuU4H`#}dp^rDcZ4doE%-@HonZ9DHYpM1h!?HNNRP?;s zj8?aYv-G7gdS1SHFmqRBQoZ)t{ATd3xZy03)v+YA&k?j5~B`hQ)Zn-h%%Nz z0aih~_U;-_Z~km(bQPp??c5T~OdWrw_9kEZI{dz1ruKN%MVJfnG|}$llhue>=?6cy zUSzKe713I{f&)(xmZq!uj6*aPS!iuPWCdt=)3N2P+;&Eh9&W5O(m!Wu=DJq8OGkn( zi&_oq?7e~JePFn z5>=?Ld1jM~ilpSotDIQ~Cl)0x5f`x=S@hcOno}jRri^JG7Hn zwPH}INs&O)iKn5E4`Z4J^%|#>jY9i-a!{drGtqC)!M4IsT;+ZKHK9R1P&xvbC1kyN z7%t8u^^&}s#DhM-6;rb<*#3O7N)Oo#;4UOOq4;Rvaz2}OfCkK@?9y+VT!F#Y6{za;YBR9iSUIEs%2`evMS4eu}Yro#c@Sr~6ZLB)&uBi0VAy z<8jGo(ZXmVLcbkBF><9=wHKKdX0CWnpbxDMi}3UCnXXWMuB6I9=l;+nu|`4RFmzO3 z#h^b?3@YYsoCs+i|1}x{nc;D$0=zh10p@?+0-~R4ky(yRN1(pCZSn2N3hc~n+X9e3 zl^~OQ1-ixwSh9V}Sz8IMNF>3M#_1Gu8fb#%log-XJHgb3CnTvoIn+q?Mpe>et>cKp zKkAoCL`5{Dgo7i$XB6RK7vG@d)V^UawQ3GGhM36uL=I_(?9AEsTbyLT3hrGR7-$Ba zkYuhd*0|Uzft85>Em?gzXo1r$3hCg(Y`Ym@Y~dxO4l6o?m91>A9Mpfe!1r_ppSl+L z8e|Bd2YB1#@q9mtBJ@vi<*Bxe^ww)>@ht0z#?Q*HpO2wgMPzEQBE7~T?~Y&?Q>L87 z@o|p|(H;!!jlf)%0A{1&gw*22punYdA`058`6c2G&8NOD+`ZW#C+xXMA-ADKNb6UIk1g!`R+VqxtD zMKq#Em58T@!ZlEAf)J=$J_dk9x*Xa)+DRI9D}zR^;&|DKsU4#lgtgm2%ZDD{zDI46 zE$ss<;P>lcO5A|N-_Q{SGF?OyYeCAQlC#o1waOmGD3nMFnIuQy1X2{e{(5PKpukoQ z1+Ih)!weMZ`?@fkk*spwITOJP5DhBA^u!*pmD0a;WI3w(g{CY;i#<7u5q{K9W6^z? zr^cOXI%rfeNkV^sa)+hd*rinRGeqPyF%eR8U_WDkv?sCknB|AzdvX6lqt!%WMJ+H( zngAmyzYWzYa)wgGc69)7 z6G^I)HJ>%V1|S!VN(exM35h))&p*8Yot~n9$rmROg)AD-FLS5EoH^kgAvn4{D2_ zlBV->MSqD{;wBfx3@k)2fq))ec64SLRIb3>_>U|g(gzL@XgJ7VI6Tm*b=fj-ctu4` zkwrIDb{4o7!$03~+4!#c$GIed%{tz)WKINJd88t2Sli0-{AN{6|F0@wUmL~liSn|N zvm|9*A!>Ca2n&v%DKZ_qR_(QLp-Y^7pL_xSBC%_YDmSqCx9{@b9dfmdj8E~Sdjyk zXadKMs;wS0hElqWAl%L(Nk}&~&8Nm;IOg1@zz9^0mguKWJJ`Ds^KxZJFk9O)^>^1z zLRoz-Ll_)T%xVkR0{8|RI$|%FsgsqOk0dksN7D;&i`qR+HKKk!-m!%6`#|=+K9$Gk z@T}z-lkiu(Jy3{*;Tg=JN?i^!|A9`N%1iR*)6=NsZT;Nb>xQcRen%}Vky01YH}OY z{?^%XE|EeNP~cUxdl1C*(zC1Z5~zu5W(NA&6L<7V zDtJHZBS#x9#ni${zlXlJ)y7(4PedW;xHDghgB%23gIc=^>MP70k>Z`^Y-Y`C@(*`J zQNw3dNL63sQV6eUNbcntSb=J}FT%2(Q^l_irLu^1S$ue8>ZTu7$6#~{@ru{QgkdWD z(=Uo899W!NZ5A&qe8g@GJhiJ2h>2Q@r33KW@Y!oh7{H7;r1FXz$JD`vI>VV~<=eq| ze(_r>uwV6m&3~VuGCPC`1HB0C`BOw0>WQqrAfFc;i{3KISEc7!gc;9131fbBS>mzz zhKIklwYgwdPw0RuIU#v^>)+i1YH&6$G1G_)&*SIM0Gd8kc5T1aw85ZeCjIDPVdt$? z7Z5CZkCJNkign8j?eQ*5g}az*`&tg9dm04O_I#c58cfi+nDhaY{Y!rfXLHAF+_K&A zys=?s&Yxb3H{|Kg2E>WV0Tu=~_5bO1V^jQxp)t4rbzvPFy-RZSTa2xvGgt!<4 z<~HTQr%r6#w`xYeC(q-AYOM!w8b$^7z7DP6jRh-<`kX4mN)2oS>tiDBa)mjMp`>EY zgT+s@s1oQfRQ9LdK}*MAT8M8-!)6okTK@SM^dSZ`tH>tRF1ZFbOh|OjtGOo6?mXL z!ABu~3>Ass%t3H3%`W>eA@+|v$}L9_8uuWYZ@T$j8<{H~48DEB-&%3!+cHreUI1XF zoeR-|p1(s*>#Qi)xJyvE7;SnQ8bQUAGcGT46o7gFu3fsja|%+cSd-zyMtoXwUi0_W zA=SrC?)3!=5hQN8-Y3ayv`&ODSNsBX6_p6Rg9^qm5jgu7lj8bqrW zbTRsyFI|mIvI94^{|!4EwgZFsXN0L7-c8J}eBf>*}P;B$KB zKEU(QhpX9)6SR~elrPas5Po`%1GAB@eVHCAWG(akv1bj>sztg5JJ20-T*{(@)N8U|cGmu>k3xVndT3biK#78-FI2g09@AfB8mGbKRums}j|D z*;&$>_+8#)awamDb4)97?{9eEVZN>6-)if9Gc7!0G+Zi^zfw5L)egl*CGV1pX!EWF zr`s;^t|fV*1V9I(pAm@+aY(ZxkVoTcN{Al!*Q>(dS>I`>T9B)>rz9OhD|H(z8UIXi zcr}GdXpQcb;Whj5<)02KnR!Ise+#z%2G##dwjAvLAK9|}cVzpoYU}@mY^NfrIgxhs z+JE<5=q;Zo(OFz|A|+@pAGdrnfv%AD-%&N98fSTny*&-=jZL4vRhH0a@=u4 zrZ4#R`o2GnWlu+PJ1e{%${5$vE}qZ!31&1_+3R`RwJ9LH%U2`jEnbhLOrkW)E;Oa%j$@>Zj`Xw$pk9PMN$F&sKS^31iG zWj;i=%cnzaXkik(T8O1#4E$9Gx{ALN=5|D+Vgya5jjv>&;%sc`jrPPN$j4WXqUlKQ$3hQ`*QJ`bDU0=@2Vx_m72(GbQjr! zK*{w16S@>33O~yq3Y!u*vlUdxF4qeZbh^fyxghiB%B00`f&6QPNE${HCm={4{)2ip4WarH6gnYtH_k=7Y<&$E zQkE}NbGm0g7h<5E2t}XKV53^3g-2`XixL6Z(z`;;bFl@MF38aN&O{nzVfn4!<|B}f z-M+r#5AWP5b44jL<~t(P!VO;|{(FRKu-QbUYSxM)N97-7Yt`(I!9-&-LxR~q8)N;k z0WV;_;1S^yYp~W~wMqPE9K#937;OUPu50CJWPP&Dk>^vT%Op+-yD+9T^a_f+T$XMB zRB}V%>WgwKDo(SVC)HfYd8wl_Rios-$jFT{o*a;k7?cL`p`XgyjQn%Q$DjphHuFay z3o1(iB?wsbmpI%z4o{O7QY~U$@~$u3iIc$$Iu5}3lTl@8G^Hs6l zxKjQXW9Qf_O4O~{ZQHhO+qP}nw(YZR+qU=Fwr$($bGth?-O2mm{)0-Yva)K-XFT(R zVpV46^1Vwl2zV+4^xAnYt(XWHQ(ry=gIJjt#fmog6>jSBa!sH&3Q>5S#oT{3lu7f{ zpuAZvRSYLJRdipZssY49gqH@PyAidYE|j*$$3vHP!9G?E4*9n2$62P6DJGT z)y^Y{)-R=R<~|8LeN;s7DDSLnZTJ%>E-@eHTXGx zs1oG^dDmVOUNDH@6F7CMPX;O^>D@FB;>1{yL&DpZv?^)vL7|5ErEq>pCsl72M<$dM z^<57(`B8-ap?r9?g^*O|vX}GKQQ&f;obn%rN$ncipwX;eH1B?;3^Ibb`fbrA0`#1#P^fFwUOEUJ z%lqj)kWli_<4vtWdoxUq$Z{xh1zE{GM^h`vF9QLHF5@N6s*_t=V*Z{cdqTSdvQyuwh%$ zss3)pZ!LgOI6e1oRvyIsR@E}`>`4F+h*n9A)eQ-2lwn;f;=a%wqFN#XZKt+wl4QuT z#mqabHf^k!L>yvSPkwrBbzP*x>zsT#N5I=?s0!o1YAJ!l?^hZpP{n1WKzf`9$n&2S zJD=9A{kX_0wJ?!k)sy!(ahKx(vT9H%y6-4NXb&MN;0RDmp?u}dY%&NCRAa;lB0xgK z%5!&83u!v>%;ny9&pRgF(=axSVkm!IDG;pSBi*ar7p8y~_dD_E0YqS9ol8kyZ;}EB zp?_kPD8DEYSUsu<{r+4c()c-z!@lq+5YE)7o)~$sLNwU+!GXUkVnUdLwp6e@Hc{Lf zg$C0Xj6Oi|s5BN!kG2)3Hj|AGX%zG-(zX(36&5AzI)g1rw|Lj01$OYLgsyr9$wl3< zimRd=tP>4$3w|N>C)}EU2wN?S!eH^ND>qk}wdmsJv(DK8m%F#78NJgvBF8sVJ<0Fs z@YFJm#(L(V#K<@*spdakl5hN`4)O*wN z6Hw(`0Qcrv3QIumyjiFv#)z^|R{QeGJVE62InWTWr@Zx`4khJsfYkQW-iuK{{A6e6^fMMnxRpX=xb^CvNz zdOaj0$pm4{iDHbv1!Qp!Nl*;=nqRJ`7DJ#u;er)`Kf$wx)VT*|= zBGc0XLsa!`Gd^HYrL}l2)yP^|%IilBebrW~9xxscceh27HDnc>fw0(Q=zd{i<}vFw zyIA@s8g=nCe*`NZuEe@*>6wr0_CBm^1)Hk_SGhJ^1BPRoZw5jlr`}c64wWB>3n+J z0T`u1H1Nfd1Kh(AOJ+;-5GmPQ>n08kGnW!vW#-G-Ni+DU4D5zi`~u$fj4S7HGat;} zWTRmkFNj7%s+1qHm+s&1(g!1>>bK0)BzI^EakS|in{LF7bg!T0(yy6aco*%qh|gZ5 z*s22z*_c8itn`d+%P4TkjALtCMZwFsBvESO=ZsLQR95{>oZQ6Y(u6VJ$(dZv`kFL6 zxD(DuU_urF!p&1i(Zk9jE^1IP0aO>R=r~0-(1%YX-5^V4)%Hv8q2WD3TF3hajKH3j z#@a+!+>AfKKDfkXsjO4-km*U}Ny_Urz5&?S13c^;S}OCG|5R2~U-M6j7Tm9;{H==4 z_5uq@WX(3Gr($Nu4&8VkvbcQOK}$Ydy`z;D=bTO4V`oP?d~u(W~iO% z5TA<|X)hP9yWbZb{PIW5>kblJhee7fjWu_j`B>kD;n~ii`4^Ej-p?N+unX_pBMRpi zMq9KcM zp?u+UTGKDK`DRhci0aTcpa7gKT8k&%(=0MFQ9aG*DCh}EJ=SNrPrO0h)9fkxzf0(*f%EPaq% zkvUv55RT%C-I_^=D7|`YHe)cLm~W~oL>TW`^DMzF4*2i~N1%5Up^Vky!7W zA2bo2Y2IC&Xe>IsE<|JveLQU|I8BQW^_EbS%3&TDd{2I$6y3w-DqF4*u6!laYnFo7 zp~2eNgeV;2_GGF$iLQMc=Ux^(2wYm(W2IrMtZH2tm+O0lJ^nwv%-GvdfFpts+l@Xb z?s4T-@!%IOfasB)JOFlvNZ)~92XOXsJgn52V?r1!%|m$wDq+sd)L^5|siYoVVG%u% zR`SI;QXTg-PU0Blzjtq-gd{(mCXxs#r+9Vo4SJj5k^tl;vR?B7Wc0wd6|yZ(DjLG) z>?E{-D!t|`-QNR8_T$P`gQ4YSrN|r1QuZ4Yz{_@*4Q4{RiNlOBYVMNVS=g+|4atL2 zi(vumhz_z|rpThBC6v*_^7Mc31c3hK#b35?7n>Wnu*dCBg3Db#gjdaHX+xZ)*}`WE zU!q76T`d?az}sw}_#Bl+^Hl-8 z@;L)%$CJ$*UkBSKrT#hOx?Lf+Bul_O2c&j$4F=lotkdB*ZY4B%zN!Orz~4C;l~z-s zFdQyB{nn$4?q??;yn{FGe3q=)yYj!FWMxjc|Cw$4w}typ&}Cv^{QuYn`+s5^{}m|z zpRv`sW!HMojhZ)F$+ z0=8O7_@c`6%A&T<`}F(1PM2~z?QdA7hT0ssUT-#iKCW-e`hL!zZpZ$?4ZqLRReF2= zUO&uH`$fylu(vFHf9~)16ZzUtwrszz!zbxe?$Y-QQo6Z#Dj3 zC0TwyBW1hQ^6zgaWBMOy?^Tzp1#i#xLtJ}`vMk@n_oV~rrMG@RCGwNVr~rGM+;irB6i*i~R>kEta71i1TVb$tWGO1pc<)V1(MEK}sp7rM$o zv#*LVW`|kaM8`bsatfE}Pl9;}AcWFV;4R>!J zTHoE>?jTmM;e#!EqZe~azTK_EEl$GPzbe~7cym1ci_30u9^flcdZO1tR?m+7G!swF zKztH|uQ8`{BV&wwO5+=W2@ns#3Crj_42lpiUG@*fqTS|lX!~Elt}xf9QNXIGV@RWI zF~+c_oJ_!crg_0CMjtdn@(T1tXeT##3=(pouY*+yy!w`D?1qip+I4z=@avFtL8QV5 z;s7QbZw|F=^I!~fd~x(O>%t&rh$u>G&KmKtylT?*p5a1H3;yBQ5beUekp$`}-=OwX zxFTgk5ubnW7|t*T2_=NnT4-KPl0+N0SSj5WjLBINtr0osM(Au+8FRJcsulOxFJHkx zPt}r3SeXv%V*>eJx0RZ6n7ycB6F&SvK%xzhMWcUg}%FhftHTrH$r%F7DQjWOxs zfXKMH(BbAPF>5;lr5h8HNS9$R%m=>YJ~3Q~s>ueG)1iFk3&h5+n@+~VjW>zn8&V&geX9}BakG+H0OLuYa~+;2RrK2?A73?+*73O^auz|;kBASB99z&c~x35}RU+?4iWs<%>P z85ES)1*8F4EdXu1p}Y7)RiXtaO}lxvH^LSFbkiEJ+XWqaCODqR=&+*#(x>ms%Q~sn zu>49VMG)EmATylL?#Hg6IQT3$XrzISTc;7eYmE_0GJF#rjG+%@n9^0IuTG#*m4z2KyLrm|#p$AGfOI z=aC;2N!)W7(ICq0qb2A9+DCp6p&?LK`9jZLQPD6Za(9tTj0KTOc~rsH2t36lkvOw# zrkVkS#$L2lX#NTrg@Fo0UF55ja-V`$Y*a8{&Vy9Yni93B(3I^nP4=6a>Q4}<9afp} zrNi(}e!4J00!xsBJmln&B7=n6>MFdrqj+Yz@i@I#;cVz%T`nRN>@?7^J6S;g(}S_) zWPB@o3&n}>4jhuVfQVta&J#|}$CN-b3ikkfh!%plZ{TSN4kxXkfc0i;k`^yI3HsBy zyL>iuWl!*D+2AnCIh!exStMzFV$qF^PU zc!Dr|F{M=%BV~P*o=K7wW+CG7e-=J0=4Tz1UlkzFo}^{zt6hCGME4o-_Q}1?kWGXa z`Q`l#Q=9#f=^}Y>BX3Qo0CHKGDSsA%ACCGqL2~`>vQ>A5F?$Mt#&|7XzjVBLe zZ>3%yc*`~mnfh0XXVUsX1rG=jC=bkJ7+a0cKahaDFQF>bdN+@-1YN`ds#kkCqy}b> z`V1S0IeMRw0lKOI#@vosZN}f;WT3?J{z%_gd9m!Ayth~w23QM*vGI|U8=44+&{0k!3|Ct@fe`(?WfPVs zZ99nZgd#Osl1E5li9h<^uM2AAPMxEmCVtt8Uh2 zD=;_tH)u)hL@Zq&|Ayq01p89Zz$3$Z)yx=Zp5glN`^W2L9F8-s0${*0Cl_MN5|+5u ze!6vgy|0r_27xt145eZu>m`~f8(T-gsE3B8c_nXx-7W8q{TR6{IIC@K7$Q42{N<1$}QV0bWq0=9B z_*L>7M@s@=n(#7G&1y==?-4wWYMbCg4* zOnJEJ@+T7_;ZNwz-_gR>#KR1tds34((-&{Xv*+(YAtEac=M-*ZSsJb`2a_#~8ev-? z6asL^lRD|-&QW9?!|X-XBkZxt_cZ%CDFq_#KoSZTFOY5Xi~hKo<4-(Z-s^=^m< zTOCM>!c>eX?9yNEFy$CfP3>3?=ky8=B;djox=br4MNxPE=7aQF5MxY?g~4CQ0NMNv3NmiFMxsuhS9eJL>2wW1DFsl8TK|uf$Jt8HXy5vUF@G zI=zERvK<&0Z=uwH5?hY9ScwAYW;J?NT3p#WTtAHylPtBM=SHU539P6LcotQxz0eq< ztrjg>Icn8xqB@h*qYyM>NsQ@rX@QwD{(Wsb+|OSeUJ7N&iZ$7_y=%3VW5>%bujwTV z5aoQtbv`k!ihi}0-4L6o?CDsZ=xkw`K$1UJVAa#vlL-bnnb9cHt-^>@mQN*@V~)dhIA&~}V^NZ3E(+N*!q(<8s5Q_Rb&m78otFMrx4ZAF-zPjTwf zUMZPq(a_g2%V4VKWtA9WRJfrb?F`W!(4&+YtY|Xu$!wZ|5e|eX%ls-rr*p? zETFFB_$?oMUg?d^XHa?QeoF8hH)rpxw4}5)dcC%It8;x!ZyB<8ozm9w77aao2?njW zU&s~<$zPdf(bmmk7hY35BW8QSr4EPLP)Vc^cu19B;w@H|J^MQOVc?3cnK=L} zt+2jgy+b_wLChMaRc#()No%qoQ;fzGR#r*Acz(VQsq55BIN|I?_rEnB{58Kv+(v1o zRUbEFvBo&>hvq+$dnU$e2OhqHOe=Q%u0>R-pc*<(!hzHy_rC-;^e7wacyRNeJQlpV z0RR00O@SHU0eTEnw;SOuWIn>XZww8! zOM>RRLz2Lry?wPp2gp$XwS&u#hf>ta(J@G4@G~jNFIj$qFDIW_ z>=wkk5fb06h_|AQ=LRl!QxJ{?K}eX$nuAc0cn)7kHutR90K)Fs^XLcxTc<@AocnY$gA!Th#zBw@&jwW)*RA2v!OJo6_suQ zbrAG`wx#?vqgiCkW|p<&F;+^TJ+0>&8;vP1oNY8pVAX@1zIJ1_gJg_!!3d=9`6t0F zRXc_BLT*}4EHhJog#lffF5vx$l=T^3~C zm`y@i2HL11gLy3)y^1%wy$@y1_^H&P4?l5422A{F++;?O(Nig%(Xx=HlL5oEq?45&`GA7Pik)Lik&4&(0(S+2gQ45 z{bf2fE2c3{Tb)=b{lL2gOm&d3=1dM1ZCX`4>`Wt_-%%z$MTT#b5XOG9t`g-mP~|ug zfr=35{CLh0lHr(WBlf$-Q41nHVk%`_hBBQr2;r_GmGx^&9AV}h$~J5iZk1%h*@e@; z@ZB*=#Y*|Qz!%66O})H1m=|Gy(%h!2e*pIBJQ;uep?3XB+DN=`7jam006%lpxB>_# z3_&+6g2-5gl3Bit69}Uq-_Q>|ay=#Uzq-TYl7B~50ghwcScM_qSw8lR9P%p!4!L&t zuBuvc_JP}0{aj$4+GvuC$_o^ol^q@*{Z=7uDV{Il$ZeXD?bej8F+wYXZ)p9K5q0=P z5)2XL@3|C8s*2iZe{mKyQ*X{yVTm&xy5Y8_I}Yu<{+)1T@mW$IP2aroL>yZXwR;uu zB5g(B;Q9r&0FOQr-K`OO4Fa!gcU9$8l~?f%>%jFPm#~j%fG1X9#*_{?T;x)A4j5%Q zWNwWcmN)w1T0O(*EUKh@O3zzlC$`q!26|C3e9L_>silrXKs1(nrld@m6Kl3Lc1f*- z4#R%Rb9vV?hW`LInf}XB`k#Z% zYu$+`oJrJe=qLD=m%<#zBM^9DRrlqez<&Ncz;1>&+po_!8&{Z|)8QIy#dX^EbqEkC zRWq@z{Vm2rxH5nL?}xfY2dvyFOPw)tcdc$uE&0Ch=ciNt?4S3Sy!}~w|KE?}hwIBf zj$WDak33lPz}ODzP3fex?w${t0tV)O>-Ga5`=oT_SFAfWJk^>_d|gNG0Du2%fWR-eu1jJuV_K^a54@Z*V^f^hl5#Z2SnQN?YtTd=8y%WuOY_L-c%dV`fCgX5!}R{!Uu1IsPHq=EaPY^$e!hIe>UiFxw%j1gB#^|AG--Mbiu)2qh4s z*XNIm$BL;s&ZVgZBoD~mzXTmy>qrpJT>2gUD~Dh=e<%())+`2EoCVz!ADlbhk%K@X zzDJ2Ng1A$d0D4i}_W%13>eIQ_cI&CPMZy#j;klt2;&7_Mb!wL77ZUeeN8KwIq~tS z2hue9X$ZgMuCRM;*`b~7oi3es-S>U8@7pjpyiWN$6ROWwwrOirXgbdWY%4~l5`Blq z!WP~{2f2x%Zc-Vt2~9xA|L7MO6jQnGYZ;kY@p%xY-E9|MY?5l=*bO}8tYHYM$J)Jmq z7pz#iI$XygvXQzHK?1CMpoNRXx)O1&JqHnMzMS#z0+fw&Uz>0rI`v7l9RFbI?B`bP zyubftqh;*u*Sg0Y*nJmA$N{yQec4n5!?g@x`gdQU!j3A@#oQ2)skReVjI+LyVBOw( za~Bg*zfck--N~6il_bAiF@2F!OdIY+Rw;TmWabc^twZAVKUU})^N6p9S|7-Z{**| z*%oj}f*#+*ZW|Q@NAVT=uCs#BhQugQ>(CD0K4%n>xtUL1b1IU4&p>JcN@i5bz@yRL z{>xf`l=^vcSxW zK&oIWM>Xtv&o^_zc&a}rpwUuH26>%gm)_@@JBSb@XVN8n?IUTrIzm5`_wms1&gn=e zY@DZ_P_E4acZ3nUXoj z$drbvRpPPB1)T;czJS5rUX;o*=CXxB9RNE8*E3S{@~ zlCmx{Hp=UDCBKA7@Sn#N=##IcXe8;dU8Ms;(D$0cP(ekQesdV+0nHWus->)GrimsC zJ=GK<{~?@}Kxn zA~Q?9LQ)y%G1IR%iyimSXkq`PE;a_PJ?e>rb#YTJw%!*g@eYd@B!8edky$xE!GY%jFxNmn)mx=&vEos6%VoeH1{UA+|sAxqhc0vue zld1t7hhXf_gs+!RyHlP>J4hS~tq-24Wo5n{!#2c+Y9<#}+=-ZqFabfI*gLKp3qcl~ zQtgg3P^@)YURs(6UIa8wF5e9$>efp)Jz_tD2ri50Av4dAuA?H>CBgz2(+22DTF%cI z^M=|&0n)6q{->>w(OG&6$_lfUf}}Zn-g3|c7zqya9NEBUhnHm+8Wt-v$7+d5 zUr_D!TnSpq>{3xyf0IhBLSd$ExJ;xxb|E`c`I?19RMK|c8y!xyTV6_nlD3_Tok0QX zNVUfy%1DFft2Y?SIabesg%N*(pzNu4A*b5c@UIWU)JdBvF(cWW%F-MxkzW1YP6ky2 z&mK)>3%9rqy(j6}y&~Ja#cf*p0}18`I?(|0B>HAZCPJmCaV5gjg_$COqF{oy1n9LP zs!o+sswzWeg&HVp%yfNjZ2vdi(#&_@s`@I-TCjbf5Y1PH+nM^-T(g9B(P4EK8Kf5Cds;yyI)phJ1 z)>o*a-cvvf>~%|%on{H9k=kNN(C55q07U#*rf=A-La1Z>s7_e&8!arFWjDBzbN3nm zi(vkeja7H6rLZ%{t#1pnZ+Q=t-J3<^J5ldEWYUTUYK_%ie=3!zCSnQpNG3d26@J>@ zCv6?MKKwI%v?0MxgRn*G3W!|nf{peK0!xBCshV+cpzA{yruo8iq|Yg^k}7I}i?X70 ze(_$#l3;7elO&?u{}@M&qyod9&!#K*{L!?G?m4}V>@c$04x)IZ}gH~1BY;jhzR(V zm%VCCcrh6t4SveGU9;=LsZ1K;0<4bUJRF78sV%|gA)QK=d@BzzI0355bQRUGD$9ba z=TdcY1+6qu8XF!or&>b5FnP06lwO~lZ@>ybN>(p}YLeD|*FbGA@dNe%Z6+uiw~7`O zbNHv2qzTsG+tTb)+2%oE6w}e>ykSg0)KXRn)JL>@9T3*kxhP0 zGMD28rGilrAG3z)Qsel$^BU}KF(vJ}_;m8I-z*K$Fd=E~s^GVsZ90ucW7qNJwX}U) z7!?jK`N1|`DlcD@8wynf2}Kh9@U94m> z@s`L3#YCM3^nOTN(ifOr`yqGfjM*32rSdERa$V8vhl@Ymob^tQk6EJr>78<%5|z(m zu221TDp>H&%*==BLNpgEq{Ezuzdw<}L(@fj@g%YF%B|vLef$^NzQo*3rPE&x%}0uH zs5}u8h+w!CpAx*d#F{Nson`gHD0_1MADGE8%!Qlso1#v8J?aTmhsFLvXBrPFZ z38>5;Yz5pX!b&`AP>(`qg5yQ}pV0@LfzANfpybXp|J2zz3_#u;p81{i(sK^kh>~vr zv1dpw=17al{VZdm6^eY>^^T9t76gG{JXwEGw5z!Dx%uL7kp1dT4`b9s6^)llk56uV zScw%b#tHN1H&)6DHdmIqu52QTZN3*&1V2Pzps#XJd&r{?9X>+h5(M{V+Gm+Q6fFEI zw)j8$#V7Krg^+#bAN4?TZDk@cFwp0y`qOYzC^LYlh0a@#E3a4kK zgCmBjp}ko6@{7Z(D>CnqsBL49vLY4u=kurmQBRpmhLPEl6^;(fFw39L4+RUZC4WL@ zYoi%tRh)^&x3|Du1raq^2?;1s3J!K9{Bh>U@CdZZxN^)X`(<+Ie0R01;0QP1`3}_h5!}M)fHB zOlwJI@inTxS7vQK6qnhGq(xT0O<51SUUJ1;65-GxGa7MJ58+Dh5f(1H3t+CVgJm%d zO#=?yj@MiheVF!L_vg;^C=_(eY!Pi9tJrY3amJ(1jd0#cR$#d2i4)a$Oi^sZ zwFmw6;8cn(=j}OLmO(xt3lf4Bmx(Tm~AitzC>;JKFj&cm- zsH^r!+HHctNRt=#XJ=~Uo2y`AQW{`&ve`|5$EMiCUY`J^Pt+A%0T==QQ-!p`Ew`f* z{BL<(R%CW=2*s*{k@upH+V&a72?@43{#Ab^z475Hs=#hSM5L4*b*fT03f&g&Ydqs!UrS9FV9G^|DOG9nq!sM5#zi7 z8{B65Q7_g)MvK>``?~$@XmM#WAi?Qef z3V6K|$^BBYSZXwL+~M)Ap#mE_Q7VjHv(8b|r9k);WB1jJR*`-7NwUDUVEVZ_2rBR$W6=Q-SqUrmr!9bb zV|d7{tLkKXA@R=;^IZ1(JV?Nhc2i0b{4Od=3e#NSs>w~z83?4Z(ISTl!1MrFUQ zr`LJS2hnDL6tY>djW!X>(c{Zd52Uh0t~T2J@X7893KU5Ic>48MHdp=o@%ceBJg@D3 z$4Gof)R8qEU1=hBK%a1}%!cB($dT2@nZi%Q5OZV08hZ-sYJ#-u;RVg+(Z=nZw* z5Q}^CCd|6Tz9k~Q_r=iDvP;4IG+TzF{vk?*6PX6%cyrbPq4Eo6 zJEV9rT2_Cd+TZp=HIx*}yD<;QNOw~uD#-jPi>_Wk<7)b=q4I$R$5pNy;Ie z-gZF7TAnFQ3Q{6%+zC_jCrkvqBkapTa3HGNmqo5 zSDlI&D^Xx;5d?i^OX{{_>(9zPaNSr!U?G3Ap#?X`u2cHP{$^d-FMz-u67zqgcK;i~ z{a@9Rg_HUJiz71q_b!qDr$mV9zx>PpIko%OWgGSH-tb>rYb~xtIf;qDNil*iR4sS! z{tvcW!~X46u8b1&l-uG-#KKxMcvMj`gJGY^ndzCw{rSA4|K)QDznR7j^YnlYH@@9D z8S?*edz-|E`~CPieAxB>xxb{p<@f(K#n>$!Vu77>_xpLi8*Ackzp>@``ug0Lzd4)@ z&->N+rz+NTeLc%>hhO&bVefvtt;g5Nf3z|BF?szyXFyLD_3~%$TbIrF`m&Xv598zQ z`h2ZCJx9(4a}1LE`g~;bISz_kvwf2ern^!`nA2a(5YMJ z@QDJ^?q@#}E?ncL><1_t>{r!Lj`4i|hkP_c`+nlsKTzIr+%T>xYk z;dB3fAh;9|_zz{b={5hsfJC0JgofusyGq1vy@y{Mb9U23r1Q)fW~z)h*e<`pok`wo z=yukKgJ(lDy&U`(Kw|%4PwwKzg&?mJ(TPF54Wn{@d@j!MDP%ioVCcJpS-_mhO?q-J zT_*6quiJV-p7rj|_8ZpBBpS;^R{P&{dBdYC_7Cq(;;HbIq!|SlzNm@E^SvUJ09hjB3|tw0WXO1TXeh5bX4|d z3x1*qQzmLPLZTYG3@D zI~J-tM1Dw|@F20p?wf~>S%kD|Togkes*95(xm7U2cdzoz9Vw8Rjm1{YVI7h!;9P}c zW8m!o$ThE5*#x>s>J67Nj11F$N+fW1xfqGZ&x<6PXU`zo0|m@p4H4W&`;2tr`CC*= z(CM4gdJt%yri4vRT^rKq?KLJ9G5sqhQI5=XL5~f0lxM*Q=klUe{AzGooRic_BI>a4 zzQ>8enPZ11tG)Hj4XKb^UOe_Wvda>bRTi;_E8L(w2THnL!1^Hxds=mvzju|XL$^(4s6F5|D4;CH)?IKJaHH_>FN?R|p} z*T7YC0L`$Hg;ja0xf?MggM2}!iXgi15m^^hakoSa#J z&@jpq#hQ8jOnPym7@sUj9p75o=vI&`KZ?oSSE3Eup z5(JuKe#$Y9xYLegyOLyuRbe2MKEuD&DgNa3=(3{BvV^d{i{ea01{T9pe{-){H6vFm zhq2j%$y!qb9PONt9v*1W95zZ9TQ!>njyZw7D{@kY7d4v*!V1jaNsJI%MfkLUc$Ki? zLrE3z0hR}IE)~I?RlQ~vUS>QLG8s2k+Np?#c7$-EU@pmt%P5*)X2wBVj*-CGkvWNs zYDIcOU?B0(w|v1kr6LkQU=;GKSF%LX${WF&|A>sUAEJQtg1M+AprAmAAI@Ye7Z~N{ zv?d0j3|nfO6K1Jc#J<M zWsP*8mNaad+A2eO$Agg3cD4{8DbS(~8E`;>44Vo`#UPp&CYYvPD?V7CfflUN&9CM{ z+R@87T&Y)CeCE{&;XbzJpkgXG0w}{_MW-TJ>X&xH>=HD9EqHoE(LT`~g11R?wt+Ms zZdQ3&lv^STLO(x_Z(*a^OzG?o1|L*7Aonh=f0&V>F*?)_;}nGjWgP4_8Bv12f=nBE z@QStS7Dq^%pFrNoVUxM%L6IqsnQng3i#dcKE-4q8vQfoGnoG-t7C+e{+drjbT4|;X zvuK+zXqPDb1>VXRbL&msBBZBhwXA~kfX4H0vv{km-JkXGQ+b| zZ7p5OowTPUr1S0B0}Hhoa)OiKFJ$vg2MSB8H_CJ>nECiyMY)*_(127ptoS^Pwq3dA z9oNp-Sf8ft=hQy}^Qu|e*OOtXx>`Ejd331SqDJer05R}yoGr~|EVQ_~A`rU9r%9Zk z9yXDuE5+5pC=BA2h(U*~OfY-oFHuXg-UV*RI>0tMVnVqBj%AGWD5e=AHO$Cfwu` zb?dRSvWKxt%GA1L5TZvs-9slIC7xX=?avS#3ay2NN|J|xMkw-M+pPOq6j^YB9*~zZj^DOLenAx zbWZhDsF64RKLCu9d%`7&zEpnJ9$NCL^^ z{y0X4jSoEIDjR?pZLM`UsFG$MHUO6%VA4r*~PQQ@+qWSz>>NAX*EBsKl$G9e3=Q*i&W=IGS%;`; zqWD)s+Qelb3TnaQ%KDdY_XnHumM#%C33h47J-_1cqhq0ajJSfDOf04me@G%~8Tgha zQ-i`(Ipfb9{uJfYH+DtYQdxjZflS48Z3AX8`xrWq^=AP6_6&g=J1sTzSXSswmW;kL z&}u14eSe@v=2o!ylR=bDLrMY;ONVhoi6k(?iIQMp6c+&ZxP&c{pi;{W!ekVpeU%k;@{!M{o&m0zzrdWhk^*}Yy+*qQ;v@ebcT7q3v3m;8{WiCNg9%g~i zt!SrMZiVAvgp*^a3p_+*^xidYvD{=UmAHfa)Pug$(#Vv-G8*f+~F1tc@r=x;fA&m}Qhp;bXpHq!m5A#iC)hB%a+Ut%_0yP5u9(?44pn3)^Mg zwrAV6ZQHhO+qP}ncF(qL+qSJU*UrwLwUTwQ&-J+cl95!^`&3b~1T`ZxIHB+-=Q|VD zFlJR_v4be4oh>iiT9*>Mkk;2mG8!?l>nUf%JN6V~CE5qSj8B*)dnlWgE#Vsb$ zL_u@)Gv=6ketPC4qwG*FtcR1lx^30Jauw&gH#KM)8pOn3EnDtwEMJqp-Q4Vob@aLo zf5W7ob-!wo5%w6tW+XfKD(0C4s{3`_$&p7=oUwtK1}Z|DsAcgqnIgnM=V5Jj3Q8DO z!VD@+jfvQdj#*Rd2zDV`%;FV+-Bi>Wb$9B`F8}}V*JUdX(Mi>6U)UC1vkZyJkzU}k@i{KM|SgxXd z)p~mOUjT;YtS*V&vIei%&GyE<1Rh0DiDF=gQwpyRJMH5M`Y0s68-w|SD9hP@8;sr5 zo9cX>7;8%}?o($eY7+27g`RN9fXU*r`)g_ecH@}%GcH+~oUW>qa7K$wiMU7Hw4>p5 zMe5eI1p6|0{Cl`NsQdv~ej0<^jVmJ~xa_P$AE~QFc-fBQM`C46ZA5JHzEQ;J8F{j; z5v+9YR4Af(W>|Evf$v%v)~-6B6}!Tu`4v&662oiIyJ~48{kOPXdaiYEXF4DyiU+Kc|q^%reJ~Nwx7{m4@QX@M%&BWCt+k&fy+lyto?51LE1p!N!&aH>0 z116S~Oy0y$a-BFg8m~U47OXK8-|cJznQtJKN55=Yk;BtgXMbq?OO5`Nqu2M|YVs`E0zH1*{1@p;0ioPIxy5 zJ^F+wjhG_7n&HkqX2RvglW{8!?JR;(}I zjT>(4Vx{UyzGi5NRJS9SW;FH_A)CQH5uQyjXvu)=&|8mcr_FY}6bNWz1@U$xjy1XS zjc;OQTo-mQ8>FyaE_IsbIT=4a=U~w~pD#Bm1-5)jSEKNq#|Im@Dv1?pUKA=-bN6qo zN1Uk8`to4bSQO}C6e~LPweuF1kwDvAn0`r;Z#q6Uu(aAQD>Ww38h2(9!LDkZfupm; zKNJW2T|u^|;#Vt1&e`pl0bLPdsh|!9r$J9>VjTVsPTCBOigtt>On!Wt!q^{A z$FzWD6f2`#dtLoJpxa^=8B(qT3iCA;7T8K(+d7JCyX812vf4?ixq%yYZ!vl=fFXp= zmbit)wCx8*vF>HcUjs9^KrSbv@TsZuPUU&gcan{EoM7=x=8V_X9*aad@+FjqtH6+n zU<4|4%XN)imuRf%Fgv$}Q?@qnpLMDxBc1!&#zo2t+cgT72fJ8MC< z`u}l+_Mg$F|88gf7jpam$IklibS>L~P%;P%(3|e&|D|iE2>DHucHyqA5>1vX93xuo zX7dBUG-<|-8{99JqA*>5KYy-!I}O;n+PD8k+ZnKly|!NY{+{04`mKMTe&oH+-v0jl zTz`+g+8KFfxh^uFc=>)Ay{;zhw(r|)eZQ^Vr1gK>ydJjQ?#8~i>XncwP4zbTGGcFE zoji19?Hc;h?mkVzPYzT3?wz*8YkzgME?N1$bs;{=Y3F70)xCMb{cTJxTX>Gdn$V$u zlj*QZU&|`Acqp2^RhQe5!6K!DBTe?ZeRNvw+)7V-_T+#ed)1};WZXB(xZASTSs8Gy z(585GR}+>W?XO#MXby4oYL%~msoG8fpUfkcLSlwZ<(@S+aJ$a>n30+DLi4W`dl~e$ z>6d))TBB@-^VraKoAeqO0@qtVYyDGaX7|Gn{OYa_X=7AYjjKG;%OqE{EC;E07;~4)Sp6xsnSiQNUxZd&%}@y8yda< zbYeJ~c4?s%wFu}AqRS>SC1f^-Hfmbf8xLM`Hm%GFroa#tXYsu*s(;Lf6>bn#wfwafl8gY8`I6#+*NcI#Y6ND4cK($-IcFw!yozxDn z3!1Ukx;E@=acRKus=&=i4$vg}yDG0~ zl9GGL)igle5TafET9?mb(h5QtKHO$UGUJ8bFOG-(-pXoqd{(47M7JPV9R(4|h5iBW z3LC3eD&0ePG$gaM?}6w-Nr17YVeSqlsofB<)657o=IIuATW-6Y3P+CMDwA%mHj!)- zqgFW?747tT@3a6gyGEUI*j+w&wD_9@c3JEBATlZ2sPb=^A~d4SADNM5$Epd-eK`g? zp=!Rlw<R!p=Euqy-6iqGB zAF8FO_t`OgGx6ho7xRp+$nGtNTE?a_(b9#8?Z^IL#eGXnnWIoa@9O=D(dUclEY^Zjt{yzr|0C13sQ5BdjP`tTe-I;<@z@+lW{q|PPU6r20 zi<##Z6R=1;Z2)_pOMM>sU}H7T;3Ldp5{AeBpy0Kr|Y zSx4!Jnwzp5FCpRI1#!M{Mj#w6i%IiADU(qOZ^#5U-cb)*+DBd6%+Y(v>bIla9@~<6hwJB*4 z5+cMGlv&b09x53)tdhaig_RfqL)?v74l|$-8iR}sTc_A*OU?a-GN2Mjm9Y<4@L3b* zOuP-#6ZlTpkasL@r1^k%i#vD;$UGK_|3Z&@O#PUKO&To2U~jEnRSs_9j_d?~VKDpO zw{mlUEXU9_3iLa{&xj3!v|h2O6Kfwq5_Z!EMpkCYKcSHORG~dT+)1}2YPwXVQZ&SL zn@EYh5JR@w?Dt8|Lk95|_uG2j1Xfv`qh*8}dLxym9_g2Ws@*0?_%A=?p*3@Z<+ z&U=J+NnXC=poSgxTY9(=>(;AZOaU?qX{C5J(`vfg*vt~4Y1Np{t@`PycFbtoTxdx} z^yQ^YLe7uaAAxE^WnSdZ9{|dy1PBOBP`REcfB$NI18TC!W;KH96Kkv86zIBIUN*xL znOPsJWg@{@|*Cy;#}h%a87EDHWWj%Q0mNQT0K z#ZaxfJq)^$kvI&siw(ag#0s?Z^{~PrS8g}>n{^@Xg>H+~R`l&(OA)4SjMjH)>cP`C zRNI_xvOS7O{6~VH7%8;`EKbzVPN?VA@jULH0|(A<3vN(RM{oXntpGRl+4 z{}R0GLs~8^4wcJd^gZW@h=F5uVrIdiDw_^`T=ylGEH6bUZ5oNkRYQVe~tnkBHnY(k3aW` z2tPlPYb+%FSRM*|0>{TA)Q>?=yoPTL%ft$*G&{&D@f<3Qy)V8Bh^gUw z=?SB{^5iQ!1)*MBy;HrQk05F8{HH9GpKQm!~e0f4dWL(>kzmQ~sE;1zh~2 ztpKM3NvUGD~)0%K7FQk4vTT?{@RJi~$bKSSfkZ{%efx2D19tQo-LK1sVPZ z7X7<#}_Mpm{B_0kUL0wPRH zy1PW7cdI?p_z#!wy<>fR(-&F;{*;2gv;U#7I=cx6ZUV*YI4>3iFtTx3VVO~& z5o}at=i8ci`05$8R?`QG-lQ5tQ@4I8SHrQM`yDH@l`i6UFc!kV7N^QrQ1Ek6jbRr? zk%D@b4d_+dvD4NcLr=L8Tr4OXLcgBmvEu4Z4GNBY)K~9$mmlGPR_Vmu_sr6f(1_cyVB#FY!#?C7u4r~2+AZEbF0!&7@jW}o3fFy zXix68&0(meGUXy3<1DTHk?ic>DQ^$BPrY`AJ!aD?lw=nzTlObZtg$eay>>h_vQP?| zpK!TJV3Bw~nB`t5hE)8VqiROI(@-K29j@|ppD22fO~Up2FUQ{ULxfvxbIq|RFY}18 zNN-_?s!r#(4`AyfR14GjHiG7FE#@rU?dH{>UhUjOTamamtZ{HA1`1a0EV3HE6!Z*i z&^XiYMd&NAH#u_-zLBcUm}Sbdr=?>4;%N3L>KONpjZGxb5g(J5UHG`l(foCnyk(3Tvi z*=o6Nn`2;D=7pOKV#SJ+c^OlG7n59st5}PNv-noR9v?Kd}L*=DoY8_rtaU;bepcJaptB z|3(L7ArZFu+{T_X@MJ-PPAyJqzoJ^XI5Nnh>USin5c5s@-VFZM(E(bvKYCle-lJzR z{)wF9`h3u@2u&4FKE!*9XCzrLnaT^O49PuAhTB>ic!bv7ng_Q|FX%W}cwL$)Br+M% zZ<%hH*TJ5Dav}9DJnd#$9mvo#&}YT>#GF?Xil2G)F7-;pVqEXo#A;nBa|WTV5tPz{+X z!kZ@N_@3%mpyISQ`H;$Fed8N=w7UHZ_>Nb6{lB{f|LNQM=N8a2{*Rt<#{aBq{WrIO z>AyI(|97`wTSq4DUl&(59sO^?EQhnOLL!MiLLZOKE*d(%A3h#GEMQ~W*SCBwszjA8 z3Z6x~8LPT}z;mlf1Z7X9=X2#+_t)zr-LJ>FZim_{Bkf_8Uk3PVN7vWSYudj$uH#+2 zU#73ePrlx-hnMR~y2B?=PmY|CJGR}QmxoiU--C|T`{PYMUEk|1J>8z~%SpPlJF{Mk z-R#gitTsE&_v!Z*I6a8p*VWqJpYbdo$uHF<_}zF-OzWO&l|<{_~#uO-m2k>q5Xs8_sg_W2OVDS)1lJoVAKL`pN}`= z(6W8nbwTQr+Mq2#+IL%r6Pt_K>7mj4Td#NT_BL@(4^QXi0BGp76PuaaqT6TZIVqb> z-k%Q~hRJohEDIFWrP*D+j0L*fRy6cmE7}@GcWJVnzP~(Cn;0ss+>0*}n|_8g6iq-k z$Ui>u4z7JuV)qYaHph)MTvk>YK7_gS>C)bEo2j>64mQs`CV6A0DKErz|H_OvBl6r1 z7Lp7}_eFHtY|vjUy^DN1KY)DiZ<_u>ZEnBf^`)(Ne+F2~=>b?nOkVB|T+=+93>iMz zz0{OUXAKIkojYLkKuHEqes2dXPcbe{9stug9KG2u>f@S_QVJu0;c) z^85wFlDEKjv?Dq!%69PEz+#NP3Pbz| z5y?V9F1oY35rEf3L9g;%gNiPDQ`_l${4udROJ84G8ud!_BJdqJHTp(T7oan6&hvX0 z;01!}%Rh#+f@EWZ?o5hn0Vm*j_V3gTB?G2cd~cdJ5hLpnJG*6jaj5ADvNdS+UFt;k zkGubwBL#w>1r9f7`#g$(W@(BcJ8MckWY8su>%`XNpj(VLjT zQ!grWjFFV22|P!AOfI4if@>I?8xOxzjqa7wYo3GSj&|Rp8Eg6xjqt06~(SvFq z1!Vwuz#$a0w69Pu_~asuFm$wM{1vaGE+X+R1JNY>F%B#jDD_4%J&hHC-z;E6_vR)6 zymf?vYoT$=ebvfn#~4I1rvc{FA6DBl`s2KihMa6ti=RP3m%sJ2I)%%q1)6`n^BMV3vzyd zxeQp$A5c^bUkzc0yi&xaerKAiX>l2bh0qn!u(MXu-No`gr#IY_b8~Q%Jlq+V{mmI-!C4P%96B%2o9^xMHvYH2ueO!4ZGJO*kaWyE$d{Rio|O6lzkIe2 z_y~s8^4$fAvVIsKH&4F4veDb}Dzvf&L};mZd@ZcM-IP~Dd8#QQ zA6hSp5c#;!>p|O*3+;gkZ1j_BHd-@FI0>%Y<>XRNMy{Fq%k1EtbzV)RakE1H0)2@v zc^N7OtTti|Qg!4hgGqEd6hlb{$n|6j!N~fBV`%9C%sB3eME|8|iuO7A6iOsrt)LWs zM4My#%$Q59hGV8e#m~)Y(-%Mp8&D9ix}F`PWcoka00lluGm=NkDG8cSu`qME)zh>$ zE^44@oF<#c%2qvOsg^5*uZ3U?q|RdFOXx@Dd^F^GC;L2=-t32eLvU=TM%QUceXdmCkVwhJsEXf+!a?P>Y|Usf|6Ft4($DvxRoj}WlPb{w{kbo{+lvD1GfPe5wHN;VPH;=8#x79O)%Pk zB?h`h;Gik!+?U0rz(XXAUjB@Ah5Vq}W7d^k^cBTN-tNQ^&Y@$-8x!g>Q^9g==fYj7 zg@&g_k^Yta8NbG#B3&?+#f}(H8X&!_5OYirXc{NWyVcZm0cflR-JcD*Di>d-BW)8J z=pQ|%V2}inM}C}e-t=m97FStJ&7zDa#?4RQF16&+_F>J4;%4G7rS;wg81-x-xKluA zDW6ugvDl!8`k^L*1uqVNyuoGWuxh<7@h8yYive-WR3`rNNGK#_6uu*8ROR}Q&a=S? znXy{XvaMq(fniv+c|? zKblR+{1}6bQ66(eWTTAP(w9mP?Ai*aPX&T3_U;xka`2Zh$l9PR2HG)SE0;Ly0d`1L2k;VP3sVz z73V4Y;pvnK0$~br4{G7pJoXN@DAvZyv=g!BDn?)-gu@aJc=&o5oRDz9jLBo=}mtC@{&CMJf?o} zPaG&<^mU20AI{f1wuq?5KBRKwawuDMCK!AbY=9`O6tHn|Z#+50tAghjFAX7&@uTx? zg+2{el>zrvii!b#+Ei!CH+j~!Yxl1tVynR7AN5VG1cB3zQz-~oOC;c+j!>OR?APYa zTW94pF$QS&qUsH^mo8ys!bxbjNx;oDBs?gGC(1@wR$aN{J3B@eK1gJ;rI7dwoPdU! z_5oxbF<$i*sxsEm2M*+a?Uq+s4CSA}Mf|Phv8c}a)TbzD%2}&OD>UVJF@#J^x`;ld zir})H-hnz`P+yk|@8=Jscn|!C>E_5Gp5B_AefcGtul+kOmjwZqB`+!gL&^9k;Nvz(um}bmHB&s6sO|-9$k~W*IaJpaVHcLk!~gg9aoQ5FAfVS=c*^aXAGCIg zK*i%5XEY!*v8wtLH0ld}bDU5Le}aq}->%!Q#U)v1h)r80dUn}lv@76&!3?CXlce2J}!3^lyNPNa*K~I%HPx-nXBdmF_+16+zE{qsv zR{eRQy`J1OVDk2rxxk*W2OC^DH+3q;GKUQM5!DO|P;sK@`NS zP@1wnGQy+aQ;now^p{qnYFMhAZ4Qo&_98QtV2COdHEX>ZV!V99u%;cec)a;CqZWA{ zdnB@%V6{l+c)@r5o_=ZwDW1F^5d0lO0<3DX+;^#X8Nf6jW7XIc^zY5Ur80k-zf~_g z{RO9W7dhdiTeaE1zjKhlW>NWn7E5Y@_XDXPx)O_h)LFhr zO&89Kd7gI#LeXvA-JJ&CCeWBtBQ!9dvC_d@f5o?oCS#LOdZC>pCYul~zcimMm)4LR z6FTeEn}7)-MosS*N7To(3yj@436>SsW~QxKfi%#mOOU@V@-!a)7CsxHVur29(vwrA z=14b{?1xu(2|JduCp$IGDg%&`dbe!;xjov=rtNK}3!`I?G z?v%0!NwNB;hDD?>NXo79*&>!nLhxWI|4rzt5}qR8Z_-%GV6RoJ%{i81#Gj{*+k93r zQRb2DqiD5*BTM({Ka_R4jRuw8NnAX|xfz9$9D)XbBe?7Usu%_?1RWc;lXiBK@<{m_ z;6wNQ$&8HvolUKMVmYC@in=v}#PlDEe|cc)^bhLYJ|Wjr1Scxb;Z<&hpo$P00$9^A zN~#j2OG!?7MOVYT0*d5TfkzgtS0$|1fKnMUMSs39HRMX*!;7S+(~y5_-OrR>X}f6K zzBjpYCy+e|Fr$li_ByJGY`5t0kLiu!0bw!n5!oK1=QrC=@}~|-%u1@LWUlUardDHI zPa2P|9K8VYgN)1`)CxpYK1Qu5=K7+jJ6<_vsdM{A!A_|E_@8fsL`#vZR(xT+odrM! zVV%A(?0@3#>T-~C2Fl2uw%0_G}iBo|WUZWHVWmTFD3mdefi#TNb`_@ zg2$Z`AB&kWD6Lo)uOuQMg8l&6*LA7iJOs9T3f5E!31aEGq8pXAu&ZnMc9E4ooy)>8P(=rh8-syK9QA+HK5mu7C&94PK5ta2Ziy#xu|Lzs*lQD0V^;!)xQ3 zO3{TJ_8buh83J4=8>CEPf?)pB2@UI)c6eQCbrvzw9?vnw#yv81H&2EBXCfsb`iL@KXssdn8q?5ku@?BfPKJJCKqgS0iV1w zVY&Xpkn`aSE_JrX2CHZyu5Nc^DGY2JRrXcy`;k$9@l|Z)LI6U{>XL>&G*iR_rOSo- zs=#s1Rqo`i6ly2wK@SY$DMpxU2}LagQIzsZuEFUOQ;wHGIwWX{y=tuUC9&s9 z3+z;<+~#9>^g>x;{n5n=jMxJEQ2=ldu1Vl{0S{$2Jw+4N`3h+2ubVO3+?g+*^S2h{ zG-7<3R}vyE_<0p`V+9?kml#CC;8WU*)vB1)wsWnIQ^xI3M;VyBA>-oIp{*Dc&!L7Z z9ohV~BMc$&_1dz8cFYohlVD&JW9i(8H|A6rn)+q6(yXVezq9I1OUWQ`I08%Y3MNd& zgFZ;wb9@2p1n~ApsS=sHpnnXM0pbED)(bdX`!E2`D4xy=iYk0*m50LASan8V)4o+3O>lgq|ET29(rPL8QOj?VtR$ zOEV7#Dqd~;ZAh)-H6yK30QV*gP@}O#WRCi!ky(L?v=UL8jr$W@)R<{>z_X`iH+LioUZmhBJ*;Me#01aKu5B33y6@kMsS{ znSCKPe}gf3xjB`bN)R!YKTB%Tt5*bP0&eot#;m^KNVWXjxokZ265M(d*5hLNW#E=` z-c{1zIy5>WPv=nlXR6|&TlcmppWTf8RCk!S9x`TI8N}YujwiAS}f6Qzzqzq93??R7;% zG*}Ib(N@O;@}44+`HxTHu&#EAh~Ry!@10D4ZcJ0TNzEHNw5&GL)hm*lTThJay3Q8M zh(kp^OOf3Ez1+QB>auQt@A%lSvN4`&Aj$z#$dxZh5_0Uszee|^XbOe3RyGCaSah@E zApm*z=7^MjyJ$5^;^8Pg0+@QkW92xxupD{CzlUJ)EMhlHFtlI?Bmwy0har9%e@P33Bkbvm#hpEvgCe^DSi5 zyfU@=tkS5Yi75;#T?Zw@YyN@5nwv^-JI`HCr&D0Lcex^cCFqv-%U zSaAMwutV+@@T|G_1CIMtTH+uK;((fJwh+L?pf&xvN76Yi;?AZdu5ot)j{amr!I}5- z2>UFLnNDCk(vtkRGEequV+PG!mvY|`>(m3m(rn<}%Bks?Sg+8&CIG>?1eM;-1J)(gB)V5)6WJzEug z&x#38EQ}2oB)j=gG{%J@CWMJO=)23u7&h)f;=qa+nLjhfv9ca`0!QZXGXNhwrY(lh zBKC3VS$Tlrt!!5Zn+v0R!#S*22+H`#!kv;-EX{ecWiqL~L?xO0K8SzKMVS%-Kx8!4 zsnk@oDwBS2n3$Z+h(l-cZMy0c=2~U)^h@kV0_8d-EfSZua^|yKwCRh=+i4yLCD}O< zG~_B5p2iFN7z0krAVr=>*_eKn$ElI%%=*YWC)4TwSVJ(avP{&Q$IwB5Z*qKa;V9Eu zxz|fqhp`p&s)U$NR+cqzYu>h{{Q{1VE~)>o@!0=KyZ$d5&dScn{@;&jnHc{iVgKjb ze~-uh3mE@@kH@C}vEjrVh}~#Qd_x|v92?$2rudDF2RrigeDu&y2Kpb2y?hT-ONl?Z z)Y7=P^D+WLUZI^*q>D}08C%&uuiu+~awo>RR~G7_XnvVNJ{q#UzmHF^z1csH@1t+G zuYP{NFCUMeZ3f;MvWv_^yI)_U=XGjcjVC7T-(RceXhy%TAMcy5c8^g}Y(u?2hFha4 z`zEq#U!y2_KYT-egQF}~dLzyr(rmPOYSr7k6S{l*lcOo{VSl?Bi>ZV<5_g{u4<|@w zZdO-tc@4slP;ardy%%3(-PUJjX;z9)MFfc7-=cD^vw!J(gPA{PGh{q)?|<+% zLG5XE8th5v5=~M2Z?d|z(zmob+$J8`cqs)lOJ@gVCRtP}4M@`mz8r>AM)y&aW1A)i z)4hTX%HH&{l|6lZi>g#>GZp*RJ7-g{9zQbYdwjLEEHP*{tyW-QZMgP7V$Doyp=0q{8p63QPt$AF_tz!(iuxX$efx^`M#wSIl_6|!(Af$dK^PzGNZn^J(17xc zcL5ruJykWRk)h|8zOEX`5u*LAZIZW!!QN2TF{I}g$VY%k%UkiO7%A7XU{A~B_Z=Yb zyYq+Yw9HfL^MPiozZCw>KZL`uwzlhYh4FC#5%~fn{NPUl!WK!zPdrOAMK);Rq$#@4zm1xG zAWCR*;6>MFcLTd8>a)NXXP$N?!rnzi1-i+217{}$ntXwY3ew`S7FF)H`Nt7|lV1PT z?*kSp!I{o#FTGSn?-*cQ$2$)ZGD;t&Jt?D40}S(U1%|*z-HKUf*OH)vuT!Of2XQcX zJJ>w2DEHR7#Ib~oChcp2f8-}xxu5aq`b+p8*|dnWbjK?c2hy<+BuBQ#9d|CaeL6BrMfdYO{W9k6th zl2IqpqFRx0P=W|O`p`5eu>JuMQ1*o|ovN5?r$2MDbpz^P-Zt7G$8PA)E!IHAz|D!_ zJANw{RJ{xrlU9T#7Iq-0JYDWSsbPW~kwPJ-61fPXI-jgv8>?Qh9Ir_C zW)MwA3&st(-d03}nxVp@cq{k|lg_+wBo#cBJNbHTzbDqOrI2BWdO1~ZX$NZ2RA&w~ zx177K;PvrW9L}ZYkG3+6H%ynzhF?mQz;*JBAjF6})kctstFo+)=>h=8O`+&C66mflJa{bqo@}efd-fb zoOnmZ(TGii4M|Zap&PQctJ;<};dpoH>A4H+$(OiQ5y=_(>rf~HtN)J2qh%P1XSu^ zIQAE6LPQaUm?>>$M0|t0pRzzDB1|dz%SSXPc zrt;HrDjqce^@r-rE$D5(v4Mqftld(7t&U9<*G%PI{p50OOlfyHQbY&cg+t-SKGv$R z7hwYOlAD`mX-P)7f#lGh&{#@YcpwQcLE)I* zL7Q0zf&d*warvfYl;&G=*34G|p{mBjj8|QHq}GJYcVDna@VK^gfD8kOG4C)pi(tf5 zg}s4Sgw+9T2=Il*i+8aAIyKP?%f%!drR5>g1KN0t_thGkF$%+UomvRN?FnsYlI9T@ zl`l+Dsk3xRp2qO zEZ%)BXZf{Jj89A?p_U6PiXN>fKl-^OgFaqD4ctpsCLq0Ii&dr9q9ZVFR$v8^a-WJd z>8+E(%vmMLEI|zc2tMPO_~`KK<~!!xMLKXlipP19AHmYO^whj;$~gprtI_T&igm%v zkiF`v{GW}1&&06hBoTudsaRF%F5`A$ij}@LanH~J@{~7!;mJ_#t>D8XIGP+tC9Ezn z17A+h>U?ayxKLgAN1kN2UI)cddpK|xVjGlUh6Th`ERlOp4prccuq~I51o0^#MA4S~ z1CA2f_LsXWL@#)%Ov?2yTj7Kx`eAs`!GkDPW_(Eq1#sYm%VE`w^4cD6RZYXA3UYkX!ZiAGGt}eDpi?|_m^_DK@9p*ZV;4oLD1Jvzk zeC|f^A)0t1sJ9a*GjKu`Jc(y{zb15I6Ec)(38d>lhHt}o>yRDMVuoZJ?RRirMF(q} zqBdJ3BsItI1P_^1{0v2=B|36b=(;H*H^*GKRv!h=0D#w&9#Lbid48Ds$SDly_@uOdBD@fA zO-kSh77Qj2XMcBNt2rs!lar{PK_9GK%Z_C@sl2(%6nO?Z`r4U z`>|3FiosM=hDvT;+2{H+)&0z^)0!5ra}|D8c>{e)YK$yA>SyEDDZl!3XRlj)TMGe4; zKl2}Su%K6-WHWpQMm(iBRn7XFqtp z`3d_K?h!1mLV7Q`j7*7<(Uh~v)6!H0#T5-VkGSEX-S@z@&fm=O-2{N}+g6+{zF#H!+e$(%xu;0S=d*r}2yHJls@WzU^9VmcO; z5OrOHN=i4wFYKul%4B<73G(@_=apMLq0tw{NrSuGK~*(R$ss{t5{E^W1MJkCI?TD~ z7LOv$i^iz1k#{RIalnLK6a1I1K5F4)hBsWBr6DUm#0F-eOE?eJaj(g_;|`DIoFUM4 zL9$YLX@>p+wryG|MrzC~8^cYp1v)^jO(ivim**rTi}Egb4PBFXy94HALLK29um&E^ zO0hVm3zUeZBkqkMim+~4+J@in!?(nxyz~?>jvQ|h`0hwo#ZmAIH-URoQ zFp94Qfi0$?5?{cx0_~}TooO=<5E<-N8PD{L)c88p5w6ctkdt8t8Ij=Pdr!hGj=9$9 zMVP|QwrV~dH7Ka3=hvh?P^ndzW<_14P6PKw3{a+U$D!s>mQx%?w8f@jjd8(OR2Mmr z8bP=OPM7|Nn=C*npCd06K#8R8CS{rnz#N^H>4teQB^H!3NQsRsG^(0L0LF3HYpgVAoLb1J+N3EA;9Q!kTgi-dZp~^0gTi*;QI*KYN8J+aQd-oT7d?%;D zaL>|V!Wka}YCbDBt4ZC?yEpKyMvi*^6g?G;?Tx4{_fwR^GtzVMF!fp3$4%Cwr3RPq zUgcbka7}t0e?Vj~pVTUYUN{jI+Ad-^*wjGTrkfsBKWu^hn8!?Dxb*xNwx~!Rh$~dj zAIp5@cRK51;r1*|N((93rEaU5Q;P}4Yv=9L-B?nem(HI$yXqdAw)-=2^Si5vNYuFC zIOUR_O6hr2Ttl%n3obVKJ&Kdl?Mrhe8oG+aLqDA6+MDBu_2LmZNI&gy$&=U+W%e<* zOj&F`fn7LmuUG6m^DZ%ju_IW}d1tGgX#95n0)X>Tli&sE)g18{J6N|8;sNX>OaMzQ z!GdoTK)`X}w^gbBCfEIo+gMbfBAY1IRgx_KQrOoIZgA@QKv+kO9Hgy@^*3C6!QREQ zSIkykt<9h2**p~>UV^rw>-H~FKoU%(S=ZYa$!l4v6>nvi+oHrDCh0qlqtpa@>_8yp z7IM@!A!G2VeXTD30=lFi0{!o5`af-I`1nlh^i2OlP5);U_P?v?|Ke5u-_`WB&Sd1J zIO4Y6-`_nKI?H6Z5@K`AtHy4-zyIVk+}Uv7lc}#CaoVFnPSU=7YNchS1ub*)WZcx) z7!q0T1?=zp&-HHD&0Kf75Z^Q14ZY_hBaZLy=YAa@&X3FQ;nzPs?fXwK-+yc2>4px{ zKRy0KQ?KvRs(8|GO8CCsM)yx=z8v4~|LN(pcbnc7UW~6VtV_8LBergzmGpO+?T663 z>HBMvU&NcbA-4A?+{@1U>z4cB5jW7q;gTu6(}PJfE)>7JN3a{edQ)k-P7PQ)y3S9u zFprqm|BtbA?9MD~vu$iwY}>YNJ+WUZEP}e z-OvE@3!c0uM_oSs%fQ3MznMHsKm+~m5RL;y%0WY2zIR{twf)7td0E?t<-&RY;R!?N zlWrTtTh}F1t$nya_A;baTo|gmBGdzl7(dx%Jzn`D2(yZo#_!pk6h^H|a}Si~`)BDq zb}Wu~^yLxwkO8fWeHv69XkuKF-Q%JO3LV@Na3Xg<_}Ffqk(Cx9Da=V&qXNUo^EQ1=P9It$LP4BWsa+ zoAl!AqWWfq68@r56aJ0|)-d;=72P19ttKH{pWXv@4vHR$EfLN_d;tP9Q)3_=zI>}u z=^~9x4NFj&L|!dZwz7sGrq{X!YssOL(;+KDS_Xo(-Q(Ia*F%QSEmdC_E<$-)>E7qC#cO_57-n0LT)xELc2 zY-8E!{6TV!6ht@_u*{31JO+88s|@#B;SChCFC+m{s9>A3Z`THgp`ucX5UM2G-J#q! z=|oLl&V$|->DE#jVhXOXKJXbd=+;rmATuLI#X@$ zkms}--=aB9B#*&dIA^3-0z*s7^o@|wq8ZiYbU)L~{TgL0Az0l=$|7G;J|VEM_6i>r zt$84ZzT&2~;ei(#>LAe_1{FCYBIF(7Mu^cz1-`w;nW&jgze@~0-$oN#@(v)I%r;nr zln;HaUk*HET(+90!KnWBV?yVG>ztb}o2p8d)$3sd($PXl?7`}m`OiU4DWM#~Z)JGa zQL^n09Y$V2eZVK)Up055+8YE!t^~Ju;sjS%g7{ci(-pz$e#*^#c}wVr-1!$Pmt59_7d;B!(y5`&;bb zr6X6m643HSU)KfIUaxF=X0cpIRon-ZM2=_mTMOkF5gh)bL%{4_~>m)}y%{3=+=Ltl2lOQ?kPXsg*x^ucvn(cG-^ew|(N0Z9hk=Ye^cZ zt*w6sl5&wZ0{veKttL6gD?;hL2+N`#GUsO2(jrhY>fJA4imM^%T4rSxa=i|MRbqly z{g`kk;3cq-mPy>~0%&%Q8E;xR7a3fs%E4L_P+Y4lRs1s(zp~@haHB0d2x?aUr#B9*}l4}ERppZ zb3v1rY*^kemFK*p$QDR#NQOAwq!cZdy3xoY{23ifD4Ft^fPpm#;;|DcKElE$szalF zCGp3>re!ycYcz#6wmt%fYz>(?631ohq$v%oLI+7zSER%S6pLoTh|O^?+0wu>tA+6` zc#gutEjvzg5aOj2L0KML2>=$2NVIx}`THAAR^|d=r?_K~2I94CTL8DhLdlqSd(aD) zHkfyPKt7p-(%_P9kmST5GTT70!$D36O7ujdfp#B#R3#`E3iXLIj3!n{wW!~v(|J+( zcE{JAaB7VMp9_C3!fidBJlL%qeZgIEY3EA}5I*H^gAjL`N~J;Qgoj0IXmD0PBY53* z6MYM}H^|C+gd&~tJl;;Vs7-3!T`Ta%pHkKZCf&(+9>THnNk3y6CA5@3&cUV@{Ac99 zV9(_4##Sg>nuXD%%~x7#oC$3N{$2cnIno9q;Om#zn;>4A$a6AA-{XFKGRV+J3&boP zKE}ZiR}Rdb%byN!2_d+Uf>4W=U_?IK9OgDGj(pl3vT4I@sDJ!X3OH(NLF(r(l{N?_ zePGdA)k<(xku_NfBk5B-dA|E}5O0%&$ygJk6l#UtV?!l7Cg6&6sdI2-Di1Wtb=&-v zY->(f9ZCS-$?mi#=KyWDzXoRI?IAWA?Kn+1Gt#@k`H<<8VST`+Pvf+oRdV}{v0&C# zjFuyB7pB>$$SsJ)8&Q88nB=8QM@I)N%f7w41cP}urTaojO(%VzBD$UFg{>Igw}ct8 z^&uo#bF!T;C!c(S^FaCc(W?#Np)gp`r$UV#6~e8q6lodg8?sj4Y^rH$C}_}6>1a*d zfEisS3MFT997V}c(}_X5U5rg+w6&nbDRidsM{~sg5aV5zYDU*8*rRqx1BNWNJh$P| z$0~GEZ1hP>8WtpRHdTkhuuGY>FR&csGa`~T0}ez6BoNn0Onww=%4>JHL;S3}uU`s@ zaJ6Qa-fHfDJjVGgwF`|`eH3Mwwi#sU&pM`EI7_}@w5t;b1v76n;r~+K4_%h3nroPF zlxbtqf0s;%!ly_nbqGxWyH+COW-W+jhO_mGap2v)O*p4#(D(y6Lr_H#Eb0Jxw@VD1CMInF-yHwq~gkm!RboUf+sDpK$^ad+RH8IxnatHa+i}j9OBm1?25a z?u_4QhFp>}Is+!SMk~$2E7!~`pB+PcOTKSGp2hWb&&P}LVSv}P17q0C7L3VxH1ss=pcHrP@TC6Q;^fgKRYB|bIBEFyM*t7|K3-+ zoI+lN--%2F1~gIjrGYcpxJ&>WWaewaYJcPqkdAvcB14aDTKOs>?0eF^KXDC3xjfJGtGOdg% zBYvjHm61<9boM$7Y@RFkp(Q7_xO6S;8IfI}V{yZz}fEr`&h~&6H@5EB!GA zKoA=Fkl`T>mV!9F)}m_eDGLhxwXlqo6{;UoEb>UQRcg|mF47hlTka$!zF`&#mxB`6kbd zkdPS3GHij-L+;?&&N*J=TiVSuayuA3diE~iaM(zHHf7eJTGp#@-GlYHI3{n-N*Ek- z!Sg;6p*Sl@7DhSCTfbx%-Ad@$Q6N>+#({KDM9Q@*66SNwwr3lN^_y%#cPVAX%>1R+ zf#eO6Xq}Ao$_AVd(6$kG*@rJ|?5n-))RB@h1RKwy^9fR3OaNsp2+WQm$)%gyov!7S zgpRbs%$=q)W8gg}vxo_WCRHcz>ss}1XE==Xy7?->p_OLy=rxPZ$ubX4BPN02lg*Up zb6M1ZZ&dg}%b@l!v-8J(tNa5#f2u2f(AAn>!JT9b9i|?y64cILABF&prYu&YfQ3$H zWj_d0(Z&FI#aeCTxJ)viRYX_fB|7M14oKzYbZh#rmRlqJ8W%?ukSxW}cuE8!@qP#l79^}WdOr@Sm zEx_t8Y48lse2W&I*`;O_%v8SJW@`l3-HR!FIehjg(ZNp7LqP&9?=~3Kn8A)4!eFVA z0~kF0G=Z_>&FIfbso65yM|)B-l2i15V`M`7ZDBl-#LZpyRP9u>Y|_9&D4|AbkzXoncgkwj95`)grC zcyOJ5{AZnXz{}7rbLcfe;m){3$g_H`gSj&rKg*hlzaU+IoxcYDY$UUPT8+_*>PQqi zTCt%lCR~NBq(7pr(W{^J^DoFA^(}|Y0KHG5NsRe!~r0zE`bw?@IT+DBjs)9YzyktD_DnYC`Dlkt_j$fB;EOQVR}waNCViH%W@YeikG z4ujEs83lL*#yMolbkLX9f>i;hwZ=k;0x;ayiZ(^3b8RJHEI3I0Ffy9v(E_M*ckm>O zEnsu3j*EB)y0lt#g`Q0a`YO;eO0<5+#%xPErwbIo^`Trj3kpuC zb|tRPk#qilE3qbgOxz%73=Dg=oP<*DC7@_dc!r#a-|u#1;5YCdl`_Zwj#K`t&FjbA zWnp6fA2{W|rYQeAPWg|}`+vtNOFuXTM+RjJ=MzzDrjSDa2}uWHacllN(9q8S-vI;E znd9LjDUpYuk`v378ep}7371+@Sv?y4tL~T5@oi6?{r1 z^JD^~>;Mp!r1mMWJHG~- z3Wp0CB78p|uo@p*ynbn|8>v#`H9SwS;$(`3UuBPU)`R;apW)YXoAP?nHqKr1B^`ZT zR}Sk`-*m-Ed6vYvXBzwy^JCtRf0LbcuK)PRnzfc3VmWe2SRjy41gUDA2mjRUm3GMs zguDKQe#?!FHOGT8su}<>ERmO#^U~d($UO*niw}GnnI`;9xr8Rh2c}vg68ZsUays|=u&01o_`u?tBsqX zw|uDcPm>#|(7<}Kr1&5<6p(dmc|hDAc?E*r480dAI0q8Vtke@6^o|%1ff`^;FDKXB zD;}%MMw9OyK&FCum|zqOGkcS9NAU|Bw1_w`dYZZApjMrTOweKeAit*Y!-#X|e`FKR zDb7t9P_mTxD>e@g-G;4b#>fZTgr_9Ni+l?`jBQf5emLOscgV?kC!wyzAGi%|V=YAaMCuL@QtH&3;)CJ>Mxk)Hr-F1{~*EZw`(gD=HX}kN) z+tX?h7EJ57f6wgyL}@-6d2~|aiAEvLO;;JTsb)W&v3X4Nam)_;ukA{yKST=bp*L&A za8o~qX4r8YQ3!xcE>B80By zN8KkK{l1%c6_S!^OY+7GFqBJluD~W(j{R#v^#WP7_Vcj{&`X7(g$Co86)sSe^$jCZ ze>M88{GSHwCz2a-*|Xvsv~(|4=TnS-%T}NYW4I_k??Y))dX}V3tz`6FvXIe*KY?DX z1=%8G{VMvfKG;g>_d=4c`8To&Ei=hi(Q!zLb{ZKiUE88Ii)7@ z?#VW6`bsV#C(Epo)X`*OeB!>RLa%Bq8nQCBy*imm5(-ydK8e1(7bl_0u)o)$c7}TD zL|SCQp!oV4-A)igVE%szq=JH=gwRevH_6b~;DmrNT0hSRg~xHQtA>z}}K z3q11fT{dc}5l`0LRVJvPuQ=Q`>Lm^inoRHC#8PijN=7LPg)583NbM}dFai7LJhZ9s z7se~c6W5+aqR`TCrckfJ6+Tj+_JXz^H96oHQBPkw=2 z?|s6XxAm4Se71^xKZ@Jhlq0g|q(ZhC)rkN;zbG9gzwSg`GhEQ@mtTtCP80y|zMck+w9tVzS5$jS-yna03 zq*TPiFxAtd?%Vu{7VaBsUTk#Y((Q|J9!t_|Jw=F4JYe^%sJn~Q;-F8!bhPLc2%6Zk zu(abxK4$sS-}4^7P268qMS30euZ`sh^$o zYvK8!u!nBBStD_@XHpM#J1(Z?cZ#@#V-E9yLq@hqyyxC^!t_=d>2}`8;I;^z&Q(5p zv<<7C(v(W5pXzh=!~@Zau{H!-r{B%!_qJHL{2J+@Mv5GEBp8QQRO3tT?0bXd3fE2tJ4_7QM z>ZsymY-K)8f<{4CRkB7FD~1s}!6rHzXa;tvhQ?&=+OJp1;b|~4hH6)=&N#SRcK3R& zl1TP)t7#ih)5%SYX-k!z3u<8s3`FI)u1db{c7($ryzU3s=Su*MKVTrkQcoBq4fCg3 zFOM{8uFATfqSn3R-2#fLO9iAbIGMRv=;z2_ORHNcaiUV0{F$Ls-v_4ip#KGOJW@>S zU#5#2y&h7`NjdvkfQ}QI*0EXI#Jg~mPyGcTrkFZ>>T{=Ob}@v57qfS={c8`KF*OTh z1~X5w>+#!ezYc*Hd8Yd+)5?bgHEsElm+oWJnY!JJy*z3+xbd+#p=jgs60jjwGKT{z zQcm4)y^QXU??}Xtx?=q$)_E8!*<%ypt|aLM$ac^B3G{6=!BrJMCX0_Wu8S8L^Ni#N z_FJUjFW4H>2y>EKy#L`Mq#!zqaTZ9uZ2g(5HI(zU5TJSdjsfZ7x|*;qpuX2-D>jn$ zkv6Y=hhhh6OtEJRNh>SoO{GY43A`(3yFT;1P`EsL+~%w;+a#bf(&cm*B(1aJV=$3s zd;bgT4LT>R`|T1u62&d18)Mdu4|UB@;4&J=QivDG2ZE>Nq>##I!s&Q;H57u9-hR;H zizO~vBQauSiY?ysboEPBc4E=vhC+ErSa9gAY?K(1_nuJ4ZhW+QYkIrD%Z@Rv^L!WJ*6?s#%q_# zUA+P~;oB?ct%DMvXXg zl7Iw))k*N3im!5Zs>(&h_L03|x+w)!*9uVWx!o>~s`sqhgOl4-JEpxbn^?}JE@t>4 z-Hm+4T_(k|SeEjjvn$Z<*oZ>gs@Zu9Vv>JPfUL&`Gh*HdeUxKTk1$sSJjjza$|9^T2IkS0C`Fu(yO>) zLxGjMj-iisjch@yGVszk@T8Fjey{CvPQ`OW4QNgcOsCu{(MGXCuTX>+w^ovFGB?mA zy#>qk#;RrlIF(78a=}C^G?|K@-&*#2IrR22Ot(N*M#fcZs(z#K8=|ZaOKZDaDaZ>w zg{ZZobqkfA?mI+0GZOFEq}ds_k*X#aQPzkLZIzZ)5#4CoW!i6tA_aL@-D?snGrRhH z#nsH+o^0*jM$N5YV2(IjM&3rS`wE-bq(h1J=#nne8KN) z?y6bU_{&I_2%#)`i@U7hR6R4-l9cf*)^NGZUUG2Xr0^iit9u@l8G8{}=>avK{)#Uc zQ*!Y8ZqrX1r+~TG<%wBg1cnL>xWY9h!}JPJo>WmP2>;@rh2ip+NQEe3%6$lL1;mr= zuP3cx`9|gp7k3=zfzCk2CKQpP$`r9X{&pA)3DA_L&|r!2YJV6|6UDBn1+ce7bLM$p zDjG|c*>+mZ8%_{2+LftzQdQ=uy1o#s1iGF%JW>C8ohY-EF&UMM!((dH zg|S%6MWJRXGV3U+dRJTASUhpQ6+Oe8Bg#I{$@V@N=L0r47IKtZD{2TIDsuSclwtovOPPUcn7a+~a}ao5O+yT98l!Dtt-Z$4`>R zd+to@M4V#`a1J{uO-5@_7g(T?2Iu1u-XFO$RPp{52A7g( zF`;A(qVn?qo__Ls+H9^+zIsF2x>5CZ$lNbgN3yN88jm(yEBtz=*+Az^u2lJTQ|I2_ zCP(zmScHJJsi@zH#R6yNyt#a`5vKHX#j+yR6#y+x23MDExv;w!oH4rrOM04vzNa2{1SU69!-dld zb^8-}X(PWN>LE;Skji4lKAbhbzba4TDp2=j1%#~&?~Q7r^_>!lMkE?ZFe$>QSj&Sq zzQ)zcB?7`ZI-GNHAP?-QOCxd-38&6=JEUJ*EOSS?8&R!-pRz{MT?3XkMRnSLN70b1tGKM7xe+QD| zTzbRi3@G*hI?6{o{Rtm4xlnr?7IkW4SF`0*>N>`!Biv~iV8ovuK}0(*Yd~4PQ*ggF z);^cvrTum|)1bTU|( z{ud{M^*^G<{~dd5>5j#cv?F(O%>K)7LNv9LG6ewztxUY<7X|5F| z^oc7VlmP@W9kZT~%Q9nncR^(i{Ot#cr=ePIQ-PZ=Her(u*mEZG!Oymzt)Jrt$wtpV zqtv{f;H!!ahLOCUwk!Bnefi<<&#PDF9ls_fKJx|rsoTx->9a34>bz>bwC~0CKlPs- zKWL&W_*f!Gjv(fY>r-sgZPRum4G?N|*U}F5(NUJ)ZG*U@XYQ-VM}+hpIN~VXL$@FB z>ikZoatr_LL2X}!K$=iS3;LVLB<9$}_kC;HGq0~CWstmi0g}0yZ=)ngH`Ua{sHblw zKH%=p9$&B)6P~T+g4>_o&H-WD1qq>8sDaob@CMHlMuY&$dP?=-+P> zrYf2}h3K$%?`808W+eU(3z3AnkiOE_Xvm2mMTRi|oL`YiTPWZ{*~LT%RV({dJh#$fFw3N^KN{-~j86>eIBtI&At>{W zM#w=RrshB}fj#<2y9xbH(h{;-=3ONvsxnb|o^qG6;YzE?47Ozoa6{WUsWa0tgsiWs z@B)ct61ewkj@2##Nb4MI`9;@~H=&O}a-$h_x}58}YjE{*YG+1WDmVqR8yE2b%C}}1 zcj5-AD|tm3*+cM>AkCA>zQFn$-9J9`vE|q5#N5~qj4A58p zp-~ybJNzDCnS2g$;o#wNe<{uVY`$Yq>kr}Ih3mK<3ICovT-JmlRt(#2K#h428Nwkk zAf;iX5GBDIrU)lHNVBfGY%Y=p77s=30_vL!`n$>u^mwrmNqs?U>cf)C?77*P%d zCj39mR2oD z|6wNBJ-A9&NO86#gT$stZJU5ugY~BBOf@;s%)MWuyZN5DvOJ00%ruf|Aye-oxeuU5 z+dVL=H&TlfR}>HhMR=RGJtBlD&=%Ka^mauI&1E%)A)z-kPJE%T^<Ml;lt;Xkx3h_K}cY%1l+PoNhtnieHPv2R!J9#H(V<$O zxX4#2O2ozvZ7&=|CFZtfoS762Bke^hQ^{3eDMekwPjs^L?EN4yrG%uylq}5p3)hMC ztauItif-_d21-)VCna=n&noqW^w~RgW*gGb)0v*im}z1JMa3d=mIc^$M5hN;k#3iA za|lXCD-A79hX^w(+!I~q1l88mqmf z&0Nt$e)GQGVq@~2vhnab+t*ipa{XccB0jKBI?@~O!M6xjy>`_)^pW21NK`C;px;Uf zv%3bH`c<7#36qWR#*q8P@}#k@tKk(*4iRF`zr4?u@m}9BnZ_}P}p2QQq zacf8+3{h%2sFP9)mqi(wvH>RGNdxoqNuxDo%*Euw|JhrfSgddj@w_F zw&H-Jd9dTmnc!Cqsa_q9??h`b%s_xn(xVE0{-tdQ9^#Y%IW>5<8d=2pb6=&y$coi4 znIk=|s$_o@cxrcJ`6n2yNA4`?Vz zbTdZ2Rog0W5w%I3^>driC_qKpfN^WW5a&hwPUxwOzaL|S6-wGGqUjoo9F#$nDG63+6YK}^im+N1! zk(&t!9E_=Wup=#!FJhiVT7k>?WRXm1;zHm?rz!_3_c~pK^LcQWvq(&|aMOp}x0w9s zHl|nU0uTV4C73VScu+$l=+a#IL&yj&v&($XQ(fC+FTWD@OwXDTsFFxN!e27o{$^@) zzpcsaE*~^Tf8uxJi5hzid8W~lTo?;&!}$VfAGMod)e zn%CdPR`Y4_3S8G#wJ8rfrc}`s)WN_plp(70{xFE8@my%1|C*+iR3YMN$e+$qSdWn? zJ}f&%7*bVNGY|zWhg~Q@i7XOH5$XaWO^WWxNg0oXt>k)KSDd+Fo6fMXb zUdsp7t*OJB*0CDi(V$_9{aMRnJWZ&}`bXY?Qz`3UGd>Nw>+AgKlJzpZ__YbKZdSZx z$BGUbL5g$N`|N4);IY3%hA_W*Ava6G-4L~@d$1iUK4&74GxO-AJsnbF$ z(2q_26aLwtf)z3`5)AZsOGGhr1|R*vnnrktXPqgXa6ay`Qd64{XT_Ce3QgZp>sy>v ztQ@3cnJD&?dKSXAV!xDZa!H10B?p^u7t|FiOevk$m|e<5xvLh=V#Wr`U5-wqIzlX% z!v8Ha@yJ?UYS$k(j$lSzs!4 zy7RnKY^Wn#+P0YD>o!qIM{iu<<(&({j&h}<2V+wWgK+DA^Wdf$#M4s`EUY%wxu&*+ zNek{H3Hr2Zp}Kxab5)ilw7e!qUb>fcwhu`sSUn@o1Cg>@@CULISYT7#4J=Oa=$58} z4+fH>vGLCeIaMtk!0TD^KH6rGQks?kR;Dds?>9ZI{1(Q<++r2(PdI#T>dd5z=X977 z=ZY2SK4tVT4Dz5`(^|5MU6kIsn*ox+W3iKDvTW2U=_61|2|&~KSEZDWrPng+6+Y*- zQjr{Lmr#OjoQDVwA*_kwWR#+577IfQImpb4DI-~#a_ro1Prrb+e=|0drXwO0xXhPR zu5Ew>a`nX$^74F<#EgMCqM(C16DiiEO*^p!NoF6!NYS_ilSX$ZmF-HY7k$+mRk`*H z$}80fjurBGEakY}tpn#Klfc(MVD*xw9i;Sm#jqNl) z<#7L;MQ}RLL4qJL*z*JdomUliLZziLSo`krq>cwuEDsfc@56=6FB3Qq`_lMrvBEa) ze0SDROp5bBHd~DGaEMS<_Ri|<;sO(;YuuhzN`!k|cOSS)ieyqf>8d(w zIJAZ93vGvtk&*eWCU8yRD5wfm?{Ds}2u$Yxir93!t46klVzMxo$pqHGu$Hf9T(v7v zV}0^NtX<>Q_WCfOw=zNMf^5SF#qAJWZ3zo?@aZJ z>2~}BYJ>*0Bl6)^(3Bv(8HEWceRq6wZEiAz{`sU=>M&|3Q$7d=97S!GHB-hp0^T=I zT8&(wnGrQnGJM@4Qz{8=LA-VP)<;Ik_shn7V-K(VLi0eenAH{i#pdN%t>q@rAh1o9 zi8+gV2%Y{m-6Nd{rD_D>p(x^40aBPFcw*ZHcEs_l^wi*|yo(w5?M0xaImAa!jRX9y z)z)!!_>6~Js-k5W;h9WbxyHIeac5M+pUPnl7n&jjYH9`KDYp<-XTAGSjbE#VA&r1s4KrQm_@x${x-S{2HOZhLq*Z z%d#k+rfIrSpmFADBM?B2qg!LL)DwJHqu1zrH%DwT8-19)D(or5)zV(P^+xcSC1!HS zq{BzHD+A}L8%Y~Gy5Hx#)mCDPm!}$5?qKhbLmFR6JouTM^1Pnyo}TLE3L@ZG-i6$s zK#7nXlQuP%+6u}c6&>-YY0lkLpd`uttt-KZ({M?#~u!(7&&#GB?20wDiPeH zog%?PxdUTjcljxsi~*=sD80%dXldkf>~{{A)%T&#t73QJJCbnw8d!w#V5`!bnv=c` zyxHQ-O&^HUXq+Q3c3wM#RgYtgH)2l+st4duL$TpK_}`GkP%`2FE6w=-aN_^BNc_+Y zCQgq39^zpAuPL|x7UE$2k0|qhrx{B+6SW(hC|i)D0v=niaj)^Bz(SzU&CQ5N27U&m zIHyBENmHNSvwx2VxWkSTFSCk~2?cQ@h@${y@_eIqFFiAP-<=n3TiciK6+4}}w`KxY zfB$*E%|&;M|x-}!se&Ah|6=i_H=XadzeM&mC{d`EO&c2?gx=k`efhRD4g*ur~G5KWVYO% zE?s$$-VO%?kuD+{YdN5B=lv6Tcl6Ur z^e2e$y-^ii_qJYr)LS{rD~+3Av!OneP6zI|9>&$;w3J~0waxp!_>a8n1=vwbD3R{m zGDg!6$+W5Qt4yYp8w4a4Mpm2#E-QU^3ETK-o0VL_J5a03k*2R?u891wGDz2Kc9T zMZhGjkfEoWL-`e$1(XYCxbd0=u(c?11oEC4e2f^`ff|z`+=7}E{9VUZ|7aY+nM04Z zv!?tfQdmNWWb36yMZS9lV47G5M+gc+rpAH{S}m!Mhq!$^GkSzSTreo@x%EHFTI^&I zC`h;}_1Bs=a^$lk{4T!r?t68lixhm75YtF`M3_kM^NCIwCK!L$qLdNsVg7>xjUl{< zEK$ZkNo=u)kC*n*hgmb-&@95b;sbebMrkfCf0ZCFvj-)4`VnN58M(=%>?L2cgp6Ab zrUgoZPooh~fFnzMZ8l5lP!R`{X`&OIU}phT1fzUK76(ip=v`k8%$J~RVWqJdJw3_g zh@!gPNt{}R`o%@iiyBM{;TJ$!`Q#2qCP^O1E=46ME=NKth6C&ZpH%Rrn@CfF?kT-r zg@k*baLUIfJ3}@V|H)x`O34fmL`!4oHwtIAaxx^|C(b~dloq*GBSWlA2!0fLKJ?96 zF4p(a@asm7m+Z4g->M-`^pQr3U8Az2Un6E1Fn1Tzi_D`wWJ`^A4$KW!vV{xwzh%rT zi9U3MV2P;9AP_22O0Qv#R@E4(+)vNz1Hz2r-*h@S`)b%FCZXl>ug`jJTIa)*LZdHt zGtEgd=Ax}hvOcNr9fLmir}meW&|0kGOcOQ({>ltZnAy^HO>zV|L<9-tV}en`1De4@Val1 zl_JO@?G0dda3RB%FY#?D5x<%e42GH z<(r=Pz5Hd5w zu{8v!9P;V}^iJ2C{Q@+nK=4@fpR$-A(v6==G!e5T#JIE6q;JS-RoR$tZk+E`mJVhT zhwqTsp?2reyQmgtLQ4SU4pXZI-&uMw=*&ApUjvAq3k2KGE&AmHEXLXUDvK02De5(Lxa7@aL$H5V3+gDARr{{FUe zZbTvTwK0YXWi1=jj7~R2x0>G%lqijY`IjKDaDagPXk!MuK}Y*8Pl0++YDXY|sa!^$ z;fec2v7`_ZOf}Y*HW`PJOZ}vxq~>QdmB-B-uzesq2}t2JThjYzVVx=o8X2}wRg4+X z>)Z~gR+s%l_H?sMSUh|e=_=}Ypu4J3@!+P&);mXQzffWNnGU_8Gcbka9FkNV?OA>snI!2eSIKW!Fa|dJ&b6ihDCkI5QoKW% zV0ml6Z@@VwT-l36@K@Vh*@JimSp=y%+t|BPZ31dy2RBY#UkqVZ#S&CyBl9Ffqdw)1a*Py4F%J z11PB>i4TCBD)`L0)o3J3w;OUTD85(BXQQ+PRe6ud4p*&ftg7!I7>K+y7j-(Dmn``K zmXh;pUSKq1a)pxf%y20p`kvMncET!@avPZn>_JvL@<@iK29eghd6-c#MY3)_aFs2D z7!7Bg%?KN}+sn$f?^$YLe)11TwNqP!q1H~HfZ?$I_!98O}ae|_A|2dnwkJGnWh?6*l`r9IzoLAjipTLyWI?i zYOlk-R32^QeXa_5Dw+~*SpX3t9u=EVN~J-7M<_h3Dul_?r)Ar6K=au4&D#1Ff_S-1 z9qi21YQshCw9G~~`3mf5iLRmTOJ)_31%t?iOXh@k({Z-{*}!mO;~i)MLrrseAtd6N zzmvJel3tGXrj^{h>q@o|fb9(;QED~$A4@GoGZjlMXQ4w3L&qeZ$Pv-%8q6aC*c=-M zrPasM7Ln~*PDU0Q;*Was)H_r`yXLH+l8<3CCA|NFhs ztvO+b!vxobb1QJV8B{e=>jsVrzTDu9Xpk>33ppzia6G?Lr;}AktIWz_83+PgS&fei zA4W2qDX=kRZydA5#Zu~sG0EGe%RI9)nTB}$v+DV_^ALAs_IurKxGigvHRdgALH*%w z4#(WRh|8BFulmDAUZ52xuc!WGCpE!1_jOU52ElX1jjl(>OuiG!TCUzJFu?^2Yt--W zoTg{M7D}zCoAa``z$&QE1s{F82PDxGh5>u5LszolIl(Yq zcTaSCJd+J_WL4}QKGgf60XW<1zg!v;9?0uyNyz>!T*JUR-a@v1&0{t$w%i6AXKJ0hD5#w$ z9h3$u-d#8%?u#q7TjV$yrQ?1V2RIc zqXCC8ni>WjB1>kkNo6zsxrFOre7$6kCtWmaJHn&ZxjQ2wl!6DpVMe|qI1fj!^`^0 z4V9Fmoq~!@a$h`(k*1*d_cGhf;F8H}d3O}f_)A%(s+}>#K_PY~KWmQ?JI&PX)UHAP z&?pZIivgAzh2K$Htn;N$(yDUG9KBdX0Hzjx;)EG$Ru= zP5boUD?uU10^(0ZsnkTMd~l(4a1R=qWaCIir681fwH9J#T1Wv0Qy-(y;+G&VM^xT>zcYNfx2Xj8>eI2wr$?nwr$(!*ywcJv2EMz z*tRkK&BLsDm^FXkyqtCF>|MKdRkWecM}0SA7-3qw3CaBi7dl3CP`>rerL35v|2k%v z$OqO_N>TJ*inBU)8ymc{Bm=H7{5i;X*y~3>9TkVQ&mOnN;>f04?75j}bdz%JtyD9C zaj>(Q_ZvXPy#7QZJJsT3l}12-rV5b#Z@?6&YP>^SchB-cYGP_`P}ARYR8>Qsk>C!A zWU`F&ruY~AM6*Ap-;pmWnMJh~XMKPTbYMm9qGj=!kckG@C0%&&h=xPi2WujQiwTai ztB3Q~*azgI8lBGn4M_j9sX|1=%*4+2zX6H;KVftKO^*C8Kw|%o#^e73BqAarMmaNk z3s*~KB35>GmVZYI2p|AlT%FB~><|E+ITu}Uz9~aXOac~pUFO%%I!Rqe^|na}ZNh;W z(6B#aU`R+%L{X(g`sqQz0Fj_5N_2*~L_x0bY2Hu&;Oje73J)g^TrWXglY+4fvzm_Nj$+Xt$ zyd6Fc8?uPMIE>~o-8C#9TM=38=`+ln<$A|4gRcKXo(}BXR~)k2_a-FmIwqm-HIE3L zr(ospqN?J@w~p@}lHVI~TopV_`|$?=_ASM}cd3#7yzD&p?+$`%A7qQ=;A(DqcF`ps z5saF?J6??D%|*W&Wm4pNv5@B=aeBB7bI3HosOPZIRe|d(?e%*X)KkiXCtLNcuHRKY z5%&(PxBh6v(Y#DZH&gnnP-Uz9=x8#j+C@|Irw9_sYsO7$_zLM8`;TVF2T;LZ*8*_}c3FN?Po;o{y0~i>w(c(IpKOz6=7WuPF#VI-Pe|@5%WX4j;bVZY-R^ zYIqYolkR_SE_OwIHGf}!TcBAgr|$`F!=5%JEdKEMe*6?X`_3R6Ll~S>e1Col5UUKs zqocnTRQUM3PPRdlMVB25{R#nsE8Qe}eEqjvQh+K#eArs*^?%277juK}^^-QTx z$r?sW52T%u_C8}j!tqFGYi<7-9ingx+mqQy>z#dSbZVO>?a26gEI|Jg?Y@$Duhemx z8g)=c!Mu;EnTFpfIOlZAu1iDuf5+329$KBOf90c!;JdP>A(GA*O^ek>A3XLT90C<2 z5|s`Jn1X-mN+jKoXG(ktbxVGQYMLkO)Lv3JrwoshieS8c^o$>UdwtHF2k3v_zvZud zQyMrV?#Ui3Cx-ln*9bW^1p849JMTl*t#S7pvUjL5lF;$Td~pJXf${X2ouus!R+d65mm19ht=9W!%MH z$eE2e?>`a}30Sg7-h(xMgd9i{^6D()f=mStqYiQ~8|Aa?W0N2{NR=652J5CG-%aL2 z*WHmB7}|>bj0o6;rLT(WFJ}!lx|cR+?*u(3>ohTk2>al+Xr@M=#67F`Oh!9IouKGL zfDAG;_`5BabfQvJKNhO-FxrU39&Bwu9*7PYUUK3=pM0(LH9`*r(s1)MT!P)DSbQ@F z(#->FR8e2=aPM$AE8StnftaG)$KDzC%t`%l=t!ekG3zL+7SH6|D~vgc*!(B_2_tx3 z!CM_^UZI$Y5R^7{pUE0KBeA{puvjZ1cLaHJP?G3p#Pv8GiKe{5+V7M_YY}#e!n9Es zSBk+jh&43Nl9QX^4#do{i=&Kg_RV$Yf!NU5V2~MPVh7uiMzNJ<|VjxY@u$v^~8 z{BOenOsox*)yQY~W^BO$H``U{!xr~O_J%01sa+nrh4{=mV$ap|+P&x1Q1Y}^u)bQQIq!QVX+p+R7hdxR)@`zRJAH9SpGZfnXXJ19envIY3a7)S zCL!XYgYDL;b6LRDg<~(?)=R8@Po0mgOJEF#;a393E9#>MJK5wEJ`)&prhMsJ`HvsX zl@|58y}?wwMf%{S8_%;HE#Z>d8KUNaglIn46O<}<01sD zR?_(qQEEi^&CFMbormMNk%1kYP@=p@S*xlJ&%Rg|N;^!;l2<^oX^9A}k3>0H7wSA2 zJJ79!0NMb_j`h1#6hKNQ#;B526JY>eLKF2jCr}C2v7RKjBH6~Vj~x$g!42GmlcV%V z+ZHM;$^-G5OsMDK5tGfV#xsce%^o-N!BO}1@+xOqo z1uhj_=uiC!stZEoxQP;S!PfvFbWdK0eqOV$Fylv%u_7B-C+%Ad2s$j0vY&sg3>hLs z_pNu}@JQ&69z`w8mzT4uzpHZ;j0q9r^1oQ4^L&cQUkIuyK^kd%yx@+!j?B&%kXw!o zAdRXY(au3*L8X2kDh}&e?6}S^#q(C1c8M!a7%AcBW!t_j9tk4uXENBtz znr!SBd*x4xY3f_7Z2@snFVZzmOl13_M z>f(Kvka}p-61%EsdHdX?Uej$@OUuIZ1{^gu$!U z;cVr##zZA*6BjPJXxv;eY}e&-$VywP$SCcf!3VH0WLxZQPx!7il6$|q75;wZH24@| z)c?4xtf9E}Fj#iIZ2SOgMbBZvyOLp0B>41kes67R`tb{J66%x~ckMJLI;Qd>FlcNu z^ckSe2A7bmdq;VTanFHKQ)}~Vk?H&1kU!~$Lx@(sz+erp_VjnKQ~%-82~rn7}6l?E=!2 z|IPa@zaZWbclIanJff8lhn2$3dN@zOP9Rq%=_RvX`vQ9(blkhP{!jEXgKnnAG!LYi z<qgKWkHULwSh0gjX9YMBIuZEFkz$}ceZ`hV|KK~Z zbw7DJB{N~#x>0pR+HQMJfH|Lg=hGN}C7xnA(qhE&&Lk)o!=7RC#X8?vdYz;EH zQ}TAyT7?~zY+9gMbn)7+MQu83qijp2AC#I9lsNr+zv)C%7rp|^+)O>3o{5HtK3Tis$FOI@^FA z7W_h|JN|axp5cgp$&&U?K^{sSE%lwJjGtalOWx=7dGg7hrBJl#D8_-=;sgjn4q@0VFj!bX|lS{>xnk!{5n_T%x9C?s_? zNSw5rFu3`ZJ)ybvjyBYlm2vRu1)ogo*6t0d?>hS77j5faB`ZYVhYF&=Ot?&1M9evz zy$`N-4Y0=H&4;aUo!2|Fu_mE%O2Qu%>c}=`?%tWVdw6}ixJ(r-6}K=Ik`d%MdaA~n z*TTze;Zvu$D~6-iDSDvz*b6FyYG#&tPjNh}p!Cav{Mc`R2%B2qwAKX;P&n3x#t5n_ zLXA+3>^Eu%ooe8c);mPd$%Z8>y`G4HCjvX3`hS8btqplc8Y-aHxx=xbg~)ou3R-M- zxFUQCpzPC8rc!W|wci3cpR^@R?rjQw4tSaddRXt2!Pmm#{&?qJl*0xv+YMahCPi(H z=yX;=rQKtcF7+O=1C_u>;l&X;`}*?s4PltF!53GA(4mFYa}UcD?j*<+h;RAXXK6&e zx$@#?Sa+J8iK3t*#mOq|HN^;n|sNGceH@YKIfuVZV4w%+g=92I|}si zdd{{H`jb7pOM?B-J>8L77F23okj<%1>49mZLZ>+ZSF$K%hmeRf`>~+ zc$%sS#VE+6VWe!x$AsZ`Cp&huRZz-H5f9gdD>y@3nsap+bNcoTs>Ak>HAxkf=1#1Q zNes}c5?%w)58Rl&0rruq{!07=aT@`C2t;nTqs|th^eeHOTcb)_aD8Q3I~6a*SliVX ztoOXtBjONJ7Ar?fXcx9@`WVg+Y_}aUXsyW+9+`|6Uy&>gq+Rh|t+u;8t5^FfpYI-* z`LUV8c&T)PHgo4nG*ClNio|D_VWsb{VXz=k`vQ+u`3;9jg3UMcK7M^5o>2yC34N0M zX^CRi;Uzy2QKSxjjy9A>VZ#J186v@8NwH_nJ)S1!@+CT-i@oL)mOMpwa!<_w9Xg& zklTVeluP!}_bxQF0XF&#_^an?-g09M1AzH>S4Q73xzL zBXnmrA%Aj-I7`wEd7RZhYlWvP1-KB}abKX;(`)(froFaq7nqk~u=>Jd5BHui#WL6= z%k;~+%b{w87=H#E^(WW%SN9RyH%?rLS8;=@h+F9)ricqvM2NzB@q$-G9l0Q)kZoaw zIT>YTMHh_6qJFOQ7ma45AWOM)#AXkUI0Z8hXhP;onhY01{65uc>W&uW1hM$hfCP8P z$ZfLQ=Ht-aY$vC78yVd>9!_h2`JUH_2zbL>uf`MT*4NE}pT=XUg<;_Z|ErWWVz)Q6 zCuWX-3&R>p?=yc?vot)p9g5(-ZWx2GylNPYAciZ&J;iaevBQu1pMTH}XcN+Emq?wn zJHqUevC(IsI}cIf<(JQi_9m%1aDnm~M?$|rYZx&2x^ zH}Bm3y3_>skoEj?NlKmh;1v_ZQVC-~nyf}dtnp8?N9cM@))P!L~Pa>^UBXrjQ{mdJS#(9_?<3>2X*S zRWgY!o>hczD&TeJ2<44mBBf?a&NnnCPVwLUkzlj>$kLuNoidM8rj1>uD@wJ9D{ko! z-;>yizH-OGLcq@P-k%i8I>&f&Lc@P!rMBAn+RfxNXK!y+oYADRd7D7<<|-DfEOkH( z;aFlp|BMGbaU=1Z{`iSW;+p?lkWNDyFQqSrEJx5od4Q?|PG|6C7$ZE3l6K&LrLZ2oSO7aeDvj;< z+*oC(+br-pvJj!b&)@hoa_{gq)kl9Xbl+9j<2#n4rxS45I%iVT<-HfzaOHXWCO=YG z!h_dgcGYF!U~6X!-zZi}AAgbAbvTmFSeEakXnZ73Ke4jS*W=^nd}5{%m*;;z7;T%f z>~wP26|=7y-kmHEkZsA}CXPO6Gi`Qelf|i;iVGjb{AI8p+8(BjQZusJAS2!Y_4Cp5w`YA_UUmv)vd1wT_(-#V?uRi!f74B6VJGkN9 zi=RRa6Ye7`giW_{rHA9v8Ax-sh%SdDSKSlX(n!?InKhBaA&%}U9irk4xwF=(_d#?Kd(CC;p`aKB=i{I~+6scaz^1WqgnfH1%^j9%QHMNKZ zS|#mYOSRdj>j&3@nyt25wNhs6jffV}t(E%~xBanUV>R(#{I4U0%tJ`yU`Cb#z%>DJn zAt>S^F4@boXHX>`>8D^eH)!$`gt8uEgZ?1 zvM2APH|05k`6hxRmA1#KL>c)O?s=(B4l}(ZbJz)ym6}zqI*jAMd$Y227+~_|Y6l7z zN)R~8Nt}=dM3yJ6rgofJjpWWDjBQkJ3QQylRh$qJSm??i53g753`s2o*pzb<+(myM z0oj7j_Fj$tfmTVSc^Z5;!K#7On$^gAMP(cIm&6~ZTc_qQlzNM2KX> zMwx}eFQojX%u40u;0wuc+6k3vxP-O()QMdwNU_t3`GgFJQ+r`XY-!OL5p6oG$_kO=69^4K=pT+E!II@^PnX}?l=`(;M z)Q{#NTJuhux)vsif0A%$Yn^44io=N%BAktmUwsPitH==qvl**{>SjJRo}b8&`mQaI zx_rSWL+5xgAG*!LAA1xxpPqS>2@^I3y}|TcA*+PXH(&4|A4K+#43b}N3yYEez|W)m zMVxS*ys>BF_I*8vF{WzlS_M0w;ZGOadO*lp=e>;Jq^KA^#vqc>;D6t831j>5tefxHpMUOg5BNXp76!^Zv2 zYc)B}&V7Lh(Pqit0VDPKoaKE*@OZ|cb`5y5<}RljA?s;yA?vmtvH)vV3kRaI&xc)C zQ|T92m!~&Wa3wp6zxY&?Yo__0Ug>o!t!q?R4fXI6eeG&t4B)0-f1gpa{cEghEFUs` zv;7uH4&E|4;Yg|?BC?B5(aAGE0cr11=NvDR$Xc0nAxBmC^g@nBV51wxf5Oq!NUOnZkfRaQ( zHtt2Vbrc?C<Kx}akjLl0P6`k)ONLoe9I^xg;5GTNXDRL8X5bi5-f z=nW09mUJP0#&Jf_LB|S+t({_MuTyozKq+lm!>m{c-1kQf@*81TJ|!@uu}6OLf>b5h z)RA-{H(04f=~tLdEieRfraB0TG@%p?FBqpTa*csyZ?1oNU+Cn>yQ-woHC$=XgI}nc z#373=?L7zllI;O$bCm>b$7-F#NF#GW1wJTIn+~u&VteT<2+E}!hgU}~G{uPD%@FZ7 z98cyFFmzkG zU|r<1YGBE-1&t7se1e4prhnP=Owo(sb4z5ywtI-fw>_0!4Kv_kdJ3P!mlgm?r;>0n zAUo|LG9(O{aCB=@dr3)j1IDT;by`%&z!uD#%u~!&WinSe ztPQ;td=S;p*5S%AG{7r+!6h16!70nIewY33giK>qjCGcOA>Yf}bRJ zAsF=s{6y$B`ffSybp%Hkt|^K~+?F9la{-1E?LBpKzV+p|4}XTc7bZgmNVNiW-;n@o z=z=95F-i6iqb>d3kel}45v((>ohmQ!=oA?NrX?-3nNvmj!hL=45?&>@@(*w;U^s)t zz4mS;Gl4siJajZmz4eX@IxE@{rg7D$(p!%U0q36+;mvDB%L@py5|=V1m=R#C42ZMS z7!m17gxk2_-sfg+Zsf8_Bg5)-D5;7Rrpa-?wth#@2|KJ&R7?_-#L3pjsu8S!lQ>y- zwQZTH(t1KvG}rtXv<98U=Kyev@P4vkDjf8KHtWhr!XFSZZ@-b07eVsPkBNy0fZg*# z`xc8;Vjl4rHNckG2=O?JCH^>dfv{o}jpjmhDObJuDir+QutCE6L&rdPji9;|dv34Y zVY|8-!fp7~(i8N0lqt$s*Wt=q1NucVHVP*f)X z(nLo`FIlHjl)#2>s))7>vps3b6%8%{yPC^Z^?xs;p>x`_v-7eC7pRf~|CDK(j88L0 z((t`^iulqtVNbq`C0DO%@YQ*m*BMLCU6JU*yF`~sp!`_UQfq<)5=C#Wv!K7hl}k{m zR)iFagj<%C_?|deHoKx)q?c$sWO%GiT-=|!95U76`5qR~Mz|c_7<1dwL}+raP6#U@ zTKuaWxF-*o(D6!ef&^$HOz>QJBlOh}Nxks#6=%|EBMX1B9JP4GiE+>79@duNl^9xa zLyQww8TO2kPobfdfK31)_eRsCwP*1yTny`;J*_!@Kl^5ks*(z+6!|*GS@pmlLZ6oD zySG{@p!l&o6=AVQ7)Ah8g@FmckfIY_@y4H(!dID65epFJz>){URNFeZg%wFZ92MacO1 ze7*x>ih8*kwwM(<6o&-@Ijf-pn|H6`>~3zd$upGq$&@LdpYzo0W(ZXxjLCs9FJlHU z#9J0rcxQsN=4zq!_4icpO$W)EX5>3zj_%^zenMIUok~WLs}4)a`4yo9zueiUT-@d+f+et7T*IQkv}&+#4!%I<^)!QGLl_#Cffk#e4TrI9Wkd%+1>|AJ5O122Po z5rf1f`5hC}?H_yXIvf9jFK`1&p;ZZ_OoT>{O-DD(Mgj3M!F*4t&Q&bQs{^Uv~Wn3{MiA94~edk!&TP z3t{FnkOi1| zcCDjw?J2}hQyj~jI$G%<(M3I8!|#%eNJgqi^izDSSpQJml7Qp2Vt1gro#s{L1B=7< z&eROS-^lre?9^vft(Ac8GQeP0l(qy7@0XDuY$JML{mv^`1q0XOH)kENlJNN_I0tt# z?}-@cB%3{pJ*R+~DpstaD_ROw~ow7#_Az=MW$8Ut>HBhAbjchMUSHX{oMr!Ssl!?llr*I1Lm9D2x5TDKMTkcyow1QTlQo<$~M8fH9sL~V-+p_z# zU{3`>vnx=-xo1;VXRDgI*I?%Q{4uhDMmXqo{(H$&vE=2dlv^;ZRr(_eaVjOTIyZ?4 zqTdh^oI;|TAe`EW3ol#@%RT%*?WGYF!nbVp){-wRahDG;ug%MFYToDHz=Z(OvXIlq zuT z!4Jj1h5d*dxC%NdfTVk!cU)p!IaLU}(8!8pC9EhQcnTs(P)({kVE#o^z=_3g-{c%; z7Zdli-aCwVw0iMtjG#rOX{TYPsH{$98e>C6}T zHmD!E)Yowk+K2Uy*<}^Q-=NQ7+PQ#}3(x$?k&Bm+hf>4-2{d;Pd=46v5ZQnxW#08? zvb!*y?`NUTe3u!*&^z z5^l$1>^M9HDJWl3rm^SC-V)>A!$G1@JeXaGv$Wx*hnzNL-sD(esjsefm&r#NvBn{m zf&A7B#T}wWK!ZnA#U3nf{Cka25C8s9n{Ilk{HUGdBc5)QK6Kvjkd|iLBI{>(#Q!}B z9pP6y1a0Fxdl|x}!qQaErlt5#a`Uc`pE7NfPt6-&4KRTS&FtVBwN2tE43QaX9S%3i ztK4`yo8{qIp5;>biR|A{bnZ(4XY0&+a#@XE8!hEzHRN>>p|*<=2bS#|-lSTqLUWSY ze7bT{d4k;3EmMhkwF0Yd-AV`#wq)~U{itodW`ka3Nt)20(@_@3P`YplG>Y)$<+?1W z9aypW=Yovru)14@kGO7>k55oLaOr+hH(<*v*D!F{DKdztuD>hGn^Qj^&HFKlIJ0KN z7||0q(BksqjYwzoJ&71lKX8u6Wfbw(y>$k$Wqh>Md51+IE_dMjj&9^jM}Jo8L;<2_|xY1>Ccmzi2{Qmn;ZhUZw$l)`bP8K2rlW>{(<}nGW=b1 z_Xz~LWAu`H0o7Zm-vT*F2xH$QF$yG@eLtSTRa&*P~x2iwFKfNO-t+!O_y)8TAVtk@M=cSAy{C> z#Bz_^6E-ENS+EPI+)FsxD#l=V{5qOg%UVx2j1|AtWX}aPcIR*Eum+(NXohZ+9k7@7 z&|?tj{}z}QRv^@o`esga#n~4(_RpFWTugfO5@kU2AY*!mO$94g%6a+osX_|74$bDk z@T^wP)jAKox}^5c9;CRL)K{6HHB1whk{+{pGt8*q#q0Y)yS`1U>GydA?uC|F6uM)B zF~;1xe713a=`7)NXjhGmP3cum)!VpyuG6`w6U9`pYqj~C#Y@M8XL6iuq?3ZMBPeM; zYt0VNXEhaTEAfhVhbWE=qqiJSQ{56NY;)v z(%QtGG+a3k=iHx;l0>2h)xfxlJ66L8&;+-{>}aBN>Ow$A8%m^OzBf6{I2A1h65U^=ix~``d)}sDJhVWQlv1WI#QZHIYT$o<6 zpQT}=iBl1k2NY`;EtRE!y%SS8Frjf^$t%^u%n=*UCE8ofKb}{q4MI>PZ;L7A#Trkx zCeo-H5}PM*b}&_NT(AOUvWLSLfJzX4j2L}eB&(_rq_2&G+)><$w>htTKZ4@X`s~Dk zeWeUr1hO|g8A~bdNt84l?doos&>5dQ4hO&&}Qa!)?_ zYtiW+By%Gy4vItHw@g&2J1$yy$?|s=|D=<=F!Ma>>0`b)%p|;hBI85P!GSEj}$WVQ^yq@S-=VQKvUf6=9qVt}s)BHXc6X4_`KU zud@DC{0I)_h*$C*!6BpGO%dNHoUjfufwREwZ+}Wv9>YKQ?%GCOkG$&bx(Jtm(F<|# zf+vZwp&nH2Kn_OEK)cshzTD>UwW_xU*aqVxg9K#kJQ>W8fEkVbpGA6qbU^F~X49Ve^V z&i8k!ww(Oy-)+B?y*R1KBZev?^&Kimsz2>pXgqXcBfV#Jn#)Pv2Trozdt17HkNrI? zxzfKhr(d%EOD+;LhN#`wt&cnrs(_=-DDi}r2sR5V3a6X^E+csf#b`djjUiRnmXUOlMx~Yv!qg-(B?hWa?DoKb z-Ux9lG#LE4ct>0}{s5~ZYb{FYHXGjEb2wUeY1g89sQ7q_S1q#g7Z-CXTRC8<@t_`i zuBYeWVnip@_&WmE;PpQC=bX_(f1A&h*D0nOEytuzm&d!8$v>S;mhW*0Wiy>ORZ~et zJ&-W%XT*^C7gHGZM85cd%%dOZoC*Aby9Sa_@c!s_UuEn{Q`qdo1K7NHHb236kt^gRE0(;C4O$)AEuhataKb|-WO72 zx*l>w4WBgUR#dj_Zz2yh^2czQz2hu?h_cz^lqN5U^u-VRlkA_`ECdc!Zc0gN%d&)u z^tkNj1)Oc}%btqE(MreI?1Hasa=D)3(t1bZ%fv#bBby&8x%Z5n@Sf%`OOmoa!vr72jMgx{Lw+dL-{WQH2`7L9;p*o zpT*!MMpu<55bG9kCav08V|14)IIDgnosZgKr1_#AP{E8>(Vm)ni$La{4W!~sq)+`F z1B;80;k`IZHBXaMJs^c(F=oe_d6V-ZRfG2;74^e6L?E2dZhZ#{gHft^vU!ID5Xc(` z6b7${hXsS6T~n|SPL%wGcVUl}BFf+f%P#0I{!;HSl-i_0ac>@*mx;&!_O^S|V(dvS z=>J#q1wNial5EP&Rm$oVDL@TtOk;V8n&OYrB$r3$?YcHbC*{!r*RIR16Dm5IanGD( zZ)X{`^(^kAQt~Nc0w(l;%_6S6vy`}<3zruax$cdS!jk}_6ezkdpcDoId3j%rc5dLL zNtC{w2yyNplDAAdk{b$AS=CrbI%NkXoa%V~4Xe!9@yZhZX=vvOt8oOR;m(U8%bwDN z2%R4}*9+iPKiY!XvL6CXT-FeHXW(P zdU)p$>mpK^(b`CV=NR(zW2&<(CSBnO#0k+Px=%OsoelgU8z}W^3_r-&Zb4zq3;{^rf`V{2svZ7)E#WdQ4x0e$9K^knm z5p)3_HLVC`zf4OaFotWJjA=(W2>F-eILp48LZ|E7hXwnQ1)VJ|5h1%Ou&yaR$U04M z990e;_E&e8hpwH$pbLT*+ zMVZ`{^rG2|1;Db8xbZ!U#d60)o5bWA`Xmy=uYajZ`brJ5KT9(dJ&r^@1mwn`nF(d? z$q#b{@VOHc2_>D?WFvI24OL8vSj1S;4E&{PE`lM~6i$vm$7bR*8fQBku$!JckOH>3 zixC8@y8BZ;){(LTX4~Mbb=}<3|E{+@7w31~iLMW>7-~!fcS}x_f2W(K&nDCzGt86d zn=f82z%jHV#a8Qa;Quu{SBtVwsAy??;77uH5^8}CLzUr2-f4kF`m@WcuWTN^^P8}j zmNlP2R$Pd61`(;5_+-S-M7d-@R_{^&dFc{cT_oHru#rYUSi9)p^tfS&&M!5c+hN6s z#K+>sf39Pp8v6aSxOfmoyXew?85X2LO>7Q%H4)lX9mf9T!*aQRx~Uwwq*H&rl(m z&2Ylw>mqc?66}z*UPIQYtaO4xqK}gXrFHKNjLG-Ps##ju|IsKgTZl6^VeWOdb6qU@ zquk-}6Hd(M^R)$kzglsgK2NKJJp2eY)}6tH#Tp;Y<>_jtYT} zs}EuAZ6b_CW;n*J@4CC^(Kx;w{_7al6u`6U(0brD0n7_H;LL-z1p^H$x~2W8E$l|! zdI9?xJA9Kw-E_rlVb69HF~$0E-}Nig-}`~|Q`PJh+|B-eI(EOcIN|4o(c!p)O zMv!l>(cP}$itV8#TXlbWE?VeH1^hH}xY2 z`^U}5%)=L75?}2L1-V|A$18ufYf>y=VJ^4<0P7T4uyV>N^^PjWDZWzm!<8aBIvY_b zyOQnK7N0`VkLD;X3fhGJlSwu8ifxKLv^k~R69m=M#RMx?9BZ%1=;p?4nYr{vhN7tp zN#V`8g^xzP*G7hhV?2PewJr4HQEPEl160nM+DQB|O)SSyf7EF+m< z<<)7^?rIazA51~f8p?mlKZBQ&o)8pDFH_Xv_QO^}TS99f4wXKoKhwR13tP@f-w3)y z;IMh2%DbeXr7Dw|K0kCEjTf4KlActK71m5U(3DUA2v^XB(egT0T&=M($9X#adfv79 zLaU5PiPTpM&Ul2al&8%=*@IIYK>VRqEQf3yS`c z)UOT@$pyI(f~GOeevnfx0R<@wE~ZRbbZUnk9{5*?9o+kQ$edvcV5@&lBs&l=qNHk2 z5Xy9C@%_}zUv518#?LP2J`_!z^$wDEiSz3{c7Wu~Z3Zicg)z{UQweg-I|E9X}=X%Ue z{dAdPcOHC(Vp{ZHJ)(fQh+t1lM0-c-ONMk7^!#n2p<|PZ%!=0v`HD-L!w`nZHll(v z^|?e*Q8@wwci}?qo^8WjP;3oGVQ@X-&wO7~$6|M0N``byW@r?w0{NN7v)o9VHhYkF! zwOw4_BG%#<`k&7JHLMS6aQzF#jxV)My_MmeiP+v=VFDygf{@6~Jx0a*b|0@kz?KY8 z9?_C-oQ6;EzTPzc2hG(~{y}EaieP@n$C7g*h>qV29<+D%N&q#~c0!-~RXgc}2mxuv zAT8PidUtf6Bugh+z-nF)KfX%jEmu&QII%Kun2EEL(GReg{6S^VuqeDP2>ZxBU3Fn= zkiz`ERq{o7=RncmLr_F0FFJ7NWOzOmL~dP>4|k}Kc=#6z0bO_MamTa-G{h4-=8XOb zmfn$_6h2>GFC`?xFe|)*lw-l60c1A(hzw_=#=`R3e0zcKWQ6UKfco!`s`oKW@TqpP zUk<&@$Z0#&+`6k70?{EcGSn?3i~zKfALR@EY0iy02_wpaR?I1vep1<_x=1{gB0?fW ze22bs(&#v|>eRi}Ag7D`R!JBB?4gjvd?%&}m#8DYDKi+$5J}$|x34;^N!JjSFb)mC%lTPY)sJAVxx2bxF)xJ;07 zxQ&g@H%B9GqqKCWg{MtHO@$u(9_(>9Z_<7W#98<%N=~6|DKiyzVE>ls>-EmS z!3%EqGTg5{!eh2*T>FzS6EUKu&j1wvN$yih<~vy@U#C_IK59Ckn6zO{j|#u-|u zb^U{S2Q4M?^a^cPLdN2pWD3CwzdCOrw?{++n0KZAkJjwyp$GY_fCLG;`A%WRmq)!u zcP**D{y+NmOxlMpSouy(kWBC=$V)Kj^vg>pRIHdMuJrFwAOS8Yh1@+cDD;~D!uaFgsj5o6@Uq$(y zulGH^zIda3gZ~sP$u&8GF6;BD0X^r_!^6Bs%{6FfNFRqoNby%MV;(Cxo9=gO9nZ@t zGuXU7e}9#)(4TB{eH_&_*_2jowuVnlYNsr%B<7nhGAqWUZe80KASoa1D_1b{8>#XV zbcurFB!p?oQ{;{vdK6+_te2s=q&O&_OXOx$btJmz0$-VbtxKF@%Hk{t(rC9O{-M~W zWJDR7srSzochlbS_Krb#aWZTAi_C1x4#UF^?4t<{eTN8>_&MZ{E9cLlx1|{NP!n26 zJrSoHAp+c}I-H;B>D{CLFT&md$g*Z>8=bao+qOMz+qP}n*0gQAr)}FkZQJ(W^PY3Q zd%pX}jk_aiud1vkt8(pFnXz`QT2E#?=DhC@+md$s;q@%+KPWdEzrKdd(g-^JS>}6r z+IKGn<o8} z!gffu`+Q94inT_VP&!yR z_wi(4F?Z=?pd0S<-S!4IdmNbNZ7vs_#2tPd*dg~bHJr{=AddULei2~SgPpj;UWgbo zm>Q;F)&6>)n6sdD{!Agm!x9V_e3wT>lhjXyIA6vf<1*c2NuDYcOD*awKr5-}0;lFI zp60fdp*`1#?ZH4c`0>bjtf@e{7n$2c3XVytH?Mj=4wnNWxTlbSF)H62x0j23%|MYF z+mFrmtE~c}cWkb96}oqQ#qZbh&<09&zRV6+bD}ZGzUI?D=@K7KrLYBa1l!^zmg2^-b?>@Dw5P zLHgv$+G@Y19I8O6(eU}eC?cME*$KtRE+)BG>7~F{G%oYW&CcB{E1O*~3;eTXq@DT@ zY*W)~*4kIQR?2FEWy`9Z=3~WS&7+THeO0%$hkbS1mhEWk#Mu{ zD(7NmQA%{rzk+%RofBI*j-@UqUt6fB*t-SgEW`@C%0wJ)`CgWvpU)OyOI{Y${!AWC zKv;cb7-ttzA)Bccm@?!X!B_9?Xo3>R#*+dzzXv(s=cUmjI_= zPBNS5Sk@S!#-Gh$F$Zh2lpq)>hSoz<#tcvQL7yx__05e&K@-O*kR!1NNh>A(of3rR zzHp8b5%E%@XmMY)Z@#QCB#A<$cus>+>!wqQ6N))Pv8*vhiGok2=%G*(MWP7i)nn1S ztPz210`HXb$mP+g+R759vH89c_|VC@Ms1FxrGV`EXKrOQ}kF{i6;gqmHhqa`K#F)G5PO89AN@^$-KLIaBFkEvCU7M(y9#7A453H#HsVirBaE9B zMd0({MU0n4D;bfmePx+JFR6x~fD<3A>5+7U(aa(In8V$GOj(MZ%o|sEVmMgSk!KPt zk=+wSO_i%nR*@GmCQBOS*IviM>JhakHRnlh3ar~{yMKj9 zot1IArFoN7;)zTRrl}=!mXJwWxiW5ILB60YIqHr5UlkpN()2w^ae9_vqqDEc`na$tNTb<*8$DV0%t-}o!;5=G&jz{CH-77U{w{MFMZr7NT zC$?En$kDFq}|K0roc#jbwf!l zNG_`{DqCHO&u``Fd~D!czILB@t&5sYGNyn`DO3qLbBj$aUP^ENO6igjziZDpdoR+G zMYd}zQtzS{lGLVNq@gg^jMH$}c;O^p`vE=AsG~WjllEF|E!SzggqP4XeaIQ87FRAm zU@DDu=v;iOQfx_m@TY(*ne4_wTw>~ri({>iBGo#!IY}G6)vv|s;w?6bjL_a0wq`MX zj!>Hd>i`ILYm`DOU7ol0)%DhciqWE}*kl>IS`o~GW)HK*EN;KaUT3tRHmF8Na-PZ@ zpCxqd*~3Fyf>nLf7mjXCLBo_EsM&!c*+lXPq@gHuIt4X`Ev}i%sJ$vN)wTHOXt2Xf z{H7rBNoDt0FWbr3jC>S~Qf#zs0q`w$Q~PV#z2Cr1A(Kta$EVC!nD+Cn{fa|-)wUxX zufoRVbwHWa^PxP0N1DxftMQO@hpl_?{eW$ExXB_82zO-A*#XPIVTJvv1(cy6%GR`DxoHH~}9?2}KVYdLP>-_tYP?Wj>0O5)I z$}e?F-U=1f4BmU+mHRxq?Z8yN+)mqmq&MlhPB)&AW!{c~521+iRg4lcpqIIpsfq6C z*7tKwYVVc3Dpb5BtO~p~$*_;B=IW!8aD2$=b878~HP~iaR0&`Hcvfft;9zQuBK6h> zy%+mqi2#-zz7>Z7!d5keTFONv(EGmVRWU)H9cgCrPpCLEL4znX#Mr4uG<=)e3%08Z zwk^-JJFCqM=kUrJg4={Wkl{NP{==p1EJSQd>(obyP!e@3h1iX9A1@_Qoz6$mv16ka zKe5|o65GKS+t#Kr7=MZ2XHk^1XJ+@;BV=y|?)d39KclCeaGLlWRzg1ZM;BOE;yf6x zd@Rwj#THY`5w?O7<4B^;b5nNJ2glx~<o=6E^F~%o-XmHF5y0r?zRTHaY5KbyRR9rW8a7np)c#I3|=|W7O4n3 zL__8lw#_&ZLv-lyKzRA!;IqBN;19tQMTK7TP`5M0;EO}_#gXMQyEnd8;O2M@&Wm%I z1vJmI{*fqPmI`F%XE`nS)m9cs2x-;^$EXWgND6%znmG)!B&uMHjAPhIJeYKEG~{o$ zxUWu%G6pY2|64AF{Uzi|#$>Ek-m5tf??;edQT=1YiCB+bZI8hohQR17bR_E7gC60Y z*bKdNB23{NMjoShm~DhK;9z56|6inSf79*#4{4i{yPYvUortZC(@$eZLkDv^CtC*?$iEbAe`PZI*5AE? z0)IbLN@lhWHb(kZ#sbnxG=jEPM*qfH>6<#@f0MZVM@dl7)(u}1pN4^r6`$st!}6Op zj-CGdi;)Fi`(G$=Cw(h(LjfC8D`R~6e~APf4UKJ_@Yy*S{?-0#&0hfxBLnNdBtrUj zV#emCW={VM^)H#Cld-i5KKsAN_-nC^{y)TY-yC#*dFB4=M`8N!GyfL_-8b~# z<9};989RKRx0Sw=@lRtzTO(uq|IJIMog^KbK@T5tCH4-6*Al9Hz0y-16jx6y#&It+ z`3MGYr%(tQCj|TQ6#Vp1U9N-3GvUTKJA9<3otYy8ULqYkS9ai(?B8 z?cu(H^LF-zSK4=d5vD<6x0G7>Xv%W3X7ax3H)m7t&5=-x(f!??JIAx^*qfn)#4~?G zi_7`CwS~q}#?J0;saS#ninI1mJXYIRLE1st{O^yAXBJJmRq=#V2M~aLik=_!s(!`; zfC?hNQV<^fGHZc4;MHD}L4a$G3jsS2)Y<^W09P0ifF7y!ey|W#80R4YN?5+`ljoi! z8vl4jZ!9=5RQKZz0XZg;o4K#kJH;!SUMsabI_=F;8ZQ=}kRD z#LI!1ybT1BCmSIT;jM5_+6$%)<*nd^f4|zR6aa@D#48BS`!4^w|9lqAE0{Z-&7Xt( z#D8pvkryjGFf+Ux^2=_E-V*5&3t8&f7yQ0V&*In+;(itBII(|Wrevs8>blnr#v6Lb z^4L)AAFB-M;f3(}EqcN9P7+DA>SC2OT43nHrnPOZHt8&*p1_w}wby;@a<0ED;8vw_n;zNO^gZ2Y(LUt&RhN8`WO>Hn`+nL9W-37P3T z{KrA0^#9#v{kN;Bnj1NpIet4D8ynj{g@uI`pYglS#KeTp%*=%Ux6RJP^v}Hb-`6?) zKhnR5e~{lk@>j;h&hhv7AJn(b-`>At{O$ca_CKh9wf_sn#`x`K-^jm+zq9>={FnBB zq5kT!va?`ZNrOuhe2e#!bT z=s&UW{|+esnE5~Cm&`02Y~Pmu?;vyD>FK4k_?x~XyXh(W&3M}TQHzl&O)6nDZh|-w z7|^U4o<2ZgAPfQ>k$znnaZodvlpGDD5+9$?IvO58z<2>W^3T#evqNKw1l6BEOA*O` z3@u|86gE{x_cbjq(u@FC9H%_H_`0s1xR6Yybu4+#J}Zx!vzyeM&n_b40Gx?nN7*(z za`zUVa$bQ6?iGW2Joa!Z0#e!p!#i?*iWO+C*X3-!L~Ud{e-1^;8-5kTSdrXWI7_N%sEF9~;B;3J*->neGj^le}h*L#@F^oY|vWQkGVMCWTnf(_Hrsl1i_h$z` zIiD6h1vO<%%D_-^${^AK%IH}6=?#(vsZ6@pXi?LxvEpg5ba%&R1O`)0$LXp1vKHIX zYw@8wTVw9mmse0Id>Y@**sSSgC|B+P^q2iP6HnlQc1+>D0|_e<>z*$3*FpC(p!DJR z*Osf`3wKB{(cbmkj%vtP#8fU-yx|J{I@`M`b}yKCIlEW7z~WtFF-AXK9^CBoY^)s8 zD?l4;XF#?<=P|^+wi8Eq!BuQt>WmfOm(W7kcS^&!mUek6@r|hFJn7P`!F7=?K0;s1 z5nc1ctJwW^y+Y}3p>7~DDN$v!PmqhwkPig#d+;{krMM+oRNSAMGq?&i3>wm79WW?S z{L8RkVYz4BJH}=VW1>%S=xJUB{oOzD;<_!EF}$I?13=|KJb+$jp`GIPyFqwlEo?|G zHXiwK*1ta9ua12AzTRH8roV>y6lW6CT7ZHajrmgHZB+bY@;LNBnKXXAWc>W>>iu-d zN7pA;G|`p!Jt0XXldepo?`kV&RF}^VOHGc6O#T@e2}uO9^Dajpcl6}WldyK+v|_Ci zX~v2Hysv{^vG{xrxRYd^vbfZ_MuDq+*xC=pm#pMUQb)E8SlL zq7J!!Qfd_|JzMlP=rD=Wg?D6;f|k$+fiSJ+7PO@38T zn__yQSZ*Yv58?I-GU4avq#C@HY&Z-t@4m7@wOC#V=_?Q8`x^u?qBJ;5;?a4rk`C+2 zx>ub@msDZS=UuuxixqMXo0#I6!pJ8#<2!FKHuCvBaFSr6;vmBue0)dUoE$gEBb|bt zr2ih}+q}S|YV#oU#m*xL z8*@=B2=KQ1fN(L5wbY9V>ja5>A?2;LCT1bhciJeY*MRvHP__j6U~8gjJDjXXhMNmX zv?lqV{>^qc;`1`rf8bA_iYxbBHO3GnwPku}zlJF2!mVvw5>u=*QAvXlR?NpsW*A~) zC!mB{sQ#=Tk7u9)D{ergQjIj}IimIoVGSnjScO6JrTs`qG@gi3@?3NHlYanZMpsM& zXS3cI_F%+h$ssVZ-FV=9FUf>>FR~oJ?wC|~FL3m%cplF*VC>veV>?98q@>%9P?{tc*p0fvqn z_dtEa;l^fs%|HCRx~u!r(p&49h-)c*KN&}nvx=v))9SUEVr8c9x9310SxR9-N!^4} z4ymR3mq|=f5e3Wwmc|7Cko$;enBxB&#>$kT7(uAN?xe5>)DADCS!O}_*&R<_bw69U={) zMcR6|gZ(a~6We=!5Ii_N(_v6egp)J~-Uhk9cW);NT@peu`|=D<~o`{%ir1)GjESYXjf$Z2>pc> zIv|?{F!P(ANwYQ3`Y}=^RO46*_$JIHQc3T{QaN>CCpoSbig9t6^)5B~biL-iMNYel zz0I5=$myNGXGKF~n-}FVMbo7OIxvXIrVqb5RK&}cK6G_KH;gbUSJyk7c3=9r8|?S3 zUFI#W*wQ5t`nHKQyrLt>KgFWYw-ohpXKmkC!VS;mv%%E`Q^4K*VxMx_L)`BC1ML$AXl z(kSs5fV4g)AYA*>FC@mi-FAk^ibFL?ZkMQ@M0MxI1y~ie(L38f8X7DqV+Ls{?3JF> z--e{Ogyk%WEQ#YtNv2Ocd7PDfGjkJix#jg?id^SYg@M7yUSY&EAjC!VS||?t6-pK? z>{+y%aoJ3?=+9m*jTAgB6qqtgeiVQyX~sy~d1}(DeLgdr+{Rw(yDrH+`)zEfGGW7H z)cc#i3ria>w9e3&ZoR7A)_*N~v3DM6%1bQ?DZffwYF|1d3nw2luG6(!*Q-=E&xLkD zMxoX^BqC1nJ0qy?+%{PVefWI^;k^Y~cz4!LX^;@928~m#a#Wz}P=z!b@DJh)s%dAU z`7o0cVHjx1sjO85D(-UK4TN(U2QFK|t<51SQXkR-matJ8)j-x9fSQ2@3YTQF}4h%|MP@Vul+D8=b%)5P0yY1v}b* zP(x9un;7@EC66l166^;-NWI){_zO)IO%^g|wiKcRSX~M_RnYs4@HJyPx0l8e#^9?m zQZ6loc!ZHlWap+PB$H$wvzQJPMY+3qKyb%;4d^A83jOOlZ{?A?d}(qLs^v*kyh4V6 zu&R7%K&ibKdv|Sly+_Aw?)0fqFx5VIBC|5PuNR26#tU+`VH)L%#(1bSjOtS0N%iG@ z&FB3)m}*Tn-%HBW+R^!in;Gr3_rV9)#O4v_p%&XyO1LYp-PvVJ#&-lvT}XAiwN-C? z=x<*eN7YfJI?|p``r06I?Ba5jQ2d}d`!s&VyY#sAS8n0S)LHfFj|$e*BvpZr396Rb zBFaQbLE_X2>T=r@rhnct&RWv2zM3-wuK5`R#bH*zAh|}5fP49x^M-DWV~f)g%FImsqYpe}#x?G;k?BrqPl#p!gyo=dN__9G?+;wHaVa_3o;Qc_x}PqG@k&~L zlTEijz7mpI1<_0SO`a&9uuT=WNUzZwi-d!s3L=G1g&y92-e1k(6~f6?+u(iv;u^={ zC%8v*uQDVf`;+;QDP|YHClxT|j;{_wp0Z#ZG@q z!D`)7rzANZ^q8+f0X_{Q~(+XQV0fOL|-h3V5F~%-YF>jQ-o-g%l~p}2;OhD ziKER#6eP4)c7@9QZGcJ1K4L=n0$-o0=|kwl2xQ2xP9V5$M8{dqx{|I|MdPe;eOifL zkwvyiaInmbdO+-idwu>&`QKBTc&NAXYDuj+^93BsiYn!jFaNEag;K&b) zK(pRAfD4u?r2AS`J1^plP5?SsI~@W#{7NdB6`&q4a0r;5lpotMKN>-D34S>Icm;}s zS4ezhE)Br`7&!v&VR_1yfaq6pzsM>r z#*b=20;D7xJqDa_9-G{H(1DSpGthCP-<9X}mYV}-cco`u@_-+tjl;FUxV^Kp$Yd_ z&$~J-x>nE#;QE5ZYje}79#P`KAOQ2y!@M$xAW4HN%FBMFI|ZRw^(0@!%u@=pTu z;I176+Q2=&=Fb4b=VOK=U8<{x+`TXuba{_AUoBGS{txeJ++z9&zdTrnzaW-lVY1Wl*)<^`_7qr@DA5vXdUl--&yB{T+zIu6?iQ&9}T~f3lM!?yFGs2GSAsps;>jeAA_c7JU7H%gZN7et{`6d6~}b^X=T3WNMPbBFVhuCHam7waa+=9HOVWxp)x{vqkNvvkVjE!C9 z)FjklpqEZ6A#DO|M%TeaO6!{9Rwxc6nbp-Oug4NHkFh^!8D;A^zwGi^Jgg%R0$Oxn*OCCuFLFtiM#?@D(&n5RNwlnyR~G z`ErL3lnxmaXS&Ec&b{X&J+-&wwn-ihsh|eBsiJ; zEYD}G=Po@KUKW`{q@57c4q8KkjI?d_Uas6`cjmVFd@@z#slQ#`T5sBw-Rico?(7uA zihYCiX}Q}e8pdO{JJQ2HZAH%J`lZoyTpr3rr+L4Uz+)R!IeI@S%WHr2F5W_y<8p^I z?#Wl2u;|pcyd0m5EV4Iadw>OrivnEWVY1U9sD&P>rEkWn7sy#ZU&?@Kn7@i)XTWoW z?CK$0DDc*wcjZubRc<{5sGk)DXzX8vzSc9gwtl(m%=ufX1>H4Oz!GD`m|y1@+lX9J z`dylo`1c@yV9MLuC^9zQyPh3j8ieu69#ZLok$jhW{vG2jT#lE#b-5{Ej==5maARWQ zGam2tYfS25jRn4O5xUn zC6q0O&y@CTo$F{ge7g&0B$E@EJ;)mF_wyK0vZGkZZbz?=sBx8bIpwG0f-{xMOG~$t z=J10=B*!z=Emz$?^C%WUlC&pXm*pn)64j(m<%(|LDBGzA@2xgP)sj!OF<)A2QshPM zWN=gOS@qG>WGtZ*xZOD}mcQ(Q+Lc6AM-U-4AnRCF6A9h<2Ee6-v}JlXF9pj zLAC&Q4s8zd5d2QfE<}ke5nLM*i5#+|Ol%O`gVv{N3b~_1kVzi25nNjij|r6*LqdMD z29=jF*wRoKU^T~2P&ql27|;>y2f0(VUZ1qTUjOQF%WSeYO%?p}va1$Zp^B#@SLoJ~ zT9{%uL)!hppr}eN0#k3%cG@H(E%69GGH3Xfys0BO8V>`G#Ai20U7$0#mZYS7%<63f ze0x6Ft{y%HO%M*NHAXNFia-tAfS^!K&dAPCX=o|3EE%md;mdvO1p;kr`r7-ol%M0YBU9#48c9m*MBGrML&5wp&x+um&enqFyRsCEA#qN^=> z8U-I|>E4T2n=FR=bs?A=H+@5@Y^K0l1ek9wBY}HJI4=U(TD7W%aNN5e!)qKdWVQ`7 zD)xaAwG~Q$3LwfWwBY%JV>gt&+mHAV>cnUa66O1cAr z!;qGf%3GJsPU*X@S}kH=;XdIFItQPi<)7f8Eh-CKO>XA!acnSFVHP{O#@g~ek$l!S zrQ7v}?^%R~>`d{bs(HWMK(l!U+cEJt2-Kb59QPK0hW>#4aSmJnZZdVsoL)W~zw;H> zWMSRpToU!OKYoXAlohe6K7qVnM%|d{jC#ppIDV(0KBeQAGif5?DJk9I8;AOCivIA2 z#%h&zR3IXP*iIoZ3?eZxJPG?`z%a>iDn5xoEU+f=aZ0XG04szML=tskww^o;HD#}X za7tW8cj$pqef-g~VgR-`d%tl5pOUlw?c1@fdw}>ul$t>BqW<*A0V`#Y9;t&GgU?5e zulLbGH%zvU!|+tJ?4R5aBJKuU_t1gYPXfw*+T8MjA&6AJeOkZ2{H7 ztt`O)@FN7r6X|iX@`NrD+&83(Lg9#!%cxW@K*5GYdL=gIIjKgly zDoN-}EPfgg@HJ6a6^GR!a;Yc|v_d4NRVtHeGGJcIn2+cwU;Nuno~$A|%e&QiT8fmF_dQHg{FLC2N~koEvo^swNZ7 zbHX;?(q~edH_j>Xn8h}t{^9N;m<7HI?^Q_= z@)UW+qeKFG%EO8L8zL16XJzNZqEgQO@rCD*tF9!Uk1IOcJKOb#39i_hnCX?J`OW9u zl;g@A-o{T)xaxg_6vH*%XNSvylN!AB8N+P(7011(1F*s>xJz~C{!PK+ao-7VaU(9c zh}@@x;LWVec%)mGQ{gk8H36>Mb5XEfm0F=%^(RaYI)u0<&d5wjd$TGL5zHCKeSJho zmPm$K13FuBz~A7A!tm69h?jH$HmC(1jdjlxuTzyCBKD$_aZ2X*(8@}gW9V(4L+3FZ zubdl%J$nIuw}CI3x1P6(F9EZ;Aa}slov3(nIP#r&yA$PpkdfFzwJ#HoznZ)e{`iF{ zC?p%+iHlHUYy^#r>lXJv;$Y>x18fuBrHCXT^`_vJRf>1B*t#zZZM~XEegr&V3B31u z%AN5s{U%;|Tue?hNW5N>-12>ZFTio$w~vV`0x8;WF9VtI6RFf?WbswEUf6f;0|jC| zZV;$}XBw`-2eq)tzGkLL5LZ{Z(afKZVJ@YHFL#Y!mr!TmOYxIr7*x3EjI74e%= zcC>%P9ez5nL*0k|t^M8hjqmC1le>H0<+o`&$+EXbwDy^U8H;f6Up%@7V&gH61i(#~m>GGL#0Im~vX;T96MZ#v1TSe|1AxV$*+@{ zQ%jkCX%MC2{L}ynfJzY0!(rNOGxu7AeKDJ*&W(5E#qg0xPlS!V0L@ zJXG`uD(>+ho|yrz60M-mFM%t?dOCo$dbbN!LoQyysFE73beqGt)W$_Hol^j?jlIt% z`x+Y}P<|*(+M@d@^zCMLp)mRxn>IMdZEmIhXe;_N1sZgJASb8;(T-G05g%@2#MMx^ z2Le%hRi|WWoW}*VP3jt0%wEZ0RW7Y$K zLALj^?%CHq{zedD-=KU_*fmUaPTty@k;5zx%eaar9J_9g29`cN0XX4?m`Fm&uR{WX zgvIbNLNwq!7|@R-&1qPZbB~5*ta_Z;6QI&rsE?){YkmEBI zEDQ*@)Op&WrHvzXPX>&%u)io+*CJ01DsqI+AKHNIW!wkeaKLFgZKPhGbUK9TmYUew zSZy`Fc+Pq*CEjMyRhN;7?^jm|xp$OoH1Cm$3 z_UXA|%c=9~bz!ixEELPy)4FwXPQSMtJV|`Bhn=P z6A?nLrY1(!Y|!ENv!l70BzKf)Xz!p#+k5^%(`W7_lP{MlAVT?xMW!OtQ{CybYI*bbMh%sO z@9QUv!%Y+gn^jt;4_ng>2>k9QVhSOaL;l{@pAJrQDTa6rE`>d0n~hI7#UkVKnfd!Y<0BUcgD@Zo_c z4c;Fn!EB{)<1s6G#@_<4TjQSr>OKXa%a1WIh zPcWU)TsA&jowVApEjU{Ig~H~yje(Y}%15}va4;Jpp3H{NM3+TTPClX3vI+tuggD@8 zdn!|})`cRVv+&Gz9=-g)%6EZE)ZJ)YxP=BUJZe*?mOSd6ltj5P2s024@|l=c7p zf!vLTVTR3#@l@7p4kWhB*Mn$4_nvR3?N?pi51l`EeaO9ky<3MU+rhlFUyLv7aYlto z=COW2#t(eae0Wo$$wlvB%#{$f3cDPDJ*EZT=vmvT#Hl*==B^neM0dnsj<=v!Epm>t zqFil;SZ&bX$xUnoU4`}Sl1s%3>i7DT7_-Pioe@szt42ewgfLoTh4x5vB8_+Q9h z`+328sRB*!s^iZz;5EE_xrDx{zqOYK!i3CI(H4f7@4H$*+C{_d-i_pyRJSu+)&;nF zqT_EMBWWLMzNw6;Vwi|oNnr;AUau{+aS` zNmHeJRmGueuXPJOI!m_p!Gop+VN z!Hh)412lq;%Otyv+?9hVMt;%4i7wEHCvg_qgr{o760A)gE}BfFH8D4f5+?EA?yoL8 z*5^bajRi^`aEt8=(8CRIvuA+~-{q3Qg)z(Q!hLVJ$K4+hBWi1ZZik%fe%iDuD)r0{ zo&gQ$zH7KApkJ$-@jqHsS)nIDx-$GFH2Z`LU=!fE!?cZ0L?vevw*h3FaVSjWvEY^} z0dj@+x<8Ls;kB zxqCg_CkdPyQG3mJ3y)YQP*C&a253^Il1{=y?M)70A?^SkFlN)j;U-FNl!XHwgxiye zV@M1Cy*-zEHZ71~Q@=sebgl9c47^g$6_PR|Ip|^u2D3@KK;Cjid{vH~f7%;;k+fwP zi$c)i!zWPvqS8gmb$v(e%58xlYFSH0AQl=g9!{-hTbXMycc~PI8x=ZA1SLkzuwVgm z{2d?0p-vw{rCAe2uplmvx4EJmzFe7_rS}K&Y0>!%p`O( zn|>Oqf*@#y1XO@h%?1rNqMiSb;NBAf>?Q%{AD7MjgeY3HT6EM1E|6~^y%a`RHMwYV z;z?Z7wdwIfC+*22c*OV}%w%ake2@08Qp6wjr4E=*lXWoft?PW|jPK(cF}@$EdRPdD zmr7M!PrldZc}Lf1%gdN!oGJC%8l=as=u#M*C+c+%WdlzrX^>FsyEZ7 zko6ca-_c2|IFzKd!700iP?l=uJaY-Ig4aYKxic^6aPgT@ECMW!&50^q#9ko94 z_zfU)4blsL4^jhd1A7aaGaV`&WD|)V=_SHx1YNp{s!+=R>xGd^ggX0Ie72pUHw7}XNO5BGH2uW z1BTF&;%?(Ld^{yKhAhPW)@_m*))|Gs(uDZoSuSGXpTKZ$Q?;EtYO$TMJHGr6rdpeff;=o@lM1%_jMhQcZ| zG<+?|1jR8pNQA{N5;lsfPS{3-*hPF+&q;-Ckm=50vfR=ykTB6Fv5tSgo8|1F9*55e zg=^r*o*cDzY=%n!)>ukcM9hrS;}1wBULorxLaa>QR)Ij3m?0O)0!~Imme@|>C+P(S z^k9a1Ed@R!Q6uTyr8Z*$YLcLDQ!Gl#O2}0WxTrh_g}5FmMg{PY4(PW+i*n+?_gBYs z%*PjXAK9S)l4T?8cG;?b*uDM=%$oXg2kqMgGuBO9f_IyyWqIhb}#rIWcIsroUSCu2;;?wjcx7@ECv2ytM1G)pUk-He# zAJv$x4w~+*nU3~*kEys(k*`_FkyKZuTDqezuB4Qsx~+W`8}bY~9mtyJc>y1KP^zbQ zQbDE|XB5+do@9Am40x8U?>sjh&cY5Sjys*gjh6k9%;}h_@#b^+;*8$HD*3sV>}R<1 zoU0-YYmcoK#>;Jw12~LQsp0E@E*MIT?;lCf-EsQ-A-oumBemKgZ$@e){el>n7-o6U zGN7-)(7?~YKt2K?IvBXg{>UwAAsmcK<8nRt?if=e*Wu7t3?r%ND;l7y)IwR%$(2%6 zfnIx7%|8`BcvU_;Fl>_Zv_n8Kis_F7sF?vic>?*y%D1M*jIBwW99gNn3Na{`qSisL zFf`vYtyU#6@VGMOkGrg%l3b=oQL7rUOg-HQ*ZMCw;(pVxXIS^nTKOBPnGcKELx7r^ zCe!g`ft(xSBs5qng5I$)-jBx_7*|flNNb~t6zbjLAYZdv&JbWU)Ayh-N+l5dsxl5x z5RQemwsJ_;IA8V0)cZI#fk794sLw1>1G0-CajiWSuQG8DYHiY4F!^L5eSoUkMQa$( zk=2_b6Z^`<{z#2&HWEOQr#i&o9K;TEeA+9M^NIjBoIu99x+n>$gS(aP=(XCP`gWfn~!7PyJ$Ca=#x+e}xGH66US_WbC1x2gt z9hI(-rr(s7rEflp@(1~5;wFc)v#ngzh(npYvzCI>RsYC9+biU@&8&=Yi9)893zviW zB?8T~(udw2_kYYR`y2p|_=aU+xRhg0B@>`h4x!k=U4^`M(y}({`eDlx3)x?tak!6tp*n7p zP;j1k<4{#PzYahW?EXO6dhS4=ZuJrZQGYsu$|fjKH)R-yHz@4~=Xg(zah?Y!>zG{& z(nu1mim?olpea|h*0Y}!4xG-E0vrvK56nx)HjzsM=?rgI@ZfaIf$)VOs+BbFdUAgYzh+icx zTXK8#hp7!Z#VNmsz65V*L_yF{p}u&+z7H4XLYVvMqBm=_O6LK@#nSxV6kvr42*?U4 zuaChhZ^AWuS) zPJWGn2~9P#=3?=Nz!RJ;WGQ4Sh+Sv}Z78GvsIQfygE~r?vIKHkzDiYoYp8*8N8ShT z3vv3UBWswlWxrypmuK(;YS{jsJ8gBZre^%`^RbD^ru$SiPPrRAV?hib$#Xww@kOSz=imOpZpPc%+C}?LERFff+FCv5YU<) zD+_C$3vLXH-n+1q^YBF*j>jdwh80SHs;Xb)|Mi#SaiKcP1Z+WA>KIWWl`ar1FMR-VDqrsBOQEJdQlO(ypKa8dO>96 zeMGIOtu`{>c-<9;)E_7?j>xr0YnESGkZ#{U-%3XpuI5X@gcybE7Renph(yT{U{!;M6DJe?ZF~mbDWC+#3aXn824QpWmFcWz{d= z7S3PYi>hel&%S>2{-5gJIx4PZi5E_g1Pks?a0?7NxCajs+@0VAcXuZQcXxNU;1VFX zy9amuhMb&xPjb#(?_2NvbMLH0cBXb!b#-@jRd>(c{reQ>F7|O%4=$`Hjps!^=xn(( zmY8%kK%AB+nQ)_edv8y?+s!0@+=Vo`_RL3iI3F`rb!J+Cae7nG_i=zKscT;XNvZm( z_j!x3D+r(F`btbQxpcI)e`*V58@e?uJTWUdzgf6Zv{Ci8K!Mb#U82FazK-DRLG&U1 z!TB!nuJOL~X2Q63d#I3g&tRu4GFL+tup1Z`ZJSVO{ahRPmF#WK3qnIXxl{%(ma|Lg zS&=-|h5!kf1!E=f!!~kD3!LOq78cEcmf7x7PSARDR`Rfg%@#X*y4ep>XT+#p>Rv_5=Am>H-|z^ThpLN>Xh!(G*|JM zW-tzBr@Ptetxv|r6>edJ&U^CSe1*B~V${?eLnc4gecBX6Q6A>PkK6G(uS9|LCY@ne z^o>?CUk>lgb*wX*`oG;}rVgHnwVa$}(>vDPf6}YqJlljt>5uBWq1KSPWF8_+;O1}~ zU~-*Mnj?C_#H|A(L@yUsjfZSZGB1!9>D}f=#tOV(^FC-Y3sBX0*2#Uza<7BdbO@O| zwbm8x?0H(E(B~8#i|;&9a3W7#UMWrjwi~4*qUI^XJ>GwfIOrdBJrae0cReVzHhE1; zEJ(VAXhW?ZMZpc6R_6GSpWk<~U1(^cm5e=UO&{*fh99>EUdgkZx^Z}NN;a&SQ7xaC z?ZG6z`$Al8q1eF~*!NCsQ^v!EB#|oWK zqEJWx(Og!-9`>1rDG#``Ew2}^iF~)UEl|A@Xo(O7EEyo~i9~$0V8uV^hK=0MTxwCo zUN0m>#(ef37Sz}!cbZai6#WPmx<#c^ac_aV-K;_P&<{J%)Hdu|_6jR_M&+wsCf{qi z_2^CQ*BJM^La)h2HI;?m3kzi`6;+~?N0}zmDz`(Sw2R<9sCa(ZetEg1o|+o%J86m? z?dulBt%AR%nPqTF=WgBC$Rn4PhMgg7M(kkfYtjE=_yc{3j2+D@o8kx2%+hWK$Fk0` z`AL?3OWwk@vX9h#=^I77#o7rP#eBiE%_23K(bFM)WphW8pcC<%?WWEBtL?VS1RC+M zze^kXi*cY%x10Mj+5z?bQS30aA__5|Re*Dw`A69S&Hddtvi3)G{b}vC4YHZ0iM0I* zy$jj;kUy98X1p^vHPs%mdN=0lOVu?|FgR>qV^Oy`#oM|Qo6aG#t{AHWp5c2`sRQGR z9^$*k$cx7G(OdaEYr2hs(G|Kn#a`pUOu7xp@LPl%&137{`lSuoYx|fqTA$Z}9P%so z*D1EW@arob&bH>6Jzc zusS1r2B-2*AdmB&v1Ci4@qe(|?l&MjyE7KO2nhLGi%c-X=M*2Ar>~PJ#N>f z4T6{b_Nm(Ri=R|Kd~te1utYLI|BL@bY5vC`o<3bNZ^}12SZwOYSF(4{7zexq7_lT@ z>+*LYl)CT67l$Tarv!bC?3erS^>v^USnP!Qc0}y1)8Cx*S zYF{!J6(W0qF=<||1!hRY-$5^x*w1Xg8h5^Q9Q4!39EJbPZdy^lmmV8Pgbj}-&PC;{ z$Q$O60*4Bzu-u}vP3!l)YeXHcFetql^GXM(4woCW0uij)^$wf~T|gaxOXugQgV|TX zl9(NdharM0P=>i*qCd!Ph7{QW|mwleOf}O#XDR{_(jYF5Idze4B^nYds#sozO%cLru7Us;H3%QN4ob{|{ zMqJDT|HWeaa)Zyjx8RJ7DISNHAT6T1U+*a4zpMi>L=&n)Dl(ARE5 zlM(v>|C$Ff3nq_k|CDT;QU%yav@-JjBj7%A_PVku!>@5hIZO8D)|(!WW1% zn3*iA*D=awR~0h85cm>HY#AXT6j3|sWqL(AqFJF^emq{1YC(?d+~iAUBFbh3s0@kq zoj$8|q{c|S6RpB$#*Rgs>ehbGZ4IN)7VaG0y~{9Ii~MHTA6Ok$gr4#-(iE$iX-5Z} z6;CewwjkZjAP=jtQ-7dZ?yBd&K)pNr4Rz>1Y;?2+iyk&WLmC(7LBb(+S&6NQSd+(G zEuZkHAZ~X_r!{0n82lCthzd2I8#E(d5Z4AxWiB}bbXK0JE9`#0X{me{^brxU+gFFb zyvSHuJGx&E_n31TY^sHy)&C;8r&c?0QP2qQTnzA?@gNK@s2O{$PMStq$)}$;v^#LE zOp;=)J2Ge>YOK;P#iL+=sxeebg}R8^(gL}LMB5B`Hfki!M^toqrVBjx(@3n(f~Zp0 zr`=D|eI=xrB4B+LT(G5IKrr%#py`8G5=k=|!;8k=G#==D5*zY#Z&C_-ED8+VGm>;7 z#}(1FU^5yu5!kOu$V;R!DDRCIIo=*-8p}|ujyRur;Tj_m>V4W(rk%v57R@$yNtl=^ zoau!%e$J1K>KoJti)w|;sQ+-)o zLqqETd}^@ssWCOuI0 zB3iJ<&JZDJ)KM<5wgOxp7*ru+Cre<}vBOyx;vPuUliZ@o>n7t;!W2>1gu=-No}c$n zWj$hEL(t~Qzk))|@vl;cez!@FVUe!kPK(xG%#T%m<4fv9=tbX{PPw{F`+9j|r!_~) z6Cq?Lxr~O(74{CPn~(DDU#uPi;(fTxO~>|@j#IUZoGVq>Vjwaf@qU@ zRqA~3z|5<~u08oECo|4s#k|*FMd09;rQDOa!NtFYLnD}pitpHuk&lhVP)V` zUb4B8WcAKkb^4#Uw0B6AsnA>^9j7oQZ3zbJzp{N+r38s4ic^YQj7vwD%hxDnw+F0* zJVVzggQTs1#F5uxu-4jOtDTWm?~q(KupFrOPHIz*Ec6esenVB9SncPe*v2)mu(3J+ z+P2^@);V5&Xs!7HK z_;Uo81J6$U?UObdgmI^~eNSx!m)?W+9WB;HLIerydJN%uc;Wh&!u7=Dy(JxNJDzJ8 z^T|=py6}`6F4wC%-R=zyWc1;0f`jXi9mA@>1e7gU(Xg~;=e!-2*<$Qzdsx4VQL#H~ zNllnzm}GfBIcv~gUL(I-#8`AC!>C5orlwu*0a>e}>5hl+(qSZ$uRB4QHm&lrl7Z5u ziUVyjTCxX2i#{(7rmom=FVSA40A%4?rDXG_kNW-d~r)WZ4*#M;mq@>2AvO zZWr2ZgR64w7_$7iEW(p!}M4<;- zmRYECvu$jN(+g)^Bh9d>v~@6eJdSEq*}7+-BVxu&opl=e1~TfARXbZkmaxzgNF-CHvaD+9N% z-nVVqUUu+b@Fab12c3qzT=dMTom%Uh#EmSxp0@5~F8x%;o4~z6Q<)JwSYw=Y3{L%X zczIx>6rW6*7it0WTc%SaQm(=8bJv4rsobnp`!(2NiWavVY0Lr~?lYB!%lVL%F~z%% zTjNp}%ZD5(dm45Qd`;TmtiH(OQz@!-iE}Q8-FU;L3XV0U3&+50+HXj!_$V>N2r8$b z_svrysY7*`$2>#78QH~;H* zcQ>Uye|a~heSbE$xC4KF9?)TZaI1+^avNor8G9D&mjfl@EvK9t+iIA15U{VVXdN9e9+{LGM7m5`^H-B_ zSuE}2w9273`9jOLwqOuz{H0) zApHR>7g~-CXySD#VL1*#7q68HU84!-kafmbbfo4Wd*vueq~DU>cKqVt3#XZvI+?== zguP*UG$AEhzZhA3Y|7N_WAK4nN5f?R^a0~@o4B+gh*xA0k`cX>AG~D8j$vP{S3$q4 zaG1C7`V8$PQPu^qK&CP#0^mcrMw2{BfQC58#Z=;2QsI`JMTitF{ApM0&vyHe}c<%>^NJ0%_LOqYT_#ua;!!|K=vi`7~ZoC zHd@dV#vb&Yb!w!R^9fohT$qE@!65>CfH)|tw?uJYS2$zKXkT-@Lh7hbzU?-%MjFZ^ zbSJ3U2^rsHjIy*`;}&?2SOVom1*Ina_Epv$xMOR7=iKRX7$@S%_~^tU#8|LX(dHSK z{_dOLeFjdWKve~;4fY*)JM((d#>&+4-jUGWCHRWQ36&QrR8%S|R^t&!b|(4h?){GM z3jB+5F1smk9!q0*MMo$nVj-Y8%xKK%H00+MT?&+x_TBr!9m5wY7ryQ7oF*ORjq`*i z2e0frw}j;F^!B9qB1o_q-~~7Sp{*MW5J)+hu}wN3cN@x(6y?aOvh#fSICJ>AV^!$V z?s0cb*w7rGJtAGQul4@B@2&g85Uu>?srB;kL8%NcH38Mvm#Wsha8YQ zso$?(gdfgVu6dGwf%BgcwEr~9X!R3A$bVH_i(X@xUmOh&Ma%e>NnA14aBSBYO(q-bj~Oh48a)^iGLUmLdVWt zNo?s4K_PgzcxK~75SLg&O+%O3Om-jp$!K}LuF}QEXYBE2IVhdS341G>_)AI3>LU8x`suQikpC-h-4Rb~~>kC1Q zOpmN(g}|6FYNEWV^XL);mYi1;6W^YXgd5NnVlr0p;!46{dw{K@eehZWWrf_WD%WD2 z-T;d$#AqRB)iuK+RnZAzhAgh#bUPF$uwxSz$go8(?>H|Rw^*CtjC|5O8IwLWBg$ZR zoNNWp;5{FhTykG>SYP*&Dcp$uu%dBSEwscA1Worfd-SB{EzabE?(<<953B&S-kNsM zaYb=={3f4gxcjC*cznwHwD2<%00XxXruRezI< zQjc4+fN8?ns23ab!S2Gi`FIYyZ{ssb?mHLh2-lA0>B3v`6OCa5p*ze*57f|kE_SW_ zd{Mn(B>q;btfh1rtZT0SPh3`RysmoAL5!WTCk!FHD$=3Fo zFgeo$qiG3!f^-R;xi^oAOSy}J8fyz* zF=tJv#b%1R#6e6sJ}_6`8)%iK&}cV*@zKESg+l)?N7&7CjZ%AoC(NAaj!xj~C=F9KF48X>@Xf^LN;j%z5t&|Uy<1#uI(Jm# z!=FAGlub%rT%Y)~e+*IojL4d=4ISRA9Z{m3Y}jX64(gqc79oTy(e|tM3&f&V?FEQc z{%HURTcSKTK0c^@qGizZz_+w-i0~^1o%kEhuW2^|9`A{^`wrCXebPM5G{~oG&U+^> z9G_M4V-#TMCN;dN`D(qA58L%jSCp)n`JiqKld-X?45vdSta{{G&?RH0I4xvgEgZvI zuvKKQV>gBjtwah<0XcQdP=Ox)JY`4nog02@2)9sOMB(P9WiXqY?6V9{{pa(0+t$mu zp>#Oq_}fA$&$^4S491E}P@xy(LK5|&Dc{paw^V9V`-phS;ztcb4 zVdBSaa{3OGK&{Vhp|9*|R*yzr&d-->n8#aFVuV|h9tX{QeYn9k;Y+8&pHf?DUt;16 zDe@6$PGk2f9F^;O4}tGjj3pH*-eZ)X+e@N7n2#9aEq$VM)K}|wa+cuAM{7u~Hi!!a z5dg&4KDHTXCnqM2R4ps%nI|<#SVwra)!PG zJxmU3BPSoTJ##rpo+>7vEh~R5$Ibc}(Lh4v=`+Ur1`!EPgz7Cxnh&o$H}ab^GWE`I4Dt=)bj04-zLW+hyzTe(KuqX?h*QlaAo;&p7T`VlVXwsmIZ_DTkq(2Ibg ztRq_Z!g@cCrZ0e0=l)#SOoM!hEA=a#tBe*ZuFLB=3!d48j@r1UR#QHmtHdG;A_b-N zQUT4ItK`_&LHFemyd%jkCQ`sVX1dspfmAHbHmg2uIts@eCi?`fi!8?jhWKQ%s2N?B zYyf3fScPN%;y%;pXT9>{jhdMqWouLC;;g|g8iT`OM&<-CvZS-s0NoQfDmE#c(-3tp zeftDQdQs8)!1JA~`K)NL0dH(lge*>A)XTNm^m4DCElf))HBGDqNds3VFRT z&r8sAbR1qu+0ZnOe!M!~`-u-x#hVW2Bc-lQh-s z*l0Q8bck4*96VXs>et`NWNJZJQ;q@KL~Z0kSE2#Ey%ZjV&!Q*xAfwZ*+!X^GYfZ!& ziM|XAgW@05&*_V(3AG~i^g@{_wa+WxvI@i#m=$k+hZ4jVTA$R&4Q(%H*v=;Qkx%@2 z)IRRxM0RNW9{lp3rF6!55GQqg>cYUrKUDkDEBCk}@RiD@BW=%8;5OQP8qXp_8GPyF zg#)!YyWmS`x!^>~l?8egUv4j%MAA8(;+4yX@MqI7=ipp2*>jvXIBiF~%(Gnkxw?T6 z#&eSI7HSeStB?B1PmQ^h@#;-Ho!DU&eJDr*U-WI}kwjKgx(jaP1}R>JxLfqBlM>RnedwZf+?p$Mm1xoQA6TUSElC>A$86bdQg+-yZK}quPcwxM53mgR3f-EUEklUl_pFf9hYuebMuP+7*>j z(OR@`!;UNEKeHnp5AXj?+kzc6%bNpF?y<80`Cw@0SwZ*y4F&DIol4b_YkuK(ZtUzD zXL|KuM434=5q~z~z!vb9Nm&qkNx3uAW+uOzbsT>w9%; z_6-|5XXc>wY^(N>#n?0srG@WK;_l^UclnCRM$EdfWKLX_aIszOk?xU*J4zG;PX#%S zKk8+;^cPbMhJ*CNs#PHurBJrxVwWsTIXc&ZDGNKiwbn7Fdg$ocv4Q>jPR; z@8#l31nWARhMOj6P8#{~d(m4{9~>LXUY{OF5Jes8zOl|8WV3kwv2jCk;ISg0aWy6Q zRypZI@IVj>7=A#s?6)mWq}!-zMI9kG24VWb%N$3eV8_Y_N%i{-_9Dz$v57nEY^2Ld zOWQP+_koQr0;bULg>$lc1Xe67Uo zYSyjlli7w%DYJ<`aJ>^`pX3U zt{Ehv+Nr&T{er9Xx0#4$NIUJYShjcSDdSn`<4-?JK*;zciC`ZN9EG#DB~W;nP{zxN zZQ7uw8)IXt*EhZII(km}QN*vAfsay!o zxs<{U=zoYvSMcj&Kt(K+yMn^=f4fQmSt`qjmM_CDB{X_k7RHm1!kOW(x$}?>XQ&6v z2c19>#>ML>U#>~`Y$Xql2+OXQotRLD*H^q=lcrKD#=l&`q|nBe(Wr z*m?>6mN)2BuVd*DYpOo++)oOX39J^U(J?2aIUinW=}x#B;mOY{oa!2^Xmk?aWg&g5 z*;VpI!s#k3vE%Akzn)W+S7)sT&Z#a(8ZMzf5Ugp$lznu+{48tX%b0)he&u`lC0QDr z;LUkRH3fLrCzi+?+mL$qpr~$5it-dW;sK1Y?EoY(-f5ml$hc#1e5<*;INj;X_9-?Cf;19`$(=cvs1W2C79?3DWLPq+9Xn-WkSmIc;3A=Vek zKEHGivJxgW(F&0-PxR>`5oHOwrK_&AA(avN2t}z+IYbFo*RK{NUPt>8=AjaMcu2D2 z-4&`Xhf@5fO~iM+GV_5Bg+%Wh2DTjrE^=fkpH->#ru- z{&wVUk`%F9tg`eu)xEilk**TgEqY@x)o!OX){p^;$NjpftvVz~LIL@@wz5ZlM~w+e zRAO0E&9BvK^rE9$&BOr3718;ju`9T%xqI%>tQhnIcso!rC=<=sQ4D`rN)~b}HR2|Y zhZGYXn3(K!Ea~jhv_J_%NiGH$C;ogw8)B2P${8yjK9O{Z7ko5pcRk3*-MrzwSJvPr znHv)S)sot$&T`OMYOqv;Rkh(E`y$=f)4R2BXs|~D|Jon)j9zkB>z>K+lCr&pIc4nL z&Wo3y_E36y&l`q|BdzY=wiB;@@uT&)4*J%ogUl)P-e4#&vcKS!L}0A~`Z3=rS{3G= zu@!lR&lf#-#P^Kr?|1K8(km)BdFt*7uU5PWxQ{!HcyKQ}@p(8`{hjYYfV#zQ(s$Aa z{qNA`)B76>@x@f;|DJ{U#13~Bc|h?3A7S`Js??9 zd0U#hJBwaNnNRin)wk~&rgp(paq4L`xi&|?tI;>ZVd+xf()rtu%mbfW_l9ik8EI*b~! z97Mv?X#vzSy{x39BkzcXaBY^16zlMtF^U7Dv!pC6B-FC+%U)iL%`}oBj5|JSj10yH zZh3ygpWgE9;Vhc~-{X|t@dQJt<2s6e8Rnd}1YV5);m9KgQsBfR>b0izIJiG&nXsak zr;cgn%M%gLE=UBIRnPaRH}sI&>wTy}k>NWsKKfbcde8G)M$R>u!j~l9gceX|dW)YQ z)@JP#Y)Y2w1YKmlwNUK~vx8!+BvXiyC`w2{)QDj&51K0?uBi-}pE=>ZQl6&vi%ZU~ zqzw|7(9@R?gD0I$x{YRHEM|~WD&3`A2o^vJ5E>&Jj%04~g<@r<48%*Pb;;=%YdMDncsdA!PS=;NRXx zAqa<%EsVRZpJxLEUOOU12nJO{zV}aS9Tfu{e8{ejxjfETnp~R&H?1tx6?cJtvtD zngN$=z!RAiiuM7LZ@w0PXxL?l)q}B8v7K$I>iGtz6Q9{b1iVV%(Hvigk@8iVW!29% z$uoNa{y1nZml4Axv$#xK3|*x$CL?pOY?APvO4;q&CcQwcv8a#MWq68-=juN4TWn|O ziZ_O~>=lj~m$ks$&3VVOVk3V3tErVGzf|bh&#LK%=}9ISr06b?@h(PDSTiU}ryV3X z)7v@UVeFJB*BLqxs?az~^g`i>DuK>Pyj&WeD0`4hR(iHtrFE{GIp_74OQ@=P336lI zlcGpSvR!ev?xwZ0Uf8C!Jr?-=1nrD|tZC}w8nsR;_^4q+sMYyncZI!XBgSRz(1vmP z0y^Tyx5ZOCH&chZh=4^dsyJKk^bF$7SoxQ4KJU2VF+CA5(<6I}NXB=ux~!WcejC^<@7nVixi5g87^8E~e$`&m#NUX~nb5{QC+W^%}^0moI45HUw zmlDVJ{xZ_0kxx>^t*h++u-q3JsF1LRQ>=jD*?TJ8!@^lsBoM> zZ7M4whDK~=M{EuxZ0=Up2RWw@T!-pLD&e5O$8xs2=-eYkkudm)<#7ofCv7Csq?lsu z%L?H*C>Plm^`iVjSKdi>x@K4Eacy%b@muh=WGr(9kAs|mkViZhgT*0OYAN1yAGsk*r5l!ciq<$my^5GyENzGz?H$; zXfrS0m969NBUj}zMf$4r#V@NYaij*$Xq@?jFWEqkXt?8*sVA8PFgEEGF+6-(XXO~g z&`k*}3~3!&EjN9Kh>TxxQ*`^iRr0R6^YBV}jBiVA%h^2qR_&x^T{G+9{cdYkbk5;0 zl;H#C>9?YutXDIohN*pygtaWCgooemq&+j29kk6xZ!$WCG||W%NDu8CyS`MCmc~rR znp0QCeov{Yze^o>R69QHgC%=Rmo0M1qpCDEn+VIVy+L*rF1?>Jc0M28jV)}A+f1s_ znZ^4?P*7jK$xJGMp7x(N@sGpcR(PDh*owB zUU-+F48kVg?)lyx9dlzZ!*nTg<8y7d+?h}yV}06;VrpDe9B*}z@wy`Teg$f+ypgN_>#F3IUK;=@vrO5@Rg1J)OjP8tFr)vTi zybhc&vomKQQ%m{`ZBY;Az1^3tW3n9J8~x z*{-sV%F6LfnZ?yY2}=tT3#}#O6hpfQ-**nob`G}>s3Hw)?8G4E$j@KgdNrGPc_QbR zH#gQ&kBnitDC}-WsboDY#_(Foiyw;RH=g(RX2q0vR2AqaS8)c^&9dLzcsGm43ddHx zo}OFsI-Gmy#Bl?LM-8;m6eU43>b~pt)0*Qo6h9PMN6AK_C&q>KZg%Ay6(!ZzkM#JE z_9#26OuMIL_Tgr<$dC_R3poMZrZ&wCa?gOv6mO3-&+aUGnwx2(D8vmp(et4gf`dT2 zapa8H1wrT2G>y%9Mlz2o1th!-e>wXxxzNgYVnxIyK9^D=F`yo?-^rD_pgcLO!B(2Z z%l1>bTWI@dD~c>l6_Z4AV}y za^R$?ofApC^xLhwrDxSW;g=g0etaRO{p{WWzvS)pmtzOycI%A@UqM4nlH8~Wd<`#M zUA5=m9y?tg!{6IfV^%}d$BdZ?T!Q(SW;1y|3YX+pH+o-X>8|e-5f0ARzzA>zzI<-{ zs>#*Hi0x2#p4~!Wr83pBIPLQ|u&KF(zsUGqj0v+AZS|pD0UI7_)HiG5mZ{Z7&($Mj z2hTnqcaK>%i|cy`o_WS9*#ie|1!+f!z{}_T+6WViwqHIjX55Z$VJif+R-aL~kFd~& z6FaJ8jNZp~QDr+6(w~pXaPEa(F}*kXczemT3v>Ys7I;I$TQaC$IXc*3wRHixJuqO) z!o3ywXuEBV!tMCI1)t3h?_o2_g81em=ls!_;((Ls%H6tG+n@n6(A$9B~ZJC_N%S9+-e)##HWkXfWyXgi-;Yg>I$i>#<9 zbi*lHSlqNwCF4B0245Rco)1xlpBt+(^6Z!paYdVTw8UCq>l?kW0wRImb+)W5gE=i$ z;)SJDxu44UGwySRc`t3(&%xz&7TupYC>L7ttnfFRRH%q=rK?$GoU`#)b^Ry9@14bz zUZ~W>1ydl5uiSR~h$)Uy@AR68Q;~`w zXd2a++$7(iD9b9$T-@oAMM9Oe!%ij`FYVJZYL&26Q4W^++&PkjSz{;iXAO*=LUqLf zYn!2X@jEQlh9*=8n8HyWk?HetDalrG9NNaW(Q5XZ+679G z*wB)slL`d!+C}q&lUCg9_M^?!+{j1Rv;56V)9BLzu5W|UonK9~!56z@jokDRZYqu4 zc}J>QQ9XP*Rz{%46T0mM#3wo?jF0+$-T0zieE>hgm{eBTq9rm zp|}`yzBw2Z{4T?@9wy%MiACy$R@krr`;7;I=nF^nEyQFMxOihp#Cvw8*7HbA*Ky}F z6E~_-r)s;0sdZCWnUVo~KFK$q-yX+=yK0&+B1IQcQz-E62{kZdZ7_Nr62jbObodKD z!Uxs9p;F*2RHx39!V6>Ozck`(7BWekKP>GWNSoY) zyYzT&oNa8jgDJ0ilV4MXs6qMKe%ng*rLVo6moqDI2&fz9Q*NRS6=0|vSaX)!+o}cDcg4&s3cioQ(=U zn79|;TQ$Z_XrRk^akaNEhb@mT_i2TUncLoKnD|R0+EsaTA#1_aAQZn7|88BH8lBJ# zA4*6;)YyqJYjHFS?{#9V(Gu?7GxUJxL`6W7eT9ze?aEW*c$wz-Vn~CjKYYOOV;;s= z1qqoYN@Y~)iy|~#*Uu5WEnmeTcR3ahI9|Ki9a#v{y|hY^8a{D-h+B5uzs=2wZ{ zn+cr3+ZVIZQxP^BXfFF##4djLTYj>Y+<33Y>F`Cwx3ZdC2>UiT$_N7B9o?-OEFKXZ zmJ*a>?rT3R-n}|~*mP@eym#BY=T0!Y3|=h0#A&)*>V)dkdb1(S*2q@cWo z-3*mljFsX(No@WgX-tDsU}4&birfe43l;rRTJoucSd)Rl3NdAtM6OX}91IIUye>^f z`v+}8B?%ouaczY{DeW*40u%H!iW*wL_`}#0rhtr}A+B1C4Dvcu z?FBz$^KUFRMAW}VvP|?<3hNo{1TD_& zq7APWqkyF*#bu7rUG^1*Z`N(twDMX8IM|@6u`!JN#01@{wB%xlbQ*m73&sTgjrj`V z%)klXl4F0)ddB9pd)n`+vr|hv{inQiEhLI3I zz>^%Kf(`JOZcTO+38j#kH!Vtw@}1;)nZJZQN!SVOBlBl3nk2`1krz1?jN1vZAdmJ(RPWC6DCLkW<1 zCYtxxJ^;E>Q^QA>q`p@(?%CpERbH{Nadxj5Y1G)-A8Q^R-%8)68(C~_Og#)rZC$oJ zt{t}ENg@j;hUVYf4qsRAw?^ArphLNHO+*PZa%<+cxvMRvG_!Vq-gqr+nB}>tI1!jx zbipl-($k&nStAQ`QGK*fHwbA^D_q*3cg~Hn|0Gfo@5?)l+QF~K0hQfLgzJ;3`XZ7e zAjzCMfRq-dJj2&qH3S^DS$tKd7@NBMHu8t5M(I5)fA>qf@_o63|BV1=Y!8@UN{}R7Sv3HG^YMpY#geV-@lhezd z#u4>U=|qX7Y+a@(jx>BEl+&xgEDk|-uFc!ZG!6mM5fv(i)2mzc1lSNMTpk$12?imK z-?dKTNVCwZE0g#Fe?RY2Zd)d{!-xZExR+dKi%dk1mvCQY=Q`6-nlb5D{P)r)z|WcM zND90uNw4>DZgSSy%8XC;>5)mLJYjGhA*$=kEIvfTKJvtc6Mu!z3gbjStShs~8;aa2 zTYY{5WICnoxV~$$nYg8w5QbMo?=j;xk=)~<`?z!-0PFq$R&>FM^q)pA+h4u)-$V3| zQTP7;gr)VL$LoKD(E|R2eftGQi{U3I)}Po>AY`c@I8q?ctRI#T{s7qe0j~9gFa?6U z`V)`pr^HXLKM|__)bj+o^#p(Q8`u^|$5RPUI-dT1l=cLn^#^*@PhC%Up6q%8*m^>) zdb<1c{izHfknJbepC$ci@t>SO!MuKQJ>7k><>~q)|EHZ#5M3Y*Ke?V{0U*e}AHZFp z|369m1?*?N1wj)b*)Gzu07eve5tAx&DxN3m{~ELT~%2;4P?^pB(V-l7PQS zK4G{0Q20|;+R8%ry}k_yhmB5J@GZy~eFvMT(Eo($_3sq)7d?MwAZcyGpO|pc+E!0c zhfF_Bc&d`DzO{v|m9D-usLTItr=-4~k@g?xiceKyW@9D7Bp24B!`_%|D{~f1~j~L%?sw|7#-o z@7dyiqwzlj;BUtNLmvGvG@jwfyZ;t#K?&u5!RHzN5e^cBZu>uB{7-<&U)_e`m&L+= z?SN(Y$0W`8zmZ%S|1rBV{%@pL#(&JOjQ<-6mhm4mEYtr+hGqK43=3Kl{4Ycsrhm+^ zO#d4hmgyfe?2lRcZ}90)8P@ubmBs(f#9iD-?+M5G-xGb%r2NO{XY2j>6?FY+(qAY) zCW?QoMgFAzn1206`Wg2BWC2|P|6XqVN&S(4e--?Z)_x=X98P~qfv!J7@UL7y0^4t- zzgz!f5dO;b!?k}S{oVSXt3m+_ThPks2_pX2gvRm@QwafW5bV5#;UE39{_-bnGNK2Pai__fAcYboby*26YEnC|CI)kWd;5N-_r{AuYC0M zKmg0%W!YFje)T&a2+-wM8UO(Ny$k?=6~GM2Prt|l0BoTBgx_e)EI^Q7{FM(R%lH(e z{z{_j1IaRj_9%Ykd+IlkxBeo_0Al;iK9KCw&dA^RSbo>XNYD5W z^<{fncl}ZZBRvy6Xh8o;V+OGOW(%nKKzq}F<6~g>y$u-I7@yMSU-f}x89@6yztHGG ze4xFfUujG%41c#7$i(`aK6)n52>4weGd%#bfAot!P`NBDpwRL3`Ik>J(=#yqjrOGQ zSH35A0qv;$Cdjc3kU`NR~kr`>1mDeOMO9nz~Af3!U}5WU->|?EP&tr3dHxfHUP3R|IPnEw5RO$ zOSwQ+*5CVs9tdP)`>mZpG`8Q{1pr_IHP)~Co@l@K8vwuzVExTz5DoZyAA#ZvsDppk z$HM%3YyyDB;O}k!L<8-X{i|*^R@z3U`c|)Cer%T+IqCn1il9tJCu?B=+Ta73^XKNE zsJVd!;ZwQ)A_#(#H7BSdd<-ls%&aT`Mg}13+oyO4iX4oL`~XlCXAuI$>3=22|1guZQUOnez)z5{W>mXEVaVc>S7#J8x68M0AZZL9)xm%ipKvGil zAXpFxgaASY0|$`;C>CH807C<1Ex@P%#skV`fYHGqKwv=m%=lnXzse~96a2wT0H*z; z0}fy|pf4g&ZUW2>U`(Jq0T=`Px1DDl%V5Y~cEACn&`2N<>3>ZiQ6pPB+uv7GMLRb$ zM->Y@XHpeSHg;B0DHYIjc)#rZRZ2+7DUz}?b2GECf!JBu*!fwx`Pn#0*|_*w+4aSB(HDW&iP$jg=KF`=6@?{s%`xfItv`@UzcQ*}rFh0$3*G+~2-6 z0~qBG?gTJu?mt%x=WiI42lFc~z$6GP|F;eRLEwMG5P!pv`M>QC05+ljCV%epyrZsw z3n5U#1N`@u;(T5yPQL%8?AO?UJ_*p56etYz451280j$pLvRfT01cXRqb}3fk4E6*#rlHkpOZrK&}hO$pJh8;9USy06M_pf`Wh@K?BI2cTyC9X#va6c9H=+ z@s}N-&h$6T4Cn*lfr3J@n2@>@4=d*YJBosg&3OFGwbuZ{MYn+ z8ae@^rTuI0AS$4)1x(Ju&%fgRryXHn39x~-vcI)m{taIN`0w@Sn4b4O0?_9#ezs2x zEJwlL`u)}R*GPZ4^t{Ud6A}iLX#emVpmRIGasZbCya~uRfpQNhpX<*%;hB#C{tDFp zw*)9X0e*u6B{<*+@D=|@pJ%_8fwn*Z3<4ARj7|S$=-KRZoJ2t1=h)(ad3%oc=}*k% zK$|e2g8?vbEd7Jb02~MKJiyb>3-oXF36Qq{{M@G&;AVhJ0d4@e0$|`c`VXoBWFh}1 z?F9T90DQm&*a~PX0emzB@G^jv|E3Fwf$zfe$?(4?JfN`^I02ri>CZO=1Z;#rpl%Mt zeF@loCbB=}GwuZV<#Qe2UnKx@0RD@fo3H=|zWAU`zaV-;V8!5ok1%pIyeTl#=>LPy z3E&Gl=wGiVKcDN*^xMMkxSk{Yzw|r>znW~2GJj<9 z9X9N*d**-MWBxnK|G#Z7<@t55df!0@Dg}akezth#=VvnTUw15JK3)L*?P(bG_p{Zr z7Wf}r{XF3SK?BblzgwSgBY(Zwr~)_Szus(g0sQwj8!+HT_x!an1?1p=a6j?0EfA<4 z;ODl#%AbFK1AA@)8hL_x67&@j+YurM$%aB#5jh?q!-2ndLH=ol!NMEE4cMEHb+ zq?F7wq~weggoLy_bd0QQoSd8_G<-t5?1Ic3ob1m=z~JEE5D^e@k&tlN$q32V|6kM3 zP7oR_C=S#E0Y(l2M+1XE1N+$nA_4q_0^Sz^dJgHCfY%yGC}H4h8`M z4haDT1qs|B!F--ydmz!E(8<_dL1QQx!H_#(vVVxlfu#_s`GTc9c}B@$?C1vvkBx(i zhfhUKLrX``$;HjX%f~PJT1;F*Qc7AyRZU$(Q%l>#)Xe;ig{75~vx}>nyN9QLKwwaC zNN8AWTzo=eQgTXaZeD&tVNr2OX>DD7Lt|5OOKVqmPj6rUz~Io-^vvws{KDeW#^%=c z&hFl~{e$z1%d6{~?>}zup5p=@|9^+|kI4QlE;Jx6a7ai9NSNoiz`)&}14n~|B4dL_ zf29Otm&E8a|MyD%u6sO`@Ww`U1Zx2pSgrHXprZ z-AO%5wyq%o8;c;`Ec8?#zXbNPhmgD+PTLqgZNsSX;_>lu;uP`wn%$af61cDXxd;T# zZm~PnBkc^cf^9?xtO8*^BU#^q#B>J&Y>0OYj7yswv81@2v~dC|IKy2qiW8ODJ1@X0 zbC>40l$X&tl@`EscT0-(b^KXQHbR`=2xfH^@3S8?&F4yv)Uhb)oII)d+rE30u$M_W z7<1bM*ZpeXQUU<4NXCfPjFPMLWzlUl`A1A9yA!UQZ0aoIE7 z@RPcq_+|<^;P~qkD=r2kj1E-}E)L%4JdLD^SHrAo&XtO-VNkxSpPh)x)t5;XzlcE_OX{L2`luB0ewh5N9 zHLj}^rS+xlAW@V>YV*cPe@s9UJ(GA=gRC9edZmPX!`^pKs?7n@ATC&i6)iA|v&#M4 zRetHCS7P*_)6~IM1PE*@QDR}C;EFeOEqf-lp14iNl(*W)c0F4Ia%oyMq{n(6yDg8H zyd^%Vr}7>@)WXKwTPMy)bA4+O&X0SbD7mgcl96fgn_Ii?s&}k(%=lbi)$nn=tXCv2 zLhtDNiIugsOT&B!3p1mpP-yh6m%yy%!^>h>(Tp0gOay#?sg|fOvBtMdol4{TIt>W*Ry@zrx2WPUK(kW%$Se?9n#GJ2lH1zeUhlyF7^zl7Ata4=GJ7+kF3$Uf zs5I`tmL+JTLG{>3+0sGR>g~nQIHJ`yeN++A;hTHtDKomJUE6X6uH6z9xl4u)=3v5f zyW&Q-ITiMj3`}A^F70bPmi#C$N zXtEblcspi(UkhJt=u3%qTMQV6BpB0!?%Ygq0oF(ZJ({(;g}Z-m>*IqM(#WA*Rz@@y z2q3+V1tHh@&%w`2StOd=GuH((AqZ@I1Gg%c}Xo_+w8RQ!m zG*<*2==OGPtwxd}F<^K-VhucV* z&Q^1#vWK4Agw&oPe8z6=P6Q$j_rSN!x2xj7#(}eNRMd_J9ivaEG$PS&Zi7iPD5e#v z#50R5(>%(pTgj8@t1meUUyiVdY1CeWu78h)b>X<-P$XtMJD)*;_)U`HCyHW%8SBoV9GeBSQA~ z5!zIs$Go(ecSZ4>%G$*4Z~;|EIS`t@byXU~8tyiqtAh?xNy6>q!c_lm?Mbe=Fwp-V zMmrF9wcc$fI`?3$NYs`76-4F zMhm_#9J|(MUzBsCnw|C(O`fcc*|17Ep!R%7vwNA~tkIMxSFXFZ;CC-f)&EN0ql)E$ zQlC6gM(16#`dhc$3VwTFk3H-dmY(I`yZ1ISPg^Ho^o7hgz5272A1vI1R~o+_R1SzhcPmXDqQ%LA`((=7T-yU1SDvb=@?w%k7!<44z#?TF(jOE(|93r1e1Af z@trVUZLtYbx!Qm>P;|B?_FY1D;zcxvZh&X+ZG;%%C!FjhXkY%?V)7;)H?tx`VO4Wp z%Db$w3JYB}CF@mfj|>^%3up;z5B!rp{j7;KpOr zR2S(2C(?28h+!r7Ox~|#ry#lizMl)hn{RSx@W#bmuU~Po*WtLpOs*)Zx z(yKycxZRhc8l3IKTRQCsmY|f7pCEN)D2v0-P;>QMu@=c|ixF|v-ow{eDS3JZ-{z}_ z?HFG1-hR0GUJ<9F^9|>~S?+90W$Ku6ra??{>tjMBvcq*Hk4kGSkviY80V1o$QoE?) zj~t=7kKAcqW{9x^p9E)Yk-awCawXwf=yA~%a4T#O?hDq&MJt}hJ7&?CcRMn9T<{cs zfQJpsN$>K`@tH0RvH6QJ5VdNW!LtYhy(7y1|e5>=0p#u z+Skpus)i(n{1bxK`Brg0sk;k3A1^}rH8`9$+7&atqxbQUv|YFqEx5Cv9Oz0hGT`DN z7r9!}V5T~*jHitp8_H;(`O3`110bk6k7-Z;SY!U<|X=ix% zxo;U`#wyH{M4CktL`&?b=*mt@n=jWBx0LQG<75+*%}2bAeW{oy&1u<}y2t=)pIzsS z6~lIE%IuX|=jCv5q@UGe72CmON!T0~V;9|EgEGQfA*Tnao`}6a%%8IIC=YsI_2n-y zTj70cow}1ODN|mPU@Dk+sDUKU_>NiC1WTbx zKb7btxTN2kQn`#Ud2Du_q`Sd_jdip+oo=HnXo^|;tBQom%*oxhlU~I%%=_xA{Cna| z7}UebwkGk>`a&B0S41I|epA~SmHhsxn>KGOHa-|cFVb7*R)6Y*_>hW$O`arZ>xqe3`eza(Oz&Dd3Gr0MoBSEI>N0Q9h=;qSu;y6WXqF%lU z*1%cY#}pxyk@FusK~=O@``>K4vC6xV;r$n)7{=RN)+ueITnOY!EXYhq2~pQ(5j)Td zTU${V7V_;=piNze=`-8ZX?lFo^(|vV%3b1|5GRecD2ZCGDsmdi9s6r`IDASdJ+`E@ zq2dV6B=5}YnW#j438(v1?5Gqfv?l~jTlGR~TI!@WE@e~tU+!@sos>M*6hCH*RQK%> zNEm6$X<=V!&|CRhranpWq+?ucO@)19<~*h%68_9|;XfDFs}V{(OT2{@{WXXT)9p}2 zS8ItKQzEWt4F)=ghlEeQc`GcPRSZ#FXL_p5d0L&VwV~W_^@sSB_b}D!+>!UEG`GvL z#Kfs3Y`L`dMv@=wyJV&G0Xa-^-Y%9* z&E957!)brcyV+E3b(H}=tWQ|;%bT%t8<>Mc4t*}}Vx6+29JY$AfQBEzR2WXxTR z%IL(0P4ESr@Tk`|`U@R;)jxAci>|B;QVW>yRrp{pzR5C8u}M!*@w0j_5iMCKuH=u} z`LWe1&T?hFA~>RivcCQ9ljS98qsq+(YPJYNPmQ;+7)5!!U}4*H@-aqs4wSJw?`4f7 z4^MS?=)DUu(^~e|Y55gxt|?N*b*$A0QS+ZV9<8RQE8})f*zT9kMw{Q z7MH8WB*=V)(t%!O z#K0z6A^-PLtao}sHp${|Ry+A}TTY!a_dbh+)DAepsnbI{jYhe{SSFt$O;bw0l z)2M`ZeD7wzO?S}UK}%^Y8+~O|RraEQo}f$68tAmQmr%;Io-vAXMKqjGmV)RelTa5Y zdPO+zmOu1nI@_Eo&0_Gn!f@P7REB-7#)fDu!Jdi&zTksUNEJuIt5LU1s!td7lkjI# zSraamL|=B}Gjkoj%hE)2bI=~SmvMieULL3nFq0Rz(n;pw-k4D(XNyYEXxZ|@n@Zbu z<(E8;-PxGA`c8-8Kq)P5V%0b8kmvai`!4BDoVovEAdo>7)&amsG+n}dyCE_*LAGUh19uLk^hHAn-3 zH%r|6I1Dc}4kj+=e5apyvtzqQ(njKfa(18PX{mcv#5?sNw8Y)&02@ODu~gL-ANymRPrS752KG#V|5Hd11OZiyQD5J8jMf7YrfrSFY!agI<$Xu&^)(t z=%#dpQS9{N5O3Jj3189W%vtbmzA3RX(1yy`OsNB>Wa!0 z9A0kP$a3RV+s^TI#&bTpgx}IdPyWRl^ukase;ozRrT8ET+_+KR!G5dkHDZ$zF@_Qg zYJ!BCFQrMuIJ0jH66vxLO}1HIdV7XlzeG_eT=-$WwsgZrxu&sdm%O*s8W$!%?ojwC zImR-2`I`cvG+I6{A}@Iz6BVy}rtn3N{gJ>Oev(F88~oecke(JACs*j^@dlZ~gE#20 zDYt2JP2Fn@X?a3|c|?pv@@{AClVzJWERK(#$;QE7JzC8NnM-kAM-XzFmORM&R>&0{ zs^hoWy&WqZfyXq7>|Uy6)VU|oPM!QXum{STzMYqzTy=RV+C5(sQZy>JigZps_*f7M zyMVI|F;z_@#4ySHmTYDNj+T$arC&)ms;ZEP|EvqQ)ev>zP+EE^t+1d-B{P#~zw@fr;6;lasAstHPfxMBk4ilwiR`UkBtlM^MLrI41 z2+G;hEoezrX!zLRq{?6{v3xF)N=Bu8s*-6m-%&@bVc;O|5@xQ7Z~Uzq0)uHyhy*Md zN2a{h@DOOlNrwWimv5EuCn$uAEgyG5+|)x#F?;>$P~V}{D(U<8HzT)d?+#dmU-q?T zxZVh?8ZFB21b7%mrMo;j={}XQGa7bb#(j^(`Tj9}lmkAYaG%aAyeLO}g@gfbd)893 zuLomPO9Y)&f^+uuz4q-l;RE+V_gXViiaMk*D~l%SO;Y#oCCqI_(YG>zM07FKdjyVb zGZSlmp92o>vnM^0_47Sbzg;b(xxGOizfNm@aXmcnUP{k3&gF(S2Lc8XEwitttR_8G zBIk1?cNQV*&_>oU;=97I4-G}_eb5L6J=oGIPZ~LEWJ`tUB zt(FSN&?hSz+TlG~*PTOGK&_U~MQcA+R6F*6kKe<<7AUMX{y{_28o~y&&;ZkNgBD# z#7yM+;r;gI6<50;s(uf73`CjdO%+EN-B!~YRwDPd*W6s(rbZJvLaZK)=!58kWtW{L ziPVSjmaoh-607eD^D{9+S5pNN)yCn6e}q{JRCx13zwh&TgCh)tY#ITwr~%S!K}a)ebBy zC~s?&{48AzVNqP^tiU`Z6O;h_W_pNZq>2HayCc8Xa^jEeJ`V^={1lh5*I3p9IZ zL1eT7gIB!7D}s`?TcO7;GL99kcgO&;=POY9hCzpm7NtqFxY_=utCczBUE)pca+#z` z$?>VKAihuTkN3;E14e;fJdpS5>35Mkh4u1T@nqbU)5~)$W;E0>;h)Sa>k73j@ABtj z2Dtkiz86>OJ2@~OQ}$+x^D%l&%3WS@whFZjFr;5t!5D(=U6xnK^enliCZ}$Q*4he# zk+q&jqd4e>xv$x1C}DrYo?HE*pIv8a0(o;fJ=eB_$J-bam{IARdfkJ4$2D3i1usYW z#`J}8o+QT@7@yGN;V_A8Lz`;q+`1Uv#+>L->NhS0Br*3V!{(%s6TR>^mz8GafQGPIF4hSY)M_VgsOo3b4!(2gH4ptDA@vxZC>UTe{4jls{ z;?NKC8CCwg`*>1fnn@_*PO8>Sv*)Y5r|lZ!-GxAC!dsG?tglsxri#p4C`QolfIiGj zYToTIp=^P!QS*to#KN1q@f7(meVy%yAv0svR9z`nU|xdT-_E`NsL9aeeQ*wzit<^0 zBfr+?dtIi6YGb5P6ZmL5buQ~9&YvLaaVeftKS}{#{07T%op3vPc7(k=;)c<$)+ioE zHg5>&Fzqh`pD2`YtovnOs}?Ee=1hLtjcIE!;vI^c)iL0hs^4d(nai$qUW6?9{*e^_ z_=vNZF+b)5v?JRm+<~h~hRzEKCye~qjwm++>m zd5b!hFw~8FCbdxNEfaGFNt*FF3Ry?A%V^xb4h$hQZm;Ue#BDprPL!1orIa8ebg9Ds zRNYqFnu=FGG?0SyAzeeAIKMr$Id{9HEKyLXaA6#&Cke(ndk90y=>AbebDr2aiyrD! zGw5W!d;4_h^DI%p=xoELu1?b_1s`;SqMM^>!E6S1Ud~r7N&ItJ3yC4k>(V+8B-6+p zfw${5f~q`E)H5#O&Ek2aY}uV4=ZbLaPXad72WzIQyUZp7IhRbbOP1-!E7()~1d5*C zi`Qk^m^J%L^=`^dY~Dkk8z$UUx+5Z3?80Dm?W^{6T7!eH3Utznl}Jo|X<=bE!JMw9&-ZOx02YeFqJb^QC|2db4#&r z)*!*ta28KBg(w;+AT|$cYzt3vQ_4Uk_mU|d6wAEgb}Ht?wm+`{Z@Lw?TAaHNq->$f zN$geoiBq=FP-ZqHAh3p1^O_mHy2=fkBZ1v?IredM)?68Ki{D;1uSE-;Once0_~Kzw z%zjFW$97Lp`4hYEPNjg_@P57xX4jak)h)t;l9(q;PU|XWeO{;j;=Z2QaYoD8(ulDE zD@prW7=2M4W)mMQGj)_Dw`BJ>OWCQ`jeKK{l}Rz`m>i<2Q2~r`t^<9X>GJKf)t)MF zJUn^L>)f#I-Xk%)fIa8ig2tv9lfXrsnD^E-lc$v$-HoQQi|DkNN?Ho0(srWx=b3qK zZ?Y+t$0lp~q&I6Ou@A))rDg=`y=w?FX>&8&YAUH7XwR9%M5IWSBG`J_mjfSYbK9ZL z!UWL7`;YxI12l{r%LK&Dz^XI8<%W7oUSEWWyXWUu6ZBqrmh)bLS?eJI{g}p{x>Sce&0abp#D_Mw@bgE}-f=SA zO&t1$Ndtx33P%rtNWf{K@zj?;7k_Smomx0M+w-%q*g7#Anc5kfF`L-gu(%u9vj91C zEFi&`?)F9|)@IJ6#%6CUZG~t~KXuTMTAB*cXmH7~%GryWSy)PXI-03?%Bz}qTAT2h z(!6{DFX+ziZewp_=4?djZu8dGiQip_=9h6`L-9Y0S!e(yM^kft<=5hWRDhZg%^zRf z+}xPmIGF7m->|Up@$s>+va_(WGXWY*P9C<-M(#|uP85Izc+y`sUYj|YI9l2}KPUeE z9?sd){GZ1DC9vm~Uy%XbNl68ttNbc<=FZRAgD*@i-&o2R*)Xv)b1}0Dvixf!Fc{0T z$A25`zwiJE{~yu(ivxen?CG{efaGcFq6QXvixJ_ zfyzJD&de5AFvsVW`IVyp{7eoG`~d_3{6RoNLI4B<1q%rc3kwei3xfa)kBo!>503~B z3yXk?h=_y&5F7$38VWKR5;8LKuN(zPNJuD1C^#r6I23qTcocjLI5-S^fRLUq{{#A! zqX1qG5&hrfD8K*-3b1ex@IWs4bB=-(D)8GqBoy##J~$jW6gV`H(eRw30EGq(^PHui z1dBm#gvsszBq_jQQHUtle3?8m-oU2ha6HHH!=>UBjm=eoe{Evw1ehWOeqR5TIPg0c z0=Pmzf&qz+Kt2S}`T|HAc+Q3Z(jg$B!63kayl5b`7!4Ag42ta)2DuXSuVF-DY9?W@ zD3o))Y;YK#QJ!;(syO<^=KlPbU+-US^n;#q^JPdI%&167%Jsx#;&bQ)s3%FjTygJD z4cOFJI~oRR8uCyXjenlp=5H)ws_}x0E3NB{feYC6nO>C#;KjbeULUXBG*z^ zVIkHogL;4Rb=%4b*)9)Wx^U@-DkYvx zruYPC@kqw_=-6uB>Hv;}5sa>XZjf{0|XimVVD z8P&OW=>wh|hNl*kl{dwL&xI4KvPSZ>RJNi@qpat5H5VZ3J^YiAl(y$kKf`R{E^cNC z7#NG)XnKyZ7_wk^&z~bMEo&3Fjc5_^i<|9YQ+i>|3?=5~e>L)2L$4iIU3Y!&wr2m* z9ioKlAbm5#Iia}$UDdN^4{W1@J$GsbuJ!{OO|GHDK^3KkdC&6sPY|T`5k}l_tPwLE z^xQ%+EiZbfw}?DsS!s-dc-&6F2MEE_u}db>Mm*0Gw0w|z@R0|*{V|Ow?X`~kc)Akn zu}JymsuE?HKg8QlHs@r6CQUttsmZP-oJE96%5$zXUOizkVy;HQ0bkwiyPY8vUAPIv z7KRBE^+{DEMaAb*<8gKz`6-?)vC* zwGA>cUiw?fvxN0SbXJJ1n49P**5cfCB}{y3r;zhDxbZYd?l0ujjhI`QN|#SEYfR6o z0tWFQ^DE+MY)istdh#4csF1QLk-PY-CzKnA^2W4EYsQ=~-%y@|>a$R;TA(G4rkEDl zxMGGqeS}0s=@xGM9KTAxy4ig}wWvGo*KMI!;k5GQge_M-Vi{W+6&=P1-O@^|cYFgS z*7+=;$foC|j1&%&5vKOAbRV6zu~rNDvKZ32Q<9uN?JqO7t z4(w0H_29YEP1~JHrQvl$GYtu+YZP(p7+iSY4K7B*s*qzN@q7{-j%2;0OSBcqqq;0| zf!tTwr3T8C(^I54FyZS!n+#zc-;!OzIMSl!TjL+>@aqFQ?+>@i?X{6c`zDz^!y4n6 z)4a6NE0cv!*O&y@i3>wFF)T=rxc6;q=ygB9x3@}Qm&o{ZqK2m}Xi7jZB1X`~*7Wbd zO;R^75@^0-GhzL#Fs7y>6K?s6(jX*OVLN~LEn|Uy357!;4R3&=0|Q4ax7avQE(Zr? zksgq#bHpbu* z2BuYHOMbbkHocXQVbf2+nm+kdmUM*9;SjoA<C0ai6WZa<09&>}x!4z``m6K{^`A>c?s$siZ_LRHUq4gA- z&XULH_K)V~xC!whUBo^qSo3+M*Fr17iS9RJ?;<0b*T*hH^2asa_eZXPZP_-F2XN<# zz}!XXdc$q0ziV5!d|@1V`_bZZeA-2g#C}A0(%d0*AKi;5IT3mc;fm+u619+?ts!K2 zw5;ixt_gf5yNWGsIhBMzK38G|&#M>|*#y%yVk(8LEfXtaYq^n(?X5gO0 zr)Q-^3H7liOfB?5bZ82nPIORGvWZQv1|=NZY=sQ@@a6s*v}Puz^p;Rzxo__XMUuo8 zY-YdXp5Zr|hAmvHcZ@VdvpZxuQPMe|gEw8@D)>E){RH)byVT#HKc%s*%XJjaA&D6V z9xuVg??7ckIpNv)J;+J2Q6^#E#0^5z#FJq5W6i$~WD_^)!p=v^dk+X?I)<-+t)o|e(pZ;pz?(ue6yqM5c_)` zCGh*#D#*$&n2_3X9NL4|V5cJEBQe@G%6T@9LUtF{sNf8{-|*JL6BXWK0TlP-GT#FZv&I z*LRs1Rg-uR;ivEWz8XA;iT5a5AyKWWE6Y`8s*D>PW4!SWEtoz+PWC^@uS#I9=dNPI zUdj8gbcRwsx$>h3X{f@w7@72=YFTLp_a?SXB!e;X{P7QiQ`FXgNteq`sTXn9#|SOw zyPo`5NgXB(;@0e&bcT`iuk=1TU{&n-F@gjf+*>?CC1hu*#-+pk9hoqfa{U6M-JzGe z5`_<-@#zyYwIo}>DAq7#XE29bmEXqoMuEL98`11Q z{gRmc3geE3crLaezP>*Ez0G_RTRAbwz68pkG=Gqv+@SVM+8o73Q9xAx2H@lG(;SM2b?Xb;Y{Ny zD@w9cYSxLPgEedYMivGsT6iA>MMmU&yHw%Eye|MBzH&*D!_Q+HC6Ru*3$Eg5W;)+=P5?sNYT}`IxfZ+CRA@U;nwFMMo8t z(03ulYje8GOVhlBhxs8oA=TzJt>xBF5L=}CIHc@`#~x}v5!h?}$$g4`WWE$TPRk37 zIOfqId8q=~wu=Tx`W=3-_G)rss1WYDz|UGct!<{Wt7)R zyxA4~y0`U2t!%bZ&ptm2ZkDwy8`Z#hhW^d7BVXp3S*!QAvjJ3n4$ z9${9=iYEI$u8YacY6d<+^z4~z72m# z6dm47MNI0hj>V2vtsspx8F4|k?0FF>keMb?jxsTsQd;hTnX;>@>IbeWL6ptx+PoFQ zdQbSKeq!mXALb0}MtyOM__8>Wd&k+@4VcOpwqQHu)vnNjialoeDpqcC@7J2=$&G5?2}!{mjxk!*@cJLEu$MNec{!MLbtHYZ?>>UV zIVG!3Lk&ryQa31oGtWUELq`mSsv#UVu@>B=D*Kn-+j;emI$E-SBPHpBYM^hK5s_cb z_HvUpVHXwBn|T`IZaH%IiG!o^eCt$jZ(S94x!_*tIcE z7D)JzGi+NQ(c@JP&;=FvxDXNef|eLd0&6$D!u9Fjy*2jCfJ2a!4k0}?A+D&)>PC#T zlB__aV$OGjA!kPs@Mfc`7rG~E0%?=gBNX}!cK!%huoCcAczL{wr2j5oQ8k;(-sqr3 zBE4+-dR3acy<$Ww-7ZefsI@fYZQ<%hH?oluAH7nZRtNUOhLCMd{SPzr${pEUPC?{r zefQe>w6!_EVSOB$veA!pd0x)YOpH<5jiXu&!eH9XkzHqj8?`zF$~rE)Q*y0^L=)B> znBrg8v~cS{G>L6e>w9Purb+B6T>S9}3pDxa(iL#dMd~wM@ahScbc&lVCpX`G!D6p^ z#Z)NA8cm!Hg_v^&~&)CG6RbX?Z#^+YBJxJJRdxG-N$1L z{*8;0?Z`?pafBRtpH(S>HKOx&F3uLVT>{->_&Ts2V&nx-*?4Z|q7pZn4qKvCp^~)S z2uOb}RQ~N|kE9HLJR<^f5c?sUL)+H$;YB4#L$X0y|I0ZU4ij^FBG01{EAYRhy?3O+ zEGbjP^AspN^o-@tk;C#^}mP|r-BXOqTgsd2-i^u z7Ry33xtH@!_rm+BChGFg_?%i0rk9t@sN9P+SAIW4%cewfMhg2we^3X~G;l|2Y+B$K37Xp_mNOHt zbM>_xc1&-2kT^wNMBxiBOm&fC7^ZYY8nHVKu0j|Y7-Db2U2xd*3MO!1tky}winzNviu&5%={8(9m>HVE$x;MV%a1s7D z>6FVVhfuyo7ze7waNrY(^2uP3C~c_4_2k!~*l3>C);i!4`}`{VK}Mn$De&5qJ113A z_0lEruZP&N93Z^M`(op*2s#=iol&HvHhHWj!;+lbg0*iVM`@eFy_Zrt>$Uu8+Zm?Z zXbc7V6TEkGX6x?RGBYw=78_A3Xq7{SJYiQEpYq3dU9{eLh3mFI=|{unnI2^jC15oY z+`pnXQn3?y@X785-6o&%M3a=|hcMb4@rBu>C7bc;=SK%D#5f9Vd0ZNWy(5YC(14Mo zgzaWLDXYTR;+b1woKTB~w6ZL>CiM1*)Uc!hhd;ZwO4VO~H54BFjuIThxA;RLVXO*E z(T&^paESmj^ew5W$j${clsaR!W;~pf&ZR~8$@b>@*Slw0Psl#G8`Iy!ZD1xHjihUj zRfekN=Npc}c)->S4CA>*sBMLDXqJ#t z4+Dwl+YSk48e=G?Y!8!HdZau41a*7Gg;-E!RP<)2g|m~Z2g@n17(ziV9OGy}s8U+g z4$5^!wvdzmc#_@Rp(X1KYHD9kw5C&fFL6l7JyW)3MEz!a%G^B5rSXFj^&Bd0cM2UB zmm>THrgKJQ6+sM7Y*2m`Q=&|$U~y4$icu9}uBH_uh+kJ+tz8TT-k7CC_ukxnXXe;| zWq)5rN?S*AJ>>lxTaP)KedOVsTx=B^seSySuv)VgDGu}FCQ>n?5#0=%JuKJGoA-r9 z9;ZE7z3C<#s0{Ap1renP?@XD@q}%iAn}YY$S0Cc~E#~lKtD*~vgHc%)kc~zUn1t&0 zML}Onf`5W=7rLTI36$9HA~&vk+dk}IbXauoQANwDgv;{}aPMv+sHUnQ3C7~deU5g_ zox?Av<*a9cJ>XJ*Sudhu$HzJts9Ch`scFA}8N~$gV3#%B04k)y)P8I8j+{ZSCu&v^ zT^Tj1Q@HY-luT=ERykEoIiKAQg_2?Q`Ad4-MC057y1n=Yl1){YyaD>cZ`D*nxq_+6 zs~&WqGB2^I!Ikjz3aLVK}FlE%2oY%w0aSVzNU^ttgPIA-s0+HvJB^VZi`uf_8e}O~gDy#IFI((B@%%Qlo50 zO-m#?=i4{v{v~eCRQOVYay&b5ABFv&pxmDzgz(nb6O*Nmk8|p6EV0gTmWCt4EbTem z%HfT3?-G~K{ciAcmCj5fdK&nXSDKyuHiyE(100;@A2*Ct-nOYCM~i>oM;k1;ZeY*N z=-ex}EDa!DqnWUr*gt&vZLTb80XLjs;e~(5HN905v-*LsgNYKo&>&45)+Ls^NtYc; zhztjv@@(N~u@=NBOpc(w13mWFeD4`*xFRMgjSBLuV@TxHx}JAsOvUfZ9nLwv@;E*z z(AdXuu$Q`gCrqK0bO1r-`P`lMebp>BA(Bf8WGal#4_NU-p7eQ;YJ4K^G$X?gmj^F< zC(iLsj(I51QVL#?PQaP9y@ipca7xQW6)#F5g*$b`t;)!BqYALiD`+=>G}wRsS_9W>*>3#L41A3uPjeO086TSk(PZxLh(X zNGTujs?3VL@JmlLa@@F3Zl%23w;4v^&vS>@?-!5vdajma+D(VjLj?Pj_4V*}tY!;p zC7VdrIG(BwQq=DaiX_`TB2{z~;7#Md$%I_F?9#3r*d8RpQf4#-=xz@mc#GFJ+Okxi zj$of1Q#DywdsH`?o6V>S+>sxV>>J@~-!NIsaij2WR*D5rhNjo2?M`2akB8L_GgX#n%Z^&Mos# z_(l~`^;qE9ZUkE=yxQoF=f_1FLB}Dh?^;BunAnkfd$WGC(R_rzORL< zGWxQ_x2`L}rQ^+gtKNWM)t(#C&r8&i?;7inc)BeUnRe^Ml-z>9D()toZc~AjS+e~Y zbspFp%xk{AOHJow1J}S^8}Q$^00X||gVTngM2o`_|~G9~S~rD&Ee;E>JAk@5nfq7&mMfJvF4RP zU!a0Kchb_rIx*Pey~4|?JC-Wv^VU&5vs-=N{L98wq~6jUo+cx7d>0|*Qn{(u7WLo# z9>l1~AG#e!<;Y^(AnOM0v)xE-VOr3%YpB6IqY7XM=qPf~klv6`?0P)vf7Hk}Ol?hV z6!Hh>c-ThIT#Kjf>R*FT*0V^KNX+I!TZ5KGp~TFz`8<(6uOVm81QQkgiOwR9&ViBe zm}R(n+TIZeuL`nrq1``!6Tu};S&JGAb2G_KUF`0`#4-m$TNRzMk( z9?Ky^KJIb<2^#j61I}h+YHC<2Fi}OK*Pd_Am^L?)#F7%*HkE~mV~e$pVb_~1TI@fb z91B&fuZRr)Fp4h*DMurkcYM^kwJdKdDbRMNt7WLLWshjEm5EmoK>uj0lFl#(K8Yl=i<8#Q13IIkwMany@-#6x@D!zHo9)& z#?%o!kqn;}kHek&TvQmF5UeU4*g;D^wlk8-g%T`n(^+rY-a8ly!^}!bfjCI!2usCH zs)=jWTLs3LzYl+U3>B71!ujEzQ%^`3mA7=l+`1CG+l)>_k<5&j&D(H&$TCDLCCf+B ztia*~hK<-7T4AJkNl&9m37;;gR;-^;K3|u(ahH*pV1V=+l&rsP7orQ4yHbkr2rsy4 zpa8vRMof?j4|HnOEXdgll0I>|i2TB24L2z=tLGEyT)= z9SvPC8NUaY=OlCu+lWD^RXE_s`0Y)~#~?*xt~SBsn?{k0spqQ-772G?vl+5}4Waxz z_%?$Dtl=Z;tdM*K3AO`4;cQV`ON+mLqOnx39v$`}UR5d=9KWC5tTjP*6xS$S=yvl~ z)SXT57Qd5$U@yDbj7Mh_QUv-~j(*V!V!<2%0V~WVehlr_N4kQ1Tlam;7fF#w$oY+O z$7>Hg_uL#GxOmhRPbrVxOR9{6cK4)|2ru}Bg{Wry2u)=)G)mTVV9u4(JX-3RJ8gZo zCO&>!86DIWlQM$Sb_oX;+8UgdArz2JQnWc`qx78?=q)^B+pP3ryc7zcvNG112UC_> z!2O&h>8x;2L@&^1Aa4!+Wz#p$9PZ*x39S0iOePZ+OrN=gO3jm=s_EAx(a5%;pxDgD zj~(!z$u#>l)#YTA<@1rgv}p>iXV`inyvT@$NA$8{(Xm3VlTL%kCihJpWne3H7q2WV z1drwN?qinMe?z}F^R=>b+1OYoN|2x0(ME>xEpp!klN*h>Md&>9Qk<04yP z{#OThWs73rQ`bz$v?mfY`63UZyV#*xrc_?>8My>83%13(#5M@>c{U%>zNfi^%^yT? zAJ2W3TmQOqe+(--#V_0d?mc8}5SP|lNsFY-(}q&yXoMj~@k+6MY|@u@@!j%Uu)JAF zZGGiR2RdafO6RLf0+(;rRUuqCugA2p#kkd(M?;7zpc!Ar0{1Oq1)6$&arR#4`~%gN z6I-&Sj8`%o;Kz>@Jp_;Rs#&3SR*q&4`KBy=n*R>~azKs0`97O=f;5+gwiXgsE|O3B zV&q`@BV{10Ss-%-pMhyDk1Yf1X!3ggtnS4t?K7^_l1owq_hb!U7ln@6uXHaY9Cv}4k^Mc*CdpZfUi&16id8y4flz3y^@i)P2z!0X9<-V z(c!(Cyu#MwAn(+34EX`!%2y57!=6A&Nx#Y?PjOWVs+cO$34yzewTHr%kOj9U4%R-* z2vBf1gvOB7CP56gG^HZZ9(JLvN*CT6+^r^dTq!2xh-fc_ZchIISXR2oIWnU;pS2l{ zC^k1S5}m4fZRrN;;0XA{HIXWUZ@=z{fhM%Xy2{*GzdM+-*arewpAd^iVNN@!{cd2P zEilxpLsG0g;;v8ToV6t;%L3iZ1@WJW2BZ>f=sR!>UaBm&@`-g)Mg-ATv1F{eh13A= zc$ZUiGC`*8=OqMjykNd3@pkW+rrIkca6}0wGtRqMBV2=9b?MsI?YL88JSjA1%zg2E?{K~*rB%(p=1-uigAiOAu%R} zxQ3Ok_auwnHv)eUQ6-vIqL6y}VzOp7Jd~Mf#^jhQ{{UK(U?A0X;1}D;m-eW~nT|&w zmm=xAHXlfrQZNE(no_F*2N7klb$Cf3OHwR)+(l)qW;dBSP?7?>-}8s`{YO!#>?MPM zVP_A}QsaOfh4+g+g7V#}pdYihyj1+W#EP4l1|*y|yl*KbB#@L95H~8?3#hi_ zT$s-MFWygR*)J%P6hd#^5$zCs zUsRN$$}A-bO@vGGw>~L3l}l8l+S1hJtzve+v5IZteom`|l=JNBazR(R$L_$in!jDP zvBB~T7Ne%yTJNmxU!RE?t70cHg-ue@$<}pPp3s7|kt&#{u3^!r>A568qbD;$ohv$` z>&e!YZVIBxW*3PH1uF}zDrvH<2Vi-ROqL}`3ZLE}DP`~8W%g&`_ULst0&SoeuXEGZ zaEty?ILw^hmc&&jOKt)+9q$$DYZD>ak^$J5d2ig967|$r^9>YAnnQpSx$6dMT`^Pb zgKdudMJblW{{RnDXsG_o9mHPDzM5jOPie-UNfz7{K(KSqnW;vUS;TIt&=(}$u0%uI z{{WeH%R+Umn^-|>9#&&Q-sA%`wKrsil2R@$+7-&q35EzHfw>~zltslzzO<0pN^fFq5*Zf| z+o0*#>|?Se8E`r8BD3{G~qw6;P~nx9jvK^*Byg@KD1J0eT>NFWc& z@Pe?~<>bj&ve0go2(X8%Q0c-pGu{lTalCErahgs@yZjCKEh3jeON&rduR4h*4c%0@ka7f+U$a8^gJ-W1@ zjlH5tDu&jXZA4jH59T+dw*n$asf3jyUZP|xUnh^4ewO9dt`VI#?Ln5k3VsNIGarYI9Uj;xCEP$ZPpv7>5`S%H8(KI7W1wo4QJ&| zh$s1e9`VIN7?Y*A>0F$9PjNDrI?}0m7F+pJwVzGy2ihye8w$Bzn?p^fa(-)YBJAfb zRn)7q+N32``%IIpAZpMr))C-bD%KdLI37SttNFr{xVLCUsv)v_P1080LCmgC<-=@K z*RqSCk`-=%!>ta8nk4g2IzA}dQPiE1An5#~a}Kzq1EFA99TacP;$oaUicJwO%xO#R zsHL=N2TB3lkE#Aq01q)|P!0raz_W80nzEqSW>q0W%Uj9~+yU>mAKERQ3YNKCDZ}DZ+)NgxbX^0II?YCci6AVQw*XrDn(iJxn0Tx~lOuE0(7-FLf1PSr@Pnr#gf63PbNSmA3A^ z!)IccA9!@1ou=kBILS9#aKR@os@~T9FatpBwwmo=B$KF z*lvQJ0*@e#j~3qW$2m%Eh8y!wm!&%>5)3J)*3n6MF0w&bwbY}1R_h!_IUE_E)p|aU ztm)31T7i`QQ{{f(_?a(`aMaEetG_P$DrM9tg(X775diAc(zKf!h})kKm^xQJa6HXU zS%$yjIWz?=Y>g&qus68svCaC6-sUlKxlCIQxZ1{*Uc?axO{8ugxcHx&{-XMOQS|1k z@b`O>xvtOm5AX8^X`WJEItiM|}h)3|NzacIQ)@5jHtZCZY8%B6$hl!ayBQ&sG01gjm(R{&@m90rH zO|E$sjG)h)f@2c8>XM5S&~=MFbXm(2CDj;4x^Iq2H=Od-GE>kHc7hC_iiK3P7F=4E zepM%f8PPl8vTBVmN=C7M&{o2DA=*L_bQF*}!gtrFLF_q{D_H!dY7Sp#{QXTy4sYt% zg&pGUU_5H>FF)SvY86SYV= znsbb^B_f!xyC~a`V<)rU6bY%9-3}D&Z@);3<3ACLWH_HZn|s9;%$(qyuB~ZjTcrO0 z2)+LR2y3JC{b(Rr$b_eJaU;0v9=-94N?f?V0Ko1~6sgyNQ9PK5Ju6bGOf7D(>P7mb z!ih?HnR>+}A9(k5P%2yz%-7SP5amRvw*0cxr3J5z_lpUY*lg6NS(66g~d{O!9k0+R3a_EhOSlT}GS#02BiE^v*m(+~GzKY3K{VKZ)0}*(}M=I4mX0xt1zz)Q!3uLk=#@sk%!lLMBzB+W@Gd>YkCB z&mR*#Nv!1$9}`t7czv3S>PT!4v^F=CEYFZUtA!hUuy�#XUTgTHu}H%VGQgfE!ki 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 l5dh-b}m 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 Date: Sun, 26 Aug 2012 20:06:53 +0200 Subject: [PATCH 061/106] ownCloud: Test on null pointer before access for md5 sum. --- modules/csync_owncloud.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 30ebe502ad..775703dcdf 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -716,7 +716,9 @@ static csync_vio_file_stat_t *resourceToFileStat( struct resource *res ) lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; lfs->size = res->size; lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; - lfs->md5 = c_strdup(res->md5); + if( res->md5 ) { + lfs->md5 = c_strdup(res->md5); + } lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; return lfs; } @@ -825,8 +827,11 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->fields = _fs.fields; buf->type = _fs.type; buf->mtime = _fs.mtime; - buf->md5 = c_strdup( _fs.md5 ); - DEBUG_WEBDAV("stat results from fs cache - md5: %s", _fs.md5); + buf->md5 = NULL; + if( _fs.md5 ) { + buf->md5 = c_strdup( _fs.md5 ); + } + DEBUG_WEBDAV("stat results from fs cache - md5: %s", _fs.md5 ? _fs.md5 : "NULL"); buf->size = _fs.size; buf->mode = _stat_perms( _fs.type ); } else if( _statCache.uri && c_streq( _statCache.uri, uri )) { @@ -914,8 +919,10 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->mtime = lfs->mtime; buf->size = lfs->size; buf->mode = _stat_perms( lfs->type ); - - buf->md5 = c_strdup( lfs->md5 ); + buf->md5 = NULL; + if( lfs->md5 ) { + buf->md5 = c_strdup( lfs->md5 ); + } csync_vio_file_stat_destroy( lfs ); } @@ -924,7 +931,7 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { } } DEBUG_WEBDAV("STAT result: %s, md5: %s", buf->name ? buf->name:"NULL", - buf->md5 ); + buf->md5 ? buf->md5 : "NULL" ); return 0; } @@ -1606,7 +1613,9 @@ static csync_vio_file_stat_t *owncloud_readdir(csync_vio_method_handle_t *dhandl _fs.fields = lfs->fields; _fs.type = lfs->type; _fs.size = lfs->size; - _fs.md5 = c_strdup(lfs->md5); + if( lfs->md5 ) { + _fs.md5 = c_strdup(lfs->md5); + } } /* DEBUG_WEBDAV("LFS fields: %s: %d", lfs->name, lfs->type ); */ From 3b369c8b0332e02037d1c0aae358625ab1554828 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Sun, 26 Aug 2012 20:07:36 +0200 Subject: [PATCH 062/106] More robust query result access if columns are missing. --- src/csync_statedb.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/csync_statedb.c b/src/csync_statedb.c index df0a61840c..a5cb3f5f92 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -396,9 +396,8 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx, uint64_t phash) { return NULL; } - if (result->count <= 6) { - c_strlist_destroy(result); - return NULL; + if (result->count < 10) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Amount of result columns wrong, db version mismatch!"); } /* phash, pathlen, path, inode, uid, gid, mode, modtime */ len = strlen(result->vector[2]); @@ -428,9 +427,14 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx, uint64_t phash) { st->gid = atoi(result->vector[5]); st->mode = atoi(result->vector[6]); st->modtime = strtoul(result->vector[7], NULL, 10); - st->type = atoi(result->vector[8]); - if( result->vector[9]) - st->md5 = c_strdup( result->vector[9] ); + + if(result->count > 8 && result->vector[8]) { + st->type = atoi(result->vector[8]); + } + + if(result->count > 9 && result->vector[9]) { + st->md5 = c_strdup( result->vector[9] ); + } c_strlist_destroy(result); return st; From b6edf82d4e96c28c020c8bbbd1be01726579aaf8 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Sun, 26 Aug 2012 20:08:28 +0200 Subject: [PATCH 063/106] Fixed license of tests, added dir check test. --- tests/ownCloud/mocka/md5_test.c | 31 +++++++++++++++++++++---------- tests/ownCloud/mocka/ocmod_test.c | 20 +++++++++----------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/tests/ownCloud/mocka/md5_test.c b/tests/ownCloud/mocka/md5_test.c index 1975b1576c..ae67525afd 100644 --- a/tests/ownCloud/mocka/md5_test.c +++ b/tests/ownCloud/mocka/md5_test.c @@ -1,17 +1,16 @@ /* - * Copyright 2008 Google Inc. + * Copyright 2012 Klaas Freitag * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program 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 2 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program 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. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ @@ -31,6 +30,17 @@ #include "config_test.h" +static void test_testdir_exists(void **state) { + csync_stat_t sb; + const _TCHAR *wuri = c_multibyte( TESTFILES_DIR ); + + (void) state; + assert_int_equal( _tstat(wuri, &sb), 0 ); + assert_true( S_ISDIR(sb.st_mode)); + + c_free_multibyte(wuri); +} + static void test_md5_buffer(void **state) { const char *t1 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."; const char *t2 = "This is a nice md5 test"; @@ -60,6 +70,7 @@ static void test_md5_files(void **state) { int main(void) { const UnitTest tests[] = { + unit_test(test_testdir_exists), unit_test(test_md5_buffer), unit_test(test_md5_files) }; diff --git a/tests/ownCloud/mocka/ocmod_test.c b/tests/ownCloud/mocka/ocmod_test.c index 843f5248ed..015de92268 100644 --- a/tests/ownCloud/mocka/ocmod_test.c +++ b/tests/ownCloud/mocka/ocmod_test.c @@ -1,17 +1,15 @@ /* - * Copyright 2008 Google Inc. + * Copyright 2012 Klaas Freitag * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * * This program 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 2 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * This program 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. */ From bba13967701e547a9a36c9ae11313497571f782e Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 28 Aug 2012 14:06:55 +0300 Subject: [PATCH 064/106] ownCloud: Use correct path to push into owncloud_stat. --- modules/csync_owncloud.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 775703dcdf..727577720e 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -1092,7 +1092,7 @@ static const char* owncloud_file_id( const char *path ) */ if( ! header ) { csync_vio_file_stat_t statBuf; - if( owncloud_stat( uri, &statBuf ) == 0 ) { + if( owncloud_stat( path, &statBuf ) == 0 ) { header = statBuf.md5; SAFE_FREE(statBuf.name); } From 78c43e542c7b350fe12161f9911ff806806c7e6c Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 28 Aug 2012 14:09:29 +0300 Subject: [PATCH 065/106] Handle zero result list correctly. --- src/csync_dbtree.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/csync_dbtree.c b/src/csync_dbtree.c index 47a2f0ba7b..30a30faa3a 100644 --- a/src/csync_dbtree.c +++ b/src/csync_dbtree.c @@ -82,6 +82,11 @@ csync_vio_method_handle_t *csync_dbtree_opendir(CSYNC *ctx, const char *name) CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "SQL: %s", stmt); list = csync_statedb_query( ctx, stmt ); + + if( ! list ) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Query result list is NULL!"); + return NULL; + } /* list count must be a multiple of col_count */ if( list->count % col_count != 0 ) { CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Wrong size of query result list"); From c491e8bb680110d0c06d15cf86ef8a9ea48e34e7 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 28 Aug 2012 14:09:54 +0300 Subject: [PATCH 066/106] Check for valid result count after query. --- src/csync_statedb.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/csync_statedb.c b/src/csync_statedb.c index a5cb3f5f92..4a2d209d52 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -399,15 +399,16 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx, uint64_t phash) { if (result->count < 10) { CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Amount of result columns wrong, db version mismatch!"); } - /* phash, pathlen, path, inode, uid, gid, mode, modtime */ - len = strlen(result->vector[2]); - st = c_malloc(sizeof(csync_file_stat_t) + len + 1); - if (st == NULL) { - c_strlist_destroy(result); - return NULL; - } + if(result->count > 7) { + /* phash, pathlen, path, inode, uid, gid, mode, modtime */ + len = strlen(result->vector[2]); + st = c_malloc(sizeof(csync_file_stat_t) + len + 1); + if (st == NULL) { + c_strlist_destroy(result); + return NULL; + } - /* + /* * FIXME: * We use an INTEGER(8) which is signed to the phash in the sqlite3 db, * but the phash is an uint64_t. So for some values we get a string like @@ -417,16 +418,20 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx, uint64_t phash) { * st->phash = strtoull(result->vector[0], NULL, 10); */ - /* The query suceeded so use the phash we pass to the function. */ - st->phash = phash; + /* The query suceeded so use the phash we pass to the function. */ + st->phash = phash; - st->pathlen = atoi(result->vector[1]); - memcpy(st->path, (len ? result->vector[2] : ""), len + 1); - st->inode = atoi(result->vector[3]); - st->uid = atoi(result->vector[4]); - st->gid = atoi(result->vector[5]); - st->mode = atoi(result->vector[6]); - st->modtime = strtoul(result->vector[7], NULL, 10); + st->pathlen = atoi(result->vector[1]); + memcpy(st->path, (len ? result->vector[2] : ""), len + 1); + st->inode = atoi(result->vector[3]); + st->uid = atoi(result->vector[4]); + st->gid = atoi(result->vector[5]); + st->mode = atoi(result->vector[6]); + st->modtime = strtoul(result->vector[7], NULL, 10); + } else { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "No result record found for phash = %llu", + (long long unsigned int) phash); + } if(result->count > 8 && result->vector[8]) { st->type = atoi(result->vector[8]); From 636ec65c60fa628b28aa90c40af6b5df914cf695 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 28 Aug 2012 14:24:42 +0300 Subject: [PATCH 067/106] ownCloud: removed unused statcache code. --- modules/csync_owncloud.c | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 727577720e..957d712901 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -150,11 +150,6 @@ static const ne_propname ls_props[] = { { NULL, NULL } }; -struct stat_cache_s { - char *uri; - csync_vio_file_stat_t stat; -}; - /* * local variables. */ @@ -165,9 +160,6 @@ int _connected = 0; /* flag to indicate if a connection exists csync_vio_file_stat_t _fs; csync_vio_file_stat_t _owc; -struct stat_cache_s _statCache; - - csync_auth_callback _authcb; #define PUT_BUFFER_SIZE 1024*5 @@ -834,22 +826,6 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { DEBUG_WEBDAV("stat results from fs cache - md5: %s", _fs.md5 ? _fs.md5 : "NULL"); buf->size = _fs.size; buf->mode = _stat_perms( _fs.type ); - } else if( _statCache.uri && c_streq( _statCache.uri, uri )) { - DEBUG_WEBDAV("stat results from stat cache"); - DEBUG_WEBDAV("Found file stat info in statcache!"); - buf->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE; - buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; - buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; - // buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; - // buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_PERMISSIONS; - buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; - - buf->type = _statCache.stat.type; - buf->size = _statCache.stat.size; - buf->md5 = c_strdup( _statCache.stat.md5 ); - - // buf->mode = _stat_perms( _statCache.type ); - } else { DEBUG_WEBDAV("stat results fetched."); /* fetch data via a propfind call. */ @@ -1464,13 +1440,6 @@ static int owncloud_close(csync_vio_method_handle_t *fhandle) { /* Remove the local file. */ unlink( writeCtx->tmpFileName ); - /* cache the stat info about the recently written or read file */ - // FIXME: Free the strings - _statCache.stat.size = writeCtx->bytes_written; - _statCache.stat.md5 = writeCtx->md5; - _statCache.stat.name = c_basename( writeCtx->clean_uri ); - _statCache.stat.type = CSYNC_VIO_FILE_TYPE_REGULAR; - /* free mem. Note that the request mem is freed by the ne_request_destroy call */ SAFE_FREE( writeCtx->tmpFileName ); SAFE_FREE( writeCtx ); From 3e95056975cd60259b71fa78920bc805ec6d5842 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 28 Aug 2012 15:59:33 +0300 Subject: [PATCH 068/106] ownCloud: Use stat cache more structured. --- modules/csync_owncloud.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 957d712901..3f356c2c8b 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -775,6 +775,22 @@ static void free_fetchCtx( struct listdir_context *ctx ) SAFE_FREE(ctx); } +static void fill_stat_cache( csync_vio_file_stat_t *lfs ) { + + if( _fs.name ) SAFE_FREE(_fs.name); + if( _fs.md5 ) SAFE_FREE(_fs.md5 ); + + if( !lfs) return; + + _fs.name = c_strdup(lfs->name); + _fs.mtime = lfs->mtime; + _fs.fields = lfs->fields; + _fs.type = lfs->type; + _fs.size = lfs->size; + if( lfs->md5 ) { + _fs.md5 = c_strdup(lfs->md5); + } +} /* * file functions @@ -819,13 +835,13 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->fields = _fs.fields; buf->type = _fs.type; buf->mtime = _fs.mtime; + buf->size = _fs.size; + buf->mode = _stat_perms( _fs.type ); buf->md5 = NULL; if( _fs.md5 ) { buf->md5 = c_strdup( _fs.md5 ); } DEBUG_WEBDAV("stat results from fs cache - md5: %s", _fs.md5 ? _fs.md5 : "NULL"); - buf->size = _fs.size; - buf->mode = _stat_perms( _fs.type ); } else { DEBUG_WEBDAV("stat results fetched."); /* fetch data via a propfind call. */ @@ -900,6 +916,10 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->md5 = c_strdup( lfs->md5 ); } + /* put the stat information to cache for subsequent calls */ + fill_stat_cache( lfs ); + + /* fill the static stat buf as input for the stat function */ csync_vio_file_stat_destroy( lfs ); } @@ -1577,14 +1597,7 @@ static csync_vio_file_stat_t *owncloud_readdir(csync_vio_method_handle_t *dhandl fetchCtx->currResource = fetchCtx->currResource->next; /* fill the static stat buf as input for the stat function */ - _fs.name = lfs->name; - _fs.mtime = lfs->mtime; - _fs.fields = lfs->fields; - _fs.type = lfs->type; - _fs.size = lfs->size; - if( lfs->md5 ) { - _fs.md5 = c_strdup(lfs->md5); - } + fill_stat_cache(lfs); } /* DEBUG_WEBDAV("LFS fields: %s: %d", lfs->name, lfs->type ); */ @@ -1844,6 +1857,9 @@ void vio_module_shutdown(csync_vio_method_t *method) { SAFE_FREE( dav_session.proxy_user ); SAFE_FREE( dav_session.proxy_pwd ); + /* free stat memory */ + fill_stat_cache(NULL); + if( dav_session.ctx ) ne_session_destroy( dav_session.ctx ); /* DEBUG_WEBDAV( "********** vio_module_shutdown" ); */ From 47503805654dd260d50a41f0f425f664633eefd1 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 28 Aug 2012 17:52:28 +0300 Subject: [PATCH 069/106] Fix flag setting detection of the fields. --- src/vio/csync_vio_file_stat.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vio/csync_vio_file_stat.c b/src/vio/csync_vio_file_stat.c index 6ba0aa187b..118b5c5ff9 100644 --- a/src/vio/csync_vio_file_stat.c +++ b/src/vio/csync_vio_file_stat.c @@ -40,13 +40,13 @@ void csync_vio_file_stat_destroy(csync_vio_file_stat_t *file_stat) { return; } - if (file_stat->fields == CSYNC_VIO_FILE_STAT_FIELDS_SYMLINK_NAME) { + if (file_stat->fields & CSYNC_VIO_FILE_STAT_FIELDS_SYMLINK_NAME) { SAFE_FREE(file_stat->u.symlink_name); } - if (file_stat->fields == CSYNC_VIO_FILE_STAT_FIELDS_CHECKSUM) { + if (file_stat->fields & CSYNC_VIO_FILE_STAT_FIELDS_CHECKSUM) { SAFE_FREE(file_stat->u.checksum); } - if (file_stat->fields == CSYNC_VIO_FILE_STAT_FIELDS_MD5) { + if (file_stat->fields & CSYNC_VIO_FILE_STAT_FIELDS_MD5) { SAFE_FREE(file_stat->md5); } SAFE_FREE(file_stat->name); From 3950b18dc7f95ad9a86e5c4103154880264c6f95 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 28 Aug 2012 17:53:26 +0300 Subject: [PATCH 070/106] Fix memory leaks in new id sync code. --- modules/csync_owncloud.c | 22 +++++++++++++++------- src/csync.c | 1 + src/csync_dbtree.c | 22 +++++++++------------- src/csync_update.c | 6 ++++++ 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 3f356c2c8b..1cca2d71e7 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -830,7 +830,6 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_PERMISSIONS; - buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; buf->fields = _fs.fields; buf->type = _fs.type; @@ -840,6 +839,7 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { buf->md5 = NULL; if( _fs.md5 ) { buf->md5 = c_strdup( _fs.md5 ); + buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; } DEBUG_WEBDAV("stat results from fs cache - md5: %s", _fs.md5 ? _fs.md5 : "NULL"); } else { @@ -1074,6 +1074,7 @@ static const char* owncloud_file_id( const char *path ) const char *header = NULL; char *uri = _cleanPath(path); char *buf = NULL; + const char *cbuf = NULL; /* Perform an HEAD request to the resource. HEAD delivers the * ETag header back. */ @@ -1087,11 +1088,16 @@ static const char* owncloud_file_id( const char *path ) * into a PROPFIND request. */ if( ! header ) { - csync_vio_file_stat_t statBuf; - if( owncloud_stat( path, &statBuf ) == 0 ) { - header = statBuf.md5; - SAFE_FREE(statBuf.name); + csync_vio_file_stat_t *fs = csync_vio_file_stat_new(); + if(fs == NULL) { + DEBUG_WEBDAV( "owncloud_file_id: memory fault."); + errno = ENOMEM; + return NULL; + }; + if( owncloud_stat( path, fs ) == 0 ) { + header = c_strdup(fs->md5); } + csync_vio_file_stat_destroy(fs); } /* In case the result is surrounded by "" cut them away. */ @@ -1101,15 +1107,17 @@ static const char* owncloud_file_id( const char *path ) buf = c_malloc( len ); strncpy( buf, header+1, len ); buf[len] = '\0'; + cbuf = buf; + SAFE_FREE(header); } else { - buf = c_strdup(header); + cbuf = header; } } DEBUG_WEBDAV("Get file ID for %s: %s", path, buf); ne_request_destroy(req); SAFE_FREE(uri); - return buf; + return cbuf; } static csync_vio_method_handle_t *owncloud_open(const char *durl, diff --git a/src/csync.c b/src/csync.c index 9a58fb13a4..8bb483f777 100644 --- a/src/csync.c +++ b/src/csync.c @@ -663,6 +663,7 @@ static void _tree_destructor(void *data) { csync_file_stat_t *freedata = NULL; freedata = (csync_file_stat_t *) data; + SAFE_FREE(freedata->md5); SAFE_FREE(freedata); } diff --git a/src/csync_dbtree.c b/src/csync_dbtree.c index 30a30faa3a..8ca35a40c7 100644 --- a/src/csync_dbtree.c +++ b/src/csync_dbtree.c @@ -184,6 +184,9 @@ csync_vio_method_handle_t *csync_dbtree_opendir(CSYNC *ctx, const char *name) } listing->entry = c_list_first( listing->list ); + c_strlist_destroy( list ); + SAFE_FREE(stmt); + return listing; } @@ -191,23 +194,15 @@ int csync_dbtree_closedir(CSYNC *ctx, csync_vio_method_handle_t *dhandle) { struct dir_listing *dl = NULL; int rc = 0; - - c_list_t *entry = NULL; - csync_vio_file_stat_t *fs = NULL; + (void) ctx; if( dhandle != NULL ) { dl = (struct dir_listing*) dhandle; -#if 0 - entry = c_list_first( dl->list ); - - while( entry ) { - - fs = (csync_vio_file_stat_t*) entry->data; - // csync_vio_file_stat_destroy(fs); - entry = c_list_next(dl->list); - } -#endif + c_list_free(dl->list); + SAFE_FREE(dl->dir); + SAFE_FREE(dl); } + return rc; } @@ -215,6 +210,7 @@ csync_vio_file_stat_t *csync_dbtree_readdir(CSYNC *ctx, csync_vio_method_handle_ { csync_vio_file_stat_t *fs = NULL; struct dir_listing *dl = NULL; + (void) ctx; if( dhandle != NULL ) { dl = (struct dir_listing*) dhandle; diff --git a/src/csync_update.c b/src/csync_update.c index 97d9c96d4c..9e3fefe21d 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -148,6 +148,7 @@ static int _csync_detect_update(CSYNC *ctx, const char *file, /* directory, remote and file not found in statedb */ st->instruction = CSYNC_INSTRUCTION_NEW; } + SAFE_FREE(tmp->md5); } else { st->instruction = CSYNC_INSTRUCTION_NEW; } @@ -281,6 +282,9 @@ static int _check_read_from_db(CSYNC *ctx, const char *uri) { if( c_streq(md5_local, md5_remote) ) { ctx->remote.read_from_db = 1; } + SAFE_FREE(md5_local); + SAFE_FREE(md5_remote); + csync_vio_file_stat_destroy(fs); } return rc; @@ -416,6 +420,8 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, int len = strlen( path ); uint64_t h = c_jhash64((uint8_t *) path, len, 0); fs->md5 = csync_statedb_get_uniqId( ctx, h, fs ); + fs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Uniq ID read from Database: %s -> %s", path, fs->md5 ? fs->md5 : "" ); } From ae94ce74305cefb232cd4f2c2b0f236bf1c97073 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Wed, 29 Aug 2012 13:34:21 +0300 Subject: [PATCH 071/106] Check if the file id method exists in the vio plugin. --- src/vio/csync_vio.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/vio/csync_vio.c b/src/vio/csync_vio.c index 11d69da319..167c27f729 100644 --- a/src/vio/csync_vio.c +++ b/src/vio/csync_vio.c @@ -550,9 +550,12 @@ int csync_vio_rmdir(CSYNC *ctx, const char *uri) { const char *csync_vio_file_id(CSYNC *ctx, const char *path) { - const char *re; + const char *re = NULL; /* We always use the remote method here. */ - re = ctx->module.method->get_file_id(path); + if(ctx->module.method && + VIO_METHOD_HAS_FUNC(ctx->module.method, get_file_id)) { + re = ctx->module.method->get_file_id(path); + } return re; } From 04161079518ed3b158e79dc673d76f98bfb8256d Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Wed, 29 Aug 2012 13:34:42 +0300 Subject: [PATCH 072/106] Fix testcase. --- tests/csync_tests/check_csync_treewalk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/csync_tests/check_csync_treewalk.c b/tests/csync_tests/check_csync_treewalk.c index 2facd9f58a..5f985bdfc9 100644 --- a/tests/csync_tests/check_csync_treewalk.c +++ b/tests/csync_tests/check_csync_treewalk.c @@ -100,7 +100,7 @@ START_TEST (check_csync_treewalk_local_with_filter) fail_if(file_count != 2, "Local File count filtered (EVAL) not correct: %d", file_count); file_count = 0; fail_if(csync_walk_local_tree(csync, &visitor, CSYNC_INSTRUCTION_EVAL | CSYNC_INSTRUCTION_REMOVE) < 0, "Local walk"); - fail_if(file_count != 2, "Local File count filtered (EVAL) not correct: %d", file_count); + fail_if(file_count != 2, "Local File count filtered (EVAL|REMOVE) not correct: %d", file_count); file_count = 0; fail_if(csync_walk_local_tree(csync, &visitor, CSYNC_INSTRUCTION_RENAME) < 0, "Local walk"); fail_if(file_count != 0, "Local File count filtered (RENAME) not correct"); From 52e0f06692ed8edf3f74dbca98b1e276a0d4fdd6 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Wed, 29 Aug 2012 15:26:15 +0300 Subject: [PATCH 073/106] use a more speaking name for config file. --- tests/ownCloud/mocka/ocmod_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ownCloud/mocka/ocmod_test.c b/tests/ownCloud/mocka/ocmod_test.c index 015de92268..77104ed86d 100644 --- a/tests/ownCloud/mocka/ocmod_test.c +++ b/tests/ownCloud/mocka/ocmod_test.c @@ -97,7 +97,7 @@ static void connect_test_success(void **state) { (void) state; strcpy(buf, TEST_CONFIG_DIR); - strcat(buf, "test.cfg"); + strcat(buf, "mockatest.cfg"); assert_true( load_oc_config( buf )); From 4e4fca54c2d12b00d6790b29d9bd9fa8d1567b74 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Wed, 29 Aug 2012 15:26:31 +0300 Subject: [PATCH 074/106] added test data as well as a test config template. --- tests/ownCloud/mockatest.cfg.in | 6 ++++++ tests/ownCloud/testfiles/red_is_the_rose.jpg | Bin 0 -> 152719 bytes tests/ownCloud/testfiles/test.txt | 11 +++++++++++ 3 files changed, 17 insertions(+) create mode 100644 tests/ownCloud/mockatest.cfg.in create mode 100644 tests/ownCloud/testfiles/red_is_the_rose.jpg create mode 100644 tests/ownCloud/testfiles/test.txt diff --git a/tests/ownCloud/mockatest.cfg.in b/tests/ownCloud/mockatest.cfg.in new file mode 100644 index 0000000000..8308db6abd --- /dev/null +++ b/tests/ownCloud/mockatest.cfg.in @@ -0,0 +1,6 @@ +[global] + +user = 'joe' +pwd = 'secret' +host = 'localhost/owncloud' + diff --git a/tests/ownCloud/testfiles/red_is_the_rose.jpg b/tests/ownCloud/testfiles/red_is_the_rose.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4100de3f5377e43506612e52f8843abe0f374c94 GIT binary patch literal 152719 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�#XUTgTHu}H%VGQgfE!ki zej_8LWmv`Zxh;qV%j~{lgCLd`*iMbOiuIb*!8?jikd8J#SkSydO>S0xVJIm`N=5$w z2nVy5$*fMQV@=bl_aZev8Y^<=#M{)`6#$jzF7n;Vtm|o7cI55MXif*pnOc0HSz#oE z_J&*yg;=Fc3!oopu@e>4Q)x;FWbwL$2mH~j%QtAYp5Q@qE50|v4YMTSLkR-iqNP?S z!4(1nVHO+Pq*`2Sj+~oXo71G2PxxW4DSWM9AxYR+e-R)7_?yG^X#-W50thNpK`wVi?Gh|5q)Vs;fwwT-TB)H3QNHJa+9Pziw`OK+QhDOgmr>WV zR#j!2QM6=tmqQ0)!%j*I2g~<^it{3?HBTs1@|t7~?5)gI3=xK>>W(0x3InFmZSbB? z&Q!ufiBV5$N0I|kW>k}d0=lA9=e!)VQktmDsHICOCMWVu=wx}olWwtQ@cu*zS#YJK z4|{P7>KSa?2SaR?udRnMRq1P-vF0X82Qrglx5#ZtWs(2~dqsA{VswRhQpb)+ja6qR zCMQr-SV#x`F&?aBOTj-NKH6hXPo<)+{K@6HGYm172d!d7lG{DHVi;G>}g>5vyLUC>vB@NC1vR!n`GsQ*tOs3=($z z*ecH8IqDresV(XB?o=asXkHvCQfvjd+HdrVpW>GX(y$c;*UFHV^qq-|wxHND-KG8A z&uQlmJ26D%Hf7ceg$f&+MIo!^GqkrAd6EzP+`;F?1~6)&iY8RT$CR6ZLD}6 zJo3O<5xb+&Bi1rI%}P)OmqLS_X>46@>gY}SL;Ac*Ck;%dVW+O7pW^3u%V}Id^DdAa zJM_Fr664h)^Aew|GTkboechpoj89a)5qwBUW~CL9%*jLPur^(aOl%@54dylqa*I$p zol{my)%(Ny$A;eyd6!nn%xNzN(mcUEL|p&+XMmy`4V1h*nOZ!Tcjc8+$CT-HXx^%+pA6~ zPzP!HPw3v0S4PthHn;wxO5B!}Co%veCieP7@|j#*xY7;Op7Fx7N=g)5Y+PRO!rOli z=u&OA;_yH=&wfhUu%S(;E!mW-SP5S#A{^!?%%Lh4Byyv@#6hW#hUyv~At))|+8k9h zu-OD%3I|Qa_JVLkRjc<&A}Z=-)HsjfMYoH0fV!YSlm7sWRNtH#Hf?I_m1t_Cdr>{F|#}R!6{Od4!{K@^oHkFml}1Yf>UGa=>r-zATs6VRaz{!t2c zVZk_6U;=sO#y);Em!y*7Y!(zj0X$e-5_=v001f#N<0&Zg=aBMKtUBpHxaC6E{$e}4 zBB-omz~W0AnEjhNmQi~sg$Qewcq(-T0I6!e+Z&Ja@R9OX0!o1;2KF3U71I&$v-_I6C5Wd7UED5ZA&^p8*U+OF(gf>`n<&y-FLmW-}%E;Wz{7q;^+r( zIlov{O$zvy)Yj=xBy_&~#|c6`kdY{*H!)SFTtkJY0n~MW zp78HQz!I3^ShqH#FEq6O0Mu`5-?;0+j#bxN6n5Jx(w{TbZSUKxcA?f)N~;H1QE?ts zfdilI%utR*V3+jroHv68`JI$+V3}!YiD|^l$t`vcAv#DP@JCLt7_HP-J6A3GRu$=Q zPWB$rdr>HyX@#p2Whz5imQkoq6rx#PmfQ*Xh#P^@ z;^4z|APH)SSXZLgSE#4VAH#l|LjM4GeB@+zkW9zJ{{XG9+pP(5W&k=(jm7uB`Q9M8 zBa}6#s_CiAC*ji32i5!b_UpV@cIMYPR1eP@e4wGR zNg~EByGi6qm0&jk%xT8b%bb^&a%o{t8~LfW;NP?W@e<6c&`MCUeo=lP?OK>r%9N#@ zZWD0fH-SDWrlI+9=3B1<*7u9sh|NHR#ILx)CaB>{4IwUG>j~ifxQooMsQ?d<&%Q)#$G$Tm-I&T*b98?hWn&f3yrF(~5>Hh#|iqlrZ=xMbA z4TmNIwuOEt!oS3SsHoQ3y)#XQ6&$<${s;a2{{Tr@T4^X`e5ms*jvmJ;C`w!sJ;)f(gV8A~9oN$vy>GAjeG zGBJxXi5{EXWb_fT*jK{^Il3}a@WA?aQ5We5+e!w=iVHEu4Y*w2?pCnbwGJV*4(YXz8+-9+mf}H@8Vwm!&up85c8ev2FxZj^Sxt`Ih-$$Yd9*Z=QZLln3iA&lL6VzW zZjgn}TY(jFTZv-uHB;bZ5=TM!M6z=?l}HEFN>Vx)r8F$!YYx^^Ei$cA>oz@Y1e`}x zlbMzCCDt86#laA=QIUrIr53#KWt+o!&c#|_sa}VB9l8v;7zCJ0Kx1l!7}rI>SHT97cdAu@SbgQwZW+mA!Ln(<2)wo z4opmyA>u9A!nsUIQm3dE-(9}3Z^PK5yy3id?Jbrd!_28l8V7g_;wnOAno&vsAZ%l% z9Ly=n)G05IG!C)L6wfMlO=?Ia5qk}-2{k8wFx4J;fZ42KnnR01)oUAV(j^pn+UnBj zC{@s*a&HxXFy3{kg{=WV^)bgRb6JT=q{vS=nO86SHK^DhZ)ngOHQBrj{Ks0P+qzm= z{FRu-Q)w)yrB~e}gBn}mH^7xI5zR6uWcL5-C>DWl$5xYTXAD}^dsR{ z2}#NM3-XdS7TOJ^a0mzXfKUSi;sz7?Fz~%I95h(K^6%+aSnC-rjwnzgJbZIOttP$ku^nXMnIqETbjNAYWZ}xgNRWm?w&+Z z8m$&{2-OyXRMUt&829x~1n zcDE7AiChI6mmWV@V>w4zS%r%9axGdGvruy^I^H71m9H00=^CkptSE zBn*OeMoGEyT<}br^##up_I8O(r!q>A2uSZ0qcigcMuRH70VyM4#6DxJc4eg8A$#=R zGUGh64f(g6X)8BTw#ElqS*d-X#F^Nb$C^3fnoB}ALW+{wI#etqWDrjP#sjCxHzmYp)?zj<|ECzv?Hd1*OW2_-63#`hPC zdzIc9ou8O(YhaRj1u=KB#~|2|mThmKB_IxB*Dp5$=Yr(YL zFls?!aWscd1Z12{^{C;uq)}p!0OxKYu2&8v#f6j$o}@v?HL(pgl`ytiT2`=kvEl_% z7^YA*7Nw+Lfq2WdfGsG8AbFW~)DiZn%y^N*VMzl`hkHlN{t{`F>u@Dr(7}rHdXg;hsA<-o_-!dnMQ zscT3;5lV57jH+%Gc_hstBK&HMDbH`x?EXHSeW^B;Eg}gBP41=rV=eLj0Ex^)nRS&t zsJ7q#0Bs4r!W*ZfUwO+7qwg##cN}p&rON)0d^qkN)TzrllMSUz%cJs!!z$o6}ncna!HL!x_6>Lv4I1`xKaoVV6!vv z&&8>Jv)7Y&rM2pkr{@jM(0a^@Gwc^N0y(@_6|zHw5P6SBr%)G(sZj)R6w;*CH8v8F zb9l8FD=rf#^`>BpB1Xcb(xw?Mr^$5T+ouWawDJV`|!ZI{53_!6q#T8PTFP0$0<^->{~kEe{8yk^1Q$fn9X-Uf5%4JZsS+sRohxMAe(YB|#z64f{72QWtG}=WrSlyIMeU`Zb ziHaL4ECcBsA$>gi%1E4=s9Wl?0nic?{Dq4uynV8dHzR^)>J|t!_ zyxWdG=t7jglpe8t3A)GKVwF+z=6z@BU!Z!DY8O?nuhT^3RQD(Jmqxcz6Vt^>Rlye9 z+5bb3-kwr3+L)+onURPcQ+T0Ob8-DkOq{IUOK{iQ7wVU9+J?@7f?PG`C8YkWvBl2&)OXNy_GPX{9J7 z1v}eg-W-)MqP3wU=>tgHc>GWWI?@5sK3}ANX(?B)*R3}u-C{cla&tRVX7qxRHY3zP z;wF@-q_-?mqo`ZvJHXJ-8F_*hkZw5}pS(X&rvi{rZZ38=;Ku`wB`mKaFqGW-+k01ER;?Z+YGI1{IQuuqRMT$tU z-~9Zc#zD}gA5OH9r_+Ds5vgj3T(~y-x!W3J0q$p_{`l3mU)-XRv(ef#>ZjuST z;$0zBd9-> zNV2Yz_`}SU+FfNSN=o-H=prWU(u$IuUn;&^^aK3-A>Kw|w8cEr6@Ec7~iSQbj&h<)kDy__~x5b^_P` z0L)h`cZS+H!EWfWS-Cf`N{Ki8#rT8!PKn7yw2K5aZA10^L9gF0VQDmhI*|ehQ zaVhz&&)5Be?BI_Xh23=5Q$gX%q@zKcdo^vP1S2GBrKTRx>@tQtDDl3UAsc75N!Tbx|mmZS^t{a+!bfi_(W{!KwQsH z;rW5u19EEg3vPIaMq6?900|z@6Icf#d|~-HG82rF5Eo;);slb?FFf^AZQpl*3KSvX!I+6z{i4zFrrzzNtf>Zbfq?#H842Js}(KDVI_Dh^3abXK)-I^8IJd zSqhFFm~13!Q1sd`k2f+ldWlqh(8<%NorHQ#!ew~nrF=-%qMff5<2>?iUD+2`ICr#F>Yd^GK3{SE2i;O>DaaB07m+|h?`Sn4OMqpz2Rd> z2PRQy$&Ig1%vNW@!B85n%vekxHvF8ZL2#|Raeg8*Pr_+uNw6X&4YrvS01d6q@n&I+ z2;%9%k}8AX%aTpH!!)H|$XCp5?F=0J1>bf4%q^JYWJVdz_661EcBkKy=PI-!s3=(6UG?}33NU%HF zDm{BFrz;a{677<2$mtixcn6kmZT8+LIZc9*Selz2Skwi@`$r4S0v@{-H)DbmldNNGt2=^lSFUW(Qjn3e?r2<|#Y{^SNNmwO7! zp-V|n7Q6s3^>f=Yg?7F?8KhZnT5vXtJ+~IW5oshRmgKl4TE6j~v?}8=AQZY1PaDCa znVHL{%X*h({gPdl`}^^ zq}!xAnTL>pZ<_Jsuk@m4oUL|Rd4}Fggxms^UJCaswm+DgeJ+Ej)F=Zy&pnk4M6^vP zY^xq(XF#g?=?XU>pHMIdl$l)ZO+=IPaA3DjN5Oz?V0y-F^(!d?eNFm3TD>u^Z#bUG zlj06ubg7n~y1#gX50sqDZe`EDW!RV#N^t#A6(AN!Fi2d}Qf(Ci5;Vm@!Wfv-WKb7%ECG0Yo5s^sX`2=3 zZ=ytGTZ%@}$%&gQrE%QDyzN;F1t~l5H-ssfKtWMZ1Pj^(jaNP$1xr=->S6(2%ymhy zt1pm3L=#P^JfxlQ3~hQm85l7U!N|NrrK_n5ibp+m2u>i!m(SWeQ4GYlTHn2rAh0i-m_L zko34CeY(a=4W|Yzj}lnSuu4C#cyeKqkO=-!@WaVkhWGb}>1I;BuM(t4B7VswZn_&M z(|v%6N+=r8Y@VCP2^w(o1-rqTgG6$nE)o-Ub=oxawVOBs9;Mu6CCpkXA$H#?rtC8ABPWd&U?%uCvqa$ss4e>gzbp7WFtBFc?*N=dQ5-Usyx zgU{b%Yj%P|IB`$56nl1ru3>V3rIGlE1J(}{h?NsFUUd>~TaY?Nb=9cr#2AfW-9Rcd z-#6q8yo03l2GK=u>RM{JN{FymSklo}E6V}Qgiy^7IV+OQ&Ml=ayYNoYso8shsn}*g z3sO^Xo+Cf-ZfVKk)&dZq232%@BfJApbr&`O;xT{@1hN^AoYHtcn(Efz zLQ*LV;xw}l{+GFISw{3thCxo=z0c4`iYm=P zQK7RJmOu!`r8u_y>|2R0lC6)Mus$q&c;X!2sy^Ej&PmdfaNA9+f=6>1ONlX*)n;X7$JXV~RbCb1`sc*Fq@>(H z^GBF<9%E-urmltdkKRpnDs$)NNGUQ)pO^tek?vye*>lLp)vm#lVYpF`W7VjAsInNV1$Hs9nPsAP*YMPfqI!1KON)J6^ z-Frp(&x~l@P3MvqxhHGID@=->bwmSiq-^L53jNbhMUt5@&jLKDDw}Fo%X`M2z$aolY5?`7p|nNZh2I#Q(=)uh=ve!K& z=3je54ybAb^^bSCy@DxzDf}Kz$~sWvk4gT`Ixb1&CjS6iei8n8xo?M_qt_)KmnAPD zVM({vJ*xhVzY)U~V3}+`Q*@!^HWHAt($VKSt?O2xT)&lu8XBiovuXUNgE88bmNMC2 zU74oLAt-uX%_FS9s zC>1M+AYg1cHM{F^OsJ4YyjYq1pQp&qE_PT2A!g|ohsu2|mZVUE+Dp2RP9xchz~+9V z2XM}0w+GEUCE5#e_eSLOf>V=!@@L9l?{1?5nq;|Ug%;G3q;&q!e20 zf+P3DAyW$%-`}KtqGZiK*ouMN`7A;*>p(!NFEB)rnxT7c7}n;XTmiCv?_m`P5l zmei1Ln_LL~T|nHF+%#3e{n%ianjxhH5C}SNA8MPtsYy@{1N4aB#HP+;qch{-))ndm zkH!#AK1x+(0!g{QKj!d>m8C^DQ4Vj$;D|``pR>?yenfWZaHBEGR%c4ef=-nlM?(+H zJ{GlEIt{i2@z-y{B8^WWttmhSV~|fV*%c%-l%%K^4;BOgmYHeCmK1jhCumT`MH&_83Rwok5A(m}9lAq}+(&t5L+S*DDLSlI zd-dGJl8~g8YETMAt*YF0h?N)2QE?5gNYF~hv^-Nv!Vu6}Ql}MbMS;W>gSd~9Z~Roi zB}U};=d?M#>ZR7%Ne$Rol%9S60IWq4e3yL7f>J_2y@?(F04QHnQj$`Gb)Bu{s`|eF z0C>NM61<4wU^@-CeaRPQV8`}ZxzfPpasXwp2(}pm2@d!*+%1Z*h5U?=Bh&tkl0HqN-V2xMgIVt zG@mkInUtw(P*S}%Jx4M8ulB6qB#dc9v+7tGRx-!ii=C4@GG zEL(u1$cgl_WHQ=>^x9@wovW!fmJJeVoizbMYf#{ zI-*9_;sSLXPKt6=rMNYYfZG26ge>F(HL4gHJbXzzwPxvnEmkT`?{XkFigT?J%}h(Q z-nWg?7uo|@%N|YCC)`3DDQ@<#h|L;ZRT-A`Bg_}MfD%s-H(#C>I?2ecwK}=UfKrlg zq?oSx@tyww4J@iHCB!P@Ov|X?f20uw9Q4M61mTraa-bxF zk!x*kk=@4pfwwSHbHw<`IgfJB0G@vFJ;SO>-52Ht@}({ySlhfmN=%t$01lDT7jd4@ zY&Q-egvuZ$`$y!KA!e55mlOhfo{%S<#j9bXWo_>RTDB=v+oY*x!>Ep0%MM_LWbkFl znZ|52EKam2bg_Z;BRWnP#VtI__e%O0t1j1_aXLcD9e0KoT~eG2)xTTs5;W>~Ze$uk z;LlP182nYq)+uZ&&Pa3*Qb`*@zczEWpHrl)mlB0(;_>BM17=kI7??uk-&15;gBC&W z5)~TEh-P6$WD9Br5jq=beAaTYLqpWw-b7#GqZTuWD$5Lzp{$$t{{S|MNPS0ttP(Lj zWy;jjmaWC&2;%`D5P9a&r&5(b4|v^Rh30goJQ|u!#qMIr;WeN(g%fdTtWAq7TVZ~% zUc>WlH7=4>anK0s79PIx#mrXQm6kVH0C#~+doU5^5ZbjEiC5=bm|%e62K!nA%bHtr z8cDGBiX}t5V7?^Uw~JqzNxG~r1KHZaNjF#iA#}?8#9km3XLK)a@N`kyS9VMxQ)=a4 zdcQcF(XnEwirvc#^L`*5NSGm9SRTEiLp0$_H{Lm`1mZ&|VS_IY63k>ghW%jQ-VD_I zXotuFV%;udEvVR`>T`n2B|QBgvrEi{grF5z+oS@@4mgQD9Pu^(Ni+MVR*)z+llon_k>v%=}*z<%5BsrvupnV+Zi`h&)NeRGT}>S zZ8Z`l#4F1qdtZYVS0KD@OUX_A6R(8&tO-@E7)y$=AL{9aEKD6IYXjCHvKY1LS4*gQ zNL}s-Jz#04u#QjZ3^dQEAPMY&{{R1-CUcmslGOM)Brm ztKxF8O_A~!G^GG64a`*xcboM*YWJ4o>n-&J^AG9hw4Zk$dF%RL(~V{t-URdypFgEy zor)ygZksUooV)(aZZ8=Nm|2Na&54!FO}JE*8|WtXijzZWa}xsM{bJAIIU*#6p>fvm z<9j^h)3&~)^%U^0G8gj2AR(L9xDU25a~^nQFKI^ zbbwq03ntfxiVUk}btzT1HULItnR9_MEDf0x#L`P@n&QGqvUiGeU#pQiv;`Brx%}f) zCn)la$ds)CS5DzwV=i-AnJ-JmGcB=iES*3D#msunm06`WpEFlWSw-eWQ8ZjozR~e9 zasr1vgf%y*YZ^>Awz9p6uX{41oy2-xqhf&oV?FSeG#I^3Oa(qCB z9>S%GWQ72cZcGtn=}oeWTIZ~GDl2t1?-Chla`Jd0GTPjjkue0bU?)wiK9Jv1l=E&a zdk$i6FG(vG-qw%liaAKNt+Z2;We#Nt&YEdx%#l-UD!^Z1cr(0Yamz4*v>30zyUkOIlP*Gl*a2wHjM>Qf{J)!7TPh7-w-8!2^xk%Z%!IvI z;#c`6jJ(QLE(kou+R6;-cMl;6Q^vpn%u;PSR3XiW-IoBRL_;=KEEq7BRxB8r<2&NT z5){%^G6$!7Dk*km_@i--8mA?k#3OCAaEvvAW?xK zvg`&N0B>lO%RIFpBz@tHDAw=-2$*(|UUdf7f!yI2CUt};$(-aUMrlJ(ybvk$1WKS1 zo$t&__4m?boE-ZMCmIb#scBl`` zWc6N!iYeNKIpC1$l6D=V1e%vExH@keec)#{X?d-Jm4NXI)A0com0O4A9XIb7T~j`o zWBEUe?e~VJ{3)dW02gEMXQmvFICsU~Q?5d!+jDDioh2&uUug65;_vigVlNGuh5FKm zEV;T%&+LSckQ2mRFAKPux8XZA8uS@7%o#=h7@+YwRf2QjC&Zei+f*Q6PtsldQhZ6Z`J5Q#~%FL$DvYlXB z_P;PEs?ronw4DVzcD!g72CGV9mtI$zhn#n1Z_~5{@s3@i<7QHkpoQ5n?dwG~fG6n9 zF1>|@yL*XLlPKeIrAd2M_P92WsYjN}`qoGmET`G@heAefs9e?rto*V-A_n*rqmaydx)MRN!Q zov5_wNh&EnCl@olBtq+LN!*C$eSK`kX=T8-1EuKxheB4)er)d$w%)CfBcV!kBF zNya zl~5^LOr=QGr0Q3Aep~LdHnh8>AtdS3(gbwuP~4b877{knr7L^wx6(Sw;#JM9YAyha z1o6+>Cm>4V85pUFI;z_)g`^8?zqtDDB1J1O7Qu4hwiSINkpTKNVYZ)Jk8DV`pf*70 zVe(5CJi3TwpcaKFr&&5jPW`VE8dR=fzFK{$uvFM38;}-lq@R7S4yXv6U@rb>)&SCP zr1abE5Xw}lr*4%35CzBsW9|NNyf-C;NwleUQ00PwSvvqu{KdgAB>^}F6C}_an^+0d z0{AMmhxdumTP&a?s5VfZQf+h60JKa{5VI~GSShvCJMX>!0IW>^09~$q#VtiGq}ZWg z1AA=}7{FOkC+!L}nWV|fg%y=4Df289rv3TmA1AAdnv-D-+&J>J0tV!NcpJ-3CS<-{ zNLw~KQ?b;0`+XzoT4l+}@@2+{17s%q1Z@@!bKWe}f_EPg-xEo%d@CB_^AH*|ZEt|G> z8*}!BSi;+2RoWyOxd&?X3xt)aM~-3}oSBx^Pt(y)l3HA=yo-_u{fPeYHO#ERmC3v+ zw@OQuCz4XgO^$>7Ml!yByEBQa4^BNgc_>di^TcqMbt{;)?jn+zh**|!lX17!6wNJ7wh0#Z5g`)y zHzV+m*JMlW?YB`K#FStUFi}-;O9Wq$5SI;xNf1a9Vs=sGuTVBIB9fU>6gT|&hNL%Q z2>$@gJ2J@t9pjHOrWu;$$joR!0{kPPcKQi=wfd` zo=IU%{`znbZS4(p6liH&aeiVmlPpY(yr7~~4>9*I zJX&!inDI};{es3FQ?o`XwaQ?q6C@DMM zJkEG<%tM1Q#In}CC@KQ?k4(91n^KjWCfM^qB^~*U=EYYK-H&Le<*B{ENLn?B*sKz3F|!NjmJS~x`4+5dM=k(v48>% zu_aAY4(Y$Bm~E%Xspkj0a`OHnV3l|LVp~mYBESGlFnyyF>6#iw&1yPPzxlJkN7 zEok|fdrgu#9LGAg6`rE0T2gHhGd$uHLy0=L;y0<(rNb&_jdrbrAjt}*2LSOC92x_a z6sbpR?|2+Atz2(-l}J<#Jz;!r%o5;QvySr2GA4=OO4Ag%6xfYKYiTBgxn0TY z8SKt!3R?gb*x$T9OJ|EL6q4{N?S3Q0YAbcHmYFsw4b0MvJtot{6B8X7@P}36oAFG=QmVI<`arj&Ux5p`1wb9)Y$z)Md(AMEQ$?Un zxaL15)Y4K^NF%Ig+_#E}6iT1@lwR9^j9+A~MQJdC9wwUc0#1EltdROgM!0NU1>w3HM4Tt;g6tMRKZUS(|4-Sb?r39_SC zN*zerGG{2=*mDLswVG|xDl-hUy+J2y7^2v=xV%jIy+quQZ4e3UTR(|vPB`+EyQ<_E znNVds)g-7~M&eXQx%TrO)|N+@jY8?XdT{U$ zS*PP?B{Vcj&8|#mYYUDCnN~g_k1ad_%GKssm~vDAMbD-*4-0r9rPAaQpM*{H^QJUc zCvXb_n$nA7j?ieYQJAGjsa6011Fxk$l^ZNPNg7q#mY7MK9vP%*GLG4lfn&9!1UzG8 zRD$HDQW;3t?P&Dx;(sut@cRyz90?XZW6h6>%-58vnUu2XTqfXH$Dat*UR6op@i8nR zZ7L_3Y{J4P3}Odb1JD#~VlynpzMFj_%I57f)hceh5)IT~SBG$m^V4BE2^Zi;v!dMA z3wQH1Dt~AuHPdMtmH(~|9irow)(x}`x}nk+@Si0@o6z>FoJ z_L2F9kkcl@&@`~>k3nwEZ9 zYDyM?sYHJCdGE+9cC06fSzX9&M#=+t+?fnaF%B1&aI9>dT7a}e50&H~Wmyi2eBsuuAgiA7BATpQ%q{6td+E?@J-OZmxSiy;H0nT5Qb{F5 z+hf)u68N{^R0wfSB-|+m6ekB0XS^m&xMrr3^J)bISlEMTls8juW{c%{zO5$TSgo?S zh1E|xrB*>*`LGc7aYL=TH`JcD>SDRfz6pe6IJC{BOFD=na;|^NLrAR&DT3K>l^dQq zbcmfgqT*+~%c!Ia0UuAa6#lebM_?lI;Y@Oxt~%?kAu808n+=G!+9NAM)IlcWv^vVk zE$7sB)HgTl4lK%gxZ{7Ub~6YPAw-Vg@E6*BtrqT z4)^9e5_U#3$!Sq57gs?aGi|BAK}im9Vo@r}S(q-UYEb!7M_6f@XsPwBd#s)AZyk;# zY?1JTYZG(UIk=->H4AV$!^?9cD`&Hiiorl^O6u<{_ zs>f}kk`@x8tv4O76*7cF78=ZlWhvra(dH`tf=#UwDXetVD6FZ4I}inNSeWF>+{l(3s#`+vMgm@gIUAxbJyz2R1CW;EU~c1*i;Xh~2< zYx{i!2Q0aVMzw0}34yzAIhEX0edEHaFI3$neyf{U4r9J7#4`C=gx#vmfTu0{G!Cb< zJyMvLqDroEZ9xb^brMWxCU<6}?mNU&2=fYQ>Di{qy};`gP+Z`C^T&Nx^&0d|DcEy+ z@mlI$$3tTi}v@1_yYod zdcEw_J6mZi%yPu}l4@M9?7`?_LZ)rT-Q$fmO+*V0Vp7zCk0aO^0WlX-nG{G zky6WPK|osFOco^RDOxrF!!25#mK#>U?ba!~#HQHOCsS$BXGWC{VbISuwAloc0?MS( zWzlVfC6%xFYx$$L85qQ{vJ5vrC{zX1k+_I`VnfWhw#Fm0oMrmDVLEpNScsP{X)}rQ z0^J*1mktQqL?X>kMd-X)lc%DIp>aPpLqw;b&qpQUL87%cfH zmQBh}^31Au!)fqO|J_O-S#3#rpm_%;US{UXZ8%;KgK@_O(8jh%SE~1dXELHXNz4$PCg5MRC7ox@zfsQ-&Rs<|?Zipx z@~MAtHtQAaWP=5BQY%5!6VF&@TO~K%ECR6TnE6mY2#8iNf}7n5JaO#>R?M8p1u4TX zHie}`6rGG;oTAU#jS5u~%6OX#3#utRjTzLwE}MTyFX3qdiIk2l(ihYPam*8_e)8dC z+|`-H@`WWwh^N@9X+_2Fa$ui2>26s607wC1ih(nV2cfx+(?r5d25Vp*yT>QdNM?eE?u$;3&Q7Ygac zqPbGB50==y;n~W<=F|ZGaHCdpJ#8IXYpezD4y@wkJn#ut+*%L#DzEVYAd*i=rZjDC zyp!+DT3ifFzLhItIe}QAX6H=Twau2BU!57`oF3!8dxZe;zc3HUij3B3VjnzeaiuQc ztG9S=@jI6DSem}38%5Gp*Lb{s3^Hf+1u9*~Td+tRj$;bN9X$&kT=o<4eU^GDgZoRZ zm6<-~?=_>2HI56v` z3_Hwm#vUEkwJZKypZ&2|u~&yhG*+O|2eA>qb2JtvW*2k?0%9MCvf@Udk#jm`?_uq3@tZMoRZ;~>OQk(I;sUc7+_^>ygX2;6;sV&t zsQpc9R-?V`1IBRM(<1A+zbCW<(n~VW<_+-2CLJoCAm--X)R&4-Hu=9e7|-~ItT6h# zr&Xkmq{L=p4u+G>i0mRQKSl=j7WTAC(?a;n5C{x&tayjSOPLEq>d*n$1w>l8oz>h< z$z{ovCgYT-i^L|cOf9KEC!VGd(d7Y}(`ymN(DhW(MnaAu(Gj@?(hf&X$QMi-?NKPro|o zQ;Ie}XeLoI{5sH5(o{&^;uck~V5c@$q<|s?wS%@$Sh>V-!YKu9l6sHEJurTW{7Qpb zmSCuxC~eGnZ<53UlB+1%+?d)A(LKXFYKT>Iw_am02MsB$*!f#NjDr-;@Xw_`*<=%Zb-U$I3SRBS%uZbY~s}Hlc{5 zu%ML zgu&CSuoAt29Nr6KFkA@0W7PMV9eP@Xy|bwzysbb9yQDcX>@`T?)Ks{ zmoc$()tZBZDBAo%bb*-j+C4(&nGl|-wl!~in1EJhbzgY?OEVKrkO4dNiRA+->KK*u z4=lFXJE)FhWNjX1){jSaw!uvbS&v{KX(}pMDFmLDgKk_oHSs9{hYs9?#kj$FJBF~F zkyT6f&yn(=Uw^C==or%vVTC0vQJ7j%d34_5DPyB9C(tzi0O6j$QC92hR44dkUj-%E z=F){Ub#=O6w_3x~6ihDU-lHF)Nh^%Sl-va}hQWQVA;h#Ce(b*cq@S{{RZsmr1E1zlF?Lk@z-5~Ud232rI4B1RSibY;US8y9x zq=V0B>0GORzNZ${n<)T|UH<^h;)i8MWhPzau;{ zzxRd}_{8r(2HZbsN->>5XsXOKlCq}OQb|28#6Vb=T8fpb-q1qC(!yrBHmi~p=_L2w z5u%&}ZKQSL!YD^Mny8r(mY*P`?nUnpOiBehZ@Iq0AEji)ii%0F+80Vwe68+4Cgvn8 zVQa+X!wG36y&*#X05m)rYhmRjUX8D)Z}~^-E&kAykZzt2NK}OB3Aq*<+n=;w68l8? zYF#K~ld{$M-aedVB&|ha`nCXb9H#0_vW-rVn{n?A)rV>n=`>9l2N5WxSuUwI3hTFh zh>nn0FLQ{YOoZ*$@x-(>i;cS48&gu$08)VW1~@9Pm9I(-!2Qw8Ml&su9$%Q(WThZ| zA);UuuTHzDo#U%=Gm{CsQqGWigqxUL-VUm`pD;X&eT?1ne#81lCrVpcvFD3Isn*?? zf~9W%0F)CJdsKOX*@}U5kOjrJw@5=r37)Gqrxm5N9Y<^22raXc7@64>DT*x9i0ZJ( ziEb0{?}-|fdTL^YG#OK5Ao(O*#I+WV>SFI=smUT&s_jME^<{356s2qeQU=3~q1u~5 zQJ4VOs0*l`6ZeTsh6AWeR>LZkaW87z6mbCm01=t2#t)Hu4pMBnKg{OVLG`sX3`Y z-1munBL)Pl6(>=Gt`L3v&(8f@sbAG~O{&x!vFttv#D-zqD&wxz#ol zrimS`2kf59#%eEs;y@gTwo1Y>^3uCD5&*EUfW6r`6B(a8Oy!@#=8&D!ZM$(1C#DkB z!5~GW&G}Yo^3Et(AYSo6F;*>Umk4doSJo_pe4}8(%4=;mdnj-33Fbxv+}&R>9v6ua|rEh!+W0tf|43mR5?iAYBCgqC(3{mSB!OpwIsR z3Ic)YvA1Yzox;aK0X;iMZw&&-U|wdZsUU7{Ik|{kPZ5WlAP^#Hil~k?t7{LW1S(Cg zS>g@$?*~O4=O`jdCF%tW)(-t3t3$wm4`-MNy}V#db&h`B&v7lSM- z_`oa_l0K0TsNxSg=?dGd3fP}<<&L|=f}Yx@CXx-nQL)+tP%kpyQ7=N^w<8cT!~0yYshRvJiTog3ODvh>8R zoY6oR0>nc0S@8n=PE^b=nvA}tcRh#a3r1fl(p9HWw);e%3Q8F#LesX}?*&O}l)TDR z7BsJexB1!@eL+EqUBpVSQo#wARf0gV;?SN}lqB9s39#!1oI;eBlu@vO?8?%oIN1BZ zg{<&pqh&@(YL+28{UWs_|v9Kk7%S-^}a(%Y+*)gNo6T>StITVtWl@#zhMa;^-0VGvCd%6)Dv|ywVgMOhR&*GR~|Cs zVNMp6d-KF+rXXWWnlY9HHxD-lr9Hpns~N=WmrXSU-ejoeL69QD)nHhm^~$s_9Y%0q7;RT5%|Ma0F_MC;8KR<^^Lu*zm(oOWM<|OF2xfN%s5sQf)aHfXw3ZD@X=rJ z?}=2~$W+xn_iAOd+*{rUr|MMd0jHF+${8A+6V+d;ggPJN9zS1+Jj3)vxXMko+8~*$ zFx4)ar0uTI*CCk-l9AFqC%gtRb$(|OP8;0s#C3GJvnQ~bAsL(P1?x+d8KM(&b!{5! z`ZdhP1kEaZyEEOrrXX0>V?SG=3; z0BsZ9ABLRCm#E;GL*@f^fxp@Y9yW2~NXt5j4gwO&xIWRDz8$l=Zwp~2m~vp93ALgD z;+Moit2jn+4!xnTEQ=HKMVqP{^v1FAB zSDTCdIFd&M(yK}dG$Pav3wyzo2DW}U8 z!W2b>Hnzal2>ETiN@XR=&F^qOD7GQdWR`~dgQy5QelcdGv18J7HjszB<$^#-A1>U8 z0MIE)c|%HUAefY*lPDZ@R&8ZL&RN{)1dV9xqSxMNPq5%FgYt8wH zJ#H-uq_HBW6=ss9uh>BW5v6rlR1*!h&_Y1>gz9t`FR_MsDtyDTq4!jVP))r?6~7|V zf|4q2r9^r_N!<2}WDfHFr~@&~&Y_fxk$%wD^!nzXOD(A=Q3QgcVGWYhmS15?U0cgv z@TIGmd85x!sc6vfdU0C4OH;Z*`wK^I5N75h+9W1Xm!~EQpKt-tjqegBQuA`EY&vuU zdnl6x1y!))4+m2wppu(u3XX`yR7OEbkk*nnI=PO@_JbvxxRr*Zj9*L6C7EWlfyq>U7b|(k^31*<#T@%vY-`LnpLO|Dzk0Sf(R8DLD5i9h$XJ3*_brw;->=qSq-YaGy!;^Sr^3?3Jj4X6n zP9YtW5-uZxCBa5K3>kZBlF|<}uQ;R;*4F-UT(NRwBrdjQ65;5SZ~4Rxx|Gb97grBrBzz-Hf>PPvb7;?sE+;hmxR4dMr2}q|YQs3Wz=Q{V3Da?Lcyk&50I7wp z(Y1$jb1uqi9}=Oh;%%~SvmNIp{Kamy1K#{V3k%~vj81~1t5y4bAk`^dY3XDwBUZxX zjr*q~j7ZU%?VJwwLG2Hm4SnlJGzZ7ykfPF@^plKSxzl4OS;>lqD*&Af*=; zk}kIU+;#fLp_V06I-4N+h`Al%3)HV5r9Zv3yWwDEomPe7sWRJ}dD1 zSX(s-C8|+MK1|XRbgXy0EZTPd4oAfKpIQ2IQ`5nfX`0IdF+etu2@3%1KZJi^c=t$&V(egL`ipQ8jqr$0q7iHRMNGxmaJJ&r zr*4s=c(o0@$uwc&eGq$^E{2c@8lsxn%4 zjiI%2X=s~^cZSJ=4L@nLR3Rx)ABc&JjU6pKmn;R1$&Qp~8GV3)Kvzq{{{WTci+)g> zInE4{@RcGGxl}C{DJk398!Jr-hKW%da}ip7QOP9`ozc)jTD4`_!KT(vQ45M#H`)&- z4JYV`nW*faPN*^AJik=>Kucbp_K19hx5Z5)Tdm^yWqUGiQ(I{1ZNfLc*M={&s*FKd zX;LLv#2Ijg+ugHpIpR2B+G1pEh5Bu_@p5s_9BqUtVIxW3XsEcF(o+g4Hr@wa#fBj( zyD|1~B`7x{*69P(RNSY{C?j+edtN`JS(>g)2GF7sc`;)!zEmM{iBg-?uBto0FVrPp zoB2+6%m_7!9ckb~2uU8H#7P>f=>=Rw`n#9tr-fZ0eV|=Dz?QmAf^W6qb+vBgWB^Q0 zQLTJJY;GbfTrRo~?&{#j8TrJgYuK2WVZ1#3c@2hIDkp<@WmF)X;2_C|e6g1Ev;r5AKd!~m{O5cFA*CGZ?5jB`O{Nmwl#nm9P>k2l1mTAqOLJaWAL_JI4AAkXSTu)QlSyppHYPDwHvB|l z{8e0WhvwV}Qjeu1kIooXE;~go)-|2P-^EB5ciao{4U-7!x2 zDzHuNBB$b()h#%-&&&;v;|x7YP8dLy9$;@6W=&>5EiEjBTY!0i?JLC${ug`AoONSC z^raU!gDpmandXhf@3cbO$d>EGsZ8q!bLoX!rqg#A$KDLkjpA5bo$D{yV!RzoZ032X)uj0dFeWA!;?$BiqMqs`y2bwhQTQGN8;e|EwgC8^r*LRa}XN1OK2rqo{?JIuQG$?X5~vDSzGG;h_L5q z9M^Iov@DR<*J#mM*HEoj7Wza=VwxWxE${6YH!}-kS zre7>7?+;9ir|5`%lgQfrP=umE&Hn(>W7)Mgz-0x509b6E;XK6Jnc&Y3)5s=Wv%T%4 zMvwW7KjIpAxTkn}##nZF6LM1T%gi9%D{A0~*MAFnt2bVfZwux{8{*}iNNp1?H-37U z-?8CO51Rujf&T!u5lwhOpuTRIbOJxq32LpcSOBnlhvjb~9*uppHdOF`F!`A?oFAbT z{CPur5aqPdf14Xh5)YBN8>b|{%?-!56zf)DPPs1Nu{#Zs@j@u#`Dxg{h+x*a}wKgu(vq(5`} zKorBJ`>jIc-|rt(xi5=(DFXZbVBb*i?~3JQ!^Vv=rii#&TO=4yg|H0toj^4+D&r~! z#VSRu4(ieALc|d?Z|Pc^0C%mF9>jyp?McF3YY8D2h_!PKDN}w@6W4NjMg76qKQ&a5 zNlQnL(NTOzPdAs9lS*jbY$IEw50|iyH>1=YRK<&8K~pgmsFxwP5taA*A z4*pF2Bhh*$hoEW3pGd#{=kn2BD0P*%r8KK=av}uf+$C4v+8-*ZY37pRS8{upVAch< zzqAwenoM$MR#f9oT`S+~9}WUZJRhum+e(2+*!#kHf>J@XzobNo@KOS=ZT;bL7MCn7 z^)T2ItS785MS&W5j*>Z@e6q^ThSBs6#1Ym$mg>3-M>HqSAdQXqj+UKEBwEDmIfary z?2~ia6tc&hEIM_E$vH%oBwO-{0$2#=B*vye=dgk`9+;<<+mmRR z;%rm@01U~dR!P5zsydrC*xygNf=4M(2IieH-ebt+RT(AY=gv3}l)?_=_x2G=)r@hT zXH?dPrsh1gtNxn=p(!1<>Gg{zL&&ezv%joy1j?r7m+Mk5`9a>FM3tgS24v*W$~YPY zkKQ}Kd0RBvjav=OYpixr-2Sj7g7PomS#9dIQetV+o2isKpgx4bvX?LVidZu!fWv7& zx;OitOi8KIWF&=cw^&kSRF#{e!rLC=COuY}Di~4w$oidja1`8&bG&{_$*JX9_XBIh z-864V2>=o{+n8A?OG{_cn}1l~3}7UNOVbq6u0_Ex=G6wos13RcK?#aDSEo(=p~6<3 zrOhhX^n$Hq&ccW;n50<=NKdPzI7`xknpWK`1Qi^hg)YfKHyuY2(X2FENCiCccp#+8 z??^IcjBb@9V{PvVKT{LFp8LV!j3iu6qNlZXJrxv5#A%_T~4 zU=9jQ8P%MWOm8mSt|g?kJ++IkgorODLUzqpEu>`%)E z)lqlBKQpc)@W+Jl`aUBKRFhAeR{sDEFm@-fP}})MQNd^-<*E(f{Q9SQ<3mxGHt{Y zWNq&biC3oSu`o-;*-ENA;reRC{DIsp1LgK3p@EX+)YE_{Y2L&@nQ{7j#ubAJG{Xr? zGXcTtUA7m44I-qaq@;sjIv&5u0W@`Jb5@`(YypEMGN6N{l_dl#ZC4`kWHRCyC{+bE ztwCJvr%2ifw7UC)Tk_k{cw!BmP6;*mc?=i=M8@VIYP0wq= z!i`!?+FJ~)Al~XoA2eJMFm+m75<6cKGt%lNW>G3lz(@f?@g#sT;(7f=J5KCJ^vNav05ebuW{#Hr$IJqEm$N)J%uyhrhMP!to#(gIjR7nh}w zLhrEJ@hhlQOzU9tfAZ0lu!AgI6^Z1kOIzUdycB8m8%mH!wYD%PrAVkfer|b!8!Z-P z)o~I;gfW8=RLztMw}7o(X?T)EO))h1ZPg~{+VD1*nG0Fpf210r7rVTS&$JMeZM}p+ zDvs$-LEJ$mbvoO);K0VN**CuC8xSHfF;i5!$pqYV5jw*&uGVHy+DTbF2oydvx=(&$ zz<6?!Zg()HT6a#Bn{NTP3Z=d!oATx#=ovLps!659v&icVb$qOvm75K?+L3d;#jP8I zmN`tz)LC`;d#M25OgCn}M@swwbq$Sa;M<5-dB#te0;~o>n4pX#DDyVaZ9J0%sue*p z$O8IQI{yGjC*#~GnP*%m0C%)kS*F~Re1fYR+jD54kCoKq@W}Ywut5@C|rR^wXMCNqnz{YVfok6y_Av1 z5m{KpX{ys+aVORdfIIC97gTH+DBCb46wjtilg=*J1oetPGVw!%-;){_ol>c&$hvkT zs4<__IZ%m(C$T$-ev%nsfy{1haJHa9Am5}|Y?;l6aNS|1U0>|iwc@p#p+kEE6C5{& z->E#>(Qrk$?-OE%7%~`5RaDW%EhEbTNl@wh;v+wh;;8s|GB0iR<_JC?aPyPY#!~3I z(k;2|8VNwa2yvhaI&lN2mJpTu$1~8Ha5@DgVO{C zk5JizNliZozO=XN&_J;Ek2M+1Oj@z*@{|a>r0)*u2l}87hI!ED+UqE~-pAfS{yU zTtzi&l*sQQ@CeB7;&@$e5Wh7%wZ642cd@@noyb*7h!^0&FE{c5%pUokXq7alG^lnl z5uss~hQ-CjxQy#|MQvpQL+X0oRlc#$4!Ej)U6(Cl6b|r9ox{X}2;a4#l^AgA^nyL$ z9 zl*3J=+@{B@KBiTR3vf2W`wKm6uA=I>JD`LwlI} zVf7;R-1PQ|4T&+yNJ=*5(aA5Q5J(`xMJY=?Y)28*ri#C$Kx~=O#Uv>4b026yUro>F z9}>)O)QEFisbmc%Esrw5W;eSnblCA1hr;G*i3Yz=PdlZfysFfA{{T!TIXt-(xl=mI~07m?IOD>mhb6p*FXVR>JLb+Sj)ouG9F~ymWhdBzJ(3IjMm3KGI4%0EwcRMC}kGX z8ka!)>`&(qY3~yF)}>5#Me5wj}_I1dOK+vl6_L>aVG4r=X=q`=<8xh|9Q{_Z$jR zQb<+C$8Tszyi+o7`$C(Ytev9t(Om6!TrW3L@=)6?HdIm5j$_NVY-6dseT?dLX{Rpy%j#N)JPYhTfLMK_ zTz^QeeKY!sUV%?|DaVN~Xg|6?-Z3J2W8xBa-`}iZjTV}%OX?~>tav1Oo4q5YY4mD! zD_C1>9^yVEea8s}3;f}^Y1EB8`@_3zmq-Nd9gvhZG_Kb7hGxbyBdIGXAQNkC9lji) zyQ}VD>1CtxDJdXdez1;ee?m_ias))|0U4IE2E^^sKN%`;^ddSb#Hf6?jtT^Pqi(S> zldqO-w!-kKrwdj)s@~Dblm`|r2;XhtN`Pd4n@3_;MG1KdH|TmtcA8GDwvJ6D4rv_; z-X0|wZ3?}%_l^?cImkDqqDa2*^D5qz+*o(Ka$u!OPT(dG)+=pM87ER!@9w7XPBAaQ z?<7-AnM9nu}|_7JAqDVS*~0Hs&h@n}~mOHfcMNw_=v#DZRv<|HU9O}GT}5*bP= zuk#H@v|K4OOqE#|MJ%lP8zDE?Ux;{SlHq7J4v;@|h>=Vo6sAg_eGM{@buCK+Pu>7{ z!^MsbzzI?nQ2lW*IBG}-E&l+!f%w6O#qMA&)g?>0$OGiVw7n^5Z+5M1uXuQu!`f05 zQg=TzXZ26?ig|L&MKcYMqIO)wz}$O)Kdc99o;oqbVJdD^%F|jr2AR}H-9-NYD7UDi zu*}PTv8NrIKc;5Evq4K}ASUDsjqM*!OE%h5aten_MjWTaHan;|r7sc9?k!{xoxZ{q zvzXYzuca%*6%~$vO)P&X<9<9!r%+2f2LAx(?>C-GYDor`KG!=TeQn@XlV!VvC6<8v&gLTp^ov<30{iV1H@}E)!vo3S%da8g!v#F(X*EHwZPzZb z{USvx;*SkF^^-hQk-ft!-|~tCbZXS3r|1MaO3ajQY;WEmTIaqchLI2Ensb9Q+YMqF zgD?8Uu(hhl52T}isoD(FG>KZJ()7AOJS+={#-@C-qHU#Tl0UQ^GUGfeS#a_iEBNYh z{{Z`UmTW)mS1JBp&_%U}cpJKL{M4R)CC$V+LYd~4sZ}H%(O$6*0hp)1b+T-e$PsDs z`!*=~irUv8>1t&OyRwe#wEOlW+(f!*={mC|nTExV;Z}m>Y#hbw)?Y(xuxA~_q4bIQ z{4X?DF0V=X(4^cbb|N_9oEasHq+Fk;6f-$*T&jAWwu?cD^4YT}6vc=)B*ks5Q08c} zVb(!IsW*x}dwX{CG%K>bN4Yp@Tb`0~oZ)F;wxD+gCo~DFSc4np4gnQ8x7L zWAur=EuV-Ab#9e{2Bh1Fgv#1sXhKz_l0hKz_KAeJYL_&SR2D%Rfl(2B;#QGxGkCYQ=EKuvIbqPR7PL0w}JN4oMtxhRxTh2O@uZwgsGsEqv4xvdTxyi8!f&-Bg zzOYxBXsC5oe1O36+E*t@a}4ot?ntTz$ENSAd$uEjgVTQ+bFBRO*BYK>NxOVaM7r*U$V z+!%9lUl!ArQPeoGye(o(%gMHstIbi}NgW`lPjLju4}ax6ad^}4pI7khjHX+0rMXIV zMN-oMY^26()fl^{le~N1&n%0kXZBo9(5kE}*z-5?Uu`WW$r;y1(fPa?BQeuYwH zNK-By1do|F+9iet@%zu1eNE68K;Mef5A;~_zwAHT+BSSF<~grrKXU9N~y#$M#bp3uHyg(W^)geuqia}pYa#+hSdeYuAjj15teXcbE> zKl^VDa}DCtT-}@f8JMIaXX<(BL4tb6-w5w=I3ZKV~jC1rAkvO_BM+0 z?32=y9;B+>;OGDn<%5VwZfHKv-FDs?=CI@SE9gy!aw1oNsOGBhD!E7_q+9wPS|Vmq zCr+KaLig&{o;<-bW3-{IWoxSSERrw8OYprJ+#6kDa$FRtwS{xqEsb9aey0jb(gxcY z6V!ufc%*;`;Mx@$w!4o8Kyt$dZ-0f1+ot23y_Z7P8F>leM}yb%iFRpX1`#6S5}-w+ z53++ZW-wV%VbU8UT^EDBd&F|8Oaxr&P`5EfE~;0!9gL_fqaEZ!HY+||P4Lm&sGA6= zl?scBo+Z_F?*^1($wVlSI6x8SJHls)Iz=w8FD*RqmRTTO!)@c$?}g0Mr`9NPt~BxP zt+eodBNRF}9$~)*_*ayWC@7XlNbVxV(sDXZPFw=QZatv0g{yMY(rGQIUM82kZz?F{ zN5Y9+YZ*@}+@iFy0k>$)Uldpc6skp7JmogvM~Xr&Z=~*Jl(ohE^3Uo z#kHie8nErwF>KVmtVfAUZzSzr(rH3Sktj&{M;3yVy!V>W>-Odcbm?D+AlvB#s&t*( z8i&>hj$oHD%3gG%rR*VMUh_b?KX^pzDMN%L0xcg>+JeB}-1m!uW%-L37I>5R2wYzE zSnxVpK3iu|xKR+HsYHeExQh&#IG@dut-5{zU zWtOKD08b>IVMQY}rD&2$46t8#{G)(A@pZC_&-%@bc!WTi{{T?nM+y297;eg$SU?;4 zjkt<6nH1SoVw#9zVH1l}6J9y{VlX?1Oe%J zTrkx0)di_rCsT?lJas49*Ms!_q=~8k3?p$pZ_(XgbpE0$$Fl4x{d_^>%;MzUC{Q5Z zV6DLRgzBj(Wp^$BN!;9SqeKS>)4N^MkL^l)8=Mqp(gCu z{cm`#+2fk>7!wUR@|^PKxJrMBo`MWD{6vg5O>y~x5QGbzQHg#bGkj)FH+i&!@U0s( zHCs{d0JhDeXzw)i8gEgzu=bDnfUMxFOyX+8l^32b7fr>_9?@T3SxGnE+-(NTPbwa! zf}Keg<5k7rA2@8`AJP-^#MrZ*XC~bD<~YnbcKut&G^>51h$QZKG0=I9&N-!fAEwaR zHtLkI`CcAo8wnQxUJ*W&t8Sl8Bc%>wN=lV&><>tOXr%)BcO7pCkjPVmsI|qTxzx>x zzdfUbfH52v;ZOj9Z(|>eHrR`%+`>Y=W1segjiUDv!e6{uCoH8BYzXIwkV`a8w%hqb zT#lr$MUUYROthpYQk7w7u$L3|t5j-_O>xx`a4rYD0-mZlKQ^~rQ6)$4j`-rXXKEfo z6nwUh`|@HM+`@smHi^b!wqNerI|)0Mno3ReZOjnx{(GY@mI0Yfy0%UK04S^2hZO#* zm(r8_Wqhc==3qu#T+G6paOzTx$%`syyh8r6bgUMhU(ecU%f31plxT^1SDdbXa*=o$ zVm}*LuC5k|6w6amb_EF5pgyN>$|*y41Ku2v(OSBgw$LD7t!u9sFOSkq@jhZ#ak|Ir zTCB|Y2H`HeNFQzlMN+|02cN8UWt*xWWaTxHw08rvTr1w$a!L6yG_5?Y-94gTOrRHS zvG$1u9mC6?bR{V#?G|?fT@Gx>#BM5L1% zjfo`e01=@0b0V;IPRN&Q&nBf-3A!al$wB`BQT~D=6^zTJ_-e}sr_rS8S@`Nd)yOhbF24Kv`iz{Wpr~Cu<~uv_H$0Brr-hYAH+Vu4j=YE|J_FBT-HP!RpUbwc`8^xTi3zeplJ z4DCv#>y_n)Z@j{tE>$yOsMXU z?meJ^R>WeUOKu=4<7*CJDTyg*E7k^;4e#0)v2b?|@!$=shZrNVh^yFb+$&iLm{*v^ z$!Wxmlm`%{iSISws|%mu-q7ubs%o#(jV1Rkul~xH(DwVo2w`*wR@mV$jFtPGrt zkKS2H95;ACm3?vB*!Zm&Y*~Fq*Y#+nQg}qrnDhbYPQU}`Cigv}ywhKqFEX&JH@2NA=icyLqO>L^LY;M6Z?KN>Fz=)HRdQIQM!f52WXXV6D+0}pP9|6 zl>@T&2Yba8@wMQhTg3$qUauz5Ow3|z#pSIrci*nE01*E(dict z;QA$2l+^6IDAKWY06tUHM2!@ADHM7dPu9`%&0fD$mNj-0!JnLZie04CKAzqgP7K2; zFX-!&kO}_)lTC;EAkl^V4M|BXURfjm0Bmb3&axA-6US&l=L`B$2ih~ATW`$GYcn%4 zx8R;p#+7MdYjJ2CtH6w^$s$+|)=X>wQ9OZYb4pNC@`3MYy;|#l?<3UA!pu$jK4qs` zAjyRT&BRwcL;5jgW)@VL5DmBqk4xpYmvB%B_Yus}rCb}blYeM1*WI4;x6dt7U!$+} z1lrPxVt`G?*0d?A_*$yrz_g{6StF7o)3oLar_b`jLc4(sH9VuIRhhGlq?>c5E%>_| z^K%H7VtC5Wd<|5?l8aE4TJ(#86U1hAD8&=)hKZty?F%qK#x&-I9=5yYmQBoI^rZDSlU9wJP_tdcJPL?N*Uw;V*6eF2%lZv7zb zO>}7h`oAaz;rTaaTuOkjFkfR-xEijL)(F_lR?hNjLYq=tY}?<6zaABQb>e>ywU!%H z%afGbfTotRY$Ab4%<4*RZxX2rc$#q`JxoI?*g5aw2!P+OgFVA|O8q97V>9Ve=~Ut+ z=BxsmTCKcnRte4uRwk7~nwdek<5Yi}1`?-KaO}b+Bp+P6i8l&tkr%@!KS-W7$!WG5 zoSR(iqIMx_-q2dLw$a0TmNb{&NcVe|f1m?(xn~jxaU^>f3TE~pmo#@#tX!wOdELuz z(*FQWuTmRS!@g76cLjEYS)ck)X|+0Afw_PQN%a-l9RC0^t=Hl*HI=a9R`1eJIV&>! z-HJ)yVb(mXW>l&ZU3p0xYCkM%$BADO?B=@NOKukwZV9|(<~7693Yl@^xKSq8gcjiT zcZzQe*?}pP-8&v(y=b`F#P)~ziFG!;Dg`@rgv~GtyL(<8@d_eD%2_0VaT1&_P*oPH z)4@bpP^Ma$cJ&?otqpT*nR9TP9`F|+j2YO-np>4Qlou+EOX+@L=P>glT#AwvZK8l> z?k;jlYsoA5jfU}Hr)^Y|yQiksgvr`=!Xpqi&-4Y&{{Rted>f6KfKmqmT*gi3?}(ig zM-whTXrt*DzM~ZOZ^UZqOt_~XFD#Cx1Jam*{J_Neo>%PBuS!P(G_q|tC%<^pDI@yJ zb&(Z%jYZNyslVk({t3e+#=cTDq3mS#Oc({XD z00ZqMfC6W(E6jfT}iaX*5#7xy@lI*G$K_b?_F<`T1u8E14Rj6sX>lw9~ z5^h%NDoYKOjYifHk*;I6X!8-&u?YZcPsYBb8OOfN%^i?{-{79+DYIJ@f59}w5|C^lxBJMkn2QT@I-0$1j{K( z1d~B5B&%)6i3SJCRY}g5-()oB775}HQn+xmpp>Wbk1wmW?z0MgqA771+PwUj#Z0Gp zNdR-u2%ORA!C+qS;Vp+;N&l-V-Lw-IWTfy|es^D!7bZRukRoyKj;B|x;t%xI%fvP|}B8$4FGmiBPtof2>t{-eOi*m@T&^rw>gqmYtas@+dCO zvbK^1?4it3&Gn43kR%X(CB#maCCZA1!>NW*i6z=5${x{FRh)0mGU5u-(o`*Scehwq zOT{t{yaUr=MD*1F{6IaWVdkNU)i*WeunGD>3lCNwr%D6mg0eO$=>tqXS*4}1Cci6z%!I~^MDn8v8>RVVdqbNuHs|RM>?6%P@d}g# z<`0a_x|(jUrPORRf@Vkromi(TTf>Feh>Ug z8r<8>t59%W+W?qS-Bl_UaR950NmlUpSizGtwYZ|eLYlXln^{P|arWnkg3e7MS%+O) zp*lszpg*j7KtnF&IUh6Xb+TMHA;>+5l;6gdZYGO`O+A^5KQqqvC-{tG9ZI<3=1SD9 z`^Ad!KaZ1)vkGXT-!Z0EP?OVcVywKueL#R?Ih%3J^a!4k3fISY^f5P^EL$okZM6RY zD2UCw=8|o>j;~Xe(HcQNNI>9IYxN6n+ABEbd{(WCEX{| z3{GTDr68O1j&lqF>LNIW6xtQIy+dGc+R@Xy#8T-Ry*3@iqxNYYYCfNwJ4;hk>U9yf zNar}nWRFj(B2L~TWTdiz+-x=*L(@|Fi1ge-B)Tow6K&!8K&cA`*Bx&b9L@qPVod1Y zWW-ArSN{N2QqTG2c#uw3RFJzi*Q6fjtXml{TAPIxz@aW50dO;>)DPxlqGT$H09wpn;?Fm?GzYzN@$Fx+L zqe^Bgl$F+@VR$5AY&f~8gsA#J>kPC>A2q>!hj=+*=~Om^i$IC-H?(vwb0;`vl-!z< z+esRZz{Q8dMdIUhi4^L6;ymXQxwmhm0Oem?yWpVi2mT`GWIY{<4gRPR#9qb ztGEaM01~#I6V#Ir60HR3wTwxgS9!kXu=z4YPZ|~txc*TtQ=(}=0i^@pBNBjHi;F|_t?WMt z8JhHPF(mSiX+Qw|VofFM(m05$nlzp7zj&C_TJscvz`rENO&a8iPG017hnHvxo@&Hy zM#MsjT)T=!kdQ_9F*&5jq^Ti5k$vqJ0z9Y)!Igs;W%tF)xZAAxjgh&v_JD>Fmv;)) zouy0yrpdgzmHWx-_YtT9iix(?-hvuXu^r$;ihMgJyz*RPU^2GOrj$`~liTQG+fQko ztLbIzTj>1j{{SQ63utl@>6uE%Cc@z)+(Cv)Ys_gyDzegc_YfO2`MM0@mYHcyxPxPH z%n-2r_;K`H+!10TgCNIfIODOGt0%F-t8`SzI-<9l8d6EQP`=-V?e>Bk>ekH33tq^!eI*^grkIfy}e%WhE+3r4C5G z;w1Zd9gK?G)m-DBBjQZtl!XFr5(mwoUI_FlmC5=Nts0ZEwikhAJ>0o_S99?(a_E(N$>ds9R!eIOhAMS+;N(~OfW9TuePsci})%vUNA zJEqh>S5AkLq`X1jP`~8@%1X=N0PmK7Zb3T_?-KfRI)S~_zQ7)0W-Z7${*qd!Joie{ zK{q5GA!=Sz3mt~{i1TV&E?Blf>2neUI084Z+i@2WRv4CtB=KUJ21V6bFK&;l945TQ ztlMa#SWc>`8pBFSK9vHU_>0uKf@UOHfByjFKqfq=)LIdh)Tr;nPm=!th+QZGn)DxM z{{X1iw)7pzG4{iOO7(qqhH0vXtAV*aqr8$Fbb}sOXFN}pktP!81shwKa6=(Oi$X~W zbrf+D7Nu015-s(EEm;yoZ*D_L9Kxhi$x${i;vGYF;22bigsD40mW9OZ2;R*&?|rt1 zR%Ac}YscG5)OOgzyC^yi*McoVNE3o&(R*b$k7l=RcYR2fF5C+i4cwxYdOvG)G}41b^x zi2ncu6zq3PeN9UyIu=zZs_&m&uyQZ!HzAUtj=sN zfM?p0L#9=FdxXQqQeViHA!sNgn~2c*E)W!2QdxbX%fUO`MO4okTT%#8(f~ccv^G@c z39CKeGKNg-)`7SkqQK!ANE1zxHopcd9tW%?nuZLvO;kl;IB*NO%tV-e(K zYUFV*E=0MZdQT$8Ad}U(mnYDbKClV5&GZNl{Lr!4`$~xOohP zd_hJarZ$z5o^KH*nGHX<>khSA>Rxo-_vv#G`KroNtAnsRMx`uB!G%oYm`{;mDnTdND&Ppdm=6Y`sUVf57frib18E@Q9Y*7cO5w!7Yi$M7Eul&&iaAh-Y_Ew=4z$fNG^Um#m&on)k{+is5^dy7-!v4nnw;e zo|^K5GJ=?FX|Nx@4-p*BtZMaDx794NTSzzGn4uXzoF;Cb+i819Jd4^aWaVkO`fG(o z=_&kR?B1Z_0no~giE%-z%?34DYF3+Z7F#HCYEp58I{P8T9qv;VP0A5-9kk#{Er(-U zvUY@*>8%YKO@vV^4en?ZK<6zYuVh?=!!513bfZz;!;=<ykS;nVy?V&uVakbtzYmJ=L|qvC~uA_?jiEyKZZ*&vP^@ zF8n!9V){~M!boh}Yek#D-VTv8{pRk@3N@dZJ_*QGpMNQJD~$?7&=;0dBa0)uu<`ks-Rvkx^a z>WH*(&CeDSxt&vS*Pkhr)O@yq*mnEHLd2QO)T_!KVE+K}jD1$FyRR);?Oy_CYVS*& zY#0Js$(%&X8d9Zm(k$*%riERspWGrZK$@^ z^}?rVEutSf^I!-U~+qC(G2?w%s5*B!@7uDrLl}AY6q<)bEJNS`#X6X+BvT ztC0^;silBdAG|sm$isJpWzgN0Z~`@N$c2p3RHN!l1!TNNQR}k^X_=%IU)6P53sj7B z%}K=QSSdUk!zP;85{46M6M%ChX~QlpvYSO7S;(dSoGksl}hpTyQJwt$e6Wbr#w1Z5{{9MUW z_axk_xrMUNC8SuQ{`QEPW{Q>9yga61Odu6*K9Q|H*saWVdFGu>^l9%6(-I9#r;rV! zzn&aTlAHaZ3;zJbl0~DlE^uO3XvkZBj(QuzYqa&C+xo)A%&oN@H?`p*sgxTLeYe^= zQwun`PA!c@N6T&Pa6tRRlBYf;ARV@b>81z(fIty5usevT&47I(){ZXv&`OQ=kCwg86WU=d4O@fLevw(RPXiKXB`m4Qq$L+pmaA9@y&fcKBP+ZSOf-|B z>C)S38;j~UBk+hWSwY7Xp|Q6DBOj%I9=lJ(w5%e-srXjGm~pgp zJSY0Wg6&M7GBtXDh*QooW;;rwdzh0*G^GR1o~F>o!)Iud%Dk^EG(9Oj2UwvwnEG`Q z)0N6o7mxc;#d5Ka^>+(~q>yOfQ5c zXH*c=CB>_YCy1~(JH!2Uxj5TQ)13up=2C1UVsH*g;jFu0J1Z!aIzM^a9ixV1XPpxV zvZTE8K%{JhkqruKL6$LJ^M!Fs67;6lmf2Q-EEJuu6pJzc07$FvxbsV_Hz0#>2C;a9sHuM_%o$#& zPW!G}m-d%88u%e*b)^R91{{RFo*DHQxj#a8T!(6r>pZt&Q6i?Hi zr8}Ya)YFMOg$r6OZdYPaQ^D*b)8@*n%Rb|$^N8&qHZb3aBjnF8i3+NbWE23MN7~yT z$j9yyz?1k761>~sJ0UQgDRn1pLveoHVpG0XwAHP{Viu<73+uX20V7~cGrGc@xj#2+ z+VJT5R)r}cJRWTvmP*nB$QIt*K@Vuc@!CZvnowPhj{O7&@ue9~S>z~}0pbmFgJoGG zO`v&ILRtzsfhVLa{K>FoVILxMM50y79Z3Gg)D!@vTKE3j7?Vv>T#>3gz*$~`LR2^+ zDxB1+n4N9r&V{7hS}a;I9Ns3QGcvTLGc5p>oBZRy+A6stY*hxw$n)M!rM#yS07tKq zQhAB3Hp@~;UzXj87Uf>hC8bQf^MC?1?{x)n6RKq5*#IR#k~b(ff~mlhV&rir^3#h_ zg0(3ProgR62-I1re>o)%D4_h>*VY8I*Tbp}Da``=>e}%?r_H5vO|sHZrxbLHCdE-R zKJ?=f!_!t2z*2%jNZ6Hdevm+rn^IJerz}SRZ2-9nt8cK|FRdwG3DItz&_Sfmwo70w zO}W7(H;WF_2KtYfV3zd_dWi?A=?;ln5WA}69xV_A)K>A)>L?s8_SFuuvs(n->g*!G zoJ{tt`IDMN!jn2(NCw8hMbg2q{uh1F8!Pq zKJdU}@x-oi;ye5jpL1=m4-&LpR@|6ND?8~16}MgZS9%|4W}u(N4z;0O#K~N)8YLpz zm~}-F#(#9$I?-`Fx|WiqSRcwK$*8dC1Su!B@uOWdFvv54A?#!+xX4BH zDP%P;M+P68!>OA|DcT!NBDnVR2rAEL988c3*g}ug?kHbO5?sQImv|ApNu_82wl=&- z&=%l{BBFc1aiOKg$Xay++(0WcawbOui^e%5MkMX zgbhUpZt>$=^p9kW)?Q+1!lqUlDmL3=8bX^YU9L0tjcsM&=brRPuANmWP41O!J)qkq zT$+-R-745`5W00CRousulW1K|xu?=Oi}O2@-d#AQNVSpL7O^*+VhwP|9}_EawljWS zX=((eK)`0Dn9sUBN>Q|0uMk;yC`7oFX%{^rg;pE#)~>$rO3`sFssx?LW96ZDD*Eqh z!=%c}cj5N1_1x}yr!Wh8Wp zO_X@ax_wPjvkK7LyCp}Wzuqo2Hl`V1Ax6XlZTW$f+nFE(kYGm`Q{1IZECO_o~v=PINeo~<&XlA(ClT)tpZsHnKo z2;TkTisXJ1ZMWK4O@~{EzjGxt`Z=|Qle7phv9s|FN^_G0na7G4ZkpnCX;$ZRXvz%C z#wl^<5L7*l?`W`|BXPr$t~i9O{lsT<+wRpS6t$?RlMNzyGF;^1J+`IEzqQ4T7;tVR zn3sJBNhF>G6)^@!yDsw78c?z3&_>8yjdrz+84e>-LdC~uy|$vEX7LPMD9pCL8Yxx$ zK{&~2rTHX_k|S=gR!P(+Xoyn5P*QF|NrI<@9}HCKdNiBrWhgp9`EAlQHH^Ea(&_1K z4Wye`SVxz;t&}7u5l7a7r#0opCpt{j(@ z-7SD&V%k9103$j2rPdA(CSz)t_LTa2Bj3a`h3T~uex0IiM9Kzetpp?hI{U%ac73@- z`jiAiDmcngP*}JLgbmD3F>_%sS(rF8MjmmtiBZ$A5l*mvLDnbcORtqB3sE*bE@JG} zb1p>OElE(n7l>_3Hjo)9V!&G4MMmtB21%79%J-T0EjS+vy0thprLss7pA`CiM-e!e zp41Sn?akvtaf=gKf=esaNRxnFSM>mA$r^sv| zw$R)NE9IoJ@O0uGQ`$6;NxU`YR&dg=yN)#33s~3--tk6pmxw9)irqx1@{zx){K3+z zZsA4&^C%Z5iL`Z38SUVTDQHiEpq>G}qPnx=;S==-6!YYQdd4)=@pSD+TAzJNR{sFK z405$4Da(~#uP|!5Ekx$dOeWSm6Fm#%_m2rF>Z?rox)Z_FV@h)SH{>y;JqvB%qDOe~ zpxz*MRnW97f)2!Yi?NYDEvIl?+Y<8+DM-D7iHqvGGAd@S{{Rqdn|YqA+I26DNjDMr z?7~{T%u_6s@fRtJ=qXy>1w|n4VOBZM$!b_yQt%e{k3Q5o9fWfPc$Q+ViCB?rl`IXr zz!w$gM6EFjv!IdK#Wlnky;jCAmTBoyu534tj6afCn-)zab16~~qrULMXe?ou7!sc5 z>?Ge5XS3A>DGU;O7#Wr;7{%-8QA)az7aIe3QZmUxrVtdaZbjnC(Q)ni)vd z`NC~&ig-AUQA5~$qBXHldRkV&L|8>w&IviZPjrQlI-A9n#5LJ^T)K*u2Hi|kOvTNl z%ShzPbPYbE26zQTbteDQqL3Ad0e9K`-y7qtQp6p%)0}ww>9i#sMD#}Z*ru?t>N8x|UFz$J+Qwq7Vf!aM!L#5V} zZJ(LX{7<%jhn*p`9VgduhP}5B)3A(7AX`m|v^_~V=e1?3$MKFxmTgTFd!Kkr@lrPf zj*+)L_AwU%mX=1Vo5S3@49x7S{bC+x&zGf0`}U6V^%XPe2Yc{hWz~T1BvUkFE=f&_ zVXah@xyiWtM|P^tsUr3w6?}R{h(V5*!kEzAI?ml!DG<74C`7T<(i91hw4I2!<{2MI zbQ>$|L`j{1BXI%JZDGFf;KZN_^&i4GO0je5{9)Y*N-jCxI7$H>Imh;B67A%}6mW zfy&CfdDA-9U6t`~Lt)b|79mCzEj>X$4BQ`^3TRoY27|dk9|J zA$#?Y=FzD`xI74T62-RwF&TtJ^At%-5UY`Rp3~*XNaK#&M1DN)H z#YvCQxRMDb09CF(v=eZ30d?BEw4)=|>wziWAyRUI3K!Z7coJb$d_^Ss6jSB8m2LHo zUh_tz$rE{UUjWmxy8}x~GNd;08`m)4-%`G@=1axaWxtyqAaMmnP6ru8!lmWN<3b4o z@!b96(ta$&>852BLbEK^vYJDSPOgg3caJ8|ty8n^xUy8GEU1z>Jz<*;NE0Ji4ms{m zGww~DU>KB1umXu3UOs8EUSbn}ztSbtx_C=~k+AlF6D>u3qn$QiTEMp5V&-^w$T{56 zttG`IvrK6~y!M`*hr9;z;{Z%z*|n55e1^SFuZs@Rt+^+PTc=POmu;5h<=aMtAsh>G zZx^jba%Q?C1jv^QEif$`1JfImke5WWDFWmtb)R$0FlNVzEI*X;>vDE+A@uyR=r>XO zMtJy>@vy8iT%+N)QmOKtF1`)?zo)!r+`Rom7SvTcQJHdS^_!JAqF|4yAYnh80%--7 zZnWh5O)JOVIp;Mbvs!DY&Zm#hHqRJ3bl=Jk8 zYvRK-Rd4uqLCcaq=2Vlw{ult=V|R_~b(C~%8()AhJ*q#5!Degtt)IlzSEZ?r79`TE z1$9&h8?Cj8lcsmnv%{d+h#4Y-a1Dt2N8@WbUyA@{sd2x@zTKK9!A${nOCH41~kDex|8M z?i7=^xaeR^H*w}`>9q$)!o)ePzv5ghIf>n+&9w7Q5v1H%QLgy|n~dfy4Z3vWsr_bz z{=wxPo&)z!ykTt)uuhaH-?57)l$hPzH(g<9aHIu-k`D#|Gg-)<^QH9-*iv{u@ix+@ zEG3vzscg0pVC!l>A^xHvuc*)6DAEsDm`GxVaZVMKs1R1_ngs9jj-bR{O(JErOiOu% zpsOz9?Wa3bWF-G_LgYeq;=byL|q7SRd+xrPd=`YqbqYVW<$t!S>>Rk za6})fxPp_5+aDQBLl3B5&X-n_Pf|w^QMJcB7`Ll!M+`SF`-BWg&Z$l|qo51_0Mxzg zV2ea~D|KF=789tFu6peenvNb40pEvpGZNrm(kxT%NA-l#X>h+|<*7I8zw(YziD%nj z$cJhzVN)`!pCt=78cpnXf@Gxg>SQ6sCA1%uYTf{J+PbO0HinX*Y(k1U_le|yGYKV5 zEGb)&a7p_Zyve?yoc10e_Ki?m%WbkX9-M6xx?hzp6iTkXn?OqkOcgeer3Rb)$bu77 zMs4B%A-)s7@o~VI_t%CZPW~+psE`6|I1w(xwY4!Yf|S{?dFumKWt7PDle|f(Nho7= z`hnP6n6Ny=tVJt{qL?mqIG+r*yM;K|(yymO4$7yN4a8Ucj>ZX=ts+&!p{IQo_lv2B zaD()eB}+%8Lg_K&y0(X9=ENS;&*?r3^|wkoEq|_~*=IkzcFUF+s5Rv*fUtNyVe1u9 z+H2(k9bn^-&dToC2_R2yxG1Y|;K_bjBq!0l1iCmPsx;9Y}(TP+k&|&$9+m}cR+8at$ zxh4@%6Fy|>vo!UCt56*b5~w+ZC6%S*8y=&06-><{`&dWRt7U%hRI%xA^vowUHwIaW zTvaPP@+`1#1iCAXObcvGR9bAAnNicztV(4n^VBDSON5TfjY>7vDctLk8B5rEm}E<( zFCfYg3Q`O#OG!!DAbp~~&@*AnB@earv>0hvs#2O}tlI^Pdo4l1<#<9eYzETpwA;Vp$H-ZXO@jm23fw zajnf+)psT}U&p>63&pO>1#I2=#z$2UxvAwL0IKJXZx#u*5qZgsPdlk*!ru3Ut~;lA zE>rSWzf_d-+NZi(BIzYIy`lk#u%z}Jc}>jAt)dU_CeT&EmkbYR$u9XzfTwHm2Mjfs zQ_}1qmmMoW78igtnhUc!K(W8$1j2f;#@=(PF|DBcm^}04&p~8 zT)GqjheHS4J&b=}NhvEQ%ud!K5v;O4JVsT(7?qnlDXXnaxnb(P?`w#vX`?Dx^(3b1 z9?_%tpAVvcQLr~1BC6uNHSn{FDcoK)Rrtgk{LRb7-X3PbRhZo0q#(--sF=aEc>5<+pQ%`=`-ZRGxQNi+?eNFP{-&S!+14Xs7cHt!gM)@I@f>ac0Gt>%<=BX}WB;rvlu zk|{#mMxnPcbJNW$@9!4$*-yG$JlFASCnGjxW#0>MZftn=iu$bUtKx@>Ws7*$mnZt^>X@Xczz;#`?hn?>)r zg5&i094#tboS06aEv5mhW)rKK({rjKPq0;?^+QM5{u z59Jd>F`tRLUK?#q%PBgCZm~{r---F!>Q>uCr3&|og1XYCmP*yBMBebvJu;x(^?jk_ z(N?^-CRkKEnI^5*S5|#)IN?&sxq;;3b*kfW9HwU$3E1p9m~3`vfxiCc8vp@;3BaEZ z0u%?N5kzRE*u)3-rFV$_GRCjgTq$WpBKz7PY|8vkDJmrV$`PDvHn!&N@h@hnYWCIq z=j4j#F(THdmUMKv<^(yhN0Y&rZgQ_Yup4Cri~jPu52-eZmSX1a9LVYzp07`)RVvw* zQ@Y+glAga_JH}Lait&ED;-)b!%{f%cT3jn>3UgAN=nAc{*qyiEsfYAh3pGwQ4`4p# zo}cMIr22={db;goE2ItnrKiu>eE!m(W}S56smZsWNmGtot8bS5K9QW2c97iLqT2-+ zzqKXHPB5|-P_jG49>#KC1zC9?DAY)gZV(^}I|=%i(MoDs>ljrS1L8qkma@r5;UCQ) z5<=lYRniWj^t3oI%X<|OZt*yS+6j^QsXzyyU)~$pl)Cp85JmVlT>{EU?PyOr!xGI7 zHJI#4^t{NUaxS*u0BTH0*`o=xi>FB<=F!?g#VI1z`WSl?0k#!%*p9b}#vu~0BvN)w zH0IB$#?}BtU=ym>I&Tj3DWp!gchVuXHcBiuzWhW%wll=*r6Ze!_A&kE`Cy%Z;22C- zuJ<;%%30s=`OaA1(rD4 zB0o@)Dsu{2M#O>46R^ytxuhv~vQG993#71AZ`}5R_8gPD&7ka5pd!jMG^rkDr(;Uj z>YoPnnWqlokgy3I(`fT4D^GDVCt66dtU-<9@zaim2Jo*(pfaL|r^-;E4=Ed;fG zrX*8Omua98D}R*OTC$Ra?oVF7$}^7@)?LL|mHEdBQdFW4 z4?)@}&4^oAqJ$mdDpb1Wrb~{iTZ%VPJKVv)4@+v(ZHa+(A)67mFjQu!&KjaSIQqg{ zZ8s$C0q-W9RyQ~9Vl30lnS8aw$|)euxRREW)R@cqjM<-^c5-peZo0CisYjAw-!k(d z{CA2bCf1|mr9~{H^br@3k^Nx3N;=in@X{v1lRkCUy2tsZqh(y8eqX=daB~n!G;|ax zW4I9t#dXOkiC~t=^MZwitziWvVfNKxq>IE#xrU`@f{;K;hYA}J212=>XQ)xCYFQU= zF_Q{c3vQ()TV4q{g)8P#DfKjRe`evg;r(C^#G|xoscFrK;P(+^XThrE{K7!grkxA= zf0v6|0NI!hto+ENkJNJ-uXA`GfdN+=#Z1Fh1vIjr zh7Q?+dAhJqAoq(gE0o#EIeGe1sah7BI>pbSU4GCts5*v`dwOlT>3DFb%CRWw(4RwU z78gBx!g`tz;SHrg=@wDx?F1(yp7TzyP;JRSc>tSIUTA7SO1-zdK=B)COq#+07T&}} z_OybP-r*;JK!J85m~=F>r0PiE+5pgY9t`}z*rm!;*#%@badeot_+J%D)lz_Lg2Y3oXhavK&z( zuG)V0hRG_)C-z8EmJRL?5hbrw6aN6FXiJAm+?qi`K2u-`zvcuFDQQ|R5wJUNv=xcq zk3Hck8-d8|aVJvsXBOd5O1I|y{*X_@bwx^{E_p#D4V1o5-Ud=llC-5xY2)S>f;A{5 z@Dimd;su8H(jbeRKwcD#ViV~YrMXFffYO{=y-6esU#NpUB5&dnm68H`2oKX`nJGgd zyC@C_u}|E=f{ccxrAR^3dmV=nVK8+;d=6nYmox$|zyqj-D}63JHnMwx%txiBNJ>E| zw->ZLhfo;Qg@qe$ZjmFIlFNgbLc%qZCp^(@T5PaFh>h3FZ-&n7oRyhw!g^gETZ7z3 zpNf0Iw?c@wylM}CeBVwS#!943ziCPFr6Ee$E)SIb`1^>nBG>?aM`Jv1)%`4Mv?ajH zCnNshGPQ;tqE4-+P(p#`7|RDy=V-oJt(Qi!vil9(^KlhsYXnTnIG|f1-Q&#bI&0~z zAqH2$p9{NA)wdnKWEM>MU=m?^mU?ZxNYjMhBKi%)eJ2h&g;=2bLd&Oi7{m_7_>D5i zEyvW;OI?b2iR~{4KRC46CJB_hvT^j1Tlzy)Xe@DnA#0_Zfh$8yxVN{zJVfqEtqkru zL6iRgNu3UA(XfVkjtyLorrLh6QPb|Lk|oZa(B#HEAvA{Ooo!%lo2DEw1j-yEPe|h< zhe@133kg;E5jv~TT9A89BeKVg1 z9BWuEHvaR{y;~W`&dolOq}!pqWgm@vRWBz>)Mf#8WN2_~psR?j z-X}a$wTbBO6EYO58+zewFHo|}3b@C_n%$iVGX(r>%n96aGU8RJl^^r`_loP`cP>$n zvmKV*Kw3P|EJgmX^Wqm9ClJ@4P*u*NFB1O%0ob}$jhph)(+UVKypocl046ovkETp7 zWX$xJmOd5arf}*4E;l9eQGphrkL;ZPAA6{)W?$+k{-2CLRFij_4avnt=Kari~osrWjU zm5@^=SxhVqy*zCj?Sr!RolUH`!Wc>uqW1tq13GYgwK_>|BG&_BXoFC0So7jhXvihG zo>+4?Bb;h&Exen=L*8w2K|IC%Z~72$nPvt zt4W@fI<{51j$j3hoJ7i$6ah&DTeycdCubXLLYY#4_K4+PPGVt2WeNcMMbV}GV8avH z{us>%Yb=#5%L~E`bD0vf%0ury=v9(HP5FvzPsa=248q; zm8CY?pKT!9a70^dHGw4PlKNU@DOI_&All%E+ukYaFyx=wQ=F;rzb`>;x2F<4JJ~`H z6;~+uLQ{4U0!Jiq77dC(QV6*Fz>gf|Yj}x=F6jV{1SMtdVau2nVr2%-KN03hrOVTW z)xgo-Gp85gs=g?hTIQWtNk1;}uP4Ifo0BDLNLKw}mbu|#QTB*KK<(NKRn*hllk+MF z9r-g6C#lX2?rqN;#5QW2qONav*y+CqKNwV?*4;LM)+F$EF)KWv(`Qd%a}F-8CA~rM zGa+)$OOdhng?|pGP)Uo;KjBuQmDo0-JAoV-@SjpkXHp11_Qk&xzcamAL#HH)0R(j7 zBkxNnrB+Ya2+^v4gi3_l$INJy{UUhJg2$X_63GVLqNiAk+{iXeqivGHhik&*O{o?M zxZk0TD6RM=nM-OYY~QefpZ@>{^)yTbc}unVv`6D>VctNy22*Nmi?u1Rgd~+JEG8Jp z>cv@*v`Z+0FY?9Z$*%=dGF4U{n{1Z#3+=>g1`o*^MHWG(#Ii{U0^~q0)&cEK^P0@h zI*sI=T9Pj0s=YmQ#j?l>HAYgX+ite7-v%~1tCLij%|x(}Pqam(vVNaMnb$6agY62o zrI=y4mKH8BWpAuz0`LNo912LiuOD*&#Xvg0S=&*r%4w5A)OuJ!%M;|YIHF+%(Wxmn z0tomYCu!JqkV^?F_e>zp7xN6ksOAsyixt+ImnLPkYd^)(3RR`d)}7Sq&iusL%3~75 zrKALoz(Rk6303X9SzfyiK*V9S4#RGE5)j=G6x!T(iUH#H#`<|C5_|NfaC*jKqE>=+@XA#XbqbkovQ^%OEV0ax!w{kq1<9u5;i!n^? zLVjV%iJ6DgU~4}Kl&s5-G@@@OaB1V5B)U%0QC>{ z{<6ncvx1?U*x*iA>W@x>tEtzQatB}rzv&Nkm{W2n2=hvZJMSK`0#>0EU=I`Y9bTT83hPj+qY9(2mZD=5GL@+dSx(#y{_qLR zC!3p_LfUXF5zxdUcNH3+tfYnXAzZ{+b4qlNQ5^-$PICy>mg07G@}0IMN8@u2d76L< z9gHVwlJdYCCLfunXh0-xA|(JOBNOf>DqLQ)APKdKc)vfiD0o`CTQ3R6!(R>XnOULtcdEH^w5L{!l@>Sl>34Y|x>v$f!#}f9HSnuv35|#zX z;y+N}H@5fYClibF9~+nei|r3m?%vz|q9oc#UB}^mA=QbSfw!t4h+6FVl5}ZOhWm9r zqD>-71+TZ(A~KGEkOu}NvP2|l3bBe2AE~n^atZ_hPLd*9O?Wi^n_sj*WSt4HD%^1s z83lUMdPQcHO%51sgEFMpeQgGO8zN>gG=pgt1=QSq;sKZPYMH0F=9}6KcrmwSEA2ko zE~G0^7V8&YCe=uG0y~%-@#C3;9_Fl#8H4`-D@$Q55IU^xe+{6$;a>^jOr_0=1zwj? zeuY&M<;EUqdKQ*kPL*5!^esvHD8(_%j3ZX3=2YbMN?BnuGeyL@Q?jma%v$UrnG+NE z!d8A|#jS12rMutd2^ItB01;(4Y@YEdw4%-HV8}deK4!wwLq8VdP6U?_(vp<}f6f^3 z>&!7hTZ)-V8x55#ta1Jb1YmsQmwHlVPdbw0ZUrEn;;{I%@fOPIu1ZSGhUL`Wr}UnE zpsipFi6>6gzV_iqb1A-hV%BBcm`sb|DV%*)X*`4uzjy%2w32~yybI^?g7IB>Q%bs9 z;RCROH7($z0xU;e;bw|csa->o4;~>dflo@*lVC;QZJpEUsx&Dmc(m4=xuo+2Tsbh5 zq=Ib$eBi(}X5MzQEiUB5jev1!O~O9D(aGL-QZ4vK3NjDoA8A4AboVJ!uS%^zsC=Y# z?GXxndVYgC^NxIhK!lzQN^=%r*-4a5jnaK5+5>eu>gG}EKWNpdcP~DB&xCbdPvJEM zYb9Avwp(l|i6rrTHDRS_m`L@uc@QC;amt+h!UBj0Q3A)b2{7dB#XZHm%ZhEwSSdR} z#{$xp^9yl&=_HaliZx=apB^K6Zl`Zp70~O38Q#Opjyl?^RK&Qk{{S$;w5<0Kf6Edo zm}+uO&r)1TO}?T660PZ}%%k^QKvWa*mUzoN>v!5IZz(joE-Th9@8Shp?*q)Ca#OB0 zeJVnTBiuoM56%@KBz_SJ$5KK^7fk`MQi8|dcy+^%*rZ-L{mKlD26UR2r~R#oZL-dx zskbd&(zcAxfPbF6;R^a||Abq5k)S?k$IKN0)ORY**uQKZ>RKtzh=WBnf zZm`8Vhh}V2c27S@FeAkEN=fe`RX2pHRJ11I+obOTj6pmeWn)T0&FpOjijyHS$_ic8 zdnV8t#S&$<%B_3zXcIwO1rDuCnDu&v_V$U!4X8UMJcOVm5=Hj@u^2?Ub?LCx?G^(n zGWiu*<{o{`16a_D6RHP~5g<8+{9RorVw)u}+LD&o3n?PjD*pgrBkq}1ZD~qUqMq03 z1I+!Zu8)}0a$!0fZMO6a^w2l{u@IqR5bDwt;3V)O@9j8@RKsZd%RbD|AtX3}pg961 zwCqZ$Hd4}8eeM(o9pF7p{{Wt6NM4Y47BM%cs4$Wgty_;xqRPiIT@{BgR`h}Q)_4?exYsD1-~dTnOd4F9DxlIwTB<| z1#SMG(J-gZd6p!Dt8Jh|N_8~Vq#$2bz!TCZl-Z`jwJeT$Zerlfo2vt~Dz<~7)@8}0OjS*`j_DDxN4J;c`vujxg95#kr5XB4SLt#)m|t${J6 z{uK>JIccrUJg+q*{QbmvH>hCe+nq!HqC$d+zcK7n^ix#i-^xmJs?t_cJivMwinP@= z;P=ex)qOy}GRk6)3i9D(+sm<0*Y%2qaqffW{)vy2V{9Y1h@K zud9I;@5B`)fmWK*EHxWOY+?W5?5<0pIVlsYEdxDhVeVt zTE8njE~1B-a494n#v12eIy-L>#~re^7x#w30x)|+?HI)M2jR!Zlhte~BK6y7{GjDX@tN^>&r9zhJhb{jQ0J_9HN!Zb1?m~@9C~@sB5n_<5-aP4l z@v(?xWD7FSsS6`@1IhY8Cb60ojB!&`#X@z*oKgNLFlXED@AEEgZMeoh^7dw~YYbO9 zx02{kJlw@ttk(;UldEg-5!zzcFaRnl+jx0ZE6f1xer^mZTb^Rf**wPzB~Qv-r)`8&?9iK*6KfiiamPr^_0NMB7{+D4 z$vlH{dGxzcB zDQ-NQZf_1KrTJ|na$~Ae6EX)u+91Eo?(v*S6oIRFO*R{6PjYP!)5p!a6R;4%>i{oO zi6joOQDDR(6bf=V@j4W0Y-j+(Yt)2HuIflqkF&_lxkQF9*mKK3htXt65!cFa08vaz1e)Cc) z`OSwY;Gj6o!R|SRTCa$z46QXQ4>S}=3EXcOi90_q^7Sd@DEBHbrj025YNCdViU9ur zss!2)`1f-wl14Gfn}vfjo{@^GO*3>WQMI;%K4Vnq^cqaF=xwyTrCPvr?-}Wlc|6?A zs$UB!bvC!C#lXe5CSg=oTq!OoDYc9tsjz9k(LPUjL0M6?hcd=x^vhM+BW|?NLP@>t z%oG_x2;*oNWfY6DIB}FZEOh+6pt$L>c8dnbFmHm{h@VMtSaWD>5(K$>ULA{M3z57n zZNDwMt7x3(lOq|4rPytho9unz49w;35x2Mz%3Tb)_sM9AzC{aUQ`*J7DzWZP5g=#l+T0ubk}dC+nj2^ytlV@{=Lmth;J<@Ozi za&{5s7sUsO>Xvb1C+btr2U<#sWm-atM7l5XkA5y~xgS9cX*zRi?Dp|k{LMZ80MS21 zU-cEkQK$tpXnoKA{{XQ60JGvn{7vUAS2J;x{ce3_<;*PIAY3$ovQP)`f&EV;#S8s( zAD>ZC)SK*k#OoB}2ij#pUZkIuO57+wL{0hAB}wXc0zHjYtx6FF6m}EzwG~yQttg>F z)`JS8z>}KkGct{-0I4Ieh>{z1L?k4Q`*Rjs0J4_w*jue7)TvvAi|r3@QmL0EQiwtS z08dChBj1MK?$3E#X_#(iqHcf!yAx=aN?@h1;zY%V(|9n4B-(FFXi8K#v?X?CS)>xH zYPaDX3c7V(@*Vn#sZa`13HOLSdVMmXNl5`mv_0ZHUfT#$ZLBF=UISCJ%9&YFKb%LH zE1g%`v*KajIb@X)c%R{la1!2OKv3&*#6V=4Q;%A}lg;9OkS#vs&l0pyX5(Z+{UMnAXva^XxjV-nmeL~7tx3oY3u{Zm| zz&G4`!e<=!b)=EQS&k|N1=WQnzEAg6z! zhZK!hJR5Bc=>cifHa%?%<+bYM5$_c-rD-ITS=ir6KK6+utAR&jr1prsv-*>`x`$KN zBywaCdwt@DKSN1`ktV@IYjugmAzo)2dqfgV(Q5;Hd&Jh4I=NR+<8Bt*O^8rDMJBB+ ziE*-odDNwXFY4YbUK*u|Nr0lCr@U4yjh{-SoozC?8+ItS( zS*2OR56oj~{6pjf+VcLRSHdp-v2C_gqQD-sZQI&B+~OHmW#<xEnR-& zpW1kDtU8snQngc@G54Ra@eLSud?bzeg8eSAQDJ|)RH`L>HUKKx3$#o`m7yZ>7FK2- zOX`SJ0A;G7SFW%x_KVx$*A+_4y!A3|2ziNwX;Kye3LT>=X_d=33KhR-HeoD$^(ti! zHnNuzZU{Dja;G!dXu5(P8~2lc8Qu-0@aolD!%}N@mf^g_nDu!_xc2^0lXW}|DBH>h zQ%V~YsXRxaEED3zmStOJtif1Fv05x|_JICyYuu!A zdTk7);ZJ#i*Z!5#^$>L$ZM*TxA3vnSI&K+5eU#E;T;%;{A(iBPk`+E4a|DqF>cg7OGb@k{sUuF12FIjIrD}e02`MJ~ zf&C&9#QG=c>>}D!P&e-nl4`R-MM(?e=H57Q+Iy5Uja5coVB8P~8iyZf7-FXc#G-&w zmZEz>W@Wb~+tytLcH9#K>b*7R+E7Z!Rk)6CnOiv!AH$YUrB~)Gwna}&HHh2P3c#@k zNKx4FyjNG{+?Sj!@~hkZqSxg7)3OR=Oe4zz!6YL|?k~3g0FB^y<|YSt@#7vr#pCHJ zf`Po;f)q&ua+{~}un|=#w=+$XeIV^_v3fjNmS!+!7JVTlFO1>H)ozv`Sc?ON<+<)-7aPkq1W19hHXX5aCIvIjd3^seMQJyccNG3vGtf zP#V?N@mjFl@~(h@wA+jBBEn(jjKe5Xk153-Q>MUu;G$z{>kHl$=~bqh(vk+Qq(qg{ z7Qau;5ZZL4n+=5}tw;BXF)Ed)Aqh^D_1F>lMTZj>z%!K)lY+5B)Eb<-tS`xVw*r#1 zn-r13k53sVm~G~cS<?Vt=2>xD%} zS&vs=rQ^ZVHB`M@l4R=}kOw_u&ITR9#+Nkm9zhC9?P4R%>Z$Y}X!9~{2Y%8!K=nzP z1L022W zR|Qkst0VvcAnqVkhDrgrCebv)bu&h)A;Ge5+Bt_1Wr!J;6aEB5#J$vk$7s<100$Z5 za%~BfTbd=w;_*`G^X*hzn4vS!v3zwdDrR~+MqU3tP@Qj~h? zjb*j17>)*euslgVZ{{0Q&pdU4rC+R3iq$|(&M8;kA2Bs`Q*JBPNf(GJN0`1XzeqiG zg%PApq9lLUyfQk14%-Nt89hndeJ>5qQ^n51@Zt&x5_2PIBpY;vDb{Q_+hcffGCNy- zBePPr*hH2Svk(SNh~6Z0H0f8j5Z<=zZg}qw6!!ya8(-Q6#E~l9p_+~Iq>_HZCyfxa z*mmgxYGp_?QV9UW>X$xd)DVNU;Wk*Y9KsDcmWBGy9X;aBT4W{z zXd_k4q9_@opt4Is@YN>SCg1Ux=xS~L#P12GR5;;t~nSCK)2H#F1)ZpBob*mxp z6JxozF=nYa8l5Fg^2$&ZZSNYIevNg@mOEp$^tWzbfirEaxll#a0a1vqBFh<-HFiPO z{G#P%T`jCXQE6QCA;bsAAilqZoF)aic?`$?HEn>ja&>jiDdxTX*W z>KooEJ}K~fil>yPA9dM<9(599(JaK{PpMaISo=c)rP!HS3TY?p6{^!v_T%-5G6Hj% z=2E5MR}oW!{{Ud6SZs8_&U+_owD*b?B(g_jnDs?Dha_f!3YSSg_QZKPM@OG{DRPK6 z{{T!J>+D|O8C{3Lo?A{-R}_MwPI*@5$U8$-5=v(e){tG6T1r)AB%t0sZ_8w@0l5+t zDBZ~FffZvlJThVFiGwoCyJ&Q)qIrrQp}6C;cTJ@hwpoDrGMad3m{nPpJt{~xDhd{h zFP%A|NWgT4TbXeo!c%BjO~MlRGM=Q!v!cS+ykU2sZ4_{q-;zuOE{Dp zpUyv~RHxqrA4CZ9BEaz$%Ah48KdY6Qd_O~(otkwlOG~t;9dTyCDM-0D_5wd;n<1gT z;C>NKJbdD(@b`!5$!1NzSU!nGo7>QCrH{H&q4$Z}&$hMh#{y||jRSQ}eHtY=Hn?2; zW?=7&JoTK;{L`MDb!$YBS!zYHqh{H^q}!n*bMAeFXP!9MPV<{kN{dS=TaBm?ZSF1) zu@PkPRSixp)r4D4_a}&~7|yXTBV=7KzBX0RMgIUh820qilvcGT015jCO`@l#X{*v{ z#w)C0L=Dg4hbASLDl8Z$U_ig)3=%TM*Ts(4-XD=g6H^6f1R(sNh<2Z%8g(&llxeW! zh%oOAwUReOr3$Pm)Ye%RaVbXN9|7)@9U+E_ZCA*HmUu;ED`!@LUX_^}hDrIjk(`@q5HTzP(_8+X0q;iWAcs^g{N zJNJ}*Q$G=O%Z2AIqG38tlfB642-K}=@9iH*UZO56K9Mne=1s8sExPulk`g&0IoBu9 z{Kl5IK;Ubzz3aqhs0}CuY+t zb#dC_2Q>-fH0c*QN#AIZ6S~c!C971Nm^x9iJ&!Qar(u3i5UsYZwJUNuNB5Es2d43C z%<>Byn1suco7(V+#_Xfe-X2uak!>b8Eux@!xbGd9Hb}zi0maA6gb<6BAK15t8$fr8A-8wt80Ex{>uEt4et!tlALLi`qDpUv(vnF zr%eN4d!B|2Mn-3vMm5-Le&S7K*Qkx|3_r^wNVWFq5eauLZVicvOoRG{jXJJ&v|ycQrdU!evYkh3 zn9fvV8Pe!JYK6>CDA|cO<~EmID?m`#o5b@plc*~kVrX_B#S?g9pd4Ys5Ji@Y?6K5F zDEP?9v{JKPqdiDxRX%t2<&>x7D&zt6yleg)sivt+Y1F7IQh706{72!GzeH-KWT~cI z4Y)gM;w-im<|)>Cbv;K+L-2eV=f<}{nxMR;c}nuH)NYtZC5YC+8=a$0=P2?O29@SZ zp+JtH7#q!H%^5D0CPjgBzo0_{Qlw#o`F5k}4MjF@(%u63QYAr<%m-ya*sO?r{{Yq5 zwm=QDbM)pcqVTmnloX;-pe@k?A~>HfDfKBe`3wdoEp)9S+x;RvO3CG68>IDGE6sO; zM~pza^IsB7ASPV2!0*Za(9uxFHKjHeJ3R1D{n|nNB1UipLQq^FEcObADLEvqrAgGK zilx`F)HsXoLD&hG=yeM+F17RE5^(_)Ok8GAq_VT1eD0Hb`#|itsp+kJ?_eU*)^Y)= zt7$ap@XLR?+ljdRL^RW~0;f(_ndZwnN6Y(5Tk(cc>VV+SH>>DPyI#izi6^~S4I6@NK@{Bjef8Fq8KDHzDo|T<14i`^o`0JxxcmJ?-S;Xis=r? z(vaaUB%rBj(h`^jjp}fm{F%Mebji}#>NSKT0gCF+KgtSg)m2w<1kA|cYdSC3arr{Y zCN>9?*LZBFNtYBXHarL+Q>k8EiiM5#i!lIVFQul-+}hpPayr2C5jvzvyhz^L*hd&=I1o*-*hcoCf`#PF<=KTy}Lz^$_mhCt1N>i9Z2WVzrQBk zfAJOb69o8{55=uh&&&KQ(sZ_f{J{xH_H289Aru93g_M;6Weu((*!ZW#{{XCN)R_Q+ zgiFe6(s3A(+iAkwq6w`@3UeF<&!moIBqEHJ?rD?lK`oTg%Q6)gQ;r1p6 zR76a^*w(!l=X*rrR-XD<)Q3{7BdLO?9idNd_=TDrOJ620DHv0Vn_^ zNcIt4X_WUTlHcu;m0rW%3Y0o>5_Guwm{LZ?BGuZy+{581DpBU$ zpp!+WF;H}==fs%Bg#trMV0UGuE&m@gJ}r$V`5m&B|&mUsk7Fmk59V0Qx7=uf&V};KL59ZUFqx zf!$M4V^seDnNAF+-Z1k07~3u;n^StO*-h=lc#_UpU;RDIIoT-6Q=SSEgi3( z>>^!1hu2S-(&B7E+TuSX<%2T-?o-w$5pxPSBB<<(CS2~FJ47!st4orWS=^wH!VQ=k z3M!+ez?+W!;iomQB2`Xw5y(5*6L0~PQ8Di_u{!=S!>EhiDrO>|T+^ym`HLx>w1rdZ z?X!i15-95;l*qC+4cwzVMn=@Ibh?ZQ?~J1Bx~VIt=%b$*CaPI)7+jSuH4qU)V(2 zpnyWQ-XU{s67M}?2i{mjt60;#e>T4@d+pls-3(ld4k1{P3r4{E7@UDReM{6z6ah9r z&Iy=uc|dKkfz-7bPdtzTxa|chZW5_U%ZHaPzbuR2Pe>DOlsJ+TS}eDIZ4io`QQ60I z{(Q&nLS&)Bjln%F3+Pm}Ogae~N%o2r3(SLo6I1BwQqrXYqx9kr*hWDuG>dRM^@eI? z1Zhs(dqlEHgCO9syenzl+Am{n?LX1q5#Tqas;eVP|F@CEf=RT%D~s zQJPk(B_!?yb8#UKCd2TL29=S=h?xpWA~#6V7?D~QuoMt@gKaA`n54?3wk7rha$r=n zCC11*4|r`;XhKN}HW1ww+o#UMjQ5RGtG7<2Yd8j21?LLl_PinjW| z_{=z^tJH07@$)Ja@_@PDm|U**$>u25vz(q}&SIj&WPq={Ax%*ly)cGao|i$nzVR=m z;eU-ZY9mDY!jt6Z(9BZM{p{$Ab%1B`t=S3v$4Y@GQhQ>2r^` zmOUsvd&F3(qaEAg69GAILi>XtR=+rveER7>1D)m-;z`;U! z7l<|>!*1cJ<;%LAD@o=UvrlC}GbsbXmO6V;caT8&f;xs8F0HZ_q8l1e2SFdANpcAn zF+Fv#grwT>!gUC7D7d&VqbE5Bn7d^2nHH8wa0{Nh?+n$R9$Y1bK$WtN6*+oOWqRc&xbVO<5(l-nw3IgN`F4KC$vkMxPr2L-H(AzCGi-ajl zHy)$UzqjWW@iFaIFN5MUu*!-}geXL{jmkFS;v8FJaka_m3R5beb_58F%Pn!8=`vGr zFAXmwB~~{Fyi1hA(k?A-u+=iv^%6IZ236~kN73c-KK6)(QKE_DsCuqD!3AvU9DY#6 zH6)jlzv3d`%CO)av`%FoCdy9T#B&Tm z>8=a}CrK~PMUKh?n2}2zL)L71L?)Rs7SBGR66q)Il9OVREdgn}L+27lEAtJ_?fAr{ zlqFyb^oX>yq9xl(!72(n2$aY=n}T?XO-lYEpDd{WTj{?L<0itCQkxTP#l&_DX**d! zjzlk!K|<2B`balOG0~MA#Z1d9N`*r1ymkGuoq-7=DBZ6tsNtr9HK z#!k?DDB@;{^!#h=vXtNEH@VyG7E$vwH8$ZF=%A815wf_LxKNVD4`wk#ePM-4| z0Npq2c!`X($!TFL`)?9g6UtSqHusX2)Lge{R2eEx@Sa^;T=NeNCfDn~F+(&FLkSwH zGG*9G^ow4{Xo<{(ya-SS?GyY$G}4#T)F5u9+zav6F1@oeb!e*PVc_GT~S7plk$7@V*xPV1>T%(JtP~Bd@eY>GC&l1t)NKydG)vuQLa%AlXPE zYPV7T7-q)WFtf{ay&LMSH);uH11COXVqIcYK3uCQNd7Bc6fmVN!bv4i-!6dPJf0#| zN|f_v03z_Yo}z@@Km#9XCZ1Q6)gQ={C5<3l@dVrzgVvRWd3xOF z1O<;1(CM`7&H(M^T@MRXwrI5Kw93FsuS$lSxE$+2KaeqF9ds{J(0zO>`@lyksgpG7 z8k$l(u%|&zt+xaH&*25VL2ay%P*R>!Vybwa??!vmNR5;ke>JJ5K%Z$=_CRSCwia>xgeYK1H`d7ma2`3HL!y1w4TvBld382 zk$O@N_lhpndFD4uissuLpo>S$rApX2bNA*r9Cw^81H8MG+T6p59$v$cNwg3tHA%+Y z0n6U|l5c3MczZA<%Ly(JkfC&&@da8oGnJcAN?p1C0J_&OWPWEltBx@)1r^DKFc$Q} zTN-Y3pXmhJ4EdM3TXW1$xw(pePp)~WyG|7<_8_ZkK_-ie-=)~uDp`XoOpQj7h(FR= zNnq(Z$pG{bDWtv-_$n4WKo*gRW@gGwljU`};P!%4ok2~h3oQ>Xjo`|2GA^Zu25$%G z;LR(wQNoiBToLh7mpyh1PvNBfjB50Gi}0I|-oqK$hbF_JC^Kk7yV}TCrC*UT>C7td z%?;gtC&hlS(2XZh^%u3HC-v-S>}6-^Dana^XP2+enQ*lw1e0#UHBJMW?}ZVIveu_8 zr0PCOt@uGLPf-f|&m&^)Tu%-dZ!8*T5xB|*-e(bUDS0-B>BIJ7*65h5SlYbqQfKt# zK5%Gk%$*?pV^OlkxhIHl`W-<^jl14Fw#G|MZQdhb1mH}b&itKSB};J)5%!9R)eJK6 zZNa$aH+MC#ti5ts)D#1@+eS%deh7MlS9NGX(S4xKaKCXBu{N17%L&%$(xs)_O}6%g zS)DlB@{SFGw=flu#7@d8!s#L!v4$d;oR?BSCgKpo69$NUOzY1oS|+M*6r^9Tv{7tH zP55^WllVrEW9lQbYH?~wC*S!+ImXz0r(M%qRF zi_Eky-+s{}({z$yj(gCb=@1WzWidRxwb(=Z4TTT@+t@^1heB2f-XxUwON;Nka|vuq zjo~jNmz;T(EhZW(VXxXfw*W@}03*Q#I-!S@6(?kb*j+sB6*u%eU}kDqqHStGE-Pth!&lFS7Lm2lR^h#Oz>yoqr%&nQHd7&4S&lmSL5Z1 z^F^bfBa5q>+lchf`bRSMMx#WUY_fzrhRT5hw0WIwaWwh0rAikD(b}aTWngs)u#i7# zFhrPXH@2@~))PHtq@?g}2<{`Cy+l5d*SshrSUPw6#&$^W5$7}g9~qd^_M$e2b=6P+ zw>F50oKLAEU=MiyOUYYC#_GP&tGqPSGz&sCei=!*19KnE zORSp#9aA=^ldu&i#CU=F(~45mLT|EQeBxAwR6#e1 zdP*h|M+%1NiDPn`U#u^VU>N6<8)$N7dSwV!+x3kg%G|o8((vPRF9a!exh6BVTp1_Q zph))+L4Pr7&QippW>nieSvy9bPS(|FT{4w1gqOCY3##_OfEXHI|<&>rn`)Mg0 z3r2qCt!=zPi>BUc#iGAWpmK?ova6MySMLfE>ReF@<_WIqw)F%E-~c`(-LE$xKrx>2 zrg5^ib{umbEz1X3-8b4FokDelsO@c|@FgLFl=Y0DfXwnINg5fNlu;_ukS`VLxt!Gc zemxXax}QBQ1t{OCy`s;qkvBDl=6r%eytB3A$-j!<5jD)4@jpD&>K4zDV3B?8bNz1& zir84R?Z6{B`Ip)b6!Dq1o;0cop2*pTQ*{^T7)prf60pC|O}_Djb*vvV=jvEns5d^F z9X|Vy^6_!7AB%Z!5*cMurM|G4l=&_;6o39Tq@Tzt1=y0BWoiyILUgvXwYjnPk44d` zYU*%DJHO~p(ZAtN#pteszo>G4coM8Xf~IGf3u%KcwCsmN%LPLJ04W4m{!yCQ!yvk5 zJg79~%EO%fqibiJLn_jnHZ5g&Ndo@>TSj$wyTHMkn>AJvlG@S`>e6{UgZ)0yt7ssD z;(ad4vbhq0IKffal75jInADedH;K_-kQAF<@f)8?i7NmN`$a^}uwr~MI8>0Mx3ns1 zU=>)MKJglD;(|fi{e&+QctKqX2dIu^XIZu7HkJ5-wV zok~&NWN{MKsch3wk+Rj*N;Q!`Epd2|m_x~tfKC=$!pT*Py)Oor5n zR?dlZUxU?0-rvqSMt?|KSWqx|bJ$Osn!Yx$;+-V=t+3)2Ev8BUN(tY4+CN&83gld# zV7r&uZ99!>P0LF#T~d@Uw-Md=gQ}v(9n64HFuRqxw6w!zOHr~w9L9s?cY??2bQMk2 z8z|O;<)dy$*u|a6e-4z~zG0VVrGxXOHzh{;V&1V-NJv9%*d%GOxFB}49cmcoyfeDf z!T`s~@jTq-P6T@b;+dHjckOiDfpUw}&~*Z%$Q4Z9-N-DIu~{0+y?7w{PdYxG)kjc%G|Fq^QiVxvhYP z8OUliZQV(jsa4)(wEqAK8Eppt08(E60QHKN)z-bqKb&b-j~Zff=OwcD4mhx>l}yde z9q;KOw1e~{D1YttjLVdC6%EPuycZY~8>lcEqJZ{~h-4>nH;?7E90ua?_JXxob-&>b zlG3_&KBL##Is<5a1OVcS5T;j&NYWh|t=pl4CIzSbO(tccE|s#R>@U-A&LNn(P07qu z;VH6Gl%+pQe{&ay!IoVyj&p*8Av(}pf~K1@NmjtN4b^kn!2N-XyL&`Kr)a^|xC0B5 zD1^L*r+7C9@PZX0L^1-cx#?(hs8ZTRYHesvmenvrNlxRRdshJ3zoElRa*SMl;*m zJN@I@&;U|O_eGDoyPxyCCq%!J<<;s<_Xm59{{Tq&Zb?iPt4Uf&xE8(aW94lHsFCWp z=yv}AI>oU!dkjPqL&(%_bbjeKfPOBR^QsCZSGOB;2HCe>YFWhE&4IS77y#B>_=(jM zaBs2i6)}5{7@rioJ2aH3Hv?@VFRn{`ItxBh5ZlREHqr8(t#YsYMGlY(ZS;^e4`CN) zDP}Z@drD0=Dzm!Qu%Ye9-*~EyV&B4LN6opFHJWwwJ;Cc!_H>B zY8j1PbdX7(cFOKGkr5`GQ&-re`$eDg8FV~FYIDq4B#>i~SoL1k?RZR=)YIQK!@Pej z)V!+{+@1_lNijfc)RLdPCv~)W|v5^OH%%BdEP2unoTHG_T*d% zc-2Ob{K4XaUvgas&ME+0C0(MW(Q2w>B$n>6*SsBY&2{%$2`LTrDq5kXGbdR= z{uyU*Rb9sG4Qab;N`XoGN2~0T#_7yls-f03>v8#1`N#hN@+Z>2{{UcP$UO$6rRY)= z7H_%j9*n<6zBv7Rle4s?uT!!UT7bU@a9n@;1w%EEu0HeSe_rUf=@(E3HMc*Z{{YS= zjY0~fvS#V;Hlc8&5Mg|AeFbc+4yhs=pC+C!zf0azwMECS)nqKx(iN=Ob7-!95`0Gk zO+<{-)>?M4F@FC5ON|zB7_r|q9)ody@qpNNnKOqfYJOQtK`Oq{=QS!?(tLx&Tu>}s z!-F^OYZbRymeiH%`^99;Y9m!8EUB=4%vX%K&PSO_8kt_ho0v9MF?_u2k##Eu>Ax@# z+l~)-2B`KjwbkZ93KzrizZi#=uJb{o~Ul#(&f2 za4SzK(Wp0La~?7LDCasd^=`?&@0Nvb1>)UfFB|M(N*jo7bUxaFvM&Ll{W5-Y{Nd0F zc`%XsL^HZs=Bfp^t`vecG3J$3_082?UC9MR-VM3$;s&Rjwf9Qb<;w$Pp*OeJ>jGLP z7j}2$K`K0LYr$=?Oj6rJ9GNwvPgw%{n?%lDbP$ov;jU8zPD-<^x1~P)VeXegTHhXG zcE4TYI>M)s6JovR`YJx_ElfByi{GR+%vI3SgeQT_P4k~EWwO#;4>LFBscZR4uXwMf zX5a$5>ggT^_p?u7t%ob#15-b;1XjLOQspSQ#Xn3J|o4ceSpNTq$grwE+oYYt{^hb%%g3(+6V5d z)dC zGqN04oNRuO{DbjLU-!p1hCt{-k}Y*{3S}mPFA{l+1Lo{j2x2gc7W062k^g8LNst4Z;QXHxc7= z^ugApaYlSF^t)PSQqe<-0@{kLP5qs8;J6&`blzy>UMlBGf27|XsMO| z01&?L)0+mSqTiHf5u^<4s5?xE@cD@6aK>awc}r7iaX}6zqJiW_&f-=49PY8CsbDKj z_B(SKcP)TL7P&1n+H9mO5TP1Yxs=XG$jp)!mu1sy4hY!Csp;;n2p#;-ynlsm7fXEv z@*6n)NB$&oa3M)9noL5Rt3sjO6+wZ&qNa~O}#P2`z9o!{NGR-ii*78lA zJbQ@D>_=L5eM(Zz$m*kbYSIYXKDh2HPJ5oh45p=3sGC_n@W}Ny%t5-qPe_wIrMkNj z>Fx(G&ijdESyuX51B^_z=0j%b+Eshp_YuLN zz2LX1la_SiY_-W$BF!g(xVfAlPg#8Fk}xFT~udRd!kmT1gIR?0@kAxN)B_`ZKu= zC;tHBG4^4F06+(5XMHD4f_M5v&H(2?7{6^kTZ&4D2Jsu39-?;_fP)2MNW;=P!91k& z?G4V$TWU1O4h0L?@lroUqXW%I7#X5LDcQWAQbMlEI@7)0CHygOH81)`eqagRoI)4$i>j$=1vZN=S%yDW;K3FQVmbdaZ7qVP*!z=y;{Fv0y}9`56<;=v6e=il5JEZu07lE-Fl} zX}>Xqs1>IF05I(rx|y0PdUjS#ke209Vvv;E+S`3NiiMX{vxu1qV#-h#AVrg)U?*8e zoa#=b@puZE^c^mr+6s@}W}5~)~&zpQHpCq#T6tv z0#asdIJV+7bH}zp&0~rrhBl+hmu95p6D?M0r0!6GWIbWfCdoatr1gxT!}Cv2s_o1q zYA8OWo};LTkgFv5CtcHO^nGT=v5Kp6Q6H z<5GdO#21ET((oL)V+?tX%q^8P?AEh=DoIHIk77o`DzwXg44~c3$2Wx%>LH>9^^t4E z2>Z<{wIMUS~7xjyRFF4$S}$yLwOw@%$p+fO_F4{#jd(UPGq|zpZCOE?I*hWJY4WQEUgfnPYwh$VBROF- zbQPdnu+Nh%4lTv5V`;^`H!Q;o4FsdgY$Sx=VSc=Ih;NsnBg_{nH#a<^SVvb4b#8v{2(5Kw3DB zbYw88)R&HwcL}^+ETWl{eN1_$Lx~q89U!C)`+aQ`UYewtgdOY-tUiX2X>={<~4oSev092}POcSk*;z43KfNhv+YNc)<)6gD>KL65{8dxh`V$4eN2 z=hWC9k=t(2*yDw38(0Cp@gaNH=~w_5Y?);!7ro*!2Ern3CD#DH-Qbl%nU_SMOQ0xl zNapZ5lx!|&d4$`#V1q`cHq)RN5|potjOx6Qso0N9GDkc+Ll*6i4aD( zRJ+@-Gr;{{N}iLb&tSR!T+d07_;`V?8O*6V;xw&crw2m>R%Q_Rx)c@kF`-?lXxxV) zd;witWlX?N(vz2`5y?L=8oJYR40(&G(?3_uy4sVaNmY-udx!CNl#0v@H#Uab3QH~Zx`@O4$(?m`O9O83E}`NnygyV#%)82MX;r}n(JiOmyc`&j1Rcvg{9#WOG77@Y zG~~i>mos_==R9q)Y_7lXQ?hQGobk#-&%ix!0rS+7Z$58{?{RMRA z>`*|z5Ymta1VD^PDV8c0x8(}tnh#Di*xKgX!nMnkq+IWQvDTQuT}`cz%r6$qfeC7$ z2Bk&EA_Q2{kQr!{qTB6l;?>Sd2V_v7FJ#4d$6$Fy18{mp>oJZo2DnO<`oet)Bd>m9 z?NG3CQzDN=h!+uAa+;K8u?uPa(s{ILq?Q*A(o&?P+e{9_m&COkzcQEOb{(RjOG1>3 za8m#p&1!07(g_?G%GcP#fiU%9)ZobtS1XxukdWV@ zBb##-=M-UfsZOaWNJtxQBSGgTW!t2x%1y}XVuoh*X|`q;r-9Z1OBdn+J=_WHR%X0v zZ8)jR{E0uG z^^Xr$>nvqHAf3&M8TddMo-A#qAm|#&u zjv*v;?Hm9y2*(i_S`#mIY@&9Cvg<9KN^}KZdzg2sGA3IAKAUV{b&2pd#ib>gl_A9q zz=>4PC$y;$nJqTT*eOeiJwUvCw)$LFq`IA5EMluYmspNcaeoa^Q3QH#)3gt2_&Xoa z)Et+aD@hw(2&lcXCvN*0df8BP`i;yxrkYlQw4KP{MsUdH4mrYg1R2>yKGpXr9L0;m zJ|ksZUYe2&o0qkhv~j7(_TbJ8J4+)aNm_!IO{{vul)Jhe+*kpzh^-SC$ya35sad2r zli0)gb40&RHZcKqoSzcd$7scv*s0tjhhLsx-A$t8cM;{^$4`tper{u$b1e(a$QN38 z{Zt4a&NpK{GrmI)hpAJ}rN2D|v8eH}-aK&CDQd>KzgU@Il}ouk;cSkn)NKrO{Aw>^ z$Jho(>lxF#R(Iptdw$Z`;o5?0hzcWD+AY=rcui4+nNkC+9ca`!2Egy_V1F18W!_jO zjZJCk$D5UHL+5?K*!)d|Oeb;P9>R5bXBn%?%&oTqTtvIRW~82XO~>aRhe!=}243E0 z(Y}Q0I;}TULWst@J+=@D$KUzIxvhg`ao!YuS=1-a-^*D~3h84Q@r>}~&KRn_D>TxQ z;t3m$edB!p09H!O$|hn}h&F31%b|+HMCt!@Rgu(}l&7wG+7}-b0T`~LtL(0^M@0G3>t^3swwUYis7ks9%aaGMkfX4y@d0DsdK z5nQ|{$+snt*l8gO0GFK92Ej#SU+_qau_q{^&zhB`)dbv|arcMSHm?xu=BmOD2buFD zGTTTBmbEWX=#JUJA4nP*XS8o!d z1n_@J^5!0xa#XB75DDBS$De2rW@cEU6yXWEXYA{awsjtq{6d6nIF8(*fOYI-E$L>HFUc-na7NI=>Oxhy zx_zQiH7|SV7lwl@2(cDE@ggB&NYvUAse+^hXeZODHa7ZxFwZ*Jc?1#oM5<+yE#IY~ zk@kQjkz#k)MZuZ&*O4mrI;I&}g&^($x({o_3R(3sp<+#-@tQQnE{Q89|oQ>Rmg- zJcVGk1(&}uJ(8=35D8Vg?|1>zCsMPadme{~l*>;!EJeLQ9k+n8&HXO0;23?7ohnt1 z>F82oOvLJ}1@0gXPsBm4ZkzXsyp|$CuqwZ}ffX}ujanY&TdbkYCE(iHJk=FRxI$h} zw|}%x{9|Qnvr@FodriE>GI0rFZD8L+$rcwr=>UuKV-(&(tcS`<7B`Jt@Ee$PylB-= zE-_LOHAbqiTWKyH7C5my9-#CfMw!CCORm`}=0wBz)-f>lqR1818ZFVRC_NAw`YRIK93nHnpO z%e!|`ViL69Yw!HxL1j3Zda5+`SDU-9D#A=Mk27i*8m`Kw5T^8<$r~8gYz2;_G0hP( zGV4iJk>(^Hko$P3S(pWLW@iq}DHBa6Tau0gxa;i@!Ib9{ zTcY)fKoko%j{xw0^EN5B9FQJsD)iWcZlLT(($S0_E%I(d3Fa_(tcFA zauf$)!M98HjTXy45Y$Xsq{z=qrj=9SOiZ02N7(Tbtl7$G9L>Xulys#J1Fl+Ni|9Yt z^@$CRMA+(jDmuQHsKYS)t?@C7DkbKy{duNQsn%u`8(Sc9Pak+bW14bs)Vq$YHdXYc zBwKj384uy+r-gHy3%fl{aI~7M3rmSkq^nDS-%#4yK!3+IYD%->BDF0@akpfcaVb7e z%3jhu&%sw8Q61cFGX-?Nfuqws{{V!1N_vLN>Qa<$zNXy5#w9LAg~0C)GE}7$07c2> z9@?d;4sdpglL1{M@@Gm!u@3@&IJ9|dQBo$^mT4sUo{?e2;sKVKS60j#%W@RSHO$N` z>=HHusVAWKF?S{MRlK9A30I#?)k&oP0L(3;bhe@a&@KVE+!OZN#`OwYnYp1t94Lf| zmVPuTV^LDQN7ZZJtTncUu{3U>$KnqgM@39Ji#cs1D#!bNaoTyZmXcW)MXrl>FmDrj zcMYkgmZ4$P5&NbPxM(q$!Q-(;AW%hR2il~lq22}d_Pz{utb zvpcD>8zR>So#Cx=MMw%qPqa8P_n62{_As$62NDtuhxLwzJo6Y7qErIMPTa>AnDc?L z1lwT_bAj0v6s;E@yK#7Ac4q6W`p>>kCfZNQi+an191~qHaN?D73Y=YouECF<>YdsLqfJE;baKY5;yQOemP?+FO1} zxdmH-V#DF;>L-%R!8ZyPR+4N!(O_{6Q}ZpI0e)gaJijqJ0bvBnTgwRvP!>wKP=GEL zssuKIl_U$?+6}Z>Du+vAVd9EcIf`Wzj7Tz_Jz_l#4s+d8X7r%2C>nZ$2$YixLTAeWHLZ%3DT8|w+qz9eDnfAOje2i0MdBPAQXfv%o`97KJoI`jM*&sp-jrS;0^>55~IDNM^)8I z)4A0Cv9@a$0f#>`3M&#SlAC#@rprkngB6!C=|%RGbl;n87vDVTO-W*hU0{t1CxOIO z%uh-aO%g@psk7BU!_04zFni3F%zP%bKH<n|R}wIranY*pK&a-wB2rY4e*(NVYnX}#lJ zJT~NOcv}y(FykP;@2d9TM>Ci9tg3><0R`*IB*;_kpjZxV6$dr&dL)$K(P-MtSBD#B zl5CI^L}kW$QwrwYN(Ikd;#oHKhIAWddCkfMEkljsM}jcgsx@s|bp-o$iDMW=>Dhtl zI&ZnR5oWTxF2uCL6j8q1#Y=GownJtx+rI^ECt+h1dod^uu`q6u1^S5Bck=ZHNT@Z) zip!W;U>|jMY;)Qyt+$v)TnSq8PYT^=c%sX`#x%x@MiZ1Kz!o}pF;%kv007au6{Hfcl*GW zK(?0%X-%61JTaDn~$m>S`U0{hz4V4|&wj|qoOO^U$h zcR7gNxVGj8lic}}yf;o*c%cJhXfsrTu+=>q+0~7KhFmow)QbGY5upQ7CKAt1If|Zn zYCIp=1NVo0#tL;fN`)cC{`T9%re0;aXNzgzk?K7nKK!|sYRe%?QP_xD zvXaAVSR{6B%9LtVt+LvLBaoYpFK|F-JPQJIPS9 z)ITJjC6*AixY*mExATVF8kf`5FDJ2*wX(2N*v$3u`CFaM{LiD)s52`=Z!Jo3ZIkI1 zvHo#~8PAO>c}I`xbV_99rKMcbhnWQhV1RWK&G+vcn~akwNfRu{p~cM-Lz62;-~;jx z;T9m1_WIygi76MRb4IS~i1NXBSP{;{ylQma7}HX!-g%#P`ZMUk)3hU~>l8hBI z?W?}Zjt6gvt-c<-Yc)f8x_tUewD%MO+Hqemxa@wBp;?cbbX*OT)7YsqX_%)ao3>d{ zQBss_l>JE{Zysj?Nm$dd9N5IASem6ZMKtx!ytyJmyn^Ai#|F`6a>!TyW}SM{SKK-I z`HrMh0LT$JKw(O@h=x7HHW5D?>P zD!sW7=OEewQW7`hM@m%R~CTYyFTxhnJQLVKe7CVSW>dvo9u5LO(;+2WzX0o-p z38ql{((@YI3gjdAfITmJ{iB{?;mkKFglQA>H(pfC)2k1*^MPJaPfyH86~`d)7+X$4 zGM-KWn$h7dWlv-#9QhKICFGJ%KeQzO064W2_g4JwmddOJwE{pRx7I0VgKC3QIVDeQ zDPC;6f`j+m1dgzlVrpTxXJAtmJjqnY z<>T)i6GUmZQ>d!RHwGPK+Lmc%#ab<54&Pe{M{KqeZ+btT{O)LXaPiQ ztHwU~@syU5#4^kzUG%m}m3#9G-{8k|Y#Ca-_T)_0m?>{$ro)2_6Difb?evE^l2A^a z`vM`l#lyJT0wC-Wie&oi2h#A^=8}@5w?Pjt1SfE-m}*%;xUo0p{UXsD7DTJ`u2S+8i35d7-k2NbVsb1=YCcn0Ns?Y%G4! zLm8|Q*w2MjU0OgY({s>A>opgdK9>j_!g8M6N9FV=?bag#7kiH~M<QdrQ=H8e^3+*Dpa(>MT3AH$J*Bfjaxghi;j=OWN_1r%&{{Wflbaz#$KwE`l{{ZwqAEEL80N!~=cLOrF%YP0^ z?_s1J;`8`-!E~Ir%liF7VTCtYedZfs#R8xjDR)y{f|P8n&i-Gqh|J|3%s)|EPfK|d zEVxp%DHbUp*n%PMQlRXjQW15Kuu_X^3LxIZbso^Eu=bj|ZkJA)&skJ%9lp{FjA``g z%9W;>C`$K3gj{|Pd)+G;1Ek&1B0*1Q;Z@Kz)>m818WZS7~NV!uv?niMgwL2VU zHYHcWNmM3~hg2HY!UK0v>8t^3{bRKU!9FUgO(n;eW=t(!r(S#?zSl8c6XJ5em-VM4 z@a*tJn=2_>x_|nDHq~vcJ4KDa{ywn`$qAd4LyIECXn6iUps2dw4|Fo>bh?+=&6giJ zmj^C<2+}axlKo|Cs;q1p{{W_o{{S=oZ4(y%07tbIc!}w$%9y^oGOOCV;Pl`|j-onuqmduL1T6mK(TTl80iTm>w-CtlMgGg9lFdv|r zuJc%L!|o7USbkPriS@Uklr*xXEnJ5dZf-|zHn8NFq{*3bsW7!XRHqbf;+4Lldf)Me zoGm=`!X}HamsCI_QN5vZ7G>PJl18F+eR+!$xNtB&Bf4!e>A~kLdzh)YU)hzVNeQ^= z$G_ztkH7G#30MgS<=>zD{{VPzL+VS52S^)x!=uY?c3hnRsC>fwd&d#PYBkKM6AlkW z!RV8C;E9x^l!pjN7CMLJymfI3Qi?)#kVyqSF9{z(O7&Si0XK@`L5luL`|6kJmKfl!m34Q=6TMwva#liTg&R&Pg{m z+R)+>;uJkVh%IUg^DyJ-X|}ul)gRP+NGPK@ zD=d|i-rb|9m$FF+H|h*Kxi+;*r33CQA1G*`0(mEk@dLzZek6LQb(H!D?RbbxFqEvG zFYOjD4q%01b&xC*@7^6T2Z#CQ7%O0hMYF;h} zkypSo(hrm_Sy$)fFQAl`R8Re}5oSgnBo1O_E|FxL_lf=!#!gYn6L6%Bt$0F= zCp9v%TVRce(`ayOFQ*?C@^o9;+jox4pbQQ~wfHL&w_7(BLa*Fz3|X8w+R9R$Hc9^g zS6HLDXNOZOIi=I0+_W*5+wn|yyNNhC)>Oduvo@Up(?L7 zkRh7|$*si~2~twpZdOjfcQI8nZ!((2`0ek4SyZb8HrWT}w^$eEUyF%aypyyHDpZ*z zoih`h7kz-}AZvx)Ds3l|)WK{#ZJ!kS$!()FN-Gd zwMn^|b(E3w3-UWe4R73Y))X+{u-^CLEXc0ASa5tuCorXnae}cMg-Sc$tVA4l%>*6C zSZ+&%BW_aCJl&;`B9Upt5y=S)zXu5v}si<3nGnfX>TUXls;6U{~x6(-;aUEtmPGgx`X<2xN)=5X!4Y*4Wrck5-YkNeHNVhE6u>7O) zR&_GU90LKws2GJ=S!6pb5+|UM=EV zaKso-;pEa)WG7O-oI;v(n%zJK{{VQKF)+*+YBtv;~Gw5;5@_=@@Y? zl#M;P5Js26NN6EiJs|dn+AS?CttDFsAp9y-E7~rp^9q9yawyF_Y%2Q67u0^l z3wwLOLj}}dou1LF%#ikCWP%-S#YJKVI+PtOAElbpO5D(Z|))2*l=<1_LezI_Y zn-wnoI>*m!cC%Y;wsLo!(;o1~;#=pp#5GoGrL?gs+U!(-TqCz{%0HxPC7{}^p+Q!+ zaRW+CQ8SY&ebs;0UF>=eks$MzGcuK5NI=-%q-oX2EPTq7@g?=9h5jM2cFFa77-nv3 z%xPlax%;+-67`g#P_UzLqh%P0Oc!Z0D+(961q5{w$1BJ3oPJ}vCKYlOxdz+xi93%r z#UY>*cQ1dmLr^^B7q&<{krKJ$+sKwnCsEO5Tiz<8jL7+pl655)8&E*70@sh~^Mt80 zBzl&sZPGcu#+8JlV3dJz-W`4!F45Lp^zUTFoNiqFOY(9fB)j_N3Q{*vhb2iUx)}!7 zJ>kBP$!dHm<6+c7mORIvC`c-GO4|KkW4OeOc8ZWMayGW#cyph0E=>&D%1-3NixMJ9 zu(^R{e*|-CP|nS%O`w%?Ye5JkZSyPv97I$~Qs$p0_fk2DFm+U>NlCH4BcwS=C9FLt zws8Tsdy2CG_ZmP&iLV+b@+Q36~QMR)CfGRserA${V;zFx_E1056 zqKe=eg2ty0PJg^+4tr-boUS3RPr9_1omZBP{{VF$56;jl@k5E7!z`+Cm&zSh>mcw< zWY#>*IjZZ5LY`ZO_av(S0C-uR?OOwDWR5ZM8)PhlcP=5$Z!j6HVo8@!$`pqcWh=kb zaDL(-Ij7;D3g?r4bKm@?qCmXMO(c_HZPGM|5mT#XRiL7F`oRYeW?EZcmRG&)%rLKY zcv{%tb`x(!^$%LnR4AuZ;<4F#f&ArF#Qy-I?x?1mT_X@kPNV`reGV{H_8P_h@kjF` z!u@M1T`H{8o@Icm36v1xFVobUfqs{HeXn>$(rdX}KPM_Wg{YEYr0B zNVj-g8Z3|i2d@zMIFzyllsWI(8~mFal0AeLYy`wc>Z}q#03Kl`q^u|=`hU`}R| zcpt_uGc8=CBFiBOnQbceI#u~7ei5LuSb(`M60+c0O~?ab@AQmx@Q;eqMb0@!o_on^ zah1yjgZs)JpZ@@BM#tf&OP+$HC~$ospSXunw;+uBN@R@59IZ{+OATj7<%+c zB}-FDxIemeU+oP)7^-{9@{orCJezG1%AIB9uH~Se_)1Ct0BD|If)_jt2v4Wgklv6R zPnbu}M<0Yd%hbo3QLKa2R^9@PK2idMT9a>-8^r3LII_|}Z%vKV0&Q=+Tf`NVfy|LR zI^!!oNpO_+O~Hvgqs}-rtxCUJdT(!NkIN<5b$N;O1IZmDr^GsxD$XehP_m8rikQ0$ z@Fc!}5s3*$ib6^Nxhfn+0C=m$qZwu_>xo^^7E+V!BUAJ18!HLmxu-RsF=;6UN<8}r z!%SH=W@jCF#TOK%6AIdLK=_X7sT9;-%R$S)AxggcTJXUzqO}kY1CPQVR)Rq{x3o99 z+WfLX0R4F%<)C5)$inQnQdMziYjv;bivjzz5xbvX~!l{eZvrCWQBk?@2EhWo== z^E^SMf>ierv7~D}f3z;vM#|r73m#!Wle&RP{9~w62`h_rncf_aYm z3u4xfk~JsjJ49v^WZ!e~+ker^ z`a;fJw=03MY{HdBae8FtmFoC%dLL-TaZe|b1b0NLnphx^W3!G#dq;JeSI#o0^DoTx zE8`o(n|Xsej9Z72$#r^DQqp}TJs;bU1+`dlV{T%+Vf?(HWR%lW^OIEi{XuBd%A6#j zo%sni^>!z5w#hM3JRf-f0ITJ6)jJR3N4`4`i#C@QE~WwZ>OG8ItorcOXJt{0FsrGV z!;_#oQqUwy6TPqe2KNW28*O;XgS;+J#P)PpHMK2kW)rqNpRxY{=Q5S%&M8JY#Y&kB zw=RnmGFwKFcQ+(`{{SHjh$&|VID`wlf}k8ozRKF)YahlZwS2Ojl&3i`v;q^+Cifj; zD>FtixNU_kvJ|)73h8mBqCc72-W6h5vSyFr#amMx4$_)q{4n&e53tZ9hYAyKynW!R zVuOt*n{yUMr%!3AXBPI5&YxO|+Q(=SVW%3GnbO(SV_NY>h44ttYU&|OYsY*ApSAR(#%icMm z)v~a3ler2>Bto}IxI(@_IUPT|d`kqqqQDXls10)dZXyrfL5!0wxRwYAO4Z72If%2(xa!+% zrAZ+0L`Bjr#+Cskcb53uEFRvOOc*!Fv|w zMD94G(}w3QBB9_kqjky2v9(YY1d600MYZsJBqY+kg&FXu&lumd%J4=>lwb zl{DPOl2cQxB}F6Bus0BLZIJE8kfiA&a}8;d4LTF6NG2>HYPqUAkl}}!nz*;Yw49Tw zeos@451Ijaf#Jvg6QwSF30m0*xa(-xD(elr(warWwEi$HuV97OaD2?GjU6fkB}9G@ zB8#5f&80#xD&GsfO?Gd!jp&AvbvOysA`bK_c&ygVbzZzH`?CtyLX=|W6v^nW^G|{VbI4lzqvhO zyt%!&>mAT8qqsNriouwrZyNwNKJncT+<~yR@PT^(N#Z_G<<($%ZD@%GNLzTQT;AqC z7NVu~`iO6BV0v$OQrnx_+gc-x%I0-!6ug`78ZF?&YxB|xlbOS2vXoRiK<{`sDu+?2<}&AyPspvq>wwz(~>WzW)G~;EUp`Ddg}DFK%i^=xS{x zP6UmTuzxGueh>(u>NCh~SJXh>{KJi!Nv*geyauaGbk-F;ycsc;bM^^Q*=kn8B$F;B z>OpN|T+X|o`*jfyX{E9Obl97Oj^-UcFrlPODL}Zf$I>B)Wq{;Fjm-Q&)D@&8*pbJOg1i3KYArH6PBol z8cpnMowROG;h_DcRl)&;hKCMls&pL$6&5{xdh3*IE(j@r9FfhM`oV9+tUYTx9l%%V20a*h2 zN4$AO@rn9aX0hLlN;O{&&p9oJDMct~-oZqHsQxkOOFIRn?j~FHru+;l`h~LTZqSx z(gotytKxS)=PGa1T%4y%*{MLKYyjksYm)#h6O5jbWCXgTj57798;)}>g+T>Wl`XY^usFT16}=gVxq8uMDORwnSco)Xkh$q}scI@e zSZ&2v4pw#HG{REc!cEWmqS|Lgw{4w_fqC3MA?GgfOV3H6OIDkU#J06oRYma9Nl`mk zb&BzYD_;cIK~;$N;tV-4FpN=}l9G;%NC#4YBY-Y>`bNdtL~u5VrACMG_t&Rh?!XV; zbg$7TWhUk6be8AUe=!IiQjL}BNZWt&m^@BP zye6D&U$96gYkb@8MZLs+IUv(g`a-}RZY>W}r&{aSIL!S`(RyB&q3DxErCcEHf82bN zJoIBMFEfT}Z%a(HT6wh)QbaJIl(e8gB#p@&M%!j~LDI7ghZO5tCN1c7AP@Y;WoITu z&*hZZQqP+zv*>Uhez8VIPX7STJoI;TiWKG4x^I=hQQ*TaH&H?{YKPN^+}eUt^FvfDV3=GiQ{Yh5~q z!=!e3Yda>^Jd+N|P20V`(Z!i_H9UsJiB`jSoXTv(O-Y)Wk*PBJ94)Q21tm%7L~X89 zV>ygNLz1a9u=3_w3Uhl|Tphl#k8_xP$x3=OsY-O*sUaIAbl<<*?;3gGdZO%}TGG^8 zNU>djJo=B}2B@CV%`QU~`5mR&Wx0verAcjGc;5B`KT$5Jg*oP_B|_H)M{l${)A6b& zBwKD_vF0ZBUCH0;))dmD(K%Ev%mpG`aiH#fu79*LJ|#;s=Wxb5Pl|8BvO!aWoyZ)) z5}7i@!$oW$xRJ14n^^XU%G#4|Wcf^n(hlib?rr#U9VF))WV)sbg^$XWZ4x<)S??Jc zlI17NbftT3u;$RE6y!O*j;rx*VTE;<5YawWmPLU{3fd6Ah?|h6E$NjIu#!r8#S9L| zJ*Im2+Qy(xGfr(uNJ4I)gVr+Mrtx`Ol1IE){QbtK6l00k0<|<2Ql0t;trM?6gTc>OJiU++)i2F=2?i4xjx zz05RJ)LLv`l48+o2M|Y(sNrs<^nw+qcpFQm+aB>_*4k!}3yBN*i^LkWL14M*KtjLL zEd^KcFg3kAvzwF8aR*JJ>M8u;(X@6OM;VC~$vq7@gYJyu&(E5ZKWeh5}pJ) zOseL|-0^!v3F;Ja3RoJbB~+g2u{MK@$CozIbsGg6*+0%I{v1-v+Y170evoOy)tfe^ z6mFe>f-7J~D?DO9`95=2LVZaB<`Fg=ZDC+)?|;S~8DEy@O{^8kza#s{S>z?g$`GPe z$v3vqZvCMMoMq-6mPzuQH#;5Sl4bt@F)F#ztD69Mj)rK0d>hj8!R{j%!=fWP|RjlBxJmWBAUv=rkxvY&X9Yb z%b3_1X@yGDCFGb|ktV_d8EhSp0I(M9Ed$CH8J58GhNP*I>1Iu_V32wDCz4NibehC2 zOIfWcbp<==BKLzLZRgDLI{iy)tOO5e{Gv_Rs%iifdcC^Cg6rvdLsD;TxaI~DmA^5t zq$uskJCPk`YU-9kO2v{*_=|z@5Hw`t5Q*lcK}2j%Kp{v@k?KfNeY!ySVq)6EeBave z{JNrEWG_{fZNQ3^B2d)AN9waI3Aev#W6~iLIi#5e6Cm*g0ecW3lNnEzXV&KpsB|{_ z#b3ttbs}MIrFv2Y#?j0%lQs03CA$It0Q*4SkDM9t^l56l2)G8zQb$An2+8>hgOaPV zjsB)LQhl`MZd24L?P=0_cN9qFC-{UxDTpP}dzgB)<0qeq@*chQ_fxZein_*~fy0n;f1t!8%~fV= zlZ%;}eQ&(8buDK1hiY?Vyqnwbi2RdUnj3-kiB%n|%%LLt9?>Rz-pd)uW;rLh`IavM zCcs~BXtdN9bjzoEi(V^c31~K!%7)NwZnl|bO^D-ekgIo#6A9tux(55l>6i_jjkn$e zXBQ!^7h`^~iQH(7HY)n>6~w0D4GNt~jkRxkM?|_3ux>cF)&Uauzs#7hR^ab$kV~dj z(=ymM8^=h@ohe`-a7TFPCI*AnBg&t!B%9oKjzXhtuMs0Mc|fYBpHV}E>=n6<1e{6=55HeGJO*!viGmaoi7CrVa8`tcH^sm!i$b2XC`_?LCcdYf(1n-AiO z0hu|DF2yNR3}Wty3PGVh#|C|B$g&MS22%}PNmyz;u6MS zg}g_YHrfUF_H}G(Aw-UmTpq>F$RRj<^*~ zsNZ4j6|#+smi35Vxr-x*ClOSnldGVC+3gT^HxLnzCC~RV$R-~R46}E((jA&je zr}?N*2c_TxHG~6|1vn5aPiVa_j_`H2FjXN}enM3ssDcME^Dl~~C+cjll@%2%ZOl)r zSX~H~I#ZDPK4D8hQV^kgk8uZP0ZD{&wMm+j;r{?AU6`XYIPx_-wA>4P zqArAn5;9GIQb8PxaS|Mjr7*=ImdF+f0>%tjx>bn=QlVfi7|g^Td(7lwhwlKh)Wh(~ z0CCbO-g97eRasxA`$g1ts@scD=?xXUI*P=<$$O5_?SA!}3GYlyDaCnYeR_MEXvw@ZT?F^jT&x#gseZ2B-2Ud4WDy>?|VQ<%9H!&r5zCsXy@^VN=r5 zMZC>nJ?+2rk4AW3616pl(AXi8mcX}SBhD{}On)hrn6jNxsO=_zP~y3t81!%apr-}8N;`W1DxOf&A!A|10*mrST&spC^x9C1w$g)5=7 zWo-gobsS*DDQ*-@>HyeU;@cRKc!bUsS8*J?tc>|oh-&XNlfk`*@`5auGsATJ4M?s! z(iK%`c|}8#V3u1=_j-+hgM;^%)fzP#kyWe!uabU#(YrTr0ji`u@$hcZ`x}QqZYmV^R<{)wUgZDZ>SEK0?Au!CfIS*Rv zaFimLC$o-WLfm@VVz|X<2X*;1>t!(j!gGqNgGj2nC=LN8S`+ zoLx^|H!>|ehZfsOQ?2UVH@N95DA5XWOFRM3$E{a1;Vf++LBl!RJvp?rh;upr8e zOowD%X{WS&OMY9nJf!mlZlKPpw0jhGfA=4s?G0X`Y9SBh9nannd~kS l5dh-b}m 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 Date: Wed, 29 Aug 2012 15:37:31 +0300 Subject: [PATCH 075/106] Removed all usage of openSSL. --- src/CMakeLists.txt | 7 --- src/csync_util.c | 58 --------------------- src/csync_util.h | 8 --- tests/ownCloud/mocka/CMakeLists.txt | 2 - tests/ownCloud/mocka/md5_test.c | 79 ----------------------------- 5 files changed, 154 deletions(-) delete mode 100644 tests/ownCloud/mocka/md5_test.c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8357f46eb1..7974cbd82c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,11 +4,6 @@ add_subdirectory(std) find_package(SQLite3 REQUIRED) find_package(Iniparser REQUIRED) -if(CMAKE_CROSSCOMPILING) - find_package(OpenSSLCross REQUIRED) -else() - find_package(OpenSSL REQUIRED) -endif() set(CSYNC_PUBLIC_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} @@ -17,7 +12,6 @@ set(CSYNC_PUBLIC_INCLUDE_DIRS ) set(CSYNC_PRIVATE_INCLUDE_DIRS - ${OPENSSL_INCLUDE_DIRS} ${INIPARSER_INCLUDE_DIRS} ${SQLITE3_INCLUDE_DIRS} ${CSTDLIB_PUBLIC_INCLUDE_DIRS} @@ -34,7 +28,6 @@ set(CSYNC_LINK_LIBRARIES ${CSTDLIB_LIBRARY} ${CSYNC_REQUIRED_LIBRARIES} ${INIPARSER_LIBRARIES} - ${OPENSSL_LIBRARIES} ${SQLITE3_LIBRARIES} ) diff --git a/src/csync_util.c b/src/csync_util.c index f4064d16b9..66913928c2 100644 --- a/src/csync_util.c +++ b/src/csync_util.c @@ -32,14 +32,6 @@ #include "csync_util.h" #include "vio/csync_vio.h" -#if defined(__APPLE__) -# define COMMON_DIGEST_FOR_OPENSSL -# include -# define SHA1 CC_SHA1 -#else -# include -#endif - #define CSYNC_LOG_CATEGORY_NAME "csync.util" #include "csync_log.h" @@ -364,54 +356,4 @@ static char* digest_to_out(unsigned char* digest) return out; } -#define BUF_SIZE 512 - -char* csync_file_md5(const char *filename) -{ - const char *tmpFileName; - int fd; - MD5_CTX c; - char buf[ BUF_SIZE+1 ]; - unsigned char digest[16]; - size_t size; - - tmpFileName = c_multibyte( filename ); - - if ( (fd = _topen( tmpFileName, O_RDONLY )) < 0) { - return NULL; - } else { - MD5_Init(&c); - while( (size=read(fd, buf, BUF_SIZE )) > 0) { - buf[size]='\0'; - MD5_Update(&c, buf, size); - } - close(fd); - MD5_Final(digest, &c); - } - - c_free_multibyte(tmpFileName); - return digest_to_out(digest); -} - -char* csync_buffer_md5(const char *str, int length) -{ - MD5_CTX c; - unsigned char digest[16]; - - MD5_Init(&c); - - while (length > 0) { - if (length > 512) { - MD5_Update(&c, str, 512); - } else { - MD5_Update(&c, str, length); - } - length -= 512; - str += 512; - } - - MD5_Final(digest, &c); - return digest_to_out(digest); -} - /* vim: set ts=8 sw=2 et cindent: */ diff --git a/src/csync_util.h b/src/csync_util.h index 96727b4e6e..e7231b85db 100644 --- a/src/csync_util.h +++ b/src/csync_util.h @@ -36,13 +36,5 @@ int csync_unix_extensions(CSYNC *ctx); /* Normalize the uri to / */ uint64_t csync_create_statedb_hash(CSYNC *ctx); -/* Calculate the md5 sum for a file given by filename. - * Caller has to free the memory. */ -char* csync_file_md5(const char *filename); - -/* Create an md5 sum from a data pointer with a given length. - * Caller has to free the memory */ -char* csync_buffer_md5(const char *str, int length); - #endif /* _CSYNC_UTIL_H */ /* vim: set ft=c.doxygen ts=8 sw=2 et cindent: */ diff --git a/tests/ownCloud/mocka/CMakeLists.txt b/tests/ownCloud/mocka/CMakeLists.txt index f329d0e61c..3383478503 100644 --- a/tests/ownCloud/mocka/CMakeLists.txt +++ b/tests/ownCloud/mocka/CMakeLists.txt @@ -13,8 +13,6 @@ include_directories( add_executable(ocmod_test ocmod_test.c) -add_executable(md5_test md5_test.c) target_link_libraries(ocmod_test ${CMOCKA_LIBRARIES} ${NEON_LIBRARIES} ${CSYNC_LIBRARY} ) -target_link_libraries(md5_test ${CMOCKA_LIBRARIES} ${CSYNC_LIBRARY} ) diff --git a/tests/ownCloud/mocka/md5_test.c b/tests/ownCloud/mocka/md5_test.c deleted file mode 100644 index ae67525afd..0000000000 --- a/tests/ownCloud/mocka/md5_test.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2012 Klaas Freitag - * - * This program 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 2 of the License, or - * (at your option) any later version. - * - * This program 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. - * - */ - - -#define _GNU_SOURCE /* See feature_test_macros(7) */ -#include - -#include -#include -#include -#include -#include - -#include - -#include - -#include "config_test.h" - - -static void test_testdir_exists(void **state) { - csync_stat_t sb; - const _TCHAR *wuri = c_multibyte( TESTFILES_DIR ); - - (void) state; - assert_int_equal( _tstat(wuri, &sb), 0 ); - assert_true( S_ISDIR(sb.st_mode)); - - c_free_multibyte(wuri); -} - -static void test_md5_buffer(void **state) { - const char *t1 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."; - const char *t2 = "This is a nice md5 test"; - const char *t3 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet." - "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."; - - (void) state; - assert_string_equal( csync_buffer_md5(t1, strlen(t1)), "dbcb1ed05ecf975f532604f2d2000246"); - assert_string_equal( csync_buffer_md5(t2, strlen(t2)), "65236ae09754bca371fb869384040141"); - assert_string_equal( csync_buffer_md5(t3, strlen(t3)), "651f37892a9df60ed087bc7a1c660fec"); -} - -static void test_md5_files(void **state) { - char path[255]; - (void) state; - - strcpy(path, TESTFILES_DIR); - strcat(path, "test.txt"); - assert_string_equal( csync_file_md5(path), "f3971ce599093756e6018513d0835134"); - - strcpy(path, TESTFILES_DIR); - strcat(path, "red_is_the_rose.jpg"); - assert_string_equal( csync_file_md5(path), "baf8eeb2a36af94f033fa0094c50c2d5"); - -} - - -int main(void) { - const UnitTest tests[] = { - unit_test(test_testdir_exists), - unit_test(test_md5_buffer), - unit_test(test_md5_files) - }; - - return run_tests(tests); -} From 9f4f0e81060d787e963e775e46bee055585adbf8 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 30 Aug 2012 12:59:52 +0300 Subject: [PATCH 076/106] ownCloud: more memory cleanups, use widechar unlink for tmp files, adjust the modtime by the time difference between client adn server. --- modules/csync_owncloud.c | 41 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 1cca2d71e7..467f2a682f 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -1075,6 +1075,7 @@ static const char* owncloud_file_id( const char *path ) char *uri = _cleanPath(path); char *buf = NULL; const char *cbuf = NULL; + csync_vio_file_stat_t *fs = NULL; /* Perform an HEAD request to the resource. HEAD delivers the * ETag header back. */ @@ -1088,32 +1089,32 @@ static const char* owncloud_file_id( const char *path ) * into a PROPFIND request. */ if( ! header ) { - csync_vio_file_stat_t *fs = csync_vio_file_stat_new(); + fs = csync_vio_file_stat_new(); if(fs == NULL) { DEBUG_WEBDAV( "owncloud_file_id: memory fault."); errno = ENOMEM; return NULL; - }; - if( owncloud_stat( path, fs ) == 0 ) { - header = c_strdup(fs->md5); } - csync_vio_file_stat_destroy(fs); + if( owncloud_stat( path, fs ) == 0 ) { + header = fs->md5; + } } /* In case the result is surrounded by "" cut them away. */ if( header ) { if( header [0] == '"' && header[ strlen(header)-1] == '"') { int len = strlen( header )-2; - buf = c_malloc( len ); + buf = c_malloc( len+1 ); strncpy( buf, header+1, len ); buf[len] = '\0'; cbuf = buf; - SAFE_FREE(header); + /* do not free header here, as it belongs to the request */ } else { - cbuf = header; + cbuf = c_strdup(header); } } - DEBUG_WEBDAV("Get file ID for %s: %s", path, buf); + DEBUG_WEBDAV("Get file ID for %s: %s", path, buf ? buf:""); + if( fs ) csync_vio_file_stat_destroy(fs); ne_request_destroy(req); SAFE_FREE(uri); @@ -1181,6 +1182,7 @@ static csync_vio_method_handle_t *owncloud_open(const char *durl, } else { if( owncloud_stat( dir, &statBuf ) == 0 ) { SAFE_FREE(statBuf.name); + SAFE_FREE(statBuf.md5); DEBUG_WEBDAV("Directory of file to open exists."); SAFE_FREE( _lastDir ); _lastDir = c_strdup(dir); @@ -1192,6 +1194,7 @@ static csync_vio_method_handle_t *owncloud_open(const char *durl, SAFE_FREE(dir); SAFE_FREE(uri); SAFE_FREE(statBuf.name); + SAFE_FREE(statBuf.md5); return NULL; } } @@ -1359,8 +1362,7 @@ static int owncloud_close(csync_vio_method_handle_t *fhandle) { int rc; int ret = 0; size_t len = 0; - const _TCHAR *tmpFileName = 0; - const char *etag_header = 0; + const _TCHAR *tmpFileName = NULL; writeCtx = (struct transfer_context*) fhandle; @@ -1428,6 +1430,8 @@ static int owncloud_close(csync_vio_method_handle_t *fhandle) { errno = EIO; ret = -1; } + /* Remove the local file. */ + _tunlink(tmpFileName); } c_free_multibyte(tmpFileName); } else { @@ -1447,14 +1451,8 @@ static int owncloud_close(csync_vio_method_handle_t *fhandle) { ret = -1; } } - - /* get the uniq id request header */ - etag_header = ne_get_response_header( writeCtx->req, "ETag" ); - if( etag_header ) { - DEBUG_WEBDAV("ETag for file : %s", etag_header); - writeCtx->md5 = c_strdup( etag_header ); - } } + ne_request_destroy( writeCtx->req ); } else { /* Its a GET request, not much to do in close. */ @@ -1465,11 +1463,10 @@ static int owncloud_close(csync_vio_method_handle_t *fhandle) { } } } - /* Remove the local file. */ - unlink( writeCtx->tmpFileName ); /* free mem. Note that the request mem is freed by the ne_request_destroy call */ SAFE_FREE( writeCtx->tmpFileName ); + SAFE_FREE( writeCtx->clean_uri ); SAFE_FREE( writeCtx ); return ret; @@ -1771,11 +1768,11 @@ static int owncloud_utimes(const char *uri, const struct timeval *times) { pname.name = "lastmodified"; newmodtime = modtime->tv_sec; -#if TIMEDELTA + DEBUG_WEBDAV("Add a time delta to modtime %lu: %ld", modtime->tv_sec, dav_session.time_delta); newmodtime += dav_session.time_delta; -#endif + snprintf( val, sizeof(val), "%ld", newmodtime ); DEBUG_WEBDAV("Setting LastModified of %s to %s", curi, val ); From d756c45c503d8d2f16296197ecdca16769c65c83 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 30 Aug 2012 13:01:21 +0300 Subject: [PATCH 077/106] Free memory used by the id in csync_file_stat. --- src/csync_propagate.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/csync_propagate.c b/src/csync_propagate.c index 38c2c25b20..0f989899bb 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -378,6 +378,7 @@ static int _csync_push_file(CSYNC *ctx, csync_file_stat_t *st) { } else { if( tstat->md5 ) { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Target MD5 sum is %s", tstat->md5 ); + if(st->md5) SAFE_FREE(st->md5); st->md5 = c_strdup(tstat->md5 ); } else { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "MD5 sum is empty"); @@ -1117,6 +1118,7 @@ static int _csync_correct_id(CSYNC *ctx) { CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Unable to find node"); } else { tfs = c_rbtree_node_data(node); + if(tfs->md5) SAFE_FREE(tfs->md5); tfs->md5 = _get_md5(ctx, path); if( tfs->instruction == CSYNC_INSTRUCTION_NONE ) { /* set instruction for the statedb merger */ @@ -1141,6 +1143,20 @@ static int _csync_correct_id(CSYNC *ctx) { } } } + + /* Free the seen_dirs list */ + + if( seen_dirs ) { + c_list_t *walk1 = NULL; + + for (walk1 = c_list_first(seen_dirs); walk1 != NULL; walk1 = c_list_next(walk1)) { + char *data = NULL; + + data = (char*) walk1->data; + SAFE_FREE(data); + } + } + c_list_free(seen_dirs); return 0; } From 7600eb4a09e772ec2ce39b91a2588493278540a9 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 30 Aug 2012 13:04:14 +0300 Subject: [PATCH 078/106] Memory cleanups for id syncing. --- src/csync_update.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/csync_update.c b/src/csync_update.c index 9e3fefe21d..32f0fbd228 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -148,7 +148,6 @@ static int _csync_detect_update(CSYNC *ctx, const char *file, /* directory, remote and file not found in statedb */ st->instruction = CSYNC_INSTRUCTION_NEW; } - SAFE_FREE(tmp->md5); } else { st->instruction = CSYNC_INSTRUCTION_NEW; } @@ -157,6 +156,7 @@ static int _csync_detect_update(CSYNC *ctx, const char *file, } out: + if( tmp) SAFE_FREE(tmp->md5); SAFE_FREE(tmp); st->inode = fs->inode; st->mode = fs->mode; @@ -167,9 +167,9 @@ out: st->nlink = fs->nlink; st->type = type; st->md5 = NULL; - if( fs->md5 ) + if( fs->md5 ) { st->md5 = c_strdup(fs->md5); - + } st->phash = h; st->pathlen = len; memcpy(st->path, (len ? path : ""), len + 1); @@ -432,6 +432,8 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, if( ! do_read_from_db ) csync_vio_file_stat_destroy(fs); + else + SAFE_FREE(fs->md5); if (rc < 0) { csync_vio_closedir(ctx, dh); From ffc5e6f0cc616084f4afa2789db6c4b1c4eceabe Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 30 Aug 2012 13:04:48 +0300 Subject: [PATCH 079/106] Memory cleanups for id syncing, removed unused code. --- src/csync_util.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/csync_util.c b/src/csync_util.c index 66913928c2..fccfce5ec8 100644 --- a/src/csync_util.c +++ b/src/csync_util.c @@ -222,6 +222,7 @@ static int _merge_file_trees_visitor(void *obj, void *data) { tfs = c_rbtree_node_data(node); if( tfs->md5 ) { + if( fs->md5 ) SAFE_FREE(fs->md5); fs->md5 = c_strdup( tfs->md5 ); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "PRE UPDATED %s: %s <-> %s", uri, fs->md5, tfs->md5); } else { @@ -342,18 +343,4 @@ uint64_t csync_create_statedb_hash(CSYNC *ctx) { return hash; } -static char* digest_to_out(unsigned char* digest) -{ - char *out = c_malloc(33); - int n; - - if( !digest ) return NULL; - - for (n = 0; n < 16; ++n) { - snprintf(&(out[n*2]), 16*2, "%02x", (unsigned int) *(digest+n)); - } - - return out; -} - /* vim: set ts=8 sw=2 et cindent: */ From 6fbc510aeb6f0fc4d22fa1041eac61169128161a Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 30 Aug 2012 13:05:24 +0300 Subject: [PATCH 080/106] Free memory of id_list lists. --- src/csync.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/csync.c b/src/csync.c index 8bb483f777..eec270fdf1 100644 --- a/src/csync.c +++ b/src/csync.c @@ -734,8 +734,10 @@ int csync_destroy(CSYNC *ctx) { /* free memory */ c_rbtree_free(ctx->local.tree); c_list_free(ctx->local.list); + c_list_free(ctx->local.id_list); c_rbtree_free(ctx->remote.tree); c_list_free(ctx->remote.list); + c_list_free(ctx->remote.id_list); SAFE_FREE(ctx->local.uri); SAFE_FREE(ctx->remote.uri); SAFE_FREE(ctx->options.config_dir); From ecd6a86fd3d8a29ffbebbeff216ce1d16bf28c0d Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 30 Aug 2012 14:30:30 +0300 Subject: [PATCH 081/106] Remove wrong free command. --- modules/csync_owncloud.c | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 467f2a682f..571243c0be 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -1194,7 +1194,6 @@ static csync_vio_method_handle_t *owncloud_open(const char *durl, SAFE_FREE(dir); SAFE_FREE(uri); SAFE_FREE(statBuf.name); - SAFE_FREE(statBuf.md5); return NULL; } } From caa1945daa0909e737fda41f3b4d5af02514580b Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 30 Aug 2012 15:45:45 +0300 Subject: [PATCH 082/106] Added another check on file length. --- src/csync_dbtree.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/csync_dbtree.c b/src/csync_dbtree.c index 8ca35a40c7..462f9c1f2f 100644 --- a/src/csync_dbtree.c +++ b/src/csync_dbtree.c @@ -72,6 +72,10 @@ csync_vio_method_handle_t *csync_dbtree_opendir(CSYNC *ctx, const char *name) */ int col_count = 9; + if( strlen(name) < strlen(ctx->remote.uri)+1) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "name does not contain remote uri!"); + return NULL; + } path = name + strlen(ctx->remote.uri)+1; From 08f7fbbd715a6e209694f8520e04f6fcf8e65b41 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 30 Aug 2012 17:01:52 +0300 Subject: [PATCH 083/106] Fix printf argument for win32 platform. --- src/csync_statedb.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/csync_statedb.c b/src/csync_statedb.c index 4a2d209d52..278cf9d4c2 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -498,7 +498,9 @@ char *csync_statedb_get_uniqId( CSYNC *ctx, uint64_t jHash, csync_vio_file_stat_ c_strlist_t *result = NULL; char *stmt = NULL; - stmt = sqlite3_mprintf("SELECT md5 FROM metadata WHERE phash='%llu' AND modtime=%llu", jHash, buf->mtime); + stmt = sqlite3_mprintf("SELECT md5 FROM metadata WHERE phash='%llu' AND modtime=%lu", jHash, buf->mtime); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "STATEMENT: %s", stmt); + result = csync_statedb_query(ctx, stmt); sqlite3_free(stmt); if (result == NULL) { From 85713948478009405bd5e8f8de13ed7746e28a17 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 30 Aug 2012 18:45:10 +0300 Subject: [PATCH 084/106] Fix time correction between client and server. --- modules/csync_owncloud.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 571243c0be..fa2dcb53aa 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -135,10 +135,10 @@ struct dav_session_s { char *proxy_user; char *proxy_pwd; - time_t prev_delta; - time_t time_delta; /* The time delta to use. */ + long int prev_delta; + long int time_delta; /* The time delta to use. */ long int time_delta_sum; /* What is the time delta average? */ - int time_delta_cnt; /* How often was the server time gathered? */ + long int time_delta_cnt; /* How often was the server time gathered? */ }; /* The list of properties that is fetched in PropFind on a collection */ @@ -704,7 +704,7 @@ static csync_vio_file_stat_t *resourceToFileStat( struct resource *res ) } /* Correct the mtime of the file with the server time delta */ - lfs->mtime = res->modtime; + lfs->mtime = res->modtime - dav_session.time_delta; lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; lfs->size = res->size; lfs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; From 50f698673c476c81f82028f310ea4e4673bee183 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 30 Aug 2012 18:45:36 +0300 Subject: [PATCH 085/106] Update version number to 0.50.9 --- CMakeLists.txt | 4 ++-- CPackConfig.cmake | 2 +- src/csync.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d666b0ff0..c7f87fd588 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,11 +8,11 @@ set(APPLICATION_NAME ${PROJECT_NAME}) set(APPLICATION_VERSION_MAJOR "0") set(APPLICATION_VERSION_MINOR "50") -set(APPLICATION_VERSION_PATCH "8") +set(APPLICATION_VERSION_PATCH "9") set(APPLICATION_VERSION "${APPLICATION_VERSION_MAJOR}.${APPLICATION_VERSION_MINOR}.${APPLICATION_VERSION_PATCH}") -set(LIBRARY_VERSION "0.1.8") +set(LIBRARY_VERSION "0.1.9") set(LIBRARY_SOVERSION "0") # where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked diff --git a/CPackConfig.cmake b/CPackConfig.cmake index a95c1e1016..131f105f02 100644 --- a/CPackConfig.cmake +++ b/CPackConfig.cmake @@ -12,7 +12,7 @@ set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING") ### versions set(CPACK_PACKAGE_VERSION_MAJOR "0") -set(CPACK_PACKAGE_VERSION_MINOR "49") +set(CPACK_PACKAGE_VERSION_MINOR "50") set(CPACK_PACKAGE_VERSION_PATCH "9") set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") diff --git a/src/csync.h b/src/csync.h index 05c6c01af7..5efa835079 100644 --- a/src/csync.h +++ b/src/csync.h @@ -51,7 +51,7 @@ extern "C" { /* csync version */ #define LIBCSYNC_VERSION_MAJOR 0 #define LIBCSYNC_VERSION_MINOR 50 -#define LIBCSYNC_VERSION_MICRO 8 +#define LIBCSYNC_VERSION_MICRO 9 #define LIBCSYNC_VERSION_INT CSYNC_VERSION_INT(LIBCSYNC_VERSION_MAJOR, \ LIBCSYNC_VERSION_MINOR, \ From ee228cfff43013b721a47f27dd331cfdb81428c9 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Wed, 19 Sep 2012 18:46:40 +0300 Subject: [PATCH 086/106] Make use of the Session cookie sent from the server. --- modules/csync_owncloud.c | 121 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index fa2dcb53aa..b31662fa0b 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -135,6 +135,8 @@ struct dav_session_s { char *proxy_user; char *proxy_pwd; + char *session_key; + long int prev_delta; long int time_delta; /* The time delta to use. */ long int time_delta_sum; /* What is the time delta average? */ @@ -411,6 +413,118 @@ static int configureProxy( ne_session *session ) return re; } +/* + * This hook is called for with the response of a request. Here its checked + * if a Set-Cookie header is there for the PHPSESSID. The key is stored into + * the webdav session to be added to subsequent requests. + */ +#define PHPSESSID "PHPSESSID=" +static void post_request_hook(ne_request *req, void *userdata, const ne_status *status) +{ + const char *set_cookie_header = NULL; + const char *sc = NULL; + char *key = NULL; + + (void) userdata; + + if(!(status && req)) return; + if( status->klass == 2 || status->code == 401 ) { + /* successful request */ + set_cookie_header = ne_get_response_header( req, "Set-Cookie" ); + if( set_cookie_header ) { + DEBUG_WEBDAV("===================> Set-Cookie: >%s<", set_cookie_header); + /* try to find a ', ' sequence which is the separator of neon if multiple Set-Cookie + * headers are there. + * The following code parses a string like this: + * PHPSESSID=n8feu3dsbarpvvufqae9btn5fl7m7ikgh5ml1fg37v4i2cah7k41; path=/; HttpOnly */ + sc = set_cookie_header; + while(sc) { + if( strlen(sc) > strlen(PHPSESSID) && + strncmp( sc, PHPSESSID, strlen(PHPSESSID)) == 0 ) { + const char *sc_val = sc; /* + strlen(PHPSESSID); */ + const char *sc_end = sc_val; + int cnt = 0; + int len = strlen(sc_val); /* The length of the rest of the header string. */ + + while( cnt < len && *sc_end != ';' && *sc_end != ',') { + cnt++; + sc_end++; + } + if( cnt == len ) { + /* exit: We are at the end. */ + sc = NULL; + } else if( *sc_end == ';' ) { + /* We are at the end of the session key. */ + int keylen = sc_end-sc_val; + key = c_malloc(keylen+1); + strncpy( key, sc_val, keylen ); + key[keylen] = '\0'; + + /* now search for a ',' to find a potential other header entry */ + while(cnt < len && *sc_end != ',') { + cnt++; + sc_end++; + } + if( cnt < len ) + sc = sc_end+2; /* mind the space after the comma */ + else + sc = NULL; + } else if( *sc_end == ',' ) { + /* A new entry is to check. */ + if( *(sc_end + 1) == ' ') { + sc = sc_end+2; + } else { + /* error condition */ + sc = NULL; + } + } + } else { + /* It is not a PHPSESSID-Header but another one which we're not interested in. + * forward to next header entry (search ',' ) + */ + int len = strlen(sc); + int cnt = 0; + + while(cnt < len && *sc != ',') { + cnt++; + sc++; + } + if( cnt < len ) + sc = sc+2; /* mind the space after the comma */ + else + sc = NULL; + } + } + } + } else { + DEBUG_WEBDAV("Request failed, don't take session header."); + } + if( key ) { + DEBUG_WEBDAV("----> Session-key: %s", key); + SAFE_FREE(dav_session.session_key); + dav_session.session_key = key; + } +} + +/* + * this hook is called just after a request has been created, before its sent. + * Here it is used to set the session cookie if available. + */ +static void request_created_hook(ne_request *req, void *userdata, + const char *method, const char *requri) +{ + (void) userdata; + (void) method; + + if( !req ) return; + + if(dav_session.session_key) { + /* DEBUG_WEBDAV("Setting PHPSESSID to %s", dav_session.session_key); */ + ne_add_request_header(req, "Cookie", dav_session.session_key); + } + +} + /* * Connect to a DAV server * This function sets the flag _connected if the connection is established @@ -496,6 +610,13 @@ static int dav_connect(const char *base_url) { } ne_redirect_register( dav_session.ctx ); + /* Hook to get the Session ID */ + ne_hook_post_headers( dav_session.ctx, post_request_hook, NULL ); + /* Hook called when a request is built. It sets the PHPSESSID header */ + ne_hook_create_request( dav_session.ctx, request_created_hook, NULL ); + + dav_session.session_key = NULL; + /* Proxy support */ proxystate = configureProxy( dav_session.ctx ); if( proxystate < 0 ) { From e4c0fb90dd0bfb6c950462a64c745312890f54e5 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 20 Sep 2012 11:28:54 +0300 Subject: [PATCH 087/106] ownCloud: some log cleanups. --- modules/csync_owncloud.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index b31662fa0b..3419a73ddd 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -432,7 +432,7 @@ static void post_request_hook(ne_request *req, void *userdata, const ne_status * /* successful request */ set_cookie_header = ne_get_response_header( req, "Set-Cookie" ); if( set_cookie_header ) { - DEBUG_WEBDAV("===================> Set-Cookie: >%s<", set_cookie_header); + DEBUG_WEBDAV(" Set-Cookie found: %s", set_cookie_header); /* try to find a ', ' sequence which is the separator of neon if multiple Set-Cookie * headers are there. * The following code parses a string like this: @@ -515,6 +515,7 @@ static void request_created_hook(ne_request *req, void *userdata, { (void) userdata; (void) method; + (void) requri; if( !req ) return; @@ -975,7 +976,6 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { curi = _cleanPath( uri ); - DEBUG_WEBDAV("I have no stat cache, call propfind for %s", curi ); fetchCtx->list = NULL; fetchCtx->target = curi; fetchCtx->include_target = 1; @@ -1046,9 +1046,10 @@ static int owncloud_stat(const char *uri, csync_vio_file_stat_t *buf) { free_fetchCtx( fetchCtx ); } + DEBUG_WEBDAV("STAT result from propfind: %s, md5: %s", buf->name ? buf->name:"NULL", + buf->md5 ? buf->md5 : "NULL" ); } - DEBUG_WEBDAV("STAT result: %s, md5: %s", buf->name ? buf->name:"NULL", - buf->md5 ? buf->md5 : "NULL" ); + return 0; } @@ -1234,7 +1235,7 @@ static const char* owncloud_file_id( const char *path ) cbuf = c_strdup(header); } } - DEBUG_WEBDAV("Get file ID for %s: %s", path, buf ? buf:""); + DEBUG_WEBDAV("Get file ID for %s: %s", path, cbuf ? cbuf:""); if( fs ) csync_vio_file_stat_destroy(fs); ne_request_destroy(req); SAFE_FREE(uri); From 44a6cf9bfc709ae4ce9fdb631e034a67d7e85199 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 20 Sep 2012 17:54:23 +0300 Subject: [PATCH 088/106] Remove wrong free. --- src/csync.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/csync.c b/src/csync.c index eec270fdf1..82e2468471 100644 --- a/src/csync.c +++ b/src/csync.c @@ -663,7 +663,6 @@ static void _tree_destructor(void *data) { csync_file_stat_t *freedata = NULL; freedata = (csync_file_stat_t *) data; - SAFE_FREE(freedata->md5); SAFE_FREE(freedata); } From 7a70a6fa69afe3c8bf0be49a8ccdb9176325c1eb Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 20 Sep 2012 17:57:58 +0300 Subject: [PATCH 089/106] Update version to 0.50.10 --- CMakeLists.txt | 4 ++-- src/csync.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c7f87fd588..dac9cdf88e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,11 +8,11 @@ set(APPLICATION_NAME ${PROJECT_NAME}) set(APPLICATION_VERSION_MAJOR "0") set(APPLICATION_VERSION_MINOR "50") -set(APPLICATION_VERSION_PATCH "9") +set(APPLICATION_VERSION_PATCH "10") set(APPLICATION_VERSION "${APPLICATION_VERSION_MAJOR}.${APPLICATION_VERSION_MINOR}.${APPLICATION_VERSION_PATCH}") -set(LIBRARY_VERSION "0.1.9") +set(LIBRARY_VERSION "0.1.10") set(LIBRARY_SOVERSION "0") # where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked diff --git a/src/csync.h b/src/csync.h index 5efa835079..b51ce9e4dc 100644 --- a/src/csync.h +++ b/src/csync.h @@ -51,7 +51,7 @@ extern "C" { /* csync version */ #define LIBCSYNC_VERSION_MAJOR 0 #define LIBCSYNC_VERSION_MINOR 50 -#define LIBCSYNC_VERSION_MICRO 9 +#define LIBCSYNC_VERSION_MICRO 10 #define LIBCSYNC_VERSION_INT CSYNC_VERSION_INT(LIBCSYNC_VERSION_MAJOR, \ LIBCSYNC_VERSION_MINOR, \ From 403fec14546a065570b98b5a075183a4c27d59e9 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 24 Sep 2012 15:44:19 +0300 Subject: [PATCH 090/106] ownCloud: Removed unused stat variable. --- modules/csync_owncloud.c | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 3419a73ddd..03d44ebe8b 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -160,7 +160,6 @@ struct dav_session_s dav_session; /* The DAV Session, initialised in dav_connect int _connected = 0; /* flag to indicate if a connection exists, ie. the dav_session is valid */ csync_vio_file_stat_t _fs; -csync_vio_file_stat_t _owc; csync_auth_callback _authcb; From 0dfa61650d4ba7927e30c71da7164667936bf276 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 24 Sep 2012 15:45:11 +0300 Subject: [PATCH 091/106] ownCloud: clear the cache variables before ID query. --- modules/csync_owncloud.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 03d44ebe8b..0aa32a6c5d 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -1210,6 +1210,10 @@ static const char* owncloud_file_id( const char *path ) * into a PROPFIND request. */ if( ! header ) { + /* Clear the cache */ + fill_stat_cache(NULL); + + /* ... and do a stat call. */ fs = csync_vio_file_stat_new(); if(fs == NULL) { DEBUG_WEBDAV( "owncloud_file_id: memory fault."); From 128926cac77623e08c5eb62d461b975b6a198e6f Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 24 Sep 2012 15:54:17 +0300 Subject: [PATCH 092/106] Check path for len exactly 1 when comparing on '.'. --- src/csync_propagate.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/csync_propagate.c b/src/csync_propagate.c index 0f989899bb..dab76e9039 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -1090,7 +1090,10 @@ static int _csync_correct_id(CSYNC *ctx) { CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "correct ID on dir: %s", path); /* handle the . path */ - if( path && path[0] == '.' ) path = NULL; + if( path && path[0] == '.' && strlen(path) == 1) { + SAFE_FREE(path); + path = NULL; + } while( path ) { uint64_t h; From 77e79ea7673130689aee42be4e8979c43fc061fd Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 24 Sep 2012 15:55:18 +0300 Subject: [PATCH 093/106] For rename, retrieve the new id and set in local tree. --- src/csync_propagate.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/csync_propagate.c b/src/csync_propagate.c index dab76e9039..b3635deb8f 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -619,6 +619,8 @@ static int _csync_rename_file(CSYNC *ctx, csync_file_stat_t *st) { struct timeval times[2]; char *suri = NULL; char *duri = NULL; + const char *tmd5 = NULL; + c_rbnode_t *node = NULL; switch (ctx->current) { case REMOTE_REPLCIA: @@ -668,16 +670,36 @@ static int _csync_rename_file(CSYNC *ctx, csync_file_stat_t *st) { csync_vio_utimes(ctx, duri, times); - /* set instruction for the statedb merger */ + /* The the uniq ID for the destination */ + tmd5 = _get_md5(ctx, st->destpath); + if( rc > -1 ) { - st->instruction = CSYNC_INSTRUCTION_RENAME; - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "RENAME file: %s", suri); + /* Find the destination entry in the local tree and insert the uniq id */ + int len = strlen(st->destpath); + uint64_t h = c_jhash64((uint8_t *) st->destpath, len, 0); + h = c_jhash64((uint8_t *) st->destpath, len, 0); + + /* search in the local tree for the local file to get the mtime */ + node = c_rbtree_find(ctx->local.tree, &h); + if(node == NULL) { + /* no local file found. */ + + } else { + csync_file_stat_t *other = NULL; + /* set the mtime which is needed in statedb_get_uniqid */ + other = (csync_file_stat_t *) node->data; + if( other ) { + other->md5 = tmd5; + } + } + /* set instruction for the statedb merger */ + st->instruction = CSYNC_INSTRUCTION_DELETED; } + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "RENAME file: %s => %s with ID %s", st->path, st->destpath, st->md5); out: SAFE_FREE(suri); SAFE_FREE(duri); - SAFE_FREE(st->destpath); /* set instruction for the statedb merger */ if (rc != 0) { From 2354b9c52fefd41e2dcc1316a158336415756e10 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 24 Sep 2012 15:56:42 +0300 Subject: [PATCH 094/106] Fix detection of local file renames. --- src/csync_update.c | 62 ++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/src/csync_update.c b/src/csync_update.c index 32f0fbd228..3be0d899ea 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -115,41 +115,37 @@ static int _csync_detect_update(CSYNC *ctx, const char *file, } } #endif - if(tmp) { /* there is an entry in the database */ - if (tmp->phash == h) { - /* we have an update! */ - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "time compare: %lu <-> %lu, md5: %s <-> %s", - fs->mtime, tmp->modtime, fs->md5, tmp->md5); - if( !fs->md5) { - st->instruction = CSYNC_INSTRUCTION_EVAL; - goto out; - } - if( !c_streq(fs->md5, tmp->md5 )) { - // if (!fs->mtime > tmp->modtime) { - st->instruction = CSYNC_INSTRUCTION_EVAL; - goto out; - } - st->instruction = CSYNC_INSTRUCTION_NONE; - } else { - /* check if it's a file and has been renamed */ - if (type == CSYNC_FTW_TYPE_FILE && ctx->current == LOCAL_REPLICA) { - tmp = csync_statedb_get_stat_by_inode(ctx, fs->inode); - if (tmp && tmp->inode == fs->inode) { - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "inodes: %ld <-> %ld", tmp->inode, fs->inode); - /* inode found so the file has been renamed */ - st->instruction = CSYNC_INSTRUCTION_RENAME; - goto out; - } else { - /* file not found in statedb */ - st->instruction = CSYNC_INSTRUCTION_NEW; - goto out; - } - } - /* directory, remote and file not found in statedb */ - st->instruction = CSYNC_INSTRUCTION_NEW; + if(tmp && tmp->phash == h ) { /* there is an entry in the database */ + /* we have an update! */ + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "time compare: %lu <-> %lu, md5: %s <-> %s", + fs->mtime, tmp->modtime, fs->md5, tmp->md5); + if( !fs->md5) { + st->instruction = CSYNC_INSTRUCTION_EVAL; + goto out; } + if( !c_streq(fs->md5, tmp->md5 )) { + // if (!fs->mtime > tmp->modtime) { + st->instruction = CSYNC_INSTRUCTION_EVAL; + goto out; + } + st->instruction = CSYNC_INSTRUCTION_NONE; } else { - st->instruction = CSYNC_INSTRUCTION_NEW; + /* check if it's a file and has been renamed */ + if (type == CSYNC_FTW_TYPE_FILE && ctx->current == LOCAL_REPLICA) { + tmp = csync_statedb_get_stat_by_inode(ctx, fs->inode); + if (tmp && tmp->inode == fs->inode) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "inodes: %ld <-> %ld", tmp->inode, fs->inode); + /* inode found so the file has been renamed */ + st->instruction = CSYNC_INSTRUCTION_RENAME; + goto out; + } else { + /* file not found in statedb */ + st->instruction = CSYNC_INSTRUCTION_NEW; + goto out; + } + } + /* directory, remote and file not found in statedb */ + st->instruction = CSYNC_INSTRUCTION_NEW; } } else { st->instruction = CSYNC_INSTRUCTION_NEW; From 34249e9f64cf3d4c42b13bfbd9480da6b27c4f00 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 24 Sep 2012 15:57:32 +0300 Subject: [PATCH 095/106] Use destination path in case of file rename. --- src/csync_util.c | 51 +++++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/csync_util.c b/src/csync_util.c index fccfce5ec8..6ac8972fde 100644 --- a/src/csync_util.c +++ b/src/csync_util.c @@ -174,25 +174,31 @@ static int _merge_file_trees_visitor(void *obj, void *data) { fs = c_rbtree_node_data(node); switch (ctx->current) { - case LOCAL_REPLICA: - if (asprintf(&uri, "%s/%s", ctx->local.uri, fs->path) < 0) { - rc = -1; - strerror_r(errno, errbuf, sizeof(errbuf)); - CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "file uri alloc failed: %s", - errbuf); - goto out; + case LOCAL_REPLICA: + /* If there is a destpath, this is a rename and the target must be used. */ + if( fs->destpath ) { + asprintf(&uri, "%s/%s", ctx->local.uri, fs->destpath); + SAFE_FREE(fs->destpath); + } else { + if (asprintf(&uri, "%s/%s", ctx->local.uri, fs->path) < 0) { + rc = -1; + strerror_r(errno, errbuf, sizeof(errbuf)); + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "file uri alloc failed: %s", + errbuf); + goto out; + } } break; - case REMOTE_REPLCIA: + case REMOTE_REPLCIA: if (asprintf(&uri, "%s/%s", ctx->remote.uri, fs->path) < 0) { - rc = -1; - strerror_r(errno, errbuf, sizeof(errbuf)); - CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "file uri alloc failed: %s", - errbuf); - goto out; + rc = -1; + strerror_r(errno, errbuf, sizeof(errbuf)); + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "file uri alloc failed: %s", + errbuf); + goto out; } break; - default: + default: break; } @@ -212,22 +218,23 @@ static int _merge_file_trees_visitor(void *obj, void *data) { fs->inode = vst->inode; fs->modtime = vst->mtime; - /* update with the id from the remote repo */ + /* update with the id from the remote repo. This method always works on the local repo */ node = c_rbtree_find(ctx->remote.tree, &fs->phash); if (node == NULL) { - rc = -1; - CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Unable to find node"); - goto out; + rc = -1; + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Unable to find node"); + goto out; } tfs = c_rbtree_node_data(node); - if( tfs->md5 ) { + if( tfs && tfs->md5 ) { if( fs->md5 ) SAFE_FREE(fs->md5); - fs->md5 = c_strdup( tfs->md5 ); - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "PRE UPDATED %s: %s <-> %s", uri, fs->md5, tfs->md5); + fs->md5 = c_strdup( tfs->md5 ); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "PRE UPDATED %s: %s <-> %s", fs->path, fs->md5, tfs->md5); } else { - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "md5 is empty in merger!"); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "md5 is empty in merger!"); } + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "file: %s, instruction: UPDATED (%s)", uri, fs->md5); fs->instruction = CSYNC_INSTRUCTION_NONE; From 407b87c17b6be49033f4c1d3de09e0d2c54a2ce7 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 24 Sep 2012 16:28:43 +0300 Subject: [PATCH 096/106] Fix statedb test: Added new columns. --- tests/csync_tests/check_csync_statedb_query.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/csync_tests/check_csync_statedb_query.c b/tests/csync_tests/check_csync_statedb_query.c index c312766c45..0ce37a330e 100644 --- a/tests/csync_tests/check_csync_statedb_query.c +++ b/tests/csync_tests/check_csync_statedb_query.c @@ -36,8 +36,8 @@ static void setup_db(void) { fail_unless(csync_statedb_create_tables(csync) == 0, "Setup failed"); stmt = sqlite3_mprintf("INSERT INTO metadata" - "(phash, pathlen, path, inode, uid, gid, mode, modtime) VALUES" - "(%lu, %d, '%q', %d, %d, %d, %d, %lu);", + "(phash, pathlen, path, inode, uid, gid, mode, modtime, type, md5) VALUES" + "(%lu, %d, '%q', %d, %d, %d, %d, %lu, %d, %lu);", 42, 42, "It's a rainy day", @@ -45,7 +45,9 @@ static void setup_db(void) { 42, 42, 42, - 42); + 42, + 2, + 43); fail_if(csync_statedb_insert(csync, stmt) < 0, NULL); sqlite3_free(stmt); From 4eb1ae78536611da77706f0e6bdb05638051266c Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Mon, 24 Sep 2012 16:47:43 +0300 Subject: [PATCH 097/106] Fix test: Status must be INSTRUCTION_EVAL. This test runs on an empty database. That also means that there is no ID in the database which is needed to detect the update. An empty ID means that the status must be evaluated. --- tests/csync_tests/check_csync_update.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/csync_tests/check_csync_update.c b/tests/csync_tests/check_csync_update.c index 7a6006aa9e..fc7ba5f017 100644 --- a/tests/csync_tests/check_csync_update.c +++ b/tests/csync_tests/check_csync_update.c @@ -153,7 +153,7 @@ START_TEST (check_csync_detect_update_db_none) /* the instruction should be set to new */ st = c_rbtree_node_data(csync->local.tree->root); - fail_unless(st->instruction == CSYNC_INSTRUCTION_NONE, "instruction is %s", csync_instruction_str(st->instruction)); + fail_unless(st->instruction == CSYNC_INSTRUCTION_EVAL, "instruction is %s", csync_instruction_str(st->instruction)); /* set the instruction to UPDATED that it gets written to the statedb */ st->instruction = CSYNC_INSTRUCTION_UPDATED; From b976ac914dbb4c34c4524ab039a90e01d6766bc8 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 25 Sep 2012 15:41:55 +0300 Subject: [PATCH 098/106] Also check the files basename against the exclude pattern. --- src/csync_exclude.c | 6 ++++++ tests/csync_tests/check_csync_exclude.c | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/csync_exclude.c b/src/csync_exclude.c index 3ffe93eb07..0f7163c8a7 100644 --- a/src/csync_exclude.c +++ b/src/csync_exclude.c @@ -109,6 +109,7 @@ void csync_exclude_destroy(CSYNC *ctx) { int csync_excluded(CSYNC *ctx, const char *path) { size_t i; const char *p; + const char *bname = NULL; if (! ctx->options.unix_extensions) { for (p = path; *p; p++) { @@ -133,11 +134,16 @@ int csync_excluded(CSYNC *ctx, const char *path) { } if (ctx->excludes->count) { + bname = c_basename(path); for (i = 0; i < ctx->excludes->count; i++) { if (csync_fnmatch(ctx->excludes->vector[i], path, 0) == 0) { return 1; } + if( bname && csync_fnmatch(ctx->excludes->vector[i], bname, 0) == 0) { + return 1; + } } + SAFE_FREE(bname); } return 0; } diff --git a/tests/csync_tests/check_csync_exclude.c b/tests/csync_tests/check_csync_exclude.c index e850321cb2..77862ae273 100644 --- a/tests/csync_tests/check_csync_exclude.c +++ b/tests/csync_tests/check_csync_exclude.c @@ -46,6 +46,12 @@ START_TEST (check_csync_excluded) fail_unless(csync_excluded(csync, ".kde/share/config/kwin.eventsrc") == 0, NULL); fail_unless(csync_excluded(csync, ".kde4/cache-maximegalon/cache1.txt") == 1, NULL); fail_unless(csync_excluded(csync, ".mozilla/plugins") == 1, NULL); + + /* test for finding patterns in subdirs. .beagle is defined as a pattern and has to + * be found in top dir as well as in directories underneath. */ + fail_unless(csync_excluded(csync, ".beagle") == 1, NULL); + fail_unless(csync_excluded(csync, "foo/.beagle") == 1, NULL); + fail_unless(csync_excluded(csync, "bar/foo/.beagle") == 1, NULL); } END_TEST From f031e936180a09f0d566c80517fa2c20e5427e02 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Wed, 26 Sep 2012 12:44:17 +0200 Subject: [PATCH 099/106] Do not try a head request as PROPFIND is more efficient on ownCloud. --- modules/csync_owncloud.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 0aa32a6c5d..e6893964b7 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -1197,14 +1197,16 @@ static const char* owncloud_file_id( const char *path ) char *buf = NULL; const char *cbuf = NULL; csync_vio_file_stat_t *fs = NULL; + bool doHeadRequest= false; /* ownCloud server doesn't have good support for HEAD yet */ - /* Perform an HEAD request to the resource. HEAD delivers the - * ETag header back. */ - req = ne_request_create(dav_session.ctx, "HEAD", uri); - ne_request_dispatch(req); - - header = ne_get_response_header(req, "etag"); + if( doHeadRequest ) { + /* Perform an HEAD request to the resource. HEAD delivers the + * ETag header back. */ + req = ne_request_create(dav_session.ctx, "HEAD", uri); + ne_request_dispatch(req); + header = ne_get_response_header(req, "etag"); + } /* If the request went wrong or the server did not respond correctly * (that can happen for collections) a stat call is done which translates * into a PROPFIND request. @@ -1240,7 +1242,7 @@ static const char* owncloud_file_id( const char *path ) } DEBUG_WEBDAV("Get file ID for %s: %s", path, cbuf ? cbuf:""); if( fs ) csync_vio_file_stat_destroy(fs); - ne_request_destroy(req); + if( req ) ne_request_destroy(req); SAFE_FREE(uri); return cbuf; From 7b16fcf2a40774b6abf5d39c40f95c7a25cd5fe8 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Wed, 26 Sep 2012 12:45:24 +0200 Subject: [PATCH 100/106] Avoid useless warnings. --- src/csync_statedb.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/csync_statedb.c b/src/csync_statedb.c index 278cf9d4c2..b4238f266f 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -396,7 +396,7 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx, uint64_t phash) { return NULL; } - if (result->count < 10) { + if (result->count != 0 && result->count < 10) { CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "WRN: Amount of result columns wrong, db version mismatch!"); } if(result->count > 7) { @@ -499,7 +499,6 @@ char *csync_statedb_get_uniqId( CSYNC *ctx, uint64_t jHash, csync_vio_file_stat_ char *stmt = NULL; stmt = sqlite3_mprintf("SELECT md5 FROM metadata WHERE phash='%llu' AND modtime=%lu", jHash, buf->mtime); - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "STATEMENT: %s", stmt); result = csync_statedb_query(ctx, stmt); sqlite3_free(stmt); From 004f5ccce6903d856d25a49775d596f84b3d951f Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Wed, 26 Sep 2012 12:46:59 +0200 Subject: [PATCH 101/106] Fix state change for deleted or not longer existing directories. --- src/csync_propagate.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/csync_propagate.c b/src/csync_propagate.c index b3635deb8f..34ace8740d 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -1143,14 +1143,20 @@ static int _csync_correct_id(CSYNC *ctx) { CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Unable to find node"); } else { tfs = c_rbtree_node_data(node); - if(tfs->md5) SAFE_FREE(tfs->md5); - tfs->md5 = _get_md5(ctx, path); - if( tfs->instruction == CSYNC_INSTRUCTION_NONE ) { - /* set instruction for the statedb merger */ - tfs->instruction = CSYNC_INSTRUCTION_UPDATED; + if( tfs ) { + if(tfs->instruction == CSYNC_INSTRUCTION_DELETED) { + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Skipping update of MD5 because item is deleted."); + } else { + if(tfs->md5) SAFE_FREE(tfs->md5); + tfs->md5 = _get_md5(ctx, path); + CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "MD5 for dir: %s %s (Instruction: %s)", tfs->path, + tfs->md5, csync_instruction_str(tfs->instruction)); + if( tfs->md5 && tfs->instruction == CSYNC_INSTRUCTION_NONE ) { + /* set instruction for the statedb merger */ + tfs->instruction = CSYNC_INSTRUCTION_UPDATED; + } + } } - - CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "MD5 for dir: %s %s", tfs->path, tfs->md5); } } /* get the parent dir */ From 2af0d6f1a44f4a3ce7983bf47ee81f60c313246e Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Wed, 26 Sep 2012 15:32:38 +0200 Subject: [PATCH 102/106] Be careful with memory, some fixes for that. --- modules/csync_owncloud.c | 1 + src/csync_statedb.c | 2 +- src/csync_update.c | 9 +++++++-- src/csync_util.c | 2 +- src/vio/csync_vio_file_stat.c | 2 +- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index e6893964b7..4163e32efb 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -455,6 +455,7 @@ static void post_request_hook(ne_request *req, void *userdata, const ne_status * } else if( *sc_end == ';' ) { /* We are at the end of the session key. */ int keylen = sc_end-sc_val; + if( key ) SAFE_FREE(key); key = c_malloc(keylen+1); strncpy( key, sc_val, keylen ); key[keylen] = '\0'; diff --git a/src/csync_statedb.c b/src/csync_statedb.c index b4238f266f..e51e1abab0 100644 --- a/src/csync_statedb.c +++ b/src/csync_statedb.c @@ -318,7 +318,7 @@ static int _insert_metadata_visitor(void *obj, void *data) { fs->mode, fs->modtime, fs->type, - fs->md5); + fs->md5 ? fs->md5 : ""); /* * The phash needs to be long long unsigned int or it segfaults on PPC diff --git a/src/csync_update.c b/src/csync_update.c index 3be0d899ea..997a19cdd4 100644 --- a/src/csync_update.c +++ b/src/csync_update.c @@ -413,10 +413,15 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn, } if( ctx->current == LOCAL_REPLICA ) { + char *md5 = NULL; int len = strlen( path ); uint64_t h = c_jhash64((uint8_t *) path, len, 0); - fs->md5 = csync_statedb_get_uniqId( ctx, h, fs ); - fs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; + md5 = csync_statedb_get_uniqId( ctx, h, fs ); + if( md5 ) { + SAFE_FREE(fs->md5); + fs->md5 = md5; + fs->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MD5; + } CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Uniq ID read from Database: %s -> %s", path, fs->md5 ? fs->md5 : "" ); } diff --git a/src/csync_util.c b/src/csync_util.c index 6ac8972fde..c4f49629b3 100644 --- a/src/csync_util.c +++ b/src/csync_util.c @@ -230,7 +230,7 @@ static int _merge_file_trees_visitor(void *obj, void *data) { if( tfs && tfs->md5 ) { if( fs->md5 ) SAFE_FREE(fs->md5); fs->md5 = c_strdup( tfs->md5 ); - CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "PRE UPDATED %s: %s <-> %s", fs->path, fs->md5, tfs->md5); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "PRE UPDATED %s: %s", fs->path, fs->md5); } else { CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "md5 is empty in merger!"); } diff --git a/src/vio/csync_vio_file_stat.c b/src/vio/csync_vio_file_stat.c index 118b5c5ff9..352b8e83ce 100644 --- a/src/vio/csync_vio_file_stat.c +++ b/src/vio/csync_vio_file_stat.c @@ -30,7 +30,7 @@ csync_vio_file_stat_t *csync_vio_file_stat_new(void) { if (file_stat == NULL) { return NULL; } - + file_stat->md5 = NULL; return file_stat; } From 4bae545c9008d45f16ba8335c413c64c5afb7b5b Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Sun, 23 Sep 2012 11:01:59 +0200 Subject: [PATCH 103/106] vio plugin loading: cut of filename regardless of length. --- src/vio/csync_vio.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/vio/csync_vio.c b/src/vio/csync_vio.c index 167c27f729..61406460b4 100644 --- a/src/vio/csync_vio.c +++ b/src/vio/csync_vio.c @@ -61,7 +61,7 @@ int csync_vio_init(CSYNC *ctx, const char *module, const char *args) { _TCHAR tbuf[MAX_PATH]; const _TCHAR *pathBuf = NULL; char *buf = NULL; - int indx = 0; + char *last_bslash = NULL; #endif if (asprintf(&path, "%s/csync_%s.%s", PLUGINDIR, module, MODULE_EXTENSION) < 0) { @@ -84,10 +84,9 @@ int csync_vio_init(CSYNC *ctx, const char *module, const char *args) { /* Change the current working directory to read the module from a relative path. */ if( GetModuleFileNameW(NULL, tbuf, MAX_PATH) > 0 ) { buf = c_utf8(tbuf); - /* cut the trailing owncloud.exe off */ - if( strlen(buf)>13) { - indx = strlen(buf)-13; - buf[indx]='\0'; + /* cut the trailing filename off */ + if ((last_bslash = strrchr(buf, '\\')) != NULL) { + *last_bslash='\0'; pathBuf = c_multibyte(buf); CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Win32: changing current working dir to %s", buf); From 6c334628425d80471f3a8c67996629a9dcb5b611 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Sun, 23 Sep 2012 11:02:18 +0200 Subject: [PATCH 104/106] Remove redundant code block --- src/vio/csync_vio.c | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/vio/csync_vio.c b/src/vio/csync_vio.c index 61406460b4..cb095d0839 100644 --- a/src/vio/csync_vio.c +++ b/src/vio/csync_vio.c @@ -103,24 +103,6 @@ int csync_vio_init(CSYNC *ctx, const char *module, const char *args) { c_free_multibyte(mpath); #endif -#ifdef __APPLE__ - if (lstat(path, &sb) < 0) { - SAFE_FREE(path); - - char path_tmp[1024]; - uint32_t size = sizeof(path_tmp); - if (_NSGetExecutablePath(path_tmp, &size) == 0) - printf("executable path is %s\n", path_tmp); - - char* path2 = NULL; - path2 = c_dirname(path_tmp); - - if (asprintf(&path, "%s/../Plugins/csync_%s.%s", path2, module, MODULE_EXTENSION) < 0) { - return -1; - } - } -#endif - #ifdef __APPLE__ if (lstat(path, &sb) < 0) { SAFE_FREE(path); From c4db7d1acfda6f0f708e1cc70f3ec6b7f42e5467 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 28 Sep 2012 14:11:20 +0200 Subject: [PATCH 105/106] use correct DAV property for lastmodified. --- modules/csync_owncloud.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 4163e32efb..01fc965e6b 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -1892,7 +1892,7 @@ static int owncloud_utimes(const char *uri, const struct timeval *times) { return -1; /* FIXME: Find good errno */ } pname.nspace = "DAV:"; - pname.name = "lastmodified"; + pname.name = "getlastmodified"; newmodtime = modtime->tv_sec; From 29e4e506e6634439556aa9454f8fd1f3251976aa Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Fri, 28 Sep 2012 17:36:04 +0200 Subject: [PATCH 106/106] Switch back to PROPSET lastmodified as getlastmodified is readonly. --- modules/csync_owncloud.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 01fc965e6b..4163e32efb 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -1892,7 +1892,7 @@ static int owncloud_utimes(const char *uri, const struct timeval *times) { return -1; /* FIXME: Find good errno */ } pname.nspace = "DAV:"; - pname.name = "getlastmodified"; + pname.name = "lastmodified"; newmodtime = modtime->tv_sec;