aboutsummaryrefslogtreecommitdiffstats
path: root/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java
diff options
context:
space:
mode:
authorAngelos Mouzakitis <a.mouzakitis@virtualopensystems.com>2023-10-10 14:33:42 +0000
committerAngelos Mouzakitis <a.mouzakitis@virtualopensystems.com>2023-10-10 14:33:42 +0000
commitaf1a266670d040d2f4083ff309d732d648afba2a (patch)
tree2fc46203448ddcc6f81546d379abfaeb323575e9 /roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java
parente02cda008591317b1625707ff8e115a4841aa889 (diff)
Add submodule dependency filesHEADmaster
Change-Id: Iaf8d18082d3991dec7c0ebbea540f092188eb4ec
Diffstat (limited to 'roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java')
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/BUILD98
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/WORKSPACE41
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BUILD59
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BitReader.java289
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BitReaderTest.java54
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BrotliInputStream.java160
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BrotliRuntimeException.java21
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Context.java58
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Decode.java1251
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/DecodeTest.java160
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Dictionary.java54
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/DictionaryData.java51
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/DictionaryTest.java38
-rwxr-xr-xroms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/EagerStreamTest.java386
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Huffman.java137
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/SetDictionaryTest.java76
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/State.java89
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/SynthTest.java2940
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Transform.java236
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/TransformTest.java71
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Utils.java102
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/build_defs.bzl34
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/pom.xml172
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/proguard.pgcfg6
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BUILD73
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BrotliJniTestBase.java13
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BundleChecker.java112
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BundleHelper.java113
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/fuzz_data.zipbin0 -> 23854 bytes
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/pom.xml65
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/test_corpus.zipbin0 -> 3587214 bytes
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/test_data.zipbin0 -> 2859607 bytes
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/pom.xml101
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/BUILD61
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/BrotliCommon.java130
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/CommonJNI.java16
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/SetRfcDictionaryTest.java74
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/SetZeroDictionaryTest.java48
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/common_jni.cc47
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BUILD84
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliDecoderChannel.java69
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliDecoderChannelTest.java84
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliInputStream.java115
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliInputStreamTest.java82
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/Decoder.java177
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/DecoderJNI.java121
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/DecoderTest.java77
-rwxr-xr-xroms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/EagerStreamTest.java75
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/decoder_jni.cc202
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BUILD88
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliEncoderChannel.java77
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliEncoderChannelTest.java118
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliOutputStream.java87
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliOutputStreamTest.java118
-rwxr-xr-xroms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/EmptyInputTest.java29
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/Encoder.java205
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/EncoderJNI.java118
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/EncoderTest.java80
-rw-r--r--roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/encoder_jni.cc195
59 files changed, 9637 insertions, 0 deletions
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/BUILD b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/BUILD
new file mode 100644
index 000000000..cd55c5477
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/BUILD
@@ -0,0 +1,98 @@
+package(
+ default_visibility = ["//visibility:public"],
+)
+
+# >>> JNI headers
+
+genrule(
+ name = "copy_link_jni_header",
+ srcs = ["@openjdk_jni_h//file"],
+ outs = ["jni/jni.h"],
+ cmd = "cp -f $< $@",
+)
+
+genrule(
+ name = "copy_link_jni_md_header",
+ srcs = select({
+ "@org_brotli//:darwin": ["@openjdk_macosx_jni_md_h//file"],
+ "@org_brotli//:darwin_x86_64": ["@openjdk_macosx_jni_md_h//file"],
+ "@org_brotli//:windows_msys": ["@openjdk_windows_jni_md_h//file"],
+ "@org_brotli//:windows_msvc": ["@openjdk_windows_jni_md_h//file"],
+ "@org_brotli//:windows": ["@openjdk_windows_jni_md_h//file"],
+ "//conditions:default": ["@openjdk_solaris_jni_md_h//file"],
+ }),
+ outs = ["jni/jni_md.h"],
+ cmd = "cp -f $< $@",
+)
+
+cc_library(
+ name = "jni_inc",
+ hdrs = [
+ ":jni/jni.h",
+ ":jni/jni_md.h",
+ ],
+ includes = ["jni"],
+)
+
+# <<< JNI headers
+
+genrule(
+ name = "license_resource",
+ srcs = ["@org_brotli//:LICENSE"],
+ outs = ["META-INF/LICENSE"],
+ cmd = "cp -f $< $@",
+)
+
+java_library(
+ name = "license",
+ resources = [":license_resource"],
+)
+
+########################################################
+# WARNING: do not (transitively) depend on this target!
+########################################################
+cc_binary(
+ name = "brotli_jni.dll",
+ srcs = [
+ "//org/brotli/wrapper/common:jni_src",
+ "//org/brotli/wrapper/dec:jni_src",
+ "//org/brotli/wrapper/enc:jni_src",
+ "@org_brotli//:common_headers",
+ "@org_brotli//:common_sources",
+ "@org_brotli//:dec_headers",
+ "@org_brotli//:dec_sources",
+ "@org_brotli//:enc_headers",
+ "@org_brotli//:enc_sources",
+ ],
+ linkshared = 1,
+ deps = [
+ ":jni_inc",
+ "@org_brotli//:brotli_inc",
+ ],
+)
+
+########################################################
+# WARNING: do not (transitively) depend on this target!
+########################################################
+cc_binary(
+ name = "brotli_jni_no_dictionary_data.dll",
+ srcs = [
+ "//org/brotli/wrapper/common:jni_src",
+ "//org/brotli/wrapper/dec:jni_src",
+ "//org/brotli/wrapper/enc:jni_src",
+ "@org_brotli//:common_headers",
+ "@org_brotli//:common_sources",
+ "@org_brotli//:dec_headers",
+ "@org_brotli//:dec_sources",
+ "@org_brotli//:enc_headers",
+ "@org_brotli//:enc_sources",
+ ],
+ defines = [
+ "BROTLI_EXTERNAL_DICTIONARY_DATA=",
+ ],
+ linkshared = 1,
+ deps = [
+ ":jni_inc",
+ "@org_brotli//:brotli_inc",
+ ],
+)
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/WORKSPACE b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/WORKSPACE
new file mode 100644
index 000000000..06fbdfeea
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/WORKSPACE
@@ -0,0 +1,41 @@
+workspace(name = "org_brotli_java")
+
+local_repository(
+ name = "org_brotli",
+ path = "..",
+)
+
+maven_jar(
+ name = "junit_junit",
+ artifact = "junit:junit:4.12",
+)
+
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")
+
+http_file(
+ name = "openjdk_jni_h",
+ downloaded_file_path = "jni.h",
+ urls = ["https://hg.openjdk.java.net/jdk8/jdk8/jdk/raw-file/687fd7c7986d/src/share/javavm/export/jni.h"],
+ sha256 = "ed99792df48670072b78028faf704a8dcb6868fe140ccc7eced9b01dfa62fef4",
+)
+
+http_file(
+ name = "openjdk_solaris_jni_md_h",
+ downloaded_file_path = "jni_md.h",
+ urls = ["https://hg.openjdk.java.net/jdk8/jdk8/jdk/raw-file/687fd7c7986d/src/solaris/javavm/export/jni_md.h"],
+ sha256 = "ecbe6944fe1a4290644d5a6b3c8f68576798a53b9da12cd31c58c48569595ff7",
+)
+
+http_file(
+ name = "openjdk_macosx_jni_md_h",
+ downloaded_file_path = "jni_md.h",
+ urls = ["https://hg.openjdk.java.net/jdk8/jdk8/jdk/raw-file/687fd7c7986d/src/macosx/javavm/export/jni_md.h"],
+ sha256 = "8f718071022e7e7f2fc9a229984b7e83582db91ed83861b49ce1461436fe8dc4",
+)
+
+http_file(
+ name = "openjdk_windows_jni_md_h",
+ downloaded_file_path = "jni_md.h",
+ urls = ["https://hg.openjdk.java.net/jdk8/jdk8/jdk/raw-file/687fd7c7986d/src/windows/javavm/export/jni_md.h"],
+ sha256 = "5479fb385ea1e11619f5c0cdfd9ccb3ea3a3fea0f5bc6176fb3ce62be29d759b",
+)
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BUILD b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BUILD
new file mode 100644
index 000000000..0cc0cbf18
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BUILD
@@ -0,0 +1,59 @@
+# Description:
+# Java port of Brotli decoder.
+
+package(default_visibility = ["//visibility:public"])
+
+licenses(["notice"]) # MIT
+
+TEST_DEPS = [
+ ":dec",
+ "@junit_junit//jar",
+]
+
+java_library(
+ name = "dec",
+ srcs = glob(
+ ["*.java"],
+ exclude = ["*Test*.java"],
+ ),
+ proguard_specs = ["proguard.pgcfg"],
+ resource_jars = ["//:license"],
+)
+
+load(":build_defs.bzl", "brotli_java_test")
+
+brotli_java_test(
+ name = "BitReaderTest",
+ srcs = ["BitReaderTest.java"],
+ deps = TEST_DEPS,
+)
+
+brotli_java_test(
+ name = "DecodeTest",
+ srcs = ["DecodeTest.java"],
+ deps = TEST_DEPS,
+)
+
+brotli_java_test(
+ name = "DictionaryTest",
+ srcs = ["DictionaryTest.java"],
+ deps = TEST_DEPS,
+)
+
+brotli_java_test(
+ name = "EagerStreamTest",
+ srcs = ["EagerStreamTest.java"],
+ deps = TEST_DEPS,
+)
+
+brotli_java_test(
+ name = "SynthTest",
+ srcs = ["SynthTest.java"],
+ deps = TEST_DEPS,
+)
+
+brotli_java_test(
+ name = "TransformTest",
+ srcs = ["TransformTest.java"],
+ deps = TEST_DEPS,
+)
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BitReader.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BitReader.java
new file mode 100644
index 000000000..6dfeedca8
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BitReader.java
@@ -0,0 +1,289 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+/**
+ * Bit reading helpers.
+ */
+final class BitReader {
+
+ // Possible values: {5, 6}. 5 corresponds to 32-bit build, 6 to 64-bit. This value is used for
+ // JIT conditional compilation.
+ private static final int LOG_BITNESS = Utils.getLogBintness();
+
+ // Not only Java compiler prunes "if (const false)" code, but JVM as well.
+ // Code under "if (DEBUG != 0)" have zero performance impact (outside unit tests).
+ private static final int DEBUG = Utils.isDebugMode();
+
+ static final int BITNESS = 1 << LOG_BITNESS;
+
+ private static final int BYTENESS = BITNESS / 8;
+ private static final int CAPACITY = 4096;
+ // After encountering the end of the input stream, this amount of zero bytes will be appended.
+ private static final int SLACK = 64;
+ private static final int BUFFER_SIZE = CAPACITY + SLACK;
+ // Don't bother to replenish the buffer while this number of bytes is available.
+ private static final int SAFEGUARD = 36;
+ private static final int WATERLINE = CAPACITY - SAFEGUARD;
+
+ // "Half" refers to "half of native integer type", i.e. on 64-bit machines it is 32-bit type,
+ // on 32-bit machines it is 16-bit.
+ private static final int HALF_BITNESS = BITNESS / 2;
+ private static final int HALF_SIZE = BYTENESS / 2;
+ private static final int HALVES_CAPACITY = CAPACITY / HALF_SIZE;
+ private static final int HALF_BUFFER_SIZE = BUFFER_SIZE / HALF_SIZE;
+ private static final int HALF_WATERLINE = WATERLINE / HALF_SIZE;
+
+ private static final int LOG_HALF_SIZE = LOG_BITNESS - 4;
+
+ /**
+ * Fills up the input buffer.
+ *
+ * <p> No-op if there are at least 36 bytes present after current position.
+ *
+ * <p> After encountering the end of the input stream, 64 additional zero bytes are copied to the
+ * buffer.
+ */
+ static void readMoreInput(State s) {
+ if (s.halfOffset > HALF_WATERLINE) {
+ doReadMoreInput(s);
+ }
+ }
+
+ static void doReadMoreInput(State s) {
+ if (s.endOfStreamReached != 0) {
+ if (halfAvailable(s) >= -2) {
+ return;
+ }
+ throw new BrotliRuntimeException("No more input");
+ }
+ int readOffset = s.halfOffset << LOG_HALF_SIZE;
+ int bytesInBuffer = CAPACITY - readOffset;
+ // Move unused bytes to the head of the buffer.
+ Utils.copyBytesWithin(s.byteBuffer, 0, readOffset, CAPACITY);
+ s.halfOffset = 0;
+ while (bytesInBuffer < CAPACITY) {
+ int spaceLeft = CAPACITY - bytesInBuffer;
+ int len = Utils.readInput(s.input, s.byteBuffer, bytesInBuffer, spaceLeft);
+ // EOF is -1 in Java, but 0 in C#.
+ if (len <= 0) {
+ s.endOfStreamReached = 1;
+ s.tailBytes = bytesInBuffer;
+ bytesInBuffer += HALF_SIZE - 1;
+ break;
+ }
+ bytesInBuffer += len;
+ }
+ bytesToNibbles(s, bytesInBuffer);
+ }
+
+ static void checkHealth(State s, int endOfStream) {
+ if (s.endOfStreamReached == 0) {
+ return;
+ }
+ int byteOffset = (s.halfOffset << LOG_HALF_SIZE) + ((s.bitOffset + 7) >> 3) - BYTENESS;
+ if (byteOffset > s.tailBytes) {
+ throw new BrotliRuntimeException("Read after end");
+ }
+ if ((endOfStream != 0) && (byteOffset != s.tailBytes)) {
+ throw new BrotliRuntimeException("Unused bytes after end");
+ }
+ }
+
+ static void assertAccumulatorHealthy(State s) {
+ if (s.bitOffset > BITNESS) {
+ throw new IllegalStateException("Accumulator underloaded: " + s.bitOffset);
+ }
+ }
+
+ static void fillBitWindow(State s) {
+ if (DEBUG != 0) {
+ assertAccumulatorHealthy(s);
+ }
+ if (s.bitOffset >= HALF_BITNESS) {
+ // Same as doFillBitWindow. JVM fails to inline it.
+ if (BITNESS == 64) {
+ s.accumulator64 = ((long) s.intBuffer[s.halfOffset++] << HALF_BITNESS)
+ | (s.accumulator64 >>> HALF_BITNESS);
+ } else {
+ s.accumulator32 = ((int) s.shortBuffer[s.halfOffset++] << HALF_BITNESS)
+ | (s.accumulator32 >>> HALF_BITNESS);
+ }
+ s.bitOffset -= HALF_BITNESS;
+ }
+ }
+
+ static void doFillBitWindow(State s) {
+ if (DEBUG != 0) {
+ assertAccumulatorHealthy(s);
+ }
+ if (BITNESS == 64) {
+ s.accumulator64 = ((long) s.intBuffer[s.halfOffset++] << HALF_BITNESS)
+ | (s.accumulator64 >>> HALF_BITNESS);
+ } else {
+ s.accumulator32 = ((int) s.shortBuffer[s.halfOffset++] << HALF_BITNESS)
+ | (s.accumulator32 >>> HALF_BITNESS);
+ }
+ s.bitOffset -= HALF_BITNESS;
+ }
+
+ static int peekBits(State s) {
+ if (BITNESS == 64) {
+ return (int) (s.accumulator64 >>> s.bitOffset);
+ } else {
+ return s.accumulator32 >>> s.bitOffset;
+ }
+ }
+
+ /**
+ * Fetches bits from accumulator.
+ *
+ * WARNING: accumulator MUST contain at least the specified amount of bits,
+ * otherwise BitReader will become broken.
+ */
+ static int readFewBits(State s, int n) {
+ int val = peekBits(s) & ((1 << n) - 1);
+ s.bitOffset += n;
+ return val;
+ }
+
+ static int readBits(State s, int n) {
+ if (HALF_BITNESS >= 24) {
+ return readFewBits(s, n);
+ } else {
+ return (n <= 16) ? readFewBits(s, n) : readManyBits(s, n);
+ }
+ }
+
+ private static int readManyBits(State s, int n) {
+ int low = readFewBits(s, 16);
+ doFillBitWindow(s);
+ return low | (readFewBits(s, n - 16) << 16);
+ }
+
+ static void initBitReader(State s) {
+ s.byteBuffer = new byte[BUFFER_SIZE];
+ if (BITNESS == 64) {
+ s.accumulator64 = 0;
+ s.intBuffer = new int[HALF_BUFFER_SIZE];
+ } else {
+ s.accumulator32 = 0;
+ s.shortBuffer = new short[HALF_BUFFER_SIZE];
+ }
+ s.bitOffset = BITNESS;
+ s.halfOffset = HALVES_CAPACITY;
+ s.endOfStreamReached = 0;
+ prepare(s);
+ }
+
+ private static void prepare(State s) {
+ readMoreInput(s);
+ checkHealth(s, 0);
+ doFillBitWindow(s);
+ doFillBitWindow(s);
+ }
+
+ static void reload(State s) {
+ if (s.bitOffset == BITNESS) {
+ prepare(s);
+ }
+ }
+
+ static void jumpToByteBoundary(State s) {
+ int padding = (BITNESS - s.bitOffset) & 7;
+ if (padding != 0) {
+ int paddingBits = readFewBits(s, padding);
+ if (paddingBits != 0) {
+ throw new BrotliRuntimeException("Corrupted padding bits");
+ }
+ }
+ }
+
+ static int halfAvailable(State s) {
+ int limit = HALVES_CAPACITY;
+ if (s.endOfStreamReached != 0) {
+ limit = (s.tailBytes + (HALF_SIZE - 1)) >> LOG_HALF_SIZE;
+ }
+ return limit - s.halfOffset;
+ }
+
+ static void copyBytes(State s, byte[] data, int offset, int length) {
+ if ((s.bitOffset & 7) != 0) {
+ throw new BrotliRuntimeException("Unaligned copyBytes");
+ }
+
+ // Drain accumulator.
+ while ((s.bitOffset != BITNESS) && (length != 0)) {
+ data[offset++] = (byte) peekBits(s);
+ s.bitOffset += 8;
+ length--;
+ }
+ if (length == 0) {
+ return;
+ }
+
+ // Get data from shadow buffer with "sizeof(int)" granularity.
+ int copyNibbles = Math.min(halfAvailable(s), length >> LOG_HALF_SIZE);
+ if (copyNibbles > 0) {
+ int readOffset = s.halfOffset << LOG_HALF_SIZE;
+ int delta = copyNibbles << LOG_HALF_SIZE;
+ System.arraycopy(s.byteBuffer, readOffset, data, offset, delta);
+ offset += delta;
+ length -= delta;
+ s.halfOffset += copyNibbles;
+ }
+ if (length == 0) {
+ return;
+ }
+
+ // Read tail bytes.
+ if (halfAvailable(s) > 0) {
+ // length = 1..3
+ fillBitWindow(s);
+ while (length != 0) {
+ data[offset++] = (byte) peekBits(s);
+ s.bitOffset += 8;
+ length--;
+ }
+ checkHealth(s, 0);
+ return;
+ }
+
+ // Now it is possible to copy bytes directly.
+ while (length > 0) {
+ int len = Utils.readInput(s.input, data, offset, length);
+ if (len == -1) {
+ throw new BrotliRuntimeException("Unexpected end of input");
+ }
+ offset += len;
+ length -= len;
+ }
+ }
+
+ /**
+ * Translates bytes to halves (int/short).
+ */
+ static void bytesToNibbles(State s, int byteLen) {
+ byte[] byteBuffer = s.byteBuffer;
+ int halfLen = byteLen >> LOG_HALF_SIZE;
+ if (BITNESS == 64) {
+ int[] intBuffer = s.intBuffer;
+ for (int i = 0; i < halfLen; ++i) {
+ intBuffer[i] = ((byteBuffer[i * 4] & 0xFF))
+ | ((byteBuffer[(i * 4) + 1] & 0xFF) << 8)
+ | ((byteBuffer[(i * 4) + 2] & 0xFF) << 16)
+ | ((byteBuffer[(i * 4) + 3] & 0xFF) << 24);
+ }
+ } else {
+ short[] shortBuffer = s.shortBuffer;
+ for (int i = 0; i < halfLen; ++i) {
+ shortBuffer[i] = (short) ((byteBuffer[i * 2] & 0xFF)
+ | ((byteBuffer[(i * 2) + 1] & 0xFF) << 8));
+ }
+ }
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BitReaderTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BitReaderTest.java
new file mode 100644
index 000000000..da59ebcea
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BitReaderTest.java
@@ -0,0 +1,54 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+import static org.junit.Assert.fail;
+
+import java.io.ByteArrayInputStream;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for {@link BitReader}.
+ */
+@RunWith(JUnit4.class)
+public class BitReaderTest {
+
+ @Test
+ public void testReadAfterEos() {
+ State reader = new State();
+ Decode.initState(reader, new ByteArrayInputStream(new byte[1]));
+ BitReader.readBits(reader, 9);
+ try {
+ BitReader.checkHealth(reader, 0);
+ } catch (BrotliRuntimeException ex) {
+ // This exception is expected.
+ return;
+ }
+ fail("BrotliRuntimeException should have been thrown by BitReader.checkHealth");
+ }
+
+ @Test
+ public void testAccumulatorUnderflowDetected() {
+ State reader = new State();
+ Decode.initState(reader, new ByteArrayInputStream(new byte[8]));
+ // 65 bits is enough for both 32 and 64 bit systems.
+ BitReader.readBits(reader, 13);
+ BitReader.readBits(reader, 13);
+ BitReader.readBits(reader, 13);
+ BitReader.readBits(reader, 13);
+ BitReader.readBits(reader, 13);
+ try {
+ BitReader.fillBitWindow(reader);
+ } catch (IllegalStateException ex) {
+ // This exception is expected.
+ return;
+ }
+ fail("IllegalStateException should have been thrown by 'broken' BitReader");
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BrotliInputStream.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BrotliInputStream.java
new file mode 100644
index 000000000..b99e40a26
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BrotliInputStream.java
@@ -0,0 +1,160 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * {@link InputStream} decorator that decompresses brotli data.
+ *
+ * <p> Not thread-safe.
+ */
+public class BrotliInputStream extends InputStream {
+
+ public static final int DEFAULT_INTERNAL_BUFFER_SIZE = 256;
+
+ /**
+ * Internal buffer used for efficient byte-by-byte reading.
+ */
+ private byte[] buffer;
+
+ /**
+ * Number of decoded but still unused bytes in internal buffer.
+ */
+ private int remainingBufferBytes;
+
+ /**
+ * Next unused byte offset.
+ */
+ private int bufferOffset;
+
+ /**
+ * Decoder state.
+ */
+ private final State state = new State();
+
+ /**
+ * Creates a {@link InputStream} wrapper that decompresses brotli data.
+ *
+ * <p> For byte-by-byte reading ({@link #read()}) internal buffer with
+ * {@link #DEFAULT_INTERNAL_BUFFER_SIZE} size is allocated and used.
+ *
+ * <p> Will block the thread until first {@link BitReader#CAPACITY} bytes of data of source
+ * are available.
+ *
+ * @param source underlying data source
+ * @throws IOException in case of corrupted data or source stream problems
+ */
+ public BrotliInputStream(InputStream source) throws IOException {
+ this(source, DEFAULT_INTERNAL_BUFFER_SIZE);
+ }
+
+ /**
+ * Creates a {@link InputStream} wrapper that decompresses brotli data.
+ *
+ * <p> For byte-by-byte reading ({@link #read()}) internal buffer of specified size is
+ * allocated and used.
+ *
+ * <p> Will block the thread until first {@link BitReader#CAPACITY} bytes of data of source
+ * are available.
+ *
+ * @param source compressed data source
+ * @param byteReadBufferSize size of internal buffer used in case of
+ * byte-by-byte reading
+ * @throws IOException in case of corrupted data or source stream problems
+ */
+ public BrotliInputStream(InputStream source, int byteReadBufferSize) throws IOException {
+ if (byteReadBufferSize <= 0) {
+ throw new IllegalArgumentException("Bad buffer size:" + byteReadBufferSize);
+ } else if (source == null) {
+ throw new IllegalArgumentException("source is null");
+ }
+ this.buffer = new byte[byteReadBufferSize];
+ this.remainingBufferBytes = 0;
+ this.bufferOffset = 0;
+ try {
+ Decode.initState(state, source);
+ } catch (BrotliRuntimeException ex) {
+ throw new IOException("Brotli decoder initialization failed", ex);
+ }
+ }
+
+ public void enableEagerOutput() {
+ Decode.enableEagerOutput(state);
+ }
+
+ public void enableLargeWindow() {
+ Decode.enableLargeWindow(state);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void close() throws IOException {
+ Decode.close(state);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int read() throws IOException {
+ if (bufferOffset >= remainingBufferBytes) {
+ remainingBufferBytes = read(buffer, 0, buffer.length);
+ bufferOffset = 0;
+ if (remainingBufferBytes == -1) {
+ return -1;
+ }
+ }
+ return buffer[bufferOffset++] & 0xFF;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int read(byte[] destBuffer, int destOffset, int destLen) throws IOException {
+ if (destOffset < 0) {
+ throw new IllegalArgumentException("Bad offset: " + destOffset);
+ } else if (destLen < 0) {
+ throw new IllegalArgumentException("Bad length: " + destLen);
+ } else if (destOffset + destLen > destBuffer.length) {
+ throw new IllegalArgumentException(
+ "Buffer overflow: " + (destOffset + destLen) + " > " + destBuffer.length);
+ } else if (destLen == 0) {
+ return 0;
+ }
+ int copyLen = Math.max(remainingBufferBytes - bufferOffset, 0);
+ if (copyLen != 0) {
+ copyLen = Math.min(copyLen, destLen);
+ System.arraycopy(buffer, bufferOffset, destBuffer, destOffset, copyLen);
+ bufferOffset += copyLen;
+ destOffset += copyLen;
+ destLen -= copyLen;
+ if (destLen == 0) {
+ return copyLen;
+ }
+ }
+ try {
+ state.output = destBuffer;
+ state.outputOffset = destOffset;
+ state.outputLength = destLen;
+ state.outputUsed = 0;
+ Decode.decompress(state);
+ if (state.outputUsed == 0) {
+ return -1;
+ }
+ return state.outputUsed + copyLen;
+ } catch (BrotliRuntimeException ex) {
+ throw new IOException("Brotli stream decoding failed", ex);
+ }
+
+ // <{[INJECTED CODE]}>
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BrotliRuntimeException.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BrotliRuntimeException.java
new file mode 100644
index 000000000..184490722
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/BrotliRuntimeException.java
@@ -0,0 +1,21 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+/**
+ * Unchecked exception used internally.
+ */
+class BrotliRuntimeException extends RuntimeException {
+
+ BrotliRuntimeException(String message) {
+ super(message);
+ }
+
+ BrotliRuntimeException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Context.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Context.java
new file mode 100644
index 000000000..d9f3f91f2
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Context.java
@@ -0,0 +1,58 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+/**
+ * Common context lookup table for all context modes.
+ */
+final class Context {
+
+ static final int[] LOOKUP = new int[2048];
+
+ private static final String UTF_MAP = " !! ! \"#$##%#$&'##(#)#+++++++++"
+ + "+((&*'##,---,---,-----,-----,-----&#'###.///.///./////./////./////&#'# ";
+ private static final String UTF_RLE = "A/* ': & : $ \u0081 @";
+
+ private static void unpackLookupTable(int[] lookup, String map, String rle) {
+ // LSB6, MSB6, SIGNED
+ for (int i = 0; i < 256; ++i) {
+ lookup[i] = i & 0x3F;
+ lookup[512 + i] = i >> 2;
+ lookup[1792 + i] = 2 + (i >> 6);
+ }
+ // UTF8
+ for (int i = 0; i < 128; ++i) {
+ lookup[1024 + i] = 4 * (map.charAt(i) - 32);
+ }
+ for (int i = 0; i < 64; ++i) {
+ lookup[1152 + i] = i & 1;
+ lookup[1216 + i] = 2 + (i & 1);
+ }
+ int offset = 1280;
+ for (int k = 0; k < 19; ++k) {
+ int value = k & 3;
+ int rep = rle.charAt(k) - 32;
+ for (int i = 0; i < rep; ++i) {
+ lookup[offset++] = value;
+ }
+ }
+ // SIGNED
+ for (int i = 0; i < 16; ++i) {
+ lookup[1792 + i] = 1;
+ lookup[2032 + i] = 6;
+ }
+ lookup[1792] = 0;
+ lookup[2047] = 7;
+ for (int i = 0; i < 256; ++i) {
+ lookup[1536 + i] = lookup[1792 + i] << 3;
+ }
+ }
+
+ static {
+ unpackLookupTable(LOOKUP, UTF_MAP, UTF_RLE);
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Decode.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Decode.java
new file mode 100644
index 000000000..560c635df
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Decode.java
@@ -0,0 +1,1251 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * API for Brotli decompression.
+ */
+final class Decode {
+
+ static final int MIN_LARGE_WINDOW_BITS = 10;
+ /* Maximum was chosen to be 30 to allow efficient decoder implementation.
+ * Format allows bigger window, but Java does not support 2G+ arrays. */
+ static final int MAX_LARGE_WINDOW_BITS = 30;
+
+ //----------------------------------------------------------------------------
+ // RunningState
+ //----------------------------------------------------------------------------
+ private static final int UNINITIALIZED = 0;
+ private static final int INITIALIZED = 1;
+ private static final int BLOCK_START = 2;
+ private static final int COMPRESSED_BLOCK_START = 3;
+ private static final int MAIN_LOOP = 4;
+ private static final int READ_METADATA = 5;
+ private static final int COPY_UNCOMPRESSED = 6;
+ private static final int INSERT_LOOP = 7;
+ private static final int COPY_LOOP = 8;
+ private static final int TRANSFORM = 9;
+ private static final int FINISHED = 10;
+ private static final int CLOSED = 11;
+ private static final int INIT_WRITE = 12;
+ private static final int WRITE = 13;
+
+ private static final int DEFAULT_CODE_LENGTH = 8;
+ private static final int CODE_LENGTH_REPEAT_CODE = 16;
+ private static final int NUM_LITERAL_CODES = 256;
+ private static final int NUM_COMMAND_CODES = 704;
+ private static final int NUM_BLOCK_LENGTH_CODES = 26;
+ private static final int LITERAL_CONTEXT_BITS = 6;
+ private static final int DISTANCE_CONTEXT_BITS = 2;
+
+ private static final int HUFFMAN_TABLE_BITS = 8;
+ private static final int HUFFMAN_TABLE_MASK = 0xFF;
+
+ /**
+ * Maximum possible Huffman table size for an alphabet size of (index * 32),
+ * max code length 15 and root table bits 8.
+ * The biggest alphabet is "command" - 704 symbols. Though "distance" alphabet could theoretically
+ * outreach that limit (for 62 extra bit distances), practically it is limited by
+ * MAX_ALLOWED_DISTANCE and never gets bigger than 544 symbols.
+ */
+ static final int[] MAX_HUFFMAN_TABLE_SIZE = {
+ 256, 402, 436, 468, 500, 534, 566, 598, 630, 662, 694, 726, 758, 790, 822,
+ 854, 886, 920, 952, 984, 1016, 1048, 1080
+ };
+
+ private static final int HUFFMAN_TABLE_SIZE_26 = 396;
+ private static final int HUFFMAN_TABLE_SIZE_258 = 632;
+
+ private static final int CODE_LENGTH_CODES = 18;
+ private static final int[] CODE_LENGTH_CODE_ORDER = {
+ 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ };
+
+ private static final int NUM_DISTANCE_SHORT_CODES = 16;
+ private static final int[] DISTANCE_SHORT_CODE_INDEX_OFFSET = {
+ 0, 3, 2, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3
+ };
+
+ private static final int[] DISTANCE_SHORT_CODE_VALUE_OFFSET = {
+ 0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3
+ };
+
+ /**
+ * Static Huffman code for the code length code lengths.
+ */
+ private static final int[] FIXED_TABLE = {
+ 0x020000, 0x020004, 0x020003, 0x030002, 0x020000, 0x020004, 0x020003, 0x040001,
+ 0x020000, 0x020004, 0x020003, 0x030002, 0x020000, 0x020004, 0x020003, 0x040005
+ };
+
+ static final int[] DICTIONARY_OFFSETS_BY_LENGTH = {
+ 0, 0, 0, 0, 0, 4096, 9216, 21504, 35840, 44032, 53248, 63488, 74752, 87040, 93696, 100864,
+ 104704, 106752, 108928, 113536, 115968, 118528, 119872, 121280, 122016
+ };
+
+ static final int[] DICTIONARY_SIZE_BITS_BY_LENGTH = {
+ 0, 0, 0, 0, 10, 10, 11, 11, 10, 10, 10, 10, 10, 9, 9, 8, 7, 7, 8, 7, 7, 6, 6, 5, 5
+ };
+
+ static final int MIN_WORD_LENGTH = 4;
+
+ static final int MAX_WORD_LENGTH = 24;
+
+ static final int MAX_TRANSFORMED_WORD_LENGTH = 5 + MAX_WORD_LENGTH + 8;
+
+ private static final int MAX_DISTANCE_BITS = 24;
+ private static final int MAX_LARGE_WINDOW_DISTANCE_BITS = 62;
+
+ /**
+ * Safe distance limit.
+ *
+ * Limit ((1 << 31) - 4) allows safe distance calculation without overflows,
+ * given the distance alphabet size is limited to corresponding size.
+ */
+ private static final int MAX_ALLOWED_DISTANCE = 0x7FFFFFFC;
+
+ //----------------------------------------------------------------------------
+ // Prefix code LUT.
+ //----------------------------------------------------------------------------
+ static final int[] BLOCK_LENGTH_OFFSET = {
+ 1, 5, 9, 13, 17, 25, 33, 41, 49, 65, 81, 97, 113, 145, 177, 209, 241, 305, 369, 497,
+ 753, 1265, 2289, 4337, 8433, 16625
+ };
+
+ static final int[] BLOCK_LENGTH_N_BITS = {
+ 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 24
+ };
+
+ static final short[] INSERT_LENGTH_N_BITS = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03,
+ 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0E, 0x18
+ };
+
+ static final short[] COPY_LENGTH_N_BITS = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02,
+ 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x18
+ };
+
+ // Each command is represented with 4x16-bit values:
+ // * [insertLenExtraBits, copyLenExtraBits]
+ // * insertLenOffset
+ // * copyLenOffset
+ // * distanceContext
+ static final short[] CMD_LOOKUP = new short[NUM_COMMAND_CODES * 4];
+
+ static {
+ unpackCommandLookupTable(CMD_LOOKUP);
+ }
+
+ private static int log2floor(int i) {
+ int result = -1;
+ int step = 16;
+ while (step > 0) {
+ if ((i >>> step) != 0) {
+ result += step;
+ i = i >>> step;
+ }
+ step = step >> 1;
+ }
+ return result + i;
+ }
+
+ private static int calculateDistanceAlphabetSize(int npostfix, int ndirect, int maxndistbits) {
+ return NUM_DISTANCE_SHORT_CODES + ndirect + 2 * (maxndistbits << npostfix);
+ }
+
+ // TODO: add a correctness test for this function when
+ // large-window and dictionary are implemented.
+ private static int calculateDistanceAlphabetLimit(int maxDistance, int npostfix, int ndirect) {
+ if (maxDistance < ndirect + (2 << npostfix)) {
+ throw new IllegalArgumentException("maxDistance is too small");
+ }
+ int offset = ((maxDistance - ndirect) >> npostfix) + 4;
+ int ndistbits = log2floor(offset) - 1;
+ int group = ((ndistbits - 1) << 1) | ((offset >> ndistbits) & 1);
+ return ((group - 1) << npostfix) + (1 << npostfix) + ndirect + NUM_DISTANCE_SHORT_CODES;
+ }
+
+ private static void unpackCommandLookupTable(short[] cmdLookup) {
+ short[] insertLengthOffsets = new short[24];
+ short[] copyLengthOffsets = new short[24];
+ copyLengthOffsets[0] = 2;
+ for (int i = 0; i < 23; ++i) {
+ insertLengthOffsets[i + 1] =
+ (short) (insertLengthOffsets[i] + (1 << INSERT_LENGTH_N_BITS[i]));
+ copyLengthOffsets[i + 1] =
+ (short) (copyLengthOffsets[i] + (1 << COPY_LENGTH_N_BITS[i]));
+ }
+
+ for (int cmdCode = 0; cmdCode < NUM_COMMAND_CODES; ++cmdCode) {
+ int rangeIdx = cmdCode >>> 6;
+ /* -4 turns any regular distance code to negative. */
+ int distanceContextOffset = -4;
+ if (rangeIdx >= 2) {
+ rangeIdx -= 2;
+ distanceContextOffset = 0;
+ }
+ int insertCode = (((0x29850 >>> (rangeIdx * 2)) & 0x3) << 3) | ((cmdCode >>> 3) & 7);
+ int copyCode = (((0x26244 >>> (rangeIdx * 2)) & 0x3) << 3) | (cmdCode & 7);
+ short copyLengthOffset = copyLengthOffsets[copyCode];
+ int distanceContext =
+ distanceContextOffset + (copyLengthOffset > 4 ? 3 : copyLengthOffset - 2);
+ int index = cmdCode * 4;
+ cmdLookup[index + 0] =
+ (short) (INSERT_LENGTH_N_BITS[insertCode] | (COPY_LENGTH_N_BITS[copyCode] << 8));
+ cmdLookup[index + 1] = insertLengthOffsets[insertCode];
+ cmdLookup[index + 2] = copyLengthOffsets[copyCode];
+ cmdLookup[index + 3] = (short) distanceContext;
+ }
+ }
+
+ /**
+ * Reads brotli stream header and parses "window bits".
+ *
+ * @param s initialized state, before any read is performed.
+ * @return -1 if header is invalid
+ */
+ private static int decodeWindowBits(State s) {
+ /* Change the meaning of flag. Before that step it means "decoder must be capable of reading
+ * "large-window" brotli stream. After this step it means that "large-window" feature
+ * is actually detected. Despite the window size could be same as before (lgwin = 10..24),
+ * encoded distances are allowed to be much greater, thus bigger dictinary could be used. */
+ int largeWindowEnabled = s.isLargeWindow;
+ s.isLargeWindow = 0;
+
+ BitReader.fillBitWindow(s);
+ if (BitReader.readFewBits(s, 1) == 0) {
+ return 16;
+ }
+ int n = BitReader.readFewBits(s, 3);
+ if (n != 0) {
+ return 17 + n;
+ }
+ n = BitReader.readFewBits(s, 3);
+ if (n != 0) {
+ if (n == 1) {
+ if (largeWindowEnabled == 0) {
+ /* Reserved value in regular brotli stream. */
+ return -1;
+ }
+ s.isLargeWindow = 1;
+ /* Check "reserved" bit for future (post-large-window) extensions. */
+ if (BitReader.readFewBits(s, 1) == 1) {
+ return -1;
+ }
+ n = BitReader.readFewBits(s, 6);
+ if (n < MIN_LARGE_WINDOW_BITS || n > MAX_LARGE_WINDOW_BITS) {
+ /* Encoded window bits value is too small or too big. */
+ return -1;
+ }
+ return n;
+ } else {
+ return 8 + n;
+ }
+ }
+ return 17;
+ }
+
+ /**
+ * Switch decoder to "eager" mode.
+ *
+ * In "eager" mode decoder returns as soon as there is enough data to fill output buffer.
+ *
+ * @param s initialized state, before any read is performed.
+ */
+ static void enableEagerOutput(State s) {
+ if (s.runningState != INITIALIZED) {
+ throw new IllegalStateException("State MUST be freshly initialized");
+ }
+ s.isEager = 1;
+ }
+
+ static void enableLargeWindow(State s) {
+ if (s.runningState != INITIALIZED) {
+ throw new IllegalStateException("State MUST be freshly initialized");
+ }
+ s.isLargeWindow = 1;
+ }
+
+ /**
+ * Associate input with decoder state.
+ *
+ * @param s uninitialized state without associated input
+ * @param input compressed data source
+ */
+ static void initState(State s, InputStream input) {
+ if (s.runningState != UNINITIALIZED) {
+ throw new IllegalStateException("State MUST be uninitialized");
+ }
+ /* 6 trees + 1 extra "offset" slot to simplify table decoding logic. */
+ s.blockTrees = new int[7 + 3 * (HUFFMAN_TABLE_SIZE_258 + HUFFMAN_TABLE_SIZE_26)];
+ s.blockTrees[0] = 7;
+ s.distRbIdx = 3;
+ int maxDistanceAlphabetLimit = calculateDistanceAlphabetLimit(MAX_ALLOWED_DISTANCE, 3, 15 << 3);
+ s.distExtraBits = new byte[maxDistanceAlphabetLimit];
+ s.distOffset = new int[maxDistanceAlphabetLimit];
+ s.input = input;
+ BitReader.initBitReader(s);
+ s.runningState = INITIALIZED;
+ }
+
+ static void close(State s) throws IOException {
+ if (s.runningState == UNINITIALIZED) {
+ throw new IllegalStateException("State MUST be initialized");
+ }
+ if (s.runningState == CLOSED) {
+ return;
+ }
+ s.runningState = CLOSED;
+ if (s.input != null) {
+ Utils.closeInput(s.input);
+ s.input = null;
+ }
+ }
+
+ /**
+ * Decodes a number in the range [0..255], by reading 1 - 11 bits.
+ */
+ private static int decodeVarLenUnsignedByte(State s) {
+ BitReader.fillBitWindow(s);
+ if (BitReader.readFewBits(s, 1) != 0) {
+ int n = BitReader.readFewBits(s, 3);
+ if (n == 0) {
+ return 1;
+ } else {
+ return BitReader.readFewBits(s, n) + (1 << n);
+ }
+ }
+ return 0;
+ }
+
+ private static void decodeMetaBlockLength(State s) {
+ BitReader.fillBitWindow(s);
+ s.inputEnd = BitReader.readFewBits(s, 1);
+ s.metaBlockLength = 0;
+ s.isUncompressed = 0;
+ s.isMetadata = 0;
+ if ((s.inputEnd != 0) && BitReader.readFewBits(s, 1) != 0) {
+ return;
+ }
+ int sizeNibbles = BitReader.readFewBits(s, 2) + 4;
+ if (sizeNibbles == 7) {
+ s.isMetadata = 1;
+ if (BitReader.readFewBits(s, 1) != 0) {
+ throw new BrotliRuntimeException("Corrupted reserved bit");
+ }
+ int sizeBytes = BitReader.readFewBits(s, 2);
+ if (sizeBytes == 0) {
+ return;
+ }
+ for (int i = 0; i < sizeBytes; i++) {
+ BitReader.fillBitWindow(s);
+ int bits = BitReader.readFewBits(s, 8);
+ if (bits == 0 && i + 1 == sizeBytes && sizeBytes > 1) {
+ throw new BrotliRuntimeException("Exuberant nibble");
+ }
+ s.metaBlockLength |= bits << (i * 8);
+ }
+ } else {
+ for (int i = 0; i < sizeNibbles; i++) {
+ BitReader.fillBitWindow(s);
+ int bits = BitReader.readFewBits(s, 4);
+ if (bits == 0 && i + 1 == sizeNibbles && sizeNibbles > 4) {
+ throw new BrotliRuntimeException("Exuberant nibble");
+ }
+ s.metaBlockLength |= bits << (i * 4);
+ }
+ }
+ s.metaBlockLength++;
+ if (s.inputEnd == 0) {
+ s.isUncompressed = BitReader.readFewBits(s, 1);
+ }
+ }
+
+ /**
+ * Decodes the next Huffman code from bit-stream.
+ */
+ private static int readSymbol(int[] tableGroup, int tableIdx, State s) {
+ int offset = tableGroup[tableIdx];
+ int val = BitReader.peekBits(s);
+ offset += val & HUFFMAN_TABLE_MASK;
+ int bits = tableGroup[offset] >> 16;
+ int sym = tableGroup[offset] & 0xFFFF;
+ if (bits <= HUFFMAN_TABLE_BITS) {
+ s.bitOffset += bits;
+ return sym;
+ }
+ offset += sym;
+ int mask = (1 << bits) - 1;
+ offset += (val & mask) >>> HUFFMAN_TABLE_BITS;
+ s.bitOffset += ((tableGroup[offset] >> 16) + HUFFMAN_TABLE_BITS);
+ return tableGroup[offset] & 0xFFFF;
+ }
+
+ private static int readBlockLength(int[] tableGroup, int tableIdx, State s) {
+ BitReader.fillBitWindow(s);
+ int code = readSymbol(tableGroup, tableIdx, s);
+ int n = BLOCK_LENGTH_N_BITS[code];
+ BitReader.fillBitWindow(s);
+ return BLOCK_LENGTH_OFFSET[code] + BitReader.readBits(s, n);
+ }
+
+ private static void moveToFront(int[] v, int index) {
+ int value = v[index];
+ for (; index > 0; index--) {
+ v[index] = v[index - 1];
+ }
+ v[0] = value;
+ }
+
+ private static void inverseMoveToFrontTransform(byte[] v, int vLen) {
+ int[] mtf = new int[256];
+ for (int i = 0; i < 256; i++) {
+ mtf[i] = i;
+ }
+ for (int i = 0; i < vLen; i++) {
+ int index = v[i] & 0xFF;
+ v[i] = (byte) mtf[index];
+ if (index != 0) {
+ moveToFront(mtf, index);
+ }
+ }
+ }
+
+ private static void readHuffmanCodeLengths(
+ int[] codeLengthCodeLengths, int numSymbols, int[] codeLengths, State s) {
+ int symbol = 0;
+ int prevCodeLen = DEFAULT_CODE_LENGTH;
+ int repeat = 0;
+ int repeatCodeLen = 0;
+ int space = 32768;
+ int[] table = new int[32 + 1]; /* Speculative single entry table group. */
+ int tableIdx = table.length - 1;
+ Huffman.buildHuffmanTable(table, tableIdx, 5, codeLengthCodeLengths, CODE_LENGTH_CODES);
+
+ while (symbol < numSymbols && space > 0) {
+ BitReader.readMoreInput(s);
+ BitReader.fillBitWindow(s);
+ int p = BitReader.peekBits(s) & 31;
+ s.bitOffset += table[p] >> 16;
+ int codeLen = table[p] & 0xFFFF;
+ if (codeLen < CODE_LENGTH_REPEAT_CODE) {
+ repeat = 0;
+ codeLengths[symbol++] = codeLen;
+ if (codeLen != 0) {
+ prevCodeLen = codeLen;
+ space -= 32768 >> codeLen;
+ }
+ } else {
+ int extraBits = codeLen - 14;
+ int newLen = 0;
+ if (codeLen == CODE_LENGTH_REPEAT_CODE) {
+ newLen = prevCodeLen;
+ }
+ if (repeatCodeLen != newLen) {
+ repeat = 0;
+ repeatCodeLen = newLen;
+ }
+ int oldRepeat = repeat;
+ if (repeat > 0) {
+ repeat -= 2;
+ repeat <<= extraBits;
+ }
+ BitReader.fillBitWindow(s);
+ repeat += BitReader.readFewBits(s, extraBits) + 3;
+ int repeatDelta = repeat - oldRepeat;
+ if (symbol + repeatDelta > numSymbols) {
+ throw new BrotliRuntimeException("symbol + repeatDelta > numSymbols"); // COV_NF_LINE
+ }
+ for (int i = 0; i < repeatDelta; i++) {
+ codeLengths[symbol++] = repeatCodeLen;
+ }
+ if (repeatCodeLen != 0) {
+ space -= repeatDelta << (15 - repeatCodeLen);
+ }
+ }
+ }
+ if (space != 0) {
+ throw new BrotliRuntimeException("Unused space"); // COV_NF_LINE
+ }
+ // TODO: Pass max_symbol to Huffman table builder instead?
+ Utils.fillIntsWithZeroes(codeLengths, symbol, numSymbols);
+ }
+
+ private static void checkDupes(int[] symbols, int length) {
+ for (int i = 0; i < length - 1; ++i) {
+ for (int j = i + 1; j < length; ++j) {
+ if (symbols[i] == symbols[j]) {
+ throw new BrotliRuntimeException("Duplicate simple Huffman code symbol"); // COV_NF_LINE
+ }
+ }
+ }
+ }
+
+ /**
+ * Reads up to 4 symbols directly and applies predefined histograms.
+ */
+ private static int readSimpleHuffmanCode(int alphabetSizeMax, int alphabetSizeLimit,
+ int[] tableGroup, int tableIdx, State s) {
+ // TODO: Avoid allocation?
+ int[] codeLengths = new int[alphabetSizeLimit];
+ int[] symbols = new int[4];
+
+ int maxBits = 1 + log2floor(alphabetSizeMax - 1);
+
+ int numSymbols = BitReader.readFewBits(s, 2) + 1;
+ for (int i = 0; i < numSymbols; i++) {
+ BitReader.fillBitWindow(s);
+ int symbol = BitReader.readFewBits(s, maxBits);
+ if (symbol >= alphabetSizeLimit) {
+ throw new BrotliRuntimeException("Can't readHuffmanCode"); // COV_NF_LINE
+ }
+ symbols[i] = symbol;
+ }
+ checkDupes(symbols, numSymbols);
+
+ int histogramId = numSymbols;
+ if (numSymbols == 4) {
+ histogramId += BitReader.readFewBits(s, 1);
+ }
+
+ switch (histogramId) {
+ case 1:
+ codeLengths[symbols[0]] = 1;
+ break;
+
+ case 2:
+ codeLengths[symbols[0]] = 1;
+ codeLengths[symbols[1]] = 1;
+ break;
+
+ case 3:
+ codeLengths[symbols[0]] = 1;
+ codeLengths[symbols[1]] = 2;
+ codeLengths[symbols[2]] = 2;
+ break;
+
+ case 4: // uniform 4-symbol histogram
+ codeLengths[symbols[0]] = 2;
+ codeLengths[symbols[1]] = 2;
+ codeLengths[symbols[2]] = 2;
+ codeLengths[symbols[3]] = 2;
+ break;
+
+ case 5: // prioritized 4-symbol histogram
+ codeLengths[symbols[0]] = 1;
+ codeLengths[symbols[1]] = 2;
+ codeLengths[symbols[2]] = 3;
+ codeLengths[symbols[3]] = 3;
+ break;
+
+ default:
+ break;
+ }
+
+ // TODO: Use specialized version?
+ return Huffman.buildHuffmanTable(
+ tableGroup, tableIdx, HUFFMAN_TABLE_BITS, codeLengths, alphabetSizeLimit);
+ }
+
+ // Decode Huffman-coded code lengths.
+ private static int readComplexHuffmanCode(int alphabetSizeLimit, int skip,
+ int[] tableGroup, int tableIdx, State s) {
+ // TODO: Avoid allocation?
+ int[] codeLengths = new int[alphabetSizeLimit];
+ int[] codeLengthCodeLengths = new int[CODE_LENGTH_CODES];
+ int space = 32;
+ int numCodes = 0;
+ for (int i = skip; i < CODE_LENGTH_CODES && space > 0; i++) {
+ int codeLenIdx = CODE_LENGTH_CODE_ORDER[i];
+ BitReader.fillBitWindow(s);
+ int p = BitReader.peekBits(s) & 15;
+ // TODO: Demultiplex FIXED_TABLE.
+ s.bitOffset += FIXED_TABLE[p] >> 16;
+ int v = FIXED_TABLE[p] & 0xFFFF;
+ codeLengthCodeLengths[codeLenIdx] = v;
+ if (v != 0) {
+ space -= (32 >> v);
+ numCodes++;
+ }
+ }
+ if (space != 0 && numCodes != 1) {
+ throw new BrotliRuntimeException("Corrupted Huffman code histogram"); // COV_NF_LINE
+ }
+
+ readHuffmanCodeLengths(codeLengthCodeLengths, alphabetSizeLimit, codeLengths, s);
+
+ return Huffman.buildHuffmanTable(
+ tableGroup, tableIdx, HUFFMAN_TABLE_BITS, codeLengths, alphabetSizeLimit);
+ }
+
+ /**
+ * Decodes Huffman table from bit-stream.
+ *
+ * @return number of slots used by resulting Huffman table
+ */
+ private static int readHuffmanCode(int alphabetSizeMax, int alphabetSizeLimit,
+ int[] tableGroup, int tableIdx, State s) {
+ BitReader.readMoreInput(s);
+ BitReader.fillBitWindow(s);
+ int simpleCodeOrSkip = BitReader.readFewBits(s, 2);
+ if (simpleCodeOrSkip == 1) {
+ return readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s);
+ } else {
+ return readComplexHuffmanCode(alphabetSizeLimit, simpleCodeOrSkip, tableGroup, tableIdx, s);
+ }
+ }
+
+ private static int decodeContextMap(int contextMapSize, byte[] contextMap, State s) {
+ BitReader.readMoreInput(s);
+ int numTrees = decodeVarLenUnsignedByte(s) + 1;
+
+ if (numTrees == 1) {
+ Utils.fillBytesWithZeroes(contextMap, 0, contextMapSize);
+ return numTrees;
+ }
+
+ BitReader.fillBitWindow(s);
+ int useRleForZeros = BitReader.readFewBits(s, 1);
+ int maxRunLengthPrefix = 0;
+ if (useRleForZeros != 0) {
+ maxRunLengthPrefix = BitReader.readFewBits(s, 4) + 1;
+ }
+ int alphabetSize = numTrees + maxRunLengthPrefix;
+ int tableSize = MAX_HUFFMAN_TABLE_SIZE[(alphabetSize + 31) >> 5];
+ /* Speculative single entry table group. */
+ int[] table = new int[tableSize + 1];
+ int tableIdx = table.length - 1;
+ readHuffmanCode(alphabetSize, alphabetSize, table, tableIdx, s);
+ for (int i = 0; i < contextMapSize; ) {
+ BitReader.readMoreInput(s);
+ BitReader.fillBitWindow(s);
+ int code = readSymbol(table, tableIdx, s);
+ if (code == 0) {
+ contextMap[i] = 0;
+ i++;
+ } else if (code <= maxRunLengthPrefix) {
+ BitReader.fillBitWindow(s);
+ int reps = (1 << code) + BitReader.readFewBits(s, code);
+ while (reps != 0) {
+ if (i >= contextMapSize) {
+ throw new BrotliRuntimeException("Corrupted context map"); // COV_NF_LINE
+ }
+ contextMap[i] = 0;
+ i++;
+ reps--;
+ }
+ } else {
+ contextMap[i] = (byte) (code - maxRunLengthPrefix);
+ i++;
+ }
+ }
+ BitReader.fillBitWindow(s);
+ if (BitReader.readFewBits(s, 1) == 1) {
+ inverseMoveToFrontTransform(contextMap, contextMapSize);
+ }
+ return numTrees;
+ }
+
+ private static int decodeBlockTypeAndLength(State s, int treeType, int numBlockTypes) {
+ final int[] ringBuffers = s.rings;
+ final int offset = 4 + treeType * 2;
+ BitReader.fillBitWindow(s);
+ int blockType = readSymbol(s.blockTrees, 2 * treeType, s);
+ int result = readBlockLength(s.blockTrees, 2 * treeType + 1, s);
+
+ if (blockType == 1) {
+ blockType = ringBuffers[offset + 1] + 1;
+ } else if (blockType == 0) {
+ blockType = ringBuffers[offset];
+ } else {
+ blockType -= 2;
+ }
+ if (blockType >= numBlockTypes) {
+ blockType -= numBlockTypes;
+ }
+ ringBuffers[offset] = ringBuffers[offset + 1];
+ ringBuffers[offset + 1] = blockType;
+ return result;
+ }
+
+ private static void decodeLiteralBlockSwitch(State s) {
+ s.literalBlockLength = decodeBlockTypeAndLength(s, 0, s.numLiteralBlockTypes);
+ int literalBlockType = s.rings[5];
+ s.contextMapSlice = literalBlockType << LITERAL_CONTEXT_BITS;
+ s.literalTreeIdx = s.contextMap[s.contextMapSlice] & 0xFF;
+ int contextMode = s.contextModes[literalBlockType];
+ s.contextLookupOffset1 = contextMode << 9;
+ s.contextLookupOffset2 = s.contextLookupOffset1 + 256;
+ }
+
+ private static void decodeCommandBlockSwitch(State s) {
+ s.commandBlockLength = decodeBlockTypeAndLength(s, 1, s.numCommandBlockTypes);
+ s.commandTreeIdx = s.rings[7];
+ }
+
+ private static void decodeDistanceBlockSwitch(State s) {
+ s.distanceBlockLength = decodeBlockTypeAndLength(s, 2, s.numDistanceBlockTypes);
+ s.distContextMapSlice = s.rings[9] << DISTANCE_CONTEXT_BITS;
+ }
+
+ private static void maybeReallocateRingBuffer(State s) {
+ int newSize = s.maxRingBufferSize;
+ if (newSize > s.expectedTotalSize) {
+ /* TODO: Handle 2GB+ cases more gracefully. */
+ int minimalNewSize = s.expectedTotalSize;
+ while ((newSize >> 1) > minimalNewSize) {
+ newSize >>= 1;
+ }
+ if ((s.inputEnd == 0) && newSize < 16384 && s.maxRingBufferSize >= 16384) {
+ newSize = 16384;
+ }
+ }
+ if (newSize <= s.ringBufferSize) {
+ return;
+ }
+ int ringBufferSizeWithSlack = newSize + MAX_TRANSFORMED_WORD_LENGTH;
+ byte[] newBuffer = new byte[ringBufferSizeWithSlack];
+ if (s.ringBuffer.length != 0) {
+ System.arraycopy(s.ringBuffer, 0, newBuffer, 0, s.ringBufferSize);
+ }
+ s.ringBuffer = newBuffer;
+ s.ringBufferSize = newSize;
+ }
+
+ private static void readNextMetablockHeader(State s) {
+ if (s.inputEnd != 0) {
+ s.nextRunningState = FINISHED;
+ s.runningState = INIT_WRITE;
+ return;
+ }
+ // TODO: Reset? Do we need this?
+ s.literalTreeGroup = new int[0];
+ s.commandTreeGroup = new int[0];
+ s.distanceTreeGroup = new int[0];
+
+ BitReader.readMoreInput(s);
+ decodeMetaBlockLength(s);
+ if ((s.metaBlockLength == 0) && (s.isMetadata == 0)) {
+ return;
+ }
+ if ((s.isUncompressed != 0) || (s.isMetadata != 0)) {
+ BitReader.jumpToByteBoundary(s);
+ s.runningState = (s.isMetadata != 0) ? READ_METADATA : COPY_UNCOMPRESSED;
+ } else {
+ s.runningState = COMPRESSED_BLOCK_START;
+ }
+
+ if (s.isMetadata != 0) {
+ return;
+ }
+ s.expectedTotalSize += s.metaBlockLength;
+ if (s.expectedTotalSize > 1 << 30) {
+ s.expectedTotalSize = 1 << 30;
+ }
+ if (s.ringBufferSize < s.maxRingBufferSize) {
+ maybeReallocateRingBuffer(s);
+ }
+ }
+
+ private static int readMetablockPartition(State s, int treeType, int numBlockTypes) {
+ int offset = s.blockTrees[2 * treeType];
+ if (numBlockTypes <= 1) {
+ s.blockTrees[2 * treeType + 1] = offset;
+ s.blockTrees[2 * treeType + 2] = offset;
+ return 1 << 28;
+ }
+
+ int blockTypeAlphabetSize = numBlockTypes + 2;
+ offset += readHuffmanCode(
+ blockTypeAlphabetSize, blockTypeAlphabetSize, s.blockTrees, 2 * treeType, s);
+ s.blockTrees[2 * treeType + 1] = offset;
+
+ int blockLengthAlphabetSize = NUM_BLOCK_LENGTH_CODES;
+ offset += readHuffmanCode(
+ blockLengthAlphabetSize, blockLengthAlphabetSize, s.blockTrees, 2 * treeType + 1, s);
+ s.blockTrees[2 * treeType + 2] = offset;
+
+ return readBlockLength(s.blockTrees, 2 * treeType + 1, s);
+ }
+
+ private static void calculateDistanceLut(State s, int alphabetSizeLimit) {
+ byte[] distExtraBits = s.distExtraBits;
+ int[] distOffset = s.distOffset;
+ int npostfix = s.distancePostfixBits;
+ int ndirect = s.numDirectDistanceCodes;
+ int postfix = 1 << npostfix;
+ int bits = 1;
+ int half = 0;
+
+ /* Skip short codes. */
+ int i = NUM_DISTANCE_SHORT_CODES;
+
+ /* Fill direct codes. */
+ for (int j = 0; j < ndirect; ++j) {
+ distExtraBits[i] = 0;
+ distOffset[i] = j + 1;
+ ++i;
+ }
+
+ /* Fill regular distance codes. */
+ while (i < alphabetSizeLimit) {
+ int base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1;
+ /* Always fill the complete group. */
+ for (int j = 0; j < postfix; ++j) {
+ distExtraBits[i] = (byte) bits;
+ distOffset[i] = base + j;
+ ++i;
+ }
+ bits = bits + half;
+ half = half ^ 1;
+ }
+ }
+
+ private static void readMetablockHuffmanCodesAndContextMaps(State s) {
+ s.numLiteralBlockTypes = decodeVarLenUnsignedByte(s) + 1;
+ s.literalBlockLength = readMetablockPartition(s, 0, s.numLiteralBlockTypes);
+ s.numCommandBlockTypes = decodeVarLenUnsignedByte(s) + 1;
+ s.commandBlockLength = readMetablockPartition(s, 1, s.numCommandBlockTypes);
+ s.numDistanceBlockTypes = decodeVarLenUnsignedByte(s) + 1;
+ s.distanceBlockLength = readMetablockPartition(s, 2, s.numDistanceBlockTypes);
+
+ BitReader.readMoreInput(s);
+ BitReader.fillBitWindow(s);
+ s.distancePostfixBits = BitReader.readFewBits(s, 2);
+ s.numDirectDistanceCodes = BitReader.readFewBits(s, 4) << s.distancePostfixBits;
+ s.distancePostfixMask = (1 << s.distancePostfixBits) - 1;
+ // TODO: Reuse?
+ s.contextModes = new byte[s.numLiteralBlockTypes];
+ for (int i = 0; i < s.numLiteralBlockTypes;) {
+ /* Ensure that less than 256 bits read between readMoreInput. */
+ int limit = Math.min(i + 96, s.numLiteralBlockTypes);
+ for (; i < limit; ++i) {
+ BitReader.fillBitWindow(s);
+ s.contextModes[i] = (byte) BitReader.readFewBits(s, 2);
+ }
+ BitReader.readMoreInput(s);
+ }
+
+ // TODO: Reuse?
+ s.contextMap = new byte[s.numLiteralBlockTypes << LITERAL_CONTEXT_BITS];
+ int numLiteralTrees = decodeContextMap(s.numLiteralBlockTypes << LITERAL_CONTEXT_BITS,
+ s.contextMap, s);
+ s.trivialLiteralContext = 1;
+ for (int j = 0; j < s.numLiteralBlockTypes << LITERAL_CONTEXT_BITS; j++) {
+ if (s.contextMap[j] != j >> LITERAL_CONTEXT_BITS) {
+ s.trivialLiteralContext = 0;
+ break;
+ }
+ }
+
+ // TODO: Reuse?
+ s.distContextMap = new byte[s.numDistanceBlockTypes << DISTANCE_CONTEXT_BITS];
+ int numDistTrees = decodeContextMap(s.numDistanceBlockTypes << DISTANCE_CONTEXT_BITS,
+ s.distContextMap, s);
+
+ s.literalTreeGroup = decodeHuffmanTreeGroup(NUM_LITERAL_CODES, NUM_LITERAL_CODES,
+ numLiteralTrees, s);
+ s.commandTreeGroup = decodeHuffmanTreeGroup(NUM_COMMAND_CODES, NUM_COMMAND_CODES,
+ s.numCommandBlockTypes, s);
+ int distanceAlphabetSizeMax = calculateDistanceAlphabetSize(
+ s.distancePostfixBits, s.numDirectDistanceCodes, MAX_DISTANCE_BITS);
+ int distanceAlphabetSizeLimit = distanceAlphabetSizeMax;
+ if (s.isLargeWindow == 1) {
+ distanceAlphabetSizeMax = calculateDistanceAlphabetSize(
+ s.distancePostfixBits, s.numDirectDistanceCodes, MAX_LARGE_WINDOW_DISTANCE_BITS);
+ distanceAlphabetSizeLimit = calculateDistanceAlphabetLimit(
+ MAX_ALLOWED_DISTANCE, s.distancePostfixBits, s.numDirectDistanceCodes);
+ }
+ s.distanceTreeGroup = decodeHuffmanTreeGroup(distanceAlphabetSizeMax, distanceAlphabetSizeLimit,
+ numDistTrees, s);
+ calculateDistanceLut(s, distanceAlphabetSizeLimit);
+
+ s.contextMapSlice = 0;
+ s.distContextMapSlice = 0;
+ s.contextLookupOffset1 = s.contextModes[0] * 512;
+ s.contextLookupOffset2 = s.contextLookupOffset1 + 256;
+ s.literalTreeIdx = 0;
+ s.commandTreeIdx = 0;
+
+ s.rings[4] = 1;
+ s.rings[5] = 0;
+ s.rings[6] = 1;
+ s.rings[7] = 0;
+ s.rings[8] = 1;
+ s.rings[9] = 0;
+ }
+
+ private static void copyUncompressedData(State s) {
+ final byte[] ringBuffer = s.ringBuffer;
+
+ // Could happen if block ends at ring buffer end.
+ if (s.metaBlockLength <= 0) {
+ BitReader.reload(s);
+ s.runningState = BLOCK_START;
+ return;
+ }
+
+ int chunkLength = Math.min(s.ringBufferSize - s.pos, s.metaBlockLength);
+ BitReader.copyBytes(s, ringBuffer, s.pos, chunkLength);
+ s.metaBlockLength -= chunkLength;
+ s.pos += chunkLength;
+ if (s.pos == s.ringBufferSize) {
+ s.nextRunningState = COPY_UNCOMPRESSED;
+ s.runningState = INIT_WRITE;
+ return;
+ }
+
+ BitReader.reload(s);
+ s.runningState = BLOCK_START;
+ }
+
+ private static int writeRingBuffer(State s) {
+ int toWrite = Math.min(s.outputLength - s.outputUsed,
+ s.ringBufferBytesReady - s.ringBufferBytesWritten);
+ if (toWrite != 0) {
+ System.arraycopy(s.ringBuffer, s.ringBufferBytesWritten, s.output,
+ s.outputOffset + s.outputUsed, toWrite);
+ s.outputUsed += toWrite;
+ s.ringBufferBytesWritten += toWrite;
+ }
+
+ if (s.outputUsed < s.outputLength) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+
+ private static int[] decodeHuffmanTreeGroup(int alphabetSizeMax, int alphabetSizeLimit,
+ int n, State s) {
+ int maxTableSize = MAX_HUFFMAN_TABLE_SIZE[(alphabetSizeLimit + 31) >> 5];
+ int[] group = new int[n + n * maxTableSize];
+ int next = n;
+ for (int i = 0; i < n; ++i) {
+ group[i] = next;
+ next += readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, group, i, s);
+ }
+ return group;
+ }
+
+ // Returns offset in ringBuffer that should trigger WRITE when filled.
+ private static int calculateFence(State s) {
+ int result = s.ringBufferSize;
+ if (s.isEager != 0) {
+ result = Math.min(result, s.ringBufferBytesWritten + s.outputLength - s.outputUsed);
+ }
+ return result;
+ }
+
+ /**
+ * Actual decompress implementation.
+ */
+ static void decompress(State s) {
+ if (s.runningState == UNINITIALIZED) {
+ throw new IllegalStateException("Can't decompress until initialized");
+ }
+ if (s.runningState == CLOSED) {
+ throw new IllegalStateException("Can't decompress after close");
+ }
+ if (s.runningState == INITIALIZED) {
+ int windowBits = decodeWindowBits(s);
+ if (windowBits == -1) { /* Reserved case for future expansion. */
+ throw new BrotliRuntimeException("Invalid 'windowBits' code");
+ }
+ s.maxRingBufferSize = 1 << windowBits;
+ s.maxBackwardDistance = s.maxRingBufferSize - 16;
+ s.runningState = BLOCK_START;
+ }
+
+ int fence = calculateFence(s);
+ int ringBufferMask = s.ringBufferSize - 1;
+ byte[] ringBuffer = s.ringBuffer;
+
+ while (s.runningState != FINISHED) {
+ // TODO: extract cases to methods for the better readability.
+ switch (s.runningState) {
+ case BLOCK_START:
+ if (s.metaBlockLength < 0) {
+ throw new BrotliRuntimeException("Invalid metablock length");
+ }
+ readNextMetablockHeader(s);
+ /* Ring-buffer would be reallocated here. */
+ fence = calculateFence(s);
+ ringBufferMask = s.ringBufferSize - 1;
+ ringBuffer = s.ringBuffer;
+ continue;
+
+ case COMPRESSED_BLOCK_START:
+ readMetablockHuffmanCodesAndContextMaps(s);
+ s.runningState = MAIN_LOOP;
+ // Fall through
+
+ case MAIN_LOOP:
+ if (s.metaBlockLength <= 0) {
+ s.runningState = BLOCK_START;
+ continue;
+ }
+ BitReader.readMoreInput(s);
+ if (s.commandBlockLength == 0) {
+ decodeCommandBlockSwitch(s);
+ }
+ s.commandBlockLength--;
+ BitReader.fillBitWindow(s);
+ int cmdCode = readSymbol(s.commandTreeGroup, s.commandTreeIdx, s) << 2;
+ short insertAndCopyExtraBits = CMD_LOOKUP[cmdCode];
+ int insertLengthOffset = CMD_LOOKUP[cmdCode + 1];
+ int copyLengthOffset = CMD_LOOKUP[cmdCode + 2];
+ s.distanceCode = CMD_LOOKUP[cmdCode + 3];
+ BitReader.fillBitWindow(s);
+ {
+ int extraBits = insertAndCopyExtraBits & 0xFF;
+ s.insertLength = insertLengthOffset + BitReader.readBits(s, extraBits);
+ }
+ BitReader.fillBitWindow(s);
+ {
+ int extraBits = insertAndCopyExtraBits >> 8;
+ s.copyLength = copyLengthOffset + BitReader.readBits(s, extraBits);
+ }
+
+ s.j = 0;
+ s.runningState = INSERT_LOOP;
+
+ // Fall through
+ case INSERT_LOOP:
+ if (s.trivialLiteralContext != 0) {
+ while (s.j < s.insertLength) {
+ BitReader.readMoreInput(s);
+ if (s.literalBlockLength == 0) {
+ decodeLiteralBlockSwitch(s);
+ }
+ s.literalBlockLength--;
+ BitReader.fillBitWindow(s);
+ ringBuffer[s.pos] = (byte) readSymbol(s.literalTreeGroup, s.literalTreeIdx, s);
+ s.pos++;
+ s.j++;
+ if (s.pos >= fence) {
+ s.nextRunningState = INSERT_LOOP;
+ s.runningState = INIT_WRITE;
+ break;
+ }
+ }
+ } else {
+ int prevByte1 = ringBuffer[(s.pos - 1) & ringBufferMask] & 0xFF;
+ int prevByte2 = ringBuffer[(s.pos - 2) & ringBufferMask] & 0xFF;
+ while (s.j < s.insertLength) {
+ BitReader.readMoreInput(s);
+ if (s.literalBlockLength == 0) {
+ decodeLiteralBlockSwitch(s);
+ }
+ int literalContext = Context.LOOKUP[s.contextLookupOffset1 + prevByte1]
+ | Context.LOOKUP[s.contextLookupOffset2 + prevByte2];
+ int literalTreeIdx = s.contextMap[s.contextMapSlice + literalContext] & 0xFF;
+ s.literalBlockLength--;
+ prevByte2 = prevByte1;
+ BitReader.fillBitWindow(s);
+ prevByte1 = readSymbol(s.literalTreeGroup, literalTreeIdx, s);
+ ringBuffer[s.pos] = (byte) prevByte1;
+ s.pos++;
+ s.j++;
+ if (s.pos >= fence) {
+ s.nextRunningState = INSERT_LOOP;
+ s.runningState = INIT_WRITE;
+ break;
+ }
+ }
+ }
+ if (s.runningState != INSERT_LOOP) {
+ continue;
+ }
+ s.metaBlockLength -= s.insertLength;
+ if (s.metaBlockLength <= 0) {
+ s.runningState = MAIN_LOOP;
+ continue;
+ }
+ int distanceCode = s.distanceCode;
+ if (distanceCode < 0) {
+ // distanceCode in untouched; assigning it 0 won't affect distance ring buffer rolling.
+ s.distance = s.rings[s.distRbIdx];
+ } else {
+ BitReader.readMoreInput(s);
+ if (s.distanceBlockLength == 0) {
+ decodeDistanceBlockSwitch(s);
+ }
+ s.distanceBlockLength--;
+ BitReader.fillBitWindow(s);
+ int distTreeIdx = s.distContextMap[s.distContextMapSlice + distanceCode] & 0xFF;
+ distanceCode = readSymbol(s.distanceTreeGroup, distTreeIdx, s);
+ if (distanceCode < NUM_DISTANCE_SHORT_CODES) {
+ int index = (s.distRbIdx + DISTANCE_SHORT_CODE_INDEX_OFFSET[distanceCode]) & 0x3;
+ s.distance = s.rings[index] + DISTANCE_SHORT_CODE_VALUE_OFFSET[distanceCode];
+ if (s.distance < 0) {
+ throw new BrotliRuntimeException("Negative distance"); // COV_NF_LINE
+ }
+ } else {
+ int extraBits = s.distExtraBits[distanceCode];
+ int bits;
+ if (s.bitOffset + extraBits <= BitReader.BITNESS) {
+ bits = BitReader.readFewBits(s, extraBits);
+ } else {
+ BitReader.fillBitWindow(s);
+ bits = BitReader.readBits(s, extraBits);
+ }
+ s.distance = s.distOffset[distanceCode] + (bits << s.distancePostfixBits);
+ }
+ }
+
+ if (s.maxDistance != s.maxBackwardDistance
+ && s.pos < s.maxBackwardDistance) {
+ s.maxDistance = s.pos;
+ } else {
+ s.maxDistance = s.maxBackwardDistance;
+ }
+
+ if (s.distance > s.maxDistance) {
+ s.runningState = TRANSFORM;
+ continue;
+ }
+
+ if (distanceCode > 0) {
+ s.distRbIdx = (s.distRbIdx + 1) & 0x3;
+ s.rings[s.distRbIdx] = s.distance;
+ }
+
+ if (s.copyLength > s.metaBlockLength) {
+ throw new BrotliRuntimeException("Invalid backward reference"); // COV_NF_LINE
+ }
+ s.j = 0;
+ s.runningState = COPY_LOOP;
+ // fall through
+ case COPY_LOOP:
+ int src = (s.pos - s.distance) & ringBufferMask;
+ int dst = s.pos;
+ int copyLength = s.copyLength - s.j;
+ int srcEnd = src + copyLength;
+ int dstEnd = dst + copyLength;
+ if ((srcEnd < ringBufferMask) && (dstEnd < ringBufferMask)) {
+ if (copyLength < 12 || (srcEnd > dst && dstEnd > src)) {
+ for (int k = 0; k < copyLength; k += 4) {
+ ringBuffer[dst++] = ringBuffer[src++];
+ ringBuffer[dst++] = ringBuffer[src++];
+ ringBuffer[dst++] = ringBuffer[src++];
+ ringBuffer[dst++] = ringBuffer[src++];
+ }
+ } else {
+ Utils.copyBytesWithin(ringBuffer, dst, src, srcEnd);
+ }
+ s.j += copyLength;
+ s.metaBlockLength -= copyLength;
+ s.pos += copyLength;
+ } else {
+ for (; s.j < s.copyLength;) {
+ ringBuffer[s.pos] =
+ ringBuffer[(s.pos - s.distance) & ringBufferMask];
+ s.metaBlockLength--;
+ s.pos++;
+ s.j++;
+ if (s.pos >= fence) {
+ s.nextRunningState = COPY_LOOP;
+ s.runningState = INIT_WRITE;
+ break;
+ }
+ }
+ }
+ if (s.runningState == COPY_LOOP) {
+ s.runningState = MAIN_LOOP;
+ }
+ continue;
+
+ case TRANSFORM:
+ // This check is done here to unburden the hot loop.
+ if (s.distance > MAX_ALLOWED_DISTANCE) {
+ throw new BrotliRuntimeException("Invalid backward reference"); // COV_NF_LINE
+ }
+ if (s.copyLength >= MIN_WORD_LENGTH
+ && s.copyLength <= MAX_WORD_LENGTH) {
+ int offset = DICTIONARY_OFFSETS_BY_LENGTH[s.copyLength];
+ int wordId = s.distance - s.maxDistance - 1;
+ int shift = DICTIONARY_SIZE_BITS_BY_LENGTH[s.copyLength];
+ int mask = (1 << shift) - 1;
+ int wordIdx = wordId & mask;
+ int transformIdx = wordId >>> shift;
+ offset += wordIdx * s.copyLength;
+ if (transformIdx < Transform.NUM_RFC_TRANSFORMS) {
+ int len = Transform.transformDictionaryWord(ringBuffer, s.pos, Dictionary.getData(),
+ offset, s.copyLength, Transform.RFC_TRANSFORMS, transformIdx);
+ s.pos += len;
+ s.metaBlockLength -= len;
+ if (s.pos >= fence) {
+ s.nextRunningState = MAIN_LOOP;
+ s.runningState = INIT_WRITE;
+ continue;
+ }
+ } else {
+ throw new BrotliRuntimeException("Invalid backward reference"); // COV_NF_LINE
+ }
+ } else {
+ throw new BrotliRuntimeException("Invalid backward reference"); // COV_NF_LINE
+ }
+ s.runningState = MAIN_LOOP;
+ continue;
+
+ case READ_METADATA:
+ while (s.metaBlockLength > 0) {
+ BitReader.readMoreInput(s);
+ // Optimize
+ BitReader.fillBitWindow(s);
+ BitReader.readFewBits(s, 8);
+ s.metaBlockLength--;
+ }
+ s.runningState = BLOCK_START;
+ continue;
+
+
+ case COPY_UNCOMPRESSED:
+ copyUncompressedData(s);
+ continue;
+
+ case INIT_WRITE:
+ s.ringBufferBytesReady = Math.min(s.pos, s.ringBufferSize);
+ s.runningState = WRITE;
+ // fall through
+ case WRITE:
+ if (writeRingBuffer(s) == 0) {
+ // Output buffer is full.
+ return;
+ }
+ if (s.pos >= s.maxBackwardDistance) {
+ s.maxDistance = s.maxBackwardDistance;
+ }
+ // Wrap the ringBuffer.
+ if (s.pos >= s.ringBufferSize) {
+ if (s.pos > s.ringBufferSize) {
+ Utils.copyBytesWithin(ringBuffer, 0, s.ringBufferSize, s.pos);
+ }
+ s.pos &= ringBufferMask;
+ s.ringBufferBytesWritten = 0;
+ }
+ s.runningState = s.nextRunningState;
+ continue;
+
+ default:
+ throw new BrotliRuntimeException("Unexpected state " + s.runningState);
+ }
+ }
+ if (s.runningState == FINISHED) {
+ if (s.metaBlockLength < 0) {
+ throw new BrotliRuntimeException("Invalid metablock length");
+ }
+ BitReader.jumpToByteBoundary(s);
+ BitReader.checkHealth(s, 1);
+ }
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/DecodeTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/DecodeTest.java
new file mode 100644
index 000000000..a0c2784b9
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/DecodeTest.java
@@ -0,0 +1,160 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+import static org.junit.Assert.assertArrayEquals;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for {@link Decode}.
+ */
+@RunWith(JUnit4.class)
+public class DecodeTest {
+
+ static byte[] readUniBytes(String uniBytes) {
+ byte[] result = new byte[uniBytes.length()];
+ for (int i = 0; i < result.length; ++i) {
+ result[i] = (byte) uniBytes.charAt(i);
+ }
+ return result;
+ }
+
+ private byte[] decompress(byte[] data, boolean byByte) throws IOException {
+ byte[] buffer = new byte[65536];
+ ByteArrayInputStream input = new ByteArrayInputStream(data);
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ BrotliInputStream brotliInput = new BrotliInputStream(input);
+ if (byByte) {
+ byte[] oneByte = new byte[1];
+ while (true) {
+ int next = brotliInput.read();
+ if (next == -1) {
+ break;
+ }
+ oneByte[0] = (byte) next;
+ output.write(oneByte, 0, 1);
+ }
+ } else {
+ while (true) {
+ int len = brotliInput.read(buffer, 0, buffer.length);
+ if (len <= 0) {
+ break;
+ }
+ output.write(buffer, 0, len);
+ }
+ }
+ brotliInput.close();
+ return output.toByteArray();
+ }
+
+ private void checkDecodeResource(String expected, String compressed) throws IOException {
+ byte[] expectedBytes = readUniBytes(expected);
+ byte[] compressedBytes = readUniBytes(compressed);
+ byte[] actual = decompress(compressedBytes, false);
+ assertArrayEquals(expectedBytes, actual);
+ byte[] actualByByte = decompress(compressedBytes, true);
+ assertArrayEquals(expectedBytes, actualByByte);
+ }
+
+ @Test
+ public void testEmpty() throws IOException {
+ checkDecodeResource(
+ "",
+ "\u0006");
+ }
+
+ @Test
+ public void testX() throws IOException {
+ checkDecodeResource(
+ "X",
+ "\u000B\u0000\u0080X\u0003");
+ }
+
+ @Test
+ public void testX10Y10() throws IOException {
+ checkDecodeResource(
+ "XXXXXXXXXXYYYYYYYYYY",
+ "\u001B\u0013\u0000\u0000\u00A4\u00B0\u00B2\u00EA\u0081G\u0002\u008A");
+ }
+
+ @Test
+ public void testX64() throws IOException {
+ checkDecodeResource(
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+ "\u001B\u003F\u0000\u0000$\u00B0\u00E2\u0099\u0080\u0012");
+ }
+
+ @Test
+ public void testUkkonooa() throws IOException {
+ checkDecodeResource(
+ "ukko nooa, ukko nooa oli kunnon mies, kun han meni saunaan, "
+ + "pisti laukun naulaan, ukko nooa, ukko nooa oli kunnon mies.",
+ "\u001Bv\u0000\u0000\u0014J\u00AC\u009Bz\u00BD\u00E1\u0097\u009D\u007F\u008E\u00C2\u0082"
+ + "6\u000E\u009C\u00E0\u0090\u0003\u00F7\u008B\u009E8\u00E6\u00B6\u0000\u00AB\u00C3\u00CA"
+ + "\u00A0\u00C2\u00DAf6\u00DC\u00CD\u0080\u008D.!\u00D7n\u00E3\u00EAL\u00B8\u00F0\u00D2"
+ + "\u00B8\u00C7\u00C2pM:\u00F0i~\u00A1\u00B8Es\u00AB\u00C4W\u001E");
+ }
+
+ @Test
+ public void testMonkey() throws IOException {
+ checkDecodeResource(
+ "znxcvnmz,xvnm.,zxcnv.,xcn.z,vn.zvn.zxcvn.,zxcn.vn.v,znm.,vnzx.,vnzxc.vn.z,vnz.,nv.z,nvmz"
+ + "xc,nvzxcvcnm.,vczxvnzxcnvmxc.zmcnvzm.,nvmc,nzxmc,vn.mnnmzxc,vnxcnmv,znvzxcnmv,.xcnvm,zxc"
+ + "nzxv.zx,qweryweurqioweupropqwutioweupqrioweutiopweuriopweuriopqwurioputiopqwuriowuqeriou"
+ + "pqweropuweropqwurweuqriopuropqwuriopuqwriopuqweopruioqweurqweuriouqweopruioupqiytioqtyio"
+ + "wtyqptypryoqweutioioqtweqruowqeytiowquiourowetyoqwupiotweuqiorweuqroipituqwiorqwtioweuri"
+ + "ouytuioerytuioweryuitoweytuiweyuityeruirtyuqriqweuropqweiruioqweurioqwuerioqwyuituierwot"
+ + "ueryuiotweyrtuiwertyioweryrueioqptyioruyiopqwtjkasdfhlafhlasdhfjklashjkfhasjklfhklasjdfh"
+ + "klasdhfjkalsdhfklasdhjkflahsjdkfhklasfhjkasdfhasfjkasdhfklsdhalghhaf;hdklasfhjklashjklfa"
+ + "sdhfasdjklfhsdjklafsd;hkldadfjjklasdhfjasddfjklfhakjklasdjfkl;asdjfasfljasdfhjklasdfhjka"
+ + "ghjkashf;djfklasdjfkljasdklfjklasdjfkljasdfkljaklfj",
+ "\u001BJ\u0003\u0000\u008C\u0094n\u00DE\u00B4\u00D7\u0096\u00B1x\u0086\u00F2-\u00E1\u001A"
+ + "\u00BC\u000B\u001C\u00BA\u00A9\u00C7\u00F7\u00CCn\u00B2B4QD\u008BN\u0013\b\u00A0\u00CDn"
+ + "\u00E8,\u00A5S\u00A1\u009C],\u001D#\u001A\u00D2V\u00BE\u00DB\u00EB&\u00BA\u0003e|\u0096j"
+ + "\u00A2v\u00EC\u00EF\u0087G3\u00D6\'\u000Ec\u0095\u00E2\u001D\u008D,\u00C5\u00D1(\u009F`"
+ + "\u0094o\u0002\u008B\u00DD\u00AAd\u0094,\u001E;e|\u0007EZ\u00B2\u00E2\u00FCI\u0081,\u009F"
+ + "@\u00AE\u00EFh\u0081\u00AC\u0016z\u000F\u00F5;m\u001C\u00B9\u001E-_\u00D5\u00C8\u00AF^"
+ + "\u0085\u00AA\u0005\u00BESu\u00C2\u00B0\"\u008A\u0015\u00C6\u00A3\u00B1\u00E6B\u0014"
+ + "\u00F4\u0084TS\u0019_\u00BE\u00C3\u00F2\u001D\u00D1\u00B7\u00E5\u00DD\u00B6\u00D9#\u00C6"
+ + "\u00F6\u009F\u009E\u00F6Me0\u00FB\u00C0qE\u0004\u00AD\u0003\u00B5\u00BE\u00C9\u00CB"
+ + "\u00FD\u00E2PZFt\u0004\r\u00FF \u0004w\u00B2m\'\u00BFG\u00A9\u009D\u001B\u0096,b\u0090#"
+ + "\u008B\u00E0\u00F8\u001D\u00CF\u00AF\u001D=\u00EE\u008A\u00C8u#f\u00DD\u00DE\u00D6m"
+ + "\u00E3*\u0082\u008Ax\u008A\u00DB\u00E6 L\u00B7\\c\u00BA0\u00E3?\u00B6\u00EE\u008C\""
+ + "\u00A2*\u00B0\"\n\u0099\u00FF=bQ\u00EE\b\u00F6=J\u00E4\u00CC\u00EF\"\u0087\u0011\u00E2"
+ + "\u0083(\u00E4\u00F5\u008F5\u0019c[\u00E1Z\u0092s\u00DD\u00A1P\u009D8\\\u00EB\u00B5\u0003"
+ + "jd\u0090\u0094\u00C8\u008D\u00FB/\u008A\u0086\"\u00CC\u001D\u0087\u00E0H\n\u0096w\u00909"
+ + "\u00C6##H\u00FB\u0011GV\u00CA \u00E3B\u0081\u00F7w2\u00C1\u00A5\\@!e\u0017@)\u0017\u0017"
+ + "lV2\u00988\u0006\u00DC\u0099M3)\u00BB\u0002\u00DFL&\u0093l\u0017\u0082\u0086 \u00D7"
+ + "\u0003y}\u009A\u0000\u00D7\u0087\u0000\u00E7\u000Bf\u00E3Lfqg\b2\u00F9\b>\u00813\u00CD"
+ + "\u0017r1\u00F0\u00B8\u0094RK\u00901\u008Eh\u00C1\u00EF\u0090\u00C9\u00E5\u00F2a\tr%"
+ + "\u00AD\u00EC\u00C5b\u00C0\u000B\u0012\u0005\u00F7\u0091u\r\u00EEa..\u0019\t\u00C2\u0003"
+ );
+ }
+
+ @Test
+ public void testFox() throws IOException {
+ checkDecodeResource(
+ "The quick brown fox jumps over the lazy dog",
+ "\u001B*\u0000\u0000\u0004\u0004\u00BAF:\u0085\u0003\u00E9\u00FA\f\u0091\u0002H\u0011,"
+ + "\u00F3\u008A:\u00A3V\u007F\u001A\u00AE\u00BF\u00A4\u00AB\u008EM\u00BF\u00ED\u00E2\u0004K"
+ + "\u0091\u00FF\u0087\u00E9\u001E");
+ }
+
+ @Test
+ public void testUtils() {
+ new Context();
+ new Decode();
+ new Dictionary();
+ new Huffman();
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Dictionary.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Dictionary.java
new file mode 100644
index 000000000..a6867b7d4
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Dictionary.java
@@ -0,0 +1,54 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Collection of static dictionary words.
+ *
+ * <p>Dictionary content is loaded from binary resource when {@link #getData()} is executed for the
+ * first time. Consequently, it saves memory and CPU in case dictionary is not required.
+ *
+ * <p>One possible drawback is that multiple threads that need dictionary data may be blocked (only
+ * once in each classworld). To avoid this, it is enough to call {@link #getData()} proactively.
+ */
+public final class Dictionary {
+ private static volatile ByteBuffer data;
+
+ private static class DataLoader {
+ static final boolean OK;
+
+ static {
+ boolean ok = true;
+ try {
+ Class.forName(Dictionary.class.getPackage().getName() + ".DictionaryData");
+ } catch (Throwable ex) {
+ ok = false;
+ }
+ OK = ok;
+ }
+ }
+
+ public static void setData(ByteBuffer data) {
+ if (!data.isDirect() || !data.isReadOnly()) {
+ throw new BrotliRuntimeException("data must be a direct read-only byte buffer");
+ }
+ Dictionary.data = data;
+ }
+
+ public static ByteBuffer getData() {
+ if (data != null) {
+ return data;
+ }
+ if (!DataLoader.OK) {
+ throw new BrotliRuntimeException("brotli dictionary is not set");
+ }
+ /* Might have been set when {@link DictionaryData} was loaded.*/
+ return data;
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/DictionaryData.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/DictionaryData.java
new file mode 100644
index 000000000..f969df35f
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/DictionaryData.java
@@ -0,0 +1,51 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Built-in dictionary data.
+ *
+ * When this class is loaded, it sets its data: {@link Dictionary#setData(ByteBuffer)}.
+ */
+final class DictionaryData {
+ private static final String DATA0 = "timedownlifeleftbackcodedatashowonlysitecityopenjustlikefreeworktextyearoverbodyloveformbookplaylivelinehelphomesidemorewordlongthemviewfindpagedaysfullheadtermeachareafromtruemarkableuponhighdatelandnewsevennextcasebothpostusedmadehandherewhatnameLinkblogsizebaseheldmakemainuser') +holdendswithNewsreadweresigntakehavegameseencallpathwellplusmenufilmpartjointhislistgoodneedwayswestjobsmindalsologorichuseslastteamarmyfoodkingwilleastwardbestfirePageknowaway.pngmovethanloadgiveselfnotemuchfeedmanyrockicononcelookhidediedHomerulehostajaxinfoclublawslesshalfsomesuchzone100%onescareTimeracebluefourweekfacehopegavehardlostwhenparkkeptpassshiproomHTMLplanTypedonesavekeepflaglinksoldfivetookratetownjumpthusdarkcardfilefearstaykillthatfallautoever.comtalkshopvotedeepmoderestturnbornbandfellroseurl(skinrolecomeactsagesmeetgold.jpgitemvaryfeltthensenddropViewcopy1.0\"</a>stopelseliestourpack.gifpastcss?graymean&gt;rideshotlatesaidroadvar feeljohnrickportfast'UA-dead</b>poorbilltypeU.S.woodmust2px;Inforankwidewantwalllead[0];paulwavesure$('#waitmassarmsgoesgainlangpaid!-- lockunitrootwalkfirmwifexml\"songtest20pxkindrowstoolfontmailsafestarmapscorerainflowbabyspansays4px;6px;artsfootrealwikiheatsteptriporg/lakeweaktoldFormcastfansbankveryrunsjulytask1px;goalgrewslowedgeid=\"sets5px;.js?40pxif (soonseatnonetubezerosentreedfactintogiftharm18pxcamehillboldzoomvoideasyringfillpeakinitcost3px;jacktagsbitsrolleditknewnear<!--growJSONdutyNamesaleyou lotspainjazzcoldeyesfishwww.risktabsprev10pxrise25pxBlueding300,ballfordearnwildbox.fairlackverspairjunetechif(!pickevil$(\"#warmlorddoespull,000ideadrawhugespotfundburnhrefcellkeystickhourlossfuel12pxsuitdealRSS\"agedgreyGET\"easeaimsgirlaids8px;navygridtips#999warsladycars); }php?helltallwhomzh:e*/\r\n 100hall.\n\nA7px;pushchat0px;crew*/</hash75pxflatrare && tellcampontolaidmissskiptentfinemalegetsplot400,\r\n\r\ncoolfeet.php<br>ericmostguidbelldeschairmathatom/img&#82luckcent000;tinygonehtmlselldrugFREEnodenick?id=losenullvastwindRSS wearrelybeensamedukenasacapewishgulfT23:hitsslotgatekickblurthey15px''););\">msiewinsbirdsortbetaseekT18:ordstreemall60pxfarmb\u0000\u0019sboys[0].');\"POSTbearkids);}}marytend(UK)quadzh:f-siz----prop');\rliftT19:viceandydebt>RSSpoolneckblowT16:doorevalT17:letsfailoralpollnovacolsgene b\u0000\u0014softrometillross<h3>pourfadepink<tr>mini)|!(minezh:hbarshear00);milk -->ironfreddiskwentsoilputs/js/holyT22:ISBNT20:adamsees<h2>json', 'contT21: RSSloopasiamoon</p>soulLINEfortcartT14:<h1>80px!--<9px;T04:mike:46ZniceinchYorkricezh:d'));puremageparatonebond:37Z_of_']);000,zh:gtankyardbowlbush:56ZJava30px\n|}\n%C3%:34ZjeffEXPIcashvisagolfsnowzh:iquer.csssickmeatmin.binddellhirepicsrent:36ZHTTP-201fotowolfEND xbox:54ZBODYdick;\n}\nexit:35Zvarsbeat'});diet999;anne}}</[i].LangkmB2wiretoysaddssealalex;\n\t}echonine.org005)tonyjewssandlegsroof000) 200winegeardogsbootgarycutstyletemption.xmlcockgang$('.50pxPh.Dmiscalanloandeskmileryanunixdisc);}\ndustclip).\n\n70px-200DVDs7]><tapedemoi++)wageeurophiloptsholeFAQsasin-26TlabspetsURL bulkcook;}\r\nHEAD[0])abbrjuan(198leshtwin</i>sonyguysfuckpipe|-\n!002)ndow[1];[];\nLog salt\r\n\t\tbangtrimbath){\r\n00px\n});ko:lfeesad>\rs:// [];tollplug(){\n{\r\n .js'200pdualboat.JPG);\n}quot);\n\n');\n\r\n}\r201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037201320122011201020092008200720062005200420032002200120001999199819971996199519941993199219911990198919881987198619851984198319821981198019791978197719761975197419731972197119701969196819671966196519641963196219611960195919581957195619551954195319521951195010001024139400009999comomC!sesteestaperotodohacecadaaC1obiendC-aasC-vidacasootroforosolootracualdijosidograntipotemadebealgoquC)estonadatrespococasabajotodasinoaguapuesunosantediceluisellamayozonaamorpisoobraclicellodioshoracasiP7P0P=P0P>P<Q\u0000P0Q\u0000Q\u0003Q\u0002P0P=P5P?P>P>Q\u0002P8P7P=P>P4P>Q\u0002P>P6P5P>P=P8Q\u0005P\u001DP0P5P5P1Q\u000BP<Q\u000BP\u0012Q\u000BQ\u0001P>P2Q\u000BP2P>P\u001DP>P>P1P\u001FP>P;P8P=P8P P$P\u001DP5P\u001CQ\u000BQ\u0002Q\u000BP\u001EP=P8P<P4P0P\u0017P0P\u0014P0P\u001DQ\u0003P\u001EP1Q\u0002P5P\u0018P7P5P9P=Q\u0003P<P<P\"Q\u000BQ\u0003P6Y\u0001Y\nX#Y\u0006Y\u0005X'Y\u0005X9Y\u0003Y\u0004X#Y\u0008X1X/Y\nX'Y\u0001Y\tY\u0007Y\u0008Y\u0004Y\u0005Y\u0004Y\u0003X'Y\u0008Y\u0004Y\u0007X(X3X'Y\u0004X%Y\u0006Y\u0007Y\nX#Y\nY\u0002X/Y\u0007Y\u0004X+Y\u0005X(Y\u0007Y\u0004Y\u0008Y\u0004Y\nX(Y\u0004X'Y\nX(Y\u0003X4Y\nX'Y\u0005X#Y\u0005Y\u0006X*X(Y\nY\u0004Y\u0006X-X(Y\u0007Y\u0005Y\u0005X4Y\u0008X4firstvideolightworldmediawhitecloseblackrightsmallbooksplacemusicfieldorderpointvalueleveltableboardhousegroupworksyearsstatetodaywaterstartstyledeathpowerphonenighterrorinputabouttermstitletoolseventlocaltimeslargewordsgamesshortspacefocusclearmodelblockguideradiosharewomenagainmoneyimagenamesyounglineslatercolorgreenfront&amp;watchforcepricerulesbeginaftervisitissueareasbelowindextotalhourslabelprintpressbuiltlinksspeedstudytradefoundsenseundershownformsrangeaddedstillmovedtakenaboveflashfixedoftenotherviewschecklegalriveritemsquickshapehumanexistgoingmoviethirdbasicpeacestagewidthloginideaswrotepagesusersdrivestorebreaksouthvoicesitesmonthwherebuildwhichearthforumthreesportpartyClicklowerlivesclasslayerentrystoryusagesoundcourtyour birthpopuptypesapplyImagebeinguppernoteseveryshowsmeansextramatchtrackknownearlybegansuperpapernorthlearngivennamedendedTermspartsGroupbrandusingwomanfalsereadyaudiotakeswhile.com/livedcasesdailychildgreatjudgethoseunitsneverbroadcoastcoverapplefilescyclesceneplansclickwritequeenpieceemailframeolderphotolimitcachecivilscaleenterthemetheretouchboundroyalaskedwholesincestock namefaithheartemptyofferscopeownedmightalbumthinkbloodarraymajortrustcanonunioncountvalidstoneStyleLoginhappyoccurleft:freshquitefilmsgradeneedsurbanfightbasishoverauto;route.htmlmixedfinalYour slidetopicbrownalonedrawnsplitreachRightdatesmarchquotegoodsLinksdoubtasyncthumballowchiefyouthnovel10px;serveuntilhandsCheckSpacequeryjamesequaltwice0,000Startpanelsongsroundeightshiftworthpostsleadsweeksavoidthesemilesplanesmartalphaplantmarksratesplaysclaimsalestextsstarswrong</h3>thing.org/multiheardPowerstandtokensolid(thisbringshipsstafftriedcallsfullyfactsagentThis //-->adminegyptEvent15px;Emailtrue\"crossspentblogsbox\">notedleavechinasizesguest</h4>robotheavytrue,sevengrandcrimesignsawaredancephase><!--en_US&#39;200px_namelatinenjoyajax.ationsmithU.S. holdspeterindianav\">chainscorecomesdoingpriorShare1990sromanlistsjapanfallstrialowneragree</h2>abusealertopera\"-//WcardshillsteamsPhototruthclean.php?saintmetallouismeantproofbriefrow\">genretrucklooksValueFrame.net/-->\n<try {\nvar makescostsplainadultquesttrainlaborhelpscausemagicmotortheir250pxleaststepsCountcouldglasssidesfundshotelawardmouthmovesparisgivesdutchtexasfruitnull,||[];top\">\n<!--POST\"ocean<br/>floorspeakdepth sizebankscatchchart20px;aligndealswould50px;url=\"parksmouseMost ...</amongbrainbody none;basedcarrydraftreferpage_home.meterdelaydreamprovejoint</tr>drugs<!-- aprilidealallenexactforthcodeslogicView seemsblankports (200saved_linkgoalsgrantgreekhomesringsrated30px;whoseparse();\" Blocklinuxjonespixel');\">);if(-leftdavidhorseFocusraiseboxesTrackement</em>bar\">.src=toweralt=\"cablehenry24px;setupitalysharpminortastewantsthis.resetwheelgirls/css/100%;clubsstuffbiblevotes 1000korea});\r\nbandsqueue= {};80px;cking{\r\n\t\taheadclockirishlike ratiostatsForm\"yahoo)[0];Aboutfinds</h1>debugtasksURL =cells})();12px;primetellsturns0x600.jpg\"spainbeachtaxesmicroangel--></giftssteve-linkbody.});\n\tmount (199FAQ</rogerfrankClass28px;feeds<h1><scotttests22px;drink) || lewisshall#039; for lovedwaste00px;ja:c\u0002simon<fontreplymeetsuntercheaptightBrand) != dressclipsroomsonkeymobilmain.Name platefunnytreescom/\"1.jpgwmodeparamSTARTleft idden, 201);\n}\nform.viruschairtransworstPagesitionpatch<!--\no-cacfirmstours,000 asiani++){adobe')[0]id=10both;menu .2.mi.png\"kevincoachChildbruce2.jpgURL)+.jpg|suitesliceharry120\" sweettr>\r\nname=diegopage swiss-->\n\n#fff;\">Log.com\"treatsheet) && 14px;sleepntentfiledja:c\u0003id=\"cName\"worseshots-box-delta\n&lt;bears:48Z<data-rural</a> spendbakershops= \"\";php\">ction13px;brianhellosize=o=%2F joinmaybe<img img\">, fjsimg\" \")[0]MTopBType\"newlyDanskczechtrailknows</h5>faq\">zh-cn10);\n-1\");type=bluestrulydavis.js';>\r\n<!steel you h2>\r\nform jesus100% menu.\r\n\t\r\nwalesrisksumentddingb-likteachgif\" vegasdanskeestishqipsuomisobredesdeentretodospuedeaC1osestC!tienehastaotrospartedondenuevohacerformamismomejormundoaquC-dC-assC3loayudafechatodastantomenosdatosotrassitiomuchoahoralugarmayorestoshorastenerantesfotosestaspaC-snuevasaludforosmedioquienmesespoderchileserC!vecesdecirjosC)estarventagrupohechoellostengoamigocosasnivelgentemismaairesjuliotemashaciafavorjuniolibrepuntobuenoautorabrilbuenatextomarzosaberlistaluegocC3moenerojuegoperC:haberestoynuncamujervalorfueralibrogustaigualvotoscasosguC-apuedosomosavisousteddebennochebuscafaltaeurosseriedichocursoclavecasasleC3nplazolargoobrasvistaapoyojuntotratavistocrearcampohemoscincocargopisosordenhacenC!readiscopedrocercapuedapapelmenorC:tilclarojorgecalleponertardenadiemarcasigueellassiglocochemotosmadreclaserestoniC1oquedapasarbancohijosviajepabloC)stevienereinodejarfondocanalnorteletracausatomarmanoslunesautosvillavendopesartipostengamarcollevapadreunidovamoszonasambosbandamariaabusomuchasubirriojavivirgradochicaallC-jovendichaestantalessalirsuelopesosfinesllamabuscoC)stalleganegroplazahumorpagarjuntadobleislasbolsabaC1ohablaluchaC\u0001readicenjugarnotasvalleallC!cargadolorabajoestC)gustomentemariofirmacostofichaplatahogarartesleyesaquelmuseobasespocosmitadcielochicomiedoganarsantoetapadebesplayaredessietecortecoreadudasdeseoviejodeseaaguas&quot;domaincommonstatuseventsmastersystemactionbannerremovescrollupdateglobalmediumfilternumberchangeresultpublicscreenchoosenormaltravelissuessourcetargetspringmodulemobileswitchphotosborderregionitselfsocialactivecolumnrecordfollowtitle>eitherlengthfamilyfriendlayoutauthorcreatereviewsummerserverplayedplayerexpandpolicyformatdoublepointsseriespersonlivingdesignmonthsforcesuniqueweightpeopleenergynaturesearchfigurehavingcustomoffsetletterwindowsubmitrendergroupsuploadhealthmethodvideosschoolfutureshadowdebatevaluesObjectothersrightsleaguechromesimplenoticesharedendingseasonreportonlinesquarebuttonimagesenablemovinglatestwinterFranceperiodstrongrepeatLondondetailformeddemandsecurepassedtoggleplacesdevicestaticcitiesstreamyellowattackstreetflighthiddeninfo\">openedusefulvalleycausesleadersecretseconddamagesportsexceptratingsignedthingseffectfieldsstatesofficevisualeditorvolumeReportmuseummoviesparentaccessmostlymother\" id=\"marketgroundchancesurveybeforesymbolmomentspeechmotioninsidematterCenterobjectexistsmiddleEuropegrowthlegacymannerenoughcareeransweroriginportalclientselectrandomclosedtopicscomingfatheroptionsimplyraisedescapechosenchurchdefinereasoncorneroutputmemoryiframepolicemodelsNumberduringoffersstyleskilledlistedcalledsilvermargindeletebetterbrowselimitsGlobalsinglewidgetcenterbudgetnowrapcreditclaimsenginesafetychoicespirit-stylespreadmakingneededrussiapleaseextentScriptbrokenallowschargedividefactormember-basedtheoryconfigaroundworkedhelpedChurchimpactshouldalwayslogo\" bottomlist\">){var prefixorangeHeader.push(couplegardenbridgelaunchReviewtakingvisionlittledatingButtonbeautythemesforgotSearchanchoralmostloadedChangereturnstringreloadMobileincomesupplySourceordersviewed&nbsp;courseAbout island<html cookiename=\"amazonmodernadvicein</a>: The dialoghousesBEGIN MexicostartscentreheightaddingIslandassetsEmpireSchooleffortdirectnearlymanualSelect.\n\nOnejoinedmenu\">PhilipawardshandleimportOfficeregardskillsnationSportsdegreeweekly (e.g.behinddoctorloggedunited</b></beginsplantsassistartistissued300px|canadaagencyschemeremainBrazilsamplelogo\">beyond-scaleacceptservedmarineFootercamera</h1>\n_form\"leavesstress\" />\r\n.gif\" onloadloaderOxfordsistersurvivlistenfemaleDesignsize=\"appealtext\">levelsthankshigherforcedanimalanyoneAfricaagreedrecentPeople<br />wonderpricesturned|| {};main\">inlinesundaywrap\">failedcensusminutebeaconquotes150px|estateremoteemail\"linkedright;signalformal1.htmlsignupprincefloat:.png\" forum.AccesspaperssoundsextendHeightsliderUTF-8\"&amp; Before. WithstudioownersmanageprofitjQueryannualparamsboughtfamousgooglelongeri++) {israelsayingdecidehome\">headerensurebranchpiecesblock;statedtop\"><racingresize--&gt;pacitysexualbureau.jpg\" 10,000obtaintitlesamount, Inc.comedymenu\" lyricstoday.indeedcounty_logo.FamilylookedMarketlse ifPlayerturkey);var forestgivingerrorsDomain}else{insertBlog</footerlogin.fasteragents<body 10px 0pragmafridayjuniordollarplacedcoversplugin5,000 page\">boston.test(avatartested_countforumsschemaindex,filledsharesreaderalert(appearSubmitline\">body\">\n* TheThoughseeingjerseyNews</verifyexpertinjurywidth=CookieSTART across_imagethreadnativepocketbox\">\nSystem DavidcancertablesprovedApril reallydriveritem\">more\">boardscolorscampusfirst || [];media.guitarfinishwidth:showedOther .php\" assumelayerswilsonstoresreliefswedenCustomeasily your String\n\nWhiltaylorclear:resortfrenchthough\") + \"<body>buyingbrandsMembername\">oppingsector5px;\">vspacepostermajor coffeemartinmaturehappen</nav>kansaslink\">Images=falsewhile hspace0&amp; \n\nIn powerPolski-colorjordanBottomStart -count2.htmlnews\">01.jpgOnline-rightmillerseniorISBN 00,000 guidesvalue)ectionrepair.xml\" rights.html-blockregExp:hoverwithinvirginphones</tr>\rusing \n\tvar >');\n\t</td>\n</tr>\nbahasabrasilgalegomagyarpolskisrpskiX1X/Y\u0008d8-f\u0016\u0007g.\u0000d=\u0013g9\u0001i+\u0014d?!f\u0001/d8-e\u001B=f\u0008\u0011d;,d8\u0000d8*e\u0005,e\u000F8g.!g\u0010\u0006h.:e\u001D\u001Be\u000F/d;%f\u001C\re\n!f\u00176i\u00174d8*d::d:'e\u0013\u0001h\u0007*e71d<\u0001d8\u001Af\u001F%g\u001C\u000Be7%d=\u001Ch\u0001\u0014g3;f2!f\u001C\tg=\u0011g+\u0019f\t\u0000f\u001C\th/\u0004h.:d8-e?\u0003f\u0016\u0007g+ g\u0014(f\u00087i&\u0016i!5d=\u001Ch\u0000\u0005f\n\u0000f\u001C/i\u0017.i\"\u0018g\u001B8e\u00053d8\u000Bh==f\u0010\u001Cg4\"d=?g\u0014(h=/d;6e\u001C(g:?d8;i\"\u0018h5\u0004f\u0016\u0019h'\u0006i\"\u0011e\u001B\u001Ee$\rf3(e\u0006\u000Cg=\u0011g;\u001Cf\u00146h\u0017\u000Fe\u0006\u0005e.9f\u000E(h\r\u0010e8\u0002e\u001C:f6\u0008f\u0001/g):i\u00174e\u000F\u0011e8\u0003d;\u0000d9\u0008e%=e\u000F\u000Bg\u0014\u001Ff4;e\u001B>g\t\u0007e\u000F\u0011e1\u0015e&\u0002f\u001E\u001Cf\t\u000Bf\u001C:f\u00160i\u0017;f\u001C\u0000f\u00160f\u00169e<\u000Fe\u000C\u0017d:,f\u000F\u0010d>\u001Be\u00053d:\u000Ef\u001B4e$\u001Ah?\u0019d8*g3;g;\u001Fg\u001F%i\u0001\u0013f88f\u0008\u000Fe9?e\u0011\ne\u00056d;\u0016e\u000F\u0011h!(e.\te\u0005(g,,d8\u0000d<\u001Ae\u0011\u0018h?\u001Bh!\u000Cg\u00029e\u0007;g\t\u0008f\u001D\u0003g\u00145e-\u0010d8\u0016g\u0015\u000Ch.>h.!e\u0005\rh49f\u0015\u0019h\u00022e\n e\u0005%f4;e\n(d;\u0016d;,e\u0015\u0006e\u0013\u0001e\r\u001Ae.\"g\u000E0e\u001C(d8\nf57e&\u0002d=\u0015e72g;\u000Fg\u0015\u0019h(\u0000h/&g;\u0006g$>e\u000C:g\u0019;e=\u0015f\u001C,g+\u0019i\u001C\u0000h&\u0001d;7f <f\u0014/f\u000C\u0001e\u001B=i\u0019\u0005i\u0013>f\u000E%e\u001B=e.6e;:h.>f\u001C\u000Be\u000F\u000Bi\u0018\u0005h/;f3\u0015e>\u000Bd=\rg=.g;\u000Ff5\u000Ei\u0000\tf\u000B)h?\u0019f 7e=\u0013e\t\re\u0008\u0006g1;f\u000E\u0012h!\u000Ce\u001B d8:d:$f\u0018\u0013f\u001C\u0000e\u0010\u000Ei\u001F3d9\u0010d8\rh\u0003=i\u0000\u001Ah?\u0007h!\u000Cd8\u001Ag'\u0011f\n\u0000e\u000F/h\u0003=h.>e$\u0007e\u0010\u0008d=\u001Ce$'e.6g$>d<\u001Ag \u0014g)6d8\u0013d8\u001Ae\u0005(i\u0003(i!9g\u001B.h?\u0019i\u0007\u000Ch?\u0018f\u0018/e<\u0000e'\u000Bf\u0003\u0005e\u00065g\u00145h\u0004\u0011f\u0016\u0007d;6e\u0013\u0001g\t\u000Ce8.e\n)f\u0016\u0007e\u000C\u0016h5\u0004f:\u0010e$'e-&e-&d9 e\u001C0e\u001D\u0000f5\u000Fh'\u0008f\n\u0015h5\u0004e7%g(\u000Bh&\u0001f1\u0002f\u0000\u000Ed9\u0008f\u00176e\u0000\u0019e\n\u001Fh\u0003=d8;h&\u0001g\u001B.e\t\rh5\u0004h./e\u001F\u000Ee8\u0002f\u00169f3\u0015g\u00145e=1f\u000B\u001Bh\u0001\u0018e#0f\u0018\u000Ed;;d=\u0015e\u0001%e:7f\u00150f\r.g>\u000Ee\u001B=f1=h=&d;\u000Bg;\rd=\u0006f\u0018/d:$f5\u0001g\u0014\u001Fd:'f\t\u0000d;%g\u00145h/\u001Df\u0018>g$:d8\u0000d:\u001Be\r\u0015d=\rd::e\u0011\u0018e\u0008\u0006f\u001E\u0010e\u001C0e\u001B>f\u0017\u0005f88e7%e\u00057e-&g\u0014\u001Fg3;e\u0008\u0017g=\u0011e\u000F\u000Be8\u0016e-\u0010e/\u0006g \u0001i\"\u0011i\u0001\u0013f\u000E'e\u00086e\u001C0e\u000C:e\u001F:f\u001C,e\u0005(e\u001B=g=\u0011d8\ni\u0007\rh&\u0001g,,d:\u000Ce\u0016\u001Cf,\"h?\u001Be\u0005%e\u000F\u000Bf\u0003\u0005h?\u0019d:\u001Bh\u0000\u0003h/\u0015e\u000F\u0011g\u000E0e\u001F9h.-d;%d8\nf\u0014?e:\u001Cf\u0008\u0010d8:g\u000E/e\"\u0003i&\u0019f8/e\u0010\u000Cf\u00176e(1d9\u0010e\u000F\u0011i\u0000\u0001d8\u0000e.\u001Ae<\u0000e\u000F\u0011d=\u001Ce\u0013\u0001f \u0007e\u0007\u0006f,\"h?\u000Eh'#e\u00063e\u001C0f\u00169d8\u0000d8\u000Bd;%e\u000F\nh4#d;;f\u0008\u0016h\u0000\u0005e.\"f\u00087d;#h!(g'/e\u0008\u0006e%3d::f\u00150g \u0001i\u0014\u0000e\u0014.e\u0007:g\u000E0g&;g:?e:\u0014g\u0014(e\u0008\u0017h!(d8\re\u0010\u000Cg<\u0016h>\u0011g;\u001Fh.!f\u001F%h/\"d8\rh&\u0001f\u001C\te\u00053f\u001C:f\u001E\u0004e>\u0008e$\u001Af\u0012-f\u0014>g;\u0004g;\u0007f\u0014?g-\u0016g\u001B4f\u000E%h\u0003=e\n\u001Bf\u001D%f:\u0010f\u0019\u0002i\u0016\u0013g\u001C\u000Be\u00080g\u0003-i\u0017(e\u00053i\u0014.d8\u0013e\u000C:i\u001D\u001Ee88h\u000B1h/-g\u0019>e:&e8\u000Cf\u001C\u001Bg>\u000Ee%3f/\u0014h>\u0003g\u001F%h/\u0006h'\u0004e.\u001Ae;:h..i\u0003(i\u0017(f\u0004\u000Fh'\u0001g2>e=)f\u0017%f\u001C,f\u000F\u0010i+\u0018e\u000F\u0011h(\u0000f\u00169i\u001D\"e\u001F:i\u0007\u0011e$\u0004g\u0010\u0006f\u001D\u0003i\u0019\u0010e=1g\t\u0007i\u00136h!\u000Ch?\u0018f\u001C\te\u0008\u0006d:+g\t)e\u0013\u0001g;\u000Fh\u0010%f7;e\n d8\u0013e.6h?\u0019g'\rh/\u001Di\"\u0018h57f\u001D%d8\u001Ae\n!e\u0005,e\u0011\nh.0e=\u0015g.\u0000d;\u000Bh4(i\u0007\u000Fg\u00147d::e=1e\u0013\re<\u0015g\u0014(f\n%e\u0011\ni\u0003(e\u0008\u0006e?+i\u0000\u001Fe\u0012(h/\"f\u00176e0\u001Af3(f\u0004\u000Fg\u00143h/7e-&f !e:\u0014h/%e\u000E\u0006e\u000F2e\u000F*f\u0018/h?\u0014e\u001B\u001Eh4-d90e\u0010\rg'0d8:d:\u0006f\u0008\u0010e\n\u001Fh/4f\u0018\u000Ed>\u001Be:\u0014e-)e-\u0010d8\u0013i\"\u0018g(\u000Be:\u000Fd8\u0000h\u0008,f\u001C\u0003e\u0013!e\u000F*f\u001C\te\u00056e.\u0003d?\u001Df\n$h\u0000\u000Cd8\u0014d;\ne$)g*\u0017e\u000F#e\n(f\u0000\u0001g\n6f\u0000\u0001g\t9e\u0008+h.$d8:e?\u0005i!;f\u001B4f\u00160e0\u000Fh/4f\u0008\u0011e\u0000\u0011d=\u001Cd8:e*\u0012d=\u0013e\u000C\u0005f\u000B,i\u0002#d9\u0008d8\u0000f 7e\u001B=e\u0006\u0005f\u0018/e\u0010&f 9f\r.g\u00145h'\u0006e-&i\u0019\"e\u00057f\u001C\th?\u0007g(\u000Bg\u00141d:\u000Ed::f\t\re\u0007:f\u001D%d8\rh?\u0007f-#e\u001C(f\u0018\u000Ef\u0018\u001Ff\u0015\u0005d:\u000Be\u00053g3;f \u0007i\"\u0018e\u0015\u0006e\n!h>\u0013e\u0005%d8\u0000g\u001B4e\u001F:g!\u0000f\u0015\u0019e-&d:\u0006h'#e;:g-\u0011g;\u0013f\u001E\u001Ce\u0005(g\u0010\u0003i\u0000\u001Ag\u001F%h.!e\u0008\u0012e/9d:\u000Eh\t:f\u001C/g\u001B8e\u0006\u000Ce\u000F\u0011g\u0014\u001Fg\u001C\u001Fg\u001A\u0004e;:g+\u000Bg-\tg:'g1;e\u001E\u000Bg;\u000Fi*\u000Ce.\u001Eg\u000E0e\u00086d=\u001Cf\u001D%h\u0007*f \u0007g->d;%d8\u000Be\u000E\u001Fe\u0008\u001Bf\u0017 f3\u0015e\u00056d8-e\u0000\u000Bd::d8\u0000e\u0008\u0007f\u000C\u0007e\r\u0017e\u00053i\u0017-i\u001B\u0006e\u001B\"g,,d8\te\u00053f3(e\u001B f-$g\u0005'g\t\u0007f71e\u001C3e\u0015\u0006d8\u001Ae9?e7\u001Ef\u0017%f\u001C\u001Fi+\u0018g:'f\u001C\u0000h?\u0011g;<e\u0010\u0008h!(g$:d8\u0013h>\u0011h!\u000Cd8:d:$i\u0000\u001Ah/\u0004d;7h'\te>\u0017g2>e\r\u000Ee.6e:-e.\u000Cf\u0008\u0010f\u0004\u001Fh'\te.\th#\u0005e>\u0017e\u00080i\u0002.d;6e\u00086e:&i#\u001Fe\u0013\u0001h\u0019=g\u00046h=,h==f\n%d;7h.0h\u0000\u0005f\u00169f!\u0008h!\u000Cf\u0014?d::f0\u0011g\u0014(e\u0013\u0001d8\u001Ch%?f\u000F\u0010e\u0007:i\u0005\u0012e:\u0017g\u00046e\u0010\u000Ed;\u0018f,>g\u0003-g\u00029d;%e\t\re.\u000Ce\u0005(e\u000F\u0011e8\u0016h.>g=.i\"\u0006e/<e7%d8\u001Ae\u000C;i\u0019\"g\u001C\u000Bg\u001C\u000Bg;\u000Fe\u00058e\u000E\u001Fe\u001B e93e\u000F0e\u0010\u0004g'\re\"\u001Ee\n f\u001D\u0010f\u0016\u0019f\u00160e\"\u001Ed9\u000Be\u0010\u000Eh\u0001\u000Cd8\u001Af\u0015\u0008f\u001E\u001Cd;\ne94h.:f\u0016\u0007f\u0008\u0011e\u001B=e\u0011\nh/\tg\t\u0008d8;d?.f\u00149e\u000F\u0002d8\u000Ef\t\u0013e\r0e?+d9\u0010f\u001C:f\"0h'\u0002g\u00029e-\u0018e\u001C(g2>g%\u001Eh\u000E7e>\u0017e\u0008)g\u0014(g;'g;-d= d;,h?\u0019d9\u0008f(!e<\u000Fh/-h(\u0000h\u0003=e$\u001Fi\u001B\u0005h\u0019\u000Ef\u0013\rd=\u001Ci#\u000Ef <d8\u0000h57g'\u0011e-&d=\u0013h\u00022g\u001F-d?!f\u001D!d;6f2;g\u0016\u0017h?\u0010e\n(d:'d8\u001Ad<\u001Ah..e/<h\u0008*e\u0005\u0008g\u0014\u001Fh\u0001\u0014g\u001B\u001Fe\u000F/f\u0018/e\u0015\u000Fi!\u000Cg;\u0013f\u001E\u0004d=\u001Cg\u0014(h0\u0003f\u001F%h3\u0007f\u0016\u0019h\u0007*e\n(h4\u001Fh4#e\u0006\u001Cd8\u001Ah.?i\u0017.e.\u001Ef\u0016=f\u000E%e\u000F\u0017h.(h.:i\u0002#d8*e\u000F\ri&\u0008e\n e<:e%3f\u0000'h\u000C\u0003e\u001B4f\u001C\re\u000B\u0019d<\u0011i\u00172d;\nf\u0017%e.\"f\u001C\rh'\u0000g\u001C\u000Be\u000F\u0002e\n g\u001A\u0004h/\u001Dd8\u0000g\u00029d?\u001Dh/\u0001e\u001B>d9&f\u001C\tf\u0015\u0008f5\u000Bh/\u0015g';e\n(f\t\rh\u0003=e\u00063e.\u001Ah\u0002!g%(d8\rf\u0016-i\u001C\u0000f1\u0002d8\re>\u0017e\n\u001Ef3\u0015d9\u000Bi\u00174i\u0007\u0007g\u0014(h\u0010%i\u0014\u0000f\n\u0015h/\tg\u001B.f \u0007g\u00081f\u0003\u0005f\u0011\u0004e=1f\u001C\td:\u001Bh$\u0007h#=f\u0016\u0007e-&f\u001C:d<\u001Af\u00150e-\u0017h#\u0005d?.h4-g\t)e\u0006\u001Cf\u001D\u0011e\u0005(i\u001D\"g2>e\u0013\u0001e\u00056e.\u001Ed:\u000Bf\u0003\u0005f04e93f\u000F\u0010g$:d8\ne8\u0002h0\"h0\"f\u0019.i\u0000\u001Af\u0015\u0019e8\u0008d8\nd< g1;e\u0008+f-\u000Cf\u001B2f\u000B%f\u001C\te\u0008\u001Bf\u00160i\u0005\rd;6e\u000F*h&\u0001f\u00176d;#h3\u0007h(\nh>>e\u00080d::g\u0014\u001Fh.\"i\u0018\u0005h\u0000\u0001e8\u0008e1\u0015g$:e?\u0003g\u0010\u0006h44e-\u0010g62g+\u0019d8;i!\u000Ch\u0007*g\u00046g:'e\u0008+g.\u0000e\r\u0015f\u00149i\u001D)i\u0002#d:\u001Bf\u001D%h/4f\t\u0013e<\u0000d;#g \u0001e\u0008 i\u0019$h/\u0001e\u00088h\n\u0002g\u001B.i\u0007\rg\u00029f,!f\u00158e$\u001Ae0\u0011h'\u0004e\u0008\u0012h5\u0004i\u0007\u0011f\t>e\u00080d;%e\u0010\u000Ee$'e\u0005(d8;i!5f\u001C\u0000d=3e\u001B\u001Eg-\u0014e$)d8\u000Bd?\u001Di\u001A\u001Cg\u000E0d;#f#\u0000f\u001F%f\n\u0015g%(e0\u000Ff\u00176f2\u0012f\u001C\tf-#e88g\u0014\u001Ah\u00073d;#g\u0010\u0006g\u001B.e=\u0015e\u0005,e<\u0000e$\re\u00086i\u0007\u0011h\u001E\re98g&\u000Fg\t\u0008f\u001C,e=\"f\u0008\u0010e\u0007\u0006e$\u0007h!\u000Cf\u0003\u0005e\u001B\u001Ee\u00080f\u0000\u001Df\u00033f\u0000\u000Ef 7e\r\u000Fh..h.$h/\u0001f\u001C\u0000e%=d:'g\u0014\u001Ff\u000C\tg\u0005'f\u001C\rh#\u0005e9?d8\u001Ce\n(f<+i\u0007\u0007h4-f\u00160f\t\u000Bg;\u0004e\u001B>i\u001D\"f\u001D?e\u000F\u0002h\u0000\u0003f\u0014?f2;e.9f\u0018\u0013e$)e\u001C0e\n*e\n\u001Bd::d;,e\r\u0007g:'i\u0000\u001Fe:&d::g\t)h0\u0003f\u00154f5\u0001h!\u000Ci\u0000 f\u0008\u0010f\u0016\u0007e-\u0017i\u001F)e\u001B=h48f\u0018\u0013e<\u0000e1\u0015g\u001B8i\u0017\u001Ch!(g\u000E0e=1h'\u0006e&\u0002f-$g>\u000Ee.9e$'e0\u000Ff\n%i\u0001\u0013f\u001D!f,>e?\u0003f\u0003\u0005h.8e$\u001Af3\u0015h'\u0004e.6e1\u0005d9&e:\u0017h?\u001Ef\u000E%g+\u000Be\r3d8>f\n%f\n\u0000e7'e%%h?\u0010g\u0019;e\u0005%d;%f\u001D%g\u0010\u0006h.:d:\u000Bd;6h\u0007*g\u00141d8-e\r\u000Ee\n\u001Ee\u0005,e&\u0008e&\u0008g\u001C\u001Ff-#d8\ri\u0014\u0019e\u0005(f\u0016\u0007e\u0010\u0008e\u0010\u000Cd;7e\u0000<e\u0008+d::g\u001B\u0011g\u001D#e\u00057d=\u0013d8\u0016g:*e\u001B\"i\u0018\u001Fe\u0008\u001Bd8\u001Af\t?f\u000B\u0005e\"\u001Ei\u0015?f\u001C\td::d?\u001Df\u000C\u0001e\u0015\u0006e.6g;4d?.e\u000F0f9>e7&e\u000F3h\u0002!d;=g-\u0014f!\u0008e.\u001Ei\u0019\u0005g\u00145d?!g;\u000Fg\u0010\u0006g\u0014\u001Fe\u0011=e.#d< d;;e\n!f-#e<\u000Fg\t9h\t2d8\u000Bf\u001D%e\r\u000Fd<\u001Ae\u000F*h\u0003=e=\u0013g\u00046i\u0007\rf\u00160e\u0005'e.9f\u000C\u0007e/<h?\u0010h!\u000Cf\u0017%e?\u0017h3#e.6h6\u0005h?\u0007e\u001C\u001Fe\u001C0f5\u0019f1\u001Ff\u0014/d;\u0018f\u000E(e\u0007:g+\u0019i\u0015?f\u001D-e7\u001Ef\t'h!\u000Ce\u00086i\u0000 d9\u000Bd8\u0000f\u000E(e9?g\u000E0e\u001C:f\u000F\u000Fh?0e\u000F\u0018e\u000C\u0016d< g;\u001Ff-\u000Cf\t\u000Bd?\u001Di\u0019)h/>g(\u000Be\u000C;g\u0016\u0017g;\u000Fh?\u0007h?\u0007e\u000E;d9\u000Be\t\rf\u00146e\u0005%e94e:&f\u001D\u0002e?\u0017g>\u000Ed8=f\u001C\u0000i+\u0018g\u0019;i\u0019\u0006f\u001C*f\u001D%e\n e7%e\u0005\rh4#f\u0015\u0019g(\u000Bg\t\u0008e\u001D\u0017h:+d=\u0013i\u0007\re:\u0006e\u0007:e\u0014.f\u0008\u0010f\u001C,e=\"e<\u000Fe\u001C\u001Fh1\u0006e\u0007:e\u00039d8\u001Cf\u00169i\u0002.g.1e\r\u0017d:,f1\u0002h\u0001\u000Ce\u000F\u0016e>\u0017h\u0001\u000Cd=\rg\u001B8d?!i!5i\u001D\"e\u0008\u0006i\u0012\u001Fg=\u0011i!5g!.e.\u001Ae\u001B>d>\u000Bg=\u0011e\u001D\u0000g'/f\u001E\u0001i\u0014\u0019h//g\u001B.g\u001A\u0004e.\u001Dh4\u001Df\u001C:e\u00053i#\u000Ei\u0019)f\u000E\u0008f\u001D\u0003g\u0017\u0005f/\u0012e. g\t)i\u0019$d:\u0006h)\u0015h+\u0016g\u0016>g\u0017\u0005e\u000F\nf\u00176f1\u0002h4-g+\u0019g\u00029e\u0004?g+%f/\u000Fe$)d8-e$.h.$h/\u0006f/\u000Fd8*e$)f4%e-\u0017d=\u0013e\u000F0g\u0001#g;4f\n$f\u001C,i!5d8*f\u0000'e.\u0018f\u00169e88h'\u0001g\u001B8f\u001C:f\u0008\u0018g\u0015%e:\u0014e=\u0013e>\u000Be8\u0008f\u00169d>?f !e\u001B-h\u0002!e8\u0002f\u0008?e1\u000Bf \u000Fg\u001B.e\u0011\u0018e7%e/<h\u00074g*\u0001g\u00046i\u0001\u0013e\u00057f\u001C,g=\u0011g;\u0013e\u0010\u0008f!#f!\u0008e\n3e\n(e\u000F&e$\u0016g>\u000Ee\u0005\u0003e<\u0015h57f\u00149e\u000F\u0018g,,e\u001B\u001Bd<\u001Ah.!h**f\u0018\u000Ei\u001A\u0010g'\u0001e.\u001De.\u001Dh'\u0004h\u000C\u0003f6\u0008h49e\u00051e\u0010\u000Ce?\u0018h.0d=\u0013g3;e8&f\u001D%e\u0010\re-\u0017g\u0019<h!(e<\u0000f\u0014>e\n g\u001B\u001Fe\u000F\u0017e\u00080d:\u000Cf\t\u000Be$'i\u0007\u000Ff\u0008\u0010d::f\u00150i\u0007\u000Fe\u00051d:+e\u000C:e\u001F\u001Fe%3e-)e\u000E\u001Fe\u0008\u0019f\t\u0000e\u001C(g;\u0013f\u001D\u001Fi\u0000\u001Ad?!h6\u0005g:'i\u0005\rg=.e=\u0013f\u00176d<\u0018g'\u0000f\u0000'f\u0004\u001Ff\u0008?d:'i\u0001\nf\u00082e\u0007:e\u000F#f\u000F\u0010d:$e01d8\u001Ad?\u001De\u0001%g(\u000Be:&e\u000F\u0002f\u00150d:\u000Bd8\u001Af\u00154d8*e11d8\u001Cf\u0003\u0005f\u0004\u001Fg\t9f.\ne\u0008\u0006i!\u001Ef\u0010\u001Ce0\u000Be1\u001Ed:\u000Ei\u0017(f\u00087h4\"e\n!e#0i\u001F3e\u000F\ne\u00056h4\"g;\u000Fe\u001D\u001Af\u000C\u0001e92i\u0003(f\u0008\u0010g+\u000Be\u0008)g\u001B\nh\u0000\u0003h\u0019\u0011f\u0008\u0010i\u0003=e\u000C\u0005h#\u0005g\u0014(f\u00086f/\u0014h5\u001Bf\u0016\u0007f\u0018\u000Ef\u000B\u001Be\u0015\u0006e.\u000Cf\u00154g\u001C\u001Ff\u0018/g\u001C<g\u001D\u001Bd<\u0019d<4e(\u0001f\u001C\u001Bi\"\u0006e\u001F\u001Fe\r+g\u0014\u001Fd<\u0018f\u0003 h+\u0016e#\u0007e\u0005,e\u00051h\t/e%=e\u0005\u0005e\u0008\u0006g,&e\u0010\u0008i\u0019\u0004d;6g\t9g\u00029d8\re\u000F/h\u000B1f\u0016\u0007h5\u0004d:'f 9f\u001C,f\u0018\u000Ef\u0018>e/\u0006g\"<e\u0005,d<\u0017f0\u0011f\u0017\u000Ff\u001B4e\n d:+e\u000F\u0017e\u0010\u000Ce-&e\u0010/e\n(i\u0000\u0002e\u0010\u0008e\u000E\u001Ff\u001D%i\u0017.g-\u0014f\u001C,f\u0016\u0007g>\u000Ei#\u001Fg;?h\t2g(3e.\u001Ag;\u0008d:\u000Eg\u0014\u001Fg\t)d>\u001Bf1\u0002f\u0010\u001Cg\u000B\u0010e\n\u001Bi\u0007\u000Fd8%i\u0007\rf08h?\u001Ce\u0006\u0019g\u001C\u001Ff\u001C\ti\u0019\u0010g+\u001Ed:\te/9h1!h49g\u0014(d8\re%=g;\u001De/9e\r\u0001e\u0008\u0006d?\u0003h?\u001Bg\u00029h/\u0004e=1i\u001F3d<\u0018e\n?d8\re0\u0011f,#h5\u000Fe96d8\u0014f\u001C\tg\u00029f\u00169e\u0010\u0011e\u0005(f\u00160d?!g\u0014(h.>f\u0016=e=\"h1!h5\u0004f <g*\u0001g 4i\u001A\u000Fg\u001D\u0000i\u0007\re$'d:\u000Ef\u0018/f/\u0015d8\u001Af\u0019:h\u0003=e\u000C\u0016e7%e.\u000Cg>\u000Ee\u0015\u0006e\u001F\u000Eg;\u001Fd8\u0000e\u0007:g\t\u0008f\t\u0013i\u0000 g\u0014\"e\u0013\u0001f&\u0002e\u00065g\u0014(d:\u000Ed?\u001Dg\u0015\u0019e\u001B g4 d8-e\u001C\u000Be-\u0018e\u0002(h44e\u001B>f\u001C\u0000f\u0004\u001Bi\u0015?f\u001C\u001Fe\u000F#d;7g\u0010\u0006h4\"e\u001F:e\u001C0e.\tf\u000E\u0012f-&f1\ti\u0007\u000Ci\u001D\"e\u0008\u001Be;:e$)g):i&\u0016e\u0005\u0008e.\u000Ce\u0016\u0004i)1e\n(d8\u000Bi\u001D\"d8\re\u0006\rh/\u001Ad?!f\u0004\u000Fd9\ti\u00183e\u0005\th\u000B1e\u001B=f<\u0002d:.e\u0006\u001Bd:\u000Bg\u000E)e.6g>$d<\u0017e\u0006\u001Cf0\u0011e\r3e\u000F/e\u0010\rg(1e.6e\u00057e\n(g\u0014;f\u00033e\u00080f3(f\u0018\u000Ee0\u000Fe-&f\u0000'h\u0003=h\u0000\u0003g \u0014g!,d;6h'\u0002g\u001C\u000Bf8\u0005f%\u001Af\u0010\u001Eg,\u0011i&\u0016i \u0001i;\u0004i\u0007\u0011i\u0000\u0002g\u0014(f1\u001Fh\u000B\u000Fg\u001C\u001Fe.\u001Ed8;g.!i\u00186f.5h(;e\u0006\ng?;h/\u0011f\u001D\u0003e\u0008)e\u0001\u001Ae%=d<<d9\u000Ei\u0000\u001Ah./f\u0016=e7%g\u000B\u0000f\u0005\u000Bd9\u001Fh.8g\u000E/d?\u001De\u001F9e\u0005;f&\u0002e?5e$'e\u001E\u000Bf\u001C:g%(g\u0010\u0006h'#e\u000C?e\u0010\rcuandoenviarmadridbuscariniciotiempoporquecuentaestadopuedenjuegoscontraestC!nnombretienenperfilmaneraamigosciudadcentroaunquepuedesdentroprimerpreciosegC:nbuenosvolverpuntossemanahabC-aagostonuevosunidoscarlosequiponiC1osmuchosalgunacorreoimagenpartirarribamarC-ahombreempleoverdadcambiomuchasfueronpasadolC-neaparecenuevascursosestabaquierolibroscuantoaccesomiguelvarioscuatrotienesgruposserC!neuropamediosfrenteacercademC!sofertacochesmodeloitalialetrasalgC:ncompracualesexistecuerposiendoprensallegarviajesdineromurciapodrC!puestodiariopuebloquieremanuelpropiocrisisciertoseguromuertefuentecerrargrandeefectopartesmedidapropiaofrecetierrae-mailvariasformasfuturoobjetoseguirriesgonormasmismosC:nicocaminositiosrazC3ndebidopruebatoledotenC-ajesC:sesperococinaorigentiendacientocC!dizhablarserC-alatinafuerzaestiloguerraentrarC)xitolC3pezagendavC-deoevitarpaginametrosjavierpadresfC!cilcabezaC!reassalidaenvC-ojapC3nabusosbienestextosllevarpuedanfuertecomC:nclaseshumanotenidobilbaounidadestC!seditarcreadoP4P;Q\u000FQ\u0007Q\u0002P>P:P0P:P8P;P8Q\rQ\u0002P>P2Q\u0001P5P5P3P>P?Q\u0000P8Q\u0002P0P:P5Q\tP5Q\u0003P6P5P\u001AP0P:P1P5P7P1Q\u000BP;P>P=P8P\u0012Q\u0001P5P?P>P4P-Q\u0002P>Q\u0002P>P<Q\u0007P5P<P=P5Q\u0002P;P5Q\u0002Q\u0000P0P7P>P=P0P3P4P5P<P=P5P\u0014P;Q\u000FP\u001FQ\u0000P8P=P0Q\u0001P=P8Q\u0005Q\u0002P5P<P:Q\u0002P>P3P>P4P2P>Q\u0002Q\u0002P0P<P!P(P\u0010P<P0Q\u000FP'Q\u0002P>P2P0Q\u0001P2P0P<P5P<Q\u0003P\"P0P:P4P2P0P=P0P<Q\rQ\u0002P8Q\rQ\u0002Q\u0003P\u0012P0P<Q\u0002P5Q\u0005P?Q\u0000P>Q\u0002Q\u0003Q\u0002P=P0P4P4P=Q\u000FP\u0012P>Q\u0002Q\u0002Q\u0000P8P=P5P9P\u0012P0Q\u0001P=P8P<Q\u0001P0P<Q\u0002P>Q\u0002Q\u0000Q\u0003P1P\u001EP=P8P<P8Q\u0000P=P5P5P\u001EP\u001EP\u001EP;P8Q\u0006Q\rQ\u0002P0P\u001EP=P0P=P5P<P4P>P<P<P>P9P4P2P5P>P=P>Q\u0001Q\u0003P4`$\u0015`%\u0007`$9`%\u0008`$\u0015`%\u0000`$8`%\u0007`$\u0015`$>`$\u0015`%\u000B`$\u0014`$0`$*`$0`$(`%\u0007`$\u000F`$\u0015`$\u0015`$?`$-`%\u0000`$\u0007`$8`$\u0015`$0`$$`%\u000B`$9`%\u000B`$\u0006`$*`$9`%\u0000`$/`$9`$/`$>`$$`$\u0015`$%`$>jagran`$\u0006`$\u001C`$\u001C`%\u000B`$\u0005`$,`$&`%\u000B`$\u0017`$\u0008`$\u001C`$>`$\u0017`$\u000F`$9`$.`$\u0007`$(`$5`$9`$/`%\u0007`$%`%\u0007`$%`%\u0000`$\u0018`$0`$\u001C`$,`$&`%\u0000`$\u0015`$\u0008`$\u001C`%\u0000`$5`%\u0007`$(`$\u0008`$(`$\u000F`$9`$0`$\t`$8`$.`%\u0007`$\u0015`$.`$5`%\u000B`$2`%\u0007`$8`$,`$.`$\u0008`$&`%\u0007`$\u0013`$0`$\u0006`$.`$,`$8`$-`$0`$,`$(`$\u001A`$2`$.`$(`$\u0006`$\u0017`$8`%\u0000`$2`%\u0000X9Y\u0004Y\tX%Y\u0004Y\tY\u0007X0X'X\"X.X1X9X/X/X'Y\u0004Y\tY\u0007X0Y\u0007X5Y\u0008X1X:Y\nX1Y\u0003X'Y\u0006Y\u0008Y\u0004X'X(Y\nY\u0006X9X1X6X0Y\u0004Y\u0003Y\u0007Y\u0006X'Y\nY\u0008Y\u0005Y\u0002X'Y\u0004X9Y\u0004Y\nX'Y\u0006X'Y\u0004Y\u0003Y\u0006X-X*Y\tY\u0002X(Y\u0004Y\u0008X-X)X'X.X1Y\u0001Y\u0002X7X9X(X/X1Y\u0003Y\u0006X%X0X'Y\u0003Y\u0005X'X'X-X/X%Y\u0004X'Y\u0001Y\nY\u0007X(X9X6Y\u0003Y\nY\u0001X(X-X+Y\u0008Y\u0005Y\u0006Y\u0008Y\u0007Y\u0008X#Y\u0006X'X,X/X'Y\u0004Y\u0007X'X3Y\u0004Y\u0005X9Y\u0006X/Y\u0004Y\nX3X9X(X1X5Y\u0004Y\tY\u0005Y\u0006X0X(Y\u0007X'X#Y\u0006Y\u0007Y\u0005X+Y\u0004Y\u0003Y\u0006X*X'Y\u0004X'X-Y\nX+Y\u0005X5X1X4X1X-X-Y\u0008Y\u0004Y\u0008Y\u0001Y\nX'X0X'Y\u0004Y\u0003Y\u0004Y\u0005X1X)X'Y\u0006X*X'Y\u0004Y\u0001X#X(Y\u0008X.X'X5X#Y\u0006X*X'Y\u0006Y\u0007X'Y\u0004Y\nX9X6Y\u0008Y\u0008Y\u0002X/X'X(Y\u0006X.Y\nX1X(Y\u0006X*Y\u0004Y\u0003Y\u0005X4X'X!Y\u0008Y\u0007Y\nX'X(Y\u0008Y\u0002X5X5Y\u0008Y\u0005X'X1Y\u0002Y\u0005X#X-X/Y\u0006X-Y\u0006X9X/Y\u0005X1X#Y\nX'X-X)Y\u0003X*X(X/Y\u0008Y\u0006Y\nX,X(Y\u0005Y\u0006Y\u0007X*X-X*X,Y\u0007X)X3Y\u0006X)Y\nX*Y\u0005Y\u0003X1X)X:X2X)Y\u0006Y\u0001X3X(Y\nX*Y\u0004Y\u0004Y\u0007Y\u0004Y\u0006X'X*Y\u0004Y\u0003Y\u0002Y\u0004X(Y\u0004Y\u0005X'X9Y\u0006Y\u0007X#Y\u0008Y\u0004X4Y\nX!Y\u0006Y\u0008X1X#Y\u0005X'Y\u0001Y\nY\u0003X(Y\u0003Y\u0004X0X'X*X1X*X(X(X#Y\u0006Y\u0007Y\u0005X3X'Y\u0006Y\u0003X(Y\nX9Y\u0001Y\u0002X/X-X3Y\u0006Y\u0004Y\u0007Y\u0005X4X9X1X#Y\u0007Y\u0004X4Y\u0007X1Y\u0002X7X1X7Y\u0004X(profileservicedefaulthimselfdetailscontentsupportstartedmessagesuccessfashion<title>countryaccountcreatedstoriesresultsrunningprocesswritingobjectsvisiblewelcomearticleunknownnetworkcompanydynamicbrowserprivacyproblemServicerespectdisplayrequestreservewebsitehistoryfriendsoptionsworkingversionmillionchannelwindow.addressvisitedweathercorrectproductedirectforwardyou canremovedsubjectcontrolarchivecurrentreadinglibrarylimitedmanagerfurthersummarymachineminutesprivatecontextprogramsocietynumberswrittenenabledtriggersourcesloadingelementpartnerfinallyperfectmeaningsystemskeepingculture&quot;,journalprojectsurfaces&quot;expiresreviewsbalanceEnglishContentthroughPlease opinioncontactaverageprimaryvillageSpanishgallerydeclinemeetingmissionpopularqualitymeasuregeneralspeciessessionsectionwriterscounterinitialreportsfiguresmembersholdingdisputeearlierexpressdigitalpictureAnothermarriedtrafficleadingchangedcentralvictoryimages/reasonsstudiesfeaturelistingmust beschoolsVersionusuallyepisodeplayinggrowingobviousoverlaypresentactions</ul>\r\nwrapperalreadycertainrealitystorageanotherdesktopofferedpatternunusualDigitalcapitalWebsitefailureconnectreducedAndroiddecadesregular &amp; animalsreleaseAutomatgettingmethodsnothingPopularcaptionletterscapturesciencelicensechangesEngland=1&amp;History = new CentralupdatedSpecialNetworkrequirecommentwarningCollegetoolbarremainsbecauseelectedDeutschfinanceworkersquicklybetweenexactlysettingdiseaseSocietyweaponsexhibit&lt;!--Controlclassescoveredoutlineattacksdevices(windowpurposetitle=\"Mobile killingshowingItaliandroppedheavilyeffects-1']);\nconfirmCurrentadvancesharingopeningdrawingbillionorderedGermanyrelated</form>includewhetherdefinedSciencecatalogArticlebuttonslargestuniformjourneysidebarChicagoholidayGeneralpassage,&quot;animatefeelingarrivedpassingnaturalroughly.\n\nThe but notdensityBritainChineselack oftributeIreland\" data-factorsreceivethat isLibraryhusbandin factaffairsCharlesradicalbroughtfindinglanding:lang=\"return leadersplannedpremiumpackageAmericaEdition]&quot;Messageneed tovalue=\"complexlookingstationbelievesmaller-mobilerecordswant tokind ofFirefoxyou aresimilarstudiedmaximumheadingrapidlyclimatekingdomemergedamountsfoundedpioneerformuladynastyhow to SupportrevenueeconomyResultsbrothersoldierlargelycalling.&quot;AccountEdward segmentRobert effortsPacificlearnedup withheight:we haveAngelesnations_searchappliedacquiremassivegranted: falsetreatedbiggestbenefitdrivingStudiesminimumperhapsmorningsellingis usedreversevariant role=\"missingachievepromotestudentsomeoneextremerestorebottom:evolvedall thesitemapenglishway to AugustsymbolsCompanymattersmusicalagainstserving})();\r\npaymenttroubleconceptcompareparentsplayersregionsmonitor ''The winningexploreadaptedGalleryproduceabilityenhancecareers). The collectSearch ancientexistedfooter handlerprintedconsoleEasternexportswindowsChannelillegalneutralsuggest_headersigning.html\">settledwesterncausing-webkitclaimedJusticechaptervictimsThomas mozillapromisepartieseditionoutside:false,hundredOlympic_buttonauthorsreachedchronicdemandssecondsprotectadoptedprepareneithergreatlygreateroverallimprovecommandspecialsearch.worshipfundingthoughthighestinsteadutilityquarterCulturetestingclearlyexposedBrowserliberal} catchProjectexamplehide();FloridaanswersallowedEmperordefenseseriousfreedomSeveral-buttonFurtherout of != nulltrainedDenmarkvoid(0)/all.jspreventRequestStephen\n\nWhen observe</h2>\r\nModern provide\" alt=\"borders.\n\nFor \n\nMany artistspoweredperformfictiontype ofmedicalticketsopposedCouncilwitnessjusticeGeorge Belgium...</a>twitternotablywaitingwarfare Other rankingphrasesmentionsurvivescholar</p>\r\n Countryignoredloss ofjust asGeorgiastrange<head><stopped1']);\r\nislandsnotableborder:list ofcarried100,000</h3>\n severalbecomesselect wedding00.htmlmonarchoff theteacherhighly biologylife ofor evenrise of&raquo;plusonehunting(thoughDouglasjoiningcirclesFor theAncientVietnamvehiclesuch ascrystalvalue =Windowsenjoyeda smallassumed<a id=\"foreign All rihow theDisplayretiredhoweverhidden;battlesseekingcabinetwas notlook atconductget theJanuaryhappensturninga:hoverOnline French lackingtypicalextractenemieseven ifgeneratdecidedare not/searchbeliefs-image:locatedstatic.login\">convertviolententeredfirst\">circuitFinlandchemistshe was10px;\">as suchdivided</span>will beline ofa greatmystery/index.fallingdue to railwaycollegemonsterdescentit withnuclearJewish protestBritishflowerspredictreformsbutton who waslectureinstantsuicidegenericperiodsmarketsSocial fishingcombinegraphicwinners<br /><by the NaturalPrivacycookiesoutcomeresolveSwedishbrieflyPersianso muchCenturydepictscolumnshousingscriptsnext tobearingmappingrevisedjQuery(-width:title\">tooltipSectiondesignsTurkishyounger.match(})();\n\nburningoperatedegreessource=Richardcloselyplasticentries</tr>\r\ncolor:#ul id=\"possessrollingphysicsfailingexecutecontestlink toDefault<br />\n: true,chartertourismclassicproceedexplain</h1>\r\nonline.?xml vehelpingdiamonduse theairlineend -->).attr(readershosting#ffffffrealizeVincentsignals src=\"/ProductdespitediversetellingPublic held inJoseph theatreaffects<style>a largedoesn'tlater, ElementfaviconcreatorHungaryAirportsee theso thatMichaelSystemsPrograms, and width=e&quot;tradingleft\">\npersonsGolden Affairsgrammarformingdestroyidea ofcase ofoldest this is.src = cartoonregistrCommonsMuslimsWhat isin manymarkingrevealsIndeed,equally/show_aoutdoorescape(Austriageneticsystem,In the sittingHe alsoIslandsAcademy\n\t\t<!--Daniel bindingblock\">imposedutilizeAbraham(except{width:putting).html(|| [];\nDATA[ *kitchenmountedactual dialectmainly _blank'installexpertsif(typeIt also&copy; \">Termsborn inOptionseasterntalkingconcerngained ongoingjustifycriticsfactoryits ownassaultinvitedlastinghis ownhref=\"/\" rel=\"developconcertdiagramdollarsclusterphp?id=alcohol);})();using a><span>vesselsrevivalAddressamateurandroidallegedillnesswalkingcentersqualifymatchesunifiedextinctDefensedied in\n\t<!-- customslinkingLittle Book ofeveningmin.js?are thekontakttoday's.html\" target=wearingAll Rig;\n})();raising Also, crucialabout\">declare-->\n<scfirefoxas muchappliesindex, s, but type = \n\r\n<!--towardsRecordsPrivateForeignPremierchoicesVirtualreturnsCommentPoweredinline;povertychamberLiving volumesAnthonylogin\" RelatedEconomyreachescuttinggravitylife inChapter-shadowNotable</td>\r\n returnstadiumwidgetsvaryingtravelsheld bywho arework infacultyangularwho hadairporttown of\n\nSome 'click'chargeskeywordit willcity of(this);Andrew unique checkedor more300px; return;rsion=\"pluginswithin herselfStationFederalventurepublishsent totensionactresscome tofingersDuke ofpeople,exploitwhat isharmonya major\":\"httpin his menu\">\nmonthlyofficercouncilgainingeven inSummarydate ofloyaltyfitnessand wasemperorsupremeSecond hearingRussianlongestAlbertalateralset of small\">.appenddo withfederalbank ofbeneathDespiteCapitalgrounds), and percentit fromclosingcontainInsteadfifteenas well.yahoo.respondfighterobscurereflectorganic= Math.editingonline paddinga wholeonerroryear ofend of barrierwhen itheader home ofresumedrenamedstrong>heatingretainscloudfrway of March 1knowingin partBetweenlessonsclosestvirtuallinks\">crossedEND -->famous awardedLicenseHealth fairly wealthyminimalAfricancompetelabel\">singingfarmersBrasil)discussreplaceGregoryfont copursuedappearsmake uproundedboth ofblockedsaw theofficescoloursif(docuwhen heenforcepush(fuAugust UTF-8\">Fantasyin mostinjuredUsuallyfarmingclosureobject defenceuse of Medical<body>\nevidentbe usedkeyCodesixteenIslamic#000000entire widely active (typeofone cancolor =speakerextendsPhysicsterrain<tbody>funeralviewingmiddle cricketprophetshifteddoctorsRussell targetcompactalgebrasocial-bulk ofman and</td>\n he left).val()false);logicalbankinghome tonaming Arizonacredits);\n});\nfounderin turnCollinsbefore But thechargedTitle\">CaptainspelledgoddessTag -->Adding:but wasRecent patientback in=false&Lincolnwe knowCounterJudaismscript altered']);\n has theunclearEvent',both innot all\n\n<!-- placinghard to centersort ofclientsstreetsBernardassertstend tofantasydown inharbourFreedomjewelry/about..searchlegendsis mademodern only ononly toimage\" linear painterand notrarely acronymdelivershorter00&amp;as manywidth=\"/* <![Ctitle =of the lowest picked escapeduses ofpeoples PublicMatthewtacticsdamagedway forlaws ofeasy to windowstrong simple}catch(seventhinfoboxwent topaintedcitizenI don'tretreat. Some ww.\");\nbombingmailto:made in. Many carries||{};wiwork ofsynonymdefeatsfavoredopticalpageTraunless sendingleft\"><comScorAll thejQuery.touristClassicfalse\" Wilhelmsuburbsgenuinebishops.split(global followsbody ofnominalContactsecularleft tochiefly-hidden-banner</li>\n\n. When in bothdismissExplorealways via thespaC1olwelfareruling arrangecaptainhis sonrule ofhe tookitself,=0&amp;(calledsamplesto makecom/pagMartin Kennedyacceptsfull ofhandledBesides//--></able totargetsessencehim to its by common.mineralto takeways tos.org/ladvisedpenaltysimple:if theyLettersa shortHerbertstrikes groups.lengthflightsoverlapslowly lesser social </p>\n\t\tit intoranked rate oful>\r\n attemptpair ofmake itKontaktAntoniohaving ratings activestreamstrapped\").css(hostilelead tolittle groups,Picture-->\r\n\r\n rows=\" objectinverse<footerCustomV><\\/scrsolvingChamberslaverywoundedwhereas!= 'undfor allpartly -right:Arabianbacked centuryunit ofmobile-Europe,is homerisk ofdesiredClintoncost ofage of become none ofp&quot;Middle ead')[0Criticsstudios>&copy;group\">assemblmaking pressedwidget.ps:\" ? rebuiltby someFormer editorsdelayedCanonichad thepushingclass=\"but arepartialBabylonbottom carrierCommandits useAs withcoursesa thirddenotesalso inHouston20px;\">accuseddouble goal ofFamous ).bind(priests Onlinein Julyst + \"gconsultdecimalhelpfulrevivedis veryr'+'iptlosing femalesis alsostringsdays ofarrivalfuture <objectforcingString(\" />\n\t\there isencoded. The balloondone by/commonbgcolorlaw of Indianaavoidedbut the2px 3pxjquery.after apolicy.men andfooter-= true;for usescreen.Indian image =family,http:// &nbsp;driverseternalsame asnoticedviewers})();\n is moreseasonsformer the newis justconsent Searchwas thewhy theshippedbr><br>width: height=made ofcuisineis thata very Admiral fixed;normal MissionPress, ontariocharsettry to invaded=\"true\"spacingis mosta more totallyfall of});\r\n immensetime inset outsatisfyto finddown tolot of Playersin Junequantumnot thetime todistantFinnishsrc = (single help ofGerman law andlabeledforestscookingspace\">header-well asStanleybridges/globalCroatia About [0];\n it, andgroupedbeing a){throwhe madelighterethicalFFFFFF\"bottom\"like a employslive inas seenprintermost ofub-linkrejectsand useimage\">succeedfeedingNuclearinformato helpWomen'sNeitherMexicanprotein<table by manyhealthylawsuitdevised.push({sellerssimply Through.cookie Image(older\">us.js\"> Since universlarger open to!-- endlies in']);\r\n marketwho is (\"DOMComanagedone fortypeof Kingdomprofitsproposeto showcenter;made itdressedwere inmixtureprecisearisingsrc = 'make a securedBaptistvoting \n\t\tvar March 2grew upClimate.removeskilledway the</head>face ofacting right\">to workreduceshas haderectedshow();action=book ofan area== \"htt<header\n<html>conformfacing cookie.rely onhosted .customhe wentbut forspread Family a meansout theforums.footage\">MobilClements\" id=\"as highintense--><!--female is seenimpliedset thea stateand hisfastestbesidesbutton_bounded\"><img Infoboxevents,a youngand areNative cheaperTimeoutand hasengineswon the(mostlyright: find a -bottomPrince area ofmore ofsearch_nature,legallyperiod,land ofor withinducedprovingmissilelocallyAgainstthe wayk&quot;px;\">\r\npushed abandonnumeralCertainIn thismore inor somename isand, incrownedISBN 0-createsOctobermay notcenter late inDefenceenactedwish tobroadlycoolingonload=it. TherecoverMembersheight assumes<html>\npeople.in one =windowfooter_a good reklamaothers,to this_cookiepanel\">London,definescrushedbaptismcoastalstatus title\" move tolost inbetter impliesrivalryservers SystemPerhapses and contendflowinglasted rise inGenesisview ofrising seem tobut in backinghe willgiven agiving cities.flow of Later all butHighwayonly bysign ofhe doesdiffersbattery&amp;lasinglesthreatsintegertake onrefusedcalled =US&ampSee thenativesby thissystem.head of:hover,lesbiansurnameand allcommon/header__paramsHarvard/pixel.removalso longrole ofjointlyskyscraUnicodebr />\r\nAtlantanucleusCounty,purely count\">easily build aonclicka givenpointerh&quot;events else {\nditionsnow the, with man whoorg/Webone andcavalryHe diedseattle00,000 {windowhave toif(windand itssolely m&quot;renewedDetroitamongsteither them inSenatorUs</a><King ofFrancis-produche usedart andhim andused byscoringat hometo haverelatesibilityfactionBuffalolink\"><what hefree toCity ofcome insectorscountedone daynervoussquare };if(goin whatimg\" alis onlysearch/tuesdaylooselySolomonsexual - <a hrmedium\"DO NOT France,with a war andsecond take a >\r\n\r\n\r\nmarket.highwaydone inctivity\"last\">obligedrise to\"undefimade to Early praisedin its for hisathleteJupiterYahoo! termed so manyreally s. The a woman?value=direct right\" bicycleacing=\"day andstatingRather,higher Office are nowtimes, when a pay foron this-link\">;borderaround annual the Newput the.com\" takin toa brief(in thegroups.; widthenzymessimple in late{returntherapya pointbanninginks\">\n();\" rea place\\u003Caabout atr>\r\n\t\tccount gives a<SCRIPTRailwaythemes/toolboxById(\"xhumans,watchesin some if (wicoming formats Under but hashanded made bythan infear ofdenoted/iframeleft involtagein eacha&quot;base ofIn manyundergoregimesaction </p>\r\n<ustomVa;&gt;</importsor thatmostly &amp;re size=\"</a></ha classpassiveHost = WhetherfertileVarious=[];(fucameras/></td>acts asIn some>\r\n\r\n<!organis <br />BeijingcatalC deutscheuropeueuskaragaeilgesvenskaespaC1amensajeusuariotrabajomC)xicopC!ginasiempresistemaoctubreduranteaC1adirempresamomentonuestroprimeratravC)sgraciasnuestraprocesoestadoscalidadpersonanC:meroacuerdomC:sicamiembroofertasalgunospaC-sesejemploderechoademC!sprivadoagregarenlacesposiblehotelessevillaprimeroC:ltimoeventosarchivoculturamujeresentradaanuncioembargomercadograndesestudiomejoresfebrerodiseC1oturismocC3digoportadaespaciofamiliaantoniopermiteguardaralgunaspreciosalguiensentidovisitastC-tuloconocersegundoconsejofranciaminutossegundatenemosefectosmC!lagasesiC3nrevistagranadacompraringresogarcC-aacciC3necuadorquienesinclusodeberC!materiahombresmuestrapodrC-amaC1anaC:ltimaestamosoficialtambienningC:nsaludospodemosmejorarpositionbusinesshomepagesecuritylanguagestandardcampaignfeaturescategoryexternalchildrenreservedresearchexchangefavoritetemplatemilitaryindustryservicesmaterialproductsz-index:commentssoftwarecompletecalendarplatformarticlesrequiredmovementquestionbuildingpoliticspossiblereligionphysicalfeedbackregisterpicturesdisabledprotocolaudiencesettingsactivityelementslearninganythingabstractprogressoverviewmagazineeconomictrainingpressurevarious <strong>propertyshoppingtogetheradvancedbehaviordownloadfeaturedfootballselectedLanguagedistanceremembertrackingpasswordmodifiedstudentsdirectlyfightingnortherndatabasefestivalbreakinglocationinternetdropdownpracticeevidencefunctionmarriageresponseproblemsnegativeprogramsanalysisreleasedbanner\">purchasepoliciesregionalcreativeargumentbookmarkreferrerchemicaldivisioncallbackseparateprojectsconflicthardwareinterestdeliverymountainobtained= false;for(var acceptedcapacitycomputeridentityaircraftemployedproposeddomesticincludesprovidedhospitalverticalcollapseapproachpartnerslogo\"><adaughterauthor\" culturalfamilies/images/assemblypowerfulteachingfinisheddistrictcriticalcgi-bin/purposesrequireselectionbecomingprovidesacademicexerciseactuallymedicineconstantaccidentMagazinedocumentstartingbottom\">observed: &quot;extendedpreviousSoftwarecustomerdecisionstrengthdetailedslightlyplanningtextareacurrencyeveryonestraighttransferpositiveproducedheritageshippingabsolutereceivedrelevantbutton\" violenceanywherebenefitslaunchedrecentlyalliancefollowedmultiplebulletinincludedoccurredinternal$(this).republic><tr><tdcongressrecordedultimatesolution<ul id=\"discoverHome</a>websitesnetworksalthoughentirelymemorialmessagescontinueactive\">somewhatvictoriaWestern title=\"LocationcontractvisitorsDownloadwithout right\">\nmeasureswidth = variableinvolvedvirginianormallyhappenedaccountsstandingnationalRegisterpreparedcontrolsaccuratebirthdaystrategyofficialgraphicscriminalpossiblyconsumerPersonalspeakingvalidateachieved.jpg\" />machines</h2>\n keywordsfriendlybrotherscombinedoriginalcomposedexpectedadequatepakistanfollow\" valuable</label>relativebringingincreasegovernorplugins/List of Header\">\" name=\" (&quot;graduate</head>\ncommercemalaysiadirectormaintain;height:schedulechangingback to catholicpatternscolor: #greatestsuppliesreliable</ul>\n\t\t<select citizensclothingwatching<li id=\"specificcarryingsentence<center>contrastthinkingcatch(e)southernMichael merchantcarouselpadding:interior.split(\"lizationOctober ){returnimproved--&gt;\n\ncoveragechairman.png\" />subjectsRichard whateverprobablyrecoverybaseballjudgmentconnect..css\" /> websitereporteddefault\"/></a>\r\nelectricscotlandcreationquantity. ISBN 0did not instance-search-\" lang=\"speakersComputercontainsarchivesministerreactiondiscountItalianocriteriastrongly: 'http:'script'coveringofferingappearedBritish identifyFacebooknumerousvehiclesconcernsAmericanhandlingdiv id=\"William provider_contentaccuracysection andersonflexibleCategorylawrence<script>layout=\"approved maximumheader\"></table>Serviceshamiltoncurrent canadianchannels/themes//articleoptionalportugalvalue=\"\"intervalwirelessentitledagenciesSearch\" measuredthousandspending&hellip;new Date\" size=\"pageNamemiddle\" \" /></a>hidden\">sequencepersonaloverflowopinionsillinoislinks\">\n\t<title>versionssaturdayterminalitempropengineersectionsdesignerproposal=\"false\"EspaC1olreleasessubmit\" er&quot;additionsymptomsorientedresourceright\"><pleasurestationshistory.leaving border=contentscenter\">.\n\nSome directedsuitablebulgaria.show();designedGeneral conceptsExampleswilliamsOriginal\"><span>search\">operatorrequestsa &quot;allowingDocumentrevision. \n\nThe yourselfContact michiganEnglish columbiapriorityprintingdrinkingfacilityreturnedContent officersRussian generate-8859-1\"indicatefamiliar qualitymargin:0 contentviewportcontacts-title\">portable.length eligibleinvolvesatlanticonload=\"default.suppliedpaymentsglossary\n\nAfter guidance</td><tdencodingmiddle\">came to displaysscottishjonathanmajoritywidgets.clinicalthailandteachers<head>\n\taffectedsupportspointer;toString</small>oklahomawill be investor0\" alt=\"holidaysResourcelicensed (which . After considervisitingexplorerprimary search\" android\"quickly meetingsestimate;return ;color:# height=approval, &quot; checked.min.js\"magnetic></a></hforecast. While thursdaydvertise&eacute;hasClassevaluateorderingexistingpatients Online coloradoOptions\"campbell<!-- end</span><<br />\r\n_popups|sciences,&quot; quality Windows assignedheight: <b classle&quot; value=\" Companyexamples<iframe believespresentsmarshallpart of properly).\n\nThe taxonomymuch of </span>\n\" data-srtuguC*sscrollTo project<head>\r\nattorneyemphasissponsorsfancyboxworld's wildlifechecked=sessionsprogrammpx;font- Projectjournalsbelievedvacationthompsonlightingand the special border=0checking</tbody><button Completeclearfix\n<head>\narticle <sectionfindingsrole in popular Octoberwebsite exposureused to changesoperatedclickingenteringcommandsinformed numbers </div>creatingonSubmitmarylandcollegesanalyticlistingscontact.loggedInadvisorysiblingscontent\"s&quot;)s. This packagescheckboxsuggestspregnanttomorrowspacing=icon.pngjapanesecodebasebutton\">gamblingsuch as , while </span> missourisportingtop:1px .</span>tensionswidth=\"2lazyloadnovemberused in height=\"cript\">\n&nbsp;</<tr><td height:2/productcountry include footer\" &lt;!-- title\"></jquery.</form>\n(g.\u0000d=\u0013)(g9\u0001i+\u0014)hrvatskiitalianoromC\"nD\u0003tC<rkC'eX'X1X/Y\u0008tambiC)nnoticiasmensajespersonasderechosnacionalserviciocontactousuariosprogramagobiernoempresasanunciosvalenciacolombiadespuC)sdeportesproyectoproductopC:bliconosotroshistoriapresentemillonesmediantepreguntaanteriorrecursosproblemasantiagonuestrosopiniC3nimprimirmientrasamC)ricavendedorsociedadrespectorealizarregistropalabrasinterC)sentoncesespecialmiembrosrealidadcC3rdobazaragozapC!ginassocialesbloqueargestiC3nalquilersistemascienciascompletoversiC3ncompletaestudiospC:blicaobjetivoalicantebuscadorcantidadentradasaccionesarchivossuperiormayorC-aalemaniafunciC3nC:ltimoshaciendoaquellosediciC3nfernandoambientefacebooknuestrasclientesprocesosbastantepresentareportarcongresopublicarcomerciocontratojC3venesdistritotC)cnicaconjuntoenergC-atrabajarasturiasrecienteutilizarboletC-nsalvadorcorrectatrabajosprimerosnegocioslibertaddetallespantallaprC3ximoalmerC-aanimalesquiC)nescorazC3nsecciC3nbuscandoopcionesexteriorconceptotodavC-agalerC-aescribirmedicinalicenciaconsultaaspectoscrC-ticadC3laresjusticiadeberC!nperC-odonecesitamantenerpequeC1orecibidatribunaltenerifecanciC3ncanariasdescargadiversosmallorcarequieretC)cnicodeberC-aviviendafinanzasadelantefuncionaconsejosdifC-cilciudadesantiguasavanzadatC)rminounidadessC!nchezcampaC1asoftonicrevistascontienesectoresmomentosfacultadcrC)ditodiversassupuestofactoressegundospequeC1aP3P>P4P0P5Q\u0001P;P8P5Q\u0001Q\u0002Q\u000CP1Q\u000BP;P>P1Q\u000BQ\u0002Q\u000CQ\rQ\u0002P>P<P\u0015Q\u0001P;P8Q\u0002P>P3P>P<P5P=Q\u000FP2Q\u0001P5Q\u0005Q\rQ\u0002P>P9P4P0P6P5P1Q\u000BP;P8P3P>P4Q\u0003P4P5P=Q\u000CQ\rQ\u0002P>Q\u0002P1Q\u000BP;P0Q\u0001P5P1Q\u000FP>P4P8P=Q\u0001P5P1P5P=P0P4P>Q\u0001P0P9Q\u0002Q\u0004P>Q\u0002P>P=P5P3P>Q\u0001P2P>P8Q\u0001P2P>P9P8P3Q\u0000Q\u000BQ\u0002P>P6P5P2Q\u0001P5P<Q\u0001P2P>Q\u000EP;P8Q\u0008Q\u000CQ\rQ\u0002P8Q\u0005P?P>P:P0P4P=P5P9P4P>P<P0P<P8Q\u0000P0P;P8P1P>Q\u0002P5P<Q\u0003Q\u0005P>Q\u0002Q\u000FP4P2Q\u0003Q\u0005Q\u0001P5Q\u0002P8P;Q\u000EP4P8P4P5P;P>P<P8Q\u0000P5Q\u0002P5P1Q\u000FQ\u0001P2P>P5P2P8P4P5Q\u0007P5P3P>Q\rQ\u0002P8P<Q\u0001Q\u0007P5Q\u0002Q\u0002P5P<Q\u000BQ\u0006P5P=Q\u000BQ\u0001Q\u0002P0P;P2P5P4Q\u000CQ\u0002P5P<P5P2P>P4Q\u000BQ\u0002P5P1P5P2Q\u000BQ\u0008P5P=P0P<P8Q\u0002P8P?P0Q\u0002P>P<Q\u0003P?Q\u0000P0P2P;P8Q\u0006P0P>P4P=P0P3P>P4Q\u000BP7P=P0Q\u000EP<P>P3Q\u0003P4Q\u0000Q\u0003P3P2Q\u0001P5P9P8P4P5Q\u0002P:P8P=P>P>P4P=P>P4P5P;P0P4P5P;P5Q\u0001Q\u0000P>P:P8Q\u000EP=Q\u000FP2P5Q\u0001Q\u000CP\u0015Q\u0001Q\u0002Q\u000CQ\u0000P0P7P0P=P0Q\u0008P8X'Y\u0004Y\u0004Y\u0007X'Y\u0004X*Y\nX,Y\u0005Y\nX9X.X'X5X)X'Y\u0004X0Y\nX9Y\u0004Y\nY\u0007X,X/Y\nX/X'Y\u0004X\"Y\u0006X'Y\u0004X1X/X*X-Y\u0003Y\u0005X5Y\u0001X-X)Y\u0003X'Y\u0006X*X'Y\u0004Y\u0004Y\nY\nY\u0003Y\u0008Y\u0006X4X(Y\u0003X)Y\u0001Y\nY\u0007X'X(Y\u0006X'X*X-Y\u0008X'X!X#Y\u0003X+X1X.Y\u0004X'Y\u0004X'Y\u0004X-X(X/Y\u0004Y\nY\u0004X/X1Y\u0008X3X'X6X:X7X*Y\u0003Y\u0008Y\u0006Y\u0007Y\u0006X'Y\u0003X3X'X-X)Y\u0006X'X/Y\nX'Y\u0004X7X(X9Y\u0004Y\nY\u0003X4Y\u0003X1X'Y\nY\u0005Y\u0003Y\u0006Y\u0005Y\u0006Y\u0007X'X4X1Y\u0003X)X1X&Y\nX3Y\u0006X4Y\nX7Y\u0005X'X0X'X'Y\u0004Y\u0001Y\u0006X4X(X'X(X*X9X(X1X1X-Y\u0005X)Y\u0003X'Y\u0001X)Y\nY\u0002Y\u0008Y\u0004Y\u0005X1Y\u0003X2Y\u0003Y\u0004Y\u0005X)X#X-Y\u0005X/Y\u0002Y\u0004X(Y\nY\nX9Y\u0006Y\nX5Y\u0008X1X)X7X1Y\nY\u0002X4X'X1Y\u0003X,Y\u0008X'Y\u0004X#X.X1Y\tY\u0005X9Y\u0006X'X'X(X-X+X9X1Y\u0008X6X(X4Y\u0003Y\u0004Y\u0005X3X,Y\u0004X(Y\u0006X'Y\u0006X.X'Y\u0004X/Y\u0003X*X'X(Y\u0003Y\u0004Y\nX)X(X/Y\u0008Y\u0006X#Y\nX6X'Y\nY\u0008X,X/Y\u0001X1Y\nY\u0002Y\u0003X*X(X*X#Y\u0001X6Y\u0004Y\u0005X7X(X.X'Y\u0003X+X1X(X'X1Y\u0003X'Y\u0001X6Y\u0004X'X-Y\u0004Y\tY\u0006Y\u0001X3Y\u0007X#Y\nX'Y\u0005X1X/Y\u0008X/X#Y\u0006Y\u0007X'X/Y\nY\u0006X'X'Y\u0004X'Y\u0006Y\u0005X9X1X6X*X9Y\u0004Y\u0005X/X'X.Y\u0004Y\u0005Y\u0005Y\u0003Y\u0006\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u0000\u0004\u0000\u0004\u0000\u0004\u0000\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0007\u0006\u0005\u0004\u0003\u0002\u0001\u0000\u0008\t\n\u000B\u000C\r\u000E\u000F\u000F\u000E\r\u000C\u000B\n\t\u0008\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0017\u0016\u0015\u0014\u0013\u0012\u0011\u0010\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u001F\u001E\u001D\u001C\u001B\u001A\u0019\u0018\u007F\u007F\u007F\u007F\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u007F\u007F\u007F\u007F\u0001\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u007F\u007F\u0000\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u007F\u007F\u0000\u0001\u0000\u0000\u0000\u0008\u0000\u0008\u0000\u0008\u0000\u0008\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0003\u0000\u0004\u0000\u0005\u0000\u0006\u0000\u0007resourcescountriesquestionsequipmentcommunityavailablehighlightDTD/xhtmlmarketingknowledgesomethingcontainerdirectionsubscribeadvertisecharacter\" value=\"</select>Australia\" class=\"situationauthorityfollowingprimarilyoperationchallengedevelopedanonymousfunction functionscompaniesstructureagreement\" title=\"potentialeducationargumentssecondarycopyrightlanguagesexclusivecondition</form>\r\nstatementattentionBiography} else {\nsolutionswhen the Analyticstemplatesdangeroussatellitedocumentspublisherimportantprototypeinfluence&raquo;</effectivegenerallytransformbeautifultransportorganizedpublishedprominentuntil thethumbnailNational .focus();over the migrationannouncedfooter\">\nexceptionless thanexpensiveformationframeworkterritoryndicationcurrentlyclassNamecriticismtraditionelsewhereAlexanderappointedmaterialsbroadcastmentionedaffiliate</option>treatmentdifferent/default.Presidentonclick=\"biographyotherwisepermanentFranC'aisHollywoodexpansionstandards</style>\nreductionDecember preferredCambridgeopponentsBusiness confusion>\n<title>presentedexplaineddoes not worldwideinterfacepositionsnewspaper</table>\nmountainslike the essentialfinancialselectionaction=\"/abandonedEducationparseInt(stabilityunable to</title>\nrelationsNote thatefficientperformedtwo yearsSince thethereforewrapper\">alternateincreasedBattle ofperceivedtrying tonecessaryportrayedelectionsElizabeth</iframe>discoveryinsurances.length;legendaryGeographycandidatecorporatesometimesservices.inherited</strong>CommunityreligiouslocationsCommitteebuildingsthe worldno longerbeginningreferencecannot befrequencytypicallyinto the relative;recordingpresidentinitiallytechniquethe otherit can beexistenceunderlinethis timetelephoneitemscopepracticesadvantage);return For otherprovidingdemocracyboth the extensivesufferingsupportedcomputers functionpracticalsaid thatit may beEnglish</from the scheduleddownloads</label>\nsuspectedmargin: 0spiritual</head>\n\nmicrosoftgraduallydiscussedhe becameexecutivejquery.jshouseholdconfirmedpurchasedliterallydestroyedup to thevariationremainingit is notcenturiesJapanese among thecompletedalgorithminterestsrebellionundefinedencourageresizableinvolvingsensitiveuniversalprovision(althoughfeaturingconducted), which continued-header\">February numerous overflow:componentfragmentsexcellentcolspan=\"technicalnear the Advanced source ofexpressedHong Kong Facebookmultiple mechanismelevationoffensive</form>\n\tsponsoreddocument.or &quot;there arethose whomovementsprocessesdifficultsubmittedrecommendconvincedpromoting\" width=\".replace(classicalcoalitionhis firstdecisionsassistantindicatedevolution-wrapper\"enough toalong thedelivered-->\r\n<!--American protectedNovember </style><furnitureInternet onblur=\"suspendedrecipientbased on Moreover,abolishedcollectedwere madeemotionalemergencynarrativeadvocatespx;bordercommitteddir=\"ltr\"employeesresearch. selectedsuccessorcustomersdisplayedSeptemberaddClass(Facebook suggestedand lateroperatingelaborateSometimesInstitutecertainlyinstalledfollowersJerusalemthey havecomputinggeneratedprovincesguaranteearbitraryrecognizewanted topx;width:theory ofbehaviourWhile theestimatedbegan to it becamemagnitudemust havemore thanDirectoryextensionsecretarynaturallyoccurringvariablesgiven theplatform.</label><failed tocompoundskinds of societiesalongside --&gt;\n\nsouthwestthe rightradiationmay have unescape(spoken in\" href=\"/programmeonly the come fromdirectoryburied ina similarthey were</font></Norwegianspecifiedproducingpassenger(new DatetemporaryfictionalAfter theequationsdownload.regularlydeveloperabove thelinked tophenomenaperiod oftooltip\">substanceautomaticaspect ofAmong theconnectedestimatesAir Forcesystem ofobjectiveimmediatemaking itpaintingsconqueredare stillproceduregrowth ofheaded byEuropean divisionsmoleculesfranchiseintentionattractedchildhoodalso useddedicatedsingaporedegree offather ofconflicts</a></p>\ncame fromwere usednote thatreceivingExecutiveeven moreaccess tocommanderPoliticalmusiciansdeliciousprisonersadvent ofUTF-8\" /><![CDATA[\">ContactSouthern bgcolor=\"series of. It was in Europepermittedvalidate.appearingofficialsseriously-languageinitiatedextendinglong-terminflationsuch thatgetCookiemarked by</button>implementbut it isincreasesdown the requiringdependent-->\n<!-- interviewWith the copies ofconsensuswas builtVenezuela(formerlythe statepersonnelstrategicfavour ofinventionWikipediacontinentvirtuallywhich wasprincipleComplete identicalshow thatprimitiveaway frommolecularpreciselydissolvedUnder theversion=\">&nbsp;</It is the This is will haveorganismssome timeFriedrichwas firstthe only fact thatform id=\"precedingTechnicalphysicistoccurs innavigatorsection\">span id=\"sought tobelow thesurviving}</style>his deathas in thecaused bypartiallyexisting using thewas givena list oflevels ofnotion ofOfficial dismissedscientistresemblesduplicateexplosiverecoveredall othergalleries{padding:people ofregion ofaddressesassociateimg alt=\"in modernshould bemethod ofreportingtimestampneeded tothe Greatregardingseemed toviewed asimpact onidea thatthe Worldheight ofexpandingThese arecurrent\">carefullymaintainscharge ofClassicaladdressedpredictedownership<div id=\"right\">\r\nresidenceleave thecontent\">are often })();\r\nprobably Professor-button\" respondedsays thathad to beplaced inHungarianstatus ofserves asUniversalexecutionaggregatefor whichinfectionagreed tohowever, popular\">placed onconstructelectoralsymbol ofincludingreturn toarchitectChristianprevious living ineasier toprofessor\n&lt;!-- effect ofanalyticswas takenwhere thetook overbelief inAfrikaansas far aspreventedwork witha special<fieldsetChristmasRetrieved\n\nIn the back intonortheastmagazines><strong>committeegoverninggroups ofstored inestablisha generalits firsttheir ownpopulatedan objectCaribbeanallow thedistrictswisconsinlocation.; width: inhabitedSocialistJanuary 1</footer>similarlychoice ofthe same specific business The first.length; desire todeal withsince theuserAgentconceivedindex.phpas &quot;engage inrecently,few yearswere also\n<head>\n<edited byare knowncities inaccesskeycondemnedalso haveservices,family ofSchool ofconvertednature of languageministers</object>there is a popularsequencesadvocatedThey wereany otherlocation=enter themuch morereflectedwas namedoriginal a typicalwhen theyengineerscould notresidentswednesdaythe third productsJanuary 2what theya certainreactionsprocessorafter histhe last contained\"></div>\n</a></td>depend onsearch\">\npieces ofcompetingReferencetennesseewhich has version=</span> <</header>gives thehistorianvalue=\"\">padding:0view thattogether,the most was foundsubset ofattack onchildren,points ofpersonal position:allegedlyClevelandwas laterand afterare givenwas stillscrollingdesign ofmakes themuch lessAmericans.\n\nAfter , but theMuseum oflouisiana(from theminnesotaparticlesa processDominicanvolume ofreturningdefensive00px|righmade frommouseover\" style=\"states of(which iscontinuesFranciscobuilding without awith somewho woulda form ofa part ofbefore itknown as Serviceslocation and oftenmeasuringand it ispaperbackvalues of\r\n<title>= window.determineer&quot; played byand early</center>from thisthe threepower andof &quot;innerHTML<a href=\"y:inline;Church ofthe eventvery highofficial -height: content=\"/cgi-bin/to createafrikaansesperantofranC'aislatvieE!ulietuviE3D\u000CeE!tinaD\reE!tina`9\u0004`8\u0017`8\"f\u0017%f\u001C,h*\u001Eg.\u0000d=\u0013e-\u0017g9\u0001i+\u0014e-\u0017m\u0015\u001Cj5-l\u00164d8:d;\u0000d9\u0008h.!g.\u0017f\u001C:g,\u0014h.0f\u001C,h(\u000Eh+\u0016e\r\u0000f\u001C\re\n!e\u0019(d:\u0012h\u0001\u0014g=\u0011f\u0008?e\u001C0d:'d?1d9\u0010i\u0003(e\u0007:g\t\u0008g$>f\u000E\u0012h!\u000Cf&\u001Ci\u0003(h\u0010=f <h?\u001Bd8\u0000f-%f\u0014/d;\u0018e.\u001Di*\u000Ch/\u0001g \u0001e'\u0014e\u0011\u0018d<\u001Af\u00150f\r.e:\u0013f6\u0008h49h\u0000\u0005e\n\u001Ee\u0005,e.$h.(h.:e\u000C:f71e\u001C3e8\u0002f\u0012-f\u0014>e\u0019(e\u000C\u0017d:,e8\u0002e$'e-&g\u0014\u001Fh6\nf\u001D%h6\ng.!g\u0010\u0006e\u0011\u0018d?!f\u0001/g=\u0011serviciosartC-culoargentinabarcelonacualquierpublicadoproductospolC-ticarespuestawikipediasiguientebC:squedacomunidadseguridadprincipalpreguntascontenidorespondervenezuelaproblemasdiciembrerelaciC3nnoviembresimilaresproyectosprogramasinstitutoactividadencuentraeconomC-aimC!genescontactardescargarnecesarioatenciC3ntelC)fonocomisiC3ncancionescapacidadencontraranC!lisisfavoritostC)rminosprovinciaetiquetaselementosfuncionesresultadocarC!cterpropiedadprincipionecesidadmunicipalcreaciC3ndescargaspresenciacomercialopinionesejercicioeditorialsalamancagonzC!lezdocumentopelC-cularecientesgeneralestarragonaprC!cticanovedadespropuestapacientestC)cnicasobjetivoscontactos`$.`%\u0007`$\u0002`$2`$?`$\u000F`$9`%\u0008`$\u0002`$\u0017`$/`$>`$8`$>`$%`$\u000F`$5`$\u0002`$0`$9`%\u0007`$\u0015`%\u000B`$\u0008`$\u0015`%\u0001`$\u001B`$0`$9`$>`$,`$>`$&`$\u0015`$9`$>`$8`$-`%\u0000`$9`%\u0001`$\u000F`$0`$9`%\u0000`$.`%\u0008`$\u0002`$&`$?`$(`$,`$>`$$diplodocs`$8`$.`$/`$0`%\u0002`$*`$(`$>`$.`$*`$$`$>`$+`$?`$0`$\u0014`$8`$$`$$`$0`$9`$2`%\u000B`$\u0017`$9`%\u0001`$\u0006`$,`$>`$0`$&`%\u0007`$6`$9`%\u0001`$\u0008`$\u0016`%\u0007`$2`$/`$&`$?`$\u0015`$>`$.`$5`%\u0007`$,`$$`%\u0000`$(`$,`%\u0000`$\u001A`$.`%\u000C`$$`$8`$>`$2`$2`%\u0007`$\u0016`$\u001C`%\t`$,`$.`$&`$&`$$`$%`$>`$(`$9`%\u0000`$6`$9`$0`$\u0005`$2`$\u0017`$\u0015`$-`%\u0000`$(`$\u0017`$0`$*`$>`$8`$0`$>`$$`$\u0015`$?`$\u000F`$\t`$8`%\u0007`$\u0017`$/`%\u0000`$9`%\u0002`$\u0001`$\u0006`$\u0017`%\u0007`$\u001F`%\u0000`$.`$\u0016`%\u000B`$\u001C`$\u0015`$>`$0`$\u0005`$-`%\u0000`$\u0017`$/`%\u0007`$$`%\u0001`$.`$5`%\u000B`$\u001F`$&`%\u0007`$\u0002`$\u0005`$\u0017`$0`$\u0010`$8`%\u0007`$.`%\u0007`$2`$2`$\u0017`$>`$9`$>`$2`$\n`$*`$0`$\u001A`$>`$0`$\u0010`$8`$>`$&`%\u0007`$0`$\u001C`$?`$8`$&`$?`$2`$,`$\u0002`$&`$,`$(`$>`$9`%\u0002`$\u0002`$2`$>`$\u0016`$\u001C`%\u0000`$$`$,`$\u001F`$(`$.`$?`$2`$\u0007`$8`%\u0007`$\u0006`$(`%\u0007`$(`$/`$>`$\u0015`%\u0001`$2`$2`%\t`$\u0017`$-`$>`$\u0017`$0`%\u0007`$2`$\u001C`$\u0017`$9`$0`$>`$.`$2`$\u0017`%\u0007`$*`%\u0007`$\u001C`$9`$>`$%`$\u0007`$8`%\u0000`$8`$9`%\u0000`$\u0015`$2`$>`$ `%\u0000`$\u0015`$9`$>`$\u0001`$&`%\u0002`$0`$$`$9`$$`$8`$>`$$`$/`$>`$&`$\u0006`$/`$>`$*`$>`$\u0015`$\u0015`%\u000C`$(`$6`$>`$.`$&`%\u0007`$\u0016`$/`$9`%\u0000`$0`$>`$/`$\u0016`%\u0001`$&`$2`$\u0017`%\u0000categoriesexperience</title>\r\nCopyright javascriptconditionseverything<p class=\"technologybackground<a class=\"management&copy; 201javaScriptcharactersbreadcrumbthemselveshorizontalgovernmentCaliforniaactivitiesdiscoveredNavigationtransitionconnectionnavigationappearance</title><mcheckbox\" techniquesprotectionapparentlyas well asunt', 'UA-resolutionoperationstelevisiontranslatedWashingtonnavigator. = window.impression&lt;br&gt;literaturepopulationbgcolor=\"#especially content=\"productionnewsletterpropertiesdefinitionleadershipTechnologyParliamentcomparisonul class=\".indexOf(\"conclusiondiscussioncomponentsbiologicalRevolution_containerunderstoodnoscript><permissioneach otheratmosphere onfocus=\"<form id=\"processingthis.valuegenerationConferencesubsequentwell-knownvariationsreputationphenomenondisciplinelogo.png\" (document,boundariesexpressionsettlementBackgroundout of theenterprise(\"https:\" unescape(\"password\" democratic<a href=\"/wrapper\">\nmembershiplinguisticpx;paddingphilosophyassistanceuniversityfacilitiesrecognizedpreferenceif (typeofmaintainedvocabularyhypothesis.submit();&amp;nbsp;annotationbehind theFoundationpublisher\"assumptionintroducedcorruptionscientistsexplicitlyinstead ofdimensions onClick=\"considereddepartmentoccupationsoon afterinvestmentpronouncedidentifiedexperimentManagementgeographic\" height=\"link rel=\".replace(/depressionconferencepunishmenteliminatedresistanceadaptationoppositionwell knownsupplementdeterminedh1 class=\"0px;marginmechanicalstatisticscelebratedGovernment\n\nDuring tdevelopersartificialequivalentoriginatedCommissionattachment<span id=\"there wereNederlandsbeyond theregisteredjournalistfrequentlyall of thelang=\"en\" </style>\r\nabsolute; supportingextremely mainstream</strong> popularityemployment</table>\r\n colspan=\"</form>\n conversionabout the </p></div>integrated\" lang=\"enPortuguesesubstituteindividualimpossiblemultimediaalmost allpx solid #apart fromsubject toin Englishcriticizedexcept forguidelinesoriginallyremarkablethe secondh2 class=\"<a title=\"(includingparametersprohibited= \"http://dictionaryperceptionrevolutionfoundationpx;height:successfulsupportersmillenniumhis fatherthe &quot;no-repeat;commercialindustrialencouragedamount of unofficialefficiencyReferencescoordinatedisclaimerexpeditiondevelopingcalculatedsimplifiedlegitimatesubstring(0\" class=\"completelyillustratefive yearsinstrumentPublishing1\" class=\"psychologyconfidencenumber of absence offocused onjoined thestructurespreviously></iframe>once againbut ratherimmigrantsof course,a group ofLiteratureUnlike the</a>&nbsp;\nfunction it was theConventionautomobileProtestantaggressiveafter the Similarly,\" /></div>collection\r\nfunctionvisibilitythe use ofvolunteersattractionunder the threatened*<![CDATA[importancein generalthe latter</form>\n</.indexOf('i = 0; i <differencedevoted totraditionssearch forultimatelytournamentattributesso-called }\n</style>evaluationemphasizedaccessible</section>successionalong withMeanwhile,industries</a><br />has becomeaspects ofTelevisionsufficientbasketballboth sidescontinuingan article<img alt=\"adventureshis mothermanchesterprinciplesparticularcommentaryeffects ofdecided to\"><strong>publishersJournal ofdifficultyfacilitateacceptablestyle.css\"\tfunction innovation>Copyrightsituationswould havebusinessesDictionarystatementsoften usedpersistentin Januarycomprising</title>\n\tdiplomaticcontainingperformingextensionsmay not beconcept of onclick=\"It is alsofinancial making theLuxembourgadditionalare calledengaged in\"script\");but it waselectroniconsubmit=\"\n<!-- End electricalofficiallysuggestiontop of theunlike theAustralianOriginallyreferences\n</head>\r\nrecognisedinitializelimited toAlexandriaretirementAdventuresfour years\n\n&lt;!-- increasingdecorationh3 class=\"origins ofobligationregulationclassified(function(advantagesbeing the historians<base hrefrepeatedlywilling tocomparabledesignatednominationfunctionalinside therevelationend of thes for the authorizedrefused totake placeautonomouscompromisepolitical restauranttwo of theFebruary 2quality ofswfobject.understandnearly allwritten byinterviews\" width=\"1withdrawalfloat:leftis usuallycandidatesnewspapersmysteriousDepartmentbest knownparliamentsuppressedconvenientremembereddifferent systematichas led topropagandacontrolledinfluencesceremonialproclaimedProtectionli class=\"Scientificclass=\"no-trademarksmore than widespreadLiberationtook placeday of theas long asimprisonedAdditional\n<head>\n<mLaboratoryNovember 2exceptionsIndustrialvariety offloat: lefDuring theassessmenthave been deals withStatisticsoccurrence/ul></div>clearfix\">the publicmany yearswhich wereover time,synonymouscontent\">\npresumablyhis familyuserAgent.unexpectedincluding challengeda minorityundefined\"belongs totaken fromin Octoberposition: said to bereligious Federation rowspan=\"only a fewmeant thatled to the-->\r\n<div <fieldset>Archbishop class=\"nobeing usedapproachesprivilegesnoscript>\nresults inmay be theEaster eggmechanismsreasonablePopulationCollectionselected\">noscript>\r/index.phparrival of-jssdk'));managed toincompletecasualtiescompletionChristiansSeptember arithmeticproceduresmight haveProductionit appearsPhilosophyfriendshipleading togiving thetoward theguaranteeddocumentedcolor:#000video gamecommissionreflectingchange theassociatedsans-serifonkeypress; padding:He was theunderlyingtypically , and the srcElementsuccessivesince the should be networkingaccountinguse of thelower thanshows that</span>\n\t\tcomplaintscontinuousquantitiesastronomerhe did notdue to itsapplied toan averageefforts tothe futureattempt toTherefore,capabilityRepublicanwas formedElectronickilometerschallengespublishingthe formerindigenousdirectionssubsidiaryconspiracydetails ofand in theaffordablesubstancesreason forconventionitemtype=\"absolutelysupposedlyremained aattractivetravellingseparatelyfocuses onelementaryapplicablefound thatstylesheetmanuscriptstands for no-repeat(sometimesCommercialin Americaundertakenquarter ofan examplepersonallyindex.php?</button>\npercentagebest-knowncreating a\" dir=\"ltrLieutenant\n<div id=\"they wouldability ofmade up ofnoted thatclear thatargue thatto anotherchildren'spurpose offormulatedbased uponthe regionsubject ofpassengerspossession.\n\nIn the Before theafterwardscurrently across thescientificcommunity.capitalismin Germanyright-wingthe systemSociety ofpoliticiandirection:went on toremoval of New York apartmentsindicationduring theunless thehistoricalhad been adefinitiveingredientattendanceCenter forprominencereadyStatestrategiesbut in theas part ofconstituteclaim thatlaboratorycompatiblefailure of, such as began withusing the to providefeature offrom which/\" class=\"geologicalseveral ofdeliberateimportant holds thating&quot; valign=topthe Germanoutside ofnegotiatedhis careerseparationid=\"searchwas calledthe fourthrecreationother thanpreventionwhile the education,connectingaccuratelywere builtwas killedagreementsmuch more Due to thewidth: 100some otherKingdom ofthe entirefamous forto connectobjectivesthe Frenchpeople andfeatured\">is said tostructuralreferendummost oftena separate->\n<div id Official worldwide.aria-labelthe planetand it wasd\" value=\"looking atbeneficialare in themonitoringreportedlythe modernworking onallowed towhere the innovative</a></div>soundtracksearchFormtend to beinput id=\"opening ofrestrictedadopted byaddressingtheologianmethods ofvariant ofChristian very largeautomotiveby far therange frompursuit offollow thebrought toin Englandagree thataccused ofcomes frompreventingdiv style=his or hertremendousfreedom ofconcerning0 1em 1em;Basketball/style.cssan earliereven after/\" title=\".com/indextaking thepittsburghcontent\">\r<script>(fturned outhaving the</span>\r\n occasionalbecause itstarted tophysically></div>\n created byCurrently, bgcolor=\"tabindex=\"disastrousAnalytics also has a><div id=\"</style>\n<called forsinger and.src = \"//violationsthis pointconstantlyis locatedrecordingsd from thenederlandsportuguC*sW\"W\u0011W(W\u0019W*Y\u0001X'X1X3[\u000CdesarrollocomentarioeducaciC3nseptiembreregistradodirecciC3nubicaciC3npublicidadrespuestasresultadosimportantereservadosartC-culosdiferentessiguientesrepC:blicasituaciC3nministerioprivacidaddirectorioformaciC3npoblaciC3npresidentecont";
+ private static final String DATA1 = "enidosaccesoriostechnoratipersonalescategorC-aespecialesdisponibleactualidadreferenciavalladolidbibliotecarelacionescalendariopolC-ticasanterioresdocumentosnaturalezamaterialesdiferenciaeconC3micatransporterodrC-guezparticiparencuentrandiscusiC3nestructurafundaciC3nfrecuentespermanentetotalmenteP<P>P6P=P>P1Q\u0003P4P5Q\u0002P<P>P6P5Q\u0002P2Q\u0000P5P<Q\u000FQ\u0002P0P:P6P5Q\u0007Q\u0002P>P1Q\u000BP1P>P;P5P5P>Q\u0007P5P=Q\u000CQ\rQ\u0002P>P3P>P:P>P3P4P0P?P>Q\u0001P;P5P2Q\u0001P5P3P>Q\u0001P0P9Q\u0002P5Q\u0007P5Q\u0000P5P7P<P>P3Q\u0003Q\u0002Q\u0001P0P9Q\u0002P0P6P8P7P=P8P<P5P6P4Q\u0003P1Q\u0003P4Q\u0003Q\u0002P\u001FP>P8Q\u0001P:P7P4P5Q\u0001Q\u000CP2P8P4P5P>Q\u0001P2Q\u000FP7P8P=Q\u0003P6P=P>Q\u0001P2P>P5P9P;Q\u000EP4P5P9P?P>Q\u0000P=P>P<P=P>P3P>P4P5Q\u0002P5P9Q\u0001P2P>P8Q\u0005P?Q\u0000P0P2P0Q\u0002P0P:P>P9P<P5Q\u0001Q\u0002P>P8P<P5P5Q\u0002P6P8P7P=Q\u000CP>P4P=P>P9P;Q\u0003Q\u0007Q\u0008P5P?P5Q\u0000P5P4Q\u0007P0Q\u0001Q\u0002P8Q\u0007P0Q\u0001Q\u0002Q\u000CQ\u0000P0P1P>Q\u0002P=P>P2Q\u000BQ\u0005P?Q\u0000P0P2P>Q\u0001P>P1P>P9P?P>Q\u0002P>P<P<P5P=P5P5Q\u0007P8Q\u0001P;P5P=P>P2Q\u000BP5Q\u0003Q\u0001P;Q\u0003P3P>P:P>P;P>P=P0P7P0P4Q\u0002P0P:P>P5Q\u0002P>P3P4P0P?P>Q\u0007Q\u0002P8P\u001FP>Q\u0001P;P5Q\u0002P0P:P8P5P=P>P2Q\u000BP9Q\u0001Q\u0002P>P8Q\u0002Q\u0002P0P:P8Q\u0005Q\u0001Q\u0000P0P7Q\u0003P!P0P=P:Q\u0002Q\u0004P>Q\u0000Q\u0003P<P\u001AP>P3P4P0P:P=P8P3P8Q\u0001P;P>P2P0P=P0Q\u0008P5P9P=P0P9Q\u0002P8Q\u0001P2P>P8P<Q\u0001P2Q\u000FP7Q\u000CP;Q\u000EP1P>P9Q\u0007P0Q\u0001Q\u0002P>Q\u0001Q\u0000P5P4P8P\u001AQ\u0000P>P<P5P$P>Q\u0000Q\u0003P<Q\u0000Q\u000BP=P:P5Q\u0001Q\u0002P0P;P8P?P>P8Q\u0001P:Q\u0002Q\u000BQ\u0001Q\u000FQ\u0007P<P5Q\u0001Q\u000FQ\u0006Q\u0006P5P=Q\u0002Q\u0000Q\u0002Q\u0000Q\u0003P4P0Q\u0001P0P<Q\u000BQ\u0005Q\u0000Q\u000BP=P:P0P\u001DP>P2Q\u000BP9Q\u0007P0Q\u0001P>P2P<P5Q\u0001Q\u0002P0Q\u0004P8P;Q\u000CP<P<P0Q\u0000Q\u0002P0Q\u0001Q\u0002Q\u0000P0P=P<P5Q\u0001Q\u0002P5Q\u0002P5P:Q\u0001Q\u0002P=P0Q\u0008P8Q\u0005P<P8P=Q\u0003Q\u0002P8P<P5P=P8P8P<P5Q\u000EQ\u0002P=P>P<P5Q\u0000P3P>Q\u0000P>P4Q\u0001P0P<P>P<Q\rQ\u0002P>P<Q\u0003P:P>P=Q\u0006P5Q\u0001P2P>P5P<P:P0P:P>P9P\u0010Q\u0000Q\u0005P8P2Y\u0005Y\u0006X*X/Y\tX%X1X3X'Y\u0004X1X3X'Y\u0004X)X'Y\u0004X9X'Y\u0005Y\u0003X*X(Y\u0007X'X(X1X'Y\u0005X,X'Y\u0004Y\nY\u0008Y\u0005X'Y\u0004X5Y\u0008X1X,X/Y\nX/X)X'Y\u0004X9X6Y\u0008X%X6X'Y\u0001X)X'Y\u0004Y\u0002X3Y\u0005X'Y\u0004X9X'X(X*X-Y\u0005Y\nY\u0004Y\u0005Y\u0004Y\u0001X'X*Y\u0005Y\u0004X*Y\u0002Y\tX*X9X/Y\nY\u0004X'Y\u0004X4X9X1X#X.X(X'X1X*X7Y\u0008Y\nX1X9Y\u0004Y\nY\u0003Y\u0005X%X1Y\u0001X'Y\u0002X7Y\u0004X(X'X*X'Y\u0004Y\u0004X:X)X*X1X*Y\nX(X'Y\u0004Y\u0006X'X3X'Y\u0004X4Y\nX.Y\u0005Y\u0006X*X/Y\nX'Y\u0004X9X1X(X'Y\u0004Y\u0002X5X5X'Y\u0001Y\u0004X'Y\u0005X9Y\u0004Y\nY\u0007X'X*X-X/Y\nX+X'Y\u0004Y\u0004Y\u0007Y\u0005X'Y\u0004X9Y\u0005Y\u0004Y\u0005Y\u0003X*X(X)Y\nY\u0005Y\u0003Y\u0006Y\u0003X'Y\u0004X7Y\u0001Y\u0004Y\u0001Y\nX/Y\nY\u0008X%X/X'X1X)X*X'X1Y\nX.X'Y\u0004X5X-X)X*X3X,Y\nY\u0004X'Y\u0004Y\u0008Y\u0002X*X9Y\u0006X/Y\u0005X'Y\u0005X/Y\nY\u0006X)X*X5Y\u0005Y\nY\u0005X#X1X4Y\nY\u0001X'Y\u0004X0Y\nY\u0006X9X1X(Y\nX)X(Y\u0008X'X(X)X#Y\u0004X9X'X(X'Y\u0004X3Y\u0001X1Y\u0005X4X'Y\u0003Y\u0004X*X9X'Y\u0004Y\tX'Y\u0004X#Y\u0008Y\u0004X'Y\u0004X3Y\u0006X)X,X'Y\u0005X9X)X'Y\u0004X5X-Y\u0001X'Y\u0004X/Y\nY\u0006Y\u0003Y\u0004Y\u0005X'X*X'Y\u0004X.X'X5X'Y\u0004Y\u0005Y\u0004Y\u0001X#X9X6X'X!Y\u0003X*X'X(X)X'Y\u0004X.Y\nX1X1X3X'X&Y\u0004X'Y\u0004Y\u0002Y\u0004X(X'Y\u0004X#X/X(Y\u0005Y\u0002X'X7X9Y\u0005X1X'X3Y\u0004Y\u0005Y\u0006X7Y\u0002X)X'Y\u0004Y\u0003X*X(X'Y\u0004X1X,Y\u0004X'X4X*X1Y\u0003X'Y\u0004Y\u0002X/Y\u0005Y\nX9X7Y\nY\u0003sByTagName(.jpg\" alt=\"1px solid #.gif\" alt=\"transparentinformationapplication\" onclick=\"establishedadvertising.png\" alt=\"environmentperformanceappropriate&amp;mdash;immediately</strong></rather thantemperaturedevelopmentcompetitionplaceholdervisibility:copyright\">0\" height=\"even thoughreplacementdestinationCorporation<ul class=\"AssociationindividualsperspectivesetTimeout(url(http://mathematicsmargin-top:eventually description) no-repeatcollections.JPG|thumb|participate/head><bodyfloat:left;<li class=\"hundreds of\n\nHowever, compositionclear:both;cooperationwithin the label for=\"border-top:New Zealandrecommendedphotographyinteresting&lt;sup&gt;controversyNetherlandsalternativemaxlength=\"switzerlandDevelopmentessentially\n\nAlthough </textarea>thunderbirdrepresented&amp;ndash;speculationcommunitieslegislationelectronics\n\t<div id=\"illustratedengineeringterritoriesauthoritiesdistributed6\" height=\"sans-serif;capable of disappearedinteractivelooking forit would beAfghanistanwas createdMath.floor(surroundingcan also beobservationmaintenanceencountered<h2 class=\"more recentit has beeninvasion of).getTime()fundamentalDespite the\"><div id=\"inspirationexaminationpreparationexplanation<input id=\"</a></span>versions ofinstrumentsbefore the = 'http://Descriptionrelatively .substring(each of theexperimentsinfluentialintegrationmany peopledue to the combinationdo not haveMiddle East<noscript><copyright\" perhaps theinstitutionin Decemberarrangementmost famouspersonalitycreation oflimitationsexclusivelysovereignty-content\">\n<td class=\"undergroundparallel todoctrine ofoccupied byterminologyRenaissancea number ofsupport forexplorationrecognitionpredecessor<img src=\"/<h1 class=\"publicationmay also bespecialized</fieldset>progressivemillions ofstates thatenforcementaround the one another.parentNodeagricultureAlternativeresearcherstowards theMost of themany other (especially<td width=\";width:100%independent<h3 class=\" onchange=\").addClass(interactionOne of the daughter ofaccessoriesbranches of\r\n<div id=\"the largestdeclarationregulationsInformationtranslationdocumentaryin order to\">\n<head>\n<\" height=\"1across the orientation);</script>implementedcan be seenthere was ademonstratecontainer\">connectionsthe Britishwas written!important;px; margin-followed byability to complicatedduring the immigrationalso called<h4 class=\"distinctionreplaced bygovernmentslocation ofin Novemberwhether the</p>\n</div>acquisitioncalled the persecutiondesignation{font-size:appeared ininvestigateexperiencedmost likelywidely useddiscussionspresence of (document.extensivelyIt has beenit does notcontrary toinhabitantsimprovementscholarshipconsumptioninstructionfor exampleone or morepx; paddingthe currenta series ofare usuallyrole in thepreviously derivativesevidence ofexperiencescolorschemestated thatcertificate</a></div>\n selected=\"high schoolresponse tocomfortableadoption ofthree yearsthe countryin Februaryso that thepeople who provided by<param nameaffected byin terms ofappointmentISO-8859-1\"was born inhistorical regarded asmeasurementis based on and other : function(significantcelebrationtransmitted/js/jquery.is known astheoretical tabindex=\"it could be<noscript>\nhaving been\r\n<head>\r\n< &quot;The compilationhe had beenproduced byphilosopherconstructedintended toamong othercompared toto say thatEngineeringa differentreferred todifferencesbelief thatphotographsidentifyingHistory of Republic ofnecessarilyprobabilitytechnicallyleaving thespectacularfraction ofelectricityhead of therestaurantspartnershipemphasis onmost recentshare with saying thatfilled withdesigned toit is often\"></iframe>as follows:merged withthrough thecommercial pointed outopportunityview of therequirementdivision ofprogramminghe receivedsetInterval\"></span></in New Yorkadditional compression\n\n<div id=\"incorporate;</script><attachEventbecame the \" target=\"_carried outSome of thescience andthe time ofContainer\">maintainingChristopherMuch of thewritings of\" height=\"2size of theversion of mixture of between theExamples ofeducationalcompetitive onsubmit=\"director ofdistinctive/DTD XHTML relating totendency toprovince ofwhich woulddespite thescientific legislature.innerHTML allegationsAgriculturewas used inapproach tointelligentyears later,sans-serifdeterminingPerformanceappearances, which is foundationsabbreviatedhigher thans from the individual composed ofsupposed toclaims thatattributionfont-size:1elements ofHistorical his brotherat the timeanniversarygoverned byrelated to ultimately innovationsit is stillcan only bedefinitionstoGMTStringA number ofimg class=\"Eventually,was changedoccurred inneighboringdistinguishwhen he wasintroducingterrestrialMany of theargues thatan Americanconquest ofwidespread were killedscreen and In order toexpected todescendantsare locatedlegislativegenerations backgroundmost peopleyears afterthere is nothe highestfrequently they do notargued thatshowed thatpredominanttheologicalby the timeconsideringshort-lived</span></a>can be usedvery littleone of the had alreadyinterpretedcommunicatefeatures ofgovernment,</noscript>entered the\" height=\"3Independentpopulationslarge-scale. Although used in thedestructionpossibilitystarting intwo or moreexpressionssubordinatelarger thanhistory and</option>\r\nContinentaleliminatingwill not bepractice ofin front ofsite of theensure thatto create amississippipotentiallyoutstandingbetter thanwhat is nowsituated inmeta name=\"TraditionalsuggestionsTranslationthe form ofatmosphericideologicalenterprisescalculatingeast of theremnants ofpluginspage/index.php?remained intransformedHe was alsowas alreadystatisticalin favor ofMinistry ofmovement offormulationis required<link rel=\"This is the <a href=\"/popularizedinvolved inare used toand severalmade by theseems to belikely thatPalestiniannamed afterit had beenmost commonto refer tobut this isconsecutivetemporarilyIn general,conventionstakes placesubdivisionterritorialoperationalpermanentlywas largelyoutbreak ofin the pastfollowing a xmlns:og=\"><a class=\"class=\"textConversion may be usedmanufactureafter beingclearfix\">\nquestion ofwas electedto become abecause of some peopleinspired bysuccessful a time whenmore commonamongst thean officialwidth:100%;technology,was adoptedto keep thesettlementslive birthsindex.html\"Connecticutassigned to&amp;times;account foralign=rightthe companyalways beenreturned toinvolvementBecause thethis period\" name=\"q\" confined toa result ofvalue=\"\" />is actuallyEnvironment\r\n</head>\r\nConversely,>\n<div id=\"0\" width=\"1is probablyhave becomecontrollingthe problemcitizens ofpoliticiansreached theas early as:none; over<table cellvalidity ofdirectly toonmousedownwhere it iswhen it wasmembers of relation toaccommodatealong with In the latethe Englishdelicious\">this is notthe presentif they areand finallya matter of\r\n\t</div>\r\n\r\n</script>faster thanmajority ofafter whichcomparativeto maintainimprove theawarded theer\" class=\"frameborderrestorationin the sameanalysis oftheir firstDuring the continentalsequence offunction(){font-size: work on the</script>\n<begins withjavascript:constituentwas foundedequilibriumassume thatis given byneeds to becoordinatesthe variousare part ofonly in thesections ofis a commontheories ofdiscoveriesassociationedge of thestrength ofposition inpresent-dayuniversallyto form thebut insteadcorporationattached tois commonlyreasons for &quot;the can be madewas able towhich meansbut did notonMouseOveras possibleoperated bycoming fromthe primaryaddition offor severaltransferreda period ofare able tohowever, itshould havemuch larger\n\t</script>adopted theproperty ofdirected byeffectivelywas broughtchildren ofProgramminglonger thanmanuscriptswar againstby means ofand most ofsimilar to proprietaryoriginatingprestigiousgrammaticalexperience.to make theIt was alsois found incompetitorsin the U.S.replace thebrought thecalculationfall of thethe generalpracticallyin honor ofreleased inresidentialand some ofking of thereaction to1st Earl ofculture andprincipally</title>\n they can beback to thesome of hisexposure toare similarform of theaddFavoritecitizenshippart in thepeople within practiceto continue&amp;minus;approved by the first allowed theand for thefunctioningplaying thesolution toheight=\"0\" in his bookmore than afollows thecreated thepresence in&nbsp;</td>nationalistthe idea ofa characterwere forced class=\"btndays of thefeatured inshowing theinterest inin place ofturn of thethe head ofLord of thepoliticallyhas its ownEducationalapproval ofsome of theeach other,behavior ofand becauseand anotherappeared onrecorded inblack&quot;may includethe world'scan lead torefers to aborder=\"0\" government winning theresulted in while the Washington,the subjectcity in the></div>\r\n\t\treflect theto completebecame moreradioactiverejected bywithout anyhis father,which couldcopy of theto indicatea politicalaccounts ofconstitutesworked wither</a></li>of his lifeaccompaniedclientWidthprevent theLegislativedifferentlytogether inhas severalfor anothertext of thefounded thee with the is used forchanged theusually theplace wherewhereas the> <a href=\"\"><a href=\"themselves,although hethat can betraditionalrole of theas a resultremoveChilddesigned bywest of theSome peopleproduction,side of thenewslettersused by thedown to theaccepted bylive in theattempts tooutside thefrequenciesHowever, inprogrammersat least inapproximatealthough itwas part ofand variousGovernor ofthe articleturned into><a href=\"/the economyis the mostmost widelywould laterand perhapsrise to theoccurs whenunder whichconditions.the westerntheory thatis producedthe city ofin which heseen in thethe centralbuilding ofmany of hisarea of theis the onlymost of themany of thethe WesternThere is noextended toStatisticalcolspan=2 |short storypossible totopologicalcritical ofreported toa Christiandecision tois equal toproblems ofThis can bemerchandisefor most ofno evidenceeditions ofelements in&quot;. Thecom/images/which makesthe processremains theliterature,is a memberthe popularthe ancientproblems intime of thedefeated bybody of thea few yearsmuch of thethe work ofCalifornia,served as agovernment.concepts ofmovement in\t\t<div id=\"it\" value=\"language ofas they areproduced inis that theexplain thediv></div>\nHowever thelead to the\t<a href=\"/was grantedpeople havecontinuallywas seen asand relatedthe role ofproposed byof the besteach other.Constantinepeople fromdialects ofto revisionwas renameda source ofthe initiallaunched inprovide theto the westwhere thereand similarbetween twois also theEnglish andconditions,that it wasentitled tothemselves.quantity ofransparencythe same asto join thecountry andthis is theThis led toa statementcontrast tolastIndexOfthrough hisis designedthe term isis providedprotect theng</a></li>The currentthe site ofsubstantialexperience,in the Westthey shouldslovenD\rinacomentariosuniversidadcondicionesactividadesexperienciatecnologC-aproducciC3npuntuaciC3naplicaciC3ncontraseC1acategorC-asregistrarseprofesionaltratamientoregC-stratesecretarC-aprincipalesprotecciC3nimportantesimportanciaposibilidadinteresantecrecimientonecesidadessuscribirseasociaciC3ndisponiblesevaluaciC3nestudiantesresponsableresoluciC3nguadalajararegistradosoportunidadcomercialesfotografC-aautoridadesingenierC-atelevisiC3ncompetenciaoperacionesestablecidosimplementeactualmentenavegaciC3nconformidadline-height:font-family:\" : \"http://applicationslink\" href=\"specifically//<![CDATA[\nOrganizationdistribution0px; height:relationshipdevice-width<div class=\"<label for=\"registration</noscript>\n/index.html\"window.open( !important;application/independence//www.googleorganizationautocompleterequirementsconservative<form name=\"intellectualmargin-left:18th centuryan importantinstitutionsabbreviation<img class=\"organisationcivilization19th centuryarchitectureincorporated20th century-container\">most notably/></a></div>notification'undefined')Furthermore,believe thatinnerHTML = prior to thedramaticallyreferring tonegotiationsheadquartersSouth AfricaunsuccessfulPennsylvaniaAs a result,<html lang=\"&lt;/sup&gt;dealing withphiladelphiahistorically);</script>\npadding-top:experimentalgetAttributeinstructionstechnologiespart of the =function(){subscriptionl.dtd\">\r\n<htgeographicalConstitution', function(supported byagriculturalconstructionpublicationsfont-size: 1a variety of<div style=\"Encyclopediaiframe src=\"demonstratedaccomplisheduniversitiesDemographics);</script><dedicated toknowledge ofsatisfactionparticularly</div></div>English (US)appendChild(transmissions. However, intelligence\" tabindex=\"float:right;Commonwealthranging fromin which theat least onereproductionencyclopedia;font-size:1jurisdictionat that time\"><a class=\"In addition,description+conversationcontact withis generallyr\" content=\"representing&lt;math&gt;presentationoccasionally<img width=\"navigation\">compensationchampionshipmedia=\"all\" violation ofreference toreturn true;Strict//EN\" transactionsinterventionverificationInformation difficultiesChampionshipcapabilities<![endif]-->}\n</script>\nChristianityfor example,Professionalrestrictionssuggest thatwas released(such as theremoveClass(unemploymentthe Americanstructure of/index.html published inspan class=\"\"><a href=\"/introductionbelonging toclaimed thatconsequences<meta name=\"Guide to theoverwhelmingagainst the concentrated,\n.nontouch observations</a>\n</div>\nf (document.border: 1px {font-size:1treatment of0\" height=\"1modificationIndependencedivided intogreater thanachievementsestablishingJavaScript\" neverthelesssignificanceBroadcasting>&nbsp;</td>container\">\nsuch as the influence ofa particularsrc='http://navigation\" half of the substantial &nbsp;</div>advantage ofdiscovery offundamental metropolitanthe opposite\" xml:lang=\"deliberatelyalign=centerevolution ofpreservationimprovementsbeginning inJesus ChristPublicationsdisagreementtext-align:r, function()similaritiesbody></html>is currentlyalphabeticalis sometimestype=\"image/many of the flow:hidden;available indescribe theexistence ofall over thethe Internet\t<ul class=\"installationneighborhoodarmed forcesreducing thecontinues toNonetheless,temperatures\n\t\t<a href=\"close to theexamples of is about the(see below).\" id=\"searchprofessionalis availablethe official\t\t</script>\n\n\t\t<div id=\"accelerationthrough the Hall of Famedescriptionstranslationsinterference type='text/recent yearsin the worldvery popular{background:traditional some of the connected toexploitationemergence ofconstitutionA History ofsignificant manufacturedexpectations><noscript><can be foundbecause the has not beenneighbouringwithout the added to the\t<li class=\"instrumentalSoviet Unionacknowledgedwhich can bename for theattention toattempts to developmentsIn fact, the<li class=\"aimplicationssuitable formuch of the colonizationpresidentialcancelBubble Informationmost of the is describedrest of the more or lessin SeptemberIntelligencesrc=\"http://px; height: available tomanufacturerhuman rightslink href=\"/availabilityproportionaloutside the astronomicalhuman beingsname of the are found inare based onsmaller thana person whoexpansion ofarguing thatnow known asIn the earlyintermediatederived fromScandinavian</a></div>\r\nconsider thean estimatedthe National<div id=\"pagresulting incommissionedanalogous toare required/ul>\n</div>\nwas based onand became a&nbsp;&nbsp;t\" value=\"\" was capturedno more thanrespectivelycontinue to >\r\n<head>\r\n<were createdmore generalinformation used for theindependent the Imperialcomponent ofto the northinclude the Constructionside of the would not befor instanceinvention ofmore complexcollectivelybackground: text-align: its originalinto accountthis processan extensivehowever, thethey are notrejected thecriticism ofduring whichprobably thethis article(function(){It should bean agreementaccidentallydiffers fromArchitecturebetter knownarrangementsinfluence onattended theidentical tosouth of thepass throughxml\" title=\"weight:bold;creating thedisplay:nonereplaced the<img src=\"/ihttps://www.World War IItestimonialsfound in therequired to and that thebetween the was designedconsists of considerablypublished bythe languageConservationconsisted ofrefer to theback to the css\" media=\"People from available onproved to besuggestions\"was known asvarieties oflikely to becomprised ofsupport the hands of thecoupled withconnect and border:none;performancesbefore beinglater becamecalculationsoften calledresidents ofmeaning that><li class=\"evidence forexplanationsenvironments\"></a></div>which allowsIntroductiondeveloped bya wide rangeon behalf ofvalign=\"top\"principle ofat the time,</noscript>\rsaid to havein the firstwhile othershypotheticalphilosopherspower of thecontained inperformed byinability towere writtenspan style=\"input name=\"the questionintended forrejection ofimplies thatinvented thethe standardwas probablylink betweenprofessor ofinteractionschanging theIndian Ocean class=\"lastworking with'http://www.years beforeThis was therecreationalentering themeasurementsan extremelyvalue of thestart of the\n</script>\n\nan effort toincrease theto the southspacing=\"0\">sufficientlythe Europeanconverted toclearTimeoutdid not haveconsequentlyfor the nextextension ofeconomic andalthough theare producedand with theinsufficientgiven by thestating thatexpenditures</span></a>\nthought thaton the basiscellpadding=image of thereturning toinformation,separated byassassinateds\" content=\"authority ofnorthwestern</div>\n<div \"></div>\r\n consultationcommunity ofthe nationalit should beparticipants align=\"leftthe greatestselection ofsupernaturaldependent onis mentionedallowing thewas inventedaccompanyinghis personalavailable atstudy of theon the otherexecution ofHuman Rightsterms of theassociationsresearch andsucceeded bydefeated theand from thebut they arecommander ofstate of theyears of agethe study of<ul class=\"splace in thewhere he was<li class=\"fthere are nowhich becamehe publishedexpressed into which thecommissionerfont-weight:territory ofextensions\">Roman Empireequal to theIn contrast,however, andis typicallyand his wife(also called><ul class=\"effectively evolved intoseem to havewhich is thethere was noan excellentall of thesedescribed byIn practice,broadcastingcharged withreflected insubjected tomilitary andto the pointeconomicallysetTargetingare actuallyvictory over();</script>continuouslyrequired forevolutionaryan effectivenorth of the, which was front of theor otherwisesome form ofhad not beengenerated byinformation.permitted toincludes thedevelopment,entered intothe previousconsistentlyare known asthe field ofthis type ofgiven to thethe title ofcontains theinstances ofin the northdue to theirare designedcorporationswas that theone of thesemore popularsucceeded insupport fromin differentdominated bydesigned forownership ofand possiblystandardizedresponseTextwas intendedreceived theassumed thatareas of theprimarily inthe basis ofin the senseaccounts fordestroyed byat least twowas declaredcould not beSecretary ofappear to bemargin-top:1/^\\s+|\\s+$/ge){throw e};the start oftwo separatelanguage andwho had beenoperation ofdeath of thereal numbers\t<link rel=\"provided thethe story ofcompetitionsenglish (UK)english (US)P\u001CP>P=P3P>P;P!Q\u0000P?Q\u0001P:P8Q\u0001Q\u0000P?Q\u0001P:P8Q\u0001Q\u0000P?Q\u0001P:P>Y\u0004X9X1X(Y\nX)f-#i+\u0014d8-f\u0016\u0007g.\u0000d=\u0013d8-f\u0016\u0007g9\u0001d=\u0013d8-f\u0016\u0007f\u001C\ti\u0019\u0010e\u0005,e\u000F8d::f0\u0011f\u0014?e:\u001Ci\u0018?i\u0007\u000Ce74e74g$>d<\u001Ad8;d9\tf\u0013\rd=\u001Cg3;g;\u001Ff\u0014?g-\u0016f3\u0015h'\u0004informaciC3nherramientaselectrC3nicodescripciC3nclasificadosconocimientopublicaciC3nrelacionadasinformC!ticarelacionadosdepartamentotrabajadoresdirectamenteayuntamientomercadoLibrecontC!ctenoshabitacionescumplimientorestaurantesdisposiciC3nconsecuenciaelectrC3nicaaplicacionesdesconectadoinstalaciC3nrealizaciC3nutilizaciC3nenciclopediaenfermedadesinstrumentosexperienciasinstituciC3nparticularessubcategoriaQ\u0002P>P;Q\u000CP:P>P P>Q\u0001Q\u0001P8P8Q\u0000P0P1P>Q\u0002Q\u000BP1P>P;Q\u000CQ\u0008P5P?Q\u0000P>Q\u0001Q\u0002P>P<P>P6P5Q\u0002P5P4Q\u0000Q\u0003P3P8Q\u0005Q\u0001P;Q\u0003Q\u0007P0P5Q\u0001P5P9Q\u0007P0Q\u0001P2Q\u0001P5P3P4P0P P>Q\u0001Q\u0001P8Q\u000FP\u001CP>Q\u0001P:P2P5P4Q\u0000Q\u0003P3P8P5P3P>Q\u0000P>P4P0P2P>P?Q\u0000P>Q\u0001P4P0P=P=Q\u000BQ\u0005P4P>P;P6P=Q\u000BP8P<P5P=P=P>P\u001CP>Q\u0001P:P2Q\u000BQ\u0000Q\u0003P1P;P5P9P\u001CP>Q\u0001P:P2P0Q\u0001Q\u0002Q\u0000P0P=Q\u000BP=P8Q\u0007P5P3P>Q\u0000P0P1P>Q\u0002P5P4P>P;P6P5P=Q\u0003Q\u0001P;Q\u0003P3P8Q\u0002P5P?P5Q\u0000Q\u000CP\u001EP4P=P0P:P>P?P>Q\u0002P>P<Q\u0003Q\u0000P0P1P>Q\u0002Q\u0003P0P?Q\u0000P5P;Q\u000FP2P>P>P1Q\tP5P>P4P=P>P3P>Q\u0001P2P>P5P3P>Q\u0001Q\u0002P0Q\u0002Q\u000CP8P4Q\u0000Q\u0003P3P>P9Q\u0004P>Q\u0000Q\u0003P<P5Q\u0005P>Q\u0000P>Q\u0008P>P?Q\u0000P>Q\u0002P8P2Q\u0001Q\u0001Q\u000BP;P:P0P:P0P6P4Q\u000BP9P2P;P0Q\u0001Q\u0002P8P3Q\u0000Q\u0003P?P?Q\u000BP2P<P5Q\u0001Q\u0002P5Q\u0000P0P1P>Q\u0002P0Q\u0001P:P0P7P0P;P?P5Q\u0000P2Q\u000BP9P4P5P;P0Q\u0002Q\u000CP4P5P=Q\u000CP3P8P?P5Q\u0000P8P>P4P1P8P7P=P5Q\u0001P>Q\u0001P=P>P2P5P<P>P<P5P=Q\u0002P:Q\u0003P?P8Q\u0002Q\u000CP4P>P;P6P=P0Q\u0000P0P<P:P0Q\u0005P=P0Q\u0007P0P;P>P P0P1P>Q\u0002P0P\"P>P;Q\u000CP:P>Q\u0001P>P2Q\u0001P5P<P2Q\u0002P>Q\u0000P>P9P=P0Q\u0007P0P;P0Q\u0001P?P8Q\u0001P>P:Q\u0001P;Q\u0003P6P1Q\u000BQ\u0001P8Q\u0001Q\u0002P5P<P?P5Q\u0007P0Q\u0002P8P=P>P2P>P3P>P?P>P<P>Q\tP8Q\u0001P0P9Q\u0002P>P2P?P>Q\u0007P5P<Q\u0003P?P>P<P>Q\tQ\u000CP4P>P;P6P=P>Q\u0001Q\u0001Q\u000BP;P:P8P1Q\u000BQ\u0001Q\u0002Q\u0000P>P4P0P=P=Q\u000BP5P<P=P>P3P8P5P?Q\u0000P>P5P:Q\u0002P!P5P9Q\u0007P0Q\u0001P<P>P4P5P;P8Q\u0002P0P:P>P3P>P>P=P;P0P9P=P3P>Q\u0000P>P4P5P2P5Q\u0000Q\u0001P8Q\u000FQ\u0001Q\u0002Q\u0000P0P=P5Q\u0004P8P;Q\u000CP<Q\u000BQ\u0003Q\u0000P>P2P=Q\u000FQ\u0000P0P7P=Q\u000BQ\u0005P8Q\u0001P:P0Q\u0002Q\u000CP=P5P4P5P;Q\u000EQ\u000FP=P2P0Q\u0000Q\u000FP<P5P=Q\u000CQ\u0008P5P<P=P>P3P8Q\u0005P4P0P=P=P>P9P7P=P0Q\u0007P8Q\u0002P=P5P;Q\u000CP7Q\u000FQ\u0004P>Q\u0000Q\u0003P<P0P\"P5P?P5Q\u0000Q\u000CP<P5Q\u0001Q\u000FQ\u0006P0P7P0Q\tP8Q\u0002Q\u000BP\u001BQ\u0003Q\u0007Q\u0008P8P5`$(`$9`%\u0000`$\u0002`$\u0015`$0`$(`%\u0007`$\u0005`$*`$(`%\u0007`$\u0015`$?`$/`$>`$\u0015`$0`%\u0007`$\u0002`$\u0005`$(`%\r`$/`$\u0015`%\r`$/`$>`$\u0017`$>`$\u0007`$!`$,`$>`$0`%\u0007`$\u0015`$?`$8`%\u0000`$&`$?`$/`$>`$*`$9`$2`%\u0007`$8`$?`$\u0002`$9`$-`$>`$0`$$`$\u0005`$*`$(`%\u0000`$5`$>`$2`%\u0007`$8`%\u0007`$5`$>`$\u0015`$0`$$`%\u0007`$.`%\u0007`$0`%\u0007`$9`%\u000B`$(`%\u0007`$8`$\u0015`$$`%\u0007`$,`$9`%\u0001`$$`$8`$>`$\u0007`$\u001F`$9`%\u000B`$\u0017`$>`$\u001C`$>`$(`%\u0007`$.`$?`$(`$\u001F`$\u0015`$0`$$`$>`$\u0015`$0`$(`$>`$\t`$(`$\u0015`%\u0007`$/`$9`$>`$\u0001`$8`$,`$8`%\u0007`$-`$>`$7`$>`$\u0006`$*`$\u0015`%\u0007`$2`$?`$/`%\u0007`$6`%\u0001`$0`%\u0002`$\u0007`$8`$\u0015`%\u0007`$\u0018`$\u0002`$\u001F`%\u0007`$.`%\u0007`$0`%\u0000`$8`$\u0015`$$`$>`$.`%\u0007`$0`$>`$2`%\u0007`$\u0015`$0`$\u0005`$'`$?`$\u0015`$\u0005`$*`$(`$>`$8`$.`$>`$\u001C`$.`%\u0001`$\u001D`%\u0007`$\u0015`$>`$0`$#`$9`%\u000B`$$`$>`$\u0015`$!`$<`%\u0000`$/`$9`$>`$\u0002`$9`%\u000B`$\u001F`$2`$6`$,`%\r`$&`$2`$?`$/`$>`$\u001C`%\u0000`$5`$(`$\u001C`$>`$$`$>`$\u0015`%\u0008`$8`%\u0007`$\u0006`$*`$\u0015`$>`$5`$>`$2`%\u0000`$&`%\u0007`$(`%\u0007`$*`%\u0002`$0`%\u0000`$*`$>`$(`%\u0000`$\t`$8`$\u0015`%\u0007`$9`%\u000B`$\u0017`%\u0000`$,`%\u0008`$ `$\u0015`$\u0006`$*`$\u0015`%\u0000`$5`$0`%\r`$7`$\u0017`$>`$\u0002`$5`$\u0006`$*`$\u0015`%\u000B`$\u001C`$?`$2`$>`$\u001C`$>`$(`$>`$8`$9`$.`$$`$9`$.`%\u0007`$\u0002`$\t`$(`$\u0015`%\u0000`$/`$>`$9`%\u0002`$&`$0`%\r`$\u001C`$8`%\u0002`$\u001A`%\u0000`$*`$8`$\u0002`$&`$8`$5`$>`$2`$9`%\u000B`$(`$>`$9`%\u000B`$$`%\u0000`$\u001C`%\u0008`$8`%\u0007`$5`$>`$*`$8`$\u001C`$(`$$`$>`$(`%\u0007`$$`$>`$\u001C`$>`$0`%\u0000`$\u0018`$>`$/`$2`$\u001C`$?`$2`%\u0007`$(`%\u0000`$\u001A`%\u0007`$\u001C`$>`$\u0002`$\u001A`$*`$$`%\r`$0`$\u0017`%\u0002`$\u0017`$2`$\u001C`$>`$$`%\u0007`$,`$>`$9`$0`$\u0006`$*`$(`%\u0007`$5`$>`$9`$(`$\u0007`$8`$\u0015`$>`$8`%\u0001`$,`$9`$0`$9`$(`%\u0007`$\u0007`$8`$8`%\u0007`$8`$9`$?`$$`$,`$!`$<`%\u0007`$\u0018`$\u001F`$(`$>`$$`$2`$>`$6`$*`$>`$\u0002`$\u001A`$6`%\r`$0`%\u0000`$,`$!`$<`%\u0000`$9`%\u000B`$$`%\u0007`$8`$>`$\u0008`$\u001F`$6`$>`$/`$&`$8`$\u0015`$$`%\u0000`$\u001C`$>`$$`%\u0000`$5`$>`$2`$>`$9`$\u001C`$>`$0`$*`$\u001F`$(`$>`$0`$\u0016`$(`%\u0007`$8`$!`$<`$\u0015`$.`$?`$2`$>`$\t`$8`$\u0015`%\u0000`$\u0015`%\u0007`$5`$2`$2`$\u0017`$$`$>`$\u0016`$>`$(`$>`$\u0005`$0`%\r`$%`$\u001C`$9`$>`$\u0002`$&`%\u0007`$\u0016`$>`$*`$9`$2`%\u0000`$(`$?`$/`$.`$,`$?`$(`$>`$,`%\u0008`$\u0002`$\u0015`$\u0015`$9`%\u0000`$\u0002`$\u0015`$9`$(`$>`$&`%\u0007`$$`$>`$9`$.`$2`%\u0007`$\u0015`$>`$+`%\u0000`$\u001C`$,`$\u0015`$?`$$`%\u0001`$0`$$`$.`$>`$\u0002`$\u0017`$5`$9`%\u0000`$\u0002`$0`%\u000B`$\u001C`$<`$.`$?`$2`%\u0000`$\u0006`$0`%\u000B`$*`$8`%\u0007`$(`$>`$/`$>`$&`$5`$2`%\u0007`$(`%\u0007`$\u0016`$>`$$`$>`$\u0015`$0`%\u0000`$,`$\t`$(`$\u0015`$>`$\u001C`$5`$>`$,`$*`%\u0002`$0`$>`$,`$!`$<`$>`$8`%\u000C`$&`$>`$6`%\u0007`$/`$0`$\u0015`$?`$/`%\u0007`$\u0015`$9`$>`$\u0002`$\u0005`$\u0015`$8`$0`$,`$(`$>`$\u000F`$5`$9`$>`$\u0002`$8`%\r`$%`$2`$.`$?`$2`%\u0007`$2`%\u0007`$\u0016`$\u0015`$5`$?`$7`$/`$\u0015`%\r`$0`$\u0002`$8`$.`%\u0002`$9`$%`$>`$(`$>X*X3X*X7Y\nX9Y\u0005X4X'X1Y\u0003X)X(Y\u0008X'X3X7X)X'Y\u0004X5Y\u0001X-X)Y\u0005Y\u0008X'X6Y\nX9X'Y\u0004X.X'X5X)X'Y\u0004Y\u0005X2Y\nX/X'Y\u0004X9X'Y\u0005X)X'Y\u0004Y\u0003X'X*X(X'Y\u0004X1X/Y\u0008X/X(X1Y\u0006X'Y\u0005X,X'Y\u0004X/Y\u0008Y\u0004X)X'Y\u0004X9X'Y\u0004Y\u0005X'Y\u0004Y\u0005Y\u0008Y\u0002X9X'Y\u0004X9X1X(Y\nX'Y\u0004X3X1Y\nX9X'Y\u0004X,Y\u0008X'Y\u0004X'Y\u0004X0Y\u0007X'X(X'Y\u0004X-Y\nX'X)X'Y\u0004X-Y\u0002Y\u0008Y\u0002X'Y\u0004Y\u0003X1Y\nY\u0005X'Y\u0004X9X1X'Y\u0002Y\u0005X-Y\u0001Y\u0008X8X)X'Y\u0004X+X'Y\u0006Y\nY\u0005X4X'Y\u0007X/X)X'Y\u0004Y\u0005X1X#X)X'Y\u0004Y\u0002X1X\"Y\u0006X'Y\u0004X4X(X'X(X'Y\u0004X-Y\u0008X'X1X'Y\u0004X,X/Y\nX/X'Y\u0004X#X3X1X)X'Y\u0004X9Y\u0004Y\u0008Y\u0005Y\u0005X,Y\u0005Y\u0008X9X)X'Y\u0004X1X-Y\u0005Y\u0006X'Y\u0004Y\u0006Y\u0002X'X7Y\u0001Y\u0004X3X7Y\nY\u0006X'Y\u0004Y\u0003Y\u0008Y\nX*X'Y\u0004X/Y\u0006Y\nX'X(X1Y\u0003X'X*Y\u0007X'Y\u0004X1Y\nX'X6X*X-Y\nX'X*Y\nX(X*Y\u0008Y\u0002Y\nX*X'Y\u0004X#Y\u0008Y\u0004Y\tX'Y\u0004X(X1Y\nX/X'Y\u0004Y\u0003Y\u0004X'Y\u0005X'Y\u0004X1X'X(X7X'Y\u0004X4X.X5Y\nX3Y\nX'X1X'X*X'Y\u0004X+X'Y\u0004X+X'Y\u0004X5Y\u0004X'X)X'Y\u0004X-X/Y\nX+X'Y\u0004X2Y\u0008X'X1X'Y\u0004X.Y\u0004Y\nX,X'Y\u0004X,Y\u0005Y\nX9X'Y\u0004X9X'Y\u0005Y\u0007X'Y\u0004X,Y\u0005X'Y\u0004X'Y\u0004X3X'X9X)Y\u0005X4X'Y\u0007X/Y\u0007X'Y\u0004X1X&Y\nX3X'Y\u0004X/X.Y\u0008Y\u0004X'Y\u0004Y\u0001Y\u0006Y\nX)X'Y\u0004Y\u0003X*X'X(X'Y\u0004X/Y\u0008X1Y\nX'Y\u0004X/X1Y\u0008X3X'X3X*X:X1Y\u0002X*X5X'Y\u0005Y\nY\u0005X'Y\u0004X(Y\u0006X'X*X'Y\u0004X9X8Y\nY\u0005entertainmentunderstanding = function().jpg\" width=\"configuration.png\" width=\"<body class=\"Math.random()contemporary United Statescircumstances.appendChild(organizations<span class=\"\"><img src=\"/distinguishedthousands of communicationclear\"></div>investigationfavicon.ico\" margin-right:based on the Massachusettstable border=internationalalso known aspronunciationbackground:#fpadding-left:For example, miscellaneous&lt;/math&gt;psychologicalin particularearch\" type=\"form method=\"as opposed toSupreme Courtoccasionally Additionally,North Americapx;backgroundopportunitiesEntertainment.toLowerCase(manufacturingprofessional combined withFor instance,consisting of\" maxlength=\"return false;consciousnessMediterraneanextraordinaryassassinationsubsequently button type=\"the number ofthe original comprehensiverefers to the</ul>\n</div>\nphilosophicallocation.hrefwas publishedSan Francisco(function(){\n<div id=\"mainsophisticatedmathematical /head>\r\n<bodysuggests thatdocumentationconcentrationrelationshipsmay have been(for example,This article in some casesparts of the definition ofGreat Britain cellpadding=equivalent toplaceholder=\"; font-size: justificationbelieved thatsuffered fromattempted to leader of thecript\" src=\"/(function() {are available\n\t<link rel=\" src='http://interested inconventional \" alt=\"\" /></are generallyhas also beenmost popular correspondingcredited withtyle=\"border:</a></span></.gif\" width=\"<iframe src=\"table class=\"inline-block;according to together withapproximatelyparliamentarymore and moredisplay:none;traditionallypredominantly&nbsp;|&nbsp;&nbsp;</span> cellspacing=<input name=\"or\" content=\"controversialproperty=\"og:/x-shockwave-demonstrationsurrounded byNevertheless,was the firstconsiderable Although the collaborationshould not beproportion of<span style=\"known as the shortly afterfor instance,described as /head>\n<body starting withincreasingly the fact thatdiscussion ofmiddle of thean individualdifficult to point of viewhomosexualityacceptance of</span></div>manufacturersorigin of thecommonly usedimportance ofdenominationsbackground: #length of thedeterminationa significant\" border=\"0\">revolutionaryprinciples ofis consideredwas developedIndo-Europeanvulnerable toproponents ofare sometimescloser to theNew York City name=\"searchattributed tocourse of themathematicianby the end ofat the end of\" border=\"0\" technological.removeClass(branch of theevidence that![endif]-->\r\nInstitute of into a singlerespectively.and thereforeproperties ofis located insome of whichThere is alsocontinued to appearance of &amp;ndash; describes theconsiderationauthor of theindependentlyequipped withdoes not have</a><a href=\"confused with<link href=\"/at the age ofappear in theThese includeregardless ofcould be used style=&quot;several timesrepresent thebody>\n</html>thought to bepopulation ofpossibilitiespercentage ofaccess to thean attempt toproduction ofjquery/jquerytwo differentbelong to theestablishmentreplacing thedescription\" determine theavailable forAccording to wide range of\t<div class=\"more commonlyorganisationsfunctionalitywas completed &amp;mdash; participationthe characteran additionalappears to befact that thean example ofsignificantlyonmouseover=\"because they async = true;problems withseems to havethe result of src=\"http://familiar withpossession offunction () {took place inand sometimessubstantially<span></span>is often usedin an attemptgreat deal ofEnvironmentalsuccessfully virtually all20th century,professionalsnecessary to determined bycompatibilitybecause it isDictionary ofmodificationsThe followingmay refer to:Consequently,Internationalalthough somethat would beworld's firstclassified asbottom of the(particularlyalign=\"left\" most commonlybasis for thefoundation ofcontributionspopularity ofcenter of theto reduce thejurisdictionsapproximation onmouseout=\"New Testamentcollection of</span></a></in the Unitedfilm director-strict.dtd\">has been usedreturn to thealthough thischange in theseveral otherbut there areunprecedentedis similar toespecially inweight: bold;is called thecomputationalindicate thatrestricted to\t<meta name=\"are typicallyconflict withHowever, the An example ofcompared withquantities ofrather than aconstellationnecessary forreported thatspecificationpolitical and&nbsp;&nbsp;<references tothe same yearGovernment ofgeneration ofhave not beenseveral yearscommitment to\t\t<ul class=\"visualization19th century,practitionersthat he wouldand continuedoccupation ofis defined ascentre of thethe amount of><div style=\"equivalent ofdifferentiatebrought aboutmargin-left: automaticallythought of asSome of these\n<div class=\"input class=\"replaced withis one of theeducation andinfluenced byreputation as\n<meta name=\"accommodation</div>\n</div>large part ofInstitute forthe so-called against the In this case,was appointedclaimed to beHowever, thisDepartment ofthe remainingeffect on theparticularly deal with the\n<div style=\"almost alwaysare currentlyexpression ofphilosophy offor more thancivilizationson the islandselectedIndexcan result in\" value=\"\" />the structure /></a></div>Many of thesecaused by theof the Unitedspan class=\"mcan be tracedis related tobecame one ofis frequentlyliving in thetheoreticallyFollowing theRevolutionarygovernment inis determinedthe politicalintroduced insufficient todescription\">short storiesseparation ofas to whetherknown for itswas initiallydisplay:blockis an examplethe principalconsists of arecognized as/body></html>a substantialreconstructedhead of stateresistance toundergraduateThere are twogravitationalare describedintentionallyserved as theclass=\"headeropposition tofundamentallydominated theand the otheralliance withwas forced torespectively,and politicalin support ofpeople in the20th century.and publishedloadChartbeatto understandmember statesenvironmentalfirst half ofcountries andarchitecturalbe consideredcharacterizedclearIntervalauthoritativeFederation ofwas succeededand there area consequencethe Presidentalso includedfree softwaresuccession ofdeveloped thewas destroyedaway from the;\n</script>\n<although theyfollowed by amore powerfulresulted in aUniversity ofHowever, manythe presidentHowever, someis thought tountil the endwas announcedare importantalso includes><input type=the center of DO NOT ALTERused to referthemes/?sort=that had beenthe basis forhas developedin the summercomparativelydescribed thesuch as thosethe resultingis impossiblevarious otherSouth Africanhave the sameeffectivenessin which case; text-align:structure and; background:regarding thesupported theis also knownstyle=\"marginincluding thebahasa Melayunorsk bokmC%lnorsk nynorskslovenE!D\rinainternacionalcalificaciC3ncomunicaciC3nconstrucciC3n\"><div class=\"disambiguationDomainName', 'administrationsimultaneouslytransportationInternational margin-bottom:responsibility<![endif]-->\n</><meta name=\"implementationinfrastructurerepresentationborder-bottom:</head>\n<body>=http%3A%2F%2F<form method=\"method=\"post\" /favicon.ico\" });\n</script>\n.setAttribute(Administration= new Array();<![endif]-->\r\ndisplay:block;Unfortunately,\">&nbsp;</div>/favicon.ico\">='stylesheet' identification, for example,<li><a href=\"/an alternativeas a result ofpt\"></script>\ntype=\"submit\" \n(function() {recommendationform action=\"/transformationreconstruction.style.display According to hidden\" name=\"along with thedocument.body.approximately Communicationspost\" action=\"meaning &quot;--<![endif]-->Prime Ministercharacteristic</a> <a class=the history of onmouseover=\"the governmenthref=\"https://was originallywas introducedclassificationrepresentativeare considered<![endif]-->\n\ndepends on theUniversity of in contrast to placeholder=\"in the case ofinternational constitutionalstyle=\"border-: function() {Because of the-strict.dtd\">\n<table class=\"accompanied byaccount of the<script src=\"/nature of the the people in in addition tos); js.id = id\" width=\"100%\"regarding the Roman Catholican independentfollowing the .gif\" width=\"1the following discriminationarchaeologicalprime minister.js\"></script>combination of marginwidth=\"createElement(w.attachEvent(</a></td></tr>src=\"https://aIn particular, align=\"left\" Czech RepublicUnited Kingdomcorrespondenceconcluded that.html\" title=\"(function () {comes from theapplication of<span class=\"sbelieved to beement('script'</a>\n</li>\n<livery different><span class=\"option value=\"(also known as\t<li><a href=\"><input name=\"separated fromreferred to as valign=\"top\">founder of theattempting to carbon dioxide\n\n<div class=\"class=\"search-/body>\n</html>opportunity tocommunications</head>\r\n<body style=\"width:Tia:?ng Via;\u0007tchanges in theborder-color:#0\" border=\"0\" </span></div><was discovered\" type=\"text\" );\n</script>\n\nDepartment of ecclesiasticalthere has beenresulting from</body></html>has never beenthe first timein response toautomatically </div>\n\n<div iwas consideredpercent of the\" /></a></div>collection of descended fromsection of theaccept-charsetto be confusedmember of the padding-right:translation ofinterpretation href='http://whether or notThere are alsothere are manya small numberother parts ofimpossible to class=\"buttonlocated in the. However, theand eventuallyAt the end of because of itsrepresents the<form action=\" method=\"post\"it is possiblemore likely toan increase inhave also beencorresponds toannounced thatalign=\"right\">many countriesfor many yearsearliest knownbecause it waspt\"></script>\r valign=\"top\" inhabitants offollowing year\r\n<div class=\"million peoplecontroversial concerning theargue that thegovernment anda reference totransferred todescribing the style=\"color:although therebest known forsubmit\" name=\"multiplicationmore than one recognition ofCouncil of theedition of the <meta name=\"Entertainment away from the ;margin-right:at the time ofinvestigationsconnected withand many otheralthough it isbeginning with <span class=\"descendants of<span class=\"i align=\"right\"</head>\n<body aspects of thehas since beenEuropean Unionreminiscent ofmore difficultVice Presidentcomposition ofpassed throughmore importantfont-size:11pxexplanation ofthe concept ofwritten in the\t<span class=\"is one of the resemblance toon the groundswhich containsincluding the defined by thepublication ofmeans that theoutside of thesupport of the<input class=\"<span class=\"t(Math.random()most prominentdescription ofConstantinoplewere published<div class=\"seappears in the1\" height=\"1\" most importantwhich includeswhich had beendestruction ofthe population\n\t<div class=\"possibility ofsometimes usedappear to havesuccess of theintended to bepresent in thestyle=\"clear:b\r\n</script>\r\n<was founded ininterview with_id\" content=\"capital of the\r\n<link rel=\"srelease of thepoint out thatxMLHttpRequestand subsequentsecond largestvery importantspecificationssurface of theapplied to theforeign policy_setDomainNameestablished inis believed toIn addition tomeaning of theis named afterto protect theis representedDeclaration ofmore efficientClassificationother forms ofhe returned to<span class=\"cperformance of(function() {\rif and only ifregions of theleading to therelations withUnited Nationsstyle=\"height:other than theype\" content=\"Association of\n</head>\n<bodylocated on theis referred to(including theconcentrationsthe individualamong the mostthan any other/>\n<link rel=\" return false;the purpose ofthe ability to;color:#fff}\n.\n<span class=\"the subject ofdefinitions of>\r\n<link rel=\"claim that thehave developed<table width=\"celebration ofFollowing the to distinguish<span class=\"btakes place inunder the namenoted that the><![endif]-->\nstyle=\"margin-instead of theintroduced thethe process ofincreasing thedifferences inestimated thatespecially the/div><div id=\"was eventuallythroughout histhe differencesomething thatspan></span></significantly ></script>\r\n\r\nenvironmental to prevent thehave been usedespecially forunderstand theis essentiallywere the firstis the largesthave been made\" src=\"http://interpreted assecond half ofcrolling=\"no\" is composed ofII, Holy Romanis expected tohave their owndefined as thetraditionally have differentare often usedto ensure thatagreement withcontaining theare frequentlyinformation onexample is theresulting in a</a></li></ul> class=\"footerand especiallytype=\"button\" </span></span>which included>\n<meta name=\"considered thecarried out byHowever, it isbecame part ofin relation topopular in thethe capital ofwas officiallywhich has beenthe History ofalternative todifferent fromto support thesuggested thatin the process <div class=\"the foundationbecause of hisconcerned withthe universityopposed to thethe context of<span class=\"ptext\" name=\"q\"\t\t<div class=\"the scientificrepresented bymathematicianselected by thethat have been><div class=\"cdiv id=\"headerin particular,converted into);\n</script>\n<philosophical srpskohrvatskitia:?ng Via;\u0007tP Q\u0003Q\u0001Q\u0001P:P8P9Q\u0000Q\u0003Q\u0001Q\u0001P:P8P9investigaciC3nparticipaciC3nP:P>Q\u0002P>Q\u0000Q\u000BP5P>P1P;P0Q\u0001Q\u0002P8P:P>Q\u0002P>Q\u0000Q\u000BP9Q\u0007P5P;P>P2P5P:Q\u0001P8Q\u0001Q\u0002P5P<Q\u000BP\u001DP>P2P>Q\u0001Q\u0002P8P:P>Q\u0002P>Q\u0000Q\u000BQ\u0005P>P1P;P0Q\u0001Q\u0002Q\u000CP2Q\u0000P5P<P5P=P8P:P>Q\u0002P>Q\u0000P0Q\u000FQ\u0001P5P3P>P4P=Q\u000FQ\u0001P:P0Q\u0007P0Q\u0002Q\u000CP=P>P2P>Q\u0001Q\u0002P8P#P:Q\u0000P0P8P=Q\u000BP2P>P?Q\u0000P>Q\u0001Q\u000BP:P>Q\u0002P>Q\u0000P>P9Q\u0001P4P5P;P0Q\u0002Q\u000CP?P>P<P>Q\tQ\u000CQ\u000EQ\u0001Q\u0000P5P4Q\u0001Q\u0002P2P>P1Q\u0000P0P7P>P<Q\u0001Q\u0002P>Q\u0000P>P=Q\u000BQ\u0003Q\u0007P0Q\u0001Q\u0002P8P5Q\u0002P5Q\u0007P5P=P8P5P\u0013P;P0P2P=P0Q\u000FP8Q\u0001Q\u0002P>Q\u0000P8P8Q\u0001P8Q\u0001Q\u0002P5P<P0Q\u0000P5Q\u0008P5P=P8Q\u000FP!P:P0Q\u0007P0Q\u0002Q\u000CP?P>Q\rQ\u0002P>P<Q\u0003Q\u0001P;P5P4Q\u0003P5Q\u0002Q\u0001P:P0P7P0Q\u0002Q\u000CQ\u0002P>P2P0Q\u0000P>P2P:P>P=P5Q\u0007P=P>Q\u0000P5Q\u0008P5P=P8P5P:P>Q\u0002P>Q\u0000P>P5P>Q\u0000P3P0P=P>P2P:P>Q\u0002P>Q\u0000P>P<P P5P:P;P0P<P0X'Y\u0004Y\u0005Y\u0006X*X/Y\tY\u0005Y\u0006X*X/Y\nX'X*X'Y\u0004Y\u0005Y\u0008X6Y\u0008X9X'Y\u0004X(X1X'Y\u0005X,X'Y\u0004Y\u0005Y\u0008X'Y\u0002X9X'Y\u0004X1X3X'X&Y\u0004Y\u0005X4X'X1Y\u0003X'X*X'Y\u0004X#X9X6X'X!X'Y\u0004X1Y\nX'X6X)X'Y\u0004X*X5Y\u0005Y\nY\u0005X'Y\u0004X'X9X6X'X!X'Y\u0004Y\u0006X*X'X&X,X'Y\u0004X#Y\u0004X9X'X(X'Y\u0004X*X3X,Y\nY\u0004X'Y\u0004X#Y\u0002X3X'Y\u0005X'Y\u0004X6X:X7X'X*X'Y\u0004Y\u0001Y\nX/Y\nY\u0008X'Y\u0004X*X1X-Y\nX(X'Y\u0004X,X/Y\nX/X)X'Y\u0004X*X9Y\u0004Y\nY\u0005X'Y\u0004X#X.X(X'X1X'Y\u0004X'Y\u0001Y\u0004X'Y\u0005X'Y\u0004X#Y\u0001Y\u0004X'Y\u0005X'Y\u0004X*X'X1Y\nX.X'Y\u0004X*Y\u0002Y\u0006Y\nX)X'Y\u0004X'Y\u0004X9X'X(X'Y\u0004X.Y\u0008X'X7X1X'Y\u0004Y\u0005X,X*Y\u0005X9X'Y\u0004X/Y\nY\u0003Y\u0008X1X'Y\u0004X3Y\nX'X-X)X9X(X/X'Y\u0004Y\u0004Y\u0007X'Y\u0004X*X1X(Y\nX)X'Y\u0004X1Y\u0008X'X(X7X'Y\u0004X#X/X(Y\nX)X'Y\u0004X'X.X(X'X1X'Y\u0004Y\u0005X*X-X/X)X'Y\u0004X'X:X'Y\u0006Y\ncursor:pointer;</title>\n<meta \" href=\"http://\"><span class=\"members of the window.locationvertical-align:/a> | <a href=\"<!doctype html>media=\"screen\" <option value=\"favicon.ico\" />\n\t\t<div class=\"characteristics\" method=\"get\" /body>\n</html>\nshortcut icon\" document.write(padding-bottom:representativessubmit\" value=\"align=\"center\" throughout the science fiction\n <div class=\"submit\" class=\"one of the most valign=\"top\"><was established);\r\n</script>\r\nreturn false;\">).style.displaybecause of the document.cookie<form action=\"/}body{margin:0;Encyclopedia ofversion of the .createElement(name\" content=\"</div>\n</div>\n\nadministrative </body>\n</html>history of the \"><input type=\"portion of the as part of the &nbsp;<a href=\"other countries\">\n<div class=\"</span></span><In other words,display: block;control of the introduction of/>\n<meta name=\"as well as the in recent years\r\n\t<div class=\"</div>\n\t</div>\ninspired by thethe end of the compatible withbecame known as style=\"margin:.js\"></script>< International there have beenGerman language style=\"color:#Communist Partyconsistent withborder=\"0\" cell marginheight=\"the majority of\" align=\"centerrelated to the many different Orthodox Churchsimilar to the />\n<link rel=\"swas one of the until his death})();\n</script>other languagescompared to theportions of thethe Netherlandsthe most commonbackground:url(argued that thescrolling=\"no\" included in theNorth American the name of theinterpretationsthe traditionaldevelopment of frequently useda collection ofvery similar tosurrounding theexample of thisalign=\"center\">would have beenimage_caption =attached to thesuggesting thatin the form of involved in theis derived fromnamed after theIntroduction torestrictions on style=\"width: can be used to the creation ofmost important information andresulted in thecollapse of theThis means thatelements of thewas replaced byanalysis of theinspiration forregarded as themost successfulknown as &quot;a comprehensiveHistory of the were consideredreturned to theare referred toUnsourced image>\n\t<div class=\"consists of thestopPropagationinterest in theavailability ofappears to haveelectromagneticenableServices(function of theIt is important</script></div>function(){var relative to theas a result of the position ofFor example, in method=\"post\" was followed by&amp;mdash; thethe applicationjs\"></script>\r\nul></div></div>after the deathwith respect tostyle=\"padding:is particularlydisplay:inline; type=\"submit\" is divided intod8-f\u0016\u0007 (g.\u0000d=\u0013)responsabilidadadministraciC3ninternacionalescorrespondiente`$\t`$*`$/`%\u000B`$\u0017`$*`%\u0002`$0`%\r`$5`$9`$.`$>`$0`%\u0007`$2`%\u000B`$\u0017`%\u000B`$\u0002`$\u001A`%\u0001`$(`$>`$5`$2`%\u0007`$\u0015`$?`$(`$8`$0`$\u0015`$>`$0`$*`%\u0001`$2`$?`$8`$\u0016`%\u000B`$\u001C`%\u0007`$\u0002`$\u001A`$>`$9`$?`$\u000F`$-`%\u0007`$\u001C`%\u0007`$\u0002`$6`$>`$.`$?`$2`$9`$.`$>`$0`%\u0000`$\u001C`$>`$\u0017`$0`$#`$,`$(`$>`$(`%\u0007`$\u0015`%\u0001`$.`$>`$0`$,`%\r`$2`%\t`$\u0017`$.`$>`$2`$?`$\u0015`$.`$9`$?`$2`$>`$*`%\u0003`$7`%\r`$ `$,`$\"`$<`$$`%\u0007`$-`$>`$\u001C`$*`$>`$\u0015`%\r`$2`$?`$\u0015`$\u001F`%\r`$0`%\u0007`$(`$\u0016`$?`$2`$>`$+`$&`%\u000C`$0`$>`$(`$.`$>`$.`$2`%\u0007`$.`$$`$&`$>`$(`$,`$>`$\u001C`$>`$0`$5`$?`$\u0015`$>`$8`$\u0015`%\r`$/`%\u000B`$\u0002`$\u001A`$>`$9`$$`%\u0007`$*`$9`%\u0001`$\u0001`$\u001A`$,`$$`$>`$/`$>`$8`$\u0002`$5`$>`$&`$&`%\u0007`$\u0016`$(`%\u0007`$*`$?`$\u001B`$2`%\u0007`$5`$?`$6`%\u0007`$7`$0`$>`$\u001C`%\r`$/`$\t`$$`%\r`$$`$0`$.`%\u0001`$\u0002`$,`$\u0008`$&`%\u000B`$(`%\u000B`$\u0002`$\t`$*`$\u0015`$0`$#`$*`$\"`$<`%\u0007`$\u0002`$8`%\r`$%`$?`$$`$+`$?`$2`%\r`$.`$.`%\u0001`$\u0016`%\r`$/`$\u0005`$\u001A`%\r`$\u001B`$>`$\u001B`%\u0002`$\u001F`$$`%\u0000`$8`$\u0002`$\u0017`%\u0000`$$`$\u001C`$>`$\u000F`$\u0017`$>`$5`$?`$-`$>`$\u0017`$\u0018`$#`%\r`$\u001F`%\u0007`$&`%\u0002`$8`$0`%\u0007`$&`$?`$(`%\u000B`$\u0002`$9`$$`%\r`$/`$>`$8`%\u0007`$\u0015`%\r`$8`$\u0017`$>`$\u0002`$'`%\u0000`$5`$?`$6`%\r`$5`$0`$>`$$`%\u0007`$\u0002`$&`%\u0008`$\u001F`%\r`$8`$(`$\u0015`%\r`$6`$>`$8`$>`$.`$(`%\u0007`$\u0005`$&`$>`$2`$$`$,`$?`$\u001C`$2`%\u0000`$*`%\u0001`$0`%\u0002`$7`$9`$?`$\u0002`$&`%\u0000`$.`$?`$$`%\r`$0`$\u0015`$5`$?`$$`$>`$0`%\u0001`$*`$/`%\u0007`$8`%\r`$%`$>`$(`$\u0015`$0`%\u000B`$!`$<`$.`%\u0001`$\u0015`%\r`$$`$/`%\u000B`$\u001C`$(`$>`$\u0015`%\u0003`$*`$/`$>`$*`%\u000B`$8`%\r`$\u001F`$\u0018`$0`%\u0007`$2`%\u0002`$\u0015`$>`$0`%\r`$/`$5`$?`$\u001A`$>`$0`$8`%\u0002`$\u001A`$(`$>`$.`%\u0002`$2`%\r`$/`$&`%\u0007`$\u0016`%\u0007`$\u0002`$9`$.`%\u0007`$6`$>`$8`%\r`$\u0015`%\u0002`$2`$.`%\u0008`$\u0002`$(`%\u0007`$$`%\u0008`$/`$>`$0`$\u001C`$?`$8`$\u0015`%\u0007rss+xml\" title=\"-type\" content=\"title\" content=\"at the same time.js\"></script>\n<\" method=\"post\" </span></a></li>vertical-align:t/jquery.min.js\">.click(function( style=\"padding-})();\n</script>\n</span><a href=\"<a href=\"http://); return false;text-decoration: scrolling=\"no\" border-collapse:associated with Bahasa IndonesiaEnglish language<text xml:space=.gif\" border=\"0\"</body>\n</html>\noverflow:hidden;img src=\"http://addEventListenerresponsible for s.js\"></script>\n/favicon.ico\" />operating system\" style=\"width:1target=\"_blank\">State Universitytext-align:left;\ndocument.write(, including the around the world);\r\n</script>\r\n<\" style=\"height:;overflow:hiddenmore informationan internationala member of the one of the firstcan be found in </div>\n\t\t</div>\ndisplay: none;\">\" />\n<link rel=\"\n (function() {the 15th century.preventDefault(large number of Byzantine Empire.jpg|thumb|left|vast majority ofmajority of the align=\"center\">University Pressdominated by theSecond World Wardistribution of style=\"position:the rest of the characterized by rel=\"nofollow\">derives from therather than the a combination ofstyle=\"width:100English-speakingcomputer scienceborder=\"0\" alt=\"the existence ofDemocratic Party\" style=\"margin-For this reason,.js\"></script>\n\tsByTagName(s)[0]js\"></script>\r\n<.js\"></script>\r\nlink rel=\"icon\" ' alt='' class='formation of theversions of the </a></div></div>/page>\n <page>\n<div class=\"contbecame the firstbahasa Indonesiaenglish (simple)N\u0015N;N;N7N=N9N:N,Q\u0005Q\u0000P2P0Q\u0002Q\u0001P:P8P:P>P<P?P0P=P8P8Q\u000FP2P;Q\u000FP5Q\u0002Q\u0001Q\u000FP\u0014P>P1P0P2P8Q\u0002Q\u000CQ\u0007P5P;P>P2P5P:P0Q\u0000P0P7P2P8Q\u0002P8Q\u000FP\u0018P=Q\u0002P5Q\u0000P=P5Q\u0002P\u001EQ\u0002P2P5Q\u0002P8Q\u0002Q\u000CP=P0P?Q\u0000P8P<P5Q\u0000P8P=Q\u0002P5Q\u0000P=P5Q\u0002P:P>Q\u0002P>Q\u0000P>P3P>Q\u0001Q\u0002Q\u0000P0P=P8Q\u0006Q\u000BP:P0Q\u0007P5Q\u0001Q\u0002P2P5Q\u0003Q\u0001P;P>P2P8Q\u000FQ\u0005P?Q\u0000P>P1P;P5P<Q\u000BP?P>P;Q\u0003Q\u0007P8Q\u0002Q\u000CQ\u000FP2P;Q\u000FQ\u000EQ\u0002Q\u0001Q\u000FP=P0P8P1P>P;P5P5P:P>P<P?P0P=P8Q\u000FP2P=P8P<P0P=P8P5Q\u0001Q\u0000P5P4Q\u0001Q\u0002P2P0X'Y\u0004Y\u0005Y\u0008X'X6Y\nX9X'Y\u0004X1X&Y\nX3Y\nX)X'Y\u0004X'Y\u0006X*Y\u0002X'Y\u0004Y\u0005X4X'X1Y\u0003X'X*Y\u0003X'Y\u0004X3Y\nX'X1X'X*X'Y\u0004Y\u0005Y\u0003X*Y\u0008X(X)X'Y\u0004X3X9Y\u0008X/Y\nX)X'X-X5X'X&Y\nX'X*X'Y\u0004X9X'Y\u0004Y\u0005Y\nX)X'Y\u0004X5Y\u0008X*Y\nX'X*X'Y\u0004X'Y\u0006X*X1Y\u0006X*X'Y\u0004X*X5X'Y\u0005Y\nY\u0005X'Y\u0004X%X3Y\u0004X'Y\u0005Y\nX'Y\u0004Y\u0005X4X'X1Y\u0003X)X'Y\u0004Y\u0005X1X&Y\nX'X*robots\" content=\"<div id=\"footer\">the United States<img src=\"http://.jpg|right|thumb|.js\"></script>\r\n<location.protocolframeborder=\"0\" s\" />\n<meta name=\"</a></div></div><font-weight:bold;&quot; and &quot;depending on the margin:0;padding:\" rel=\"nofollow\" President of the twentieth centuryevision>\n </pageInternet Explorera.async = true;\r\ninformation about<div id=\"header\">\" action=\"http://<a href=\"https://<div id=\"content\"</div>\r\n</div>\r\n<derived from the <img src='http://according to the \n</body>\n</html>\nstyle=\"font-size:script language=\"Arial, Helvetica,</a><span class=\"</script><script political partiestd></tr></table><href=\"http://www.interpretation ofrel=\"stylesheet\" document.write('<charset=\"utf-8\">\nbeginning of the revealed that thetelevision series\" rel=\"nofollow\"> target=\"_blank\">claiming that thehttp%3A%2F%2Fwww.manifestations ofPrime Minister ofinfluenced by theclass=\"clearfix\">/div>\r\n</div>\r\n\r\nthree-dimensionalChurch of Englandof North Carolinasquare kilometres.addEventListenerdistinct from thecommonly known asPhonetic Alphabetdeclared that thecontrolled by theBenjamin Franklinrole-playing gamethe University ofin Western Europepersonal computerProject Gutenbergregardless of thehas been proposedtogether with the></li><li class=\"in some countriesmin.js\"></script>of the populationofficial language<img src=\"images/identified by thenatural resourcesclassification ofcan be consideredquantum mechanicsNevertheless, themillion years ago</body>\r\n</html>\rN\u0015N;N;N7N=N9N:N,\ntake advantage ofand, according toattributed to theMicrosoft Windowsthe first centuryunder the controldiv class=\"headershortly after thenotable exceptiontens of thousandsseveral differentaround the world.reaching militaryisolated from theopposition to thethe Old TestamentAfrican Americansinserted into theseparate from themetropolitan areamakes it possibleacknowledged thatarguably the mosttype=\"text/css\">\nthe InternationalAccording to the pe=\"text/css\" />\ncoincide with thetwo-thirds of theDuring this time,during the periodannounced that hethe internationaland more recentlybelieved that theconsciousness andformerly known assurrounded by thefirst appeared inoccasionally usedposition:absolute;\" target=\"_blank\" position:relative;text-align:center;jax/libs/jquery/1.background-color:#type=\"application/anguage\" content=\"<meta http-equiv=\"Privacy Policy</a>e(\"%3Cscript src='\" target=\"_blank\">On the other hand,.jpg|thumb|right|2</div><div class=\"<div style=\"float:nineteenth century</body>\r\n</html>\r\n<img src=\"http://s;text-align:centerfont-weight: bold; According to the difference between\" frameborder=\"0\" \" style=\"position:link href=\"http://html4/loose.dtd\">\nduring this period</td></tr></table>closely related tofor the first time;font-weight:bold;input type=\"text\" <span style=\"font-onreadystatechange\t<div class=\"cleardocument.location. For example, the a wide variety of <!DOCTYPE html>\r\n<&nbsp;&nbsp;&nbsp;\"><a href=\"http://style=\"float:left;concerned with the=http%3A%2F%2Fwww.in popular culturetype=\"text/css\" />it is possible to Harvard Universitytylesheet\" href=\"/the main characterOxford University name=\"keywords\" cstyle=\"text-align:the United Kingdomfederal government<div style=\"margin depending on the description of the<div class=\"header.min.js\"></script>destruction of theslightly differentin accordance withtelecommunicationsindicates that theshortly thereafterespecially in the European countriesHowever, there aresrc=\"http://staticsuggested that the\" src=\"http://www.a large number of Telecommunications\" rel=\"nofollow\" tHoly Roman Emperoralmost exclusively\" border=\"0\" alt=\"Secretary of Stateculminating in theCIA World Factbookthe most importantanniversary of thestyle=\"background-<li><em><a href=\"/the Atlantic Oceanstrictly speaking,shortly before thedifferent types ofthe Ottoman Empire><img src=\"http://An Introduction toconsequence of thedeparture from theConfederate Statesindigenous peoplesProceedings of theinformation on thetheories have beeninvolvement in thedivided into threeadjacent countriesis responsible fordissolution of thecollaboration withwidely regarded ashis contemporariesfounding member ofDominican Republicgenerally acceptedthe possibility ofare also availableunder constructionrestoration of thethe general publicis almost entirelypasses through thehas been suggestedcomputer and videoGermanic languages according to the different from theshortly afterwardshref=\"https://www.recent developmentBoard of Directors<div class=\"search| <a href=\"http://In particular, theMultiple footnotesor other substancethousands of yearstranslation of the</div>\r\n</div>\r\n\r\n<a href=\"index.phpwas established inmin.js\"></script>\nparticipate in thea strong influencestyle=\"margin-top:represented by thegraduated from theTraditionally, theElement(\"script\");However, since the/div>\n</div>\n<div left; margin-left:protection against0; vertical-align:Unfortunately, thetype=\"image/x-icon/div>\n<div class=\" class=\"clearfix\"><div class=\"footer\t\t</div>\n\t\t</div>\nthe motion pictureP\u0011Q\nP;P3P0Q\u0000Q\u0001P:P8P1Q\nP;P3P0Q\u0000Q\u0001P:P8P$P5P4P5Q\u0000P0Q\u0006P8P8P=P5Q\u0001P:P>P;Q\u000CP:P>Q\u0001P>P>P1Q\tP5P=P8P5Q\u0001P>P>P1Q\tP5P=P8Q\u000FP?Q\u0000P>P3Q\u0000P0P<P<Q\u000BP\u001EQ\u0002P?Q\u0000P0P2P8Q\u0002Q\u000CP1P5Q\u0001P?P;P0Q\u0002P=P>P<P0Q\u0002P5Q\u0000P8P0P;Q\u000BP?P>P7P2P>P;Q\u000FP5Q\u0002P?P>Q\u0001P;P5P4P=P8P5Q\u0000P0P7P;P8Q\u0007P=Q\u000BQ\u0005P?Q\u0000P>P4Q\u0003P:Q\u0006P8P8P?Q\u0000P>P3Q\u0000P0P<P<P0P?P>P;P=P>Q\u0001Q\u0002Q\u000CQ\u000EP=P0Q\u0005P>P4P8Q\u0002Q\u0001Q\u000FP8P7P1Q\u0000P0P=P=P>P5P=P0Q\u0001P5P;P5P=P8Q\u000FP8P7P<P5P=P5P=P8Q\u000FP:P0Q\u0002P5P3P>Q\u0000P8P8P\u0010P;P5P:Q\u0001P0P=P4Q\u0000`$&`%\r`$5`$>`$0`$>`$.`%\u0008`$(`%\u0001`$\u0005`$2`$*`%\r`$0`$&`$>`$(`$-`$>`$0`$$`%\u0000`$/`$\u0005`$(`%\u0001`$&`%\u0007`$6`$9`$?`$(`%\r`$&`%\u0000`$\u0007`$\u0002`$!`$?`$/`$>`$&`$?`$2`%\r`$2`%\u0000`$\u0005`$'`$?`$\u0015`$>`$0`$5`%\u0000`$!`$?`$/`%\u000B`$\u001A`$?`$\u001F`%\r`$ `%\u0007`$8`$.`$>`$\u001A`$>`$0`$\u001C`$\u0002`$\u0015`%\r`$6`$(`$&`%\u0001`$(`$?`$/`$>`$*`%\r`$0`$/`%\u000B`$\u0017`$\u0005`$(`%\u0001`$8`$>`$0`$\u0011`$(`$2`$>`$\u0007`$(`$*`$>`$0`%\r`$\u001F`%\u0000`$6`$0`%\r`$$`%\u000B`$\u0002`$2`%\u000B`$\u0015`$8`$-`$>`$+`$<`%\r`$2`%\u0008`$6`$6`$0`%\r`$$`%\u0007`$\u0002`$*`%\r`$0`$&`%\u0007`$6`$*`%\r`$2`%\u0007`$/`$0`$\u0015`%\u0007`$\u0002`$&`%\r`$0`$8`%\r`$%`$?`$$`$?`$\t`$$`%\r`$*`$>`$&`$\t`$(`%\r`$9`%\u0007`$\u0002`$\u001A`$?`$\u001F`%\r`$ `$>`$/`$>`$$`%\r`$0`$>`$\u001C`%\r`$/`$>`$&`$>`$*`%\u0001`$0`$>`$(`%\u0007`$\u001C`%\u000B`$!`$<`%\u0007`$\u0002`$\u0005`$(`%\u0001`$5`$>`$&`$6`%\r`$0`%\u0007`$#`%\u0000`$6`$?`$\u0015`%\r`$7`$>`$8`$0`$\u0015`$>`$0`%\u0000`$8`$\u0002`$\u0017`%\r`$0`$9`$*`$0`$?`$#`$>`$.`$,`%\r`$0`$>`$\u0002`$!`$,`$\u001A`%\r`$\u001A`%\u000B`$\u0002`$\t`$*`$2`$,`%\r`$'`$.`$\u0002`$$`%\r`$0`%\u0000`$8`$\u0002`$*`$0`%\r`$\u0015`$\t`$.`%\r`$.`%\u0000`$&`$.`$>`$'`%\r`$/`$.`$8`$9`$>`$/`$$`$>`$6`$,`%\r`$&`%\u000B`$\u0002`$.`%\u0000`$!`$?`$/`$>`$\u0006`$\u0008`$*`%\u0000`$\u000F`$2`$.`%\u000B`$,`$>`$\u0007`$2`$8`$\u0002`$\u0016`%\r`$/`$>`$\u0006`$*`$0`%\u0007`$6`$(`$\u0005`$(`%\u0001`$,`$\u0002`$'`$,`$>`$\u001C`$<`$>`$0`$(`$5`%\u0000`$(`$$`$.`$*`%\r`$0`$.`%\u0001`$\u0016`$*`%\r`$0`$6`%\r`$(`$*`$0`$?`$5`$>`$0`$(`%\u0001`$\u0015`$8`$>`$(`$8`$.`$0`%\r`$%`$(`$\u0006`$/`%\u000B`$\u001C`$?`$$`$8`%\u000B`$.`$5`$>`$0X'Y\u0004Y\u0005X4X'X1Y\u0003X'X*X'Y\u0004Y\u0005Y\u0006X*X/Y\nX'X*X'Y\u0004Y\u0003Y\u0005X(Y\nY\u0008X*X1X'Y\u0004Y\u0005X4X'Y\u0007X/X'X*X9X/X/X'Y\u0004X2Y\u0008X'X1X9X/X/X'Y\u0004X1X/Y\u0008X/X'Y\u0004X%X3Y\u0004X'Y\u0005Y\nX)X'Y\u0004Y\u0001Y\u0008X*Y\u0008X4Y\u0008X(X'Y\u0004Y\u0005X3X'X(Y\u0002X'X*X'Y\u0004Y\u0005X9Y\u0004Y\u0008Y\u0005X'X*X'Y\u0004Y\u0005X3Y\u0004X3Y\u0004X'X*X'Y\u0004X,X1X'Y\u0001Y\nY\u0003X3X'Y\u0004X'X3Y\u0004X'Y\u0005Y\nX)X'Y\u0004X'X*X5X'Y\u0004X'X*keywords\" content=\"w3.org/1999/xhtml\"><a target=\"_blank\" text/html; charset=\" target=\"_blank\"><table cellpadding=\"autocomplete=\"off\" text-align: center;to last version by background-color: #\" href=\"http://www./div></div><div id=<a href=\"#\" class=\"\"><img src=\"http://cript\" src=\"http://\n<script language=\"//EN\" \"http://www.wencodeURIComponent(\" href=\"javascript:<div class=\"contentdocument.write('<scposition: absolute;script src=\"http:// style=\"margin-top:.min.js\"></script>\n</div>\n<div class=\"w3.org/1999/xhtml\" \n\r\n</body>\r\n</html>distinction between/\" target=\"_blank\"><link href=\"http://encoding=\"utf-8\"?>\nw.addEventListener?action=\"http://www.icon\" href=\"http:// style=\"background:type=\"text/css\" />\nmeta property=\"og:t<input type=\"text\" style=\"text-align:the development of tylesheet\" type=\"tehtml; charset=utf-8is considered to betable width=\"100%\" In addition to the contributed to the differences betweendevelopment of the It is important to </script>\n\n<script style=\"font-size:1></span><span id=gbLibrary of Congress<img src=\"http://imEnglish translationAcademy of Sciencesdiv style=\"display:construction of the.getElementById(id)in conjunction withElement('script'); <meta property=\"og:P\u0011Q\nP;P3P0Q\u0000Q\u0001P:P8\n type=\"text\" name=\">Privacy Policy</a>administered by theenableSingleRequeststyle=&quot;margin:</div></div></div><><img src=\"http://i style=&quot;float:referred to as the total population ofin Washington, D.C. style=\"background-among other things,organization of theparticipated in thethe introduction ofidentified with thefictional character Oxford University misunderstanding ofThere are, however,stylesheet\" href=\"/Columbia Universityexpanded to includeusually referred toindicating that thehave suggested thataffiliated with thecorrelation betweennumber of different></td></tr></table>Republic of Ireland\n</script>\n<script under the influencecontribution to theOfficial website ofheadquarters of thecentered around theimplications of thehave been developedFederal Republic ofbecame increasinglycontinuation of theNote, however, thatsimilar to that of capabilities of theaccordance with theparticipants in thefurther developmentunder the directionis often consideredhis younger brother</td></tr></table><a http-equiv=\"X-UA-physical propertiesof British Columbiahas been criticized(with the exceptionquestions about thepassing through the0\" cellpadding=\"0\" thousands of peopleredirects here. Forhave children under%3E%3C/script%3E\"));<a href=\"http://www.<li><a href=\"http://site_name\" content=\"text-decoration:nonestyle=\"display: none<meta http-equiv=\"X-new Date().getTime() type=\"image/x-icon\"</span><span class=\"language=\"javascriptwindow.location.href<a href=\"javascript:-->\r\n<script type=\"t<a href='http://www.hortcut icon\" href=\"</div>\r\n<div class=\"<script src=\"http://\" rel=\"stylesheet\" t</div>\n<script type=/a> <a href=\"http:// allowTransparency=\"X-UA-Compatible\" conrelationship between\n</script>\r\n<script </a></li></ul></div>associated with the programming language</a><a href=\"http://</a></li><li class=\"form action=\"http://<div style=\"display:type=\"text\" name=\"q\"<table width=\"100%\" background-position:\" border=\"0\" width=\"rel=\"shortcut icon\" h6><ul><li><a href=\" <meta http-equiv=\"css\" media=\"screen\" responsible for the \" type=\"application/\" style=\"background-html; charset=utf-8\" allowtransparency=\"stylesheet\" type=\"te\r\n<meta http-equiv=\"></span><span class=\"0\" cellspacing=\"0\">;\n</script>\n<script sometimes called thedoes not necessarilyFor more informationat the beginning of <!DOCTYPE html><htmlparticularly in the type=\"hidden\" name=\"javascript:void(0);\"effectiveness of the autocomplete=\"off\" generally considered><input type=\"text\" \"></script>\r\n<scriptthroughout the worldcommon misconceptionassociation with the</div>\n</div>\n<div cduring his lifetime,corresponding to thetype=\"image/x-icon\" an increasing numberdiplomatic relationsare often consideredmeta charset=\"utf-8\" <input type=\"text\" examples include the\"><img src=\"http://iparticipation in thethe establishment of\n</div>\n<div class=\"&amp;nbsp;&amp;nbsp;to determine whetherquite different frommarked the beginningdistance between thecontributions to theconflict between thewidely considered towas one of the firstwith varying degreeshave speculated that(document.getElementparticipating in theoriginally developedeta charset=\"utf-8\"> type=\"text/css\" />\ninterchangeably withmore closely relatedsocial and politicalthat would otherwiseperpendicular to thestyle type=\"text/csstype=\"submit\" name=\"families residing indeveloping countriescomputer programmingeconomic developmentdetermination of thefor more informationon several occasionsportuguC*s (Europeu)P#P:Q\u0000P0Q\u0017P=Q\u0001Q\u000CP:P0Q\u0003P:Q\u0000P0Q\u0017P=Q\u0001Q\u000CP:P0P P>Q\u0001Q\u0001P8P9Q\u0001P:P>P9P<P0Q\u0002P5Q\u0000P8P0P;P>P2P8P=Q\u0004P>Q\u0000P<P0Q\u0006P8P8Q\u0003P?Q\u0000P0P2P;P5P=P8Q\u000FP=P5P>P1Q\u0005P>P4P8P<P>P8P=Q\u0004P>Q\u0000P<P0Q\u0006P8Q\u000FP\u0018P=Q\u0004P>Q\u0000P<P0Q\u0006P8Q\u000FP P5Q\u0001P?Q\u0003P1P;P8P:P8P:P>P;P8Q\u0007P5Q\u0001Q\u0002P2P>P8P=Q\u0004P>Q\u0000P<P0Q\u0006P8Q\u000EQ\u0002P5Q\u0000Q\u0000P8Q\u0002P>Q\u0000P8P8P4P>Q\u0001Q\u0002P0Q\u0002P>Q\u0007P=P>X'Y\u0004Y\u0005X*Y\u0008X'X,X/Y\u0008Y\u0006X'Y\u0004X'X4X*X1X'Y\u0003X'X*X'Y\u0004X'Y\u0002X*X1X'X-X'X*html; charset=UTF-8\" setTimeout(function()display:inline-block;<input type=\"submit\" type = 'text/javascri<img src=\"http://www.\" \"http://www.w3.org/shortcut icon\" href=\"\" autocomplete=\"off\" </a></div><div class=</a></li>\n<li class=\"css\" type=\"text/css\" <form action=\"http://xt/css\" href=\"http://link rel=\"alternate\" \r\n<script type=\"text/ onclick=\"javascript:(new Date).getTime()}height=\"1\" width=\"1\" People's Republic of <a href=\"http://www.text-decoration:underthe beginning of the </div>\n</div>\n</div>\nestablishment of the </div></div></div></d#viewport{min-height:\n<script src=\"http://option><option value=often referred to as /option>\n<option valu<!DOCTYPE html>\n<!--[International Airport>\n<a href=\"http://www</a><a href=\"http://w`8 `82`8)`82`9\u0004`8\u0017`8\"a\u0003%a\u0003\u0010a\u0003 a\u0003\u0017a\u0003#a\u0003\u001Aa\u0003\u0018f-#i+\u0014d8-f\u0016\u0007 (g9\u0001i+\u0014)`$(`$?`$0`%\r`$&`%\u0007`$6`$!`$>`$\t`$(`$2`%\u000B`$!`$\u0015`%\r`$7`%\u0007`$$`%\r`$0`$\u001C`$>`$(`$\u0015`$>`$0`%\u0000`$8`$\u0002`$,`$\u0002`$'`$?`$$`$8`%\r`$%`$>`$*`$(`$>`$8`%\r`$5`%\u0000`$\u0015`$>`$0`$8`$\u0002`$8`%\r`$\u0015`$0`$#`$8`$>`$.`$\u0017`%\r`$0`%\u0000`$\u001A`$?`$\u001F`%\r`$ `%\u000B`$\u0002`$5`$?`$\u001C`%\r`$\u001E`$>`$(`$\u0005`$.`%\u0007`$0`$?`$\u0015`$>`$5`$?`$-`$?`$(`%\r`$(`$\u0017`$>`$!`$?`$/`$>`$\u0001`$\u0015`%\r`$/`%\u000B`$\u0002`$\u0015`$?`$8`%\u0001`$0`$\u0015`%\r`$7`$>`$*`$9`%\u0001`$\u0001`$\u001A`$$`%\u0000`$*`%\r`$0`$,`$\u0002`$'`$(`$\u001F`$?`$*`%\r`$*`$#`%\u0000`$\u0015`%\r`$0`$?`$\u0015`%\u0007`$\u001F`$*`%\r`$0`$>`$0`$\u0002`$-`$*`%\r`$0`$>`$*`%\r`$$`$.`$>`$2`$?`$\u0015`%\u000B`$\u0002`$0`$+`$<`%\r`$$`$>`$0`$(`$?`$0`%\r`$.`$>`$#`$2`$?`$.`$?`$\u001F`%\u0007`$!description\" content=\"document.location.prot.getElementsByTagName(<!DOCTYPE html>\n<html <meta charset=\"utf-8\">:url\" content=\"http://.css\" rel=\"stylesheet\"style type=\"text/css\">type=\"text/css\" href=\"w3.org/1999/xhtml\" xmltype=\"text/javascript\" method=\"get\" action=\"link rel=\"stylesheet\" = document.getElementtype=\"image/x-icon\" />cellpadding=\"0\" cellsp.css\" type=\"text/css\" </a></li><li><a href=\"\" width=\"1\" height=\"1\"\"><a href=\"http://www.style=\"display:none;\">alternate\" type=\"appli-//W3C//DTD XHTML 1.0 ellspacing=\"0\" cellpad type=\"hidden\" value=\"/a>&nbsp;<span role=\"s\n<input type=\"hidden\" language=\"JavaScript\" document.getElementsBg=\"0\" cellspacing=\"0\" ype=\"text/css\" media=\"type='text/javascript'with the exception of ype=\"text/css\" rel=\"st height=\"1\" width=\"1\" ='+encodeURIComponent(<link rel=\"alternate\" \nbody, tr, input, textmeta name=\"robots\" conmethod=\"post\" action=\">\n<a href=\"http://www.css\" rel=\"stylesheet\" </div></div><div classlanguage=\"javascript\">aria-hidden=\"true\">B7<ript\" type=\"text/javasl=0;})();\n(function(){background-image: url(/a></li><li><a href=\"h\t\t<li><a href=\"http://ator\" aria-hidden=\"tru> <a href=\"http://www.language=\"javascript\" /option>\n<option value/div></div><div class=rator\" aria-hidden=\"tre=(new Date).getTime()portuguC*s (do Brasil)P>Q\u0000P3P0P=P8P7P0Q\u0006P8P8P2P>P7P<P>P6P=P>Q\u0001Q\u0002Q\u000CP>P1Q\u0000P0P7P>P2P0P=P8Q\u000FQ\u0000P5P3P8Q\u0001Q\u0002Q\u0000P0Q\u0006P8P8P2P>P7P<P>P6P=P>Q\u0001Q\u0002P8P>P1Q\u000FP7P0Q\u0002P5P;Q\u000CP=P0<!DOCTYPE html PUBLIC \"nt-Type\" content=\"text/<meta http-equiv=\"Conteransitional//EN\" \"http:<html xmlns=\"http://www-//W3C//DTD XHTML 1.0 TDTD/xhtml1-transitional//www.w3.org/TR/xhtml1/pe = 'text/javascript';<meta name=\"descriptionparentNode.insertBefore<input type=\"hidden\" najs\" type=\"text/javascri(document).ready(functiscript type=\"text/javasimage\" content=\"http://UA-Compatible\" content=tml; charset=utf-8\" />\nlink rel=\"shortcut icon<link rel=\"stylesheet\" </script>\n<script type== document.createElemen<a target=\"_blank\" href= document.getElementsBinput type=\"text\" name=a.type = 'text/javascrinput type=\"hidden\" namehtml; charset=utf-8\" />dtd\">\n<html xmlns=\"http-//W3C//DTD HTML 4.01 TentsByTagName('script')input type=\"hidden\" nam<script type=\"text/javas\" style=\"display:none;\">document.getElementById(=document.createElement(' type='text/javascript'input type=\"text\" name=\"d.getElementsByTagName(snical\" href=\"http://www.C//DTD HTML 4.01 Transit<style type=\"text/css\">\n\n<style type=\"text/css\">ional.dtd\">\n<html xmlns=http-equiv=\"Content-Typeding=\"0\" cellspacing=\"0\"html; charset=utf-8\" />\n style=\"display:none;\"><<li><a href=\"http://www. type='text/javascript'>P4P5Q\u000FQ\u0002P5P;Q\u000CP=P>Q\u0001Q\u0002P8Q\u0001P>P>Q\u0002P2P5Q\u0002Q\u0001Q\u0002P2P8P8P?Q\u0000P>P8P7P2P>P4Q\u0001Q\u0002P2P0P1P5P7P>P?P0Q\u0001P=P>Q\u0001Q\u0002P8`$*`%\u0001`$8`%\r`$$`$?`$\u0015`$>`$\u0015`$>`$\u0002`$\u0017`%\r`$0`%\u0007`$8`$\t`$(`%\r`$9`%\u000B`$\u0002`$(`%\u0007`$5`$?`$'`$>`$(`$8`$-`$>`$+`$?`$\u0015`%\r`$8`$?`$\u0002`$\u0017`$8`%\u0001`$0`$\u0015`%\r`$7`$?`$$`$\u0015`%\t`$*`%\u0000`$0`$>`$\u0007`$\u001F`$5`$?`$\u001C`%\r`$\u001E`$>`$*`$(`$\u0015`$>`$0`%\r`$0`$5`$>`$\u0008`$8`$\u0015`%\r`$0`$?`$/`$$`$>";
+ private static final String SKIP_FLIP = "\u06F7%\u018C'T%\u0085'W%\u00D7%O%g%\u00A6&\u0193%\u01E5&>&*&'&^&\u0088\u0178\u0C3E&\u01AD&\u0192&)&^&%&'&\u0082&P&1&\u00B1&3&]&m&u&E&t&C&\u00CF&V&V&/&>&6&\u0F76\u177Co&p&@&E&M&P&x&@&F&e&\u00CC&7&:&(&D&0&C&)&.&F&-&1&(&L&F&1\u025E*\u03EA\u21F3&\u1372&K&;&)&E&H&P&0&?&9&V&\u0081&-&v&a&,&E&)&?&=&'&'&B&\u0D2E&\u0503&\u0316*&*8&%&%&&&%,)&\u009A&>&\u0086&7&]&F&2&>&J&6&n&2&%&?&\u008E&2&6&J&g&-&0&,&*&J&*&O&)&6&(&<&B&N&.&P&@&2&.&W&M&%\u053C\u0084(,(<&,&\u03DA&\u18C7&-&,(%&(&%&(\u013B0&X&D&\u0081&j&'&J&(&.&B&3&Z&R&h&3&E&E&<\u00C6-\u0360\u1EF3&%8?&@&,&Z&@&0&J&,&^&x&_&6&C&6&C\u072C\u2A25&f&-&-&-&-&,&J&2&8&z&8&C&Y&8&-&d&\u1E78\u00CC-&7&1&F&7&t&W&7&I&.&.&^&=\u0F9C\u19D3&8(>&/&/&\u077B')'\u1065')'%@/&0&%\u043E\u09C0*&*@&C\u053D\u05D4\u0274\u05EB4\u0DD7\u071A\u04D16\u0D84&/\u0178\u0303Z&*%\u0246\u03FF&\u0134&1\u00A8\u04B4\u0174";
+
+ private static void unpackDictionaryData(
+ ByteBuffer dictionary, String data0, String data1, String skipFlip) {
+ // Initialize lower 7 bits of every byte in the dictionary.
+ byte[] dict = Utils.toUsAsciiBytes(data0 + data1);
+ if (dict.length != dictionary.capacity()) {
+ throw new RuntimeException("Corrupted brotli dictionary");
+ }
+
+ // Toggle high bit using run-length delta encoded "skipFlip".
+ int offset = 0;
+ int n = skipFlip.length();
+ for (int i = 0; i < n; i += 2) {
+ int skip = skipFlip.charAt(i) - 36;
+ int flip = skipFlip.charAt(i + 1) - 36;
+ offset += skip;
+ for (int j = 0; j < flip; ++j) {
+ dict[offset] |= 0x80;
+ offset++;
+ }
+ }
+
+ dictionary.put(dict);
+ }
+
+ static {
+ ByteBuffer dictionary = ByteBuffer.allocateDirect(122784);
+ unpackDictionaryData(dictionary, DATA0, DATA1, SKIP_FLIP);
+ Utils.flipBuffer(dictionary);
+ Dictionary.setData(dictionary.asReadOnlyBuffer());
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/DictionaryTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/DictionaryTest.java
new file mode 100644
index 000000000..b2ea04b10
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/DictionaryTest.java
@@ -0,0 +1,38 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+import static org.junit.Assert.assertEquals;
+
+import java.nio.ByteBuffer;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for {@link Dictionary}.
+ */
+@RunWith(JUnit4.class)
+public class DictionaryTest {
+
+ private static long crc64(ByteBuffer data) {
+ long crc = -1;
+ for (int i = 0; i < data.capacity(); ++i) {
+ long c = (crc ^ (long) (data.get(i) & 0xFF)) & 0xFF;
+ for (int k = 0; k < 8; k++) {
+ c = (c >>> 1) ^ (-(c & 1L) & -3932672073523589310L);
+ }
+ crc = c ^ (crc >>> 8);
+ }
+ return ~crc;
+ }
+
+ @Test
+ public void testGetData() {
+ assertEquals(37084801881332636L, crc64(Dictionary.getData()));
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/EagerStreamTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/EagerStreamTest.java
new file mode 100755
index 000000000..8e079c042
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/EagerStreamTest.java
@@ -0,0 +1,386 @@
+/* Copyright 2018 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayInputStream;
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for {@link Decode}.
+ */
+@RunWith(JUnit4.class)
+public class EagerStreamTest {
+
+ private static final byte[] DATA = {
+ 31, 118, -122, 17, -43, -92, 84, 0, -76, 42, -80, -101, 95, -74, -104, -120, -89, -127, 30, 58,
+ -4, 11, 91, -104, -99, -81, 44, 86, 61, 108, -74, -97, 68, 32, -120, -78, 97, -107, 88, -52,
+ -22, -55, -8, -56, -106, -117, 49, 113, -106, -82, -43, -12, -11, -91, -66, 55, 68, 118, -127,
+ -77, -104, -12, 103, -14, -94, -30, -112, 100, 79, -72, -42, 121, 62, -99, 76, -39, -89, 42, 58,
+ -110, 91, 65, 32, -102, -113, 49, 4, 73, 60, 122, -106, 107, 16, -123, 30, -97, 90, -102, -83,
+ -65, -90, 34, 26, -26, 52, 75, -118, 43, -47, -47, 52, 84, -10, -121, -68, -2, 20, 80, 101, 53,
+ 101, -119, -17, -111, -75, -21, -66, -96, -80, -114, 4, -65, 124, -89, -3, -25, -25, -21, -35,
+ -15, -114, 55, 14, -76, -68, 71, 9, 123, 46, 78, 67, -18, -127, 70, -93, -128, -44, -87, 3, 36,
+ -107, -3, 62, 83, 75, -123, -125, -11, 50, 46, -68, 80, 54, 9, -116, -29, 82, -14, -87, -94, 92,
+ -88, -86, -18, -1, 22, 3, 46, -98, -128, -27, 121, -56, 88, -37, 85, -43, 61, -60, 12, -122,
+ 107, -64, -27, -45, -110, 123, 60, 99, 108, 46, -29, -77, 76, 65, 100, 92, -104, 40, 63, 19, 36,
+ -89, 80, -39, 37, -95, -74, 97, 90, -109, 54, 105, -10, -38, 100, 95, 27, 36, 33, -60, 39, 100,
+ 32, -18, 93, -46, -99, 103, 127, -91, -62, 82, 76, 56, -66, -110, -16, 83, -116, -76, -9, -47,
+ -5, -32, -65, 111, 0, 55, 47, -60, -95, -56, -100, 65, 125, 38, 77, 38, -32, -62, 55, 119, 10,
+ 120, -69, 33, -111, -62, -87, 17, 102, -95, -106, 26, -50, -16, -109, 94, 83, -79, 90, 2, 42,
+ -47, 37, -124, 114, -68, 6, 104, -65, 38, -108, -114, -110, 73, -95, -83, -90, -86, -36, -48,
+ -63, -97, -120, -25, -53, 93, -77, -50, 59, -74, -9, 36, 85, 11, 76, 95, 74, -61, -9, 116, -14,
+ -38, 73, 78, 44, -92, 58, -27, -54, 38, 81, 50, -36, -46, -117, 126, 89, 53, -37, -58, -12, 61,
+ 77, -56, -85, -21, -128, 43, -111, 14, 54, 57, 116, 52, -85, 70, 88, -72, -26, 54, 109, -70,
+ -84, -13, -1, -54, 91, 81, 101, -65, 49, -48, -16, 26, -115, -39, 100, -21, 105, -121, 38, 72,
+ -115, 104, -100, 36, 120, 15, -109, 115, 64, 118, -68, -14, -26, -57, -71, 9, -118, -113, 15,
+ 94, 108, 114, 109, -14, -80, -31, -57, -6, 57, 111, -36, -92, -25, -23, -71, -61, 120, 93, -65,
+ 104, -123, -53, 35, -77, -8, -23, -31, 99, -3, 73, 75, 98, -2, -94, 73, 91, -109, -38, -78,
+ -106, -121, -17, -21, 55, 45, -26, -7, -93, 38, 59, -90, -116, 3, -68, -2, -110, 19, -96, 28,
+ -23, -39, 102, 99, 8, -82, -41, 63, 88, -70, 115, -123, -11, 111, 92, 47, -12, -16, -70, -2,
+ -29, 101, 61, -45, -57, 54, 24, -125, 20, -37, -75, 89, -56, 52, 125, 22, -68, -63, 105, -91,
+ -20, 91, 56, -99, -56, 35, -77, -78, -24, -79, 57, 5, -55, 101, -127, 75, -35, -113, -51, -103,
+ 79, 102, 16, -124, -79, -128, -45, -65, -84, -97, -91, -90, -105, 76, 90, -93, 90, -49, -41,
+ 104, 44, 81, -37, -84, 103, -120, -51, 79, -43, -114, -101, 38, -78, -94, -1, 15, 109, -62, 34,
+ -65, -127, 98, 32, 46, -72, 70, 58, -61, -55, 90, 30, -103, 5, 109, -105, -119, 81, 92, -40,
+ -75, -23, -77, 36, 18, 62, -33, -51, -38, -19, -12, 89, -101, 117, 94, 71, 127, -43, 54, 115,
+ -67, 34, -83, -115, 127, 127, 42, 126, -121, -121, -40, 56, -113, 60, -27, 30, 44, -21, 98,
+ -123, -14, 91, -69, 15, -81, 119, -101, 25, -73, 40, 105, 26, -86, -31, 86, -75, 74, 94, -74,
+ 19, -4, -20, 69, 24, 43, -5, -91, 6, -89, 52, 77, -65, -71, 82, -81, -52, 22, -61, -15, 51, 22,
+ 1, 70, -43, -3, -39, -27, 123, -13, -127, -86, 65, 51, 45, 127, -101, -27, -3, -44, -34, 75, 69,
+ 77, 71, -34, 7, -51, 93, -83, -84, -57, -38, -100, 59, -105, -1, 44, -47, 63, 96, -127, 32, -63,
+ 16, 80, -64, -127, 6, 54, 12, 44, 28, 48, -128, 4, 10, -104, 64, 3, 11, -47, 59, -79, -125, 52,
+ -16, -78, -66, 19, -6, -33, -107, -10, -4, -42, 102, -31, -32, 99, 115, -22, -96, -45, -112, 28,
+ 126, -44, -4, -47, -99, 127, -84, 37, -112, -34, 36, 1, -68, -14, -16, 55, 83, -99, 120, -69,
+ -30, 89, 48, 126, -80, -43, 15, 13, -18, 14, -4, -126, -120, -118, -11, 100, 16, 76, 17, 54,
+ -75, 114, 101, 37, 121, -23, -65, 39, 94, -48, -78, 67, -61, 75, 48, 23, -127, 83, -124, 95, -5,
+ 67, 13, 87, 18, -2, 117, -36, -121, 115, -112, -107, -54, -36, 14, -4, -68, 35, 32, 79, -118,
+ 81, 94, -56, -110, 37, -84, -121, 72, -7, -52, -40, -44, -1, 73, 123, 12, 42, -67, -87, 63, -2,
+ -100, 29, -41, 112, 98, -125, 88, 97, -56, 90, 7, -40, -111, -126, 74, 121, -95, -45, -69, 48,
+ -98, 18, -20, -124, 3, 46, -5, 26, 24, -79, 109, 4, 43, 60, 97, 96, -76, -21, 95, -52, -40, -45,
+ 2, -103, -107, -9, 79, -79, -82, -73, -51, -74, -10, 81, -77, 111, -96, -41, -120, -38, 24, -87,
+ 93, -41, 64, 72, 57, -81, -32, 60, -79, 36, -84, -89, -7, -25, 81, -98, 36, -22, -69, 86, 123,
+ 120, -16, -113, -70, 47, -125, 2, 97, 78, -91, 102, 120, -91, 5, -71, 39, 116, -12, -79, -29,
+ -9, 87, -5, -37, 87, -73, 116, -15, -10, -106, -49, -3, -21, 5, 120, 47, 72, -40, 79, -3, 85,
+ -84, -87, 57, -83, -67, -64, 122, -39, 36, 70, -27, 71, -73, 42, -100, -99, 124, -90, 90, -29,
+ -54, -115, 7, 89, -51, 9, -43, 32, 79, -104, 127, -38, 7, 93, -80, -124, 27, 96, 54, -51, -7,
+ 57, 57, 63, 21, 110, 70, 122, 76, 51, 124, 78, -5, 126, -100, -98, 116, 59, 125, -106, -113,
+ -111, -128, 92, 43, -19, -2, 105, -90, 96, -116, -116, -30, 115, -20, -106, 64, -108, -111, 94,
+ -9, -123, 52, -71, -88, -84, 87, -25, -54, -117, -2, -29, 29, -85, -22, -20, -94, -25, 98, 101,
+ 114, 80, -55, -51, 97, 99, 117, -86, 2, 79, 48, 110, 44, -94, -127, -85, 61, -95, 30, -91, -125,
+ 83, 113, -93, -4, -126, -98, -93, -68, -99, -70, -37, -73, -90, 4, 53, -2, 78, -35, 101, 42, -6,
+ -3, 106, -117, -127, 48, 31, 88, 117, 116, 106, -98, -23, -117, -7, -57, -128, -118, -117, -118,
+ 115, 30, -61, 6, -38, -114, -103, 37, 53, -4, -100, -121, 98, -110, -113, 2, -20, 26, -88, -118,
+ 19, -71, 39, -54, -11, -28, 47, 28, 89, 35, -13, -20, -48, 14, -6, -91, -85, -119, -7, 116, 112,
+ 114, 41, 44, -1, -39, 60, -85, -54, 101, -119, 95, -77, -64, -121, 47, 75, -78, -30, -66, -38,
+ -15, 98, 14, 82, -60, 85, -90, -78, 112, -7, 64, 5, 28, 64, 41, -64, 57, 85, 21, 122, -52, 90,
+ 70, -73, 17, 47, -125, 40, -45, -7, -91, 100, -21, -120, -51, 21, 65, 31, 110, -105, -79, -80,
+ 105, -43, 73, -61, 45, -30, -4, 83, 95, 3, 109, 55, -92, 120, 74, -36, -111, 54, -26, 76, -69,
+ 7, -20, 55, 4, 70, -124, -31, -32, 127, -63, -58, 73, 106, 109, -41, -45, 96, 30, 63, 14, 8, 16,
+ -88, 69, -115, -17, -14, -116, 115, -88, 119, -65, 16, -64, -112, -73, -10, -46, -7, 113, 5, 54,
+ -38, -47, -18, 106, 23, 12, -117, 120, -107, 121, -62, -35, -6, -56, 112, 81, 3, 5, 31, -11,
+ -92, -85, -29, 102, 43, 108, 88, -69, 55, -74, 110, 97, -128, 29, -63, -114, -19, 77, 123, 23,
+ 76, 81, 57, 51, 117, -74, -1, 74, 84, 70, 86, -109, -127, 122, 10, 9, 23, 71, 110, -116, -30,
+ -85, -104, 2, 40, -62, 20, 46, 8, 95, 46, 13, 113, -83, 124, 33, 38, 105, -99, 72, -62, -80,
+ -16, -118, 92, -66, -14, -124, 112, 79, 103, 53, -127, 61, -31, -92, 92, -42, -37, -37, -24,
+ -116, 2, -81, 40, 46, -44, 23, -68, -113, 88, 92, 95, 11, 118, 98, 19, -80, -102, 96, 73, -20,
+ 47, -105, -120, -74, -83, -77, -87, -59, -97, 112, 99, -52, 80, 116, -119, -44, 18, 62, 108, 73,
+ -34, 70, 28, 73, 81, -26, 87, -125, -55, 64, -53, -73, 114, -3, -45, -109, 19, -2, 68, 119, 14,
+ 26, 72, 19, 13, -121, -98, 26, -52, 85, 34, 17, -95, -7, 20, -12, 106, -11, 104, 20, -106, -42,
+ -26, 107, -106, 112, 103, -53, -62, 13, -58, -23, 23, 65, -104, -55, -90, 107, 55, -77, -25,
+ -125, 63, -61, -21, 117, -102, -70, -93, -67, -45, -61, 18, -63, 7, -127, 90, 16, -25, 116, 80,
+ 35, 105, 80, -93, 105, -44, 114, -126, -103, 88, -102, -76, -94, -66, 69, -35, 22, 36, 95, -55,
+ 22, 43, 78, -111, 109, 72, 104, -49, -9, -48, 59, 102, -54, -43, -128, 111, 127, -9, 35, 23,
+ -79, 40, -122, -52, 36, -81, -4, -102, -2, -62, 53, -111, -117, 40, 122, -95, 55, 32, -127, -9,
+ -91, 79, -109, -81, -3, 98, -78, 56, -119, 69, -41, 76, -102, 18, 90, -15, 12, -60, 86, -106,
+ 34, -118, -43, -13, 61, -106, -56, 48, 27, -15, -70, -41, 127, 61, -2, -80, -13, 86, 28, 91,
+ -10, -8, 98, -20, 54, 122, -116, -55, -70, -94, 54, -64, 71, 102, -106, -1, 99, -73, -71, -18,
+ -11, 56, 11, -27, -5, 11, -86, 126, 8, 46, -21, 63, -66, -43, 88, 46, -113, -5, 113, 26, -9,
+ -32, 18, -3, -6, -38, 81, 38, -110, 111, 97, 34, 65, 114, -71, -118, 9, -110, -109, -61, -113,
+ 31, -82, -102, -127, 16, -7, -16, -11, -87, -76, -41, -52, 58, -116, 100, 102, -127, 6, 127, 64,
+ 14, 110, 112, 43, 44, 87, 42, -118, -119, -39, 64, -7, 57, 16, 2, -69, -12, -54, -94, 36, -48,
+ 123, -119, 82, 46, 26, -62, 30, 97, -17, 34, 80, 32, -15, 116, -96, -3, 33, 34, 51, 59, -63,
+ -100, -7, -79, -126, -21, -15, -18, -113, 30, -25, 107, -25, -125, 53, 82, -15, -80, 96, -24,
+ -47, 94, -25, -109, -94, 114, -62, 112, -104, 26, -107, -68, -14, -36, -9, -89, 27, -75, 62, 62,
+ -20, -125, -77, -57, -127, 80, 58, -118, 63, -27, -82, -126, 74, -23, -91, -28, -95, 8, -122,
+ -73, 28, -87, -74, 80, -15, -119, 14, 32, 124, 73, 15, 61, -32, -68, 81, 56, -119, 66, 105, 3,
+ -15, 20, -86, 124, -70, -113, 100, -72, -117, -97, 127, 103, 16, 105, 8, 39, -128, -64, -47, 66,
+ 123, -110, 13, 123, -124, -24, 42, 102, -4, 47, 107, 125, 63, -52, -35, 113, -74, 13, 8, 17, 16,
+ -106, -21, -69, 47, -3, 103, -2, 19, -100, 111, -11, 1, 112, 90, -38, -31, -45, -55, 25, 92,
+ -122, 66, -18, -98, -82, -49, 119, -35, -128, 26, 60, -79, -23, 127, 82, -52, 115, 77, -109,
+ -111, 17, -99, 31, 33, 41, 35, 87, -47, -126, -18, -25, 81, -71, 9, -72, -92, 64, -92, 23, 116,
+ 96, 40, 55, -87, 119, -105, 66, 49, 46, -10, 26, -25, -105, 127, -124, 86, -2, 39, 116, -108, 6,
+ 21, 15, 1, 75, -5, 101, 13, 57, 70, 126, -50, -97, 123, -73, -77, 53, -11, -73, 44, -99, 91, 85,
+ 21, -59, -1, 117, 64, -100, 47, 75, 93, 9, -4, 83, -55, 15, 99, 31, 43, -49, 15, -89, -115,
+ -114, -50, -35, -19, -65, 122, -39, 92, -21, -3, -66, 8, -70, 107, -55, -86, -36, -23, -21, 80,
+ -79, 48, 116, 57, -71, 33, -111, -68, -75, 37, 55, 39, 124, 96, -66, 10, 14, 118, 50, 85, -33,
+ 54, -101, -7, 21, 88, -122, 50, -92, 123, 37, 109, -60, -127, 26, 110, -20, -31, -66, -56, -24,
+ 47, -14, -60, -101, 69, -38, 78, 0, 44, -71, 108, 4, 25, -68, -106, 20, -40, -103, 108, -70,
+ -56, 78, 12, 82, 81, 46, -105, -123, -46, -20, -127, -67, -77, 76, -74, 40, 105, 2, 27, 112,
+ -107, -121, -53, 6, -88, -11, 26, 41, 64, -69, -44, 27, 47, 24, -31, -86, -4, 4, -46, 42, 50,
+ -55, 37, -11, -95, 108, 54, 37, 67, 37, -14, -40, 41, 124, 22, 108, 99, 16, 55, 88, 19, 49, -87,
+ 27, 17, -68, -107, 15, -62, 84, 109, 72, -26, 71, 63, -17, -72, -63, -101, -8, 62, 24, -112,
+ 126, -102, -64, 29, -19, -75, 74, 29, 90, -90, 83, -22, 106, -27, -114, 56, -111, -33, 11, 3,
+ -16, 94, 115, -97, 67, -78, 62, -93, -36, 60, -65, -54, 72, 70, 44, -77, 73, 29, -106, 38, 72,
+ -37, -110, 79, -98, -15, -58, 96, -85, -68, -15, 73, 57, -127, 14, -123, -40, 70, 63, -64, 115,
+ -63, 127, 94, 85, 52, 30, -62, 83, -30, -97, 82, 39, 2, 36, -50, 106, 116, 66, 104, -14, 73, 14,
+ -106, -127, 11, 41, -27, 56, -99, -74, 55, 123, 124, 9, 46, 12, -97, -37, -10, 122, 124, -27,
+ -64, 93, -70, 9, 119, 13, -9, -71, -118, 19, 50, -36, 114, 120, -24, -62, 40, 127, 9, -62, 84,
+ 57, 66, 91, -114, 120, -49, 63, 99, -73, -66, -64, 84, -31, 67, -52, 12, 38, -62, 37, -122, -50,
+ -95, 24, 19, 54, -80, 57, -118, -84, 124, 90, 53, 72, 29, -123, 67, -65, 99, -58, -28, 20, -110,
+ -103, 92, -91, -108, 23, -118, 44, 74, 76, -29, 94, -121, -37, -32, 107, -62, -67, -55, -45,
+ -50, -44, 25, -77, -102, 90, -128, -31, -5, -64, 110, 122, 88, -18, -53, -85, 122, -11, 100,
+ -106, 97, 59, -103, -110, 5, -16, 59, -126, -74, 9, -119, 115, 49, -73, -42, 32, 100, 59, -98,
+ 106, 55, -101, 87, 126, 59, -23, 106, -102, 100, -69, -46, 76, 53, -107, -119, -113, 104, 117,
+ -27, 75, -32, 8, -81, -10, 50, 108, -32, 51, -79, -53, -2, 66, -9, 113, 14, 99, -100, -34, -21,
+ 13, 2, 45, -33, 0, -16, -64, -126, 69, -25, -34, 28, 105, -48, -38, 82, 12, 27, -71, 35, 13, 11,
+ 21, 26, -19, -4, 44, -52, -126, -63, -32, -84, -22, -63, -29, 96, -97, -82, -12, -53, 98, 41,
+ -69, -38, 101, -31, 47, -9, 16, -10, 9, -36, -103, -91, -65, -36, -93, -45, 94, 110, 54, -94,
+ 68, -39, -116, -40, 61, -112, -91, -79, 98, -36, 87, 35, 88, -61, 125, 112, -84, 48, -38, 105,
+ -92, 69, -68, 92, 0, 27, -72, -65, 97, 98, 66, 97, -74, 29, 46, -21, 102, 61, 120, -62, 38,
+ -125, -60, -43, 4, 5, -27, 113, -43, 105, -22, -110, 68, 13, -14, -23, 18, 95, -79, -108, 87,
+ 19, -80, 16, 54, -121, 88, -64, -113, 73, 3, -20, 17, 0, 26, -88, -49, -2, 21, 120, -105, -85,
+ -113, 76, 106, 37, -13, -75, 29, -127, 10, -17, -53, -124, 24, 37, -31, 26, -1, 109, 88, -88,
+ -37, -51, -32, -125, 48, -40, 123, -108, 55, -120, -62, -91, 47, 62, -127, -25, 99, 68, 22, -40,
+ 58, 119, -31, -93, -122, 39, -92, 25, -127, -42, 97, 69, -6, 110, -61, -21, -94, 82, 123, -93,
+ -51, -90, 50, -96, 127, -32, 125, -76, 117, 75, -52, 79, 110, -51, -15, -81, 49, 62, 118, 120,
+ -27, 22, 84, -22, 77, -105, 87, -7, -23, 47, -8, 108, 82, -12, 84, -52, -85, 68, -89, -24, -32,
+ 6, -34, -83, 80, 44, 12, -51, 50, 74, -121, -106, 6, 85, 32, 42, 76, -59, -52, -99, 102, 108,
+ -127, -49, 0, 60, 62, 2, 13, -19, -92, -41, -69, 55, -70, 94, 23, 36, 89, 70, -115, -51, 26,
+ -95, 13, -69, 42, 62, 59, -24, -63, -50, -6, -86, -97, -115, -58, -107, 69, -12, -109, 73, 4,
+ 63, 12, 32, 13, -123, -72, -41, -7, -81, 37, -91, -128, 109, -79, -80, 88, -22, 108, 126, 103,
+ 27, -29, -81, 52, 55, -91, -13, -43, -75, -59, 80, -6, 6, 83, -103, -64, 8, 63, -34, -59, 21,
+ 55, -115, 62, 77, 30, -50, -71, -66, 87, 99, -47, 0, 124, 76, 120, 79, -12, 54, -16, -98, -72,
+ -41, -66, -14, 114, -27, 108, 57, -49, 107, -73, 90, 107, -103, 25, -107, 112, -119, -54, 106,
+ -54, -8, -13, -81, -62, 92, -84, 113, 77, 74, -63, 104, 92, -94, -128, -43, -54, -71, 117, 27,
+ 14, 98, 52, 119, -93, -77, -80, -46, 88, 35, 123, 86, 87, 122, 62, 108, 19, 27, 111, 2, 62, -67,
+ 89, 14, -82, 41, 123, -117, 74, 109, -124, -115, 15, 123, -65, 42, -81, -105, 19, -30, 86, -72,
+ 84, 63, -109, 34, -65, -127, 6, -104, 77, 103, -111, 90, 16, 31, -74, -33, 122, 58, 52, 10, 2,
+ 65, 72, 68, 79, 52, 31, -19, 100, -86, 21, -49, 116, 101, 82, 111, -96, -76, 67, -40, -62, -15,
+ -79, 109, -58, 6, 11, -91, -29, 65, 21, 75, 74, -28, 21, 103, 46, 48, -42, 51, -110, 80, -95,
+ -102, -9, 8, -95, 102, 102, 16, 105, 103, 92, -106, -109, 77, 93, 32, -12, -25, 5, 17, -86, -34,
+ 58, -50, 55, 63, -8, -72, 3, 26, 91, 72, 71, -77, 94, 91, 39, 45, 7, 0, 30, -45, -100, 35, 43,
+ -41, -72, 16, -103, -115, -4, 51, 39, -23, -89, -84, 105, 94, -91, -88, 82, 123, -26, 51, -16,
+ 97, 47, -39, 35, 46, -89, 74, 7, -80, 116, -21, 82, -84, -13, -99, 31, -58, -93, 36, 99, 36, 44,
+ -65, 45, 94, -91, -41, 115, -10, 116, -67, 45, 19, -20, 113, -62, 111, 124, 108, 71, -121, -64,
+ 122, -121, -105, 114, 115, -126, -93, -108, -113, -1, -80, -86, 116, -111, -29, 53, -76, 87, 19,
+ 45, -30, 91, 91, -7, -49, 12, 112, -8, -26, 82, 58, -82, -76, 119, -50, 14, 85, 113, 20, 48,
+ -102, 37, 24, -120, -107, -52, 67, -44, -92, -79, -40, 28, 21, 55, 116, 88, 19, -49, -78, 86,
+ -89, 74, -4, 118, 75, 11, -103, -127, -47, -16, -77, -78, 8, 2, -88, 50, 23, -99, 102, -100,
+ -116, -99, -109, -112, -115, 78, 55, -39, -84, 100, -91, -101, 73, -9, 39, -23, 62, -125, -106,
+ -55, 119, -118, 114, -33, -99, 20, -53, 91, 115, 47, -93, 51, -99, -9, 92, -71, 120, 57, -44,
+ -87, -11, 108, 30, 43, -4, 118, 90, 126, -54, -99, -47, -2, -61, -3, -62, 45, 92, -70, -105, 30,
+ 98, 112, -94, 56, 35, -22, 32, -93, -6, -36, -5, -77, -78, 120, 45, 104, 69, -49, -30, 39, 75,
+ 38, -94, -12, 34, 34, -44, 48, -100, 74, 34, 69, 94, -12, 73, 27, -111, 90, 33, -38, 93, 40,
+ -16, 89, 26, -110, -116, -10, -65, 85, -57, 48, -86, 121, 118, -41, 63, 33, 109, -78, -26, 122,
+ 111, -115, -52, 95, 26, -70, -14, -86, -80, -27, -6, 12, -44, 123, 28, 93, -74, 14, -124, 87,
+ -28, -12, 111, -117, -83, 48, -41, -3, 60, -51, -91, 118, 54, 110, 18, -2, -120, -66, 46, -35,
+ -91, 106, 94, -91, -11, 41, -92, -22, 96, -113, -109, 105, 56, -80, 17, -118, 124, -16, 30, 30,
+ 117, 126, -99, -106, -69, -28, 85, 85, -41, 21, -95, -85, -112, -125, -45, 69, 10, -34, -120,
+ 33, -58, 120, 51, -22, -7, 31, -34, 4, 55, -102, -70, 118, -83, 49, 111, -45, -9, 69, -95, -66,
+ 116, -3, 104, -61, 17, 21, -20, 121, 117, 127, -70, 5, 89, -89, 51, 15, 64, 126, -73, 97, 90,
+ 119, -22, -37, -54, 52, -33, 26, -54, 75, 79, 73, 100, 44, 3, 53, -25, 49, -123, -101, -80, -54,
+ -81, -32, 88, 49, -14, -4, 18, 42, 52, -65, -33, 68, 83, -89, -11, 57, 102, 71, 122, 74, -92,
+ -44, -94, -108, 14, 104, -107, -124, -63, 8, 32, 85, -18, -16, -91, -63, -38, 27, -108, 24, 19,
+ -33, 53, 70, -32, 41, 38, -77, -30, 89, 28, -15, -89, -86, 32, 51, 28, 67, 124, -96, -103, -34,
+ -113, 22, 15, -8, 104, -38, -56, 65, -96, -111, 104, -9, -38, 107, 55, 112, 47, 99, 50, -18, 90,
+ -69, 116, 80, 95, 52, -27, -98, 6, 12, -11, 124, -120, -96, -91, 118, -51, -120, 90, -92, -104,
+ -83, -73, 84, 61, 78, -39, -99, 33, 58, -45, -14, 127, -20, -44, 125, 21, -26, -21, -36, 51, 73,
+ 71, 73, -17, 83, 11, 107, 91, 36, -65, -24, 56, 117, 114, -126, -34, 1, 120, 66, -50, 14, 91,
+ 97, -35, 75, 87, 123, -53, 63, -38, -74, -62, -117, -45, -40, 125, -5, 53, 50, 0, -110, 7, 7,
+ 45, 37, -71, -21, 70, -95, -60, 74, -55, -54, -96, 115, -62, -32, -3, -121, -18, 27, -107, 49,
+ -39, 58, -39, 91, 107, 65, -99, -64, -19, -10, -126, 38, -40, -112, 0, 16, 107, -59, 119, -70,
+ 79, 49, -18, -76, -22, -38, -98, 35, -99, 61, 67, -100, 29, -104, -17, 22, 108, 105, 88, -114,
+ -65, 84, 99, -69, -84, -87, -81, -28, 68, -66, 3, 69, -69, 83, 16, 61, -102, 50, 67, 46, -98,
+ -77, -40, -78, 48, 68, -85, 123, -92, 37, 14, 75, 13, -23, -110, 23, 26, 90, -81, -1, -109, 85,
+ 121, -68, -55, -7, 21, -81, -35, 41, 3, -72, -52, 36, 35, -83, -9, -81, -124, -104, 31, 54, 8,
+ -32, 80, 73, 89, -41, 116, 127, -110, 68, -82, 82, -79, 105, 113, -110, -70, 121, -24, -54, 37,
+ -12, -70, -77, 15, 14, 105, -19, 16, -6, 73, 102, 121, -116, -62, 54, 65, 119, 43, 60, -79, -66,
+ -17, 1, 97, -1, -11, -5, 104, 10, 59, -108, 21, -8, 64, -71, -86, 14, -98, -87, -49, 30, -45,
+ 109, 43, -67, 10, -122, 25, 98, -102, 127, -27, -52, -61, -66, -47, 114, -94, -126, 4, 0, -65,
+ -11, -51, -67, 84, -43, 44, 88, 53, -6, 124, 11, -123, 34, 12, 102, -13, -106, 47, 62, -71, 43,
+ -65, 28, 37, 32, 80, 23, 6, 75, -103, 73, 112, 33, 84, -89, 12, -81, 42, 65, 58, 14, -102, 90,
+ 29, -116, 104, 107, -99, -1, -43, 122, 118, 88, -2, 117, 84, 1, -123, -2, 2, -32, -18, -122,
+ -36, -58, 16, 76, 115, 27, -121, -2, -79, -44, -39, 33, -29, 33, -34, 55, 71, 61, 117, -22,
+ -126, 51, 29, 55, -34, -48, 17, -57, 74, 71, -33, -50, 60, 41, -119, -93, -45, -127, -30, 104,
+ 35, 60, -117, -113, 81, -59, -39, -84, -39, -46, -106, 57, 77, 62, -11, -44, -87, 71, 35, -117,
+ -87, -77, -98, 68, -29, -121, -16, -16, 39, 48, -74, 23, 82, -62, 32, 62, 27, 125, 84, 39, -91,
+ -91, -93, 76, -24, 98, 123, -58, -114, 17, 28, 93, -17, 74, 92, -17, 9, -86, -116, -72, 54, -74,
+ 71, 9, -97, -33, -20, -126, -50, 117, 102, 54, 123, 124, -70, 30, -102, 27, 23, 105, -40, -35,
+ -89, -33, 89, 3, 44, 18, -15, 10, 116, -111, 1, -81, -31, -125, -102, 103, -93, -15, 72, 84, 19,
+ -30, -17, -115, 99, 43, 5, -92, 52, 59, -55, -105, -128, 19, 8, -78, 43, 7, -55, -126, -106, 11,
+ 69, 118, 24, -128, -54, -86, 22, -121, -43, 69, -15, 96, 52, 52, 90, -118, -10, -58, 121, 63,
+ -48, -13, 22, -101, 17, 42, -28, -54, -63, 121, -96, 111, 113, 103, 126, 37, -52, -40, -106,
+ -104, 123, -48, -92, 83, 100, -70, -52, -59, -93, -116, -90, -93, 82, -117, 103, 52, -71, -42,
+ 57, 25, 57, -74, 71, 7, 32, 96, -60, 11, 121, 58, 71, 40, -92, 35, 88, -12, -109, -56, -122,
+ -30, -118, 103, 65, -5, -90, -97, 103, -117, 66, -20, -42, -46, 67, -29, -23, 72, -97, 26, -54,
+ -103, -76, -47, -71, 23, -83, -20, 95, 111, 101, -83, 106, -71, -70, -63, 55, -85, -41, 117, -9,
+ 37, 96, -71, -118, -44, -43, 2, 107, 113, -39, -107, 41, -13, 0, -87, 77, 83, 99, 68, -84, -6,
+ -1, 67, 124, -57, 115, 29, 24, 26, -42, 104, 58, -87, -38, 12, -98, 11, 109, 62, 59, -66, -48,
+ -20, 70, -111, 11, 120, 21, -58, -29, -76, 44, -7, 26, -119, -59, -87, 44, 122, 8, 114, -58,
+ -109, -119, -63, -58, -51, 33, 35, -109, 81, 110, -90, 121, -21, 64, -60, 68, 18, 75, -82, -81,
+ -103, -76, -116, 23, 53, 58, -41, -23, 49, -102, 81, 101, 39, -59, -91, -98, 111, 2, 65, 110,
+ 121, 5, 13, 97, -119, 109, 40, 82, 47, -51, 47, -57, 35, -109, 53, -42, 10, 3, -15, 122, -25,
+ -67, -62, -121, -120, -31, 18, -20, 87, -88, 75, 95, -121, -93, 33, 61, -88, -96, 88, -69, -54,
+ -121, -99, 49, 122, -53, -49, -125, 53, -79, -46, -128, 109, 125, -93, -83, 44, -101, 69, 68,
+ -91, -17, 55, -13, -75, -80, 21, 32, -13, 40, 86, -65, 85, 80, -82, -38, -52, 110, -119, 100, 8,
+ 77, -23, 67, -41, 73, 27, 38, 9, -11, -32, -30, 75, -15, 67, -41, 46, 27, -89, 9, 117, -38, -14,
+ -81, -4, 71, 113, -79, 81, -36, 63, 15, -70, 104, 34, -56, -39, 93, -34, -127, 90, -36, 73, 47,
+ -76, 113, 55, 123, -92, 48, 116, 108, -123, 31, -67, -39, 3, -9, 6, 13, -17, -50, -125, 1, 105,
+ 121, 100, 79, 82, -85, 123, -33, -73, 54, -61, -113, 121, -110, 69, 119, 94, -112, -120, -34,
+ -35, -104, -116, 44, 85, 109, -104, 127, 120, 87, 75, -48, -115, 74, 85, -47, -53, 16, -5, 92,
+ 67, -32, 12, 79, 109, 105, 5, -92, 51, 46, 96, -96, 63, 106, 82, -54, -95, 20, -60, -23, 48, -5,
+ -128, 22, 23, -93, 93, -64, 35, 21, -121, -79, 59, -1, -50, 55, -7, -10, -85, 3, -7, 121, 98, 5,
+ -19, 76, -78, -128, -47, -42, 61, -59, -46, -24, -16, -51, -48, 122, -26, 74, -91, 54, 53, 46,
+ 74, 25, -30, -74, 52, -22, 118, -103, -53, -113, 44, -19, 70, -86, 106, 72, -68, -86, 110, 34,
+ -35, 57, -43, 32, -4, 14, 102, 25, -76, -84, -86, -83, -2, -107, -4, 49, -97, -83, -95, 6, 100,
+ -73, 6, 34, 49, 59, 50, 30, -8, 6, -55, 24, -6, 67, -121, 115, 40, -50, -75, -46, -26, 111, -20,
+ -75, -83, -16, -48, 65, -64, 119, 62, -59, 3, -12, 109, 0, -118, -94, 17, -51, 124, 63, 42, -3,
+ 44, 53, -81, -35, -33, -83, 115, -114, -4, -104, 44, 7, -81, -97, -102, 104, 29, -97, 70, 91, 3,
+ 88, 67, -127, 78, -92, -16, -34, -18, -81, -125, -38, 117, -78, -36, 9, 76, -85, 121, 2, 10,
+ 114, 65, -5, -29, -34, 101, 20, -108, 46, -90, -98, 85, -62, -51, 108, -72, -51, 44, 22, 112,
+ 121, 58, -58, 109, -96, 58, 103, 27, -88, -81, 99, -7, -33, -113, 64, -122, 115, 19, -93, 37,
+ -19, 93, -98, 78, 115, 91, -88, -82, -36, 61, 90, 77, 27, 26, -116, 80, 90, 85, 6, -87, 59, 110,
+ 63, 20, -81, -127, -53, 18, -73, 39, 75, 79, -106, 29, -50, -13, 43, -99, -92, 109, 80, -83, 69,
+ -102, 38, 90, -41, 48, -47, -93, 18, 116, 32, 90, -73, -96, 90, 49, 19, 73, -35, 60, 53, -72,
+ -52, 84, 52, 27, -67, -114, 82, 79, -89, -80, -111, 124, -51, 80, 110, -76, 125, 18, -73, 44,
+ -100, 118, -16, -64, -35, 22, -86, -116, -19, -101, -35, 42, 85, -83, 69, -65, 37, -104, -88,
+ -108, -25, -9, 15, 91, -100, -86, 8, -75, -37, 103, 3, -69, -9, 114, -25, 25, -87, 118, -75,
+ -115, -8, 74, 53, 73, 46, -22, -108, 30, 71, -96, 40, -76, 121, 71, -63, 95, 96, 113, -54, 87,
+ 1, -79, 2, -40, 11, 22, -118, -117, 94, -44, -112, -27, -86, 96, -4, -58, 121, -71, 54, -58,
+ -71, -125, -65, 126, -116, -107, 125, -28, -74, 97, 15, -76, 59, -26, 58, -38, -39, 122, 55, 85,
+ -109, -114, 75, 25, -74, 57, -78, -10, -76, -115, -12, 29, 84, 86, 97, 5, 116, -114, 62, -98,
+ -36, 105, -119, -19, 12, 11, 49, 76, 21, 56, 1, 115, 115, 42, -67, 60, -40, 19, 38, 50, 33, 112,
+ 98, 123, -76, -74, 50, 66, 18, -61, -114, 36, -95, 92, 124, 20, -56, 29, -41, 28, -4, -106, 115,
+ -83, 98, -47, 96, 87, -72, 96, -83, -93, 1, 112, -43, 59, -80, -24, 46, -45, 87, 92, -108, -78,
+ 101, -112, 111, -119, -67, 26, 97, 1, 36, -128, 120, 8, -20, 84, 107, -9, -104, 25, 0, -36, 58,
+ 111, 81, -83, 65, 42, 51, 61, -71, 118, 111, 29, -93, 39, -56, -72, -18, -53, 0, 34, -77, -59,
+ 112, -79, 51, 86, 82, -24, 64, -120, -1, -102, -3, 42, -93, 16, 38, 100, 39, -124, 92, -89, 31,
+ 94, -32, 40, 19, -8, 48, -83, -66, -68, 110, -72, 36, -38, -91, -63, 33, 35, -96, -121, -119,
+ -59, 56, 89, -117, -123, -79, -68, 42, -4, -116, -108, -104, -84, -111, -26, 94, -38, 61, 94,
+ -72, -85, -18, -30, 118, -14, -94, -74, -24, -21, -90, -83, -116, -38, -8, 9, -17, 72, -62, -78,
+ -75, 47, -117, 109, 127, -87, -36, 53, 90, 16, -72, -50, 40, 87, 97, -51, -96, -55, -120, -32,
+ -58, -21, 102, 117, -121, -98, 74, -67, 104, -122, 108, -3, -96, 64, -114, -3, 30, 48, -14, 44,
+ -41, 91, 54, 58, 80, -13, -88, 121, 32, 122, 25, 24, 9, 72, 17, -1, -93, -66, 96, -84, 4, 37,
+ 69, 91, 64, 32, 46, 89, 7, -32, -120, 10, -38, -3, -59, -75, 14, 116, 115, 121, 99, 122, -95,
+ 107, 1, 65, 70, -45, 35, -52, -87, -56, 43, 121, 12, -93, -8, 83, -118, 15, -33, -67, 45, 74,
+ -66, -31, -28, 5, 104, -13, 113, 19, -89, 105, 66, -82, 74, 54, -104, 69, 103, 86, 118, -44,
+ -75, -47, 81, -75, 8, -32, -95, 121, 48, -121, -106, -88, -15, -52, -99, -78, 58, 113, 16, 71,
+ -48, 76, 80, 81, 59, 43, -106, 27, -49, 2, -11, -71, -30, -80, -44, 62, -113, -20, 12, -60, -87,
+ 22, -30, 64, -120, 127, 121, 47, 127, 58, -98, -4, 79, -72, -117, 115, 52, 95, 40, -59, -125,
+ -33, 125, -96, -93, -92, 17, -99, -85, 10, -119, 91, -115, -63, -32, -11, -102, -105, -93, 90,
+ 37, 94, -104, -47, -63, -94, 15, -34, 20, 73, -59, 85, -31, 6, 106, -67, 14, -125, 28, -63, 40,
+ 86, -68, 104, -22, 124, -27, -84, -13, 43, -45, -30, -95, 95, 16, 79, 23, -66, -78, -74, 43, 86,
+ 70, -95, 90, -65, -1, -58, 54, 12, 47, -47, 28, 91, -54, -19, -75, -43, 12, -108, 12, 71, 38,
+ 118, -8, 1, 42, -113, -6, 1, -93, 118, 67, -79, 25, -80, 118, 34, -29, 0, -23, 86, 53, -118, 89,
+ 112, 0, -61, -88, 76, -24, 59, -75, 23, -1, 64, -80, -52, -40, 34, -50, -19, -127, 57, 79, 43,
+ 92, -113, -96, 73, 0, 33, 122, 42, 104, -62, -66, -108, -104, 45, -120, 69, -3, -20, -113, -40,
+ -70, -96, 72, -21, -95, 1, -16, -124, -87, 125, 56, -108, 7, -112, -104, 105, 80, -34, -93, 24,
+ -6, 35, -38, 42, -4, 23, -112, 40, 45, 106, -72, 29, 44, -36, -61, -8, -93, -34, 3, -41, -26,
+ 121, 6, 100, -14, -112, -117, -15, -120, -92, 44, -43, 94, -13, 121, -59, -82, -68, 7, -19,
+ -110, -121, -58, -118, -121, 92, -8, 33, -120, -28, -95, -31, -120, -62, 49, 51, 3, 68, 4, -56,
+ 51, -13, -90, 47, -16, -24, 63, 125, -11, -94, 99, 69, -84, -54, 127, 81, -120, 42, -47, -128,
+ -13, 38, 115, 59, -112, -30, -9, -116, 121, 63, 111, 32, -116, -2, 0, -33, 79, -67, 90, -65,
+ -108, -107, -5, -107, 11, -102, 91, 106, -42, 74, 45, -80, -65, 54, 36, 121, -125, -118, -34,
+ -51, 36, -85, -78, 86, 121, -103, -39, 35, -76, 17, 59, 68, -40, -43, -27, 63, -76, 126, -94,
+ 18, 87, 20, 92, 38, -6, -54, 9, 45, 93, -57, 53, -11, -44, -38, -24, -126, -40, -24, -35, -121,
+ -55, -87, -63, 70, -88, 13, -78, -89, 2, 50, 59, 4, -14, 81, 25, 34, -20, 87, 116, -76, -31,
+ -93, 15, 112, 61, -43, -11, -86, -25, 10, 41, 1, 60, 105, -42, -90, -44, 38, 98, 126, -128, 28,
+ 99, 20, -97, 105, -101, 27, -106, 13, -108, -18, 23, -79, 121, 57, 93, -16, -37, -82, -1, -128,
+ -67, 99, 117, 79, 85, 83, 12, 53, -101, -52, -75, 72, -128, -62, 45, -54, 11, 0, -58, -88, 11,
+ 121, 33, 86, -87, 31, -54, 109, -37, 10, 119, -9, 55, -7, 77, -52, 93, 64, -62, 115, -88, -4,
+ 67, -1, -37, 31, 107, 90, -109, -121, 71, 105, -123, 61, 75, 89, 108, -91, -6, 115, 45, 109, 10,
+ -35, -84, 41, 127, 104, -84, -70, -6, -118, 6, 110, 99, -7, -112, 15, -79, -20, 51, -41, 78, 25,
+ -97, -2, -121, -117, 7, -87, -76, 60, -7, -7, 0, 51, 91, 34, 85, 21, -1, 108, 41, 8, 126, -25,
+ -30, 68, 109, -52, -51, 1, -111, 11, -22, -70, -33, 95, 40, 6, 63, 52, -66, -20, -6, -104, 81,
+ 57, 22, 82, 119, 126, 76, -10, -108, -63, -123, 19, 23, -106, -1, 117, 26, 112, -85, -78, 81,
+ -116, 53, 86, -126, -80, 122, 36, 67, 18, 19, -114, 73, 125, -3, -69, 99, 10, -30, 19, 112,
+ -103, 0, -61, 47, -106, -45, -105, -107, -56, 23, 14, 51, -70, 30, -32, 30, 7, 22, -31, -41, 19,
+ -47, -64, -52, 119, -66, 54, -109, -87, 3, 95, -124, 94, -48, 36, -40, 13, 19, 91, -14, -115,
+ 103, 66, 20, 44, 47, 8, -40, 4, -114, -110, -47, -28, -108, 89, 0, -7, -71, -91, -43, 98, 8,
+ -85, -98, -113, 103, -71, 69, 14, -95, -36, 92, -17, -66, -95, 123, -15, 52, 88, -60, -23, 123,
+ -61, -4, -33, -45, 77, 57, -121, 119, 116, -40, -31, -15, 96, 54, -49, -44, 36, -37, 111, -45,
+ -17, 12, 14, 21, 105, 48, 51, 42, -89, 55, 61, -5, -2, -36, -88, 36, -35, -29, -7, -68, -28,
+ -76, 5, -38, -66, -72, 24, -120, 8, -86, -28, 0, 71, -89, 20, -40, -100, 61, -57, 52, 23, 66,
+ -2, -24, -7, 86, -100, 111, -114, -47, -25, -40, -61, -67, -104, 33, 49, 16, -115, 9, -64, 27,
+ 122, 34, -33, -89, -113, -50, 42, 111, -14, 110, 43, 32, -112, 101, -59, 28, 76, -2, -117, 47,
+ 5, -73, -75, 21, -91, 99, 81, 93, -17, -119, 68, -21, -84, -51, -64, -98, 58, -33, 77, 4, 18,
+ 116, 62, 111, -105, -13, 91, -92, 81, -34, 40, 17, -128, 85, -19, 20, 8, 92, 83, 10, 3, 40, 89,
+ 60, 109, -23, 59, -66, -22, 43, 124, 25, -105, 77, 14, 75, -111, 13, 45, -90, -108, -79, 78,
+ -45, -55, -44, -86, -20, -41, -11, 65, 76, -79, 91, -23, 77, -84, 114, -109, 2, -71, 68, 8, -31,
+ 99, 97, -104, -94, 69, 64, -16, -48, -78, 99, -58, -17, 95, 96, -64, 47, 96, -69, 60, 28, 114,
+ 64, -128, -128, 114, 28, -124, 72, -41, -48, 82, -6, 63, -27, -126, -86, -121, 0, 4, 4, 35,
+ -111, 66, 64, -61, 117, -92, 48, 88, -128, 116, 7, -24, -111, -55, 96, -59, -96, 49, -70, -41,
+ -47, 85, 86, -37, -32, 53, -49, 62, 68, 80, -37, 95, 29, -114, 11, -65, 90, -99, -97, 101, 96,
+ -88, 5, 34, 3, 23, -22, 42, 4, -4, 17, -121, 106, -60, 33, -38, -32, -8, 41, -87, -4, -35, -102,
+ 7, 18, 35, -7, 85, -18, 60, 15, 34, 82, 46, 68, 63, 80, -38, 4, 51, -74, -34, 83, -33, -8, 44,
+ 87, -18, -8, 46, -53, -109, -121, -114, 10, 63, -36, -1, -123, 69, 107, -58, 33, -11, 63, -117,
+ 60, 22, 73, -36, 22, -76, -92, -74, -37, -35, 87, 40, -97, -6, 95, -25, -2, -99, -101, 102, -48,
+ 45, -55, 85, 94, -48, 57, -100, 34, 16, -63, -16, 106, -75, -7, -109, 71, -74, 20, -16, 37, 90,
+ -61, 69, 19, -111, 95, -104, 116, 75, -68, 85, -80, 66, 127, 127, 67, -98, 121, 53, 23, -3, 56,
+ -89, 99, 57, 9, 122, 76, 119, 1, -117, 47, -105, -42, -7, 51, -8, -81, 48, -60, -69, -29, 24,
+ 19, -81, 43, 31, -36, 62, 96, 20, -58, 39, -122, -115, 7, -114, 118, 27, 27, 78, -101, 75, -93,
+ -104, -8, 119, 121, -97, -84, 58, 33, 18, -35, -29, 20, 20, 7, 112, 60, 31, -12, 7, -128, -55,
+ -68, -7, -12, -115, 97, 115, 44, -46, -68, 108, 36, 121, -1, 84, -4, -26, -126, 85, -32, 36, 26,
+ -19, 71, -121, -92, -51, -116, 81, -71, -83, -50, 21, -119, -60, -78, -84, 102, 19, -26, 118,
+ -53, -13, 16, 36, -64, -83, -66, 32, -99, 54, 83, 104, 61, -19, 107, 95, -66, -42, -6, 25, 86,
+ -13, -53, -49, -9, 74, -13, 58, 125, -96, -32, -22, -21, -12, -38, -114, -88, -100, 35, -87,
+ -108, -2, -103, 87, -119, -109, 50, -28, -101, -4, -43, 105, 119, -118, 103, -104, 41, 47, 71,
+ 53, 11, -53, 59, -13, -11, 83, -33, 28, 11, 78, -59, 73, -33, -60, 119, -73, -127, 98, 39, 77,
+ 21, -8, -103, 103, 44, -87, -52, -74, 56, -63, -70, -121, 40, 103, 7, -100, 113, 53, -46, 44,
+ 16, 31, 102, -31, 104, -38, -120, 118, -122, -55, 25, 1, 92, 22, -14, 24, 108, 92, -90, -93,
+ -16, -99, -13, -127, 75, 101, -42, -86, -29, -51, -49, -105, -118, 91, -56, -51, -73, 117, 53,
+ -39, -73, 121, 83, -49, -10, -86, 11, -97, 40, -33, 6, -40, -9, -32, 92, -101, -83, 116, -5,
+ -57, -93, -121, 2, 38, -65, -6, 45, 100, 92, 92, 74, 115, 45, -33, 92, -11, 70, 33, 76, 85, 94,
+ 1, -111, -103, 6, -4, -31, 44, -53, -77, -45, 100, -83, 92, -11, 10, -7, 126, 23, 36, 61, -18,
+ -28, 67, 126, 53, -45, -77, 95, 43, -73, 30, -37, 122, -53, -79, -77, -42, 71, -124, 43, -89,
+ 60, -80, -89, -68, 96, 29, 103, -50, -93, 105, 7
+ };
+
+ static class ProxyStream extends FilterInputStream {
+ int readBytes;
+
+ ProxyStream(InputStream is) {
+ super(is);
+ }
+
+ @Override
+ public int read(byte[] b, int off, int len) throws IOException {
+ int result = super.read(b, off, len);
+ if (result > 0) {
+ readBytes += result;
+ }
+ return result;
+ }
+ }
+
+ @Test
+ public void testEagerStream() throws IOException {
+ ProxyStream ps = new ProxyStream(new ByteArrayInputStream(DATA));
+ BrotliInputStream reader = new BrotliInputStream(ps, 1);
+ byte[] buffer = new byte[1];
+ reader.read(buffer);
+ reader.close();
+ int normalReadBytes = ps.readBytes;
+
+ ps = new ProxyStream(new ByteArrayInputStream(DATA));
+ reader = new BrotliInputStream(ps, 1);
+ reader.enableEagerOutput();
+ reader.read(buffer);
+ reader.close();
+ int eagerReadBytes = ps.readBytes;
+
+ // Did not continue decoding - suspended as soon as enough data was decoded.
+ assertTrue(eagerReadBytes < normalReadBytes);
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Huffman.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Huffman.java
new file mode 100644
index 000000000..38f7f293d
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Huffman.java
@@ -0,0 +1,137 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+/**
+ * Utilities for building Huffman decoding tables.
+ */
+final class Huffman {
+
+ private static final int MAX_LENGTH = 15;
+
+ /**
+ * Returns reverse(reverse(key, len) + 1, len).
+ *
+ * <p> reverse(key, len) is the bit-wise reversal of the len least significant bits of key.
+ */
+ private static int getNextKey(int key, int len) {
+ int step = 1 << (len - 1);
+ while ((key & step) != 0) {
+ step >>= 1;
+ }
+ return (key & (step - 1)) + step;
+ }
+
+ /**
+ * Stores {@code item} in {@code table[0], table[step], table[2 * step] .., table[end]}.
+ *
+ * <p> Assumes that end is an integer multiple of step.
+ */
+ private static void replicateValue(int[] table, int offset, int step, int end, int item) {
+ do {
+ end -= step;
+ table[offset + end] = item;
+ } while (end > 0);
+ }
+
+ /**
+ * @param count histogram of bit lengths for the remaining symbols,
+ * @param len code length of the next processed symbol.
+ * @return table width of the next 2nd level table.
+ */
+ private static int nextTableBitSize(int[] count, int len, int rootBits) {
+ int left = 1 << (len - rootBits);
+ while (len < MAX_LENGTH) {
+ left -= count[len];
+ if (left <= 0) {
+ break;
+ }
+ len++;
+ left <<= 1;
+ }
+ return len - rootBits;
+ }
+
+ /**
+ * Builds Huffman lookup table assuming code lengths are in symbol order.
+ *
+ * @return number of slots used by resulting Huffman table
+ */
+ static int buildHuffmanTable(int[] tableGroup, int tableIdx, int rootBits, int[] codeLengths,
+ int codeLengthsSize) {
+ int tableOffset = tableGroup[tableIdx];
+ int key; // Reversed prefix code.
+ int[] sorted = new int[codeLengthsSize]; // Symbols sorted by code length.
+ // TODO: fill with zeroes?
+ int[] count = new int[MAX_LENGTH + 1]; // Number of codes of each length.
+ int[] offset = new int[MAX_LENGTH + 1]; // Offsets in sorted table for each length.
+ int symbol;
+
+ // Build histogram of code lengths.
+ for (symbol = 0; symbol < codeLengthsSize; symbol++) {
+ count[codeLengths[symbol]]++;
+ }
+
+ // Generate offsets into sorted symbol table by code length.
+ offset[1] = 0;
+ for (int len = 1; len < MAX_LENGTH; len++) {
+ offset[len + 1] = offset[len] + count[len];
+ }
+
+ // Sort symbols by length, by symbol order within each length.
+ for (symbol = 0; symbol < codeLengthsSize; symbol++) {
+ if (codeLengths[symbol] != 0) {
+ sorted[offset[codeLengths[symbol]]++] = symbol;
+ }
+ }
+
+ int tableBits = rootBits;
+ int tableSize = 1 << tableBits;
+ int totalSize = tableSize;
+
+ // Special case code with only one value.
+ if (offset[MAX_LENGTH] == 1) {
+ for (key = 0; key < totalSize; key++) {
+ tableGroup[tableOffset + key] = sorted[0];
+ }
+ return totalSize;
+ }
+
+ // Fill in root table.
+ key = 0;
+ symbol = 0;
+ for (int len = 1, step = 2; len <= rootBits; len++, step <<= 1) {
+ for (; count[len] > 0; count[len]--) {
+ replicateValue(tableGroup, tableOffset + key, step, tableSize,
+ len << 16 | sorted[symbol++]);
+ key = getNextKey(key, len);
+ }
+ }
+
+ // Fill in 2nd level tables and add pointers to root table.
+ int mask = totalSize - 1;
+ int low = -1;
+ int currentOffset = tableOffset;
+ for (int len = rootBits + 1, step = 2; len <= MAX_LENGTH; len++, step <<= 1) {
+ for (; count[len] > 0; count[len]--) {
+ if ((key & mask) != low) {
+ currentOffset += tableSize;
+ tableBits = nextTableBitSize(count, len, rootBits);
+ tableSize = 1 << tableBits;
+ totalSize += tableSize;
+ low = key & mask;
+ tableGroup[tableOffset + low] =
+ (tableBits + rootBits) << 16 | (currentOffset - tableOffset - low);
+ }
+ replicateValue(tableGroup, currentOffset + (key >> rootBits), step, tableSize,
+ (len - rootBits) << 16 | sorted[symbol++]);
+ key = getNextKey(key, len);
+ }
+ }
+ return totalSize;
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/SetDictionaryTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/SetDictionaryTest.java
new file mode 100644
index 000000000..f462c49eb
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/SetDictionaryTest.java
@@ -0,0 +1,76 @@
+/* Copyright 2016 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for {@link Dictionary}.
+ */
+@RunWith(JUnit4.class)
+public class SetDictionaryTest {
+
+ /** See {@link SynthTest} */
+ private static final byte[] BASE_DICT_WORD = {
+ (byte) 0x1b, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x41, (byte) 0x02
+ };
+
+ /** See {@link SynthTest} */
+ private static final byte[] ONE_COMMAND = {
+ (byte) 0x1b, (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x11, (byte) 0x86, (byte) 0x02
+ };
+
+ @Test
+ public void testSetDictionary() throws IOException {
+ byte[] buffer = new byte[16];
+ BrotliInputStream decoder;
+
+ // No dictionary set; still decoding should succeed, if no dictionary entries are used.
+ decoder = new BrotliInputStream(new ByteArrayInputStream(ONE_COMMAND));
+ assertEquals(3, decoder.read(buffer, 0, buffer.length));
+ assertEquals("aaa", new String(buffer, 0, 3, "US-ASCII"));
+ decoder.close();
+
+ // Decoding of dictionary item must fail.
+ decoder = new BrotliInputStream(new ByteArrayInputStream(BASE_DICT_WORD));
+ boolean decodingFailed = false;
+ try {
+ decoder.read(buffer, 0, buffer.length);
+ } catch (IOException ex) {
+ decodingFailed = true;
+ }
+ assertEquals(true, decodingFailed);
+ decoder.close();
+
+ // Load dictionary data.
+ FileChannel dictionaryChannel =
+ new FileInputStream(System.getProperty("RFC_DICTIONARY")).getChannel();
+ ByteBuffer dictionary = dictionaryChannel.map(FileChannel.MapMode.READ_ONLY, 0, 122784).load();
+ Dictionary.setData(dictionary);
+
+ // Retry decoding of dictionary item.
+ decoder = new BrotliInputStream(new ByteArrayInputStream(BASE_DICT_WORD));
+ assertEquals(4, decoder.read(buffer, 0, buffer.length));
+ assertEquals("time", new String(buffer, 0, 4, "US-ASCII"));
+ decoder.close();
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/State.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/State.java
new file mode 100644
index 000000000..54a5a2d91
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/State.java
@@ -0,0 +1,89 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+import java.io.InputStream;
+
+final class State {
+ byte[] ringBuffer;
+ byte[] contextModes;
+ byte[] contextMap;
+ byte[] distContextMap;
+ byte[] distExtraBits;
+ byte[] output;
+ byte[] byteBuffer; // BitReader
+
+ short[] shortBuffer; // BitReader
+
+ int[] intBuffer; // BitReader
+ int[] rings;
+ int[] blockTrees;
+ int[] literalTreeGroup;
+ int[] commandTreeGroup;
+ int[] distanceTreeGroup;
+ int[] distOffset;
+
+ long accumulator64; // BitReader: pre-fetched bits.
+
+ int runningState; // Default value is 0 == Decode.UNINITIALIZED
+ int nextRunningState;
+ int accumulator32; // BitReader: pre-fetched bits.
+ int bitOffset; // BitReader: bit-reading position in accumulator.
+ int halfOffset; // BitReader: offset of next item in intBuffer/shortBuffer.
+ int tailBytes; // BitReader: number of bytes in unfinished half.
+ int endOfStreamReached; // BitReader: input stream is finished.
+ int metaBlockLength;
+ int inputEnd;
+ int isUncompressed;
+ int isMetadata;
+ int literalBlockLength;
+ int numLiteralBlockTypes;
+ int commandBlockLength;
+ int numCommandBlockTypes;
+ int distanceBlockLength;
+ int numDistanceBlockTypes;
+ int pos;
+ int maxDistance;
+ int distRbIdx;
+ int trivialLiteralContext;
+ int literalTreeIdx;
+ int commandTreeIdx;
+ int j;
+ int insertLength;
+ int contextMapSlice;
+ int distContextMapSlice;
+ int contextLookupOffset1;
+ int contextLookupOffset2;
+ int distanceCode;
+ int numDirectDistanceCodes;
+ int distancePostfixMask;
+ int distancePostfixBits;
+ int distance;
+ int copyLength;
+ int maxBackwardDistance;
+ int maxRingBufferSize;
+ int ringBufferSize;
+ int expectedTotalSize;
+ int outputOffset;
+ int outputLength;
+ int outputUsed;
+ int ringBufferBytesWritten;
+ int ringBufferBytesReady;
+ int isEager;
+ int isLargeWindow;
+
+ InputStream input; // BitReader
+
+ State() {
+ this.ringBuffer = new byte[0];
+ this.rings = new int[10];
+ this.rings[0] = 16;
+ this.rings[1] = 15;
+ this.rings[2] = 11;
+ this.rings[3] = 4;
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/SynthTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/SynthTest.java
new file mode 100644
index 000000000..e269e6b03
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/SynthTest.java
@@ -0,0 +1,2940 @@
+/* Copyright 2016 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.fail;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for {@link Decode}.
+ */
+@RunWith(JUnit4.class)
+public class SynthTest {
+
+ static byte[] readUniBytes(String uniBytes) {
+ byte[] result = new byte[uniBytes.length()];
+ for (int i = 0; i < result.length; ++i) {
+ result[i] = (byte) uniBytes.charAt(i);
+ }
+ return result;
+ }
+
+ private byte[] decompress(byte[] data) throws IOException {
+ byte[] buffer = new byte[65536];
+ ByteArrayInputStream input = new ByteArrayInputStream(data);
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ BrotliInputStream brotliInput = new BrotliInputStream(input);
+ while (true) {
+ int len = brotliInput.read(buffer, 0, buffer.length);
+ if (len <= 0) {
+ break;
+ }
+ output.write(buffer, 0, len);
+ }
+ brotliInput.close();
+ return output.toByteArray();
+ }
+
+ private void checkSynth(byte[] compressed, boolean expectSuccess,
+ String expectedOutput) {
+ byte[] expected = readUniBytes(expectedOutput);
+ try {
+ byte[] actual = decompress(compressed);
+ if (!expectSuccess) {
+ fail("expected to fail decoding, but succeeded");
+ }
+ assertArrayEquals(expected, actual);
+ } catch (IOException ex) {
+ if (expectSuccess) {
+ fail("expected to succeed decoding, but failed");
+ }
+ }
+ }
+
+/* GENERATED CODE START */
+
+ @Test
+ public void testAllTransforms10() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0xfc, (byte) 0x05, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x13, (byte) 0x7c, (byte) 0x84, (byte) 0x26, (byte) 0xf8, (byte) 0x04,
+ (byte) 0x10, (byte) 0x4c, (byte) 0xf0, (byte) 0x89, (byte) 0x38, (byte) 0x30, (byte) 0xc1,
+ (byte) 0x27, (byte) 0x4e, (byte) 0xc1, (byte) 0x04, (byte) 0x9f, (byte) 0x64, (byte) 0x06,
+ (byte) 0x26, (byte) 0xf8, (byte) 0x24, (byte) 0x3f, (byte) 0x34, (byte) 0xc1, (byte) 0x27,
+ (byte) 0x7d, (byte) 0x82, (byte) 0x09, (byte) 0x3e, (byte) 0xe9, (byte) 0x16, (byte) 0x4d,
+ (byte) 0xf0, (byte) 0xc9, (byte) 0xd2, (byte) 0xc0, (byte) 0x04, (byte) 0x9f, (byte) 0x0c,
+ (byte) 0x8f, (byte) 0x4c, (byte) 0xf0, (byte) 0xc9, (byte) 0x06, (byte) 0xd1, (byte) 0x04,
+ (byte) 0x9f, (byte) 0x6c, (byte) 0x92, (byte) 0x4d, (byte) 0xf0, (byte) 0xc9, (byte) 0x39,
+ (byte) 0xc1, (byte) 0x04, (byte) 0x9f, (byte) 0xdc, (byte) 0x94, (byte) 0x4c, (byte) 0xf0,
+ (byte) 0xc9, (byte) 0x69, (byte) 0xd1, (byte) 0x04, (byte) 0x9f, (byte) 0x3c, (byte) 0x98,
+ (byte) 0x4d, (byte) 0xf0, (byte) 0x29, (byte) 0x9c, (byte) 0x81, (byte) 0x09, (byte) 0x3e,
+ (byte) 0x45, (byte) 0x37, (byte) 0x31, (byte) 0xc1, (byte) 0xa7, (byte) 0x60, (byte) 0x47,
+ (byte) 0x26, (byte) 0xf8, (byte) 0x14, (byte) 0xfa, (byte) 0xcc, (byte) 0x04, (byte) 0x9f,
+ (byte) 0xc2, (byte) 0x20, (byte) 0x9a, (byte) 0xe0, (byte) 0x53, (byte) 0x48, (byte) 0x54,
+ (byte) 0x13, (byte) 0x7c, (byte) 0x8a, (byte) 0x8f, (byte) 0x6c, (byte) 0x82, (byte) 0x4f,
+ (byte) 0xb1, (byte) 0xd2, (byte) 0x4d, (byte) 0xf0, (byte) 0x29, (byte) 0x67, (byte) 0x82,
+ (byte) 0x09, (byte) 0x3e, (byte) 0xe5, (byte) 0x4f, (byte) 0x31, (byte) 0xc1, (byte) 0xa7,
+ (byte) 0x7c, (byte) 0x4a, (byte) 0x26, (byte) 0xf8, (byte) 0x94, (byte) 0x57, (byte) 0xcd,
+ (byte) 0x04, (byte) 0x9f, (byte) 0x12, (byte) 0x2c, (byte) 0x9a, (byte) 0xe0, (byte) 0x53,
+ (byte) 0xba, (byte) 0x55, (byte) 0x13, (byte) 0x7c, (byte) 0xca, (byte) 0xbf, (byte) 0x6c,
+ (byte) 0x82, (byte) 0x4f, (byte) 0xb9, (byte) 0xd8, (byte) 0x4d, (byte) 0xf0, (byte) 0xa9,
+ (byte) 0x30, (byte) 0x03, (byte) 0x13, (byte) 0x7c, (byte) 0x2a, (byte) 0xd2, (byte) 0xc2,
+ (byte) 0x04, (byte) 0x9f, (byte) 0x4a, (byte) 0x36, (byte) 0x31, (byte) 0xc1, (byte) 0xa7,
+ (byte) 0xca, (byte) 0x6d, (byte) 0x4c, (byte) 0xf0, (byte) 0xa9, (byte) 0x94, (byte) 0x23,
+ (byte) 0x13, (byte) 0x7c, (byte) 0x2a, (byte) 0xeb, (byte) 0xca, (byte) 0x04, (byte) 0x9f,
+ (byte) 0xea, (byte) 0x3c, (byte) 0x33, (byte) 0xc1, (byte) 0xa7, (byte) 0xb2, (byte) 0xef,
+ (byte) 0x4c, (byte) 0xf0, (byte) 0xa9, (byte) 0xf8, (byte) 0x43, (byte) 0x13, (byte) 0x7c,
+ (byte) 0xaa, (byte) 0x00, (byte) 0xd3, (byte) 0x04, (byte) 0x9f, (byte) 0x2a, (byte) 0x42,
+ (byte) 0x35, (byte) 0xc1, (byte) 0xa7, (byte) 0xc2, (byte) 0x70, (byte) 0x4d, (byte) 0xf0,
+ (byte) 0xa9, (byte) 0x52, (byte) 0x64, (byte) 0x13, (byte) 0x7c, (byte) 0x2a, (byte) 0x1a,
+ (byte) 0xdb, (byte) 0x04, (byte) 0x9f, (byte) 0x6a, (byte) 0x48, (byte) 0x37, (byte) 0xc1,
+ (byte) 0xa7, (byte) 0x92, (byte) 0xf2, (byte) 0x4d, (byte) 0xf0, (byte) 0xa9, (byte) 0xc3,
+ (byte) 0x04, (byte) 0x13, (byte) 0x7c, (byte) 0xea, (byte) 0x32, (byte) 0xc3, (byte) 0x04,
+ (byte) 0x9f, (byte) 0x7a, (byte) 0x4e, (byte) 0x31, (byte) 0xc1, (byte) 0xa7, (byte) 0x06,
+ (byte) 0x74, (byte) 0x4c, (byte) 0xf0, (byte) 0xa9, (byte) 0x19, (byte) 0x25, (byte) 0x13,
+ (byte) 0x7c, (byte) 0x6a, (byte) 0x4d, (byte) 0xcb, (byte) 0x04, (byte) 0x9f, (byte) 0x1a,
+ (byte) 0x55, (byte) 0x33, (byte) 0xc1, (byte) 0xa7, (byte) 0x56, (byte) 0xf5, (byte) 0x4c,
+ (byte) 0xf0, (byte) 0xa9, (byte) 0x5d, (byte) 0x45, (byte) 0x13, (byte) 0x7c, (byte) 0xea,
+ (byte) 0x59, (byte) 0xd3, (byte) 0x04, (byte) 0x9f, (byte) 0xfa, (byte) 0x57, (byte) 0x35,
+ (byte) 0xc1, (byte) 0xa7, (byte) 0x66, (byte) 0x76, (byte) 0x4d, (byte) 0xf0, (byte) 0xa9,
+ (byte) 0x9f, (byte) 0x65, (byte) 0x13, (byte) 0x7c, (byte) 0x6a, (byte) 0x6f, (byte) 0xdb,
+ (byte) 0x04, (byte) 0x9f, (byte) 0x9a, (byte) 0x5d, (byte) 0x37, (byte) 0xc1, (byte) 0xa7,
+ (byte) 0x06, (byte) 0xf8, (byte) 0x4d, (byte) 0xf0, (byte) 0x69, (byte) 0x0c, (byte) 0x06,
+ (byte) 0x26, (byte) 0xf8, (byte) 0x34, (byte) 0x08, (byte) 0x07, (byte) 0x13, (byte) 0x7c,
+ (byte) 0x1a, (byte) 0x8b, (byte) 0x85, (byte) 0x09, (byte) 0x3e, (byte) 0x8d, (byte) 0xc8,
+ (byte) 0xc3, (byte) 0x04, (byte) 0x9f, (byte) 0xe6, (byte) 0x65, (byte) 0x62, (byte) 0x82,
+ (byte) 0x4f, (byte) 0xb3, (byte) 0x73, (byte) 0x31, (byte) 0xc1, (byte) 0xa7, (byte) 0x41,
+ (byte) 0xda, (byte) 0x98, (byte) 0xe0, (byte) 0xd3, (byte) 0x54, (byte) 0x7d, (byte) 0x4c,
+ (byte) 0xf0, (byte) 0x69, (byte) 0xc4, (byte) 0x46, (byte) 0x26, (byte) 0xf8, (byte) 0x34,
+ (byte) 0x72, (byte) 0x27, (byte) 0x13, (byte) 0x7c, (byte) 0x1a, (byte) 0xc5, (byte) 0x95,
+ (byte) 0x09, (byte) 0x3e, (byte) 0x8d, (byte) 0xe5, (byte) 0xcb, (byte) 0x04, (byte) 0x9f,
+ (byte) 0x06, (byte) 0x75, (byte) 0x66, (byte) 0x82, (byte) 0x4f, (byte) 0x43, (byte) 0x7b,
+ (byte) 0x33, (byte) 0xc1, (byte) 0xa7, (byte) 0x09, (byte) 0xde, (byte) 0x99, (byte) 0xe0,
+ (byte) 0xd3, (byte) 0x34, (byte) 0xff, (byte) 0x4c, (byte) 0xf0, (byte) 0x69, (byte) 0xb2,
+ (byte) 0x87, (byte) 0x26, (byte) 0xf8, (byte) 0x34, (byte) 0xe9, (byte) 0x47, (byte) 0x13,
+ (byte) 0x7c, (byte) 0x9a, (byte) 0xfb, (byte) 0xa5, (byte) 0x09, (byte) 0x3e, (byte) 0x4d,
+ (byte) 0x01, (byte) 0xd4, (byte) 0x04, (byte) 0x9f, (byte) 0x46, (byte) 0x82, (byte) 0x6a,
+ (byte) 0x82, (byte) 0x4f, (byte) 0x03, (byte) 0x82, (byte) 0x35, (byte) 0xc1, (byte) 0xa7,
+ (byte) 0x61, (byte) 0xe1, (byte) 0x9a, (byte) 0xe0, (byte) 0xd3, (byte) 0xe4, (byte) 0x80,
+ (byte) 0x4d, (byte) 0xf0, (byte) 0x69, (byte) 0x8a, (byte) 0xc8, (byte) 0x26, (byte) 0xf8,
+ (byte) 0x34, (byte) 0x52, (byte) 0x68, (byte) 0x13, (byte) 0x7c, (byte) 0x9a, (byte) 0x2f,
+ (byte) 0xb6, (byte) 0x09, (byte) 0x3e, (byte) 0x8d, (byte) 0x1b, (byte) 0xdc, (byte) 0x04,
+ (byte) 0x9f, (byte) 0x86, (byte) 0x8f, (byte) 0x6e, (byte) 0x82, (byte) 0x4f, (byte) 0xb3,
+ (byte) 0x88, (byte) 0x37, (byte) 0xc1, (byte) 0xa7, (byte) 0xd9, (byte) 0xe4, (byte) 0x9b,
+ (byte) 0xe0, (byte) 0xd3, (byte) 0x9e, (byte) 0x02, (byte) 0x4c, (byte) 0xf0, (byte) 0x69,
+ (byte) 0x6d, (byte) 0x09, (byte) 0x26, (byte) 0xf8, (byte) 0xb4, (byte) 0xc3, (byte) 0x08,
+ (byte) 0x13, (byte) 0x7c, (byte) 0x5a, (byte) 0x68, (byte) 0x86, (byte) 0x09, (byte) 0x3e,
+ (byte) 0xad, (byte) 0x37, (byte) 0xc4, (byte) 0x04, (byte) 0x9f, (byte) 0x56, (byte) 0x9d,
+ (byte) 0x62, (byte) 0x82, (byte) 0x4f, (byte) 0x9b, (byte) 0x8f, (byte) 0x31, (byte) 0xc1,
+ (byte) 0xa7, (byte) 0x2d, (byte) 0xe8, (byte) 0x98, (byte) 0xe0, (byte) 0xd3, (byte) 0x4a,
+ (byte) 0x84, (byte) 0x4c, (byte) 0xf0, (byte) 0x69, (byte) 0x3f, (byte) 0x4a, (byte) 0x26,
+ (byte) 0xf8, (byte) 0xb4, (byte) 0x2c, (byte) 0x29, (byte) 0x13, (byte) 0x7c, (byte) 0xda,
+ (byte) 0x9c, (byte) 0x96, (byte) 0x09, (byte) 0x3e, (byte) 0x2d, (byte) 0x52, (byte) 0xcc,
+ (byte) 0x04, (byte) 0x9f, (byte) 0xb6, (byte) 0xaa, (byte) 0x66, (byte) 0x82, (byte) 0x4f,
+ (byte) 0x2b, (byte) 0x96, (byte) 0x33, (byte) 0xc1, (byte) 0xa7, (byte) 0x7d, (byte) 0xeb,
+ (byte) 0x99, (byte) 0xe0, (byte) 0xd3, (byte) 0xf6, (byte) 0x05, (byte) 0x4d, (byte) 0xf0,
+ (byte) 0x69, (byte) 0x17, (byte) 0x8b, (byte) 0x26, (byte) 0xf8, (byte) 0xb4, (byte) 0x97,
+ (byte) 0x49, (byte) 0x13, (byte) 0x7c, (byte) 0xda, (byte) 0xd1, (byte) 0xa6, (byte) 0x09,
+ (byte) 0x3e, (byte) 0x2d, (byte) 0x6c, (byte) 0xd4, (byte) 0x04, (byte) 0x9f, (byte) 0xb6,
+ (byte) 0xb7, (byte) 0x6a, (byte) 0x82, (byte) 0x4f, (byte) 0xab, (byte) 0x9c, (byte) 0x35,
+ (byte) 0xc1, (byte) 0xa7, (byte) 0xc5, (byte) 0xee, (byte) 0x9a, (byte) 0xe0, (byte) 0xd3,
+ (byte) 0x9a, (byte) 0x87, (byte) 0x4d, (byte) 0xf0, (byte) 0x69, (byte) 0xe9, (byte) 0xcb
+ };
+ checkSynth(
+ /*
+ * // The stream consists of word "time" with all possible transforms.
+ * main_header
+ * metablock_header_easy: 1533, 1
+ * command_easy: 10, "|", 2 // = 0 << 10 + 1 + 1
+ * command_easy: 10, "|", 1037 // = 1 << 10 + 1 + 12
+ * command_easy: 10, "|", 2073 // = 2 << 10 + 1 + 24
+ * command_easy: 10, "|", 3110 // = 3 << 10 + 1 + 37
+ * command_easy: 10, "|", 4144 // = 4 << 10 + 1 + 47
+ * command_easy: 10, "|", 5180 // = 5 << 10 + 1 + 59
+ * command_easy: 10, "|", 6220 // = 6 << 10 + 1 + 75
+ * command_easy: 10, "|", 7256 // = 7 << 10 + 1 + 87
+ * command_easy: 10, "|", 8294 // = 8 << 10 + 1 + 101
+ * command_easy: 10, "|", 9333 // = 9 << 10 + 1 + 116
+ * command_easy: 10, "|", 10368 // = 10 << 10 + 1 + 127
+ * command_easy: 10, "|", 11408 // = 11 << 10 + 1 + 143
+ * command_easy: 10, "|", 12441 // = 12 << 10 + 1 + 152
+ * command_easy: 10, "|", 13475 // = 13 << 10 + 1 + 162
+ * command_easy: 10, "|", 14513 // = 14 << 10 + 1 + 176
+ * command_easy: 10, "|", 15550 // = 15 << 10 + 1 + 189
+ * command_easy: 10, "|", 16587 // = 16 << 10 + 1 + 202
+ * command_easy: 10, "|", 17626 // = 17 << 10 + 1 + 217
+ * command_easy: 10, "|", 18665 // = 18 << 10 + 1 + 232
+ * command_easy: 10, "|", 19703 // = 19 << 10 + 1 + 246
+ * command_easy: 10, "|", 20739 // = 20 << 10 + 1 + 258
+ * command_easy: 10, "|", 21775 // = 21 << 10 + 1 + 270
+ * command_easy: 10, "|", 22812 // = 22 << 10 + 1 + 283
+ * command_easy: 10, "|", 23848 // = 23 << 10 + 1 + 295
+ * command_easy: 10, "|", 24880 // = 24 << 10 + 1 + 303
+ * command_easy: 10, "|", 25916 // = 25 << 10 + 1 + 315
+ * command_easy: 10, "|", 26956 // = 26 << 10 + 1 + 331
+ * command_easy: 10, "|", 27988 // = 27 << 10 + 1 + 339
+ * command_easy: 10, "|", 29021 // = 28 << 10 + 1 + 348
+ * command_easy: 10, "|", 30059 // = 29 << 10 + 1 + 362
+ * command_easy: 10, "|", 31100 // = 30 << 10 + 1 + 379
+ * command_easy: 10, "|", 32136 // = 31 << 10 + 1 + 391
+ * command_easy: 10, "|", 33173 // = 32 << 10 + 1 + 404
+ * command_easy: 10, "|", 34209 // = 33 << 10 + 1 + 416
+ * command_easy: 10, "|", 35247 // = 34 << 10 + 1 + 430
+ * command_easy: 10, "|", 36278 // = 35 << 10 + 1 + 437
+ * command_easy: 10, "|", 37319 // = 36 << 10 + 1 + 454
+ * command_easy: 10, "|", 38355 // = 37 << 10 + 1 + 466
+ * command_easy: 10, "|", 39396 // = 38 << 10 + 1 + 483
+ * command_easy: 10, "|", 40435 // = 39 << 10 + 1 + 498
+ * command_easy: 10, "|", 41465 // = 40 << 10 + 1 + 504
+ * command_easy: 10, "|", 42494 // = 41 << 10 + 1 + 509
+ * command_easy: 10, "|", 43534 // = 42 << 10 + 1 + 525
+ * command_easy: 10, "|", 44565 // = 43 << 10 + 1 + 532
+ * command_easy: 10, "|", 45606 // = 44 << 10 + 1 + 549
+ * command_easy: 10, "|", 46641 // = 45 << 10 + 1 + 560
+ * command_easy: 10, "|", 47680 // = 46 << 10 + 1 + 575
+ * command_easy: 10, "|", 48719 // = 47 << 10 + 1 + 590
+ * command_easy: 10, "|", 49758 // = 48 << 10 + 1 + 605
+ * command_easy: 10, "|", 50786 // = 49 << 10 + 1 + 609
+ * command_easy: 10, "|", 51824 // = 50 << 10 + 1 + 623
+ * command_easy: 10, "|", 52861 // = 51 << 10 + 1 + 636
+ * command_easy: 10, "|", 53897 // = 52 << 10 + 1 + 648
+ * command_easy: 10, "|", 54935 // = 53 << 10 + 1 + 662
+ * command_easy: 10, "|", 55973 // = 54 << 10 + 1 + 676
+ * command_easy: 10, "|", 56999 // = 55 << 10 + 1 + 678
+ * command_easy: 10, "|", 58027 // = 56 << 10 + 1 + 682
+ * command_easy: 10, "|", 59056 // = 57 << 10 + 1 + 687
+ * command_easy: 10, "|", 60092 // = 58 << 10 + 1 + 699
+ * command_easy: 10, "|", 61129 // = 59 << 10 + 1 + 712
+ * command_easy: 10, "|", 62156 // = 60 << 10 + 1 + 715
+ * command_easy: 10, "|", 63195 // = 61 << 10 + 1 + 730
+ * command_easy: 10, "|", 64233 // = 62 << 10 + 1 + 744
+ * command_easy: 10, "|", 65277 // = 63 << 10 + 1 + 764
+ * command_easy: 10, "|", 66307 // = 64 << 10 + 1 + 770
+ * command_easy: 10, "|", 67333 // = 65 << 10 + 1 + 772
+ * command_easy: 10, "|", 68371 // = 66 << 10 + 1 + 786
+ * command_easy: 10, "|", 69407 // = 67 << 10 + 1 + 798
+ * command_easy: 10, "|", 70444 // = 68 << 10 + 1 + 811
+ * command_easy: 10, "|", 71480 // = 69 << 10 + 1 + 823
+ * command_easy: 10, "|", 72517 // = 70 << 10 + 1 + 836
+ * command_easy: 10, "|", 73554 // = 71 << 10 + 1 + 849
+ * command_easy: 10, "|", 74591 // = 72 << 10 + 1 + 862
+ * command_easy: 10, "|", 75631 // = 73 << 10 + 1 + 878
+ * command_easy: 10, "|", 76679 // = 74 << 10 + 1 + 902
+ * command_easy: 10, "|", 77715 // = 75 << 10 + 1 + 914
+ * command_easy: 10, "|", 78757 // = 76 << 10 + 1 + 932
+ * command_easy: 10, "|", 79793 // = 77 << 10 + 1 + 944
+ * command_easy: 10, "|", 80830 // = 78 << 10 + 1 + 957
+ * command_easy: 10, "|", 81866 // = 79 << 10 + 1 + 969
+ * command_easy: 10, "|", 82902 // = 80 << 10 + 1 + 981
+ * command_easy: 10, "|", 83942 // = 81 << 10 + 1 + 997
+ * command_easy: 10, "|", 84980 // = 82 << 10 + 1 + 1011
+ * command_easy: 10, "|", 86018 // = 83 << 10 + 1 + 1025
+ * command_easy: 10, "|", 87055 // = 84 << 10 + 1 + 1038
+ * command_easy: 10, "|", 88093 // = 85 << 10 + 1 + 1052
+ * command_easy: 10, "|", 89129 // = 86 << 10 + 1 + 1064
+ * command_easy: 10, "|", 90166 // = 87 << 10 + 1 + 1077
+ * command_easy: 10, "|", 91202 // = 88 << 10 + 1 + 1089
+ * command_easy: 10, "|", 92239 // = 89 << 10 + 1 + 1102
+ * command_easy: 10, "|", 93276 // = 90 << 10 + 1 + 1115
+ * command_easy: 10, "|", 94315 // = 91 << 10 + 1 + 1130
+ * command_easy: 10, "|", 95353 // = 92 << 10 + 1 + 1144
+ * command_easy: 10, "|", 96392 // = 93 << 10 + 1 + 1159
+ * command_easy: 10, "|", 97432 // = 94 << 10 + 1 + 1175
+ * command_easy: 10, "|", 98468 // = 95 << 10 + 1 + 1187
+ * command_easy: 10, "|", 99507 // = 96 << 10 + 1 + 1202
+ * command_easy: 10, "|", 100544 // = 97 << 10 + 1 + 1215
+ * command_easy: 10, "|", 101581 // = 98 << 10 + 1 + 1228
+ * command_easy: 10, "|", 102619 // = 99 << 10 + 1 + 1242
+ * command_easy: 10, "|", 103655 // = 100 << 10 + 1 + 1254
+ * command_easy: 10, "|", 104694 // = 101 << 10 + 1 + 1269
+ * command_easy: 10, "|", 105730 // = 102 << 10 + 1 + 1281
+ * command_easy: 10, "|", 106767 // = 103 << 10 + 1 + 1294
+ * command_easy: 10, "|", 107804 // = 104 << 10 + 1 + 1307
+ * command_easy: 10, "|", 108841 // = 105 << 10 + 1 + 1320
+ * command_easy: 10, "|", 109878 // = 106 << 10 + 1 + 1333
+ * command_easy: 10, "|", 110917 // = 107 << 10 + 1 + 1348
+ * command_easy: 10, "|", 111954 // = 108 << 10 + 1 + 1361
+ * command_easy: 10, "|", 112991 // = 109 << 10 + 1 + 1374
+ * command_easy: 10, "|", 114028 // = 110 << 10 + 1 + 1387
+ * command_easy: 10, "|", 115066 // = 111 << 10 + 1 + 1401
+ * command_easy: 10, "|", 116104 // = 112 << 10 + 1 + 1415
+ * command_easy: 10, "|", 117140 // = 113 << 10 + 1 + 1427
+ * command_easy: 10, "|", 118176 // = 114 << 10 + 1 + 1439
+ * command_easy: 10, "|", 119213 // = 115 << 10 + 1 + 1452
+ * command_easy: 10, "|", 120250 // = 116 << 10 + 1 + 1465
+ * command_easy: 10, "|", 121287 // = 117 << 10 + 1 + 1478
+ * command_easy: 10, "|", 122325 // = 118 << 10 + 1 + 1492
+ * command_easy: 10, "|", 123363 // = 119 << 10 + 1 + 1506
+ * command_easy: 10, "|", 124401 // = 120 << 10 + 1 + 1520
+ */
+ compressed,
+ true,
+ "|categories|categories | categories |ategories|Categories |categories the | categories|s cat"
+ + "egories |categories of |Categories|categories and |tegories|categorie|, categories |catego"
+ + "ries, | Categories |categories in |categories to |e categories |categories\"|categories.|c"
+ + "ategories\">|categories\n|categor|categories]|categories for |egories|categori|categories "
+ + "a |categories that | Categories|categories. |.categories| categories, |gories|categories w"
+ + "ith |categories'|categories from |categories by |ories|ries| the categories|catego|categor"
+ + "ies. The |CATEGORIES|categories on |categories as |categories is |cat|categorieing |catego"
+ + "ries\n\t|categories:| categories. |categoriesed |s|ies|cate|categories(|Categories, |ca|ca"
+ + "tegories at |categoriesly | the categories of |categ|c| Categories, |Categories\"|.categor"
+ + "ies(|CATEGORIES |Categories\">|categories=\"| categories.|.com/categories| the categories "
+ + "of the |Categories'|categories. This |categories,|.categories |Categories(|Categories.|cat"
+ + "egories not | categories=\"|categorieser | CATEGORIES |categoriesal | CATEGORIES|categorie"
+ + "s='|CATEGORIES\"|Categories. | categories(|categoriesful | Categories. |categoriesive |cat"
+ + "egoriesless |CATEGORIES'|categoriesest | Categories.|CATEGORIES\">| categories='|Categorie"
+ + "s,|categoriesize |CATEGORIES.|\302\240categories| categories,|Categories=\"|CATEGORIES="
+ + "\"|categoriesous |CATEGORIES, |Categories='| Categories,| CATEGORIES=\"| CATEGORIES, |CATE"
+ + "GORIES,|CATEGORIES(|CATEGORIES. | CATEGORIES.|CATEGORIES='| CATEGORIES. | Categories=\"| C"
+ + "ATEGORIES='| Categories='"
+ );
+ }
+
+ @Test
+ public void testAllTransforms4() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x40, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x51, (byte) 0x3e, (byte) 0x42, (byte) 0x51, (byte) 0x3e, (byte) 0x81,
+ (byte) 0x02, (byte) 0x51, (byte) 0x3e, (byte) 0x11, (byte) 0x04, (byte) 0xa2, (byte) 0x7c,
+ (byte) 0xe2, (byte) 0x0b, (byte) 0x44, (byte) 0xf9, (byte) 0x24, (byte) 0x1b, (byte) 0x10,
+ (byte) 0xe5, (byte) 0x93, (byte) 0x84, (byte) 0x50, (byte) 0x94, (byte) 0x4f, (byte) 0xba,
+ (byte) 0x02, (byte) 0x51, (byte) 0x3e, (byte) 0x69, (byte) 0x0c, (byte) 0x45, (byte) 0xf9,
+ (byte) 0x64, (byte) 0x39, (byte) 0x20, (byte) 0xca, (byte) 0x27, (byte) 0x13, (byte) 0x22,
+ (byte) 0x51, (byte) 0x3e, (byte) 0xd9, (byte) 0x11, (byte) 0x8a, (byte) 0xf2, (byte) 0xc9,
+ (byte) 0xa2, (byte) 0x58, (byte) 0x94, (byte) 0x4f, (byte) 0x4e, (byte) 0x05, (byte) 0xa2,
+ (byte) 0x7c, (byte) 0x72, (byte) 0x2c, (byte) 0x12, (byte) 0xe5, (byte) 0x93, (byte) 0x83,
+ (byte) 0xa1, (byte) 0x28, (byte) 0x9f, (byte) 0xfc, (byte) 0x8c, (byte) 0x45, (byte) 0xf9,
+ (byte) 0x14, (byte) 0x6e, (byte) 0x40, (byte) 0x94, (byte) 0x4f, (byte) 0x71, (byte) 0x47,
+ (byte) 0x44, (byte) 0xf9, (byte) 0x14, (byte) 0x80, (byte) 0x48, (byte) 0x94, (byte) 0x4f,
+ (byte) 0x81, (byte) 0xc8, (byte) 0x44, (byte) 0xf9, (byte) 0x14, (byte) 0x8e, (byte) 0x50,
+ (byte) 0x94, (byte) 0x4f, (byte) 0x41, (byte) 0x49, (byte) 0x45, (byte) 0xf9, (byte) 0x14,
+ (byte) 0x9b, (byte) 0x58, (byte) 0x94, (byte) 0x4f, (byte) 0x11, (byte) 0xca, (byte) 0x45,
+ (byte) 0xf9, (byte) 0x94, (byte) 0xa3, (byte) 0x40, (byte) 0x94, (byte) 0x4f, (byte) 0x99,
+ (byte) 0x4a, (byte) 0x44, (byte) 0xf9, (byte) 0x94, (byte) 0xb3, (byte) 0x48, (byte) 0x94,
+ (byte) 0x4f, (byte) 0x59, (byte) 0xcb, (byte) 0x44, (byte) 0xf9, (byte) 0x94, (byte) 0xb8,
+ (byte) 0x50, (byte) 0x94, (byte) 0x4f, (byte) 0x09, (byte) 0x4c, (byte) 0x45, (byte) 0xf9,
+ (byte) 0x94, (byte) 0xcb, (byte) 0x58, (byte) 0x94, (byte) 0x4f, (byte) 0x19, (byte) 0xcd,
+ (byte) 0x45, (byte) 0xf9, (byte) 0x54, (byte) 0xd8, (byte) 0x80, (byte) 0x28, (byte) 0x9f,
+ (byte) 0xca, (byte) 0x9b, (byte) 0x10, (byte) 0xe5, (byte) 0x53, (byte) 0x99, (byte) 0x23,
+ (byte) 0xa2, (byte) 0x7c, (byte) 0xaa, (byte) 0x73, (byte) 0x46, (byte) 0x94, (byte) 0x4f,
+ (byte) 0x25, (byte) 0x0f, (byte) 0x89, (byte) 0xf2, (byte) 0xa9, (byte) 0xf0, (byte) 0x29,
+ (byte) 0x51, (byte) 0x3e, (byte) 0xd5, (byte) 0x40, (byte) 0x26, (byte) 0xca, (byte) 0xa7,
+ (byte) 0x62, (byte) 0xe8, (byte) 0x44, (byte) 0xf9, (byte) 0x54, (byte) 0x0d, (byte) 0xa1,
+ (byte) 0x28, (byte) 0x9f, (byte) 0xca, (byte) 0xa1, (byte) 0x14, (byte) 0xe5, (byte) 0x53,
+ (byte) 0x61, (byte) 0xa4, (byte) 0xa2, (byte) 0x7c, (byte) 0xaa, (byte) 0x8c, (byte) 0x56,
+ (byte) 0x94, (byte) 0x4f, (byte) 0x45, (byte) 0x12, (byte) 0x8b, (byte) 0xf2, (byte) 0xa9,
+ (byte) 0x52, (byte) 0x6a, (byte) 0x51, (byte) 0x3e, (byte) 0x95, (byte) 0x4c, (byte) 0x2e,
+ (byte) 0xca, (byte) 0xa7, (byte) 0xda, (byte) 0xe9, (byte) 0x45, (byte) 0xf9, (byte) 0xd4,
+ (byte) 0x44, (byte) 0x81, (byte) 0x28, (byte) 0x9f, (byte) 0xba, (byte) 0xa8, (byte) 0x10,
+ (byte) 0xe5, (byte) 0x53, (byte) 0x37, (byte) 0x25, (byte) 0xa2, (byte) 0x7c, (byte) 0x6a,
+ (byte) 0xaa, (byte) 0x46, (byte) 0x94, (byte) 0x4f, (byte) 0xad, (byte) 0x15, (byte) 0x89,
+ (byte) 0xf2, (byte) 0xa9, (byte) 0xc5, (byte) 0x2a, (byte) 0x51, (byte) 0x3e, (byte) 0xb5,
+ (byte) 0x5a, (byte) 0x26, (byte) 0xca, (byte) 0xa7, (byte) 0x5e, (byte) 0xeb, (byte) 0x44,
+ (byte) 0xf9, (byte) 0xd4, (byte) 0x6c, (byte) 0xa1, (byte) 0x28, (byte) 0x9f, (byte) 0xba,
+ (byte) 0xad, (byte) 0x14, (byte) 0xe5, (byte) 0x53, (byte) 0xcf, (byte) 0xa5, (byte) 0xa2,
+ (byte) 0x7c, (byte) 0x6a, (byte) 0xbd, (byte) 0x56, (byte) 0x94, (byte) 0x4f, (byte) 0xbd,
+ (byte) 0x17, (byte) 0x8b, (byte) 0xf2, (byte) 0xa9, (byte) 0x09, (byte) 0x6b, (byte) 0x51,
+ (byte) 0x3e, (byte) 0x35, (byte) 0x63, (byte) 0x2e, (byte) 0xca, (byte) 0xa7, (byte) 0xd6,
+ (byte) 0xec, (byte) 0x45, (byte) 0xf9, (byte) 0x34, (byte) 0x9b, (byte) 0x01, (byte) 0x51,
+ (byte) 0x3e, (byte) 0x0d, (byte) 0x67, (byte) 0x41, (byte) 0x94, (byte) 0x4f, (byte) 0x43,
+ (byte) 0x9a, (byte) 0x10, (byte) 0xe5, (byte) 0xd3, (byte) 0xa8, (byte) 0x36, (byte) 0x44,
+ (byte) 0xf9, (byte) 0x34, (byte) 0xb1, (byte) 0x11, (byte) 0x51, (byte) 0x3e, (byte) 0xcd,
+ (byte) 0x6d, (byte) 0x45, (byte) 0x94, (byte) 0x4f, (byte) 0xe3, (byte) 0x9b, (byte) 0x11,
+ (byte) 0xe5, (byte) 0xd3, (byte) 0x14, (byte) 0x77, (byte) 0x44, (byte) 0xf9, (byte) 0x34,
+ (byte) 0xcc, (byte) 0x21, (byte) 0x51, (byte) 0x3e, (byte) 0x8d, (byte) 0x75, (byte) 0x49,
+ (byte) 0x94, (byte) 0x4f, (byte) 0x83, (byte) 0x9e, (byte) 0x12, (byte) 0xe5, (byte) 0xd3,
+ (byte) 0xb8, (byte) 0xb7, (byte) 0x44, (byte) 0xf9, (byte) 0x34, (byte) 0xfa, (byte) 0x31,
+ (byte) 0x51, (byte) 0x3e, (byte) 0x0d, (byte) 0x80, (byte) 0x4d, (byte) 0x94, (byte) 0x4f,
+ (byte) 0x73, (byte) 0xa0, (byte) 0x13, (byte) 0xe5, (byte) 0xd3, (byte) 0x34, (byte) 0xf8,
+ (byte) 0x44, (byte) 0xf9, (byte) 0x34, (byte) 0x13, (byte) 0x42, (byte) 0x51, (byte) 0x3e,
+ (byte) 0x4d, (byte) 0x87, (byte) 0x51, (byte) 0x94, (byte) 0x4f, (byte) 0x53, (byte) 0xa2,
+ (byte) 0x14, (byte) 0xe5, (byte) 0xd3, (byte) 0xb4, (byte) 0x38, (byte) 0x45, (byte) 0xf9,
+ (byte) 0x34, (byte) 0x34, (byte) 0x52, (byte) 0x51, (byte) 0x3e, (byte) 0x0d, (byte) 0x8f,
+ (byte) 0x55, (byte) 0x94, (byte) 0x4f, (byte) 0x23, (byte) 0xa4, (byte) 0x15, (byte) 0xe5,
+ (byte) 0xd3, (byte) 0x24, (byte) 0x79, (byte) 0x45, (byte) 0xf9, (byte) 0x34, (byte) 0x4f,
+ (byte) 0x62, (byte) 0x51, (byte) 0x3e, (byte) 0x8d, (byte) 0x95, (byte) 0x59, (byte) 0x94,
+ (byte) 0x4f, (byte) 0xd3, (byte) 0xa5, (byte) 0x16, (byte) 0xe5, (byte) 0xd3, (byte) 0x98,
+ (byte) 0xb9, (byte) 0x45, (byte) 0xf9, (byte) 0x34, (byte) 0x6e, (byte) 0x72, (byte) 0x51,
+ (byte) 0x3e, (byte) 0xcd, (byte) 0x9d, (byte) 0x5d, (byte) 0x94, (byte) 0x4f, (byte) 0x13,
+ (byte) 0xa8, (byte) 0x17, (byte) 0xe5, (byte) 0xd3, (byte) 0x1c, (byte) 0xfa, (byte) 0x45,
+ (byte) 0xf9, (byte) 0xb4, (byte) 0x90, (byte) 0x02, (byte) 0x51, (byte) 0x3e, (byte) 0xed,
+ (byte) 0xa5, (byte) 0x41, (byte) 0x94, (byte) 0x4f, (byte) 0xeb, (byte) 0xa9, (byte) 0x10,
+ (byte) 0xe5, (byte) 0xd3, (byte) 0x9a, (byte) 0x3a, (byte) 0x44, (byte) 0xf9, (byte) 0xb4,
+ (byte) 0xac, (byte) 0x12, (byte) 0x51, (byte) 0x3e, (byte) 0x6d, (byte) 0xad, (byte) 0x45,
+ (byte) 0x94, (byte) 0x4f, (byte) 0xbb, (byte) 0xab, (byte) 0x11, (byte) 0xe5, (byte) 0xd3,
+ (byte) 0x0a, (byte) 0x7b, (byte) 0x44, (byte) 0xf9, (byte) 0xb4, (byte) 0xc9, (byte) 0x22,
+ (byte) 0x51, (byte) 0x3e, (byte) 0x2d, (byte) 0xb4, (byte) 0x49, (byte) 0x94, (byte) 0x4f,
+ (byte) 0x7b, (byte) 0xad, (byte) 0x12, (byte) 0xe5, (byte) 0xd3, (byte) 0x82, (byte) 0xbb,
+ (byte) 0x44, (byte) 0xf9, (byte) 0xb4, (byte) 0xe7, (byte) 0x32, (byte) 0x51, (byte) 0x3e,
+ (byte) 0xad, (byte) 0xbb, (byte) 0x4d, (byte) 0x94, (byte) 0x4f, (byte) 0x5b, (byte) 0xaf,
+ (byte) 0x13, (byte) 0xe5, (byte) 0xd3, (byte) 0xf6, (byte) 0xfb, (byte) 0x44, (byte) 0xf9,
+ (byte) 0xb4, (byte) 0x05, (byte) 0x43, (byte) 0x51, (byte) 0x3e, (byte) 0xed, (byte) 0xc2,
+ (byte) 0x51, (byte) 0x94, (byte) 0x4f, (byte) 0x1b, (byte) 0xb1, (byte) 0x14, (byte) 0xe5,
+ (byte) 0xd3, (byte) 0x62, (byte) 0x3c, (byte) 0x45, (byte) 0xf9, (byte) 0xb4, (byte) 0x1f,
+ (byte) 0x53, (byte) 0x51, (byte) 0x3e, (byte) 0xad, (byte) 0xc9, (byte) 0x55, (byte) 0x94,
+ (byte) 0x4f, (byte) 0xeb, (byte) 0xb2, (byte) 0x15, (byte) 0xe5, (byte) 0xd3, (byte) 0xda,
+ (byte) 0x7c, (byte) 0x45, (byte) 0xf9, (byte) 0xb4, (byte) 0x3e, (byte) 0x63
+ };
+ checkSynth(
+ /*
+ * // The stream consists of word "time" with all possible transforms.
+ * main_header
+ * metablock_header_easy: 833, 1
+ * command_easy: 4, "|", 2 // = 0 << 10 + 1 + 1
+ * command_easy: 4, "|", 1031 // = 1 << 10 + 1 + 6
+ * command_easy: 4, "|", 2061 // = 2 << 10 + 1 + 12
+ * command_easy: 4, "|", 3092 // = 3 << 10 + 1 + 19
+ * command_easy: 4, "|", 4120 // = 4 << 10 + 1 + 23
+ * command_easy: 4, "|", 5150 // = 5 << 10 + 1 + 29
+ * command_easy: 4, "|", 6184 // = 6 << 10 + 1 + 39
+ * command_easy: 4, "|", 7214 // = 7 << 10 + 1 + 45
+ * command_easy: 4, "|", 8246 // = 8 << 10 + 1 + 53
+ * command_easy: 4, "|", 9279 // = 9 << 10 + 1 + 62
+ * command_easy: 4, "|", 10308 // = 10 << 10 + 1 + 67
+ * command_easy: 4, "|", 11342 // = 11 << 10 + 1 + 77
+ * command_easy: 4, "|", 12369 // = 12 << 10 + 1 + 80
+ * command_easy: 4, "|", 13397 // = 13 << 10 + 1 + 84
+ * command_easy: 4, "|", 14429 // = 14 << 10 + 1 + 92
+ * command_easy: 4, "|", 15460 // = 15 << 10 + 1 + 99
+ * command_easy: 4, "|", 16491 // = 16 << 10 + 1 + 106
+ * command_easy: 4, "|", 17524 // = 17 << 10 + 1 + 115
+ * command_easy: 4, "|", 18557 // = 18 << 10 + 1 + 124
+ * command_easy: 4, "|", 19589 // = 19 << 10 + 1 + 132
+ * command_easy: 4, "|", 20619 // = 20 << 10 + 1 + 138
+ * command_easy: 4, "|", 21649 // = 21 << 10 + 1 + 144
+ * command_easy: 4, "|", 22680 // = 22 << 10 + 1 + 151
+ * command_easy: 4, "|", 23710 // = 23 << 10 + 1 + 157
+ * command_easy: 4, "|", 24736 // = 24 << 10 + 1 + 159
+ * command_easy: 4, "|", 25766 // = 25 << 10 + 1 + 165
+ * command_easy: 4, "|", 26800 // = 26 << 10 + 1 + 175
+ * command_easy: 4, "|", 27826 // = 27 << 10 + 1 + 177
+ * command_easy: 4, "|", 28853 // = 28 << 10 + 1 + 180
+ * command_easy: 4, "|", 29885 // = 29 << 10 + 1 + 188
+ * command_easy: 4, "|", 30920 // = 30 << 10 + 1 + 199
+ * command_easy: 4, "|", 31950 // = 31 << 10 + 1 + 205
+ * command_easy: 4, "|", 32981 // = 32 << 10 + 1 + 212
+ * command_easy: 4, "|", 34011 // = 33 << 10 + 1 + 218
+ * command_easy: 4, "|", 35043 // = 34 << 10 + 1 + 226
+ * command_easy: 4, "|", 36068 // = 35 << 10 + 1 + 227
+ * command_easy: 4, "|", 37103 // = 36 << 10 + 1 + 238
+ * command_easy: 4, "|", 38133 // = 37 << 10 + 1 + 244
+ * command_easy: 4, "|", 39168 // = 38 << 10 + 1 + 255
+ * command_easy: 4, "|", 40201 // = 39 << 10 + 1 + 264
+ * command_easy: 4, "|", 41226 // = 40 << 10 + 1 + 265
+ * command_easy: 4, "|", 42251 // = 41 << 10 + 1 + 266
+ * command_easy: 4, "|", 43285 // = 42 << 10 + 1 + 276
+ * command_easy: 4, "|", 44310 // = 43 << 10 + 1 + 277
+ * command_easy: 4, "|", 45345 // = 44 << 10 + 1 + 288
+ * command_easy: 4, "|", 46374 // = 45 << 10 + 1 + 293
+ * command_easy: 4, "|", 47407 // = 46 << 10 + 1 + 302
+ * command_easy: 4, "|", 48440 // = 47 << 10 + 1 + 311
+ * command_easy: 4, "|", 49473 // = 48 << 10 + 1 + 320
+ * command_easy: 4, "|", 50498 // = 49 << 10 + 1 + 321
+ * command_easy: 4, "|", 51530 // = 50 << 10 + 1 + 329
+ * command_easy: 4, "|", 52561 // = 51 << 10 + 1 + 336
+ * command_easy: 4, "|", 53591 // = 52 << 10 + 1 + 342
+ * command_easy: 4, "|", 54623 // = 53 << 10 + 1 + 350
+ * command_easy: 4, "|", 55655 // = 54 << 10 + 1 + 358
+ * command_easy: 4, "|", 56680 // = 55 << 10 + 1 + 359
+ * command_easy: 4, "|", 57705 // = 56 << 10 + 1 + 360
+ * command_easy: 4, "|", 58730 // = 57 << 10 + 1 + 361
+ * command_easy: 4, "|", 59760 // = 58 << 10 + 1 + 367
+ * command_easy: 4, "|", 60791 // = 59 << 10 + 1 + 374
+ * command_easy: 4, "|", 61816 // = 60 << 10 + 1 + 375
+ * command_easy: 4, "|", 62849 // = 61 << 10 + 1 + 384
+ * command_easy: 4, "|", 63881 // = 62 << 10 + 1 + 392
+ * command_easy: 4, "|", 64919 // = 63 << 10 + 1 + 406
+ * command_easy: 4, "|", 65944 // = 64 << 10 + 1 + 407
+ * command_easy: 4, "|", 66969 // = 65 << 10 + 1 + 408
+ * command_easy: 4, "|", 68001 // = 66 << 10 + 1 + 416
+ * command_easy: 4, "|", 69031 // = 67 << 10 + 1 + 422
+ * command_easy: 4, "|", 70062 // = 68 << 10 + 1 + 429
+ * command_easy: 4, "|", 71092 // = 69 << 10 + 1 + 435
+ * command_easy: 4, "|", 72123 // = 70 << 10 + 1 + 442
+ * command_easy: 4, "|", 73154 // = 71 << 10 + 1 + 449
+ * command_easy: 4, "|", 74185 // = 72 << 10 + 1 + 456
+ * command_easy: 4, "|", 75219 // = 73 << 10 + 1 + 466
+ * command_easy: 4, "|", 76261 // = 74 << 10 + 1 + 484
+ * command_easy: 4, "|", 77291 // = 75 << 10 + 1 + 490
+ * command_easy: 4, "|", 78327 // = 76 << 10 + 1 + 502
+ * command_easy: 4, "|", 79357 // = 77 << 10 + 1 + 508
+ * command_easy: 4, "|", 80388 // = 78 << 10 + 1 + 515
+ * command_easy: 4, "|", 81418 // = 79 << 10 + 1 + 521
+ * command_easy: 4, "|", 82448 // = 80 << 10 + 1 + 527
+ * command_easy: 4, "|", 83482 // = 81 << 10 + 1 + 537
+ * command_easy: 4, "|", 84514 // = 82 << 10 + 1 + 545
+ * command_easy: 4, "|", 85546 // = 83 << 10 + 1 + 553
+ * command_easy: 4, "|", 86577 // = 84 << 10 + 1 + 560
+ * command_easy: 4, "|", 87609 // = 85 << 10 + 1 + 568
+ * command_easy: 4, "|", 88639 // = 86 << 10 + 1 + 574
+ * command_easy: 4, "|", 89670 // = 87 << 10 + 1 + 581
+ * command_easy: 4, "|", 90700 // = 88 << 10 + 1 + 587
+ * command_easy: 4, "|", 91731 // = 89 << 10 + 1 + 594
+ * command_easy: 4, "|", 92762 // = 90 << 10 + 1 + 601
+ * command_easy: 4, "|", 93795 // = 91 << 10 + 1 + 610
+ * command_easy: 4, "|", 94827 // = 92 << 10 + 1 + 618
+ * command_easy: 4, "|", 95860 // = 93 << 10 + 1 + 627
+ * command_easy: 4, "|", 96894 // = 94 << 10 + 1 + 637
+ * command_easy: 4, "|", 97924 // = 95 << 10 + 1 + 643
+ * command_easy: 4, "|", 98957 // = 96 << 10 + 1 + 652
+ * command_easy: 4, "|", 99988 // = 97 << 10 + 1 + 659
+ * command_easy: 4, "|", 101019 // = 98 << 10 + 1 + 666
+ * command_easy: 4, "|", 102051 // = 99 << 10 + 1 + 674
+ * command_easy: 4, "|", 103081 // = 100 << 10 + 1 + 680
+ * command_easy: 4, "|", 104114 // = 101 << 10 + 1 + 689
+ * command_easy: 4, "|", 105144 // = 102 << 10 + 1 + 695
+ * command_easy: 4, "|", 106175 // = 103 << 10 + 1 + 702
+ * command_easy: 4, "|", 107206 // = 104 << 10 + 1 + 709
+ * command_easy: 4, "|", 108237 // = 105 << 10 + 1 + 716
+ * command_easy: 4, "|", 109268 // = 106 << 10 + 1 + 723
+ * command_easy: 4, "|", 110301 // = 107 << 10 + 1 + 732
+ * command_easy: 4, "|", 111332 // = 108 << 10 + 1 + 739
+ * command_easy: 4, "|", 112363 // = 109 << 10 + 1 + 746
+ * command_easy: 4, "|", 113394 // = 110 << 10 + 1 + 753
+ * command_easy: 4, "|", 114426 // = 111 << 10 + 1 + 761
+ * command_easy: 4, "|", 115458 // = 112 << 10 + 1 + 769
+ * command_easy: 4, "|", 116488 // = 113 << 10 + 1 + 775
+ * command_easy: 4, "|", 117518 // = 114 << 10 + 1 + 781
+ * command_easy: 4, "|", 118549 // = 115 << 10 + 1 + 788
+ * command_easy: 4, "|", 119580 // = 116 << 10 + 1 + 795
+ * command_easy: 4, "|", 120611 // = 117 << 10 + 1 + 802
+ * command_easy: 4, "|", 121643 // = 118 << 10 + 1 + 810
+ * command_easy: 4, "|", 122675 // = 119 << 10 + 1 + 818
+ * command_easy: 4, "|", 123707 // = 120 << 10 + 1 + 826
+ */
+ compressed,
+ true,
+ "|time|time | time |ime|Time |time the | time|s time |time of |Time|time and |me|tim|, time |"
+ + "time, | Time |time in |time to |e time |time\"|time.|time\">|time\n|t|time]|time for |e|ti"
+ + "|time a |time that | Time|time. |.time| time, ||time with |time'|time from |time by ||| th"
+ + "e time||time. The |TIME|time on |time as |time is ||timing |time\n\t|time:| time. |timeed "
+ + "||||time(|Time, ||time at |timely | the time of ||| Time, |Time\"|.time(|TIME |Time\">|tim"
+ + "e=\"| time.|.com/time| the time of the |Time'|time. This |time,|.time |Time(|Time.|time no"
+ + "t | time=\"|timeer | TIME |timeal | TIME|time='|TIME\"|Time. | time(|timeful | Time. |time"
+ + "ive |timeless |TIME'|timeest | Time.|TIME\">| time='|Time,|timeize |TIME.|\302\240time| ti"
+ + "me,|Time=\"|TIME=\"|timeous |TIME, |Time='| Time,| TIME=\"| TIME, |TIME,|TIME(|TIME. | TIM"
+ + "E.|TIME='| TIME. | Time=\"| TIME='| Time='"
+ );
+ }
+
+ @Test
+ public void testBaseDictWord() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x41, (byte) 0x02
+ };
+ checkSynth(
+ /*
+ * // The stream consists of a base dictionary word.
+ * main_header
+ * metablock_header_easy: 4, 1
+ * command_inscopy_easy: 0, 4
+ * command_dist_easy: 1
+ */
+ compressed,
+ true,
+ "time"
+ );
+ }
+
+ @Test
+ public void testBaseDictWordFinishBlockOnRingbufferWrap() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x1f, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x9b, (byte) 0x58, (byte) 0x32, (byte) 0x34, (byte) 0x34, (byte) 0x34, (byte) 0x34,
+ (byte) 0x34, (byte) 0x34, (byte) 0x34, (byte) 0x34, (byte) 0x34, (byte) 0x34, (byte) 0x34,
+ (byte) 0x34, (byte) 0x34, (byte) 0x34, (byte) 0x34, (byte) 0x34, (byte) 0x34, (byte) 0x34,
+ (byte) 0x34, (byte) 0x34, (byte) 0x34, (byte) 0x34, (byte) 0x34, (byte) 0x34, (byte) 0x34,
+ (byte) 0x34, (byte) 0x34, (byte) 0xd4, (byte) 0x00
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_header_easy: 32, 1 // 32 = minimal ringbuffer size
+ * command_easy: 4, "aaaaaaaaaaaaaaaaaaaaaaaaaaaa", 29
+ */
+ compressed,
+ true,
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaatime"
+ );
+ }
+
+ @Test
+ public void testBaseDictWordTooLong() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x41, (byte) 0x02
+ };
+ checkSynth(
+ /*
+ * // Has an unmodified dictionary word that goes over the end of the
+ * // meta-block. Same as BaseDictWord, but with a shorter meta-block length.
+ * main_header
+ * metablock_header_easy: 1, 1
+ * command_inscopy_easy: 0, 4
+ * command_dist_easy: 1
+ */
+ compressed,
+ false,
+ ""
+ );
+ }
+
+ @Test
+ public void testBlockCountMessage() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x0b, (byte) 0x00, (byte) 0x11, (byte) 0x01, (byte) 0x8c, (byte) 0xc1,
+ (byte) 0xc5, (byte) 0x0d, (byte) 0x08, (byte) 0x00, (byte) 0x22, (byte) 0x65, (byte) 0xe1,
+ (byte) 0xfc, (byte) 0xfd, (byte) 0x22, (byte) 0x2c, (byte) 0xc4, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0xd8, (byte) 0x32, (byte) 0x89, (byte) 0x01, (byte) 0x12, (byte) 0x00,
+ (byte) 0x00, (byte) 0x77, (byte) 0xda, (byte) 0x04, (byte) 0x10, (byte) 0x42, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00
+ };
+ checkSynth(
+ /*
+ * // Same as BlockSwitchMessage but also uses 0-bit block-type commands.
+ * main_header
+ * metablock_header_begin: 1, 0, 12, 0
+ * // two literal block types
+ * vlq_blocktypes: 2
+ * huffman_simple: 1,1,4, 1 // literal blocktype prefix code
+ * huffman_fixed: 26 // literal blockcount prefix code
+ * blockcount_easy: 2 // 2 a's
+ * // one ins/copy and dist block type
+ * vlq_blocktypes: 1
+ * vlq_blocktypes: 1
+ * ndirect: 0, 0
+ * // two MSB6 literal context modes
+ * bits: "00", "00"
+ * // two literal prefix codes
+ * vlq_blocktypes: 2
+ * // literal context map
+ * vlq_rlemax: 5
+ * huffman_simple: 0,3,7, 5,0,6 // context map RLE Huffman code
+ * // context map RLE: repeat 0 64 times, 1+5 64 times
+ * bits: "01", "0", "11111", "11", "0", "11111"
+ * bit: 1 // MTF enabled
+ * // one distance prefix code
+ * vlq_blocktypes: 1
+ * huffman_simple: 0,1,256, 97 // only a's
+ * huffman_simple: 0,1,256, 98 // only b's
+ * huffman_fixed: 704
+ * huffman_fixed: 64
+ * // now comes the data
+ * command_inscopy_easy: 12, 0
+ * blockcount_easy: 2 // switch to other block type; 2 b's
+ * blockcount_easy: 5 // switch to other block type; 5 a's
+ * blockcount_easy: 1 // switch to other block type; 1 b
+ * blockcount_easy: 1 // switch to other block type; 1 a
+ * blockcount_easy: 1 // switch to other block type; 1 b
+ */
+ compressed,
+ true,
+ "aabbaaaaabab"
+ );
+ }
+
+ @Test
+ public void testBlockSwitchMessage() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x0b, (byte) 0x00, (byte) 0xd1, (byte) 0xe1, (byte) 0x01, (byte) 0xc6,
+ (byte) 0xe0, (byte) 0xe2, (byte) 0x06, (byte) 0x04, (byte) 0x00, (byte) 0x91, (byte) 0xb2,
+ (byte) 0x70, (byte) 0xfe, (byte) 0x7e, (byte) 0x11, (byte) 0x16, (byte) 0x62, (byte) 0x00,
+ (byte) 0x00, (byte) 0x1c, (byte) 0x6c, (byte) 0x99, (byte) 0xc4, (byte) 0x00, (byte) 0x09,
+ (byte) 0x00, (byte) 0x80, (byte) 0x3b, (byte) 0x6d, (byte) 0x02, (byte) 0x08, (byte) 0x82,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00
+ };
+ checkSynth(
+ /*
+ * // Uses blocks with 1-symbol Huffman codes that take 0 bits, so that it
+ * // is the block-switch commands that encode the message rather than actual
+ * // literals.
+ * main_header
+ * metablock_header_begin: 1, 0, 12, 0
+ * // two literal block types
+ * vlq_blocktypes: 2
+ * huffman_simple: 1,4,4, 1,0,2,3 // literal blocktype prefix code
+ * huffman_fixed: 26 // literal blockcount prefix code
+ * blockcount_easy: 2 // 2 a's
+ * // one ins/copy and dist block type
+ * vlq_blocktypes: 1
+ * vlq_blocktypes: 1
+ * ndirect: 0, 0
+ * // two MSB6 literal context modes
+ * bits: "00", "00"
+ * // two literal prefix codes
+ * vlq_blocktypes: 2
+ * // literal context map
+ * vlq_rlemax: 5
+ * huffman_simple: 0,3,7, 5,0,6 // context map RLE Huffman code
+ * // context map RLE: repeat 0 64 times, 1+5 64 times
+ * bits: "01", "0", "11111", "11", "0", "11111"
+ * bit: 1 // MTF enabled
+ * // one distance prefix code
+ * vlq_blocktypes: 1
+ * huffman_simple: 0,1,256, 97 // only a's
+ * huffman_simple: 0,1,256, 98 // only b's
+ * huffman_fixed: 704
+ * huffman_fixed: 64
+ * // now comes the data
+ * command_inscopy_easy: 12, 0
+ * bits: "0"; blockcount_easy: 2 // switch to other block type; 2 b's
+ * bits: "0"; blockcount_easy: 5 // switch to other block type; 5 a's
+ * bits: "0"; blockcount_easy: 1 // switch to other block type; 1 b
+ * bits: "0"; blockcount_easy: 1 // switch to other block type; 1 a
+ * bits: "0"; blockcount_easy: 1 // switch to other block type; 1 b
+ */
+ compressed,
+ true,
+ "aabbaaaaabab"
+ );
+ }
+
+ @Test
+ public void testClClTreeDeficiency() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x80,
+ (byte) 0x43, (byte) 0x01, (byte) 0xe0, (byte) 0x05, (byte) 0x88, (byte) 0x55, (byte) 0x90,
+ (byte) 0x01, (byte) 0x00, (byte) 0x38, (byte) 0xd8, (byte) 0x32, (byte) 0x89, (byte) 0x01,
+ (byte) 0x12, (byte) 0x00, (byte) 0x00, (byte) 0x77, (byte) 0xda, (byte) 0x28, (byte) 0x40,
+ (byte) 0x23
+ };
+ checkSynth(
+ /*
+ * // This test is a copy of TooManySymbolsRepeated, with changed clcl table.
+ * main_header
+ * metablock_header_begin: 1, 0, 4, 0
+ * metablock_header_trivial_context
+ * hskip: 0
+ * clcl_ordered: 0,3,0,0,0,0,0,0,3,3,0,0,0,0,0,0,1,0
+ * set_prefix_cl_rle: "", "110", "", "", "", "", "", "", "111", "101",\
+ * "", "", "", "", "", "", "0", ""
+ * cl_rle: 8
+ * cl_rle_rep: 9, 96
+ * cl_rle: 1
+ * cl_rle_rep: 9, 159 // 1 + 96 + 1 + 159 = 257 > 256 = alphabet size
+ * huffman_fixed: 704
+ * huffman_fixed: 64
+ * command_inscopy_easy: 4, 0
+ * command_literal_bits: 0, 0, 0, 101100010
+ */
+ compressed,
+ false,
+ "aaab"
+ );
+ }
+
+ @Test
+ public void testClClTreeExcess() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x80,
+ (byte) 0xc3, (byte) 0x7b, (byte) 0x80, (byte) 0x58, (byte) 0x41, (byte) 0x06, (byte) 0x00,
+ (byte) 0xe0, (byte) 0x60, (byte) 0xcb, (byte) 0x24, (byte) 0x06, (byte) 0x48, (byte) 0x00,
+ (byte) 0x00, (byte) 0xdc, (byte) 0x69, (byte) 0xa3, (byte) 0x00, (byte) 0x8d, (byte) 0x00
+ };
+ checkSynth(
+ /*
+ * // This test is a copy of ClClTreeDeficiency, with changed clcl table.
+ * main_header
+ * metablock_header_begin: 1, 0, 4, 0
+ * metablock_header_trivial_context
+ * hskip: 0
+ * clcl_ordered: 0,3,0,0,0,0,0,0,3,1,0,0,0,0,0,0,1,0
+ * set_prefix_cl_rle: "", "110", "", "", "", "", "", "", "111", "1",\
+ * "", "", "", "", "", "", "0", ""
+ * cl_rle: 8
+ * cl_rle_rep: 9, 96
+ * cl_rle: 1
+ * cl_rle_rep: 9, 159 // 1 + 96 + 1 + 159 = 257 > 256 = alphabet size
+ * huffman_fixed: 704
+ * huffman_fixed: 64
+ * command_inscopy_easy: 4, 0
+ * command_literal_bits: 0, 0, 0, 101100010
+ */
+ compressed,
+ false,
+ "aaab"
+ );
+ }
+
+ @Test
+ public void testComplexHuffmanCodeTwoSymbols() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x80, (byte) 0x03, (byte) 0xe0,
+ (byte) 0xa2, (byte) 0x1a, (byte) 0x00, (byte) 0x00, (byte) 0x0e, (byte) 0xb6, (byte) 0x4c,
+ (byte) 0x62, (byte) 0x80, (byte) 0x04, (byte) 0x00, (byte) 0xc0, (byte) 0x9d, (byte) 0x36,
+ (byte) 0x12, (byte) 0x04
+ };
+ checkSynth(
+ /*
+ * // This tests a complex Huffman code with only two symbols followed by a
+ * // tiny amount of content.
+ * main_header
+ * metablock_header_begin: 1, 0, 2, 0
+ * metablock_header_trivial_context
+ * // begin of literal Huffman tree. The tree has symbol length 1 for "a",
+ * // symbol length 1 for "b" and symbol length 0 for all others.
+ * hskip: 0
+ * clcl_ordered: 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
+ * set_prefix_cl_rle: "", "0", "", "", "", "", "", "", "", "",\
+ * "", "", "", "", "", "", "", "1"
+ * cl_rle_rep_0: 97
+ * cl_rle: 1 // literal number 97, that is, the letter 'a'
+ * cl_rle: 1 // literal number 98, that is, the letter 'b'
+ * // end of literal Huffman tree
+ * huffman_fixed: 704
+ * huffman_fixed: 64
+ * command_inscopy_easy: 2, 0
+ * command_literal_bits: 0, 1 // a followed by b
+ */
+ compressed,
+ true,
+ "ab"
+ );
+ }
+
+ @Test
+ public void testCompressedUncompressedShortCompressed() {
+ byte[] compressed = {
+ (byte) 0x8b, (byte) 0xfe, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x9b, (byte) 0x66, (byte) 0x6f, (byte) 0x1b, (byte) 0x0a, (byte) 0x50, (byte) 0x00,
+ (byte) 0x10, (byte) 0x62, (byte) 0x62, (byte) 0x62, (byte) 0x62, (byte) 0x62, (byte) 0x62,
+ (byte) 0x31, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x24, (byte) 0x00
+ };
+ checkSynth(
+ /*
+ * main_header: 22
+ * metablock_header_easy: 1022, 0
+ * command_easy: 1021, "a", 1 // 1022 x "a"
+ * metablock_uncompressed: "bbbbbb"
+ * metablock_header_easy: 4, 1
+ * command_easy: 4, "", 1 // 6 + 4 = 10 x "b"
+ */
+ compressed,
+ true,
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbb"
+ );
+ }
+
+ @Test
+ public void testCompressedUncompressedShortCompressedSmallWindow() {
+ byte[] compressed = {
+ (byte) 0x21, (byte) 0xf4, (byte) 0x0f, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x1c, (byte) 0xa7, (byte) 0x6d, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0xd8,
+ (byte) 0x32, (byte) 0x89, (byte) 0x01, (byte) 0x12, (byte) 0x00, (byte) 0x00, (byte) 0x77,
+ (byte) 0xda, (byte) 0x34, (byte) 0x7b, (byte) 0xdb, (byte) 0x50, (byte) 0x80, (byte) 0x02,
+ (byte) 0x80, (byte) 0x62, (byte) 0x62, (byte) 0x62, (byte) 0x62, (byte) 0x62, (byte) 0x62,
+ (byte) 0x31, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x24, (byte) 0x00
+ };
+ checkSynth(
+ /*
+ * main_header: 10
+ * metablock_header_easy: 1022, 0
+ * command_easy: 1021, "a", 1 // 1022 x "a"
+ * metablock_uncompressed: "bbbbbb"
+ * metablock_header_easy: 4, 1
+ * command_easy: 4, "", 1 // 6 + 4 = 10 x "b"
+ */
+ compressed,
+ true,
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbb"
+ );
+ }
+
+ @Test
+ public void testCopyLengthTooLong() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x11, (byte) 0x86, (byte) 0x02
+ };
+ checkSynth(
+ /*
+ * // Has a copy length that goes over the end of the meta-block.
+ * // Same as OneCommand, but with a shorter meta-block length.
+ * main_header
+ * metablock_header_easy: 2, 1
+ * command_easy: 2, "a", 1
+ */
+ compressed,
+ false,
+ ""
+ );
+ }
+
+ @Test
+ public void testCopyTooLong() {
+ byte[] compressed = {
+ (byte) 0xa1, (byte) 0x08, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x1c, (byte) 0xa7, (byte) 0x6d, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0xd8,
+ (byte) 0x32, (byte) 0x89, (byte) 0x01, (byte) 0x12, (byte) 0x00, (byte) 0x00, (byte) 0x77,
+ (byte) 0xda, (byte) 0x34, (byte) 0xab, (byte) 0xdb, (byte) 0x50, (byte) 0x00
+ };
+ checkSynth(
+ /*
+ * // Has a copy length that goes over the end of the meta-block,
+ * // with a ringbuffer wrap.
+ * main_header: 10
+ * metablock_header_easy: 2, 1
+ * command_easy: 1024, "a", 1
+ */
+ compressed,
+ false,
+ ""
+ );
+ }
+
+ @Test
+ public void testCustomHuffmanCode() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x80,
+ (byte) 0xc3, (byte) 0x3d, (byte) 0x80, (byte) 0x58, (byte) 0x82, (byte) 0x08, (byte) 0x00,
+ (byte) 0xc0, (byte) 0xc1, (byte) 0x96, (byte) 0x49, (byte) 0x0c, (byte) 0x90, (byte) 0x00,
+ (byte) 0x00, (byte) 0xb8, (byte) 0xd3, (byte) 0x46, (byte) 0x01, (byte) 0x1a, (byte) 0x01
+ };
+ checkSynth(
+ /*
+ * // This tests a small hand crafted Huffman code followed by a tiny amount
+ * // of content. This tests if the bit reader detects the end correctly even
+ * // with tiny content after a larger Huffman tree encoding.
+ * main_header
+ * metablock_header_begin: 1, 0, 4, 0
+ * metablock_header_trivial_context
+ * // begin of literal Huffman tree. The tree has symbol length 1 for "a",
+ * // symbol length 8 for null, symbol length 9 for all others. The length 1
+ * // for a is chosen on purpose here, the others must be like that to
+ * // fulfill the requirement that sum of 32>>length is 32768.
+ * hskip: 0
+ * clcl_ordered: 0,3,0,0,0,0,0,0,3,2,0,0,0,0,0,0,1,0
+ * set_prefix_cl_rle: "", "110", "", "", "", "", "", "", "111", "10",\
+ * "", "", "", "", "", "", "0", ""
+ * cl_rle: 8
+ * cl_rle_rep: 9, 96
+ * cl_rle: 1 // literal number 97, that is, the letter 'a'
+ * cl_rle_rep: 9, 158
+ * // end of literal Huffman tree
+ * huffman_fixed: 704
+ * huffman_fixed: 64
+ * command_inscopy_easy: 4, 0
+ * // Here is how the code "101100010" for b is derived: remember that a has
+ * // symbol length 1, null has symbol length 8, the rest 9. So in the
+ * // canonical Huffman code, the code for "a" is "0", for null is
+ * // "10000000". The next value has "100000010" (cfr. the rules of canonical
+ * // prefix code). Counting upwards +95 from there, the value "@" (ASCII 96,
+ * // before "a") has "101100001", and so b, the next 9-bit symbol, has the
+ * // next binary value "101100010".
+ * command_literal_bits: 0, 0, 0, 101100010 // 3 a's followed by a b
+ */
+ compressed,
+ true,
+ "aaab"
+ );
+ }
+
+ @Test
+ public void testDistanceLut() {
+ byte[] compressed = {
+ (byte) 0x8b, (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x99, (byte) 0x86, (byte) 0x46, (byte) 0xc6, (byte) 0x22, (byte) 0x14,
+ (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x1c, (byte) 0xa7,
+ (byte) 0x6d, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0xd8, (byte) 0x32, (byte) 0x89,
+ (byte) 0x01, (byte) 0x12, (byte) 0x21, (byte) 0x91, (byte) 0x69, (byte) 0x62, (byte) 0x6a,
+ (byte) 0x36
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_header_easy: 6, 0 // implicit ndirect: 0, 0
+ * command_easy: 3, "abc", 3 // Insert "abc", copy "abc"
+ * metablock_header_begin: 0, 0, 6, 0
+ * vlq_blocktypes: 1 // num litetal block types
+ * vlq_blocktypes: 1 // num command block types
+ * vlq_blocktypes: 1 // num distance block types
+ * ndirect: 3, 0
+ * bits: "00" // literal context modes
+ * vlq_blocktypes: 1 // num literal Huffman trees
+ * // command has no context -> num trees == num block types
+ * vlq_blocktypes: 1 // num distance Huffman trees
+ * huffman_fixed: 256
+ * huffman_fixed: 704
+ * huffman_simple: 0,1,67, 18
+ * command_inscopy_easy: 3, 3 // Insert 3, copy 3
+ * command_literals_easy: "def"
+ * // 0-bit Huffman code : dcode = 18 -> third direct distance
+ * metablock_lastempty // make sure that no extra distance bits are read
+ */
+ compressed,
+ true,
+ "abcabcdefdef"
+ );
+ }
+
+ @Test
+ public void testEmpty() {
+ byte[] compressed = {
+ (byte) 0x3b
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_lastempty
+ */
+ compressed,
+ true,
+ ""
+ );
+ }
+
+ @Test
+ public void testHelloWorld() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x0a, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x9b, (byte) 0x00, (byte) 0x59, (byte) 0x98, (byte) 0xda, (byte) 0xd8, (byte) 0xd8,
+ (byte) 0x13, (byte) 0xb8, (byte) 0xdb, (byte) 0x3b, (byte) 0xd9, (byte) 0x98, (byte) 0x00
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_fixed: "hello world", 1
+ */
+ compressed,
+ true,
+ "hello world"
+ );
+ }
+
+ @Test
+ public void testInsertTooLong() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x09, (byte) 0x86, (byte) 0x46
+ };
+ checkSynth(
+ /*
+ * // Has an insert length that goes over the end of the meta-block.
+ * // Same as OneInsert, but with a shorter meta-block length.
+ * main_header
+ * metablock_header_easy: 1, 1
+ * command_easy: 0, "ab"
+ */
+ compressed,
+ false,
+ ""
+ );
+ }
+
+ @Test
+ public void testIntactDistanceRingBuffer0() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x0a, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0xa1, (byte) 0x80, (byte) 0x20, (byte) 0x00
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_header_easy: 11, 1
+ * command_inscopy_easy: 0, 7 // "himself" from dictionary
+ * bits: "000000" // distance = 4 from RB; RB remains intact
+ * command_inscopy_easy: 0, 4 // copy "self"
+ * bits: "000000" // distance = 4 from RB; RB remains intact
+ */
+ compressed,
+ true,
+ "himselfself"
+ );
+ }
+
+ @Test
+ public void testIntactDistanceRingBuffer1() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x09, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x21, (byte) 0xa0, (byte) 0x20, (byte) 0x00
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_header_easy: 10, 1
+ * command_inscopy_easy: 0, 6 // "scroll" from dictionary
+ * bits: "100000" // distance = 11 from RB; RB remains intact
+ * command_inscopy_easy: 0, 4 // copy "roll"
+ * bits: "000000" // distance = 4 from RB; RB remains intact
+ */
+ compressed,
+ true,
+ "scrollroll"
+ );
+ }
+
+ @Test
+ public void testIntactDistanceRingBuffer2() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x0f, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x41, (byte) 0x80, (byte) 0x20, (byte) 0x50, (byte) 0x10, (byte) 0x24,
+ (byte) 0x08, (byte) 0x06
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_header_easy: 16, 1
+ * command_inscopy_easy: 0, 4 // "left" from dictionary (index = 3 = 4 - 1)
+ * bits: "000000" // distance = 4 from RB; RB remains intact
+ * command_inscopy_easy: 0, 4 // "data" from dictionary (index = 6 = 11 - 5)
+ * bits: "100000" // distance = 11 from RB; RB remains intact
+ * command_inscopy_easy: 0, 4 // "data" from dictionary (index = 6 = 15 - 9)
+ * bits: "010000" // distance = 15 from RB; RB remains intact
+ * command_inscopy_easy: 0, 4 // "left" from dictionary (index = 3 = 16 - 13)
+ * bits: "110000" // distance = 16 from RB; RB remains intact
+ */
+ compressed,
+ true,
+ "leftdatadataleft"
+ );
+ }
+
+ @Test
+ public void testIntactDistanceRingBufferNoDistanceValue0() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x17, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x40, (byte) 0x82, (byte) 0x40, (byte) 0x41, (byte) 0x90, (byte) 0x20,
+ (byte) 0x58, (byte) 0x18, (byte) 0x00
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_header_easy: 24, 1
+ * // cmd is {ins_extra, copy_extra, distance_code, ctx, ins_off, copy_off}
+ * // cmd.2 = {0x00, 0x00, 0, 0x02, 0x0000, 0x0004}
+ * // cmd.2 = no insert, copy length = 4, distance_code = 0 (last distance)
+ * command_short: 2 // "left" from dictionary (index = 3 = 4 - 1)
+ * // Check that RB is untouched after the first command...
+ * command_inscopy_easy: 0, 4 // "data" from dictionary (index = 6 = 11 - 5)
+ * bits: "100000" // distance = 11 from RB; RB remains intact
+ * command_inscopy_easy: 0, 4 // "data" from dictionary (index = 6 = 15 - 9)
+ * bits: "010000" // distance = 15 from RB; RB remains intact
+ * command_inscopy_easy: 0, 4 // "left" from dictionary (index = 3 = 16 - 13)
+ * bits: "110000" // distance = 16 from RB; RB remains intact
+ * command_inscopy_easy: 0, 8 // copy "leftleft"
+ * bits: "000000" // distance = 4 from RB; RB remains intact
+ */
+ compressed,
+ true,
+ "leftdatadataleftleftleft"
+ );
+ }
+
+ @Test
+ public void testIntactDistanceRingBufferNoDistanceValue1() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x19, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0xc0, (byte) 0x82, (byte) 0x41, (byte) 0x41, (byte) 0x90, (byte) 0x20,
+ (byte) 0x58, (byte) 0x18, (byte) 0x00
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_header_easy: 26, 1
+ * // cmd is {ins_extra, copy_extra, distance_code, ctx, ins_off, copy_off}
+ * // cmd.3 = {0x00, 0x00, 0, 0x03, 0x0000, 0x0005}
+ * // cmd.3 = no insert, copy length = 5, distance_code = 0 (last distance)
+ * command_short: 3 // "world" from dictionary (index = 3 = 4 - 1)
+ * // Check that RB is untouched after the first command...
+ * command_inscopy_easy: 0, 5 // "white" from dictionary (index = 5 = 11 - 6)
+ * bits: "100000" // distance = 11 from RB; RB remains intact
+ * command_inscopy_easy: 0, 4 // "back" from dictionary (index = 4 = 15 - 11)
+ * bits: "010000" // distance = 15 from RB; RB remains intact
+ * command_inscopy_easy: 0, 4 // "down" from dictionary (index = 1 = 16 - 15)
+ * bits: "110000" // distance = 16 from RB; RB remains intact
+ * command_inscopy_easy: 0, 8 // copy "downdown"
+ * bits: "000000" // distance = 4 from RB; RB remains intact
+ */
+ compressed,
+ true,
+ "worldwhitebackdowndowndown"
+ );
+ }
+
+ @Test
+ public void testInvalidNoLastMetablock() {
+ byte[] compressed = {
+ (byte) 0x0b, (byte) 0x06, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x9b, (byte) 0x00, (byte) 0x13, (byte) 0x59, (byte) 0x98, (byte) 0xda, (byte) 0xd8,
+ (byte) 0xd8, (byte) 0x13, (byte) 0xb8, (byte) 0xdb, (byte) 0x3b, (byte) 0xd9, (byte) 0x98,
+ (byte) 0xe8, (byte) 0x00
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_fixed: \"hello world\", 0
+ */
+ compressed,
+ false,
+ "hello world"
+ );
+ }
+
+ @Test
+ public void testInvalidNoMetaBlocks() {
+ byte[] compressed = {
+ (byte) 0x0b
+ };
+ checkSynth(
+ /*
+ * main_header
+ */
+ compressed,
+ false,
+ ""
+ );
+ }
+
+ @Test
+ public void testInvalidTooFarDist() {
+ byte[] compressed = {
+ (byte) 0xa1, (byte) 0x48, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x1c, (byte) 0xa7, (byte) 0x6d, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0xd8,
+ (byte) 0x32, (byte) 0x89, (byte) 0x01, (byte) 0x12, (byte) 0x00, (byte) 0x00, (byte) 0x77,
+ (byte) 0xda, (byte) 0xe8, (byte) 0xe0, (byte) 0x62, (byte) 0x6f, (byte) 0x4f, (byte) 0x60,
+ (byte) 0x66, (byte) 0xe8, (byte) 0x44, (byte) 0x38, (byte) 0x0f, (byte) 0x09, (byte) 0x0d
+ };
+ checkSynth(
+ /*
+ * main_header: 10
+ * metablock_header_begin: 1, 0, 10, 0
+ * metablock_header_trivial_context
+ * huffman_fixed: 256
+ * huffman_fixed: 704
+ * huffman_fixed: 64
+ * command_easy: 2, "too far!", 1000000 // distance too far for 10 wbits
+ */
+ compressed,
+ false,
+ ""
+ );
+ }
+
+ @Test
+ public void testInvalidTooLargeContextMap() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x00, (byte) 0x00, (byte) 0xd1, (byte) 0xe1, (byte) 0x01, (byte) 0xc6,
+ (byte) 0xe0, (byte) 0xe2, (byte) 0x06, (byte) 0x00, (byte) 0x00, (byte) 0x91, (byte) 0xb2,
+ (byte) 0x70, (byte) 0xfe, (byte) 0xfb, (byte) 0x45, (byte) 0x58, (byte) 0x88, (byte) 0x01,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x01
+ };
+ checkSynth(
+ /*
+ * // Has a repeat code a context map that makes the size too big -> invalid.
+ * main_header
+ * metablock_header_begin: 1, 0, 1, 0
+ * // two literal block types
+ * vlq_blocktypes: 2
+ * huffman_simple: 1,4,4, 1,0,2,3 // literal blocktype prefix code
+ * huffman_fixed: 26 // literal blockcount prefix code
+ * blockcount_easy: 1
+ * // one ins/copy and dist block type
+ * vlq_blocktypes: 1
+ * vlq_blocktypes: 1
+ * ndirect: 0, 0
+ * // two MSB6 literal context modes
+ * bits: "00", "00"
+ * // two literal prefix codes
+ * vlq_blocktypes: 2
+ * // literal context map
+ * vlq_rlemax: 5
+ * huffman_simple: 0,3,7, 5,0,6 // context map RLE Huffman code
+ * // Too long context map RLE: repeat 0 64 times, 1+5 65 times, that is 129
+ * // values which is 1 too much.
+ * bits: "01", "0", "11111", "11", "11", "0", "11111"
+ * bit: 1 // MTF enabled
+ * // one distance prefix code
+ * vlq_blocktypes: 1
+ * huffman_simple: 0,1,256, 97 // only a's
+ * huffman_simple: 0,1,256, 98 // only b's
+ * huffman_fixed: 704
+ * huffman_fixed: 64
+ * // now comes the data
+ * command_inscopy_easy: 1, 0
+ */
+ compressed,
+ false,
+ "a"
+ );
+ }
+
+ @Test
+ public void testInvalidTransformType() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x41, (byte) 0x2d, (byte) 0x01, (byte) 0x19
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_header_easy: 4, 1
+ * command_inscopy_easy: 0, 4
+ * command_dist_easy: 123905 // = 121 << 10 + 1
+ */
+ compressed,
+ false,
+ ""
+ );
+ }
+
+ @Test
+ public void testInvalidWindowBits9() {
+ byte[] compressed = {
+ (byte) 0x91, (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x1c, (byte) 0xa7, (byte) 0x6d, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0xd8,
+ (byte) 0x32, (byte) 0x89, (byte) 0x01, (byte) 0x12, (byte) 0x00, (byte) 0x00, (byte) 0x77,
+ (byte) 0xda, (byte) 0xc8, (byte) 0x20, (byte) 0x32, (byte) 0xd4, (byte) 0x01
+ };
+ checkSynth(
+ /*
+ * main_header: 9
+ * metablock_fixed: \"a\", 1
+ */
+ compressed,
+ false,
+ "a"
+ );
+ }
+
+ @Test
+ public void testManyTinyMetablocks() {
+ byte[] compressed = {
+ (byte) 0x0b, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb,
+ (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03,
+ (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61,
+ (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04,
+ (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00,
+ (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00,
+ (byte) 0x80, (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70,
+ (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00,
+ (byte) 0xee, (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80,
+ (byte) 0x61, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0,
+ (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee,
+ (byte) 0xb4, (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38,
+ (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x11, (byte) 0x61, (byte) 0x04, (byte) 0x00, (byte) 0x80, (byte) 0x61, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e,
+ (byte) 0xdb, (byte) 0x00, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12,
+ (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x11,
+ (byte) 0x61, (byte) 0x34
+ };
+ checkSynth(
+ /*
+ * main_header
+ * repeat: 300
+ * metablock_uncompressed: "a"
+ * metablock_fixed: "b"
+ * end_repeat
+ * metablock_lastempty
+ */
+ compressed,
+ true,
+ "abababababababababababababababababababababababababababababababababababababababababababababab"
+ + "ababababababababababababababababababababababababababababababababababababababababababababab"
+ + "ababababababababababababababababababababababababababababababababababababababababababababab"
+ + "ababababababababababababababababababababababababababababababababababababababababababababab"
+ + "ababababababababababababababababababababababababababababababababababababababababababababab"
+ + "ababababababababababababababababababababababababababababababababababababababababababababab"
+ + "ababababababababababababababababababababababababababababab"
+ );
+ }
+
+ @Test
+ public void testNegativeDistance() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x0f, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x41, (byte) 0x02, (byte) 0x01, (byte) 0x42, (byte) 0x01, (byte) 0x42,
+ (byte) 0x01, (byte) 0x42, (byte) 0x01, (byte) 0x42, (byte) 0x01, (byte) 0x42, (byte) 0x01,
+ (byte) 0x1c
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_header_easy: 16, 1
+ * command_inscopy_easy: 0, 4 // time
+ * command_dist_easy: 1
+ * command_inscopy_easy: 0, 2 // me
+ * command_dist_easy: 2
+ * command_inscopy_easy: 0, 2 // me
+ * command_dist_easy: 2
+ * command_inscopy_easy: 0, 2 // me
+ * command_dist_easy: 2
+ * command_inscopy_easy: 0, 2 // me
+ * command_dist_easy: 2
+ * command_inscopy_easy: 0, 2 // me
+ * command_dist_easy: 2 // All rb items are 2 now
+ * command_inscopy_easy: 0, 2
+ * bits: "011100" // 15 -> distance = rb[idx + 2] - 3
+ */
+ compressed,
+ false,
+ "timemememememeXX"
+ );
+ }
+
+ @Test
+ public void testNegativeRemainingLenBetweenMetablocks() {
+ byte[] compressed = {
+ (byte) 0x0b, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x09, (byte) 0x86, (byte) 0x46, (byte) 0x11, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00,
+ (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4, (byte) 0x91, (byte) 0x60, (byte) 0x68,
+ (byte) 0x04
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_header_easy: 1, 0
+ * command_easy: 0, "ab" // remaining length == -1 -> invalid stream
+ * metablock_header_easy: 2, 1
+ * command_easy: 0, "ab"
+ */
+ compressed,
+ false,
+ "abab"
+ );
+ }
+
+ @Test
+ public void testOneCommand() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x11, (byte) 0x86, (byte) 0x02
+ };
+ checkSynth(
+ /*
+ * // The stream consists of one command with insert and copy.
+ * main_header
+ * metablock_header_easy: 3, 1
+ * command_easy: 2, "a", 1
+ */
+ compressed,
+ true,
+ "aaa"
+ );
+ }
+
+ @Test
+ public void testOneInsert() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x09, (byte) 0x86, (byte) 0x46
+ };
+ checkSynth(
+ /*
+ * // The stream consists of one half command with insert only.
+ * main_header
+ * metablock_header_easy: 2, 1
+ * command_easy: 0, "ab"
+ */
+ compressed,
+ true,
+ "ab"
+ );
+ }
+
+ @Test
+ public void testSimplePrefix() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0xa0, (byte) 0xc3, (byte) 0xc4,
+ (byte) 0xc6, (byte) 0xc8, (byte) 0x02, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x51, (byte) 0xa0, (byte) 0x1d
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_header_begin: 1, 0, 4, 0
+ * metablock_header_trivial_context
+ * huffman_simple: 1,4,256, 97,98,99,100 // ASCII codes for a, b, c, d
+ * huffman_fixed: 704
+ * huffman_fixed: 64
+ * command_inscopy_easy: 4, 0
+ * command_literal_bits: 0, 10, 110, 111 // a, b, c, d
+ */
+ compressed,
+ true,
+ "abcd"
+ );
+ }
+
+ @Test
+ public void testSimplePrefixDuplicateSymbols() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0xa0, (byte) 0xc3, (byte) 0xc4,
+ (byte) 0xc2, (byte) 0xc4, (byte) 0x02, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x51, (byte) 0xa0, (byte) 0x1d
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_header_begin: 1, 0, 4, 0
+ * metablock_header_trivial_context
+ * huffman_simple: 1,4,256, 97,98,97,98 // ASCII codes for a, b, a, b
+ * huffman_fixed: 704
+ * huffman_fixed: 64
+ * command_inscopy_easy: 4, 0
+ * command_literal_bits: 0, 10, 110, 111 // a, b, a, b
+ */
+ compressed,
+ false,
+ "abab"
+ );
+ }
+
+ @Test
+ public void testSimplePrefixOutOfRangeSymbols() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x4d, (byte) 0xff, (byte) 0xef, (byte) 0x7f, (byte) 0xff,
+ (byte) 0xfc, (byte) 0x07, (byte) 0x00, (byte) 0xb8, (byte) 0xd3, (byte) 0x06
+ };
+ checkSynth(
+ /*
+ * main_header
+ * metablock_header_begin: 1, 0, 4, 0
+ * metablock_header_trivial_context
+ * huffman_fixed: 256
+ * huffman_simple: 1,4,704, 1023,1022,1021,1020
+ * huffman_fixed: 64
+ */
+ compressed,
+ false,
+ ""
+ );
+ }
+
+/* DISABLED: Java decoder does not tolerate extra input after the brotli stream.
+ @Test
+ public void testSimplePrefixPlusExtraData() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0xa0, (byte) 0xc3, (byte) 0xc4,
+ (byte) 0xc6, (byte) 0xc8, (byte) 0x02, (byte) 0x00, (byte) 0x70, (byte) 0xb0, (byte) 0x65,
+ (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xee, (byte) 0xb4,
+ (byte) 0x51, (byte) 0xa0, (byte) 0x1d, (byte) 0x55, (byte) 0xaa
+ };
+ checkSynth(
+ compressed,
+ true,
+ "abcd"
+ );
+ }
+*/
+
+ @Test
+ public void testStressReadDistanceExtraBits() {
+ byte[] compressed = {
+ (byte) 0x4f, (byte) 0xfe, (byte) 0xff, (byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x80, (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07,
+ (byte) 0x5b, (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0,
+ (byte) 0x4e, (byte) 0x9b, (byte) 0xf6, (byte) 0x69, (byte) 0xef, (byte) 0xff, (byte) 0x0c,
+ (byte) 0x8d, (byte) 0x8c, (byte) 0x05, (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0x4e, (byte) 0xdb, (byte) 0x00, (byte) 0x00,
+ (byte) 0x70, (byte) 0xb0, (byte) 0x65, (byte) 0x12, (byte) 0x03, (byte) 0x24, (byte) 0xa8,
+ (byte) 0xaa, (byte) 0xef, (byte) 0xab, (byte) 0xaa, (byte) 0x7f, (byte) 0x24, (byte) 0x16,
+ (byte) 0x35, (byte) 0x8f, (byte) 0xac, (byte) 0x9e, (byte) 0x3d, (byte) 0xf7, (byte) 0xf3,
+ (byte) 0xe3, (byte) 0x0a, (byte) 0xfc, (byte) 0xff, (byte) 0x03, (byte) 0x00, (byte) 0x00,
+ (byte) 0x78, (byte) 0x01, (byte) 0x08, (byte) 0x30, (byte) 0x31, (byte) 0x32, (byte) 0x33,
+ (byte) 0x34, (byte) 0x35, (byte) 0x36, (byte) 0x37, (byte) 0x38, (byte) 0x39, (byte) 0x41,
+ (byte) 0x42, (byte) 0x43, (byte) 0x44, (byte) 0x45, (byte) 0x46, (byte) 0x30, (byte) 0x31,
+ (byte) 0x32, (byte) 0x33, (byte) 0x34, (byte) 0x35, (byte) 0x36, (byte) 0x37, (byte) 0x38,
+ (byte) 0x39, (byte) 0x41, (byte) 0x42, (byte) 0x43, (byte) 0x44, (byte) 0x45, (byte) 0x46,
+ (byte) 0x30, (byte) 0x31, (byte) 0x32, (byte) 0x33, (byte) 0x34, (byte) 0x35, (byte) 0x36,
+ (byte) 0x37, (byte) 0x38, (byte) 0x39, (byte) 0x41, (byte) 0x42, (byte) 0x43, (byte) 0x44,
+ (byte) 0x45, (byte) 0x46, (byte) 0x03
+ };
+ /* This line is added manually. */
+ char[] stub = new char[8388602]; Arrays.fill(stub, 'c'); String hex = "0123456789ABCDEF";
+ checkSynth(
+ /*
+ * main_header: 24
+ * metablock_header_easy: 8388605, 0 // 2^23 - 3 = shortest 22-bit distance
+ * command_easy: 8388602, "abc", 1
+ * metablock_header_begin: 0, 0, 3, 0
+ * vlq_blocktypes: 1 // num litetal block types
+ * vlq_blocktypes: 1 // num command block types
+ * vlq_blocktypes: 1 // num distance block types
+ * ndirect: 0, 0
+ * bits: "00" // literal context modes
+ * vlq_blocktypes: 1 // num literal Huffman trees
+ * // command has no context -> num trees == num block types
+ * vlq_blocktypes: 1 // num distance Huffman trees
+ * huffman_fixed: 256
+ * huffman_fixed: 704
+ * // Begin of distance Huffman tree. First 15 codes have lengths 1 to 15.
+ * // Symbol that corresponds to first half of 22-bit distance range is also
+ * // 15. All other symbols are 0.
+ * hskip: 0
+ * clcl_ordered: 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4, 5,5,5,5
+ * set_prefix_cl_rle: "0000", "0001", "0010", "0011", \
+ * "0100", "0101", "0110", "0111", \
+ * "1000", "1001", "1010", "1011", \
+ * "1100", "1101", \
+ * "11100", "11101", "11110", "11111"
+ * cl_rle: 1
+ * cl_rle: 2
+ * cl_rle: 3
+ * cl_rle: 4
+ * cl_rle: 5
+ * cl_rle: 6
+ * cl_rle: 7
+ * cl_rle: 8
+ * cl_rle: 9
+ * cl_rle: 10
+ * cl_rle: 11
+ * cl_rle: 12
+ * cl_rle: 13
+ * cl_rle: 14
+ * cl_rle: 15
+ * cl_rle_rep_0: 43
+ * cl_rle: 15 // literal number 97, that is, the letter 'a'
+ * // end of literal Huffman tree
+ * command_inscopy_easy: 0, 3 // Insert 0, copy 3
+ * // 15 bits of distance code plus 22 extra bits
+ * command_dist_bits: "111111111111111", "0000000000000000000000"
+ * metablock_uncompressed: "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
+ * metablock_lastempty
+ */
+ compressed,
+ true,
+ /* This line is modified manually. */
+ "abc" + new String(stub) + "abc" + hex + hex + hex
+ );
+ }
+
+ @Test
+ public void testTooManySymbolsRepeated() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x80,
+ (byte) 0xc3, (byte) 0x3d, (byte) 0x80, (byte) 0x58, (byte) 0x82, (byte) 0x0c, (byte) 0x00,
+ (byte) 0xc0, (byte) 0xc1, (byte) 0x96, (byte) 0x49, (byte) 0x0c, (byte) 0x90, (byte) 0x00,
+ (byte) 0x00, (byte) 0xb8, (byte) 0xd3, (byte) 0x46, (byte) 0x01, (byte) 0x1a, (byte) 0x01
+ };
+ checkSynth(
+ /*
+ * // This test is a copy of CustomHuffmanCode, with changed repeat count.
+ * main_header
+ * metablock_header_begin: 1, 0, 4, 0
+ * metablock_header_trivial_context
+ * hskip: 0
+ * clcl_ordered: 0,3,0,0,0,0,0,0,3,2,0,0,0,0,0,0,1,0
+ * set_prefix_cl_rle: "", "110", "", "", "", "", "", "", "111", "10",\
+ * "", "", "", "", "", "", "0", ""
+ * cl_rle: 8
+ * cl_rle_rep: 9, 96
+ * cl_rle: 1
+ * cl_rle_rep: 9, 159 // 1 + 96 + 1 + 159 = 257 > 256 = alphabet size
+ * huffman_fixed: 704
+ * huffman_fixed: 64
+ * command_inscopy_easy: 4, 0
+ * command_literal_bits: 0, 0, 0, 101100010
+ */
+ compressed,
+ false,
+ "aaab"
+ );
+ }
+
+ @Test
+ public void testTransformedDictWord() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x08, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x41, (byte) 0x09, (byte) 0x01, (byte) 0x01
+ };
+ checkSynth(
+ /*
+ * // The stream consists of a transformed dictionary word.
+ * main_header
+ * metablock_header_easy: 9, 1
+ * command_inscopy_easy: 0, 4
+ * command_dist_easy: 5121 // 5 << 10 + 1
+ */
+ compressed,
+ true,
+ "time the "
+ );
+ }
+
+ @Test
+ public void testTransformedDictWordTooLong() {
+ byte[] compressed = {
+ (byte) 0x1b, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80,
+ (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b,
+ (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e,
+ (byte) 0x1b, (byte) 0x41, (byte) 0x09, (byte) 0x01, (byte) 0x01
+ };
+ checkSynth(
+ /*
+ * // Has a transformed dictionary word that goes over the end of the
+ * // meta-block, but the base dictionary word fits in the meta-block.
+ * // Same as TransformedDictWord, but with a shorter meta-block length.
+ * main_header
+ * metablock_header_easy: 4, 1
+ * command_inscopy_easy: 0, 4
+ * command_dist_easy: 5121 // 5 << 10 + 1
+ */
+ compressed,
+ false,
+ ""
+ );
+ }
+
+ @Test
+ public void testZeroCostLiterals() {
+ byte[] compressed = {
+ (byte) 0x9b, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0x00, (byte) 0x20, (byte) 0x54,
+ (byte) 0x00, (byte) 0x00, (byte) 0x38, (byte) 0xd8, (byte) 0x32, (byte) 0x89, (byte) 0x01,
+ (byte) 0x12, (byte) 0x00, (byte) 0x00, (byte) 0x77, (byte) 0xda, (byte) 0xcc, (byte) 0xe1,
+ (byte) 0x7b, (byte) 0xfa, (byte) 0x0f
+ };
+ /* This lines is added manually. */
+ char[] expected = new char[16777216]; Arrays.fill(expected, '*');
+ checkSynth(
+ /*
+ * main_header
+ * metablock_header_begin: 1, 0, 16777216, 0
+ * metablock_header_trivial_context
+ * huffman_simple: 0,1,256, 42 // Single symbol alphabet
+ * huffman_fixed: 704
+ * huffman_fixed: 64
+ * command_inscopy_easy: 16777216, 0
+ * // 16777216 times 0 bits
+ */
+ compressed,
+ true,
+ /* This line is modified manually. */
+ new String(expected)
+ );
+ }
+
+/* GENERATED CODE END */
+
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Transform.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Transform.java
new file mode 100644
index 000000000..3279ee739
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Transform.java
@@ -0,0 +1,236 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Transformations on dictionary words.
+ *
+ * Transform descriptor is a triplet: {prefix, operator, suffix}.
+ * "prefix" and "suffix" are short strings inserted before and after transformed dictionary word.
+ * "operator" is applied to dictionary word itself.
+ *
+ * Some operators has "built-in" parameters, i.e. parameter is defined by operator ordinal. Other
+ * operators have "external" parameters, supplied via additional table encoded in shared dictionary.
+ *
+ * Operators:
+ * - IDENTITY (0): dictionary word is inserted "as is"
+ * - OMIT_LAST_N (1 - 9): last N octets of dictionary word are not inserted; N == ordinal
+ * - OMIT_FIRST_M (12-20): first M octets of dictionary word are not inserted; M == ordinal - 11
+ * - UPPERCASE_FIRST (10): first "scalar" is XOR'ed with number 32
+ * - UPPERCASE_ALL (11): all "scalars" are XOR'ed with number 32
+ * - SHIFT_FIRST (21): first "scalar" is shifted by number form parameter table
+ * - SHIFT_ALL (22): all "scalar" is shifted by number form parameter table
+ *
+ * Here "scalar" is a variable length character coding similar to UTF-8 encoding.
+ * UPPERCASE_XXX / SHIFT_XXX operators were designed to change the case of UTF-8 encoded characters.
+ * While UPPERCASE_XXX works well only on ASCII charset, SHIFT is much more generic and could be
+ * used for most (all?) alphabets.
+ */
+final class Transform {
+
+ static final class Transforms {
+ final int numTransforms;
+ final int[] triplets;
+ final byte[] prefixSuffixStorage;
+ final int[] prefixSuffixHeads;
+ final short[] params;
+
+ Transforms(int numTransforms, int prefixSuffixLen, int prefixSuffixCount) {
+ this.numTransforms = numTransforms;
+ this.triplets = new int[numTransforms * 3];
+ this.params = new short[numTransforms];
+ this.prefixSuffixStorage = new byte[prefixSuffixLen];
+ this.prefixSuffixHeads = new int[prefixSuffixCount + 1];
+ }
+ }
+
+ static final int NUM_RFC_TRANSFORMS = 121;
+ static final Transforms RFC_TRANSFORMS = new Transforms(NUM_RFC_TRANSFORMS, 167, 50);
+
+ private static final int OMIT_FIRST_LAST_LIMIT = 9;
+
+ private static final int IDENTITY = 0;
+ private static final int OMIT_LAST_BASE = IDENTITY + 1 - 1; // there is no OMIT_LAST_0.
+ private static final int UPPERCASE_FIRST = OMIT_LAST_BASE + OMIT_FIRST_LAST_LIMIT + 1;
+ private static final int UPPERCASE_ALL = UPPERCASE_FIRST + 1;
+ private static final int OMIT_FIRST_BASE = UPPERCASE_ALL + 1 - 1; // there is no OMIT_FIRST_0.
+ private static final int SHIFT_FIRST = OMIT_FIRST_BASE + OMIT_FIRST_LAST_LIMIT + 1;
+ private static final int SHIFT_ALL = SHIFT_FIRST + 1;
+
+ // Bundle of 0-terminated strings.
+ private static final String PREFIX_SUFFIX_SRC = "# #s #, #e #.# the #.com/#\u00C2\u00A0# of # and"
+ + " # in # to #\"#\">#\n#]# for # a # that #. # with #'# from # by #. The # on # as # is #ing"
+ + " #\n\t#:#ed #(# at #ly #=\"# of the #. This #,# not #er #al #='#ful #ive #less #est #ize #"
+ + "ous #";
+ private static final String TRANSFORMS_SRC = " !! ! , *! &! \" ! ) * * - ! # ! #!*! "
+ + "+ ,$ ! - % . / # 0 1 . \" 2 3!* 4% ! # / 5 6 7 8 0 1 & $ 9 + : "
+ + " ; < ' != > ?! 4 @ 4 2 & A *# ( B C& ) % ) !*# *-% A +! *. D! %' & E *6 F "
+ + " G% ! *A *% H! D I!+! J!+ K +- *4! A L!*4 M N +6 O!*% +.! K *G P +%( ! G *D +D "
+ + " Q +# *K!*G!+D!+# +G +A +4!+% +K!+4!*D!+K!*K";
+
+ private static void unpackTransforms(byte[] prefixSuffix,
+ int[] prefixSuffixHeads, int[] transforms, String prefixSuffixSrc, String transformsSrc) {
+ int n = prefixSuffixSrc.length();
+ int index = 1;
+ int j = 0;
+ for (int i = 0; i < n; ++i) {
+ char c = prefixSuffixSrc.charAt(i);
+ if (c == 35) { // == #
+ prefixSuffixHeads[index++] = j;
+ } else {
+ prefixSuffix[j++] = (byte) c;
+ }
+ }
+
+ for (int i = 0; i < NUM_RFC_TRANSFORMS * 3; ++i) {
+ transforms[i] = transformsSrc.charAt(i) - 32;
+ }
+ }
+
+ static {
+ unpackTransforms(RFC_TRANSFORMS.prefixSuffixStorage, RFC_TRANSFORMS.prefixSuffixHeads,
+ RFC_TRANSFORMS.triplets, PREFIX_SUFFIX_SRC, TRANSFORMS_SRC);
+ }
+
+ static int transformDictionaryWord(byte[] dst, int dstOffset, ByteBuffer src, int srcOffset,
+ int len, Transforms transforms, int transformIndex) {
+ int offset = dstOffset;
+ int[] triplets = transforms.triplets;
+ byte[] prefixSuffixStorage = transforms.prefixSuffixStorage;
+ int[] prefixSuffixHeads = transforms.prefixSuffixHeads;
+ int transformOffset = 3 * transformIndex;
+ int prefixIdx = triplets[transformOffset];
+ int transformType = triplets[transformOffset + 1];
+ int suffixIdx = triplets[transformOffset + 2];
+ int prefix = prefixSuffixHeads[prefixIdx];
+ int prefixEnd = prefixSuffixHeads[prefixIdx + 1];
+ int suffix = prefixSuffixHeads[suffixIdx];
+ int suffixEnd = prefixSuffixHeads[suffixIdx + 1];
+
+ int omitFirst = transformType - OMIT_FIRST_BASE;
+ int omitLast = transformType - OMIT_LAST_BASE;
+ if (omitFirst < 1 || omitFirst > OMIT_FIRST_LAST_LIMIT) {
+ omitFirst = 0;
+ }
+ if (omitLast < 1 || omitLast > OMIT_FIRST_LAST_LIMIT) {
+ omitLast = 0;
+ }
+
+ // Copy prefix.
+ while (prefix != prefixEnd) {
+ dst[offset++] = prefixSuffixStorage[prefix++];
+ }
+
+ // Copy trimmed word.
+ if (omitFirst > len) {
+ omitFirst = len;
+ }
+ srcOffset += omitFirst;
+ len -= omitFirst;
+ len -= omitLast;
+ int i = len;
+ while (i > 0) {
+ dst[offset++] = src.get(srcOffset++);
+ i--;
+ }
+
+ // Ferment.
+ if (transformType == UPPERCASE_FIRST || transformType == UPPERCASE_ALL) {
+ int uppercaseOffset = offset - len;
+ if (transformType == UPPERCASE_FIRST) {
+ len = 1;
+ }
+ while (len > 0) {
+ int c0 = dst[uppercaseOffset] & 0xFF;
+ if (c0 < 0xC0) {
+ if (c0 >= 97 && c0 <= 122) { // in [a..z] range
+ dst[uppercaseOffset] ^= (byte) 32;
+ }
+ uppercaseOffset += 1;
+ len -= 1;
+ } else if (c0 < 0xE0) {
+ dst[uppercaseOffset + 1] ^= (byte) 32;
+ uppercaseOffset += 2;
+ len -= 2;
+ } else {
+ dst[uppercaseOffset + 2] ^= (byte) 5;
+ uppercaseOffset += 3;
+ len -= 3;
+ }
+ }
+ } else if (transformType == SHIFT_FIRST || transformType == SHIFT_ALL) {
+ int shiftOffset = offset - len;
+ short param = transforms.params[transformIndex];
+ /* Limited sign extension: scalar < (1 << 24). */
+ int scalar = (param & 0x7FFF) + (0x1000000 - (param & 0x8000));
+ while (len > 0) {
+ int step = 1;
+ int c0 = dst[shiftOffset] & 0xFF;
+ if (c0 < 0x80) {
+ /* 1-byte rune / 0sssssss / 7 bit scalar (ASCII). */
+ scalar += c0;
+ dst[shiftOffset] = (byte) (scalar & 0x7F);
+ } else if (c0 < 0xC0) {
+ /* Continuation / 10AAAAAA. */
+ } else if (c0 < 0xE0) {
+ /* 2-byte rune / 110sssss AAssssss / 11 bit scalar. */
+ if (len >= 2) {
+ byte c1 = dst[shiftOffset + 1];
+ scalar += (c1 & 0x3F) | ((c0 & 0x1F) << 6);
+ dst[shiftOffset] = (byte) (0xC0 | ((scalar >> 6) & 0x1F));
+ dst[shiftOffset + 1] = (byte) ((c1 & 0xC0) | (scalar & 0x3F));
+ step = 2;
+ } else {
+ step = len;
+ }
+ } else if (c0 < 0xF0) {
+ /* 3-byte rune / 1110ssss AAssssss BBssssss / 16 bit scalar. */
+ if (len >= 3) {
+ byte c1 = dst[shiftOffset + 1];
+ byte c2 = dst[shiftOffset + 2];
+ scalar += (c2 & 0x3F) | ((c1 & 0x3F) << 6) | ((c0 & 0x0F) << 12);
+ dst[shiftOffset] = (byte) (0xE0 | ((scalar >> 12) & 0x0F));
+ dst[shiftOffset + 1] = (byte) ((c1 & 0xC0) | ((scalar >> 6) & 0x3F));
+ dst[shiftOffset + 2] = (byte) ((c2 & 0xC0) | (scalar & 0x3F));
+ step = 3;
+ } else {
+ step = len;
+ }
+ } else if (c0 < 0xF8) {
+ /* 4-byte rune / 11110sss AAssssss BBssssss CCssssss / 21 bit scalar. */
+ if (len >= 4) {
+ byte c1 = dst[shiftOffset + 1];
+ byte c2 = dst[shiftOffset + 2];
+ byte c3 = dst[shiftOffset + 3];
+ scalar += (c3 & 0x3F) | ((c2 & 0x3F) << 6) | ((c1 & 0x3F) << 12) | ((c0 & 0x07) << 18);
+ dst[shiftOffset] = (byte) (0xF0 | ((scalar >> 18) & 0x07));
+ dst[shiftOffset + 1] = (byte) ((c1 & 0xC0) | ((scalar >> 12) & 0x3F));
+ dst[shiftOffset + 2] = (byte) ((c2 & 0xC0) | ((scalar >> 6) & 0x3F));
+ dst[shiftOffset + 3] = (byte) ((c3 & 0xC0) | (scalar & 0x3F));
+ step = 4;
+ } else {
+ step = len;
+ }
+ }
+ shiftOffset += step;
+ len -= step;
+ if (transformType == SHIFT_FIRST) {
+ len = 0;
+ }
+ }
+ }
+
+ // Copy suffix.
+ while (suffix != suffixEnd) {
+ dst[offset++] = prefixSuffixStorage[suffix++];
+ }
+
+ return offset - dstOffset;
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/TransformTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/TransformTest.java
new file mode 100644
index 000000000..6e04f0dc6
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/TransformTest.java
@@ -0,0 +1,71 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import java.nio.ByteBuffer;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for {@link Transform}.
+ */
+@RunWith(JUnit4.class)
+public class TransformTest {
+
+ private static long crc64(byte[] data) {
+ long crc = -1;
+ for (int i = 0; i < data.length; ++i) {
+ long c = (crc ^ (long) (data[i] & 0xFF)) & 0xFF;
+ for (int k = 0; k < 8; k++) {
+ c = (c >>> 1) ^ (-(c & 1L) & -3932672073523589310L);
+ }
+ crc = c ^ (crc >>> 8);
+ }
+ return ~crc;
+ }
+
+ @Test
+ public void testTrimAll() {
+ byte[] output = new byte[0];
+ byte[] input = {119, 111, 114, 100}; // "word"
+ Transform.transformDictionaryWord(output, 0,
+ ByteBuffer.wrap(input), 0, input.length, Transform.RFC_TRANSFORMS, 39);
+ byte[] expectedOutput = new byte[0];
+ assertArrayEquals(expectedOutput, output);
+ }
+
+ @Test
+ public void testCapitalize() {
+ byte[] output = new byte[6];
+ byte[] input = {113, -61, -90, -32, -92, -86}; // "qæप"
+ Transform.transformDictionaryWord(output, 0,
+ ByteBuffer.wrap(input), 0, input.length, Transform.RFC_TRANSFORMS, 44);
+ byte[] expectedOutput = {81, -61, -122, -32, -92, -81}; // "QÆय"
+ assertArrayEquals(expectedOutput, output);
+ }
+
+ @Test
+ public void testAllTransforms() {
+ /* This string allows to apply all transforms: head and tail cutting, capitalization and
+ turning to upper case; all results will be mutually different. */
+ // "o123456789abcdef"
+ byte[] testWord = {111, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102};
+ byte[] output = new byte[2259];
+ int offset = 0;
+ for (int i = 0; i < Transform.NUM_RFC_TRANSFORMS; ++i) {
+ offset += Transform.transformDictionaryWord(output, offset,
+ ByteBuffer.wrap(testWord), 0, testWord.length, Transform.RFC_TRANSFORMS, i);
+ output[offset++] = -1;
+ }
+ assertEquals(output.length, offset);
+ assertEquals(8929191060211225186L, crc64(output));
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Utils.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Utils.java
new file mode 100644
index 000000000..2d04aecd3
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/Utils.java
@@ -0,0 +1,102 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.dec;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.nio.Buffer;
+
+/**
+ * A set of utility methods.
+ */
+final class Utils {
+
+ private static final byte[] BYTE_ZEROES = new byte[1024];
+
+ private static final int[] INT_ZEROES = new int[1024];
+
+ /**
+ * Fills byte array with zeroes.
+ *
+ * <p> Current implementation uses {@link System#arraycopy}, so it should be used for length not
+ * less than 16.
+ *
+ * @param dest array to fill with zeroes
+ * @param offset the first byte to fill
+ * @param length number of bytes to change
+ */
+ static void fillBytesWithZeroes(byte[] dest, int start, int end) {
+ int cursor = start;
+ while (cursor < end) {
+ int step = Math.min(cursor + 1024, end) - cursor;
+ System.arraycopy(BYTE_ZEROES, 0, dest, cursor, step);
+ cursor += step;
+ }
+ }
+
+ /**
+ * Fills int array with zeroes.
+ *
+ * <p> Current implementation uses {@link System#arraycopy}, so it should be used for length not
+ * less than 16.
+ *
+ * @param dest array to fill with zeroes
+ * @param offset the first item to fill
+ * @param length number of item to change
+ */
+ static void fillIntsWithZeroes(int[] dest, int start, int end) {
+ int cursor = start;
+ while (cursor < end) {
+ int step = Math.min(cursor + 1024, end) - cursor;
+ System.arraycopy(INT_ZEROES, 0, dest, cursor, step);
+ cursor += step;
+ }
+ }
+
+ static void copyBytesWithin(byte[] bytes, int target, int start, int end) {
+ System.arraycopy(bytes, start, bytes, target, end - start);
+ }
+
+ static int readInput(InputStream src, byte[] dst, int offset, int length) {
+ try {
+ return src.read(dst, offset, length);
+ } catch (IOException e) {
+ throw new BrotliRuntimeException("Failed to read input", e);
+ }
+ }
+
+ static void closeInput(InputStream src) throws IOException {
+ src.close();
+ }
+
+ static byte[] toUsAsciiBytes(String src) {
+ try {
+ // NB: String#getBytes(String) is present in JDK 1.1, while other variants require JDK 1.6 and
+ // above.
+ return src.getBytes("US-ASCII");
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e); // cannot happen
+ }
+ }
+
+ // Crazy pills factory: code compiled for JDK8 does not work on JRE9.
+ static void flipBuffer(Buffer buffer) {
+ buffer.flip();
+ }
+
+ static int isDebugMode() {
+ boolean assertsEnabled = Boolean.parseBoolean(System.getProperty("BROTLI_ENABLE_ASSERTS"));
+ return assertsEnabled ? 1 : 0;
+ }
+
+ // See BitReader.LOG_BITNESS
+ static int getLogBintness() {
+ boolean isLongExpensive = Boolean.parseBoolean(System.getProperty("BROTLI_32_BIT_CPU"));
+ return isLongExpensive ? 5 : 6;
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/build_defs.bzl b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/build_defs.bzl
new file mode 100644
index 000000000..d0a015c0c
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/build_defs.bzl
@@ -0,0 +1,34 @@
+"""Utilities for Java brotli tests."""
+
+_TEST_JVM_FLAGS = [
+ "-DBROTLI_ENABLE_ASSERTS=true",
+]
+
+def brotli_java_test(name, main_class = None, jvm_flags = None, **kwargs):
+ """test duplication rule that creates 32/64-bit test pair."""
+
+ if jvm_flags == None:
+ jvm_flags = []
+ jvm_flags = jvm_flags + _TEST_JVM_FLAGS
+
+ test_package = native.package_name().replace("/", ".")
+ if main_class == None:
+ test_class = test_package + "." + name
+ else:
+ test_class = None
+
+ native.java_test(
+ name = name + "_32",
+ main_class = main_class,
+ test_class = test_class,
+ jvm_flags = jvm_flags + ["-DBROTLI_32_BIT_CPU=true"],
+ **kwargs
+ )
+
+ native.java_test(
+ name = name + "_64",
+ main_class = main_class,
+ test_class = test_class,
+ jvm_flags = jvm_flags + ["-DBROTLI_32_BIT_CPU=false"],
+ **kwargs
+ )
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/pom.xml b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/pom.xml
new file mode 100644
index 000000000..946fddf2d
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/pom.xml
@@ -0,0 +1,172 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.brotli</groupId>
+ <artifactId>parent</artifactId>
+ <version>0.2.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>dec</artifactId>
+ <version>0.2.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+
+ <name>${project.groupId}:${project.artifactId}</name>
+
+ <properties>
+ <manifestdir>${project.build.directory}/osgi</manifestdir>
+ <manifestfile>${manifestdir}/MANIFEST.MF</manifestfile>
+ </properties>
+
+ <build>
+ <sourceDirectory>../../..</sourceDirectory>
+ <testSourceDirectory>../../..</testSourceDirectory>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/brotli/dec/*.java</include>
+ </includes>
+ <excludes>
+ <exclude>**/*Test*.java</exclude>
+ </excludes>
+ <testIncludes>
+ <include>org/brotli/dec/*Test*.java</include>
+ </testIncludes>
+ <testExcludes>
+ <exclude>org/brotli/dec/SetDictionaryTest.java</exclude>
+ </testExcludes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>3.0.0-M3</version>
+ <configuration>
+ <systemPropertyVariables>
+ <BROTLI_ENABLE_ASSERTS>true</BROTLI_ENABLE_ASSERTS>
+ </systemPropertyVariables>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-source-plugin</artifactId>
+ <version>2.4</version>
+ <executions>
+ <execution>
+ <id>attach-sources</id>
+ <phase>verify</phase>
+ <goals>
+ <goal>jar-no-fork</goal>
+ </goals>
+ <configuration>
+ <includes>
+ <include>org/brotli/dec/*.java</include>
+ </includes>
+ <excludes>
+ <exclude>**/*Test*.java</exclude>
+ </excludes>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <version>2.10.4</version>
+ <executions>
+ <execution>
+ <id>attach-javadocs</id>
+ <phase>verify</phase>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ <configuration>
+ <sourcepath>.</sourcepath>
+ <sourceFileExcludes>
+ <exclude>**/*Test*.java</exclude>
+ </sourceFileExcludes>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>3.0.1</version>
+ <configuration>
+ <archive>
+ <forced>true</forced>
+ </archive>
+ <excludeDependencies>true</excludeDependencies>
+ <manifestLocation>${manifestdir}</manifestLocation>
+ <instructions>
+ <_nouses>true</_nouses>
+ <Bundle-SymbolicName>org.brotli.${project.artifactId}</Bundle-SymbolicName>
+ <Bundle-Description>${project.description}</Bundle-Description>
+ <Export-Package>org.brotli.dec;version=${project.version};-noimport:=true</Export-Package>
+ <Private-Package></Private-Package>
+ <Import-Package>*</Import-Package>
+ <DynamicImport-Package></DynamicImport-Package>
+ <Bundle-DocURL>${project.url}</Bundle-DocURL>
+ </instructions>
+ </configuration>
+ <executions>
+ <execution>
+ <id>bundle-manifest</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>manifest</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.5</version>
+ <configuration>
+ <archive>
+ <manifestFile>${manifestfile}</manifestFile>
+ </archive>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>3.1.0</version>
+ <executions>
+ <execution>
+ <id>copy-license</id>
+ <phase>validate</phase>
+ <goals>
+ <goal>copy-resources</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>${project.build.outputDirectory}/META-INF</outputDirectory>
+ <resources>
+ <resource>
+ <directory>../../../../</directory>
+ <includes>
+ <include>LICENSE</include>
+ </includes>
+ <filtering>false</filtering>
+ </resource>
+ </resources>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.12</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/proguard.pgcfg b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/proguard.pgcfg
new file mode 100644
index 000000000..4c545dce5
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/dec/proguard.pgcfg
@@ -0,0 +1,6 @@
+# DictionaryData is an optionally / dynamically loaded built-in dictionary.
+-keep class org.brotli.dec.DictionaryData
+
+# We get the fully-qualified name of DictionaryData from Dictionary, so avoid
+# renaming it.
+-keepnames class org.brotli.dec.Dictionary
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BUILD b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BUILD
new file mode 100644
index 000000000..5b773251a
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BUILD
@@ -0,0 +1,73 @@
+# Description:
+# Integration test runner + corpus for Java port of Brotli decoder.
+
+java_library(
+ name = "brotli_jni_test_base",
+ srcs = ["BrotliJniTestBase.java"],
+ visibility = [
+ "//org/brotli/wrapper/common:__pkg__",
+ "//org/brotli/wrapper/dec:__pkg__",
+ "//org/brotli/wrapper/enc:__pkg__",
+ ],
+)
+
+java_library(
+ name = "bundle_helper",
+ srcs = ["BundleHelper.java"],
+ visibility = [
+ "//org/brotli/wrapper/dec:__pkg__",
+ "//org/brotli/wrapper/enc:__pkg__",
+ ],
+)
+
+java_library(
+ name = "bundle_checker",
+ srcs = ["BundleChecker.java"],
+ deps = [
+ ":bundle_helper",
+ "//org/brotli/dec",
+ ],
+)
+
+java_binary(
+ name = "bundle_checker_bin",
+ main_class = "org.brotli.integration.BundleChecker",
+ runtime_deps = [":bundle_checker"],
+)
+
+java_test(
+ name = "bundle_checker_data_test",
+ args = ["org/brotli/integration/test_data.zip"],
+ data = ["test_data.zip"],
+ main_class = "org.brotli.integration.BundleChecker",
+ use_testrunner = 0,
+ runtime_deps = [":bundle_checker"],
+)
+
+java_test(
+ name = "bundle_checker_fuzz_test",
+ args = [
+ "-s",
+ "org/brotli/integration/fuzz_data.zip",
+ ],
+ data = ["fuzz_data.zip"],
+ main_class = "org.brotli.integration.BundleChecker",
+ use_testrunner = 0,
+ runtime_deps = [":bundle_checker"],
+)
+
+filegroup(
+ name = "test_data",
+ srcs = ["test_data.zip"],
+ visibility = [
+ "//org/brotli/wrapper/dec:__pkg__",
+ ],
+)
+
+filegroup(
+ name = "test_corpus",
+ srcs = ["test_corpus.zip"],
+ visibility = [
+ "//org/brotli/wrapper/enc:__pkg__",
+ ],
+)
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BrotliJniTestBase.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BrotliJniTestBase.java
new file mode 100644
index 000000000..4d699d5cf
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BrotliJniTestBase.java
@@ -0,0 +1,13 @@
+package org.brotli.integration;
+
+/**
+ * Optionally loads brotli JNI wrapper native library.
+ */
+public class BrotliJniTestBase {
+ static {
+ String jniLibrary = System.getProperty("BROTLI_JNI_LIBRARY");
+ if (jniLibrary != null) {
+ System.load(new java.io.File(jniLibrary).getAbsolutePath());
+ }
+ }
+} \ No newline at end of file
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BundleChecker.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BundleChecker.java
new file mode 100644
index 000000000..e3ddb33b0
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BundleChecker.java
@@ -0,0 +1,112 @@
+/* Copyright 2016 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.integration;
+
+import org.brotli.dec.BrotliInputStream;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+/**
+ * Decompress files and (optionally) checks their checksums.
+ *
+ * <p> File are read from ZIP archive passed as an array of bytes. Multiple checkers negotiate about
+ * task distribution via shared AtomicInteger counter.
+ * <p> All entries are expected to be valid brotli compressed streams and output CRC64 checksum
+ * is expected to match the checksum hex-encoded in the first part of entry name.
+ */
+public class BundleChecker implements Runnable {
+ private final AtomicInteger nextJob;
+ private final InputStream input;
+ private final boolean sanityCheck;
+
+ /**
+ * @param sanityCheck do not calculate checksum and ignore {@link IOException}.
+ */
+ public BundleChecker(InputStream input, AtomicInteger nextJob, boolean sanityCheck) {
+ this.input = input;
+ this.nextJob = nextJob;
+ this.sanityCheck = sanityCheck;
+ }
+
+ private long decompressAndCalculateCrc(ZipInputStream input) throws IOException {
+ /* Do not allow entry readers to close the whole ZipInputStream. */
+ FilterInputStream entryStream = new FilterInputStream(input) {
+ @Override
+ public void close() {}
+ };
+
+ BrotliInputStream decompressedStream = new BrotliInputStream(entryStream);
+ long crc;
+ try {
+ crc = BundleHelper.fingerprintStream(decompressedStream);
+ } finally {
+ decompressedStream.close();
+ }
+ return crc;
+ }
+
+ @Override
+ public void run() {
+ String entryName = "";
+ ZipInputStream zis = new ZipInputStream(input);
+ try {
+ int entryIndex = 0;
+ ZipEntry entry;
+ int jobIndex = nextJob.getAndIncrement();
+ while ((entry = zis.getNextEntry()) != null) {
+ if (entry.isDirectory()) {
+ continue;
+ }
+ if (entryIndex++ != jobIndex) {
+ zis.closeEntry();
+ continue;
+ }
+ entryName = entry.getName();
+ long entryCrc = BundleHelper.getExpectedFingerprint(entryName);
+ try {
+ if (entryCrc != decompressAndCalculateCrc(zis) && !sanityCheck) {
+ throw new RuntimeException("CRC mismatch");
+ }
+ } catch (IOException iox) {
+ if (!sanityCheck) {
+ throw new RuntimeException("Decompression failed", iox);
+ }
+ }
+ zis.closeEntry();
+ entryName = "";
+ jobIndex = nextJob.getAndIncrement();
+ }
+ zis.close();
+ input.close();
+ } catch (Throwable ex) {
+ throw new RuntimeException(entryName, ex);
+ }
+ }
+
+ public static void main(String[] args) throws FileNotFoundException {
+ int argsOffset = 0;
+ boolean sanityCheck = false;
+ if (args.length != 0) {
+ if (args[0].equals("-s")) {
+ sanityCheck = true;
+ argsOffset = 1;
+ }
+ }
+ if (args.length == argsOffset) {
+ throw new RuntimeException("Usage: BundleChecker [-s] <fileX.zip> ...");
+ }
+ for (int i = argsOffset; i < args.length; ++i) {
+ new BundleChecker(new FileInputStream(args[i]), new AtomicInteger(0), sanityCheck).run();
+ }
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BundleHelper.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BundleHelper.java
new file mode 100644
index 000000000..0eab7bcb1
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/BundleHelper.java
@@ -0,0 +1,113 @@
+/* Copyright 2016 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.integration;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+/**
+ * Utilities to work test files bundles in zip archive.
+ */
+public class BundleHelper {
+ private BundleHelper() { }
+
+ public static List<String> listEntries(InputStream input) throws IOException {
+ List<String> result = new ArrayList<String>();
+ ZipInputStream zis = new ZipInputStream(input);
+ ZipEntry entry;
+ try {
+ while ((entry = zis.getNextEntry()) != null) {
+ if (!entry.isDirectory()) {
+ result.add(entry.getName());
+ }
+ zis.closeEntry();
+ }
+ } finally {
+ zis.close();
+ }
+ return result;
+ }
+
+ public static byte[] readStream(InputStream input) throws IOException {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ byte[] buffer = new byte[65536];
+ int bytesRead;
+ while ((bytesRead = input.read(buffer)) != -1) {
+ result.write(buffer, 0, bytesRead);
+ }
+ return result.toByteArray();
+ }
+
+ public static byte[] readEntry(InputStream input, String entryName) throws IOException {
+ ZipInputStream zis = new ZipInputStream(input);
+ ZipEntry entry;
+ try {
+ while ((entry = zis.getNextEntry()) != null) {
+ if (entry.getName().equals(entryName)) {
+ byte[] result = readStream(zis);
+ zis.closeEntry();
+ return result;
+ }
+ zis.closeEntry();
+ }
+ } finally {
+ zis.close();
+ }
+ /* entry not found */
+ return null;
+ }
+
+ /** ECMA CRC64 polynomial. */
+ private static final long CRC_64_POLY =
+ new BigInteger("C96C5795D7870F42", 16).longValue();
+
+ /**
+ * Rolls CRC64 calculation.
+ *
+ * <p> {@code CRC64(data) = -1 ^ updateCrc64((... updateCrc64(-1, firstBlock), ...), lastBlock);}
+ * <p> This simple and reliable checksum is chosen to make is easy to calculate the same value
+ * across the variety of languages (C++, Java, Go, ...).
+ */
+ public static long updateCrc64(long crc, byte[] data, int offset, int length) {
+ for (int i = offset; i < offset + length; ++i) {
+ long c = (crc ^ (long) (data[i] & 0xFF)) & 0xFF;
+ for (int k = 0; k < 8; k++) {
+ c = ((c & 1) == 1) ? CRC_64_POLY ^ (c >>> 1) : c >>> 1;
+ }
+ crc = c ^ (crc >>> 8);
+ }
+ return crc;
+ }
+
+ /**
+ * Calculates CRC64 of stream contents.
+ */
+ public static long fingerprintStream(InputStream input) throws IOException {
+ byte[] buffer = new byte[65536];
+ long crc = -1;
+ while (true) {
+ int len = input.read(buffer);
+ if (len <= 0) {
+ break;
+ }
+ crc = updateCrc64(crc, buffer, 0, len);
+ }
+ return ~crc;
+ }
+
+ public static long getExpectedFingerprint(String entryName) {
+ int dotIndex = entryName.indexOf('.');
+ String entryCrcString = (dotIndex == -1) ? entryName : entryName.substring(0, dotIndex);
+ return new BigInteger(entryCrcString, 16).longValue();
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/fuzz_data.zip b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/fuzz_data.zip
new file mode 100644
index 000000000..7a7eedaa0
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/fuzz_data.zip
Binary files differ
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/pom.xml b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/pom.xml
new file mode 100644
index 000000000..2858a12ec
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/pom.xml
@@ -0,0 +1,65 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.brotli</groupId>
+ <artifactId>parent</artifactId>
+ <version>0.2.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>integration</artifactId>
+ <version>0.2.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+
+ <name>${project.groupId}:${project.artifactId}</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.brotli</groupId>
+ <artifactId>dec</artifactId>
+ <version>0.2.0-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <sourceDirectory>.</sourceDirectory>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <version>1.5.0</version>
+ <executions>
+ <execution>
+ <id>data</id>
+ <phase>test</phase>
+ <goals>
+ <goal>java</goal>
+ </goals>
+ <configuration>
+ <executable>java</executable>
+ <mainClass>org.brotli.integration.BundleChecker</mainClass>
+ <arguments>
+ <argument>test_data.zip</argument>
+ </arguments>
+ </configuration>
+ </execution>
+ <execution>
+ <id>fuzz</id>
+ <phase>test</phase>
+ <goals>
+ <goal>java</goal>
+ </goals>
+ <configuration>
+ <executable>java</executable>
+ <mainClass>org.brotli.integration.BundleChecker</mainClass>
+ <arguments>
+ <argument>-s</argument>
+ <argument>fuzz_data.zip</argument>
+ </arguments>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/test_corpus.zip b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/test_corpus.zip
new file mode 100644
index 000000000..8450112d9
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/test_corpus.zip
Binary files differ
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/test_data.zip b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/test_data.zip
new file mode 100644
index 000000000..15ed86207
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/integration/test_data.zip
Binary files differ
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/pom.xml b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/pom.xml
new file mode 100644
index 000000000..9a7abd095
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/pom.xml
@@ -0,0 +1,101 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.brotli</groupId>
+ <artifactId>parent</artifactId>
+ <version>0.2.0-SNAPSHOT</version>
+ <packaging>pom</packaging>
+
+ <name>${project.groupId}:${project.artifactId}</name>
+ <description>Brotli is a generic-purpose lossless compression algorithm.</description>
+ <url>http://brotli.org</url>
+ <licenses>
+ <license>
+ <name>MIT License</name>
+ <url>http://www.opensource.org/licenses/mit-license.php</url>
+ </license>
+ </licenses>
+ <developers>
+ <developer>
+ <organization>Google</organization>
+ <organizationUrl>https://github.com/google</organizationUrl>
+ </developer>
+ </developers>
+ <scm>
+ <connection>scm:git:git://github.com/google/brotli.git</connection>
+ <developerConnection>scm:git:ssh://git@github.com/google/brotli.git</developerConnection>
+ <url>https://github.com/google/brotli</url>
+ </scm>
+
+ <modules>
+ <module>dec</module>
+ </modules>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+
+ <distributionManagement>
+ <snapshotRepository>
+ <id>ossrh</id>
+ <url>https://oss.sonatype.org/content/repositories/snapshots</url>
+ </snapshotRepository>
+ </distributionManagement>
+
+ <profiles>
+ <profile>
+ <id>release-sign-artifacts</id>
+ <activation>
+ <property>
+ <name>performRelease</name>
+ <value>true</value>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-gpg-plugin</artifactId>
+ <version>1.5</version>
+ <executions>
+ <execution>
+ <id>sign-artifacts</id>
+ <phase>verify</phase>
+ <goals>
+ <goal>sign</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.1</version>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.sonatype.plugins</groupId>
+ <artifactId>nexus-staging-maven-plugin</artifactId>
+ <version>1.6.7</version>
+ <extensions>true</extensions>
+ <configuration>
+ <serverId>ossrh</serverId>
+ <nexusUrl>https://oss.sonatype.org/</nexusUrl>
+ <autoReleaseAfterClose>false</autoReleaseAfterClose>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/BUILD b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/BUILD
new file mode 100644
index 000000000..7c3480a09
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/BUILD
@@ -0,0 +1,61 @@
+package(default_visibility = ["//visibility:public"])
+
+licenses(["notice"]) # MIT
+
+filegroup(
+ name = "jni_src",
+ srcs = ["common_jni.cc"],
+)
+
+filegroup(
+ name = "brotli_jni_no_dictionary_data",
+ srcs = ["//:brotli_jni_no_dictionary_data.dll"],
+)
+
+java_library(
+ name = "common",
+ srcs = glob(
+ ["*.java"],
+ exclude = ["*Test*.java"],
+ ),
+ resource_jars = ["//:license"],
+)
+
+java_library(
+ name = "test_lib",
+ testonly = 1,
+ srcs = glob(["*Test*.java"]),
+ deps = [
+ ":common",
+ "//org/brotli/dec",
+ "//org/brotli/integration:brotli_jni_test_base",
+ "//org/brotli/wrapper/dec",
+ "@junit_junit//jar",
+ ],
+)
+
+java_test(
+ name = "SetZeroDictionaryTest",
+ size = "small",
+ data = [
+ ":brotli_jni_no_dictionary_data", # Bazel JNI workaround
+ ],
+ jvm_flags = [
+ "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni_no_dictionary_data)",
+ ],
+ test_class = "org.brotli.wrapper.common.SetZeroDictionaryTest",
+ runtime_deps = [":test_lib"],
+)
+
+java_test(
+ name = "SetRfcDictionaryTest",
+ size = "small",
+ data = [
+ ":brotli_jni_no_dictionary_data", # Bazel JNI workaround
+ ],
+ jvm_flags = [
+ "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni_no_dictionary_data)",
+ ],
+ test_class = "org.brotli.wrapper.common.SetRfcDictionaryTest",
+ runtime_deps = [":test_lib"],
+)
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/BrotliCommon.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/BrotliCommon.java
new file mode 100644
index 000000000..9419e42d6
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/BrotliCommon.java
@@ -0,0 +1,130 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.common;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+
+/**
+ * JNI wrapper for brotli common.
+ */
+public class BrotliCommon {
+ public static final int RFC_DICTIONARY_SIZE = 122784;
+
+ /* 96cecd2ee7a666d5aa3627d74735b32a */
+ private static final byte[] RFC_DICTIONARY_MD5 = {
+ -106, -50, -51, 46, -25, -90, 102, -43, -86, 54, 39, -41, 71, 53, -77, 42
+ };
+
+ /* 72b41051cb61a9281ba3c4414c289da50d9a7640 */
+ private static final byte[] RFC_DICTIONARY_SHA_1 = {
+ 114, -76, 16, 81, -53, 97, -87, 40, 27, -93, -60, 65, 76, 40, -99, -91, 13, -102, 118, 64
+ };
+
+ /* 20e42eb1b511c21806d4d227d07e5dd06877d8ce7b3a817f378f313653f35c70 */
+ private static final byte[] RFC_DICTIONARY_SHA_256 = {
+ 32, -28, 46, -79, -75, 17, -62, 24, 6, -44, -46, 39, -48, 126, 93, -48,
+ 104, 119, -40, -50, 123, 58, -127, 127, 55, -113, 49, 54, 83, -13, 92, 112
+ };
+
+ private static boolean isDictionaryDataSet;
+ private static final Object mutex = new Object();
+
+ /**
+ * Checks if the given checksum matches MD5 checksum of the RFC dictionary.
+ */
+ public static boolean checkDictionaryDataMd5(byte[] digest) {
+ return Arrays.equals(RFC_DICTIONARY_MD5, digest);
+ }
+
+ /**
+ * Checks if the given checksum matches SHA-1 checksum of the RFC dictionary.
+ */
+ public static boolean checkDictionaryDataSha1(byte[] digest) {
+ return Arrays.equals(RFC_DICTIONARY_SHA_1, digest);
+ }
+
+ /**
+ * Checks if the given checksum matches SHA-256 checksum of the RFC dictionary.
+ */
+ public static boolean checkDictionaryDataSha256(byte[] digest) {
+ return Arrays.equals(RFC_DICTIONARY_SHA_256, digest);
+ }
+
+ /**
+ * Copy bytes to a new direct ByteBuffer.
+ *
+ * Direct byte buffers are used to supply native code with large data chunks.
+ */
+ public static ByteBuffer makeNative(byte[] data) {
+ ByteBuffer result = ByteBuffer.allocateDirect(data.length);
+ result.put(data);
+ return result;
+ }
+
+ /**
+ * Copies data and sets it to be brotli dictionary.
+ */
+ public static void setDictionaryData(byte[] data) {
+ if (data.length != RFC_DICTIONARY_SIZE) {
+ throw new IllegalArgumentException("invalid dictionary size");
+ }
+ synchronized (mutex) {
+ if (isDictionaryDataSet) {
+ return;
+ }
+ setDictionaryData(makeNative(data));
+ }
+ }
+
+ /**
+ * Reads data and sets it to be brotli dictionary.
+ */
+ public static void setDictionaryData(InputStream src) throws IOException {
+ synchronized (mutex) {
+ if (isDictionaryDataSet) {
+ return;
+ }
+ ByteBuffer copy = ByteBuffer.allocateDirect(RFC_DICTIONARY_SIZE);
+ byte[] buffer = new byte[4096];
+ int readBytes;
+ while ((readBytes = src.read(buffer)) != -1) {
+ if (copy.remaining() < readBytes) {
+ throw new IllegalArgumentException("invalid dictionary size");
+ }
+ copy.put(buffer, 0, readBytes);
+ }
+ if (copy.remaining() != 0) {
+ throw new IllegalArgumentException("invalid dictionary size " + copy.remaining());
+ }
+ setDictionaryData(copy);
+ }
+ }
+
+ /**
+ * Sets data to be brotli dictionary.
+ */
+ public static void setDictionaryData(ByteBuffer data) {
+ if (!data.isDirect()) {
+ throw new IllegalArgumentException("direct byte buffer is expected");
+ }
+ if (data.capacity() != RFC_DICTIONARY_SIZE) {
+ throw new IllegalArgumentException("invalid dictionary size");
+ }
+ synchronized (mutex) {
+ if (isDictionaryDataSet) {
+ return;
+ }
+ if (!CommonJNI.nativeSetDictionaryData(data)) {
+ throw new RuntimeException("setting dictionary failed");
+ }
+ isDictionaryDataSet = true;
+ }
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/CommonJNI.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/CommonJNI.java
new file mode 100644
index 000000000..d6625461b
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/CommonJNI.java
@@ -0,0 +1,16 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.common;
+
+import java.nio.ByteBuffer;
+
+/**
+ * JNI wrapper for brotli common.
+ */
+class CommonJNI {
+ static native boolean nativeSetDictionaryData(ByteBuffer data);
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/SetRfcDictionaryTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/SetRfcDictionaryTest.java
new file mode 100644
index 000000000..a986eaee4
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/SetRfcDictionaryTest.java
@@ -0,0 +1,74 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.common;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.brotli.dec.Dictionary;
+import org.brotli.integration.BrotliJniTestBase;
+import org.brotli.wrapper.dec.BrotliInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for {@link BrotliCommon}.
+ */
+@RunWith(JUnit4.class)
+public class SetRfcDictionaryTest extends BrotliJniTestBase {
+
+ @Test
+ public void testRfcDictionaryChecksums() throws NoSuchAlgorithmException {
+ System.err.println(Dictionary.getData().slice().remaining());
+ MessageDigest md5 = MessageDigest.getInstance("MD5");
+ md5.update(Dictionary.getData().slice());
+ assertTrue(BrotliCommon.checkDictionaryDataMd5(md5.digest()));
+
+ MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
+ sha1.update(Dictionary.getData().slice());
+ assertTrue(BrotliCommon.checkDictionaryDataSha1(sha1.digest()));
+
+ MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
+ sha256.update(Dictionary.getData().slice());
+ assertTrue(BrotliCommon.checkDictionaryDataSha256(sha256.digest()));
+ }
+
+ @Test
+ public void testSetRfcDictionary() throws IOException {
+ /* "leftdatadataleft" encoded with dictionary words. */
+ byte[] data = {27, 15, 0, 0, 0, 0, -128, -29, -76, 13, 0, 0, 7, 91, 38, 49, 64, 2, 0, -32, 78,
+ 27, 65, -128, 32, 80, 16, 36, 8, 6};
+ BrotliCommon.setDictionaryData(Dictionary.getData());
+
+ BrotliInputStream decoder = new BrotliInputStream(new ByteArrayInputStream(data));
+ byte[] output = new byte[17];
+ int offset = 0;
+ try {
+ int bytesRead;
+ while ((bytesRead = decoder.read(output, offset, 17 - offset)) != -1) {
+ offset += bytesRead;
+ }
+ } finally {
+ decoder.close();
+ }
+ assertEquals(16, offset);
+ byte[] expected = {
+ 'l', 'e', 'f', 't',
+ 'd', 'a', 't', 'a',
+ 'd', 'a', 't', 'a',
+ 'l', 'e', 'f', 't',
+ 0
+ };
+ assertArrayEquals(expected, output);
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/SetZeroDictionaryTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/SetZeroDictionaryTest.java
new file mode 100644
index 000000000..669939c9f
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/SetZeroDictionaryTest.java
@@ -0,0 +1,48 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.common;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import org.brotli.integration.BrotliJniTestBase;
+import org.brotli.wrapper.dec.BrotliInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for {@link BrotliCommon}.
+ */
+@RunWith(JUnit4.class)
+public class SetZeroDictionaryTest extends BrotliJniTestBase {
+
+ @Test
+ public void testZeroDictionary() throws IOException {
+ /* "leftdatadataleft" encoded with dictionary words. */
+ byte[] data = {27, 15, 0, 0, 0, 0, -128, -29, -76, 13, 0, 0, 7, 91, 38, 49, 64, 2, 0, -32, 78,
+ 27, 65, -128, 32, 80, 16, 36, 8, 6};
+ byte[] dictionary = new byte[BrotliCommon.RFC_DICTIONARY_SIZE];
+ BrotliCommon.setDictionaryData(dictionary);
+
+ BrotliInputStream decoder = new BrotliInputStream(new ByteArrayInputStream(data));
+ byte[] output = new byte[17];
+ int offset = 0;
+ try {
+ int bytesRead;
+ while ((bytesRead = decoder.read(output, offset, 17 - offset)) != -1) {
+ offset += bytesRead;
+ }
+ } finally {
+ decoder.close();
+ }
+ assertEquals(16, offset);
+ assertArrayEquals(new byte[17], output);
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/common_jni.cc b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/common_jni.cc
new file mode 100644
index 000000000..c71ca4955
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/common/common_jni.cc
@@ -0,0 +1,47 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+#include <jni.h>
+
+#include "c/common/dictionary.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Set data to be brotli dictionary data.
+ *
+ * @param buffer direct ByteBuffer
+ * @returns false if dictionary data was already set; otherwise true
+ */
+JNIEXPORT jint JNICALL
+Java_org_brotli_wrapper_common_CommonJNI_nativeSetDictionaryData(
+ JNIEnv* env, jobject /*jobj*/, jobject buffer) {
+ jobject buffer_ref = env->NewGlobalRef(buffer);
+ if (!buffer_ref) {
+ return false;
+ }
+ uint8_t* data = static_cast<uint8_t*>(env->GetDirectBufferAddress(buffer));
+ if (!data) {
+ env->DeleteGlobalRef(buffer_ref);
+ return false;
+ }
+
+ BrotliSetDictionaryData(data);
+
+ const BrotliDictionary* dictionary = BrotliGetDictionary();
+ if (dictionary->data != data) {
+ env->DeleteGlobalRef(buffer_ref);
+ } else {
+ /* Don't release reference; it is an intended memory leak. */
+ }
+ return true;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BUILD b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BUILD
new file mode 100644
index 000000000..d1c8f5ba1
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BUILD
@@ -0,0 +1,84 @@
+package(default_visibility = ["//visibility:public"])
+
+licenses(["notice"]) # MIT
+
+filegroup(
+ name = "jni_src",
+ srcs = ["decoder_jni.cc"],
+)
+
+java_library(
+ name = "dec",
+ srcs = glob(
+ ["*.java"],
+ exclude = ["*Test*.java"],
+ ),
+ resource_jars = ["//:license"],
+)
+
+java_library(
+ name = "test_lib",
+ testonly = 1,
+ srcs = glob(["*Test*.java"]),
+ deps = [
+ ":dec",
+ "//org/brotli/integration:brotli_jni_test_base",
+ "//org/brotli/integration:bundle_helper",
+ "@junit_junit//jar",
+ ],
+)
+
+filegroup(
+ name = "brotli_jni",
+ srcs = ["//:brotli_jni.dll"],
+)
+
+filegroup(
+ name = "test_bundle",
+ srcs = ["//org/brotli/integration:test_data"],
+)
+
+java_test(
+ name = "BrotliDecoderChannelTest",
+ size = "large",
+ data = [
+ ":brotli_jni", # Bazel JNI workaround
+ ":test_bundle",
+ ],
+ jvm_flags = [
+ "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni)",
+ "-DTEST_BUNDLE=$(location :test_bundle)",
+ ],
+ test_class = "org.brotli.wrapper.dec.BrotliDecoderChannelTest",
+ runtime_deps = [":test_lib"],
+)
+
+java_test(
+ name = "BrotliInputStreamTest",
+ size = "large",
+ data = [
+ ":brotli_jni", # Bazel JNI workaround
+ ":test_bundle",
+ ],
+ jvm_flags = [
+ "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni)",
+ "-DTEST_BUNDLE=$(location :test_bundle)",
+ ],
+ test_class = "org.brotli.wrapper.dec.BrotliInputStreamTest",
+ runtime_deps = [":test_lib"],
+)
+
+java_test(
+ name = "DecoderTest",
+ size = "large",
+ data = [
+ ":brotli_jni", # Bazel JNI workaround
+ ":test_bundle",
+ ],
+ jvm_flags = [
+ "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni)",
+ "-DTEST_BUNDLE=$(location :test_bundle)",
+ ],
+ test_class = "org.brotli.wrapper.dec.DecoderTest",
+ runtime_deps = [":test_lib"],
+)
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliDecoderChannel.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliDecoderChannel.java
new file mode 100644
index 000000000..6dfe8f21a
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliDecoderChannel.java
@@ -0,0 +1,69 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.dec;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.ReadableByteChannel;
+
+/**
+ * ReadableByteChannel that wraps native brotli decoder.
+ */
+public class BrotliDecoderChannel extends Decoder implements ReadableByteChannel {
+ /** The default internal buffer size used by the decoder. */
+ private static final int DEFAULT_BUFFER_SIZE = 16384;
+
+ private final Object mutex = new Object();
+
+ /**
+ * Creates a BrotliDecoderChannel.
+ *
+ * @param source underlying source
+ * @param bufferSize intermediate buffer size
+ * @param customDictionary initial LZ77 dictionary
+ */
+ public BrotliDecoderChannel(ReadableByteChannel source, int bufferSize) throws IOException {
+ super(source, bufferSize);
+ }
+
+ public BrotliDecoderChannel(ReadableByteChannel source) throws IOException {
+ this(source, DEFAULT_BUFFER_SIZE);
+ }
+
+ @Override
+ public boolean isOpen() {
+ synchronized (mutex) {
+ return !closed;
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ synchronized (mutex) {
+ super.close();
+ }
+ }
+
+ @Override
+ public int read(ByteBuffer dst) throws IOException {
+ synchronized (mutex) {
+ if (closed) {
+ throw new ClosedChannelException();
+ }
+ int result = 0;
+ while (dst.hasRemaining()) {
+ int outputSize = decode();
+ if (outputSize <= 0) {
+ return result == 0 ? outputSize : result;
+ }
+ result += consume(dst);
+ }
+ return result;
+ }
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliDecoderChannelTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliDecoderChannelTest.java
new file mode 100644
index 000000000..71d8f68ad
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliDecoderChannelTest.java
@@ -0,0 +1,84 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.dec;
+
+import static org.junit.Assert.assertEquals;
+
+import org.brotli.integration.BrotliJniTestBase;
+import org.brotli.integration.BundleHelper;
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.util.List;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
+
+/** Tests for {@link org.brotli.wrapper.dec.BrotliDecoderChannel}. */
+@RunWith(AllTests.class)
+public class BrotliDecoderChannelTest extends BrotliJniTestBase {
+
+ static InputStream getBundle() throws IOException {
+ return new FileInputStream(System.getProperty("TEST_BUNDLE"));
+ }
+
+ /** Creates a test suite. */
+ public static TestSuite suite() throws IOException {
+ TestSuite suite = new TestSuite();
+ InputStream bundle = getBundle();
+ try {
+ List<String> entries = BundleHelper.listEntries(bundle);
+ for (String entry : entries) {
+ suite.addTest(new ChannelTestCase(entry));
+ }
+ } finally {
+ bundle.close();
+ }
+ return suite;
+ }
+
+ /** Test case with a unique name. */
+ static class ChannelTestCase extends TestCase {
+ final String entryName;
+ ChannelTestCase(String entryName) {
+ super("BrotliDecoderChannelTest." + entryName);
+ this.entryName = entryName;
+ }
+
+ @Override
+ protected void runTest() throws Throwable {
+ BrotliDecoderChannelTest.run(entryName);
+ }
+ }
+
+ private static void run(String entryName) throws Throwable {
+ InputStream bundle = getBundle();
+ byte[] compressed;
+ try {
+ compressed = BundleHelper.readEntry(bundle, entryName);
+ } finally {
+ bundle.close();
+ }
+ if (compressed == null) {
+ throw new RuntimeException("Can't read bundle entry: " + entryName);
+ }
+
+ ReadableByteChannel src = Channels.newChannel(new ByteArrayInputStream(compressed));
+ ReadableByteChannel decoder = new BrotliDecoderChannel(src);
+ long crc;
+ try {
+ crc = BundleHelper.fingerprintStream(Channels.newInputStream(decoder));
+ } finally {
+ decoder.close();
+ }
+ assertEquals(BundleHelper.getExpectedFingerprint(entryName), crc);
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliInputStream.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliInputStream.java
new file mode 100644
index 000000000..6e2e6e5fa
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliInputStream.java
@@ -0,0 +1,115 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.dec;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.channels.Channels;
+
+/**
+ * InputStream that wraps native brotli decoder.
+ */
+public class BrotliInputStream extends InputStream {
+ /** The default internal buffer size used by the decoder. */
+ private static final int DEFAULT_BUFFER_SIZE = 16384;
+
+ private final Decoder decoder;
+
+ /**
+ * Creates a BrotliInputStream.
+ *
+ * @param source underlying source
+ * @param bufferSize intermediate buffer size
+ */
+ public BrotliInputStream(InputStream source, int bufferSize)
+ throws IOException {
+ this.decoder = new Decoder(Channels.newChannel(source), bufferSize);
+ }
+
+ public BrotliInputStream(InputStream source) throws IOException {
+ this(source, DEFAULT_BUFFER_SIZE);
+ }
+
+ public void enableEagerOutput() {
+ decoder.enableEagerOutput();
+ }
+
+ @Override
+ public void close() throws IOException {
+ decoder.close();
+ }
+
+ @Override
+ public int available() {
+ return (decoder.buffer != null) ? decoder.buffer.remaining() : 0;
+ }
+
+ @Override
+ public int read() throws IOException {
+ if (decoder.closed) {
+ throw new IOException("read after close");
+ }
+ int decoded;
+ // Iterate until at leat one byte is decoded, or EOF reached.
+ while (true) {
+ decoded = decoder.decode();
+ if (decoded != 0) {
+ break;
+ }
+ }
+
+ if (decoded == -1) {
+ return -1;
+ }
+ return decoder.buffer.get() & 0xFF;
+ }
+
+ @Override
+ public int read(byte[] b) throws IOException {
+ return read(b, 0, b.length);
+ }
+
+ @Override
+ public int read(byte[] b, int off, int len) throws IOException {
+ if (decoder.closed) {
+ throw new IOException("read after close");
+ }
+ if (decoder.decode() == -1) {
+ return -1;
+ }
+ int result = 0;
+ while (len > 0) {
+ int limit = Math.min(len, decoder.buffer.remaining());
+ decoder.buffer.get(b, off, limit);
+ off += limit;
+ len -= limit;
+ result += limit;
+ if (decoder.decode() == -1) {
+ break;
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public long skip(long n) throws IOException {
+ if (decoder.closed) {
+ throw new IOException("read after close");
+ }
+ long result = 0;
+ while (n > 0) {
+ if (decoder.decode() == -1) {
+ break;
+ }
+ int limit = (int) Math.min(n, (long) decoder.buffer.remaining());
+ decoder.discard(limit);
+ result += limit;
+ n -= limit;
+ }
+ return result;
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliInputStreamTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliInputStreamTest.java
new file mode 100644
index 000000000..5da7115b6
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/BrotliInputStreamTest.java
@@ -0,0 +1,82 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.dec;
+
+import static org.junit.Assert.assertEquals;
+
+import org.brotli.integration.BrotliJniTestBase;
+import org.brotli.integration.BundleHelper;
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
+
+/** Tests for {@link org.brotli.wrapper.dec.BrotliInputStream}. */
+@RunWith(AllTests.class)
+public class BrotliInputStreamTest extends BrotliJniTestBase {
+
+ static InputStream getBundle() throws IOException {
+ return new FileInputStream(System.getProperty("TEST_BUNDLE"));
+ }
+
+ /** Creates a test suite. */
+ public static TestSuite suite() throws IOException {
+ TestSuite suite = new TestSuite();
+ InputStream bundle = getBundle();
+ try {
+ List<String> entries = BundleHelper.listEntries(bundle);
+ for (String entry : entries) {
+ suite.addTest(new StreamTestCase(entry));
+ }
+ } finally {
+ bundle.close();
+ }
+ return suite;
+ }
+
+ /** Test case with a unique name. */
+ static class StreamTestCase extends TestCase {
+ final String entryName;
+ StreamTestCase(String entryName) {
+ super("BrotliInputStreamTest." + entryName);
+ this.entryName = entryName;
+ }
+
+ @Override
+ protected void runTest() throws Throwable {
+ BrotliInputStreamTest.run(entryName);
+ }
+ }
+
+ private static void run(String entryName) throws Throwable {
+ InputStream bundle = getBundle();
+ byte[] compressed;
+ try {
+ compressed = BundleHelper.readEntry(bundle, entryName);
+ } finally {
+ bundle.close();
+ }
+ if (compressed == null) {
+ throw new RuntimeException("Can't read bundle entry: " + entryName);
+ }
+
+ InputStream src = new ByteArrayInputStream(compressed);
+ InputStream decoder = new BrotliInputStream(src);
+ long crc;
+ try {
+ crc = BundleHelper.fingerprintStream(decoder);
+ } finally {
+ decoder.close();
+ }
+ assertEquals(BundleHelper.getExpectedFingerprint(entryName), crc);
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/Decoder.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/Decoder.java
new file mode 100644
index 000000000..26183aba6
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/Decoder.java
@@ -0,0 +1,177 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.dec;
+
+import java.io.IOException;
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
+import java.nio.channels.ReadableByteChannel;
+import java.util.ArrayList;
+
+/**
+ * Base class for InputStream / Channel implementations.
+ */
+public class Decoder {
+ private static final ByteBuffer EMPTY_BUFER = ByteBuffer.allocate(0);
+ private final ReadableByteChannel source;
+ private final DecoderJNI.Wrapper decoder;
+ ByteBuffer buffer;
+ boolean closed;
+ boolean eager;
+
+ /**
+ * Creates a Decoder wrapper.
+ *
+ * @param source underlying source
+ * @param inputBufferSize read buffer size
+ */
+ public Decoder(ReadableByteChannel source, int inputBufferSize)
+ throws IOException {
+ if (inputBufferSize <= 0) {
+ throw new IllegalArgumentException("buffer size must be positive");
+ }
+ if (source == null) {
+ throw new NullPointerException("source can not be null");
+ }
+ this.source = source;
+ this.decoder = new DecoderJNI.Wrapper(inputBufferSize);
+ }
+
+ private void fail(String message) throws IOException {
+ try {
+ close();
+ } catch (IOException ex) {
+ /* Ignore */
+ }
+ throw new IOException(message);
+ }
+
+ public void enableEagerOutput() {
+ this.eager = true;
+ }
+
+ /**
+ * Continue decoding.
+ *
+ * @return -1 if stream is finished, or number of bytes available in read buffer (> 0)
+ */
+ int decode() throws IOException {
+ while (true) {
+ if (buffer != null) {
+ if (!buffer.hasRemaining()) {
+ buffer = null;
+ } else {
+ return buffer.remaining();
+ }
+ }
+
+ switch (decoder.getStatus()) {
+ case DONE:
+ return -1;
+
+ case OK:
+ decoder.push(0);
+ break;
+
+ case NEEDS_MORE_INPUT:
+ // In "eager" more pulling preempts pushing.
+ if (eager && decoder.hasOutput()) {
+ buffer = decoder.pull();
+ break;
+ }
+ ByteBuffer inputBuffer = decoder.getInputBuffer();
+ ((Buffer) inputBuffer).clear();
+ int bytesRead = source.read(inputBuffer);
+ if (bytesRead == -1) {
+ fail("unexpected end of input");
+ }
+ if (bytesRead == 0) {
+ // No input data is currently available.
+ buffer = EMPTY_BUFER;
+ return 0;
+ }
+ decoder.push(bytesRead);
+ break;
+
+ case NEEDS_MORE_OUTPUT:
+ buffer = decoder.pull();
+ break;
+
+ default:
+ fail("corrupted input");
+ }
+ }
+ }
+
+ void discard(int length) {
+ ((Buffer) buffer).position(buffer.position() + length);
+ if (!buffer.hasRemaining()) {
+ buffer = null;
+ }
+ }
+
+ int consume(ByteBuffer dst) {
+ ByteBuffer slice = buffer.slice();
+ int limit = Math.min(slice.remaining(), dst.remaining());
+ ((Buffer) slice).limit(limit);
+ dst.put(slice);
+ discard(limit);
+ return limit;
+ }
+
+ void close() throws IOException {
+ if (closed) {
+ return;
+ }
+ closed = true;
+ decoder.destroy();
+ source.close();
+ }
+
+ /**
+ * Decodes the given data buffer.
+ */
+ public static byte[] decompress(byte[] data) throws IOException {
+ DecoderJNI.Wrapper decoder = new DecoderJNI.Wrapper(data.length);
+ ArrayList<byte[]> output = new ArrayList<byte[]>();
+ int totalOutputSize = 0;
+ try {
+ decoder.getInputBuffer().put(data);
+ decoder.push(data.length);
+ while (decoder.getStatus() != DecoderJNI.Status.DONE) {
+ switch (decoder.getStatus()) {
+ case OK:
+ decoder.push(0);
+ break;
+
+ case NEEDS_MORE_OUTPUT:
+ ByteBuffer buffer = decoder.pull();
+ byte[] chunk = new byte[buffer.remaining()];
+ buffer.get(chunk);
+ output.add(chunk);
+ totalOutputSize += chunk.length;
+ break;
+
+ default:
+ throw new IOException("corrupted input");
+ }
+ }
+ } finally {
+ decoder.destroy();
+ }
+ if (output.size() == 1) {
+ return output.get(0);
+ }
+ byte[] result = new byte[totalOutputSize];
+ int offset = 0;
+ for (byte[] chunk : output) {
+ System.arraycopy(chunk, 0, result, offset, chunk.length);
+ offset += chunk.length;
+ }
+ return result;
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/DecoderJNI.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/DecoderJNI.java
new file mode 100644
index 000000000..2319b1eae
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/DecoderJNI.java
@@ -0,0 +1,121 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.dec;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+/**
+ * JNI wrapper for brotli decoder.
+ */
+public class DecoderJNI {
+ private static native ByteBuffer nativeCreate(long[] context);
+ private static native void nativePush(long[] context, int length);
+ private static native ByteBuffer nativePull(long[] context);
+ private static native void nativeDestroy(long[] context);
+
+ public enum Status {
+ ERROR,
+ DONE,
+ NEEDS_MORE_INPUT,
+ NEEDS_MORE_OUTPUT,
+ OK
+ };
+
+ public static class Wrapper {
+ private final long[] context = new long[3];
+ private final ByteBuffer inputBuffer;
+ private Status lastStatus = Status.NEEDS_MORE_INPUT;
+ private boolean fresh = true;
+
+ public Wrapper(int inputBufferSize) throws IOException {
+ this.context[1] = inputBufferSize;
+ this.inputBuffer = nativeCreate(this.context);
+ if (this.context[0] == 0) {
+ throw new IOException("failed to initialize native brotli decoder");
+ }
+ }
+
+ public void push(int length) {
+ if (length < 0) {
+ throw new IllegalArgumentException("negative block length");
+ }
+ if (context[0] == 0) {
+ throw new IllegalStateException("brotli decoder is already destroyed");
+ }
+ if (lastStatus != Status.NEEDS_MORE_INPUT && lastStatus != Status.OK) {
+ throw new IllegalStateException("pushing input to decoder in " + lastStatus + " state");
+ }
+ if (lastStatus == Status.OK && length != 0) {
+ throw new IllegalStateException("pushing input to decoder in OK state");
+ }
+ fresh = false;
+ nativePush(context, length);
+ parseStatus();
+ }
+
+ private void parseStatus() {
+ long status = context[1];
+ if (status == 1) {
+ lastStatus = Status.DONE;
+ } else if (status == 2) {
+ lastStatus = Status.NEEDS_MORE_INPUT;
+ } else if (status == 3) {
+ lastStatus = Status.NEEDS_MORE_OUTPUT;
+ } else if (status == 4) {
+ lastStatus = Status.OK;
+ } else {
+ lastStatus = Status.ERROR;
+ }
+ }
+
+ public Status getStatus() {
+ return lastStatus;
+ }
+
+ public ByteBuffer getInputBuffer() {
+ return inputBuffer;
+ }
+
+ public boolean hasOutput() {
+ return context[2] != 0;
+ }
+
+ public ByteBuffer pull() {
+ if (context[0] == 0) {
+ throw new IllegalStateException("brotli decoder is already destroyed");
+ }
+ if (lastStatus != Status.NEEDS_MORE_OUTPUT && !hasOutput()) {
+ throw new IllegalStateException("pulling output from decoder in " + lastStatus + " state");
+ }
+ fresh = false;
+ ByteBuffer result = nativePull(context);
+ parseStatus();
+ return result;
+ }
+
+ /**
+ * Releases native resources.
+ */
+ public void destroy() {
+ if (context[0] == 0) {
+ throw new IllegalStateException("brotli decoder is already destroyed");
+ }
+ nativeDestroy(context);
+ context[0] = 0;
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ if (context[0] != 0) {
+ /* TODO: log resource leak? */
+ destroy();
+ }
+ super.finalize();
+ }
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/DecoderTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/DecoderTest.java
new file mode 100644
index 000000000..74b77d30a
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/DecoderTest.java
@@ -0,0 +1,77 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.dec;
+
+import static org.junit.Assert.assertEquals;
+
+import org.brotli.integration.BrotliJniTestBase;
+import org.brotli.integration.BundleHelper;
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
+
+/** Tests for {@link org.brotli.wrapper.dec.Decoder}. */
+@RunWith(AllTests.class)
+public class DecoderTest extends BrotliJniTestBase {
+
+ static InputStream getBundle() throws IOException {
+ return new FileInputStream(System.getProperty("TEST_BUNDLE"));
+ }
+
+ /** Creates a test suite. */
+ public static TestSuite suite() throws IOException {
+ TestSuite suite = new TestSuite();
+ InputStream bundle = getBundle();
+ try {
+ List<String> entries = BundleHelper.listEntries(bundle);
+ for (String entry : entries) {
+ suite.addTest(new DecoderTestCase(entry));
+ }
+ } finally {
+ bundle.close();
+ }
+ return suite;
+ }
+
+ /** Test case with a unique name. */
+ static class DecoderTestCase extends TestCase {
+ final String entryName;
+ DecoderTestCase(String entryName) {
+ super("DecoderTest." + entryName);
+ this.entryName = entryName;
+ }
+
+ @Override
+ protected void runTest() throws Throwable {
+ DecoderTest.run(entryName);
+ }
+ }
+
+ private static void run(String entryName) throws Throwable {
+ InputStream bundle = getBundle();
+ byte[] compressed;
+ try {
+ compressed = BundleHelper.readEntry(bundle, entryName);
+ } finally {
+ bundle.close();
+ }
+ if (compressed == null) {
+ throw new RuntimeException("Can't read bundle entry: " + entryName);
+ }
+
+ byte[] decompressed = Decoder.decompress(compressed);
+
+ long crc = BundleHelper.fingerprintStream(new ByteArrayInputStream(decompressed));
+ assertEquals(BundleHelper.getExpectedFingerprint(entryName), crc);
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/EagerStreamTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/EagerStreamTest.java
new file mode 100755
index 000000000..919f6e3b4
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/EagerStreamTest.java
@@ -0,0 +1,75 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.dec;
+
+import static org.junit.Assert.assertEquals;
+
+import org.brotli.integration.BrotliJniTestBase;
+import java.io.IOException;
+import java.io.InputStream;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests for {@link org.brotli.wrapper.dec.BrotliInputStream}. */
+@RunWith(JUnit4.class)
+public class EagerStreamTest extends BrotliJniTestBase {
+
+ @Test
+ public void testEagerReading() throws IOException {
+ final StringBuilder log = new StringBuilder();
+ final byte[] data = {0, 0, 16, 42, 3};
+ InputStream source = new InputStream() {
+ int index;
+
+ @Override
+ public int read() {
+ if (index < data.length) {
+ log.append("<").append(index);
+ return data[index++];
+ } else {
+ log.append("<#");
+ return -1;
+ }
+ }
+
+ @Override
+ public int read(byte[] b) throws IOException {
+ return read(b, 0, b.length);
+ }
+
+ @Override
+ public int read(byte[] b, int off, int len) throws IOException {
+ if (len < 1) {
+ return 0;
+ }
+ int d = read();
+ if (d == -1) {
+ return 0;
+ }
+ b[off] = (byte) d;
+ return 1;
+ }
+ };
+ BrotliInputStream reader = new BrotliInputStream(source);
+ reader.enableEagerOutput();
+ int count = 0;
+ while (true) {
+ log.append("^").append(count);
+ int b = reader.read();
+ if (b == -1) {
+ log.append(">#");
+ break;
+ } else {
+ log.append(">").append(count++);
+ }
+ }
+ // Lazy log: ^0<0<1<2<3<4>0^1>#
+ assertEquals("^0<0<1<2<3>0^1<4>#", log.toString());
+ }
+
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/decoder_jni.cc b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/decoder_jni.cc
new file mode 100644
index 000000000..268a10b60
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/dec/decoder_jni.cc
@@ -0,0 +1,202 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+#include <jni.h>
+
+#include <new>
+
+#include <brotli/decode.h>
+
+namespace {
+/* A structure used to persist the decoder's state in between calls. */
+typedef struct DecoderHandle {
+ BrotliDecoderState* state;
+
+ uint8_t* input_start;
+ size_t input_offset;
+ size_t input_length;
+} DecoderHandle;
+
+/* Obtain handle from opaque pointer. */
+DecoderHandle* getHandle(void* opaque) {
+ return static_cast<DecoderHandle*>(opaque);
+}
+
+} /* namespace */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Creates a new Decoder.
+ *
+ * Cookie to address created decoder is stored in out_cookie. In case of failure
+ * cookie is 0.
+ *
+ * @param ctx {out_cookie, in_directBufferSize} tuple
+ * @returns direct ByteBuffer if directBufferSize is not 0; otherwise null
+ */
+JNIEXPORT jobject JNICALL
+Java_org_brotli_wrapper_dec_DecoderJNI_nativeCreate(
+ JNIEnv* env, jobject /*jobj*/, jlongArray ctx) {
+ bool ok = true;
+ DecoderHandle* handle = nullptr;
+ jlong context[3];
+ env->GetLongArrayRegion(ctx, 0, 3, context);
+ size_t input_size = context[1];
+ context[0] = 0;
+ context[2] = 0;
+ handle = new (std::nothrow) DecoderHandle();
+ ok = !!handle;
+
+ if (ok) {
+ handle->input_offset = 0;
+ handle->input_length = 0;
+ handle->input_start = nullptr;
+
+ if (input_size == 0) {
+ ok = false;
+ } else {
+ handle->input_start = new (std::nothrow) uint8_t[input_size];
+ ok = !!handle->input_start;
+ }
+ }
+
+ if (ok) {
+ handle->state = BrotliDecoderCreateInstance(nullptr, nullptr, nullptr);
+ ok = !!handle->state;
+ }
+
+ if (ok) {
+ /* TODO: future versions (e.g. when 128-bit architecture comes)
+ might require thread-safe cookie<->handle mapping. */
+ context[0] = reinterpret_cast<jlong>(handle);
+ } else if (!!handle) {
+ if (!!handle->input_start) delete[] handle->input_start;
+ delete handle;
+ }
+
+ env->SetLongArrayRegion(ctx, 0, 3, context);
+
+ if (!ok) {
+ return nullptr;
+ }
+
+ return env->NewDirectByteBuffer(handle->input_start, input_size);
+}
+
+/**
+ * Push data to decoder.
+ *
+ * status codes:
+ * - 0 error happened
+ * - 1 stream is finished, no more input / output expected
+ * - 2 needs more input to process further
+ * - 3 needs more output to process further
+ * - 4 ok, can proceed further without additional input
+ *
+ * @param ctx {in_cookie, out_status} tuple
+ * @param input_length number of bytes provided in input or direct input;
+ * 0 to process further previous input
+ */
+JNIEXPORT void JNICALL
+Java_org_brotli_wrapper_dec_DecoderJNI_nativePush(
+ JNIEnv* env, jobject /*jobj*/, jlongArray ctx, jint input_length) {
+ jlong context[3];
+ env->GetLongArrayRegion(ctx, 0, 3, context);
+ DecoderHandle* handle = getHandle(reinterpret_cast<void*>(context[0]));
+ context[1] = 0; /* ERROR */
+ context[2] = 0;
+ env->SetLongArrayRegion(ctx, 0, 3, context);
+
+ if (input_length != 0) {
+ /* Still have unconsumed data. Workflow is broken. */
+ if (handle->input_offset < handle->input_length) {
+ return;
+ }
+ handle->input_offset = 0;
+ handle->input_length = input_length;
+ }
+
+ /* Actual decompression. */
+ const uint8_t* in = handle->input_start + handle->input_offset;
+ size_t in_size = handle->input_length - handle->input_offset;
+ size_t out_size = 0;
+ BrotliDecoderResult status = BrotliDecoderDecompressStream(
+ handle->state, &in_size, &in, &out_size, nullptr, nullptr);
+ handle->input_offset = handle->input_length - in_size;
+ switch (status) {
+ case BROTLI_DECODER_RESULT_SUCCESS:
+ /* Bytes after stream end are not allowed. */
+ context[1] = (handle->input_offset == handle->input_length) ? 1 : 0;
+ break;
+
+ case BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:
+ context[1] = 2;
+ break;
+
+ case BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:
+ context[1] = 3;
+ break;
+
+ default:
+ context[1] = 0;
+ break;
+ }
+ context[2] = BrotliDecoderHasMoreOutput(handle->state) ? 1 : 0;
+ env->SetLongArrayRegion(ctx, 0, 3, context);
+}
+
+/**
+ * Pull decompressed data from decoder.
+ *
+ * @param ctx {in_cookie, out_status} tuple
+ * @returns direct ByteBuffer; all the produced data MUST be consumed before
+ * any further invocation; null in case of error
+ */
+JNIEXPORT jobject JNICALL
+Java_org_brotli_wrapper_dec_DecoderJNI_nativePull(
+ JNIEnv* env, jobject /*jobj*/, jlongArray ctx) {
+ jlong context[3];
+ env->GetLongArrayRegion(ctx, 0, 3, context);
+ DecoderHandle* handle = getHandle(reinterpret_cast<void*>(context[0]));
+ size_t data_length = 0;
+ const uint8_t* data = BrotliDecoderTakeOutput(handle->state, &data_length);
+ bool hasMoreOutput = !!BrotliDecoderHasMoreOutput(handle->state);
+ if (hasMoreOutput) {
+ context[1] = 3;
+ } else if (BrotliDecoderIsFinished(handle->state)) {
+ /* Bytes after stream end are not allowed. */
+ context[1] = (handle->input_offset == handle->input_length) ? 1 : 0;
+ } else {
+ /* Can proceed, or more data is required? */
+ context[1] = (handle->input_offset == handle->input_length) ? 2 : 4;
+ }
+ context[2] = hasMoreOutput ? 1 : 0;
+ env->SetLongArrayRegion(ctx, 0, 3, context);
+ return env->NewDirectByteBuffer(const_cast<uint8_t*>(data), data_length);
+}
+
+/**
+ * Releases all used resources.
+ *
+ * @param ctx {in_cookie} tuple
+ */
+JNIEXPORT void JNICALL
+Java_org_brotli_wrapper_dec_DecoderJNI_nativeDestroy(
+ JNIEnv* env, jobject /*jobj*/, jlongArray ctx) {
+ jlong context[3];
+ env->GetLongArrayRegion(ctx, 0, 3, context);
+ DecoderHandle* handle = getHandle(reinterpret_cast<void*>(context[0]));
+ BrotliDecoderDestroyInstance(handle->state);
+ delete[] handle->input_start;
+ delete handle;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BUILD b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BUILD
new file mode 100644
index 000000000..9aea6ba0a
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BUILD
@@ -0,0 +1,88 @@
+package(default_visibility = ["//visibility:public"])
+
+licenses(["notice"]) # MIT
+
+filegroup(
+ name = "jni_src",
+ srcs = ["encoder_jni.cc"],
+)
+
+filegroup(
+ name = "brotli_jni",
+ srcs = ["//:brotli_jni.dll"],
+)
+
+java_library(
+ name = "enc",
+ srcs = glob(
+ ["*.java"],
+ exclude = ["*Test*.java"],
+ ),
+ resource_jars = ["//:license"],
+)
+
+java_library(
+ name = "test_lib",
+ testonly = 1,
+ srcs = glob(["*Test*.java"]),
+ deps = [
+ ":enc",
+ "//org/brotli/integration:brotli_jni_test_base",
+ "//org/brotli/integration:bundle_helper",
+ "//org/brotli/wrapper/dec",
+ "@junit_junit//jar",
+ ],
+)
+
+filegroup(
+ name = "test_bundle",
+ srcs = ["//org/brotli/integration:test_corpus"],
+)
+
+java_test(
+ name = "BrotliEncoderChannelTest",
+ size = "large",
+ data = [
+ ":brotli_jni", # Bazel JNI workaround
+ ":test_bundle",
+ ],
+ jvm_flags = [
+ "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni)",
+ "-DTEST_BUNDLE=$(location :test_bundle)",
+ ],
+ shard_count = 15,
+ test_class = "org.brotli.wrapper.enc.BrotliEncoderChannelTest",
+ runtime_deps = [":test_lib"],
+)
+
+java_test(
+ name = "BrotliOutputStreamTest",
+ size = "large",
+ data = [
+ ":brotli_jni", # Bazel JNI workaround
+ ":test_bundle",
+ ],
+ jvm_flags = [
+ "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni)",
+ "-DTEST_BUNDLE=$(location :test_bundle)",
+ ],
+ shard_count = 15,
+ test_class = "org.brotli.wrapper.enc.BrotliOutputStreamTest",
+ runtime_deps = [":test_lib"],
+)
+
+java_test(
+ name = "EncoderTest",
+ size = "large",
+ data = [
+ ":brotli_jni", # Bazel JNI workaround
+ ":test_bundle",
+ ],
+ jvm_flags = [
+ "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni)",
+ "-DTEST_BUNDLE=$(location :test_bundle)",
+ ],
+ shard_count = 15,
+ test_class = "org.brotli.wrapper.enc.EncoderTest",
+ runtime_deps = [":test_lib"],
+)
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliEncoderChannel.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliEncoderChannel.java
new file mode 100644
index 000000000..047c3562e
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliEncoderChannel.java
@@ -0,0 +1,77 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.enc;
+
+import java.io.IOException;
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.WritableByteChannel;
+
+/**
+ * WritableByteChannel that wraps native brotli encoder.
+ */
+public class BrotliEncoderChannel extends Encoder implements WritableByteChannel {
+ /** The default internal buffer size used by the decoder. */
+ private static final int DEFAULT_BUFFER_SIZE = 16384;
+
+ private final Object mutex = new Object();
+
+ /**
+ * Creates a BrotliEncoderChannel.
+ *
+ * @param destination underlying destination
+ * @param params encoding settings
+ * @param bufferSize intermediate buffer size
+ */
+ public BrotliEncoderChannel(WritableByteChannel destination, Encoder.Parameters params,
+ int bufferSize) throws IOException {
+ super(destination, params, bufferSize);
+ }
+
+ public BrotliEncoderChannel(WritableByteChannel destination, Encoder.Parameters params)
+ throws IOException {
+ this(destination, params, DEFAULT_BUFFER_SIZE);
+ }
+
+ public BrotliEncoderChannel(WritableByteChannel destination) throws IOException {
+ this(destination, new Encoder.Parameters());
+ }
+
+ @Override
+ public boolean isOpen() {
+ synchronized (mutex) {
+ return !closed;
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ synchronized (mutex) {
+ super.close();
+ }
+ }
+
+ @Override
+ public int write(ByteBuffer src) throws IOException {
+ synchronized (mutex) {
+ if (closed) {
+ throw new ClosedChannelException();
+ }
+ int result = 0;
+ while (src.hasRemaining() && encode(EncoderJNI.Operation.PROCESS)) {
+ int limit = Math.min(src.remaining(), inputBuffer.remaining());
+ ByteBuffer slice = src.slice();
+ ((Buffer) slice).limit(limit);
+ inputBuffer.put(slice);
+ result += limit;
+ ((Buffer) src).position(src.position() + limit);
+ }
+ return result;
+ }
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliEncoderChannelTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliEncoderChannelTest.java
new file mode 100644
index 000000000..aacc6daea
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliEncoderChannelTest.java
@@ -0,0 +1,118 @@
+package org.brotli.wrapper.enc;
+
+import static org.junit.Assert.assertEquals;
+
+import org.brotli.integration.BrotliJniTestBase;
+import org.brotli.integration.BundleHelper;
+import org.brotli.wrapper.dec.BrotliInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.WritableByteChannel;
+import java.util.List;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
+
+/** Tests for {@link org.brotli.wrapper.enc.BrotliEncoderChannel}. */
+@RunWith(AllTests.class)
+public class BrotliEncoderChannelTest extends BrotliJniTestBase {
+
+ private enum TestMode {
+ WRITE_ALL,
+ WRITE_CHUNKS
+ }
+
+ private static final int CHUNK_SIZE = 256;
+
+ static InputStream getBundle() throws IOException {
+ return new FileInputStream(System.getProperty("TEST_BUNDLE"));
+ }
+
+ /** Creates a test suite. */
+ public static TestSuite suite() throws IOException {
+ TestSuite suite = new TestSuite();
+ InputStream bundle = getBundle();
+ try {
+ List<String> entries = BundleHelper.listEntries(bundle);
+ for (String entry : entries) {
+ suite.addTest(new ChannleTestCase(entry, TestMode.WRITE_ALL));
+ suite.addTest(new ChannleTestCase(entry, TestMode.WRITE_CHUNKS));
+ }
+ } finally {
+ bundle.close();
+ }
+ return suite;
+ }
+
+ /** Test case with a unique name. */
+ static class ChannleTestCase extends TestCase {
+ final String entryName;
+ final TestMode mode;
+ ChannleTestCase(String entryName, TestMode mode) {
+ super("BrotliEncoderChannelTest." + entryName + "." + mode.name());
+ this.entryName = entryName;
+ this.mode = mode;
+ }
+
+ @Override
+ protected void runTest() throws Throwable {
+ BrotliEncoderChannelTest.run(entryName, mode);
+ }
+ }
+
+ private static void run(String entryName, TestMode mode) throws Throwable {
+ InputStream bundle = getBundle();
+ byte[] original;
+ try {
+ original = BundleHelper.readEntry(bundle, entryName);
+ } finally {
+ bundle.close();
+ }
+ if (original == null) {
+ throw new RuntimeException("Can't read bundle entry: " + entryName);
+ }
+
+ if ((mode == TestMode.WRITE_CHUNKS) && (original.length <= CHUNK_SIZE)) {
+ return;
+ }
+
+ ByteArrayOutputStream dst = new ByteArrayOutputStream();
+ WritableByteChannel encoder = new BrotliEncoderChannel(Channels.newChannel(dst));
+ ByteBuffer src = ByteBuffer.wrap(original);
+ try {
+ switch (mode) {
+ case WRITE_ALL:
+ encoder.write(src);
+ break;
+
+ case WRITE_CHUNKS:
+ while (src.hasRemaining()) {
+ int limit = Math.min(CHUNK_SIZE, src.remaining());
+ ByteBuffer slice = src.slice();
+ ((Buffer) slice).limit(limit);
+ ((Buffer) src).position(src.position() + limit);
+ encoder.write(slice);
+ }
+ break;
+ }
+ } finally {
+ encoder.close();
+ }
+
+ InputStream decoder = new BrotliInputStream(new ByteArrayInputStream(dst.toByteArray()));
+ try {
+ long originalCrc = BundleHelper.fingerprintStream(new ByteArrayInputStream(original));
+ long crc = BundleHelper.fingerprintStream(decoder);
+ assertEquals(originalCrc, crc);
+ } finally {
+ decoder.close();
+ }
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliOutputStream.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliOutputStream.java
new file mode 100644
index 000000000..5bd395777
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliOutputStream.java
@@ -0,0 +1,87 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.enc;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.channels.Channels;
+
+/**
+ * Output stream that wraps native brotli encoder.
+ */
+public class BrotliOutputStream extends OutputStream {
+ /** The default internal buffer size used by the encoder. */
+ private static final int DEFAULT_BUFFER_SIZE = 16384;
+
+ private final Encoder encoder;
+
+ /**
+ * Creates a BrotliOutputStream.
+ *
+ * @param destination underlying destination
+ * @param params encoding settings
+ * @param bufferSize intermediate buffer size
+ */
+ public BrotliOutputStream(OutputStream destination, Encoder.Parameters params, int bufferSize)
+ throws IOException {
+ this.encoder = new Encoder(Channels.newChannel(destination), params, bufferSize);
+ }
+
+ public BrotliOutputStream(OutputStream destination, Encoder.Parameters params)
+ throws IOException {
+ this(destination, params, DEFAULT_BUFFER_SIZE);
+ }
+
+ public BrotliOutputStream(OutputStream destination) throws IOException {
+ this(destination, new Encoder.Parameters());
+ }
+
+ @Override
+ public void close() throws IOException {
+ encoder.close();
+ }
+
+ @Override
+ public void flush() throws IOException {
+ if (encoder.closed) {
+ throw new IOException("write after close");
+ }
+ encoder.flush();
+ }
+
+ @Override
+ public void write(int b) throws IOException {
+ if (encoder.closed) {
+ throw new IOException("write after close");
+ }
+ while (!encoder.encode(EncoderJNI.Operation.PROCESS)) {
+ // Busy-wait loop.
+ }
+ encoder.inputBuffer.put((byte) b);
+ }
+
+ @Override
+ public void write(byte[] b) throws IOException {
+ this.write(b, 0, b.length);
+ }
+
+ @Override
+ public void write(byte[] b, int off, int len) throws IOException {
+ if (encoder.closed) {
+ throw new IOException("write after close");
+ }
+ while (len > 0) {
+ if (!encoder.encode(EncoderJNI.Operation.PROCESS)) {
+ continue;
+ }
+ int limit = Math.min(len, encoder.inputBuffer.remaining());
+ encoder.inputBuffer.put(b, off, limit);
+ off += limit;
+ len -= limit;
+ }
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliOutputStreamTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliOutputStreamTest.java
new file mode 100644
index 000000000..699b4b203
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/BrotliOutputStreamTest.java
@@ -0,0 +1,118 @@
+package org.brotli.wrapper.enc;
+
+import static org.junit.Assert.assertEquals;
+
+import org.brotli.integration.BrotliJniTestBase;
+import org.brotli.integration.BundleHelper;
+import org.brotli.wrapper.dec.BrotliInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
+
+/** Tests for {@link org.brotli.wrapper.enc.BrotliOutputStream}. */
+@RunWith(AllTests.class)
+public class BrotliOutputStreamTest extends BrotliJniTestBase {
+
+ private enum TestMode {
+ WRITE_ALL,
+ WRITE_CHUNKS,
+ WRITE_BYTE
+ }
+
+ private static final int CHUNK_SIZE = 256;
+
+ static InputStream getBundle() throws IOException {
+ return new FileInputStream(System.getProperty("TEST_BUNDLE"));
+ }
+
+ /** Creates a test suite. */
+ public static TestSuite suite() throws IOException {
+ TestSuite suite = new TestSuite();
+ InputStream bundle = getBundle();
+ try {
+ List<String> entries = BundleHelper.listEntries(bundle);
+ for (String entry : entries) {
+ suite.addTest(new StreamTestCase(entry, TestMode.WRITE_ALL));
+ suite.addTest(new StreamTestCase(entry, TestMode.WRITE_CHUNKS));
+ suite.addTest(new StreamTestCase(entry, TestMode.WRITE_BYTE));
+ }
+ } finally {
+ bundle.close();
+ }
+ return suite;
+ }
+
+ /** Test case with a unique name. */
+ static class StreamTestCase extends TestCase {
+ final String entryName;
+ final TestMode mode;
+ StreamTestCase(String entryName, TestMode mode) {
+ super("BrotliOutputStreamTest." + entryName + "." + mode.name());
+ this.entryName = entryName;
+ this.mode = mode;
+ }
+
+ @Override
+ protected void runTest() throws Throwable {
+ BrotliOutputStreamTest.run(entryName, mode);
+ }
+ }
+
+ private static void run(String entryName, TestMode mode) throws Throwable {
+ InputStream bundle = getBundle();
+ byte[] original;
+ try {
+ original = BundleHelper.readEntry(bundle, entryName);
+ } finally {
+ bundle.close();
+ }
+ if (original == null) {
+ throw new RuntimeException("Can't read bundle entry: " + entryName);
+ }
+
+ if ((mode == TestMode.WRITE_CHUNKS) && (original.length <= CHUNK_SIZE)) {
+ return;
+ }
+
+ ByteArrayOutputStream dst = new ByteArrayOutputStream();
+ OutputStream encoder = new BrotliOutputStream(dst);
+ try {
+ switch (mode) {
+ case WRITE_ALL:
+ encoder.write(original);
+ break;
+
+ case WRITE_CHUNKS:
+ for (int offset = 0; offset < original.length; offset += CHUNK_SIZE) {
+ encoder.write(original, offset, Math.min(CHUNK_SIZE, original.length - offset));
+ }
+ break;
+
+ case WRITE_BYTE:
+ for (byte singleByte : original) {
+ encoder.write(singleByte);
+ }
+ break;
+ }
+ } finally {
+ encoder.close();
+ }
+
+ InputStream decoder = new BrotliInputStream(new ByteArrayInputStream(dst.toByteArray()));
+ try {
+ long originalCrc = BundleHelper.fingerprintStream(new ByteArrayInputStream(original));
+ long crc = BundleHelper.fingerprintStream(decoder);
+ assertEquals(originalCrc, crc);
+ } finally {
+ decoder.close();
+ }
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/EmptyInputTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/EmptyInputTest.java
new file mode 100755
index 000000000..a536381af
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/EmptyInputTest.java
@@ -0,0 +1,29 @@
+/* Copyright 2018 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.enc;
+
+import static org.junit.Assert.assertEquals;
+
+import org.brotli.integration.BrotliJniTestBase;
+import org.brotli.wrapper.dec.Decoder;
+import java.io.IOException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests for {@link org.brotli.wrapper.enc.Encoder}. */
+@RunWith(JUnit4.class)
+public class EmptyInputTest extends BrotliJniTestBase {
+ @Test
+ public void testEmptyInput() throws IOException {
+ byte[] data = new byte[0];
+ byte[] encoded = Encoder.compress(data);
+ assertEquals(1, encoded.length);
+ byte[] decoded = Decoder.decompress(encoded);
+ assertEquals(0, decoded.length);
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/Encoder.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/Encoder.java
new file mode 100644
index 000000000..1fde8d64f
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/Encoder.java
@@ -0,0 +1,205 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.enc;
+
+import java.io.IOException;
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
+import java.nio.channels.WritableByteChannel;
+import java.util.ArrayList;
+
+/**
+ * Base class for OutputStream / Channel implementations.
+ */
+public class Encoder {
+ private final WritableByteChannel destination;
+ private final EncoderJNI.Wrapper encoder;
+ private ByteBuffer buffer;
+ final ByteBuffer inputBuffer;
+ boolean closed;
+
+ /**
+ * Brotli encoder settings.
+ */
+ public static final class Parameters {
+ private int quality = -1;
+ private int lgwin = -1;
+
+ public Parameters() { }
+
+ private Parameters(Parameters other) {
+ this.quality = other.quality;
+ this.lgwin = other.lgwin;
+ }
+
+ /**
+ * @param quality compression quality, or -1 for default
+ */
+ public Parameters setQuality(int quality) {
+ if (quality < -1 || quality > 11) {
+ throw new IllegalArgumentException("quality should be in range [0, 11], or -1");
+ }
+ this.quality = quality;
+ return this;
+ }
+
+ /**
+ * @param lgwin log2(LZ window size), or -1 for default
+ */
+ public Parameters setWindow(int lgwin) {
+ if ((lgwin != -1) && ((lgwin < 10) || (lgwin > 24))) {
+ throw new IllegalArgumentException("lgwin should be in range [10, 24], or -1");
+ }
+ this.lgwin = lgwin;
+ return this;
+ }
+ }
+
+ /**
+ * Creates a Encoder wrapper.
+ *
+ * @param destination underlying destination
+ * @param params encoding parameters
+ * @param inputBufferSize read buffer size
+ */
+ Encoder(WritableByteChannel destination, Parameters params, int inputBufferSize)
+ throws IOException {
+ if (inputBufferSize <= 0) {
+ throw new IllegalArgumentException("buffer size must be positive");
+ }
+ if (destination == null) {
+ throw new NullPointerException("destination can not be null");
+ }
+ this.destination = destination;
+ this.encoder = new EncoderJNI.Wrapper(inputBufferSize, params.quality, params.lgwin);
+ this.inputBuffer = this.encoder.getInputBuffer();
+ }
+
+ private void fail(String message) throws IOException {
+ try {
+ close();
+ } catch (IOException ex) {
+ /* Ignore */
+ }
+ throw new IOException(message);
+ }
+
+ /**
+ * @param force repeat pushing until all output is consumed
+ * @return true if all encoder output is consumed
+ */
+ boolean pushOutput(boolean force) throws IOException {
+ while (buffer != null) {
+ if (buffer.hasRemaining()) {
+ destination.write(buffer);
+ }
+ if (!buffer.hasRemaining()) {
+ buffer = null;
+ } else if (!force) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * @return true if there is space in inputBuffer.
+ */
+ boolean encode(EncoderJNI.Operation op) throws IOException {
+ boolean force = (op != EncoderJNI.Operation.PROCESS);
+ if (force) {
+ ((Buffer) inputBuffer).limit(inputBuffer.position());
+ } else if (inputBuffer.hasRemaining()) {
+ return true;
+ }
+ boolean hasInput = true;
+ while (true) {
+ if (!encoder.isSuccess()) {
+ fail("encoding failed");
+ } else if (!pushOutput(force)) {
+ return false;
+ } else if (encoder.hasMoreOutput()) {
+ buffer = encoder.pull();
+ } else if (encoder.hasRemainingInput()) {
+ encoder.push(op, 0);
+ } else if (hasInput) {
+ encoder.push(op, inputBuffer.limit());
+ hasInput = false;
+ } else {
+ ((Buffer) inputBuffer).clear();
+ return true;
+ }
+ }
+ }
+
+ void flush() throws IOException {
+ encode(EncoderJNI.Operation.FLUSH);
+ }
+
+ void close() throws IOException {
+ if (closed) {
+ return;
+ }
+ closed = true;
+ try {
+ encode(EncoderJNI.Operation.FINISH);
+ } finally {
+ encoder.destroy();
+ destination.close();
+ }
+ }
+
+ /**
+ * Encodes the given data buffer.
+ */
+ public static byte[] compress(byte[] data, Parameters params) throws IOException {
+ if (data.length == 0) {
+ byte[] empty = new byte[1];
+ empty[0] = 6;
+ return empty;
+ }
+ /* data.length > 0 */
+ EncoderJNI.Wrapper encoder = new EncoderJNI.Wrapper(data.length, params.quality, params.lgwin);
+ ArrayList<byte[]> output = new ArrayList<byte[]>();
+ int totalOutputSize = 0;
+ try {
+ encoder.getInputBuffer().put(data);
+ encoder.push(EncoderJNI.Operation.FINISH, data.length);
+ while (true) {
+ if (!encoder.isSuccess()) {
+ throw new IOException("encoding failed");
+ } else if (encoder.hasMoreOutput()) {
+ ByteBuffer buffer = encoder.pull();
+ byte[] chunk = new byte[buffer.remaining()];
+ buffer.get(chunk);
+ output.add(chunk);
+ totalOutputSize += chunk.length;
+ } else if (!encoder.isFinished()) {
+ encoder.push(EncoderJNI.Operation.FINISH, 0);
+ } else {
+ break;
+ }
+ }
+ } finally {
+ encoder.destroy();
+ }
+ if (output.size() == 1) {
+ return output.get(0);
+ }
+ byte[] result = new byte[totalOutputSize];
+ int offset = 0;
+ for (byte[] chunk : output) {
+ System.arraycopy(chunk, 0, result, offset, chunk.length);
+ offset += chunk.length;
+ }
+ return result;
+ }
+
+ public static byte[] compress(byte[] data) throws IOException {
+ return compress(data, new Parameters());
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/EncoderJNI.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/EncoderJNI.java
new file mode 100644
index 000000000..501362957
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/EncoderJNI.java
@@ -0,0 +1,118 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+package org.brotli.wrapper.enc;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+/**
+ * JNI wrapper for brotli encoder.
+ */
+class EncoderJNI {
+ private static native ByteBuffer nativeCreate(long[] context);
+ private static native void nativePush(long[] context, int length);
+ private static native ByteBuffer nativePull(long[] context);
+ private static native void nativeDestroy(long[] context);
+
+ enum Operation {
+ PROCESS,
+ FLUSH,
+ FINISH
+ }
+
+ static class Wrapper {
+ protected final long[] context = new long[5];
+ private final ByteBuffer inputBuffer;
+ private boolean fresh = true;
+
+ Wrapper(int inputBufferSize, int quality, int lgwin)
+ throws IOException {
+ if (inputBufferSize <= 0) {
+ throw new IOException("buffer size must be positive");
+ }
+ this.context[1] = inputBufferSize;
+ this.context[2] = quality;
+ this.context[3] = lgwin;
+ this.inputBuffer = nativeCreate(this.context);
+ if (this.context[0] == 0) {
+ throw new IOException("failed to initialize native brotli encoder");
+ }
+ this.context[1] = 1;
+ this.context[2] = 0;
+ this.context[3] = 0;
+ }
+
+ void push(Operation op, int length) {
+ if (length < 0) {
+ throw new IllegalArgumentException("negative block length");
+ }
+ if (context[0] == 0) {
+ throw new IllegalStateException("brotli encoder is already destroyed");
+ }
+ if (!isSuccess() || hasMoreOutput()) {
+ throw new IllegalStateException("pushing input to encoder in unexpected state");
+ }
+ if (hasRemainingInput() && length != 0) {
+ throw new IllegalStateException("pushing input to encoder over previous input");
+ }
+ context[1] = op.ordinal();
+ fresh = false;
+ nativePush(context, length);
+ }
+
+ boolean isSuccess() {
+ return context[1] != 0;
+ }
+
+ boolean hasMoreOutput() {
+ return context[2] != 0;
+ }
+
+ boolean hasRemainingInput() {
+ return context[3] != 0;
+ }
+
+ boolean isFinished() {
+ return context[4] != 0;
+ }
+
+ ByteBuffer getInputBuffer() {
+ return inputBuffer;
+ }
+
+ ByteBuffer pull() {
+ if (context[0] == 0) {
+ throw new IllegalStateException("brotli encoder is already destroyed");
+ }
+ if (!isSuccess() || !hasMoreOutput()) {
+ throw new IllegalStateException("pulling while data is not ready");
+ }
+ fresh = false;
+ return nativePull(context);
+ }
+
+ /**
+ * Releases native resources.
+ */
+ void destroy() {
+ if (context[0] == 0) {
+ throw new IllegalStateException("brotli encoder is already destroyed");
+ }
+ nativeDestroy(context);
+ context[0] = 0;
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ if (context[0] != 0) {
+ /* TODO: log resource leak? */
+ destroy();
+ }
+ super.finalize();
+ }
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/EncoderTest.java b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/EncoderTest.java
new file mode 100644
index 000000000..18ed6470a
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/EncoderTest.java
@@ -0,0 +1,80 @@
+package org.brotli.wrapper.enc;
+
+import static org.junit.Assert.assertEquals;
+
+import org.brotli.integration.BrotliJniTestBase;
+import org.brotli.integration.BundleHelper;
+import org.brotli.wrapper.dec.BrotliInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
+
+/** Tests for {@link org.brotli.wrapper.enc.Encoder}. */
+@RunWith(AllTests.class)
+public class EncoderTest extends BrotliJniTestBase {
+ static InputStream getBundle() throws IOException {
+ return new FileInputStream(System.getProperty("TEST_BUNDLE"));
+ }
+
+ /** Creates a test suite. */
+ public static TestSuite suite() throws IOException {
+ TestSuite suite = new TestSuite();
+ InputStream bundle = getBundle();
+ try {
+ List<String> entries = BundleHelper.listEntries(bundle);
+ for (String entry : entries) {
+ suite.addTest(new EncoderTestCase(entry));
+ }
+ } finally {
+ bundle.close();
+ }
+ return suite;
+ }
+
+ /** Test case with a unique name. */
+ static class EncoderTestCase extends TestCase {
+ final String entryName;
+ EncoderTestCase(String entryName) {
+ super("EncoderTest." + entryName);
+ this.entryName = entryName;
+ }
+
+ @Override
+ protected void runTest() throws Throwable {
+ EncoderTest.run(entryName);
+ }
+ }
+
+ private static void run(String entryName) throws Throwable {
+ InputStream bundle = getBundle();
+ byte[] original;
+ try {
+ original = BundleHelper.readEntry(bundle, entryName);
+ } finally {
+ bundle.close();
+ }
+ if (original == null) {
+ throw new RuntimeException("Can't read bundle entry: " + entryName);
+ }
+
+ for (int window = 10; window <= 22; window++) {
+ byte[] compressed =
+ Encoder.compress(original, new Encoder.Parameters().setQuality(6).setWindow(window));
+
+ InputStream decoder = new BrotliInputStream(new ByteArrayInputStream(compressed));
+ try {
+ long originalCrc = BundleHelper.fingerprintStream(new ByteArrayInputStream(original));
+ long crc = BundleHelper.fingerprintStream(decoder);
+ assertEquals(originalCrc, crc);
+ } finally {
+ decoder.close();
+ }
+ }
+ }
+}
diff --git a/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/encoder_jni.cc b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/encoder_jni.cc
new file mode 100644
index 000000000..5cde6dfb9
--- /dev/null
+++ b/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/java/org/brotli/wrapper/enc/encoder_jni.cc
@@ -0,0 +1,195 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+#include <jni.h>
+
+#include <new>
+
+#include <brotli/encode.h>
+
+namespace {
+/* A structure used to persist the encoder's state in between calls. */
+typedef struct EncoderHandle {
+ BrotliEncoderState* state;
+
+ uint8_t* input_start;
+ size_t input_offset;
+ size_t input_last;
+} EncoderHandle;
+
+/* Obtain handle from opaque pointer. */
+EncoderHandle* getHandle(void* opaque) {
+ return static_cast<EncoderHandle*>(opaque);
+}
+
+} /* namespace */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Creates a new Encoder.
+ *
+ * Cookie to address created encoder is stored in out_cookie. In case of failure
+ * cookie is 0.
+ *
+ * @param ctx {out_cookie, in_directBufferSize, in_quality, in_lgwin} tuple
+ * @returns direct ByteBuffer if directBufferSize is not 0; otherwise null
+ */
+JNIEXPORT jobject JNICALL
+Java_org_brotli_wrapper_enc_EncoderJNI_nativeCreate(
+ JNIEnv* env, jobject /*jobj*/, jlongArray ctx) {
+ bool ok = true;
+ EncoderHandle* handle = nullptr;
+ jlong context[5];
+ env->GetLongArrayRegion(ctx, 0, 5, context);
+ size_t input_size = context[1];
+ context[0] = 0;
+ handle = new (std::nothrow) EncoderHandle();
+ ok = !!handle;
+
+ if (ok) {
+ handle->input_offset = 0;
+ handle->input_last = 0;
+ handle->input_start = nullptr;
+
+ if (input_size == 0) {
+ ok = false;
+ } else {
+ handle->input_start = new (std::nothrow) uint8_t[input_size];
+ ok = !!handle->input_start;
+ }
+ }
+
+ if (ok) {
+ handle->state = BrotliEncoderCreateInstance(nullptr, nullptr, nullptr);
+ ok = !!handle->state;
+ }
+
+ if (ok) {
+ int quality = context[2];
+ if (quality >= 0) {
+ BrotliEncoderSetParameter(handle->state, BROTLI_PARAM_QUALITY, quality);
+ }
+ int lgwin = context[3];
+ if (lgwin >= 0) {
+ BrotliEncoderSetParameter(handle->state, BROTLI_PARAM_LGWIN, lgwin);
+ }
+ }
+
+ if (ok) {
+ /* TODO: future versions (e.g. when 128-bit architecture comes)
+ might require thread-safe cookie<->handle mapping. */
+ context[0] = reinterpret_cast<jlong>(handle);
+ } else if (!!handle) {
+ if (!!handle->input_start) delete[] handle->input_start;
+ delete handle;
+ }
+
+ env->SetLongArrayRegion(ctx, 0, 1, context);
+
+ if (!ok) {
+ return nullptr;
+ }
+
+ return env->NewDirectByteBuffer(handle->input_start, input_size);
+}
+
+/**
+ * Push data to encoder.
+ *
+ * @param ctx {in_cookie, in_operation_out_success, out_has_more_output,
+ * out_has_remaining_input} tuple
+ * @param input_length number of bytes provided in input or direct input;
+ * 0 to process further previous input
+ */
+JNIEXPORT void JNICALL
+Java_org_brotli_wrapper_enc_EncoderJNI_nativePush(
+ JNIEnv* env, jobject /*jobj*/, jlongArray ctx, jint input_length) {
+ jlong context[5];
+ env->GetLongArrayRegion(ctx, 0, 5, context);
+ EncoderHandle* handle = getHandle(reinterpret_cast<void*>(context[0]));
+ int operation = context[1];
+ context[1] = 0; /* ERROR */
+ env->SetLongArrayRegion(ctx, 0, 5, context);
+
+ BrotliEncoderOperation op;
+ switch (operation) {
+ case 0: op = BROTLI_OPERATION_PROCESS; break;
+ case 1: op = BROTLI_OPERATION_FLUSH; break;
+ case 2: op = BROTLI_OPERATION_FINISH; break;
+ default: return; /* ERROR */
+ }
+
+ if (input_length != 0) {
+ /* Still have unconsumed data. Workflow is broken. */
+ if (handle->input_offset < handle->input_last) {
+ return;
+ }
+ handle->input_offset = 0;
+ handle->input_last = input_length;
+ }
+
+ /* Actual compression. */
+ const uint8_t* in = handle->input_start + handle->input_offset;
+ size_t in_size = handle->input_last - handle->input_offset;
+ size_t out_size = 0;
+ BROTLI_BOOL status = BrotliEncoderCompressStream(
+ handle->state, op, &in_size, &in, &out_size, nullptr, nullptr);
+ handle->input_offset = handle->input_last - in_size;
+ if (!!status) {
+ context[1] = 1;
+ context[2] = BrotliEncoderHasMoreOutput(handle->state) ? 1 : 0;
+ context[3] = (handle->input_offset != handle->input_last) ? 1 : 0;
+ context[4] = BrotliEncoderIsFinished(handle->state) ? 1 : 0;
+ }
+ env->SetLongArrayRegion(ctx, 0, 5, context);
+}
+
+/**
+ * Pull decompressed data from encoder.
+ *
+ * @param ctx {in_cookie, out_success, out_has_more_output,
+ * out_has_remaining_input} tuple
+ * @returns direct ByteBuffer; all the produced data MUST be consumed before
+ * any further invocation; null in case of error
+ */
+JNIEXPORT jobject JNICALL
+Java_org_brotli_wrapper_enc_EncoderJNI_nativePull(
+ JNIEnv* env, jobject /*jobj*/, jlongArray ctx) {
+ jlong context[5];
+ env->GetLongArrayRegion(ctx, 0, 5, context);
+ EncoderHandle* handle = getHandle(reinterpret_cast<void*>(context[0]));
+ size_t data_length = 0;
+ const uint8_t* data = BrotliEncoderTakeOutput(handle->state, &data_length);
+ context[1] = 1;
+ context[2] = BrotliEncoderHasMoreOutput(handle->state) ? 1 : 0;
+ context[3] = (handle->input_offset != handle->input_last) ? 1 : 0;
+ context[4] = BrotliEncoderIsFinished(handle->state) ? 1 : 0;
+ env->SetLongArrayRegion(ctx, 0, 5, context);
+ return env->NewDirectByteBuffer(const_cast<uint8_t*>(data), data_length);
+}
+
+/**
+ * Releases all used resources.
+ *
+ * @param ctx {in_cookie} tuple
+ */
+JNIEXPORT void JNICALL
+Java_org_brotli_wrapper_enc_EncoderJNI_nativeDestroy(
+ JNIEnv* env, jobject /*jobj*/, jlongArray ctx) {
+ jlong context[2];
+ env->GetLongArrayRegion(ctx, 0, 2, context);
+ EncoderHandle* handle = getHandle(reinterpret_cast<void*>(context[0]));
+ BrotliEncoderDestroyInstance(handle->state);
+ delete[] handle->input_start;
+ delete handle;
+}
+
+#ifdef __cplusplus
+}
+#endif