Add pdf_formcalc_context_fuzzer. This fuzzer runs a simple CFXJSE_FormCalcContextEmbedderTest. Change-Id: I6c99bd7de0f99eadc282bcae8c0e975631f151d5 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/51354 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/testing/fuzzers/BUILD.gn b/testing/fuzzers/BUILD.gn index 5a7145b..c6fdbb1 100644 --- a/testing/fuzzers/BUILD.gn +++ b/testing/fuzzers/BUILD.gn
@@ -45,6 +45,7 @@ ":pdf_codec_jpeg_fuzzer_src", ":pdf_css_fuzzer_src", ":pdf_fm2js_fuzzer_src", + ":pdf_formcalc_context_fuzzer_src", ":pdf_formcalc_fuzzer_src", ":pdfium_xfa_fuzzer_src", ] @@ -261,6 +262,17 @@ ] } + pdfium_public_fuzzer("pdf_formcalc_context_fuzzer_src") { + sources = [ + "pdf_formcalc_context_fuzzer.cc", + ] + deps = [ + "../../fpdfsdk/fpdfxfa", + "../../fxjs", + "../../xfa/fxfa", + ] + } + pdfium_fuzzer("pdf_formcalc_fuzzer_src") { sources = [ "pdf_formcalc_fuzzer.cc",
diff --git a/testing/fuzzers/pdf_formcalc_context_fuzzer.cc b/testing/fuzzers/pdf_formcalc_context_fuzzer.cc new file mode 100644 index 0000000..1c3d989 --- /dev/null +++ b/testing/fuzzers/pdf_formcalc_context_fuzzer.cc
@@ -0,0 +1,545 @@ +// Copyright 2019 The PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <stdint.h> + +#include "core/fxcrt/fx_string.h" +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#include "fxjs/xfa/cfxjse_engine.h" +#include "fxjs/xfa/cfxjse_value.h" +#include "public/fpdf_formfill.h" +#include "testing/fuzzers/pdfium_fuzzer_helper.h" +#include "v8/include/v8.h" +#include "xfa/fxfa/cxfa_eventparam.h" + +namespace { + +// testing/resources/simple_xfa.pdf +const uint8_t kSimpleXfaPdfData[] = { + 0x25, 0x50, 0x44, 0x46, 0x2d, 0x31, 0x2e, 0x37, 0x0a, 0x25, 0xa0, 0xf2, + 0xa4, 0xf4, 0x0a, 0x31, 0x20, 0x30, 0x20, 0x6f, 0x62, 0x6a, 0x20, 0x3c, + 0x3c, 0x0a, 0x20, 0x20, 0x2f, 0x41, 0x63, 0x72, 0x6f, 0x46, 0x6f, 0x72, + 0x6d, 0x20, 0x32, 0x20, 0x30, 0x20, 0x52, 0x0a, 0x20, 0x20, 0x2f, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3c, 0x3c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x41, 0x44, 0x42, 0x45, 0x20, 0x3c, + 0x3c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x42, 0x61, 0x73, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x2f, 0x31, 0x2e, + 0x37, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x38, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3e, 0x3e, 0x0a, 0x20, 0x20, 0x3e, + 0x3e, 0x0a, 0x20, 0x20, 0x2f, 0x4e, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x2f, 0x50, 0x61, 0x67, 0x65, 0x73, 0x20, 0x38, 0x20, + 0x30, 0x20, 0x52, 0x0a, 0x20, 0x20, 0x2f, 0x54, 0x79, 0x70, 0x65, 0x20, + 0x2f, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x0a, 0x3e, 0x3e, 0x0a, + 0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a, 0x0a, 0x32, 0x20, 0x30, 0x20, 0x6f, + 0x62, 0x6a, 0x20, 0x3c, 0x3c, 0x0a, 0x20, 0x20, 0x2f, 0x58, 0x46, 0x41, + 0x20, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x70, 0x72, 0x65, 0x61, + 0x6d, 0x62, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x33, 0x20, + 0x30, 0x20, 0x52, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x20, 0x30, + 0x20, 0x52, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x35, 0x20, + 0x30, 0x20, 0x52, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x36, 0x20, 0x30, 0x20, 0x52, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x70, + 0x6f, 0x73, 0x74, 0x61, 0x6d, 0x62, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x37, 0x20, 0x30, 0x20, 0x52, 0x0a, 0x20, 0x20, 0x5d, 0x0a, + 0x3e, 0x3e, 0x0a, 0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a, 0x0a, 0x33, 0x20, + 0x30, 0x20, 0x6f, 0x62, 0x6a, 0x20, 0x3c, 0x3c, 0x0a, 0x20, 0x20, 0x2f, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x31, 0x32, 0x34, 0x0a, 0x3e, + 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x0a, 0x3c, 0x78, 0x64, + 0x70, 0x3a, 0x78, 0x64, 0x70, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, + 0x78, 0x64, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x78, 0x64, 0x70, 0x2f, 0x22, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x53, + 0x74, 0x61, 0x6d, 0x70, 0x3d, 0x22, 0x32, 0x30, 0x31, 0x38, 0x2d, 0x30, + 0x32, 0x2d, 0x32, 0x33, 0x54, 0x32, 0x31, 0x3a, 0x33, 0x37, 0x3a, 0x31, + 0x31, 0x5a, 0x22, 0x20, 0x75, 0x75, 0x69, 0x64, 0x3d, 0x22, 0x32, 0x31, + 0x34, 0x38, 0x32, 0x37, 0x39, 0x38, 0x2d, 0x37, 0x62, 0x66, 0x30, 0x2d, + 0x34, 0x30, 0x61, 0x34, 0x2d, 0x62, 0x63, 0x35, 0x64, 0x2d, 0x33, 0x63, + 0x65, 0x66, 0x64, 0x63, 0x63, 0x66, 0x33, 0x32, 0x62, 0x35, 0x22, 0x3e, + 0x0a, 0x65, 0x6e, 0x64, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x0a, 0x65, + 0x6e, 0x64, 0x6f, 0x62, 0x6a, 0x0a, 0x34, 0x20, 0x30, 0x20, 0x6f, 0x62, + 0x6a, 0x20, 0x3c, 0x3c, 0x0a, 0x20, 0x20, 0x2f, 0x4c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x20, 0x36, 0x34, 0x32, 0x0a, 0x3e, 0x3e, 0x0a, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x0a, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x78, 0x66, 0x61, 0x2e, 0x6f, + 0x72, 0x67, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2f, 0x78, 0x63, + 0x69, 0x2f, 0x33, 0x2e, 0x30, 0x2f, 0x22, 0x3e, 0x0a, 0x3c, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x65, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, + 0x70, 0x64, 0x66, 0x3c, 0x2f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x70, 0x64, 0x66, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x70, 0x64, + 0x66, 0x3e, 0x0a, 0x3c, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x3e, 0x0a, + 0x3c, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x70, 0x64, 0x66, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3e, 0x31, 0x2e, 0x37, 0x3c, 0x2f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3e, 0x38, 0x3c, + 0x2f, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x3e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3c, 0x2f, + 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x3e, 0x58, 0x46, 0x41, 0x3c, 0x2f, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x3e, 0x31, 0x3c, 0x2f, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x2f, 0x70, 0x64, 0x66, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x78, 0x64, + 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x3e, 0x2a, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x78, 0x64, 0x70, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x3e, 0x70, 0x64, 0x66, 0x3c, 0x2f, 0x64, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x72, 0x75, 0x6e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, + 0x3e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3c, 0x2f, 0x72, 0x75, 0x6e, + 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x2f, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x3e, 0x0a, 0x3c, 0x61, 0x63, 0x72, + 0x6f, 0x62, 0x61, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x61, 0x63, 0x72, + 0x6f, 0x62, 0x61, 0x74, 0x37, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x3e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x3c, 0x2f, + 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x61, 0x63, 0x72, 0x6f, 0x62, + 0x61, 0x74, 0x37, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x3e, 0x70, 0x72, 0x65, 0x53, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x3c, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x3e, 0x0a, 0x3c, 0x2f, 0x61, 0x63, 0x72, 0x6f, 0x62, 0x61, 0x74, 0x3e, + 0x0a, 0x3c, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3e, 0x0a, 0x65, + 0x6e, 0x64, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x0a, 0x65, 0x6e, 0x64, + 0x6f, 0x62, 0x6a, 0x0a, 0x35, 0x20, 0x30, 0x20, 0x6f, 0x62, 0x6a, 0x20, + 0x3c, 0x3c, 0x0a, 0x20, 0x20, 0x2f, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x20, 0x34, 0x38, 0x32, 0x0a, 0x3e, 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x0a, 0x3c, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x78, 0x66, 0x61, 0x2e, 0x6f, + 0x72, 0x67, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2f, 0x78, 0x66, + 0x61, 0x2d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2f, 0x33, + 0x2e, 0x33, 0x2f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x73, 0x75, 0x62, + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x22, 0x20, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, + 0x3d, 0x22, 0x74, 0x62, 0x22, 0x20, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3d, 0x22, 0x61, 0x75, 0x74, 0x6f, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x61, 0x67, 0x65, + 0x53, 0x65, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x70, 0x61, 0x67, 0x65, 0x41, 0x72, 0x65, 0x61, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x50, 0x61, 0x67, 0x65, 0x31, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x50, 0x61, 0x67, 0x65, 0x31, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x41, 0x72, 0x65, 0x61, 0x20, 0x78, 0x3d, 0x22, 0x30, 0x2e, + 0x32, 0x35, 0x69, 0x6e, 0x22, 0x20, 0x79, 0x3d, 0x22, 0x30, 0x2e, 0x32, + 0x35, 0x69, 0x6e, 0x22, 0x20, 0x77, 0x3d, 0x22, 0x38, 0x69, 0x6e, 0x22, + 0x20, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x2e, 0x35, 0x69, 0x6e, 0x22, 0x20, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x70, + 0x61, 0x67, 0x65, 0x41, 0x72, 0x65, 0x61, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x70, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x31, 0x22, 0x20, 0x79, 0x3d, 0x22, 0x33, 0x31, 0x2e, 0x37, + 0x35, 0x6d, 0x6d, 0x22, 0x20, 0x78, 0x3d, 0x22, 0x34, 0x34, 0x2e, 0x34, + 0x35, 0x6d, 0x6d, 0x22, 0x20, 0x77, 0x3d, 0x22, 0x31, 0x31, 0x34, 0x2e, + 0x32, 0x39, 0x31, 0x6d, 0x6d, 0x22, 0x20, 0x68, 0x3d, 0x22, 0x31, 0x32, + 0x2e, 0x37, 0x6d, 0x6d, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x31, 0x31, + 0x22, 0x20, 0x79, 0x3d, 0x22, 0x32, 0x32, 0x32, 0x2e, 0x32, 0x35, 0x6d, + 0x6d, 0x22, 0x20, 0x78, 0x3d, 0x22, 0x34, 0x34, 0x2e, 0x34, 0x35, 0x6d, + 0x6d, 0x22, 0x20, 0x77, 0x3d, 0x22, 0x38, 0x32, 0x2e, 0x35, 0x35, 0x6d, + 0x6d, 0x22, 0x20, 0x68, 0x3d, 0x22, 0x31, 0x32, 0x2e, 0x37, 0x6d, 0x6d, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x73, 0x75, 0x62, 0x66, + 0x6f, 0x72, 0x6d, 0x3e, 0x0a, 0x3c, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x3e, 0x0a, 0x65, 0x6e, 0x64, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x0a, 0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a, 0x0a, 0x36, 0x20, + 0x30, 0x20, 0x6f, 0x62, 0x6a, 0x20, 0x3c, 0x3c, 0x0a, 0x20, 0x20, 0x2f, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x33, 0x34, 0x35, 0x35, 0x0a, + 0x3e, 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x0a, 0x3c, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x20, 0x78, 0x6d, 0x6c, + 0x6e, 0x73, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x78, 0x66, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2f, 0x78, 0x66, 0x61, 0x2d, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x65, 0x2d, 0x73, 0x65, 0x74, 0x2f, 0x32, 0x2e, 0x37, + 0x2f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x6e, 0x5f, 0x55, + 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x3d, 0x22, 0x45, 0x6e, 0x67, + 0x6c, 0x69, 0x73, 0x68, 0x20, 0x28, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, + 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x29, 0x22, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, + 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x67, 0x72, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x61, 0x6e, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x6f, 0x6e, + 0x74, 0x68, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, + 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, + 0x74, 0x68, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x46, 0x65, 0x62, 0x72, 0x75, + 0x61, 0x72, 0x79, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x6f, 0x6e, + 0x74, 0x68, 0x3e, 0x4d, 0x61, 0x72, 0x63, 0x68, 0x3c, 0x2f, 0x6d, 0x6f, + 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x41, 0x70, 0x72, 0x69, + 0x6c, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, + 0x3e, 0x4d, 0x61, 0x79, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x6f, + 0x6e, 0x74, 0x68, 0x3e, 0x4a, 0x75, 0x6e, 0x65, 0x3c, 0x2f, 0x6d, 0x6f, + 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x4a, 0x75, 0x6c, 0x79, + 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, + 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, + 0x68, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x6f, 0x6e, + 0x74, 0x68, 0x3e, 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3c, 0x2f, + 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x4e, 0x6f, + 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, + 0x68, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x20, 0x61, 0x62, 0x62, 0x72, 0x3d, 0x22, 0x31, 0x22, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, + 0x68, 0x3e, 0x4a, 0x61, 0x6e, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, + 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x46, 0x65, 0x62, 0x3c, 0x2f, 0x6d, 0x6f, + 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x4d, 0x61, 0x72, 0x3c, + 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x41, + 0x70, 0x72, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, + 0x68, 0x3e, 0x4d, 0x61, 0x79, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, + 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x4a, 0x75, 0x6e, 0x3c, 0x2f, 0x6d, 0x6f, + 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x4a, 0x75, 0x6c, 0x3c, + 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x41, + 0x75, 0x67, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, + 0x68, 0x3e, 0x53, 0x65, 0x70, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, + 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x4f, 0x63, 0x74, 0x3c, 0x2f, 0x6d, 0x6f, + 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x4e, 0x6f, 0x76, 0x3c, + 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x44, + 0x65, 0x63, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x64, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x61, 0x79, + 0x3e, 0x53, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x3c, 0x2f, 0x64, 0x61, 0x79, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, + 0x61, 0x79, 0x3e, 0x4d, 0x6f, 0x6e, 0x64, 0x61, 0x79, 0x3c, 0x2f, 0x64, + 0x61, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x64, 0x61, 0x79, 0x3e, 0x54, 0x75, 0x65, 0x73, 0x64, 0x61, 0x79, + 0x3c, 0x2f, 0x64, 0x61, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x64, 0x61, 0x79, 0x3e, 0x57, 0x65, 0x64, 0x6e, + 0x65, 0x73, 0x64, 0x61, 0x79, 0x3c, 0x2f, 0x64, 0x61, 0x79, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x61, 0x79, + 0x3e, 0x54, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79, 0x3c, 0x2f, 0x64, + 0x61, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x64, 0x61, 0x79, 0x3e, 0x46, 0x72, 0x69, 0x64, 0x61, 0x79, 0x3c, + 0x2f, 0x64, 0x61, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x64, 0x61, 0x79, 0x3e, 0x53, 0x61, 0x74, 0x75, 0x72, + 0x64, 0x61, 0x79, 0x3c, 0x2f, 0x64, 0x61, 0x79, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x61, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, + 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x61, 0x62, 0x62, 0x72, + 0x3d, 0x22, 0x31, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x64, 0x61, 0x79, 0x3e, 0x53, 0x75, 0x6e, 0x3c, 0x2f, + 0x64, 0x61, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x64, 0x61, 0x79, 0x3e, 0x4d, 0x6f, 0x6e, 0x3c, 0x2f, 0x64, + 0x61, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x64, 0x61, 0x79, 0x3e, 0x54, 0x75, 0x65, 0x3c, 0x2f, 0x64, 0x61, + 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x64, 0x61, 0x79, 0x3e, 0x57, 0x65, 0x64, 0x3c, 0x2f, 0x64, 0x61, 0x79, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, + 0x61, 0x79, 0x3e, 0x54, 0x68, 0x75, 0x3c, 0x2f, 0x64, 0x61, 0x79, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x61, + 0x79, 0x3e, 0x46, 0x72, 0x69, 0x3c, 0x2f, 0x64, 0x61, 0x79, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x61, 0x79, + 0x3e, 0x53, 0x61, 0x74, 0x3c, 0x2f, 0x64, 0x61, 0x79, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x61, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6d, 0x65, 0x72, 0x69, 0x64, 0x69, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6d, 0x65, 0x72, 0x69, 0x64, 0x69, 0x65, 0x6d, 0x3e, 0x41, 0x4d, 0x3c, + 0x2f, 0x6d, 0x65, 0x72, 0x69, 0x64, 0x69, 0x65, 0x6d, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x72, 0x69, + 0x64, 0x69, 0x65, 0x6d, 0x3e, 0x50, 0x4d, 0x3c, 0x2f, 0x6d, 0x65, 0x72, + 0x69, 0x64, 0x69, 0x65, 0x6d, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x6d, 0x65, 0x72, 0x69, 0x64, 0x69, 0x65, 0x6d, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x72, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x72, 0x61, 0x3e, + 0x42, 0x43, 0x3c, 0x2f, 0x65, 0x72, 0x61, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x72, 0x61, 0x3e, 0x41, 0x44, + 0x3c, 0x2f, 0x65, 0x72, 0x61, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x65, 0x72, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x6c, 0x65, 0x6e, + 0x64, 0x61, 0x72, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x75, 0x6c, 0x6c, + 0x22, 0x3e, 0x45, 0x45, 0x45, 0x45, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, + 0x20, 0x44, 0x2c, 0x20, 0x59, 0x59, 0x59, 0x59, 0x3c, 0x2f, 0x64, 0x61, + 0x74, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x6c, 0x6f, 0x6e, 0x67, 0x22, 0x3e, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x44, + 0x2c, 0x20, 0x59, 0x59, 0x59, 0x59, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x65, + 0x64, 0x22, 0x3e, 0x4d, 0x4d, 0x4d, 0x20, 0x44, 0x2c, 0x20, 0x59, 0x59, + 0x59, 0x59, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x22, + 0x3e, 0x4d, 0x2f, 0x44, 0x2f, 0x59, 0x59, 0x3c, 0x2f, 0x64, 0x61, 0x74, + 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x69, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x6d, 0x65, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x3e, 0x68, 0x3a, 0x4d, 0x4d, + 0x3a, 0x53, 0x53, 0x20, 0x41, 0x20, 0x5a, 0x3c, 0x2f, 0x74, 0x69, 0x6d, + 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, + 0x6f, 0x6e, 0x67, 0x22, 0x3e, 0x68, 0x3a, 0x4d, 0x4d, 0x3a, 0x53, 0x53, + 0x20, 0x41, 0x20, 0x5a, 0x3c, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x65, 0x64, 0x22, + 0x3e, 0x68, 0x3a, 0x4d, 0x4d, 0x3a, 0x53, 0x53, 0x20, 0x41, 0x3c, 0x2f, + 0x74, 0x69, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x6d, 0x65, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x22, 0x3e, 0x68, 0x3a, 0x4d, + 0x4d, 0x20, 0x41, 0x3c, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x74, 0x69, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x3e, 0x47, + 0x79, 0x4d, 0x64, 0x6b, 0x48, 0x6d, 0x73, 0x53, 0x45, 0x44, 0x46, 0x77, + 0x57, 0x61, 0x68, 0x4b, 0x7a, 0x5a, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x22, 0x3e, 0x7a, 0x2c, + 0x7a, 0x7a, 0x39, 0x2e, 0x7a, 0x7a, 0x7a, 0x3c, 0x2f, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, + 0x3e, 0x24, 0x7a, 0x2c, 0x7a, 0x7a, 0x39, 0x2e, 0x39, 0x39, 0x7c, 0x28, + 0x24, 0x7a, 0x2c, 0x7a, 0x7a, 0x39, 0x2e, 0x39, 0x39, 0x29, 0x3c, 0x2f, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x22, 0x3e, 0x7a, 0x2c, 0x7a, 0x7a, 0x39, 0x25, 0x3c, 0x2f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x53, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x79, 0x6d, + 0x62, 0x6f, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x65, + 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x22, 0x3e, 0x2e, 0x3c, 0x2f, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x6e, 0x67, 0x22, 0x3e, + 0x2c, 0x3c, 0x2f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x79, 0x6d, + 0x62, 0x6f, 0x6c, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x22, 0x3e, 0x25, 0x3c, 0x2f, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, + 0x69, 0x6e, 0x75, 0x73, 0x22, 0x3e, 0x2d, 0x3c, 0x2f, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x7a, 0x65, 0x72, 0x6f, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x22, 0x3e, 0x24, 0x3c, 0x2f, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x73, 0x6f, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3e, 0x55, 0x53, 0x44, 0x3c, 0x2f, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x63, 0x79, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x63, 0x79, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x22, + 0x3e, 0x2e, 0x3c, 0x2f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x73, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, + 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x79, 0x72, + 0x69, 0x61, 0x64, 0x20, 0x50, 0x72, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, + 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x69, 0x6e, + 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x72, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, + 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x75, + 0x72, 0x69, 0x65, 0x72, 0x20, 0x53, 0x74, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x66, + 0x61, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x64, + 0x6f, 0x62, 0x65, 0x20, 0x50, 0x69, 0x20, 0x53, 0x74, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x79, 0x70, + 0x65, 0x66, 0x61, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x48, 0x65, 0x62, 0x72, 0x65, 0x77, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x41, 0x72, 0x61, 0x62, + 0x69, 0x63, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x54, 0x68, + 0x61, 0x69, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4b, 0x6f, 0x7a, 0x75, 0x6b, 0x61, 0x20, 0x47, + 0x6f, 0x74, 0x68, 0x69, 0x63, 0x20, 0x50, 0x72, 0x6f, 0x2d, 0x56, 0x49, + 0x20, 0x4d, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4b, 0x6f, 0x7a, 0x75, 0x6b, 0x61, 0x20, 0x4d, + 0x69, 0x6e, 0x63, 0x68, 0x6f, 0x20, 0x50, 0x72, 0x6f, 0x2d, 0x56, 0x49, + 0x20, 0x52, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x4d, 0x69, + 0x6e, 0x67, 0x20, 0x53, 0x74, 0x64, 0x20, 0x4c, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x66, + 0x61, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x64, + 0x6f, 0x62, 0x65, 0x20, 0x53, 0x6f, 0x6e, 0x67, 0x20, 0x53, 0x74, 0x64, + 0x20, 0x4c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x4d, 0x79, + 0x75, 0x6e, 0x67, 0x6a, 0x6f, 0x20, 0x53, 0x74, 0x64, 0x20, 0x4d, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x79, 0x70, + 0x65, 0x66, 0x61, 0x63, 0x65, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x2f, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x3e, 0x0a, 0x65, 0x6e, 0x64, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x0a, 0x65, 0x6e, 0x64, 0x6f, 0x62, + 0x6a, 0x0a, 0x37, 0x20, 0x30, 0x20, 0x6f, 0x62, 0x6a, 0x20, 0x3c, 0x3c, + 0x0a, 0x20, 0x20, 0x2f, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x31, + 0x31, 0x0a, 0x3e, 0x3e, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x0a, + 0x3c, 0x2f, 0x78, 0x64, 0x70, 0x3a, 0x78, 0x64, 0x70, 0x3e, 0x0a, 0x65, + 0x6e, 0x64, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x0a, 0x65, 0x6e, 0x64, + 0x6f, 0x62, 0x6a, 0x0a, 0x38, 0x20, 0x30, 0x20, 0x6f, 0x62, 0x6a, 0x20, + 0x3c, 0x3c, 0x0a, 0x20, 0x20, 0x2f, 0x54, 0x79, 0x70, 0x65, 0x20, 0x2f, + 0x50, 0x61, 0x67, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x2f, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x2f, 0x4b, 0x69, 0x64, 0x73, + 0x20, 0x5b, 0x39, 0x20, 0x30, 0x20, 0x52, 0x5d, 0x0a, 0x3e, 0x3e, 0x0a, + 0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a, 0x0a, 0x39, 0x20, 0x30, 0x20, 0x6f, + 0x62, 0x6a, 0x20, 0x3c, 0x3c, 0x0a, 0x20, 0x20, 0x2f, 0x54, 0x79, 0x70, + 0x65, 0x20, 0x2f, 0x50, 0x61, 0x67, 0x65, 0x0a, 0x20, 0x20, 0x2f, 0x50, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x32, 0x20, 0x30, 0x20, 0x52, 0x0a, + 0x20, 0x20, 0x2f, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x42, 0x6f, 0x78, 0x20, + 0x5b, 0x30, 0x20, 0x30, 0x20, 0x36, 0x31, 0x32, 0x20, 0x37, 0x39, 0x32, + 0x5d, 0x0a, 0x3e, 0x3e, 0x0a, 0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a, 0x0a, + 0x78, 0x72, 0x65, 0x66, 0x0a, 0x30, 0x20, 0x31, 0x30, 0x0a, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x36, 0x35, 0x35, + 0x33, 0x35, 0x20, 0x66, 0x20, 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x31, 0x35, 0x20, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x6e, + 0x20, 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x39, 0x39, + 0x20, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x6e, 0x20, 0x0a, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x35, 0x38, 0x20, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x20, 0x6e, 0x20, 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x35, 0x33, 0x34, 0x20, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x6e, + 0x20, 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x32, 0x32, 0x38, + 0x20, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x6e, 0x20, 0x0a, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x31, 0x37, 0x36, 0x32, 0x20, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x20, 0x6e, 0x20, 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x35, 0x32, 0x37, 0x30, 0x20, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x6e, + 0x20, 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x35, 0x33, 0x33, 0x32, + 0x20, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x6e, 0x20, 0x0a, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x35, 0x33, 0x39, 0x35, 0x20, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x20, 0x6e, 0x20, 0x0a, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, + 0x72, 0x20, 0x3c, 0x3c, 0x0a, 0x20, 0x20, 0x2f, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x31, 0x20, 0x30, 0x20, 0x52, 0x0a, 0x20, 0x20, 0x2f, 0x53, 0x69, + 0x7a, 0x65, 0x20, 0x31, 0x30, 0x0a, 0x3e, 0x3e, 0x0a, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x78, 0x72, 0x65, 0x66, 0x0a, 0x35, 0x34, 0x37, 0x32, 0x0a, + 0x25, 0x25, 0x45, 0x4f, 0x46, 0x0a}; + +} // namespace + +class PDFiumFormCalcContextFuzzer : public PDFiumFuzzerHelper { + public: + PDFiumFormCalcContextFuzzer(const uint8_t* data, size_t size) + : data_(data), size_(size) {} + ~PDFiumFormCalcContextFuzzer() override = default; + + int GetFormCallbackVersion() const override { return 2; } + + // Return false if XFA doesn't load as otherwise we're duplicating the work + // done by the non-xfa fuzzer. + bool OnFormFillEnvLoaded(FPDF_DOCUMENT doc) override { + return FPDF_LoadXFA(doc); + } + + void OnRenderFinished(FPDF_DOCUMENT doc) override { + auto* context = static_cast<CPDFXFA_Context*>( + CPDFDocumentFromFPDFDocument(doc)->GetExtension()); + CXFA_Document* xfa_document = context->GetXFADoc()->GetXFADoc(); + CFXJSE_Engine* script_context = xfa_document->GetScriptContext(); + + CXFA_EventParam params; + params.m_bCancelAction = false; + script_context->SetEventParam(¶ms); + ByteStringView data_view(data_, size_); + + auto value = pdfium::MakeUnique<CFXJSE_Value>(script_context->GetIsolate()); + script_context->RunScript(CXFA_Script::Type::Formcalc, + WideString::FromUTF8(data_view).AsStringView(), + value.get(), xfa_document->GetRoot()); + + script_context->SetEventParam(nullptr); + } + + private: + const uint8_t* data_; + size_t size_; +}; + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + PDFiumFormCalcContextFuzzer fuzzer(data, size); + fuzzer.RenderPdf(reinterpret_cast<const char*>(kSimpleXfaPdfData), + sizeof(kSimpleXfaPdfData)); + return 0; +}
diff --git a/testing/fuzzers/pdfium_fuzzer_helper.cc b/testing/fuzzers/pdfium_fuzzer_helper.cc index 21a34ff..3861034 100644 --- a/testing/fuzzers/pdfium_fuzzer_helper.cc +++ b/testing/fuzzers/pdfium_fuzzer_helper.cc
@@ -223,6 +223,7 @@ } RenderPage(doc.get(), form.get(), i, render_flags, form_flags); } + OnRenderFinished(doc.get()); FORM_DoDocumentAAction(form.get(), FPDFDOC_AACTION_WC); }
diff --git a/testing/fuzzers/pdfium_fuzzer_helper.h b/testing/fuzzers/pdfium_fuzzer_helper.h index 60717a1..af14941 100644 --- a/testing/fuzzers/pdfium_fuzzer_helper.h +++ b/testing/fuzzers/pdfium_fuzzer_helper.h
@@ -15,6 +15,7 @@ virtual int GetFormCallbackVersion() const = 0; virtual bool OnFormFillEnvLoaded(FPDF_DOCUMENT doc); + virtual void OnRenderFinished(FPDF_DOCUMENT doc) {} protected: PDFiumFuzzerHelper();