# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: address@hidden
# 1vk44n5efr9b39rq
# target_branch: bzr://bzr.sv.gnu.org/pdf/libgnupdf/trunk/
# testament_sha1: f0f86d87054a9ca1ff4b0c5482bb95aa9734123c
# timestamp: 2011-12-14 18:56:50 +0100
# base_revision_id: address@hidden
#
# Begin patch
=== modified file 'AUTHORS'
--- AUTHORS 2011-08-04 13:49:13 +0000
+++ AUTHORS 2011-12-14 17:56:25 +0000
@@ -34,6 +34,7 @@
Franck Lesage: changed pdf-hash-helper.c pdf-hash-helper.h gnupdf.texi
Georg Gottleuber: changed pdf-filter.c pdf-stm-f-pred.c pdf-stm-f-pred.h
+ torture/unit/base/stm/pdf-stm-rw-filter-jbig2.c
Gerardo E. Gidoni: changed gnupdf.texi pdf-stm-read.c gnupdf-tsd.texi
pdf-stm-write.c configure.ac pdf-filter.c pdf-stm-f-flate.h
=== modified file 'ChangeLog'
--- ChangeLog 2011-10-11 21:17:52 +0000
+++ ChangeLog 2011-12-14 17:56:25 +0000
@@ -1,3 +1,10 @@
+2011-12-14 Georg Gottleuber
+
+ torture: JBIG2 unit tests added
+ * torture/unit/base/stm/pdf-stm-rw-filter-jbig2.c: new file
+ * torture/unit/base/stm/tsuite-stm.c: added JBIG2 unit tests
+ * torture/unit/Makefile.am: added JBIG2 unit tests
+
2011-10-11 Jose E. Marchesi
prmgt: converters to html reverted to a previous revision.
=== modified file 'torture/unit/Makefile.am'
--- torture/unit/Makefile.am 2011-08-29 15:17:29 +0000
+++ torture/unit/Makefile.am 2011-12-14 17:56:25 +0000
@@ -76,7 +76,8 @@
base/stm/pdf-stm-rw-filter-a85.c \
base/stm/pdf-stm-rw-filter-flate.c \
base/stm/pdf-stm-rw-filter-v2.c \
- base/stm/pdf-stm-rw-filter-aesv2.c
+ base/stm/pdf-stm-rw-filter-aesv2.c \
+ base/stm/pdf-stm-rw-filter-jbig2.c
TEST_SUITE_HASH = base/hash/pdf-hash-new.c \
base/hash/pdf-hash-add.c \
=== added file 'torture/unit/base/stm/pdf-stm-rw-filter-jbig2.c'
--- torture/unit/base/stm/pdf-stm-rw-filter-jbig2.c 1970-01-01 00:00:00 +0000
+++ torture/unit/base/stm/pdf-stm-rw-filter-jbig2.c 2011-12-14 17:56:25 +0000
@@ -0,0 +1,473 @@
+/* -*- mode: C -*-
+ *
+ * File: pdf-stm-rw-filter-jbig2.c
+ * Date: Fr Dec 9 09:50:09 2011
+ *
+ * GNU PDF Library - Unit tests for JBIG2 decoder filter.
+ *
+ */
+
+/* Copyright (C) 2011 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 .
+ */
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include "pdf-stm-test-common.h"
+
+#define JBIG2_PARAM_GLOBAL_STREAMS_BUFFER "GlobalStreamsBuffer"
+#define JBIG2_PARAM_GLOBAL_STREAMS_SIZE "GlobalStreamsSize"
+
+struct test_strings_s {
+ pdf_size_t pageseg_size;
+ const pdf_char_t *pageseg;
+
+ pdf_size_t globalseg_size;
+ const pdf_char_t *globalseg;
+
+ pdf_size_t bitmap_size;
+ const pdf_char_t *bitmap;
+};
+
+static const struct test_strings_s test_strings_with_halftones[] = {
+ {
+ /* from ISO/IEC 14492 draft annex H */
+ 341,
+ /* segments 2 to 7 from ISO/IEC 14492 (Huffman & MMR coding) */
+ "\x00\x00\x00\x01\x30\x00\x01\x00\x00\x00\x13\x00\x00\x00\x40\x00"
+ "\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00"
+ "\x00\x02\x00\x01\x01\x00\x00\x00\x1c\x00\x01\x00\x00\x00\x02\x00"
+ "\x00\x00\x02\xe5\xcd\xf8\x00\x79\xe0\x84\x10\x81\xf0\x82\x10\x86"
+ "\x10\x79\xf0\x00\x80\x00\x00\x00\x03\x07\x42\x00\x02\x01\x00\x00"
+ "\x00\x31\x00\x00\x00\x25\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00"
+ "\x00\x01\x00\x0c\x09\x00\x10\x00\x00\x00\x05\x01\x10\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x40\x07\x08"
+ "\x70\x41\xd0\x00\x00\x00\x04\x27\x00\x01\x00\x00\x00\x2c\x00\x00"
+ "\x00\x36\x00\x00\x00\x2c\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x01"
+ "\x26\xa0\x71\xce\xa7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
+ "\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xf0\x00\x00\x00\x05\x10\x01"
+ "\x01\x00\x00\x00\x2d\x01\x04\x04\x00\x00\x00\x0f\x20\xd1\x84\x61"
+ "\x18\x45\xf2\xf9\x7c\x8f\x11\xc3\x9e\x45\xf2\xf9\x7d\x42\x85\x0a"
+ "\xaa\x84\x62\x2f\xee\xec\x44\x62\x22\x35\x2a\x0a\x83\xb9\xdc\xee"
+ "\x77\x80\x00\x00\x00\x06\x17\x20\x05\x01\x00\x00\x00\x57\x00\x00"
+ "\x00\x20\x00\x00\x00\x24\x00\x00\x00\x10\x00\x00\x00\x0f\x00\x01"
+ "\x00\x00\x00\x08\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x04\x00\x00\x00\xaa\xaa\xaa\xaa\x80\x08\x00\x80\x36\xd5\x55\x6b"
+ "\x5a\xd4\x00\x40\x04\x2e\xe9\x52\xd2\xd2\xd2\x8a\xa5\x4a\x00\x20"
+ "\x02\x23\xe0\x95\x24\xb4\x92\x8a\x4a\x92\x54\x92\xd2\x4a\x29\x2a"
+ "\x49\x40\x04\x00\x40",
+ 68,
+ /* segments 1 an 17 from ISO/IEC 14492 */
+ "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x18\x00\x01\x00\x00\x00"
+ "\x01\x00\x00\x00\x01\xe9\xcb\xf4\x00\x26\xaf\x04\xbf\xf0\x78\x2f"
+ "\xe0\x00\x40\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x16\x08\x00"
+ "\x02\xff\x00\x00\x00\x01\x00\x00\x00\x01\x4f\xe7\x8d\x68\x1b\x14"
+ "\x2f\x3f\xff\xac",
+ 448,
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x07\x87\x8f\x0f\x0f\x00\x00\x00"
+ "\x08\x40\x48\x80\x90\x80\x00\x00\x08\x07\xc8\x8f\x90\x00\x00\x00"
+ "\x08\x08\x48\x90\x90\x00\x00\x00\x08\x48\x4f\x10\x90\x80\x00\x00"
+ "\x07\x87\xc8\x0f\x8f\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00"
+ "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xc0"
+ "\x0f\xff\xff\xff\xff\xff\xff\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x02\x22\x00\xc0"
+ "\x0c\x00\x02\x66\x66\xee\x00\xc0\x0c\x00\x00\x02\x66\x66\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x04\x00\xc0\x0c\x00\x00\x00\x22\x22\x00\xc0"
+ "\x0c\x00\x26\x66\x6e\xee\x00\xc0\x0c\x00\x00\x26\x66\x67\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x44\x00\xc0\x0c\x00\x00\x02\x22\x26\x00\xc0"
+ "\x0c\x00\x66\x66\xee\xee\x00\xc0\x0c\x00\x02\x66\x66\x7f\x00\xc0"
+ "\x0c\x00\x00\x00\x04\x44\x00\xc0\x0c\x00\x00\x22\x22\x66\x00\xc0"
+ "\x0c\x00\x66\x6e\xee\xee\x00\xc0\x0c\x00\x26\x66\x67\xff\x00\xc0"
+ "\x0c\x00\x00\x00\x44\x46\x00\xc0\x0c\x00\x02\x22\x26\x66\x00\xc0"
+ "\x0c\x00\x66\xee\xee\xef\x00\xc0\x0c\x00\x66\x66\x7f\xff\x00\xc0"
+ "\x0c\x00\x00\x04\x44\x66\x00\xc0\x0c\x00\x22\x22\x66\x6e\x00\xc0"
+ "\x0c\x00\x6e\xee\xee\xff\x00\xc0\x0c\x00\x66\x67\xff\xff\x00\xc0"
+ "\x0c\x00\x00\x44\x46\x66\x00\xc0\x0c\x00\x22\x26\x66\xef\x00\xc0"
+ "\x0c\x00\xee\xee\xef\xff\x00\xc0\x0c\x00\x66\x7f\xff\xff\x00\xc0"
+ "\x0c\x00\x04\x44\x66\x66\x00\xc0\x0c\x00\x22\x66\x6e\xff\x00\xc0"
+ "\x0c\x00\xee\xee\xff\xff\x00\xc0\x0c\x00\x67\xff\xff\xff\x00\xc0"
+ "\x0c\x00\x44\x46\x66\x67\x00\xc0\x0c\x00\x26\x66\xef\xff\x00\xc0"
+ "\x0c\x00\xee\xef\xff\xff\x00\xc0\x0c\x00\x7f\xff\xff\xff\x00\xc0"
+ "\x0c\x00\x44\x66\x66\x7f\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0f\xff\xff\xff\xff\xff\xff\xc0"
+ "\x0f\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00"
+ },
+ {
+ 271,
+ /* segments 8 to 14 from ISO/IEC 14492 (arithmetic coding) */
+ "\x00\x00\x00\x08\x30\x00\x01\x00\x00\x00\x13\x00\x00\x00\x40\x00"
+ "\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00"
+ "\x00\x09\x00\x01\x01\x00\x00\x00\x1b\x08\x00\x02\xff\x00\x00\x00"
+ "\x02\x00\x00\x00\x02\x4f\xe7\x8c\x20\x0e\x1d\xc7\xcf\x01\x11\xc4"
+ "\xb2\x6f\xff\xac\x00\x00\x00\x0a\x07\x40\x00\x09\x01\x00\x00\x00"
+ "\x1f\x00\x00\x00\x25\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00"
+ "\x01\x00\x0c\x08\x00\x00\x00\x05\x8d\x6e\x5a\x12\x40\x85\xff\xac"
+ "\x00\x00\x00\x0b\x27\x00\x01\x00\x00\x00\x23\x00\x00\x00\x36\x00"
+ "\x00\x00\x2c\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x08\x03\xff\xfd"
+ "\xff\x02\xfe\xfe\xfe\x04\xee\xed\x87\xfb\xcb\x2b\xff\xac\x00\x00"
+ "\x00\x0c\x10\x01\x01\x00\x00\x00\x1c\x06\x04\x04\x00\x00\x00\x0f"
+ "\x90\x71\x6b\x6d\x99\xa7\xaa\x49\x7d\xf2\xe5\x48\x1f\xdc\x68\xbc"
+ "\x6e\x40\xbb\xff\xac\x00\x00\x00\x0d\x17\x20\x0c\x01\x00\x00\x00"
+ "\x3e\x00\x00\x00\x20\x00\x00\x00\x24\x00\x00\x00\x10\x00\x00\x00"
+ "\x0f\x00\x02\x00\x00\x00\x08\x00\x00\x00\x09\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x04\x00\x00\x00\x87\xcb\x82\x1e\x66\xa4\x14\xeb\x3c"
+ "\x4a\x15\xfa\xcc\xd6\xf3\xb1\x6f\x4c\xed\xbf\xa7\xbf\xff\xac",
+ 68,
+ /* segments 1 an 17 from ISO/IEC 14492 */
+ "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x18\x00\x01\x00\x00\x00"
+ "\x01\x00\x00\x00\x01\xe9\xcb\xf4\x00\x26\xaf\x04\xbf\xf0\x78\x2f"
+ "\xe0\x00\x40\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x16\x08\x00"
+ "\x02\xff\x00\x00\x00\x01\x00\x00\x00\x01\x4f\xe7\x8d\x68\x1b\x14"
+ "\x2f\x3f\xff\xac",
+ 448,
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x07\x87\x8f\x0f\x0f\x00\x00\x00"
+ "\x08\x40\x48\x80\x90\x80\x00\x00\x08\x07\xc8\x8f\x90\x00\x00\x00"
+ "\x08\x08\x48\x90\x90\x00\x00\x00\x08\x48\x4f\x10\x90\x80\x00\x00"
+ "\x07\x87\xc8\x0f\x8f\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00"
+ "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xc0"
+ "\x0f\xff\xff\xff\xff\xff\xff\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x02\x22\x00\xc0"
+ "\x0c\x00\x02\x66\x66\xee\x00\xc0\x0c\x00\x00\x02\x66\x66\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x04\x00\xc0\x0c\x00\x00\x00\x22\x22\x00\xc0"
+ "\x0c\x00\x26\x66\x6e\xee\x00\xc0\x0c\x00\x00\x26\x66\x67\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x44\x00\xc0\x0c\x00\x00\x02\x22\x26\x00\xc0"
+ "\x0c\x00\x66\x66\xee\xee\x00\xc0\x0c\x00\x02\x66\x66\x7f\x00\xc0"
+ "\x0c\x00\x00\x00\x04\x44\x00\xc0\x0c\x00\x00\x22\x22\x66\x00\xc0"
+ "\x0c\x00\x66\x6e\xee\xee\x00\xc0\x0c\x00\x26\x66\x67\xff\x00\xc0"
+ "\x0c\x00\x00\x00\x44\x46\x00\xc0\x0c\x00\x02\x22\x26\x66\x00\xc0"
+ "\x0c\x00\x66\xee\xee\xef\x00\xc0\x0c\x00\x66\x66\x7f\xff\x00\xc0"
+ "\x0c\x00\x00\x04\x44\x66\x00\xc0\x0c\x00\x22\x22\x66\x6e\x00\xc0"
+ "\x0c\x00\x6e\xee\xee\xff\x00\xc0\x0c\x00\x66\x67\xff\xff\x00\xc0"
+ "\x0c\x00\x00\x44\x46\x66\x00\xc0\x0c\x00\x22\x26\x66\xef\x00\xc0"
+ "\x0c\x00\xee\xee\xef\xff\x00\xc0\x0c\x00\x66\x7f\xff\xff\x00\xc0"
+ "\x0c\x00\x04\x44\x66\x66\x00\xc0\x0c\x00\x22\x66\x6e\xff\x00\xc0"
+ "\x0c\x00\xee\xee\xff\xff\x00\xc0\x0c\x00\x67\xff\xff\xff\x00\xc0"
+ "\x0c\x00\x44\x46\x66\x67\x00\xc0\x0c\x00\x26\x66\xef\xff\x00\xc0"
+ "\x0c\x00\xee\xef\xff\xff\x00\xc0\x0c\x00\x7f\xff\xff\xff\x00\xc0"
+ "\x0c\x00\x44\x66\x66\x7f\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0f\xff\xff\xff\xff\xff\xff\xc0"
+ "\x0f\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00"
+ },
+ { 0, NULL, 0, NULL, 0, NULL }
+};
+
+static const struct test_strings_s test_strings_without_halftones[] = {
+ /* from ISO/IEC 14492 draft annex H (but without halftone region) */
+ {
+ 197,
+ /* segments 8 to 14 from ISO/IEC 14492 (arithmetic coding)
+ * but without halftone segment */
+ "\x00\x00\x00\x08\x30\x00\x01\x00\x00\x00\x13\x00\x00\x00\x40\x00"
+ "\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00"
+ "\x00\x09\x00\x01\x01\x00\x00\x00\x1b\x08\x00\x02\xff\x00\x00\x00"
+ "\x02\x00\x00\x00\x02\x4f\xe7\x8c\x20\x0e\x1d\xc7\xcf\x01\x11\xc4"
+ "\xb2\x6f\xff\xac\x00\x00\x00\x0a\x07\x40\x00\x09\x01\x00\x00\x00"
+ "\x1f\x00\x00\x00\x25\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00"
+ "\x01\x00\x0c\x08\x00\x00\x00\x05\x8d\x6e\x5a\x12\x40\x85\xff\xac"
+ "\x00\x00\x00\x0b\x27\x00\x01\x00\x00\x00\x23\x00\x00\x00\x36\x00"
+ "\x00\x00\x2c\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x08\x03\xff\xfd"
+ "\xff\x02\xfe\xfe\xfe\x04\xee\xed\x87\xfb\xcb\x2b\xff\xac\x00\x00"
+ "\x00\x0c\x10\x01\x01\x00\x00\x00\x1c\x06\x04\x04\x00\x00\x00\x0f"
+ "\x90\x71\x6b\x6d\x99\xa7\xaa\x49\x7d\xf2\xe5\x48\x1f\xdc\x68\xbc"
+ "\x6e\x40\xbb\xff\xac",
+ 68,
+ "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x18\x00\x01\x00\x00\x00"
+ "\x01\x00\x00\x00\x01\xe9\xcb\xf4\x00\x26\xaf\x04\xbf\xf0\x78\x2f"
+ "\xe0\x00\x40\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x16\x08\x00"
+ "\x02\xff\x00\x00\x00\x01\x00\x00\x00\x01\x4f\xe7\x8d\x68\x1b\x14"
+ "\x2f\x3f\xff\xac",
+ 448,
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x07\x87\x8f\x0f\x0f\x00\x00\x00"
+ "\x08\x40\x48\x80\x90\x80\x00\x00\x08\x07\xc8\x8f\x90\x00\x00\x00"
+ "\x08\x08\x48\x90\x90\x00\x00\x00\x08\x48\x4f\x10\x90\x80\x00\x00"
+ "\x07\x87\xc8\x0f\x8f\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00"
+ "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xc0"
+ "\x0f\xff\xff\xff\xff\xff\xff\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0f\xff\xff\xff\xff\xff\xff\xc0"
+ "\x0f\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00"
+ },
+ /* same as above but with global and page segments exchanged;
+ * this should fail because of exchanged global and page streams */
+ {
+ 68,
+ "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x18\x00\x01\x00\x00\x00"
+ "\x01\x00\x00\x00\x01\xe9\xcb\xf4\x00\x26\xaf\x04\xbf\xf0\x78\x2f"
+ "\xe0\x00\x40\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x16\x08\x00"
+ "\x02\xff\x00\x00\x00\x01\x00\x00\x00\x01\x4f\xe7\x8d\x68\x1b\x14"
+ "\x2f\x3f\xff\xac",
+ 197,
+ "\x00\x00\x00\x08\x30\x00\x01\x00\x00\x00\x13\x00\x00\x00\x40\x00"
+ "\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00"
+ "\x00\x09\x00\x01\x01\x00\x00\x00\x1b\x08\x00\x02\xff\x00\x00\x00"
+ "\x02\x00\x00\x00\x02\x4f\xe7\x8c\x20\x0e\x1d\xc7\xcf\x01\x11\xc4"
+ "\xb2\x6f\xff\xac\x00\x00\x00\x0a\x07\x40\x00\x09\x01\x00\x00\x00"
+ "\x1f\x00\x00\x00\x25\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00"
+ "\x01\x00\x0c\x08\x00\x00\x00\x05\x8d\x6e\x5a\x12\x40\x85\xff\xac"
+ "\x00\x00\x00\x0b\x27\x00\x01\x00\x00\x00\x23\x00\x00\x00\x36\x00"
+ "\x00\x00\x2c\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x08\x03\xff\xfd"
+ "\xff\x02\xfe\xfe\xfe\x04\xee\xed\x87\xfb\xcb\x2b\xff\xac\x00\x00"
+ "\x00\x0c\x10\x01\x01\x00\x00\x00\x1c\x06\x04\x04\x00\x00\x00\x0f"
+ "\x90\x71\x6b\x6d\x99\xa7\xaa\x49\x7d\xf2\xe5\x48\x1f\xdc\x68\xbc"
+ "\x6e\x40\xbb\xff\xac",
+ 0,
+ NULL
+ },
+ { 0, NULL, 0, NULL, 0, NULL }
+};
+
+
+static const struct test_params_s tests_params[] = {
+ /* No Test type Test operation Loop read size Cache size */
+ { 1, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_ONE, 0 },
+ { 2, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_TWO, 0 },
+ { 3, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_HALF, 0 },
+ { 4, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_EXACT, 0 },
+ { 5, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_DOUBLE, 0 },
+
+ { 6, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_ONE, 0 },
+ { 7, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_TWO, 0 },
+ { 8, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_HALF, 0 },
+ { 9, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_EXACT, 0 },
+ { 10, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_DOUBLE, 0 },
+
+ { 11, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_ONE, 0 },
+ { 12, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_TWO, 0 },
+ { 13, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_HALF, 0 },
+ { 14, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_EXACT, 0 },
+ { 15, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_DOUBLE, 0 },
+
+ { 16, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_ONE, 0 },
+ { 17, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_TWO, 0 },
+ { 18, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_HALF, 0 },
+ { 19, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_EXACT, 0 },
+ { 20, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_DOUBLE, 0 },
+};
+
+static void
+common_test_jbig2 (const pdf_char_t *function_name,
+ int test_index,
+ const struct test_strings_s *test_strings)
+{
+ int i;
+ const struct test_params_s *params = &tests_params[test_index - 1];
+ pdf_size_t globalseg_size, pageseg_size, bitmap_size;
+ pdf_char_t *globalseg, *pageseg, *bitmap;
+ pdf_hash_t *filter_params = NULL;
+ pdf_error_t *error = NULL;
+
+ /* Sanity check */
+ fail_if (test_index != params->idx);
+
+ for (i = 0; test_strings[i].pageseg; i++)
+ {
+ /* fill pdf_hash_t with global segment as parameter */
+ filter_params = pdf_hash_new (&error);
+ fail_if (!filter_params);
+ fail_if (error != NULL);
+
+ fail_if (!pdf_hash_add_size (filter_params,
+ JBIG2_PARAM_GLOBAL_STREAMS_SIZE,
+ test_strings[i].globalseg_size,
+ &error));
+
+ fail_if (!pdf_hash_add_static_string (filter_params,
+ JBIG2_PARAM_GLOBAL_STREAMS_BUFFER,
+ test_strings[i].globalseg,
+ &error));
+
+ pdf_stm_test_common (function_name,
+ params->type,
+ params->operation,
+ (params->type == TEST_TYPE_ENCODER ?
+ PDF_STM_FILTER_JBIG2_ENC :
+ PDF_STM_FILTER_JBIG2_DEC),
+ filter_params,
+ params->stm_cache_size,
+ params->loop_size,
+ test_strings[i].bitmap,
+ test_strings[i].bitmap_size,
+ test_strings[i].pageseg,
+ test_strings[i].pageseg_size);
+
+ pdf_hash_destroy (filter_params);
+ }
+}
+
+/*
+ * Test: pdf_stm_read_filter_jbig2_dec_001-005
+ * Description:
+ * Test JBIG2 decoder filter with different read loop sizes
+ * Success condition:
+ * The read data should be ok.
+ */
+START_TEST (pdf_stm_read_filter_jbig2_dec_001)
+{
+ common_test_jbig2 (__FUNCTION__, 1, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_002)
+{
+ common_test_jbig2 (__FUNCTION__, 2, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_003)
+{
+ common_test_jbig2 (__FUNCTION__, 3, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_004)
+{
+ common_test_jbig2 (__FUNCTION__, 4, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_005)
+{
+ common_test_jbig2 (__FUNCTION__, 5, test_strings_without_halftones);
+} END_TEST
+
+START_TEST (pdf_stm_read_filter_jbig2_dec_006)
+{
+ common_test_jbig2 (__FUNCTION__, 6, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_007)
+{
+ common_test_jbig2 (__FUNCTION__, 7, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_008)
+{
+ common_test_jbig2 (__FUNCTION__, 8, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_009)
+{
+ common_test_jbig2 (__FUNCTION__, 9, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_010)
+{
+ common_test_jbig2 (__FUNCTION__, 10, test_strings_with_halftones);
+} END_TEST
+
+/*
+ * Test: pdf_stm_write_filter_jbig2_dec_001-005
+ * Description:
+ * Test JBIG2 decoder filter with different write loop sizes
+ * Success condition:
+ * The written data should be ok.
+ */
+START_TEST (pdf_stm_write_filter_jbig2_dec_001)
+{
+ common_test_jbig2 (__FUNCTION__, 11, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_002)
+{
+ common_test_jbig2 (__FUNCTION__, 12, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_003)
+{
+ common_test_jbig2 (__FUNCTION__, 13, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_004)
+{
+ common_test_jbig2 (__FUNCTION__, 14, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_005)
+{
+ common_test_jbig2 (__FUNCTION__, 15, test_strings_without_halftones);
+} END_TEST
+
+START_TEST (pdf_stm_write_filter_jbig2_dec_006)
+{
+ common_test_jbig2 (__FUNCTION__, 16, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_007)
+{
+ common_test_jbig2 (__FUNCTION__, 17, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_008)
+{
+ common_test_jbig2 (__FUNCTION__, 18, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_009)
+{
+ common_test_jbig2 (__FUNCTION__, 19, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_010)
+{
+ common_test_jbig2 (__FUNCTION__, 20, test_strings_with_halftones);
+} END_TEST
+
+/*
+ * Test case creation functions
+ */
+TCase *
+test_pdf_stm_rw_filter_jbig2 (void)
+{
+ TCase *tc = tcase_create ("pdf_stm_rw_filter_jbig2");
+
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_001);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_002);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_003);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_004);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_005);
+
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_006);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_007);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_008);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_009);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_010);
+
+
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_001);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_002);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_003);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_004);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_005);
+
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_006);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_007);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_008);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_009);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_010);
+
+
+ tcase_add_checked_fixture (tc,
+ pdf_test_setup,
+ pdf_test_teardown);
+ return tc;
+}
+
+/* End of pdf-stm-read-filter-jbig2.c */
=== modified file 'torture/unit/base/stm/tsuite-stm.c'
--- torture/unit/base/stm/tsuite-stm.c 2011-05-17 22:17:31 +0000
+++ torture/unit/base/stm/tsuite-stm.c 2011-12-14 17:56:25 +0000
@@ -45,6 +45,7 @@
extern TCase *test_pdf_stm_rw_filter_flate (void);
extern TCase *test_pdf_stm_rw_filter_v2 (void);
extern TCase *test_pdf_stm_rw_filter_aesv2 (void);
+extern TCase *test_pdf_stm_rw_filter_jbig2 (void);
Suite *
tsuite_stm ()
@@ -70,6 +71,7 @@
suite_add_tcase (s, test_pdf_stm_rw_filter_v2 ());
suite_add_tcase (s, test_pdf_stm_rw_filter_aesv2 ());
suite_add_tcase (s, test_pdf_stm_flush ());
+ suite_add_tcase (s, test_pdf_stm_rw_filter_jbig2 ());
return s;
}
# Begin bundle
IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWf8OTPQAIGV/gH96guD5f///
//fe/r////pgJh6h749Mq9rjsm29E6d9zus83TfbAqvCj0aptgO2Dp3YKABZSvYNAEUpLrs0ABcc
M3vbo7l3a3vdu3LI9dGXC5qyp2MVUpQt4tyRVKora2kCSQhPSaNGjJpMKntT9SnsmVNNpqPUPUek
A000Hqepo9IBppoAkhACBCEymqfoap6m1PU8UAPKAAAAaAAABFU/VN/qoAn6gBNMAAAExMmAAAAA
AEYCU/VUmhJG1D1G0mT0jQ0PUAeoADTQAAAAAACJIhNAEmnqaaaaU3oNKn5T1PIaNDJip+SgyeUH
omT1AY1NAVJCJoAQE000xBGUp/pqFP0MkE9lANJo9TNCB6gxtJyICvfVIq+BUnhVIB4lSAdap41Q
5L/QRjF6H+jzQPCeAllcCgyGZbRbN5MeM/4YLFECibPROTsajQ6Y/jrKCQlbL/Lh/1/Q/eek/jJz
5FqhsrnIb+e195vTiboqRjDlaKooAAqAEIKThF529NRqegxMMKyJjRbbt/HNU9X2SUJmZOghaCll
zLlizViqtRoLNBIRRRRRRWmu3VsWiozZt000aZXqc6LUVRvP6q+xo+1PS+w4E9jwT2O97EzJdveB
sYZWSuPDxLKKVQ5+Vk3ernEvfwt6/048VvHVjHd7DSi1FUVRai1FUVYk2UXb+8ZAWM3ZqM2Xerm0
j5qs02eRZVLOrNJ5F5jRaHS4Ce54pFKV2vZJIRx7PDGrKIJGtIiXCgoipJ6WxPAs/0YSqSr29+ab
7Mz+JlcFnKs25bcpqAgF4AIiIiI4+Tq23MyW602xEpVSFFRUmlJeCHs/B+zHFv+975dj8Hr6VbNm
gAAAAABnb3xabN/Lwfu2uD2e8RkbxGjft2q5ozUJMUdTvWyNEWxasPpMZRLrdOlnnAZoEAa0rPKZ
irUwG8Rky62J02mYJEWJhw2bcqZbku65eofyCM9UZ1fTjGUdTGDA92zhF8JHXM97h0z30XDpIOyp
NEP0zw/YaIcd3w0Q8faduNUY6raT4PYt9R7tjFmMHO/4WPAx38VsxJa+vZoiw86MQSsRJjN2pUpV
/KtmIPsLVhbF2dHgrZjsSnoct6Uqxk3n6HgecVDe5r2bH/uMnxPi/4PNpUnyEUs/yagzDCgecVRt
Rynb6koFxylHApKB8qESBQ9el05lFMTED6763shi/A7TDjLD1CkJy+DhONxfQi0km1QYUpNtksfJ
+50ruXU9TRWHocGo+TjamiYl+GplWT97J9Td0VyI+ZHBLSXh/yRkwvCx+R/qzNM94qkHJSiY+X7q
Y2PuMiO9/mEzQdITTNOXjpyqBv5xiglqKp2nBxA6h44eqDYF2jJuZzE5eKj86PHqamepZzflYTY1
u15raLXy6jWJqLpvhLz9EHLbBJEkSQSRJBoN01T96zrVqbYnRoxsvFvBNnm4sNqU9tXbxub1Ijiy
ZZRvbO1dLovSKt6qizkRqOLoTcdLuY/O8rcqm044NjQ82GTGEs8zgUl3mKNIDv7DVUUg+AE+10An
pW5FZAIxSP7XkNV1Hm3tCNR6oDxiCHz8cHhP9AeUfC//f3Or6t+LpWIUStbFQZN7ZD2zBfE7M99j
CO05z0b06zD6X52qNL4/gSTgUcdnHRvx4cZty/TWXLSbJ0r8VSA7dW6z0ETARUiDR0FC9aSf5oDk
kB2jJCR3GDWU46tVurPetsjGMYxjGMfeet/aDRIxHOc5wAAAAAAA6JcSQlBPn7gykkkMxjES8kdU
y/Jzzzz5eXl5VrWsRERERWta1rWsREXBHbhmpSlMYxita1rWtfQP3AGBJkMJhhhhgYAhB/upogx9
wfQFKh+EU6D3nuAz0pq5LS3CDZxEOK0zGccFuhy6W0szetuID5fHI7rqQg6hiqU+MkhJJJJ+QJ8E
LInf+Tq7Xf59Pf7nygfmIaejVbN84zm5e5e6vcvcvYrScvBsB6o2Ej5C4HkgR6QMvUBH3nqUNa23
iIjudddu8REbfpnxBhgzk0kn2dj4vw5Ywvh1NW/jxSYNR0Ol9kOsxFHMLRRKj+xZJyNpu6o2xii1
jaT+XjxANofUHghJI5tnAeYGD63lewj6nsm4+pVkUg44JJFBjL55T5RTFxxFpg1WZKUvISqwZmnc
SoFJKiqWWx0KpvIb6o5DcW+CBk/IAH2A9UIMPvp+1PgUJrPMve90DbWzp5WqoqrRzWx5upLasZyY
ti8fpeXx7+6/qc4PYpB1UqBIxJJJXz2Zb8sreszq1mYgwbTLR1vegZQrOrSZgSsrW+hRbV5hXAD5
LEvN+Lk/SlExQpKKklGqJIQ4ccLZ4NaGZlEGDSVvcNUIXxqJUGZYLzCCzFEoiixotEvGTKfffMhk
hj3yVywnoZYo+VsFzNKTXJLwcmy0wctUtJKSHImJJHiwbzHI3N+Pq6daO90ugVKG+TJlNwwUkk0l
JMqJpaoUOwxREvDVfTe44svHIIByEFSZSkgYKG8qIMpSSHoKk0qQmEUCMES8ZByg1FcoOmC1BKBZ
iwvVpUXlA30iMUbKR1UjVOVoJLvkIyxJMyZ41VRKadXU8TaicBJU1v43mLPMYHDVjjFCaVzI4gAp
ihCmUWiFNXB1wMAo5Kh4QjsioyFhl1V0QyJDE5F2cDl0KU9+IIGaQmM/eoCXoykAf5vQPR6y7P5M
9M7Ij7Ex0odPznLgaFNCpJJsvYuENSfmHOFlZF5+L6DxsoBGySLj92Jdajfinp5v17rtNdI5OUWQ
3mWGv6I9BXuHfBcgGDIBgSsQlZfevNfWrB4PBUKrnp8kq03Y3YaQewLDKi2AqJnkarAvCTXizROF
tuYph4LyTkYag0lPbcXPqI7gkOyShg8+7i389LrtqGvmHBrylcNcGuTyNbEJd3NEIclI2koKErlp
nv6ggTfP+WHqJVY3rrj6LsCGGTEpN2Oqf6KhZw8TlTB1nWTXtpSqYMJ9dMcqO7hqmzZEbmZ8l5JJ
kU0lcDRzcJsAYKfGqyc7USUYSVkkXGahPQ8yZtskyqSNCaHjyyxrjNfw8OtubAKqlygl0T5HHwVD
Rc29pIRZbbkpI7h5AHheJKhtznileSx8L9kBgXHYHaMEEDBZwdhaXudItcire2uUgJglU0Z5olLn
FtmZX53DhGgnWiOjmpqaNq8cVJtcmF0YJVqMuN1xZPf3DhJbWr3q2DzPFvHXusCpZhkzC4TPPz+N
A6DJtABauHd6TuEzZJUBP2Jla0AWySO5ByYB8UBS9qpIzIGQe6mylbo8zRLRP5Y5IFcnfohepeg4
bm52Ox28b9i4umt5CU04cP37db32dud6c16xlZOsEx+NGjAZJYOHyYdB8gVTaBLqmx3bsbnAw7sJ
91u9QVZsMM0AutqRIAhJG5FUpzEpqODR8kjrepYkx6o5EkalTE7TkuQhoPK9Qu7cYM1NKZHB2AE5
ufvkz5Mipy5sRNd4bcpMRiTdEpgm1T0DcsVBg7U9oPL2cVDzZE6uzCrbN/SWsBEOrHu3A7u9iRFp
OVJDsQpnAYIjQ6QyA9ke2yQu24vEMZkNuM+5KLIqCiTDDNQAm4+/B5LZSNqXbk8E+AmJ+5aRUYnq
XLHcHSR0Mkj2SRcmrCTGO2qnbg7FTIeQT5MkGSnR1NJXW117WCuUGJqL4WPGaTBTarI5GfljFWvs
ySWTSupcrxVGDyRkbk0xuUGHktoHI+oScztg+ILZJHqb79vXYYpOcnFw9SQUmwwzPJwVdYGom9Y8
BeUsGJpKbGdGpU7kVPaqWFXji0js09ReHf389zDqa3XPTOSTM4vQoyUnTOoN4lP2eOnvYoQOOOMD
iGBgFa8QwSzES3n2eYj2vzyNAyJOPKR1AXGALFsEBEFjx2Bf+h654SRz2169++zJjl5FTa/kEpVH
HGagB4mKzC7Tz5YuerBt4sLBK/zjjsWedSiqbT+HY6I2yu0Bc0OJYOUl8A3mSK7HYnNJEi3Y3Ykj
5yRn6d+1wwdbr3Yl2DZg28CeibQxgcB27btPopAax3jXZxX9UvNN3lUJJ0z1UoW4pTXF7l5tLqeD
YMmLlEvtNi5xMwcVEYALBwAr1KxC7nJpssEPJSCCBml0oIhP2HSTsgUkS0kngFzGTx1Q7FaEGOW7
TBRvk9/vpfcpwPSk1UOjk5LDxNLgcfJJ564IEUSRtexZSSR/Ukihbe5zIspei6EYBkEAyoyRwr9w
3Bq+AouvOsLnLiutorCllOp8eVra2WcYjfc2OVsrtsQhVG4ybwI94fkgEppIz10OR5T6JG3NKzCv
bj5YIGaElkM0CeTcERwWniyLVifsTA1sUC0FrksCa7yg0pIodyVGaEkWbtyMOkiv4UkVRkyX81pC
ZOgvtzTjhuZp115UvyGL0YMbETbAzG8FT6BK1ypx1YPRdzPEhzaNm5m3qz89EnTF/OOx7ibBw7qq
vFLvc6nN22nfxpORjxY3eXKyYPbcEa0BirSODQBHJl0ckDLJjhc9p7SB6fXR5SA3SB0G+OxWfPTN
B0qI1Y124v7WRHafjRUlSpH+8P7yigOZ2ockiRNI0HO1CRI2YBCBgUeg8j9IlIQs+MHA8JgBIEVS
j3H5j+Uj/CHzLH3l1M3e/2P5lNYjjwnZVRBgQZGPtD+SP4n4ge86d/27il/M/Ao5CzTFGGGQUYRn
Oq0qy/q4L1Lis4rsmojdA4yI6JLDYI0Zj9641xHWP8HETr4yf3QLzak2CP7sKqEfvbDaohGY4SSb
xRKhOmUPHY1zjDa7WsyKEZHNc/Wo5RMiyYUPvnYtJiH97lO6ntk8pJwLiNQ7IjxYc3dIjKRtVpn7
Zgj2DUB0IchZH9YfdlGMhGJAgQKlKpTBSNjMsjwVHhc5lHU6e9JuEUI9YzZm8b9h+2pMMxFp09Yq
ToO2RHMdAi8I7ZcjSEVEdr3eLE8Bdkbo//n5JEa12pCKTqlnJ6Loixks0I65OiItOxm0pEXhGZ0t
MmJEdAyQj6BFxYiNpuPfR9yk2BG5snYPewI2szdEdpvCLkRrw4NYjQuo9U1C7YtIjEIzEVIjQfuV
IZDcPFsXiekR6WTq1PoRR2jfELGxBOIGkwVTE3KJyA9lQt1p7I+1iD7Agj7IH1vt9NWASgu/c2CM
sEEgRfdk0iVFaeimgpqMFMgBgUEcWCSXUjMWWElzGIYbJlmXMryyl5F94YYBZuYOYXb2s1IwgZBA
IvluU2JmzXPitzAtkWAQsRhopWiA0xACyoUpaUUULKkJq/q2FwxRwM+E2XE0XtYMSJAmTECiImhi
mDEdIU0pogD/bLQMRikHUFDaMgVAJBsVQaUtakTe3Nw3KUounBZMpClNC6lMKUlM2SMpolTjpY3T
Fg2lJsWBWMaA+u2hteIRiEglMaCbGAbA0MtlZwKBsnFhMZ3XPElgNKUnyExFmG9gGTGMcHdpsmMd
k397hZ2xV0gsISSkpKUqSUkkkkkmETaGFymk6fKYUCs6VbqXV7Lrl7qeVvkOAxmVKUCOWcKb864m
pAwT3XFIU1NQaXG/RYMVgQiRKqjTAo0QoYQzgZ5O7PLbN1t861zhaQzY25JsG2wczC9JK0rRelqA
zcjImTrSu4UQcrh73VVpbTarXg0MKtoCDmVpKYwbtHKxRWTLfnCpG2tpz4y0FpXUWWwZaOOZxXeX
D2oaXF84zbmds/NrljrDM19OWGJjA44wxuOMQJhxxxxxOb2gIGBMOFtLi3O8XOFPhc6N1pOGwxXd
Tkp9PneU5A03NiuHWcgTFyy5uPVMUk+z9sYrQJ3E+k/VWYvCsacOFrdQuNlC0uAYUK+N+VKecdbv
yscZvy3D0reucz1K+0t9lxPHGlarGp0qgOMg+/BdcRTjMuHlQpp2WVxzbAcUBJbIKM4gYYQh99bb
BjRlYFe1aKV0XlrEw4cvybsZvly/JVrUjVOE+0uAjnVcunaVkrtLemQfO7uwbFBxVmoIGNhxhgYY
HGGGC2KBefKwPwDxlqc76YlSSmtKrOLaLcoSxCEHe4udgkjGRHezEg4qCyiSZ0t+Efzk4PWI3JEe
58eHrkhVrEfEzEUWh5FDxhGZ7iLyoRo0hHvPI+oRoI1CpEaoj2iPrqy471ZZZe7dGrkvXtbtr6oE
kgSBIEgVlv0sy3K3bQAAAAACaU0AAAAAACZrbrFKUbbNM1zsMSkhD0DB90RIilkCUiRVLhjS+QLi
alEq9AUJYHP4zQfcVLMooq4tqYoE77ojZGyjRLZsKEbG1EaDsKBIgkI75MLFe5d7YfpZ+AQnnA5i
QfwHlL0xMf6LPcZKuR3JSUp2Uh/sVqyv3+u8tb3032TzCe99m9pwH8Oxlhh9Tqsjg1rDhPmw9O+R
zdFpCeQVOwagtym7zHw2hr7psOhpApf+dC9B5jpCZpzj754ifj6GEyP2JTkFuHqSY3Tn1XiKUOGx
0LyxnpN4/GwyU1J55DqSS5PXtfQmIk+lZrazp4PBKdUlEjcm6mtabk3PkZONxBVAYCQYkCqf5Pao
Pb491hrNxxchcVBMbZpeQ+n6YF8qSa4lFSD5DJeCjfUb5ueZQkUOSr4mQZJFghLydMr29zY5db0l
2jhbzBiE2uvpSP+PczMxkKJQqZUEY0kDYBSN3AhYlAVJ2AkG3uJkZAaO2HkfEfuMXxSwQ86ua+8A
N/iMRvEbZ19UxHbiTNEXHydSB2+fkuQW9L9s+naXS3GE1j3lJiHlwyryz4jOSkpdOTkpowmQlmCZ
ptaGJNTHXOxtnjtSJRSxQZ1BKlR48jxvfXL7Atwyz3F7bMdVrvakhISBCMkhJGBEYERgmGWXS53R
4bi59zXHyHcYYEjFEG13MHwF31Q4Kep2HVe5k6EOLmyKeb0dU+JNWb2vi7RyOx+C7gxTSU2RKESI
huzpZuuatlZd+rIs511tMJ/nExJkQ749kTSOs18IHmGG5qiEacAhZOny65oYZTN07+3sZurjPJlk
nc8Wp68bnh613icpy5+AkWOhKZfHABzfc18VQurlCWYqOUDZJHzbc9RDAU8oy6XnK60pxec91JU0
+TpIRQtRUiOE83LvT8Sxmy4u52tbEblbSJueqDl4BEmspMekACvHNw6nEOJFrd/QsvA2x06Ch61D
9TFVdLEbjkOZRiPOD1Fjoc96zAeza835m5qfFfDUpZRg3qkzZGpN6mR89T3UzbUWVmbYv5peZtb8
92xazauza8Tfj28LuCmiyyblcMkRwmyDKTEdyayWn89F2Y47jkhXpGNvLhJFyktdGS6lzYmg9zRw
DIpao2qWG5Zou97vWTLHa2Ot2HoDmi8Zz00wwqpk/mb+hAElv7l1NN0zrj8Hd7WinzxjdlcYUUk1
JZY73FSIqRHSjlB4OlOt1pEvUzVJfW/48vDwynEDu0bE0wTvXbd/RZkp5LPSp1/S1Xm8+ax5K4Ox
SfnZ992V0G91Zdaycel60mCsnEPMSVBnEpUlhYC5euRNawYOeha8ux671Wn9FAWgKAXQC4lacwkc
PYYyh9gqxHMZ5DSFksGI3SSNj6Y9UPoXHdUkv8PCLNnFVKRB7o+UKMhxoX0cn8Xl4BodY6QTMh5R
8rvXlHldoCewCECBBgiNMDkiWi+Sxd0nE5wR5ilDYevIKIXc1T5jN4Hym8Z8SAfJ1PoDoyPDNihD
0HmAyqYH6LF19LY+C/xfBtlzR+VrUvVacLXLWngo4sTDO63W6cNlBIgFoYHHHAumXvCaquEz4wjX
H21oqrjCAmwLdUS1igTRuMBuDBoJaVhcCBgQWiCJrBg70FZc3l8eb8gg5xWibBsQmJndblaoVBEh
0nwMACO/V/NH54M7ht+kScF7glCHqRh1iqf1dnyfu/xoxP+SbGjq3xlE/RPq9ZqSYR4J2PgJ7Uya
Tm4NHY3T4RU0VND6C5hJJkyWWgfSFSCYoa0wIgQfWfUEdiwphSQoYlc6yk1NXm844T6+arMh/CSX
dZUkj2nQnJEOClz5HUHGylgfM4KSoC6zuCnuLi0OBc52hfO4FFNHGDoLnjwCkyIXQivi7X2GReE9
8A0Hucwhd4oMySRQGhbEQPICd0fOODQmpFxZfSeCfKd8kVP42bSYT1RHxflJDY9El4k/pUj5Ku0t
IDIsnOP1RO+Dambs1TcUSPuaO3unsmqbnip4ULCiVEocx0B0Lyn6lDYFztrAi4vzJFEgdkU6SxSu
I8w2fO5OJym1PfEA2Qe+E7SDmd0aETso0Di+J7wxOwLsLK+C50rzGlA6Sc5gbHzq3YwTlJPzKVlP
1EwTZGponczQpT9MEM9MlA4voB7oI0A8ncH5TMovxmk8Z9s3oTjP1KTmaOafBcmuYSpAbJxRz4gO
ic6dASgU5wMxOUEhFzVSSWCqpBOl+Z5XTgTZJwNUfbSOY8ZiX9y0zPbOEhOZYJTOfkJpEtqbzel4
1kUcyQwoosbGixYuXLvhIPnVgPbFkkH3Os4I/kaJG2bIn9Nx3JZgxBV0qWTWlKjJKSNNPJd9xnFl
RqFIjSKncYn3kAuQ6qMzI1CRXQUQgLIKw7oLws6/udk2euRZ6XihSju3yPkfQ+toZJ8kzToklxpI
Ti2KQooFIiybXXKSLNbJaSbFxq6UeTa9zEs1PsWX6VWWj3qXN0HB2x9skqSRTKTa55od7thu60pV
Oo/A0IfSFilfL5zfmB3uk5HmBgKkgSDKtZOsYcnFyTjxC6Rh4HBQEMAdaWcddPX63UzTm0kXo1rl
di9jTK4UAAAQAQBz83Ma2usAAAQAQB/1cG1LoZZyV0JMzrBbkdISLXpSV2rALMpzmFAgbzgSBeQo
9Ac6tY8AdwPSaDyZpBnXGRpYmw8FkbP0BSB0lDWkqSIZGVHwWgunsTCSbpwUwXkn2htWNSws6Rzn
lIj4T5yYOZxai0HQi0cz6mkdaIHqTHSGrvFgsqmse0KmojcdC9sKDeZdA7gNVPKN+6r7RdZmm1Ul
IyJtdSNg7k1M4ZtSfkWyzlosZ2epK8VSmGLJSspO/DQip73FYnzmHlLls6olmyKWKUJtnd7Zv89I
cVxSlO1ClBxNNzDXIRkhLgcqd3QcDMbHLCRlJdHS1Q6FpSgsvSoFJunnSqiqjRkGpFdKsH4hFBb9
5dHhTJAwCeJf5fmZgninKDZxMWfJZEbLjctE4y6jVfLi73cIteHVdO1ub2eeSmSyyy7NhilswDHq
Eg0QMcIYOJ0mBiF2k6ywmDGcjJFiSfSRRIwm5Yn5HmiObcoUxMzUNGbSKYFrkDg93VYpEsxUHaKT
W1tBFnoLNr734fwwiM47eVrWuq/1xVaf52vVEmToLQ/W5WI4zuDJIuhSpTqVJOmdPUsPZMu9Ln4l
JSak703ETuiAWGDqcDoAbIH87pM+nuoZmPsIoNopgqWipVJwr8dw9z3SnCTpInU6nm2CyuZSkTGX
BEHoCYELsFlMYtt8RnQt32+etBiNiEetVPyobBwPvVSJxO0nzbTvdBr6jSWBhE4EAZMkMDyEx3wC
wjcdBG8eQ1jaTUgwjyvIfrSXfiPW4Mv0iUpzRSP0KJFh2B0FDEeypAim8+ss2USORzH4AGldav4R
JESfAoET9FQS9QRKUgR/zjuC8J2tQbHk8HLm+jpWncs7GhhKnTF8gB61eIZDkalencKnEOD403AC
ZgP5ET6AGADAooKkhBIBAIqMX/8XckU4UJD/Dkz0