> From: Aleksander Morgado <[email protected]> > Date: Mon, 19 Apr 2010 09:53:04 +0200 > > > > Here is a patch for #117, text object and ASCII concat (doc and tests are a > > gift :-) ). > > > > Wow, thanks, that was fast! Just a minor comment: use current year 2010 > in the copyright notice of the new files. >
Ouch, corrected. :-) ## # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: [email protected] # target_branch: file:///home/gerel/PROJECTS/libgnupdf/trunk/ # testament_sha1: 57e1baa33322166419a32ff471d0a601b76d5461 # timestamp: 2010-04-19 08:21:53 -0300 # base_revision_id: [email protected] # # Begin patch === modified file 'ChangeLog' --- ChangeLog 2010-04-18 11:13:22 +0000 +++ ChangeLog 2010-04-19 11:21:49 +0000 @@ -1,3 +1,19 @@ +2010-04-18 Gerardo E. Gidoni <[email protected]> + + Added new method pdf_text_concat_ascii() + * doc/gnupdf.texi: added its documentation. + + * src/base/pdf-text.c: added implementation. + + * src/base/pdf-text.h: likewise. + + * torture/unit/Makefile.am: test implementation. + + * torture/unit/base/text/tsuite-text.c: likewise. + + * torture/unit/base/text/pdf-text-concat-ascii.c: likewise. + + 2010-04-15 Jose E. Marchesi <[email protected]> Remove spurious blank lines before EOF in the codebase. === modified file 'doc/gnupdf.texi' --- doc/gnupdf.texi 2010-04-13 20:50:45 +0000 +++ doc/gnupdf.texi 2010-04-19 11:21:49 +0000 @@ -6573,6 +6573,39 @@ @end table @end deftypefun + +...@deftypefun pdf_status_t pdf_text_concat_ascii (pdf_text_t @var{text1}, const pdf_char_t * @var{ascii_str}) + +Concatenate the contents of text variable @var{text1} with ASCII string @var{ascii_str}, +and store the result in @var{text1}. + +...@table @strong +...@item Parameters +...@table @var +...@item text1 +The first text variable to concatenate. The contents of this variable +are modified with the output of the concatenation. +...@item ascii_str +The ascii string to concatenate. The contents of this variable +are left unchanged. +...@end table +...@item Returns +The status of the operation. +...@item Usage Example +...@example +pdf_text_t text1; +pdf_char_t * str; + +/* ...initialize `text1' and `str... */ +if (pdf_text_concat_ascii (text1, str) != PDF_OK) +...@{ + /* Manage the error */ +...@} +...@end example +...@end table +...@end deftypefun + + @deftypefun pdf_status_t pdf_text_replace (pdf_text_t @var{text}, const pdf_text_t @var{new_pattern}, const pdf_text_t @var{old_pattern}) Replace a fixed pattern in the content of a given text variable. === modified file 'src/base/pdf-text.c' --- src/base/pdf-text.c 2010-02-20 16:02:07 +0000 +++ src/base/pdf-text.c 2010-04-19 11:21:49 +0000 @@ -1024,6 +1024,52 @@ } +/* Concatenate a text variable with an ascii string */ +pdf_status_t +pdf_text_concat_ascii (pdf_text_t text1, + const pdf_char_t * ascii_str) +{ + pdf_size_t len; + + len = (pdf_size_t) strlen ((char*)ascii_str); + if (!pdf_text_is_ascii7 (ascii_str, len)) + { + return PDF_EBADDATA; + } + + /* now convert to utf32he and concatenate */ + if(len > 0) + { + pdf_char_t * newbuf; + pdf_status_t ret; + pdf_char_t *tmp_data; + pdf_size_t tmp_size; + + /* ascii string is valid utf8 */ + ret = pdf_text_utf8_to_utf32he (ascii_str, len, &tmp_data, &tmp_size); + if (ret != PDF_OK) + { + return ret; + } + + newbuf = (pdf_char_t *)pdf_realloc (text1->data, text1->size + tmp_size); + if (newbuf == NULL) + { + return PDF_ENOMEM; + } + else + { + text1->data = newbuf; + } + + memcpy (&(text1->data[text1->size]), tmp_data, tmp_size); + text1->size += tmp_size; + pdf_dealloc (tmp_data); + } + + return PDF_OK; +} + /* Default initial size of the list of replacements */ #define PDF_TEXT_ISLR 32 === modified file 'src/base/pdf-text.h' --- src/base/pdf-text.h 2010-02-20 16:02:07 +0000 +++ src/base/pdf-text.h 2010-04-19 11:21:49 +0000 @@ -282,6 +282,10 @@ const pdf_text_t text2, const pdf_bool_t override_langinfo); +/* Concatenate a text variable with an ascii string */ +pdf_status_t +pdf_text_concat_ascii (pdf_text_t text1, + const pdf_char_t * ascii_str); /* Replace a fixed pattern in the content of a given text variable */ pdf_status_t === modified file 'torture/unit/Makefile.am' --- torture/unit/Makefile.am 2010-02-19 01:03:33 +0000 +++ torture/unit/Makefile.am 2010-04-19 11:21:49 +0000 @@ -151,6 +151,7 @@ base/text/pdf-text-set-pdfdocenc.c \ base/text/pdf-text-set-unicode.c \ base/text/pdf-text-concat.c \ + base/text/pdf-text-concat-ascii.c \ base/text/pdf-text-replace.c \ base/text/pdf-text-replace-ascii.c \ base/text/pdf-text-filter.c \ === added file 'torture/unit/base/text/pdf-text-concat-ascii.c' --- torture/unit/base/text/pdf-text-concat-ascii.c 1970-01-01 00:00:00 +0000 +++ torture/unit/base/text/pdf-text-concat-ascii.c 2010-04-19 11:21:49 +0000 @@ -0,0 +1,227 @@ +/* -*- mode: C -*- + * + * File: pdf-text-concat-ascii.c + * Date: Mon Mar 10 18:30:01 2008 + * + * GNU PDF Library - Text Module - pdf_text_concat_ascii test case + * + */ + +/* Copyright (C) 2010 Free Software Foundation, Inc. */ + +/* 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 3 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, see <http://www.gnu.org/licenses/>. + */ + +#include <config.h> +#include <stdio.h> +#include <string.h> +#include <pdf.h> +#include <check.h> + +/* + * Test: pdf_text_concat_ascii_001 + * Description: + * Concatenate text object and non-empty ascii string. + * Success conditions: + * 1. The call to pdf_text_concat_ascii should return PDF_OK. + * 2. The contents of the output text object must be the expected ones. + * 3. The lang/country information in the output object must remain unchanged. + */ +START_TEST(pdf_text_concat_ascii_001) +{ + pdf_char_t *output_data = NULL; + pdf_text_t text1 = NULL; + pdf_char_t * text2 = " Unix"; + pdf_char_t *country = (pdf_char_t *)"GB"; + pdf_char_t *language = (pdf_char_t *)"en"; + + /* Always INIT! Check runs each test in a different process */ + fail_if(pdf_init() != PDF_OK); + + fail_if(pdf_text_new (&text1) != PDF_OK); + + fail_if(pdf_text_set_pdfdocenc(text1, (pdf_char_t *)"GNU's not") != PDF_OK); + + fail_if(pdf_text_set_language(text1, language) != PDF_OK); + fail_if(pdf_text_set_country(text1, country) != PDF_OK); + + /* 1. The call to pdf_text_concat_ascii should return PDF_OK. */ + fail_unless(pdf_text_concat_ascii(text1, text2) == PDF_OK); + + /* 2. The contents of the output text object must be the expected ones. */ + fail_if(pdf_text_get_pdfdocenc(&output_data, text1) != PDF_OK); + fail_unless(strlen((char *)output_data) == strlen("GNU's not Unix")); + fail_unless(strcmp((char *)output_data, "GNU's not Unix") == 0); + + /* 3. The lang/country information in the output object must remain + * unchanged. */ + fail_unless(strcmp((char *)pdf_text_get_language(text1), + (char *)language) == 0); + fail_unless(strcmp((char *)pdf_text_get_country(text1), + (char *)country) == 0); + + pdf_text_destroy(text1); + pdf_dealloc(output_data); +} +END_TEST + + +/* + * Test: pdf_text_concat_ascii_002 + * Description: + * Concatenate text object without lang/country with non-empty ascii string. + * Success conditions: + * 1. The call to pdf_text_concat_ascii should return PDF_OK. + * 2. The contents of the output text object must be the expected ones. + * 3. The lang/country information in the output object must be empty. + */ +START_TEST(pdf_text_concat_ascii_002) +{ + pdf_char_t *output_data = NULL; + pdf_text_t text1 = NULL; + pdf_char_t * text2 = " Unix"; + + /* Always INIT! Check runs each test in a different process */ + fail_if(pdf_init() != PDF_OK); + + fail_if(pdf_text_new (&text1) != PDF_OK); + + fail_if(pdf_text_set_pdfdocenc(text1, (pdf_char_t *)"GNU's not") != PDF_OK); + + /* 1. The call to pdf_text_concat_ascii should return PDF_OK. */ + fail_unless(pdf_text_concat_ascii(text1, text2) == PDF_OK); + + /* 2. The contents of the output text object must be the expected ones. */ + fail_if(pdf_text_get_pdfdocenc(&output_data, text1) != PDF_OK); + fail_unless(strlen((char *)output_data) == strlen("GNU's not Unix")); + fail_unless(strcmp((char *)output_data, "GNU's not Unix") == 0); + + /* 3. The lang/country information in the output object must be empty. */ + fail_unless(strlen((char *)pdf_text_get_language(text1)) == 0); + fail_unless(strlen((char *)pdf_text_get_country(text1)) == 0); + + pdf_text_destroy(text1); + pdf_dealloc(output_data); +} +END_TEST + + +/* + * Test: pdf_text_concat_ascii_003 + * Description: + * Concatenate text object with empty string. + * Success conditions: + * 1. The call to pdf_text_concat_ascii should return PDF_OK. + * 2. The contents of the output text object should be empty. + * 3. The lang/country information in the output object must remain unchanged. + */ +START_TEST(pdf_text_concat_ascii_003) +{ + pdf_char_t *output_data = NULL; + pdf_text_t text1 = NULL; + pdf_char_t * text2 = ""; + pdf_char_t *country = (pdf_char_t *)"GB"; + pdf_char_t *language = (pdf_char_t *)"en"; + + /* Always INIT! Check runs each test in a different process */ + fail_if(pdf_init() != PDF_OK); + + fail_if(pdf_text_new (&text1) != PDF_OK); + + fail_if(pdf_text_set_pdfdocenc(text1, (pdf_char_t *)"GNU's not Unix") != PDF_OK); + fail_if(pdf_text_set_language(text1, language) != PDF_OK); + fail_if(pdf_text_set_country(text1, country) != PDF_OK); + + /* 1. The call to pdf_text_concat_ascii should return PDF_OK. */ + fail_unless(pdf_text_concat_ascii(text1, text2) == PDF_OK); + + /* 2. The contents of the output text object should be empty. */ + fail_if(pdf_text_get_pdfdocenc(&output_data, text1) != PDF_OK); + fail_unless(strlen((char *)output_data) == strlen("GNU's not Unix")); + fail_unless(strcmp((char *)output_data, "GNU's not Unix") == 0); + + /* 3. The lang/country information in the output object must remain + * unchanged. */ + fail_unless(strcmp((char *)pdf_text_get_language(text1), + (char *)language) == 0); + fail_unless(strcmp((char *)pdf_text_get_country(text1), + (char *)country) == 0); + + pdf_text_destroy(text1); + pdf_dealloc(output_data); +} +END_TEST + +/* + * Test: pdf_text_concat_ascii_004 + * Description: + * Concatenate empty text object with empty string. + * Success conditions: + * 1. The call to pdf_text_concat_ascii should return PDF_OK. + * 2. The contents of the output text object should be empty. + * 3. The lang/country information in the output object must remain unchanged. + */ +START_TEST(pdf_text_concat_ascii_004) +{ + pdf_char_t *output_data = NULL; + pdf_text_t text1 = NULL; + pdf_char_t * text2 = ""; + pdf_char_t *country = (pdf_char_t *)"GB"; + pdf_char_t *language = (pdf_char_t *)"en"; + + /* Always INIT! Check runs each test in a different process */ + fail_if(pdf_init() != PDF_OK); + + fail_if(pdf_text_new (&text1) != PDF_OK); + + fail_if(pdf_text_set_pdfdocenc(text1, (pdf_char_t *)"") != PDF_OK); + fail_if(pdf_text_set_language(text1, language) != PDF_OK); + fail_if(pdf_text_set_country(text1, country) != PDF_OK); + + /* 1. The call to pdf_text_concat_ascii should return PDF_OK. */ + fail_unless(pdf_text_concat_ascii(text1, text2) == PDF_OK); + + /* 2. The contents of the output text object should be empty. */ + fail_if(pdf_text_get_pdfdocenc(&output_data, text1) != PDF_OK); + fail_unless(strlen((char *)output_data) == 0); + + /* 3. The lang/country information in the output object must remain + * unchanged. */ + fail_unless(strcmp((char *)pdf_text_get_language(text1), + (char *)language) == 0); + fail_unless(strcmp((char *)pdf_text_get_country(text1), + (char *)country) == 0); + + pdf_text_destroy(text1); + pdf_dealloc(output_data); +} +END_TEST + + + +/* + * Test case creation function + */ +TCase * +test_pdf_text_concat_ascii (void) +{ + TCase *tc = tcase_create("pdf_text_concat_ascii"); + tcase_add_test(tc, pdf_text_concat_ascii_001); + tcase_add_test(tc, pdf_text_concat_ascii_002); + tcase_add_test(tc, pdf_text_concat_ascii_003); + tcase_add_test(tc, pdf_text_concat_ascii_004); + return tc; +} + +/* End of pdf-text-concat-ascii.c */ === modified file 'torture/unit/base/text/tsuite-text.c' --- torture/unit/base/text/tsuite-text.c 2010-02-20 16:02:07 +0000 +++ torture/unit/base/text/tsuite-text.c 2010-04-19 11:21:49 +0000 @@ -49,6 +49,7 @@ extern TCase *test_pdf_text_set_pdfdocenc (void); extern TCase *test_pdf_text_set_unicode (void); extern TCase *test_pdf_text_concat (void); +extern TCase *test_pdf_text_concat_ascii (void); extern TCase *test_pdf_text_replace (void); extern TCase *test_pdf_text_replace_ascii (void); extern TCase *test_pdf_text_filter (void); @@ -83,6 +84,7 @@ suite_add_tcase (s, test_pdf_text_set_pdfdocenc()); suite_add_tcase (s, test_pdf_text_set_unicode()); suite_add_tcase (s, test_pdf_text_concat()); + suite_add_tcase (s, test_pdf_text_concat_ascii()); suite_add_tcase (s, test_pdf_text_replace()); suite_add_tcase (s, test_pdf_text_replace_ascii()); suite_add_tcase (s, test_pdf_text_filter()); # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWSYNXQMACuL/gH8xKAB5//// f+/erv////pgEx9Q+gWZoZqz7dxWqACgA62wYUOZmbRW2Wg1JUqDsaKoq2ZFwkimppqn6YRPVP1D JPKemk9qmn6KbUYgaAaHqADQAAODINGgDJpiGmgyDEMIGgNGJiNAAAcGQaNAGTTENNBkGIYQNAaM TEaAAASKRI0aNNqGgAANGmho0AaNGgDQANDQCKQmU0yARqekyZNTaaniGqe1T9NRmUR6hpskaD1G gZAEiQQEwgE00mIAlPyepR+qaPU8mKep5IeoxPSAyPJqWrEEDQua34Em0SPbC+mX8IP09zwghp+a 20rSdGzc572eyzfaableZhmTfKy2S3mtbQ8c892VAqRiipxz9IDbEUP3QpLD3gdilb2g2IcXASCx TZBDkEhNNDblAiYMHMICTsYfDdzMP2/A8gmAw/85393O7/a0Lkpbv5k5sN/dtaYdH35QoyWysKeP Y73/Bwa0/l29vmm7+7OuXmsyC5GF2HDIsSFO06MOezeZoLWjRFq72eJ04qH4mbNu2DUeNQXIgwKN GA3sShMXUYBABNQANsF/0wt5kwAPOA0ljgkj5w5I7+/8w8LOzdp2W3XppojVOseIzJEtqgEYMQMY xNiPMhNgQbbN3mCQK2tUS8C0RQbNz+rUxEH9aWxHnG0222202DZ6NoLjtQY14XBeHHbQ7/DxkejC CxxcXDGX9ZxbUuiLdl1wNW+hlejHfDcPYz0RfOc4srxLv4wFA3MnyZ7B+Cb+7eBrC1sa+GVqff6P 8WDz+0JGsGRY0uP3ObbKHvV3pWA/T17KkkNirpIPJNAiBJkFf4yJp5SUHjdGq+ITkyXUJPjFCn73 mlBzCXMRywkMkWFY85jIvLGNGspVA/KhLuJ9A6QkfN6JKVXIKXNFNCgF1kByQIaD9WdulaVIslEI cwKgaTzVxtaYEsW075lN50HBXlLgeBcphxa56kOa6wIzpSH8s4SJhhhn1kgJbEsLVqkG+IA0vNuD bbcwNahsDG6QocWgVMAOAXVDn7wLtw7qymfuYbzrmtlplASvs04hjPIB4PdLodICoMb0CA3CVhKw IFkQwL4AlxlIs/xd2fcB1uneV5ORY+fhUAoIn44xyqEvYhW1obYC15TqdfVwtGautxPC5dotyZnN 2QpaUaSxKnerfBwxZ6isz/1LBvIW6oiB+5z3Xhe+NkTWGFZQB7UkhQ19iEsHyy3BARB+0zJmT03w YcNYpQB9DSAyQ4MWBuBMQmk1cgc2MMMBYIZN2UI+6HLz+Te+XyPPxevl5/H3GvfRwZBJbVMgPqj0 sqZuqjAKLry94iLzC9QL+O0MtcZC3g0mGOSkiamoB1tDbfGe28LwJrSDAONDSExJtJg2NiGxtV2Q gSGGBMIFO4gVNA4HZ48HfigSnJlDkNnkDahkkQ4SvTMzKvY4Fwddmp0O2adsTK4Rl+IwGDgIGokQ VQMYgxNixNh2mwN4rhGR9icXCxvLQ8fWLRtnlYILiY30jf4gy02h/f6JNVOP48qWjuCxR+uvADUD I2gU7+sdd1Q6rmNgxj+mA/q7ORjl5BJQDKkl5uIVIAwM2t+2yWKfcGKKEGPFUlOtI7bChJNREL5O zn6euQgbBOU4khNy8u60/kNQuLiYzUblDmKXbIKKvHWTN9zUkEMyhQmHuHNjVAHP29SZuqve0Cxk O12Ez3K7bV/KpVIc0JW5pnuKTRzEpETI2XrhDN0GQqUNpYXk2MwuGX35zsNgSWAecIN5axV5Rkyb iZMKCdGCG0kUER8zElgcJkpxX6MOPkcvZvJhmG8QZBAcYDC27UmILjTPS/LC28Zxma8MQ2pWoNSk shB8+kzknaDM1KVWEzHZLjuMn7KyDQuu91hgE6gjOzCb57Ut4gocjwMjswuLT23rLfrhsNKhWsA8 DMLQNKohoT9cISmrjsY+nK9UUGZI6mog4dZ8rAhNNZYlxNXqhM6kE0DLzcZFlxOWZsunQJO0eMxE iZBQvOJQzMA99DNTWKlXM2MjmydygoBU1yMTK85GBdKeAwwUKaDU8xsnkWqt50K3GJibTYJmV3An yyLChBxN5kaBptLCPIjg9umDq6Ki1C/LMWbUiysQA12GwqbA4t7bk3CGzXkg4wLWsbrGBmPOGXsO JAg5kiDeImchkyR6g5hQ5VKsOThuM8dhHQ3Wm8oBSogkQG/fgaGFthdNT5RwOBKQZQpEyphmpZXH NGanwOBdWzZnse6WucKi9YZzsNN1sym43Gw27ETDo9R1PyNMjTZZwOPs0QWFC20vI5a4qhrrccOM eFLTfYkVGgrgEamwt2yNDdeWLKl95kceFpUmBwwQWUKFC0ncOw3KPzTxyzlTaXTrFE4AMSSUFNhl G01tLLazp2bi9lKDt1Mnfi9M5n80yD5A1JGdxCLZxO9RPRQZkggQRCrI1JlLSogsN2BtOZtwLMB6 ntpUzL8sZnLt3lhZocTqIJHyhyDkEwwXTter9Yeqnu3bucdWlz3QtSc+sq9EEAVhA6OYFoiy13/E NfVCF0BpH7GpLbCyY3ZlRIDfCWKAQBonVMGIObLKSTTaSrITA/BQ0NMAghP78dEYJttnrCG96USZ DCRBUE9Xl1ewZBFI626HOO6oHQCTS0DEx1jUs9UeHatW4R/PJTiD6U+7TaaGxt1s5yq83vsbF2VE XPK/MBH/wf8UC9/4Z7PbgE4t2AaWmxjSQYQGSaiEEI/CujjnMLg4/jzmfkhBCD997QTRuzrLZ4wv +6BncEczohVQRwQg05admXdagRRolbK/G/WgrOkW2IOgUSoFcwrILMoCywuAswe12SCgqsQNgNkk Lk0GeEwUsiPJ8PoB2Khr4QsFydCp4QD2KsCJOAO+FiAgmklCcdUkkRHnFKBKYkCkq880CyQtFxAu PnVaWmSWR1JVRDtyqHwrqISFtJQ1n0nupoAMDAwTuO8voeBMqTIKGBlKfYU/T6iZ9pYcBjDMyMOB UmHH6y89SOBBTUg+LweOSMsBLkE0e8e2CKPd+rYeMDMOep8GIzrLD4txbC6b0xo5UOQSAC6meiJb dIAOjWBb7DAjgQLxlSSZdwsDCHgGoiSM39fgfgbDrY5FhNGqs0nCgeYRg3AeODqmpurdAFTS7Ejo vCC9UHd6MweYzG2rTIF8xkbDEZxHIfhisQaT1KS8zdUyJFwtNQIjEaA5RBp04jCEsQ20v9F8MB/I j9rSG++1TDwCoMJhEhS8SWRvNQzVDadCfkMvWEGoiG0YoQqB5LgH3kjmZE+TUBrSA2hpM4Y6gKyX i4+gU9Kr/vzILfmS+9MqHH1peoG08QGEfkQj/J0oVWb631bxSGAL4Cprzg8VgM6dxOMECICJVQMo 46UV6szS3S0oM3GdEmjN8uGU4ChBlJ0GYinJUlGjd77TUx5h+LQDY7zIoj97PtPUiDG86e4wRMO7 88ckXBT1i3kKK95pNExS4MTn5J5QyPR27btwD59wPA8Cx+dKINjPoJ8TNr3qSeRaFCtpK1oQ6S8R TRak6MmwKDEHzu1k1ulF9wWXQyc0K9XqQ0yaRCKriek667pGPpfM2mV/K+cGyVTyHsKlcTOYGs1Y Wx1oc635IbQEtF1NiXrQSjiXnYHHGSGeYckfiCOYdkq88oTDtNiV2bX3Ym0rcOLcfLxhtUk1Ru7N Ud+TDSxYxAEVHNsoiFhAxynYZkNk3h5mQN6mkDnD4MkxBwcjVSaG3zSh+EcVdy3IR4h2Wm14qtoU +gPHQDakGt32NAwajMNqMwvTBpgwlOgyiF9/zBpIRkI42e3IEgxkqqevL6NQeY/bNAmqaBfSdRed kDObmXp91XTSb3DfJUhJSGQcK0CGnJxwLtJQjpBlG76V6Q8S4AUhySAsTndeO+yZwU4TLkWu4goo zSkIS7Qg5jrUKQJCGXuNoELLSdoOXkUe+C1ojMF4B6XiHgCDIyue2YzQ5wD9EhVrv7pWgI5kJECQ kQQBChEa7BbJS4hMk0ZHRsz6x4VYV8IA4ZDJbHaRJgjoKb/BnvUA4ujgceiS8on43bfjo4tEjzia 47UFveRBKCH2QvTPEysmFYf+J1iZ6AYCNgeH19O+zXHuYJtNjYMBhcGeB+pNmOi2+sReVXYB717E MsA8GTqFfdSaDMvYA+4s/mBNgHYGJxJAEQsVeEJ8rrEzFHBC6YYoTlrIVLIJpQ+tvWT7mLCF6Oj6 CFxCtSaaRgwK41OcusIIW9ILV77LKKci1gcXgISHHMOonWVKbyZBDofOfUFgvIgOGJDn5QBtSHjR L2RI6502kWF77WHxCgaoLPQguAhXK8FbYCwmr6REERQFAVJIKRMnRpDBugg+tgTUHeISCkAWvWah 7aIjTKtyHBQf7HA5iJqKImmHeFpt7oJ2oG0NosoEsZheEfFCShusjpmFgxSGFYUhtNBkCX9ggUbt oU6d8Dnh4zvclguuzAnIMxM4R1FWf21EPec/befPZ33qDofm0mMA2IBJqJ9CwvLnCWXDVYKK01Vl E8kpxz7d4Tej1is1NMx0CcHN8s6PsNCDSZmQOsOsOYIf7BMvQkETWgl6bSaCirEU+k226lAI1Rpw CckMRIYQGkSlMlJwS+BJBc4cgbY2NjaKgQH+7SUgZWKAX2Nt5Adn9wciCQty7c70t1e8LEifAEHS h9K+H3B4E/lsaEQ2sY8lMIakzEJSmq3lwk3I07tNJR6iRQDIhDaCL33S5YGZ6TLFCJCYVQEdO6B/ nCBvj1gD4mYkrRXaGXSBGYMRVI+wn6As3JDa6hY07o5SDosbA6sxDroFLFNiQyEQW+ntDMGF9JhL 8UJ5dEhKN8NlDdwerQnqDELX5Q7sv1cAZkFXowi9g2xl6Yjdf205CLpAQlZVC3w2g+0oDEOhdMFX MC4DC4MhvmDSwdOAk5jYfpG9BsIQVYSF9doWGJRkrpkeUJJayj29qWfhlyAk+LC6VtQVshgxNJ0U 9wQKKBMCUgN3ZfaDsV2BILQtlKpRDRewUkwAKhiXAhNQJLgoSAKrE1gLmQEkAoIWhqTpMqoR5bgs xaLilgXtGA1OJbAhKKZVI2ZLYyHKHzZp3nYEgD0HCuwvJMiPSykYmuEAvwTGktFkKH9DuTAkEAMS aCYdeYagUSAbWZBx7Y6+Y7aIPa0mFA02383DEs+5Ihdy7tAQTARJoaBMuhIyaDp2DnyXOwXSm+6i +EJG8TFa9YB/Fr3hzcCfAOwNaTEMcUaypy8MzxB97KxPf2vAoawuQdgYS3iDsEi7+gFrQ3gggvoO YINq5BP2MTRf0nsVB1JCPqO83H1hMMGfdaGqvvCgfMpQmIrw2IOYfcV+1/FO4GAgWfDj2BmNBpEm pI1CBJDHsCreuouLfHxB5n3h4gvabwJ5RDV93Kf5ZOEVSGigO8HB6Lgx/xdyRThQkCYNXQM= ### -gerel
