Close

Sending Email with Oracle, Part 7: UTL_SMTP – Attachments

Sending Email with Oracle

UTL_MAIL and APEX_MAIL have been discussed previously and each include a subset of attachment functionality explained in their respective articles. For simple applications these may be sufficient.

To go beyond the functionality of those packages; or if they aren’t available in your database you will need to use UTL_SMTP.  As mentioned in the MIME article, it comes as a surprise to many to discover there is no functionality for sending attachments in SMTP itself. Fortunately, MIME provides a mechanism to do so within the email protocol. For the most part, sending an attachment is just writing more data to the body of the email with some prefix and suffix text to define the MIME blocks.

Clients such as Thunderbird and Outlook, as well as web based like Gmail or Hotmail reads the MIME tags, parse the content, and display the elements in whatever form is appropriate to each MIME block’s type; such as embedded images for encoded jpg files. Conceptually that’s all there is to it:  define a tag, prefix content with the tag, encode the content if it’s not text, and suffix the content with the tag. The code to do all of that may appear to be cumbersome; but if you compare to non-attached content you’ll see the extra steps really don’t add too much extra work.

For example, the block below will create delimited content of all objects you have access to including owner, name, type and date created.  That file will then be appended to the SMTP body as a CSV file attachment.  Since the content is simple ascii text, there is no need for special encoding, wrapping in MIME boundary tags is sufficient.  Note this example not only demonstrates how to embed an object or attachment but also how to exceed the 32K limit of UTL_MAIL.

DECLARE
    v_connection             UTL_SMTP.connection;
    -- mime blocks (the sections of the email body that can become attachments)
    -- must be delimited by a string, this particular string is just an example
    c_mime_boundary CONSTANT VARCHAR2(256) := '-----AABCDEFBBCCC0123456789DE';
    v_clob                   CLOB := EMPTY_CLOB();
    v_len                    INTEGER;
    v_index                  INTEGER;
BEGIN
    -- Build the contents before connecting to the mail server
    -- that way you can begin pumping the data immediately
    -- and not risk an SMTP timeout

    FOR x IN (SELECT *
                FROM all_objects
               WHERE ROWNUM < 20)
    LOOP
        v_clob :=
               v_clob
            || x.owner
            || ','
            || x.object_name
            || ','
            || x.object_type
            || ','
            || TO_CHAR(x.created, 'yyyy-mm-dd hh24:mi:ss')
            || UTL_TCP.crlf;
    END LOOP;

    v_connection := UTL_SMTP.open_connection(:p_smtp_server);
    UTL_SMTP.helo(v_connection, :p_domain);
    UTL_SMTP.mail(v_connection, :p_from);
    UTL_SMTP.rcpt(v_connection, :p_to);
    UTL_SMTP.open_data(v_connection);

    UTL_SMTP.write_data(v_connection, 'From: ' || :p_from || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'To: ' || :p_to || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'Subject: test subject' || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'MIME-Version: 1.0' || UTL_TCP.crlf);

    UTL_SMTP.write_data(
        v_connection,
        'Content-Type: multipart/mixed; boundary="' || c_mime_boundary || '"' || UTL_TCP.crlf
    );
    UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);
    UTL_SMTP.write_data(
        v_connection,
        'This is a multi-part message in MIME format.' || UTL_TCP.crlf
    );

    UTL_SMTP.write_data(v_connection, '--' || c_mime_boundary || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'Content-Type: text/plain' || UTL_TCP.crlf);

    -- Set up attachment header
    UTL_SMTP.write_data(
        v_connection,
           'Content-Disposition: attachment; filename="'
        || 'your_file_name.csv'
        || '"'
        || UTL_TCP.crlf
    );
    UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);

    -- Write attachment contents
    v_len := DBMS_LOB.getlength(v_clob);
    v_index := 1;

    WHILE v_index <= v_len
    LOOP
        UTL_SMTP.write_data(v_connection, DBMS_LOB.SUBSTR(v_clob, 32000, v_index));
        v_index := v_index + 32000;
    END LOOP;

    --
    -- End attachment
    UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, '--' || c_mime_boundary || '--' || UTL_TCP.crlf);

    UTL_SMTP.close_data(v_connection);
    UTL_SMTP.quit(v_connection);
EXCEPTION
    WHEN OTHERS
    THEN
        DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);
END;

By comparison,  here’s the same block of code, except the data is written directly to the body of the email instead of wrapped as an attachment.

DECLARE
    v_connection UTL_SMTP.connection;
    v_clob       CLOB := EMPTY_CLOB();
    v_len        INTEGER;
    v_index      INTEGER;
BEGIN
    -- Build the contents before connecting to the mail server
    -- that way you can begin pumping the data immediately
    -- and not risk an SMTP timeout

    FOR x IN (SELECT *
                FROM all_objects
               WHERE ROWNUM < 20)
    LOOP
        v_clob :=
               v_clob
            || x.owner
            || ','
            || x.object_name
            || ','
            || x.object_type
            || ','
            || TO_CHAR(x.created, 'yyyy-mm-dd hh24:mi:ss')
            || UTL_TCP.crlf;
    END LOOP;

    v_connection := UTL_SMTP.open_connection(:p_smtp_server);
    UTL_SMTP.helo(v_connection, :p_domain);
    UTL_SMTP.mail(v_connection, :p_from);
    UTL_SMTP.rcpt(v_connection, :p_to);
    UTL_SMTP.open_data(v_connection);

    UTL_SMTP.write_data(v_connection, 'From: ' || :p_from || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'To: ' || :p_to || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'Subject: test subject' || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);
    v_len := DBMS_LOB.getlength(v_clob);
    v_index := 1;

    WHILE v_index <= v_len
    LOOP
        UTL_SMTP.write_data(v_connection, DBMS_LOB.SUBSTR(v_clob, 32000, v_index));
        v_index := v_index + 32000;
    END LOOP;

    UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);

    UTL_SMTP.close_data(v_connection);
    UTL_SMTP.quit(v_connection);
EXCEPTION
    WHEN OTHERS
    THEN
        DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);
END;

As you can see, most of the code is the same.  You may note in both examples I constructed a CLOB prior to starting the email rather than iterating through the cursor and writing directly to the SMTP connection.  I have multiple reasons for this design.  First, SMTP servers will often have timeout limits on them.  In this example the query should return fairly quickly; but as general practice this is unreliable because other queries might not.  So rather than open a connection, start a query and then have the connection timeout before getting the data, I make a habit of constructing my content first then initiating the email connections.  I can also check the content by writing to dbms_output or log the content to tables or files instead of or in addition to attempting to send it outside the server via email. Finally, constructing the content first confirms you are ready before initiating the communication. You won’t start the connection only to run into a NO_DATA_FOUND exception, a failed REST call, or other error and have to clean up.

For small and/or fixed content this may not matter, but as your email body gets more complex it’s something to keep in mind.  

Embedding multiple objects or attachments

As mentioned in the MIME article, sending multiple attachments is just a matter of appending additional blocks. When you’ve added last block you write the boundary again with the suffix of double-dashes (--).   When declaring the MIME boundary, while it is common to use a randomly generated string, it can be almost anything as long as it is distinct from any of the content within the blocks. As seen in the next example, I’ve changed the boundary literally to the string “the boundary can be almost anything.”

DECLARE
    v_connection             UTL_SMTP.connection;
    c_mime_boundary CONSTANT VARCHAR2(256) := 'the boundary can be almost anything';

    v_clob                   CLOB;
    v_len                    INTEGER;
    v_index                  INTEGER;
BEGIN
    SELECT encode_blob_as_base64_clob(blobimage)
      INTO v_clob
      FROM my_images
     WHERE id = 1;

    v_connection := UTL_SMTP.open_connection(:p_smtp_server);
    UTL_SMTP.helo(v_connection, :p_domain);
    UTL_SMTP.mail(v_connection, :p_from);
    UTL_SMTP.rcpt(v_connection, :p_to);
    UTL_SMTP.open_data(v_connection);

    UTL_SMTP.write_data(v_connection, 'From: ' || :p_from || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'To: ' || :p_to || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'Subject: test blob' || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'MIME-Version: 1.0' || UTL_TCP.crlf);

    UTL_SMTP.write_data(
        v_connection,
        'Content-Type: multipart/mixed; boundary="' || c_mime_boundary || '"' || UTL_TCP.crlf
    );
    UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);
    UTL_SMTP.write_data(
        v_connection,
        'This is a multi-part message in MIME format.' || UTL_TCP.crlf
    );

    UTL_SMTP.write_data(v_connection, '--' || c_mime_boundary || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'Content-Type: text/plain' || UTL_TCP.crlf);
    UTL_SMTP.write_data(
        v_connection,
        'Content-Disposition: attachment; filename="' || 'my_text_file.txt' || '"' || UTL_TCP.crlf
    );
    UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);

    UTL_SMTP.write_data(v_connection, 'sample text line 1' || UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, 'sample text line 2' || UTL_TCP.crlf);

    UTL_SMTP.write_data(v_connection, '--' || c_mime_boundary || UTL_TCP.crlf);
    UTL_SMTP.write_data(
        v_connection,
           'Content-Type: image/jpeg'
        || UTL_TCP.crlf
        || 'Content-Transfer-Encoding: base64'
        || UTL_TCP.crlf
    );

    UTL_SMTP.write_data(
        v_connection,
        'Content-Disposition: attachment; filename="' || 'my blob_file.jpg' || '"' || UTL_TCP.crlf
    );
    UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);

    v_len := DBMS_LOB.getlength(v_clob);
    v_index := 1;

    WHILE v_index <= v_len
    LOOP
        UTL_SMTP.write_data(v_connection, DBMS_LOB.SUBSTR(v_clob, 32000, v_index));
        v_index := v_index + 32000;
    END LOOP;

    UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);
    UTL_SMTP.write_data(v_connection, '--' || c_mime_boundary || '--' || UTL_TCP.crlf);

    UTL_SMTP.close_data(v_connection);
    UTL_SMTP.quit(v_connection);
EXCEPTION
    WHEN OTHERS
    THEN
        DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);
END;

The source for the encode_blob_as_base64_clob function can be found at the end of the MIME article.

It accepts a blob value,  encodes it in Base64 then writes the encoded data to a CLOB that can then be added to the email body as any other text content would.

Pay attention to your boundaries and your content

You can think of attachments (or other MIME blocks) as little more than a complicated CSV or other delimited file. As with any delimited structure, you must make sure you use the delimiters correctly so your output can be correctly processed.

Each block starts when the MIME boundary is found and it ends when the next boundary is reached (or, when the email ends, but it is bad practice to leave the attachment list unbounded on the end, as there is no guarantee the client will process an incomplete block.)  In the following example,  I send nearly the same information as I did above, except I have reversed the order of the content.  First I write the blob then the text.  Also note, I have included an extra line of text “here is some text”, but the placement of it puts that line within the attachment area of the blob image.

BEGIN
    DECLARE
        v_connection             UTL_SMTP.connection;
        c_mime_boundary CONSTANT VARCHAR2(256) := 'the boundary can be almost anything';

        v_clob                   CLOB;
        v_len                    INTEGER;
        v_index                  INTEGER;
    BEGIN
        SELECT encode_blob_as_base64_clob(blobimage)
          INTO v_clob
          FROM my_images
         WHERE id = 1;

        v_connection := UTL_SMTP.open_connection(:p_smtp_server);
        UTL_SMTP.helo(v_connection, :p_domain);
        UTL_SMTP.mail(v_connection, :p_from);
        UTL_SMTP.rcpt(v_connection, :p_to);
        UTL_SMTP.open_data(v_connection);

        UTL_SMTP.write_data(v_connection, 'From: ' || :p_from || UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, 'To: ' || :p_to || UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, 'Subject: test blob' || UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, 'MIME-Version: 1.0' || UTL_TCP.crlf);

        UTL_SMTP.write_data(
            v_connection,
            'Content-Type: multipart/mixed; boundary="' || c_mime_boundary || '"' || UTL_TCP.crlf
        );
        UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);
        UTL_SMTP.write_data(
            v_connection,
            'This is a multi-part message in MIME format.' || UTL_TCP.crlf
        );

        UTL_SMTP.write_data(v_connection, '--' || c_mime_boundary || UTL_TCP.crlf);
        UTL_SMTP.write_data(
            v_connection,
               'Content-Type: image/jpeg'
            || UTL_TCP.crlf
            || 'Content-Transfer-Encoding: base64'
            || UTL_TCP.crlf
        );

        UTL_SMTP.write_data(
            v_connection,
               'Content-Disposition: attachment; filename="'
            || 'my blob_file.jpg'
            || '"'
            || UTL_TCP.crlf
        );
        UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);

        v_len := DBMS_LOB.getlength(v_clob);
        v_index := 1;

        WHILE v_index <= v_len
        LOOP
            UTL_SMTP.write_data(v_connection, DBMS_LOB.SUBSTR(v_clob, 32000, v_index));
            v_index := v_index + 32000;
        END LOOP;

        UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);

        UTL_SMTP.write_data(v_connection, 'here is some text' || UTL_TCP.crlf);

        UTL_SMTP.write_data(v_connection, '--' || c_mime_boundary || UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, 'Content-Type: text/plain' || UTL_TCP.crlf);
        UTL_SMTP.write_data(
            v_connection,
               'Content-Disposition: attachment; filename="'
            || 'my_text_file.txt'
            || '"'
            || UTL_TCP.crlf
        );
        UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);

        UTL_SMTP.write_data(v_connection, 'sample text line 1' || UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, 'sample text line 2' || UTL_TCP.crlf);

        UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, '--' || c_mime_boundary || '--' || UTL_TCP.crlf);

        UTL_SMTP.close_data(v_connection);
        UTL_SMTP.quit(v_connection);
    EXCEPTION
        WHEN OTHERS
        THEN
            DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);
    END;
END;

This is erroneous content for MIME, but legal syntax for SMTP. Since the syntax is still legal, the email will send and the recipient should see both attachments.  The jpeg was base64 encoded which produced email content that looked something like this.

(I have abbreviated the jpeg content)

--the boundary can be almost anything
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="my blob_file.jpg"

/9j/4AAQSkZJRgABAQEASABIAAD/2wCEAAQDAwMDAwQDAwQGBAMEBgcFBAQFBwgG
.
.
.
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq//2Q==
here is some text
--the boundary can be almost anything
Content-Type: text/plain
Content-Disposition: attachment; filename="my_text_file.txt"

sample text line 1
sample text line 2

--the boundary can be almost anything--

I tested this content by reading the email with multiple clients.  All produced the same result but there was no guarantee of that.  Both attachments were recognized,  the image was extracted properly and the misplaced text was effectively invisible.  The text was still present but the email clients simply read to the end of the base64 content per the encoding declarative.  The base64 content ended at the “==”, thus that attachment was interpreted to be complete.  If you look at the raw email body you can still see the text is present, but it was not rendered by the clients.  Since this is erroneous but legal content, there is no guarantee as to how your recipients may see the content.  They may get the same results I did, they may get errors, and they may get something else entirely.   Thus it is essential you take care to ensure your attachments are properly bounded and the content between each boundary is correct so you can be sure your email is received as you intended.

More caveats about email rendering

Using only MIME encoded blocks you will have little control over what the recipient’s email client will be or how they will have it configured.   So,  you should take that into account when you attempt to format your email structure, especially with respect to your MIME content.   In all examples above I have used “Content-Disposition: attachment” the other option is “Content-Disposition: inline”.  

  • “Attachment”, as you should have seen already, should show up to the client as some sort of file that can be extracted, the exact representation and method of extraction will be dependent of the client.  
  • “Inline” is intended to tell the client to render the MIME content in place. A common use for this functionality is with images so you can put pictures within a text body, thus allowing you to see the image as you read the email.  However, not all clients observe the inline disposition the same way, they may still represent the content as an attachment, or they may represent it both inline and as an extractable attachment.    In general I try to avoid in-lining plain text as MIME content,  if I want text to be in the body of the email I write to the body directly.  I also tend to avoid embedding images or other content as inline. There are better ways to render images in the body. These will be discussed in the next article on formatted emails.

As an example,  I used the following block to send to different clients.  One rendered the text first then the image, both inline but in reverse order to the way they were sent in the body of the email. Another represented the text both inline and as an attachment, the image was included but, despite the “inline” disposition was rendered as an attachment only.  If you intend to use the inline disposition, you will need to experiment with your recipients’ clients to determine which methods are best supported.

BEGIN
    DECLARE
        v_connection             UTL_SMTP.connection;
        c_mime_boundary CONSTANT VARCHAR2(256) := 'the boundary can be almost anything';

        v_clob                   CLOB;
        v_len                    INTEGER;
        v_index                  INTEGER;
    BEGIN
        SELECT encode_blob_as_base64_clob(blobimage)
          INTO v_clob
          FROM my_images
         WHERE id = 1;

        v_connection := UTL_SMTP.open_connection(:p_smtp_server);
        UTL_SMTP.helo(v_connection, :p_domain);
        UTL_SMTP.mail(v_connection, :p_from);
        UTL_SMTP.rcpt(v_connection, :p_to);
        UTL_SMTP.open_data(v_connection);

        UTL_SMTP.write_data(v_connection, 'From: ' || :p_from || UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, 'To: ' || :p_to || UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, 'Subject: test blob' || UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, 'MIME-Version: 1.0' || UTL_TCP.crlf);

        UTL_SMTP.write_data(
            v_connection,
            'Content-Type: multipart/mixed; boundary="' || c_mime_boundary || '"' || UTL_TCP.crlf
        );
        UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);
        UTL_SMTP.write_data(
            v_connection,
            'This is a multi-part message in MIME format.' || UTL_TCP.crlf
        );

        UTL_SMTP.write_data(v_connection, '--' || c_mime_boundary || UTL_TCP.crlf);
        UTL_SMTP.write_data(
            v_connection,
               'Content-Type: image/jpeg'
            || UTL_TCP.crlf
            || 'Content-Transfer-Encoding: base64'
            || UTL_TCP.crlf
        );

        UTL_SMTP.write_data(v_connection, 'Content-Disposition: inline' || UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);

        v_len := DBMS_LOB.getlength(v_clob);
        v_index := 1;

        WHILE v_index <= v_len
        LOOP
            UTL_SMTP.write_data(v_connection, DBMS_LOB.SUBSTR(v_clob, 32000, v_index));
            v_index := v_index + 32000;
        END LOOP;

        UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);

        UTL_SMTP.write_data(v_connection, '--' || c_mime_boundary || UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, 'Content-Type: text/plain' || UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, 'Content-Disposition: inline' || UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);

        UTL_SMTP.write_data(v_connection, 'sample text line 1' || UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, 'sample text line 2' || UTL_TCP.crlf);

        UTL_SMTP.write_data(v_connection, UTL_TCP.crlf);
        UTL_SMTP.write_data(v_connection, '--' || c_mime_boundary || '--' || UTL_TCP.crlf);

        UTL_SMTP.close_data(v_connection);
        UTL_SMTP.quit(v_connection);
    EXCEPTION
        WHEN OTHERS
        THEN
            DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);
    END;
END;

So, even though it may be preferable to occasionally inline attachments, since it’s not reliable, you may want to avoid it. As an alternate to simply including attachments you may want to try formatting your email with HTML. This is a more complicated body but is a supported MIME type. I will provide examples of this technique, including embedded, attached images in the next article of this series.

Sample Data

In some of the examples above I send jpg files from a table called MY_IMAGES. That table and sample data can be recreated with the following script.

The raw content is a small smiley face, the larger blob content is a photo of a U.S. penny.

CREATE TABLE my_images
(
    id        NUMBER,
    rawimage  RAW(2000),
    blobimage BLOB
);

INSERT INTO my_images(id, rawimage)
VALUES (
1,
HEXTORAW('FFD8FFE000104A46494600010101006000600000FFDB0043000201010201010202020202020202030503030303030604040305070607070706070708090B0908080A0807070A0D0A0A0B0C0C0C0C07090E0F0D0C0E0B0C0C0CFFDB004301020202030303060303060C0807080C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108000A000A03012200021101031101FFC4001F0000010501010101010100000000000000000102030405060708090A0BFFC400B5100002010303020403050504040000017D01020300041105122131410613516107227114328191A1082342B1C11552D1F02433627282090A161718191A25262728292A3435363738393A434445464748494A535455565758595A636465666768696A737475767778797A838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F0100030101010101010101010000000000000102030405060708090A0BFFC400B51100020102040403040705040400010277000102031104052131061241510761711322328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A35363738393A434445464748494A535455565758595A636465666768696A737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00FD8FF8A1ADDE7FC241E3192DBE286BBA0DB2B6990ADADB5858CB36813DACE93CB0DB43242D2DCBEA514C90E0ACB8C2F95B5D80AF6DAA17DE16D2F53D56DEFEE74DB0B8BEB4C791712DBA3CB0E338DAC4657193D0F7357E803FFFD9')
);

declare
    v_lob blob;
    procedure addhex(p_hex in varchar2)
    is
    begin
       dbms_lob.writeappend(v_lob,length(p_hex)/2,hextoraw(p_hex));
    end;
begin
   DBMS_LOB.CREATETEMPORARY(v_lob,true,dbms_lob.call);
   addhex('FFD8FFE000104A4649460001010100E600E60000FFE13A0A4578696600004D4D002A000000080007011200030000000100010000011A0005000000010000086E011B0005000000010000087601280003000000010002000002130003000000010001000087690004000000010000087EEA1C00070000080C0000006200002FE61CEA0000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000');
   addhex('00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E600000001000000E600000001001A829A000500000001000011C8829D000500000001000011D09101000700000004010203009201000A00000001000011D89202000500000001000011E09204000A00000001000011E89205000500000001000011F0920A000500000001000011F8927C000700001DC000001200A00000070000000430313030A00100030000000100010000A0020003000000010B100000A00300030000000108500000A00500040000000100002FC0A21500050000000100002FD4A21700030000000100020000A30000070000000103000000A30100070000000101000000A40100030000000100000000A40200030000000100000000A40400050000000100002FDCA40600030000000100000000A40700030000000100010000A40C00030000000100010000EA1C00070000080C000009BCEA1D00090000000100000DC2000000001CEA0000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000');
   addhex('00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000003C0000001C0000000A00000006000000010000000300000001000000000000000300000003000000010000003F0000000A4B444B30313032495A3635302020202003010001100B5008DB07071200281A1500000000010018011A06000000000139811000009C230000C00F00008110000002010001050000000002000000000000000000000000000060F2010000000100A0AB010010010000590064000000000164000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000688500000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FFFFFFFFFFFFFFFFFFC797A6C6FFFFFFFFFAFFFFFF9879798DF2F4F2ECD3D4CBB575383E708FA0B3BCA799806E6661656B6D6F788C7E6961626363656565656669FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8EDEBEFFFFFFFFFFFFFFFFFE1A5A5D2FAFFFFFFFFFFF3E1D5CACCD8DCDDE4F3F0DCD0CFD0D1D2D3D4D3D4D60001000000054B434B464C3631343030313036000000DC000000000001010000E20A0000000000000C020000000100000000000000000000000000000000000060F2010000000100A0AB0100EFCB01000000010034A0010000000000000000000000000018565300B85553000000000060F2010000000100A0AB0100CD230100000001009401010000006800B40901001C87F6FF00609A00AB420400AB2A080066660900000000000000000000206500D14506005D140A0000006100002005000000030000010000B337000000000000002700005A1C0000B07200000000010000000000000001000000010080367C007C130500328407000CD704008500000000000000BB0C0000060000000200000011000000C00000000100000000000000000000000000000000000000000000000006000000000000030000001608000000000000000000000000000000000000000000000000000000000000001528080000000000000000487F7F6C00000000452C1E1C78807F7C4148586D808080808080808080808080808080808080808080808080808080808080808080808080000000000000000000000000000000000000000000000000000000000000040F000000000000000014080917000000001C0F000023071111010100020203010112130F05060301010202030403030403050202040201070505020405030203050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021002C0011000000000000000000000000000000000060006D007C008A000000000000000000A20074004500440061004F00510068007E008200B100C400AC00AC00A4008E005200210024004B0069007A008C009500800072005A00480041003C00400045004700490051006500580044003D003D003D003E003F003F00400040004100440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000100000000000000000006000400020002000000FFFF0000010006000600080009000900080009000800040000000000050007000800');
   addhex('0800090009000800070006000600050005000600060006000700080008000600050005000500050005000500050006000600060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F9FFF7FFFDFF00000000000000000000000000000000E6FFE1FFE0FFE2FF00000000000000000E000A0006000500E7FFE3FFE2FFEAFF0C000C00110014001300120011000F000500F9FFF9FF06000B000D000F00110010000E000900070005000400050006000700070008000A000D0008000700060006000600070006000600060006000700B3070000000D000000000000EF0F090081FD81FDED00000061FECB000000B6C781BDD08AC2DC94C9EBA2D3FFBBF8FFF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBC782C0CE88C6D690CAE39BD2FDB2F6FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDC982C3CF89C8D48ECCD992CEDE97CBEA9EBBE3A6D6F7D8FFFFFFFFFFFFFFFFFFFFFFFFBFC884C4CE89B8C880AFC379A5B9705F692262621C707B2EC4E0B3FFFFFFFFFFFFFFFFFFBBC780BCC78199A96299A96387904E5B5614585B1658621A8BAA5CDEFFD0FFFFFFFFFFFFABBA72A3B46B90A35A7790455E7D323A4712343E0F4C5D1E728F4794BD71CDF0B4CEFABA93A35C8E9D558A9E555472274D6E234D6D224B6D214B6F25507A2C698E449EBE75BEDC9483924C85964E587A2E46681F456A1F436A1E42691E426820426B2147742A688D448BAF64FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8EDEBEFFFFFFFFFFFFFFFFFE1A5A5D2FAFFFFFFFFFFF3E1D5CACCD8DCDDE4F3F0DCD0CFD0D1D2D3D4D3D4D6FEF500000000640081100100000001030000F4000000F0000000F800000000000000910300007F3600000000000000000000640081100100000001030000093D0000C30000002601000000062E06850000009C230000000000000000000001009300670293009B040000D0070000D8050000B00026012C01CD00320000000000000001016400000000003700000008017200020200000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002E0D070DF70C010DD90C0000741B331DBD226422BC1D00000000000000000000000000000000000000000000000000000000000000000000000000008D0012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007E000F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004504D104D804F0049F040000C1049104F6046604A304000000000000000000000000000000000000000000000000000000000000000000000000000000000000B604A804CF048D04DA040000640545057C055C057A050000000000000000000000000000000000000000000000000000000000000000000000000000000000002D07E7064207E60645070000F9075A0711088C071D080000000000000000000000000000000000000000000000000000000000000000000000000000000000008307C707C906E007D8070000AF07900714081808880700000000000000000000000000000000000000000000000000000000000000000000000000000000000009082B07E8074B071B070000DE07B1076B087708DA07000000000000000000000000000000000000000000000000000000000000000000000000000000000000E707140786078A07CD0700008607B60725093D091B08000000000000000000000000000000000000000000000000000000000000000000000000000000000000EA0537060D060506A90600000F0705073109FB09440700000000000000000000000000000000000000000000000000000000000000000000000000000000000017053C0516052205D60400002F059A050F05FB043F05000000000000000000000000000000000000000000000000000000000000000000000000000000000000EC06C2062307F205EA0600005F06D806EB07D309D607000000000000000000000000000000000000000000000000000000000000000000000000000000000000B507F307F00648072507000081079207F7082B091A0800000000000000000000000000000000000000000000000000000000000000000000000000000000000002080907E0061C076607000041078E07A00815088D07000000000000000000000000000000000000000000000000000000000000000000000000000000000000120876073C07D107AF0700009C072E07E207D707C607000000000000000000000000000000000000');
   addhex('000000000000000000000000000000000000000000000000B807B207EB07630890070000BA071608C40935097F070000000000000000000000000000000000000000000000000000000000000000000000000000000000002C071A07A90754075B0700007D077107CC09760809080000000000000000000000000000000000000000000000000000000000000000000000000000000000008D058A0549056305580500006205C8056705D6053B05000000000000000000000000000000000000000000000000000000000000000000000000000000000000300685060C06E40652060000900687069F06E806B0060000000000000000000000000000000000000000000000000000000000000000000000000000000000003107490721073607BE060000760728074F08EB06950700000000000000000000000000000000000000000000000000000000000000000000000000000000000082074B0844075C07FA0700007507980714081307D1060000000000000000000000000000000000000000000000000000000000000000000000000000000000008D07CE076307ED07C1070000690857080C08F4078F070000000000000000000000000000000000000000000000000000000000000000000000000000000000001608BA07E0079B07020800001B084D0906094408EC070000000000000000000000000000000000000000000000000000000000000000000000000000000000007B0762073C07C2074E0700006307EF079A08F307700800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C004BD04C804A604AE040000F2049A043605DA04C404000000000000000000000000000000000000000000000000000000000000000000000000000000000000EA04AE04C2040805D904000084058305F4064B0713070000000000000000000000000000000000000000000000000000000000000000000000000000000000005007C10696071D0727080000D5074107FE07A108FF08000000000000000000000000000000000000000000000000000000000000000000000000000000000000A807B6079307DF07B9070000B907DC07AE088B086808000000000000000000000000000000000000000000000000000000000000000000000000000000000000C808ED070708AB07120700001408CF070509840992080000000000000000000000000000000000000000000000000000000000000000000000000000000000004908EE07D4077907A7070000880733085E0BC30BF30800000000000000000000000000000000000000000000000000000000000000000000000000000000000020069D068006F405E406000061077107D40C0F0EDF090000000000000000000000000000000000000000000000000000000000000000000000000000000000005205E2043C05F804310500007C0594051A0530056D050000000000000000000000000000000000000000000000000000000000000000000000000000000000000C07AF063D077B06290700009E061008E50B980EF00A0000000000000000000000000000000000000000000000000000000000000000000000000000000000009A07A6077F07B8071F070000FF07CE07F30A230B6009000000000000000000000000000000000000000000000000000000000000000000000000000000000000E8078C07700778078D070000A3070708FD089E08F107000000000000000000000000000000000000000000000000000000000000000000000000000000000000CD072407D907E707EB07000070072F080D095808200800000000000000000000000000000000000000000000000000000000000000000000000000000000000004081C08FB0791087B080000E4074C09B80C4E0B1E080000000000000000000000000000000000000000000000000000000000000000000000000000000000004907E7078907C20708080000E50792083A0C6F0ADF070000000000000000000000000000000000000000000000000000000000000000000000000000000000006E0598056905AE05BA0500004A051B068D0509069B05000000000000000000000000000000000000000000000000000000000000000000000000000000000000FB05C006EC06EA0665060000CB0655077807DD08F206000000000000000000000000000000000000000000000000000000000000000000000000000000000000EC069707E6071707590700003C074F08EA085D073F07000000000000000000000000000000000000000000000000000000000000000000000000000000000000C80784075407F90738070000AF071208E808A4078A07000000000000000000000000000000000000000000000000000000000000000000000000000000000000F907A5077E07F1072D080000D0074C089408C4076F08000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC07F707E3078B07D2070000A709AA0AD60A50081E0800000000000000000000000000000000000000000000000000000000000000000000000000000000000025085E079307');
   addhex('B207D4070000E907BF087B0AC50824080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018012000DF0001000000000000008D00790000000505000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000500050000000000000003000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000');
   addhex('00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007A140100D8090100000001005FBA01007F56FFFF21EFFFFF41C5FFFFF0CE0100CF6BFFFFDB1200007454FFFFB198010000000000000000000000000000010002000700000004303130300000000000000000005000000001000000000000006400000007010300030000000100060000011200030000000100010000011A00050000000100003040011B000500000001000030480128000300000001000200000201000400000001000030500202000400000001000009B20000000000000048000000010000004800000001FFD8FFDB004300080606070605080707070909080A0C140D0C0B0B0C1912130F141D1A1F1E1D1A1C1C20242E2720222C231C1C2837292C30313434341F27393D38323C2E333432FFDB0043010909090C0B0C180D0D1832211C213232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232FFC0001108004B006003012100021101031101FFC4001F0000010501010101010100000000000000000102030405060708090A0BFFC400B5100002010303020403050504040000017D01020300041105122131410613516107227114328191A1082342B1C11552D1F02433627282090A161718191A25262728292A3435363738393A434445464748494A535455565758595A636465666768696A737475767778797A838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F0100030101010101010101010000000000000102030405060708090A0BFFC400B51100020102040403040705040400010277000102031104052131061241510761711322328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A35363738393A434445464748494A535455565758595A636465666768696A737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00F7FA2800A28033EF35AB2B2668DE65694027629C9E3F41F8D61DDF8AA63107B6B723731501F3D476C0E7D3BF7AE7A95ADA44EBA38572F7A5A228B6AFAA4D133E250C4F0A81B03F5CFAFE551CFAE5DC3705236B9099F959C9CB0F5E71FCAB1E791D8A853DAC5F8FC47728A5E3904D1463F78651F9E08C67F2AD9B0D7ED6F1963901825270037427D8F4ADA1575D4E5AB86B2BC4D6A2BA0E20A28020BBBC82CA069A791511464926B85D5FC55717D1C91DB3BDBC247CA57EF483EA3A0EA30391DF3D2B9EB54B7BA8ECC2D1E77CD2D918B0C924CF08794AF95F2ABE4EEC7B1FA7A7F8D68DB8891136A0E7F889C9FAFD2B92E7A6F42705B8DAEC081CF352EF72A55D8953C005B8271C0C517443466B8646DDB7E5279C038CFF009C55F824136E0C8BB98E361E140F5CFAFEBF4E29A959D824AE8E8349D4DE0912CEE5CBC6FC45237553FDD27F974FE78E86BBA9CAE8F26BC3965A750A86EAE63B4B692793EEA0CE0753ED56DD95CCA29B7647966BDAE4BAB5C331761006F9533FAE2B3E362DD8818E17D4579D295DDCF769C1422A28596E1124B743B864B3919C1C0C0CFEB5AD6F7A820DEA32490080718CF734031C9A81915C0289263070738FAD3C4985DD2EE91B079E31DBFF00AFFA7E13A5ECC56B6C292CCC4B82727B7BF4FC2B6AC6C629103FDEC0CF03A516BB2272E58DD1A575630DC58BEC0526C0C371F2B7627F1E31E848AD1D1EF3EDDA6C52B7DF1F2B7D4576517AD8F3AA5E50BBE8CBF5C3F8EF555402C43E30BCA81D58FAFB007F1DC3D2AEB3B405858F3554702D322C8CA0BB28EAE3A9F5C7A54B1E6465CF51C71CE7EBEB5E79ED17E7B269203388D9BCA6CB123A29EB8F7E074A9AD884DA7FE5A10547246E18E8DF8FF9EB57B19EE3D61324477463CC3D15BB7FF5EA');
   addhex('F5B58B2C8CB3CA418F219319E073DBD49A51D5EA293B2D09D9ED2594ED89B29C601F957E807A93FF00D7A7BEA8414318C48A32481CB7E149BBB2795BDC946B33F958F314311C85CE4D6AF8426DE2FA3EC24DE07619247F4ADE83F791CF88828D3763A7AF23F115CA5D6B77C66DD812C8831DB6BEDFE4BFCAB5C46C8C702BDE6CAD696915F49E4DBDB3999D485CE7E56C8E7DFBFE75B5776569A6C8634F2BCD0A4614EE0ADB8E0F4FEE81D79E7DAB9743D0727751284F7AD3BB289F0848DDF30C0183C7D2A88BA45930CC14A9F948E327FA546ECBD958B8978D23088156C750DC151EBFD78A626A11F98D2461CE09C6E6C0CFAFF2EF5765BB22CF64352FC85755908DC30C40EDE9EDF8535EEFE7CA92EDFDEEB525D8920B832B3166CB31C6075AECBC0A3CCB7BFB903E479FCB5F7DBD7F5623F0ADE87C47262DDA9B3ADAF22D42C649F5FD5215C7991DDC8719C70C778FD1856989F85330C0BF799AB0F91A0D9C92970D70C309B739EDEB5CDDC5D1B8DCD9C31E093FCEB8D773D18EED9599811B0700FDDCF19C74A81DDA53E4AA7FABCE463922A96837A8EB2D40850A371740470719FA639351DC5C484ACB90C87F8D40E467BFBF6A609752FA4F68D1DA28683CC903093CC919515B9DA5883903E800E9EF86C7776859930AAACB90D248C318639CE3F8B1C01D3BE29DBB1241F6E31420A2EF958F9712F42CE781FA9AF5EF0B59AE99E1CB3B61CED4C93FDE24925BF1249FC6B7C3AD4E3C6BF712358C98AF28F880D2685E2CB7D5578B5BF8C47231E8244E067D3823F33E86B5AF0E681CD849F2D5473BA8EA8F72013267390A09FE23FF00EBAA0F74002B1B6E217927D735C518D91EB3642B78ADFBB62DB58608E9FE7EB50BDD3452289F12089C286C7250FF00FAFF004AA15FA8933B41383B880CB90CBEA3FC8AB4976509750A55802EA46383DC7B67FF00AF49AB949D88E475624C5856EBB33918F51EDEDD45316651B8B3E028CB31E8B42417373C2168359D61266565B4B51F331EC0F6FF0079BA7B0C9AF5F4D414E31803A003A0AEEC3C2D1BB3CAC6CEF3515D07C978077AE73C516D6BAF68D3E9F72400C331B919D8E3A37F423B826B671BAB1C91934D34786DC5C5D6837B2596A11E5233F788DD81DB3EABE8C3E879AB29790CB133ADC28600951B772BF049C30EFD0631F522B8670B33D7A7514D157ED68C71B80E391D0FE5514F75E63200549C05DC09248078C8FD3F0A496A3E6D090DCB328576002F2327A8FAD491DE1936A24818AF418CE47A0EB49C74294B51EFAB5A58B1DC5629003948BE66048EC3A27E27F0A82C3ED3AFCEA142DAD921F9980257F0CFDE6ABA74DB7764D5ACA0AC8F4BD2AE2DEC2CE3B5B55D90A7BF2C7BB31EE4D6CC5A9FFB5FAD77AD158F22576EECB13EA679F98D64DDEA5907E6A0491C8EBC2DB528BCBB88F257EE3A9C32FD0FF4E95E7B79A55D59485ED252CBD7E4E0FE2A78FCAB29C53D4DE12712A1D52E631B278A3723BB02A69575A0060DA8C74E2520563C8BA1D0AB77429D6198623B3841EDB896FE58A5DDAA5E64333221EA000831F875A1410A559BF22E59E8E818198F987FBA385FFEBD75366ACA147000E00030056D1563094AE6D5BCC500E6AFC7764739AB322ECEED9EB59972EC73CD0C119173CF5AC7B951CF152CD119D2F71DAAB144CFDC5FFBE452B00E04A9C2F1F415247C9E6901A56E06056941DAAD125E8F8E956149C1E6988FFFD9FFE200754650585200000100020000019C002F00050045007800740065006E00730069006F006E0020004C006900730074000000000076A8002F000500530063007200650065006E0020004E00610069006C005F0062006400300031003000300036003000390037003100390061003100380030000000FFE201AB46505852000002000000000000FEFF0000000402001060615654C1CE11855300AA00A1F95B010000001060615654C1CE11855300AA00A1F95B300000006C0100000A00000001000000580000000000001060000000010001006C000000020001008C00000003000100A000000004000100A800000005000100B400000006000100C000000007000100D8000000001001002001000002000000B00400001210000001000000010000001F0000000C000000530063007200650065006E0020006E00610069006C0000004800000030020010C06FD011BD0100609719A18012000000010000004000000000A7CD501BF6C2014000000000A7CD501BF6C2011F000000070000005000690063006F0073007300000000001F0000001F000000500072006500730069007A0065006400200069006D00610067006500200066006F00720020004C0043004400200064006900730070006C0061007900000000001F100000010000001F0000002F000500530063007200650065006E0020004E00610069006C005F00620064003000310030003000360030003900370031003900610031003800300000000000FFE276B74650585200000200010000F2F5FEFF00000004020031020010C06FD011BD0100609719A1800100000031020010C06FD011BD0100609719A180300000007876000007000000010000004000000002000000480000000300000050000000040000005800000005000000600000000600000068000000070000007000000002000000B0040000130000008002000013000000E0010000040000000000803F1200000003000000130000');
   addhex('00000000004100000000760000FFD8FFDB008400050505050505050505050505050505060506060506070606070606070807070808070708090809090908090A0A0B0B0A0A0B0C0D0C0B0E0F0F0E101110141417010505050505050505050505050505050606060606060706060706060709080708080708090909090A0909090A0A0B0B0A0A0C0D0D0D0C0E0F0F0E111211141418FFC000110801E0028003012200021101031101FFC401A20000010501010101010100000000000000000102030405060708090A0B0100030101010101010101010000000000000102030405060708090A0B100002010303020403050504040000017D01020300041105122131410613516107227114328191A1082342B1C11552D1F02433627282090A161718191A25262728292A3435363738393A434445464748494A535455565758595A636465666768696A737475767778797A838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FA1100020102040403040705040400010277000102031104052131061241510761711322328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A35363738393A434445464748494A535455565758595A636465666768696A737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00FB2E8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28');
   addhex('A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A4240E49007BD567BEB38FEFDD5BA9F4322E7F2CE6A255210F8A708FAC92FCCA5194BE18CA5E89BFC8B54566BEB1A647F7AEE31F40C7F929A8BFB7B493FF2F89FF7C49FFC454FB7A3FF003FA97FE071FF0032FD8577B51AAFFEDC97F91AF45662EB1A63E3179173FDEDCA3F3602ADA5DDAC98D9730393D964527F2CE68F6F46F6F6D4AFDB9E3FE6274AAC7E2A7523EB16BF3458A28041E473F4A2B5DF546614514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514848009240006493D00A1B495DE8900B47EB5837DE20B5B44B86B782E751FB344F2CAD64AAF0C5B14B112CC5822E072D8DC40E715C4A78BEE2EEF02DD9686DFCB91A3B5B19BCA9657006D5F3890C580E700AE7D0D71D4C6D285B953A89FDA5F02D6D7E6D6FFF006EA67750CBF11593972F2462AFEF7C4F4BD9477D7CEC8F4AB9BDB5B45DD737105BF1BB1230C91EA17209FC335CEDF788ADE05CAC17F3864DE0B036916C61F2B86203ED6EC70457995FBBCC7CF983C32CD34ABE54B2BBC862508C8CDE665B3F315CF42471575668EE34C8A693509E7D463B7FB2B5BB798C91C238FF005921DA338042AE6B8AA62AB49AE694609FD94AF67DA5CCA49E9D5289E9D3CB28D35194DCEAB6ECEC9A4BD39754AFD798D793C5EE0FEEB4BB45DFCEE9E56B923AF7C27359EDAE5F5E4EA6396DEDE4D8CE9E55B43862A46F53952C49524F53D0D624563773E4AEE5551951B9138CF070707F1AD4834B96D8EF9248D582151B02CC46E52A4E7A038279CF1EB595E5FCF2B7F2B9C9C7FF00016EC77AA3429FC308F35BAFBCFEF7765B7BF9A389A5FED131AB0310489C00D32336EC85E3008F4EAD8E0559B19E2FECE7BEBDBCB95093F92AB098247C6DF918C6EE199430C11819CF5E2B37FB1C491AAC7708C18EF1959B284FDE2EAAAC39E32453CE937DE4FD8CDC59B428DE6008C19B78C8237F95E600739DA5B1DE87CCADCB2827AEBEEFE52BA6D04941AB27CBAABE9D16E969F98D9356667550B6ECB963BE4861DA0BE0B050F1E40CF1D69D6F2C6CFE5B44CDF2641B6B99A12A146ECEC3E647B40CE47967EA2B12EF48B9B695FCC0CA72AC09DC232ACA4E54E3279C6738A4B78DADB3712B31050C6AA8CC595FF84B0C6D55E304E49C1E01AA729A69CB54BBB6EFF7DD3EFAA65AA74DC7DCB59FF2E8DBF5563BA5125A44938BAD42CE2961CA1921250B28DE9896368CB6E1DF67E04516BE29D46DC9FB447F6BB741932C5FBF3803272B12ADC2E3072CF0941DDAB8F8EEAEEF664B5925976B3EE0AF2FCBD0B0281C85002E7180339AD5BC96C96C87D9DE1F3EDE416F0082D5A079E35059AE1A52DB89EDC807A50A779276709FF343DD7A79C546C9DBB3EC734B0D07EED58AABCCFAC6FCA9ECEFBFE27A1D8788ECAF07CFFE8E720062C2588E7D254E3F302BA0043004104119047208F506BC2C89268D6E25DF1486525A681FCAB97E01F9C91E5CD9084013C720193B715BD67AA6A3A546B7125CACD6825F2D9D7CD685148043DCC1B09B70718DE85E31C65D72057552C4D64ED2FDF4757B28D4EBB25A4B6DB7EE7057CB21BD297B36FECBBB85FB296EBE67ABD158FA6EB36DA861388A728AFB198157073CC4D9CB818F4079AD8AEEA7561563CD095D75EEBC9AE878F5294E949C2A45C64BA3FD1F50A28A2B42028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0029090A0927007AD4734C902179090338E39249EC05717AEF8AE2B0696C6D5D25D55B2918257ECD6EDC9C3B161994283C7F7881C573D6C4428AD759744BD0DE861EAD792508B7AEFD3CF5F23A3D4F59B3D261F36E98877388A04C19A53CE36A646064724F03EB5E51AF78BF50D4BCDB54DDA75AE423C4A4F9ADD33BE5C29C13D80518E0E6B045DCD7575723536F3A593E68E7BC2C4ABA7CC6372482BC67615E9D302AB5ECF1DCC76A046CB3C6AEB24ACC242E377EEC16C976DA3E505892381D057975AB4EABB5593E5BFF0F4E5F9DACE5DF5D3CAE7D16172FA3876A4E2AA54FE77B2FF000A7A7CF734B4DD41FCAFB0DCDFCB6366AF2CE5A30D34371BD0E11E25652588C29C92A401D39ACB768DE432200AA24DEA00FBBF3641C0E87D3078AAA408D82EE0E4004E53280FA1C93CFE5EF5A16F0C677336C0A1867BE38C9C745C8C9239AC15B56AD14FE57E9BF5D0F46C95DEAEEFB2DFB9659EEEEE605A59EE5822C6ACE8776D006C500B1236F6AD94D29A1C7DA58F');
   addhex('9AC3222460368038DE46467F0FC6ABCB749B55226BA264081A4691C3150028076B0CA81C05C9152285C28DCA1943E79396C03819C8E3A9EB9E29DD2B72A56BEEFF00CBA19BBDAEF45D9161628D4B0032DB7191CE0E78C96EF8EC0D3A22EAB9794AB22EDC2A9C9E98E7D0FE351C2CB345B41DAD93DF249C6394CF3C8CFB66A5F302C43CC70C4905701700E3383DC739A2EBCBAFC992EFAAFEBD48CCF306E240A872DFBA247CBD06EF5CF7C8A9D6660CEC772AE634F9065416C8CE01049040EE734CDBB80C9DBB80C01C0C6738C81C75CF7A5F2C1E154672A08C061BB9DBB893B477E06323345E36E8BBE82B1696EAE618DB1289239300EE50F1EE07A159148E091CE3A9AA970916D53318119CA8F32285304B720308F118048CE47CC3D0D3844E524669DE252724233EE1B7E652A3014ED39239A75F959A280CB2CF34B87334A931712609099531854C0CF773E98AA859F3252517AD96B67F2FEB627E1927CAB5766D5AFB7530A40126259773FCCB82C4286520ED182C4E78EC0734F2EEE512567786366708AE1C4418A9708B9C265B04FB81E94B2E426DF30E073B493CE41F9BD46171838AAB940CCB181B95480483BB0BC77073927AE2A64ECFE7FF00034365AEFF00D799D0EFD3E3863B837135D5C81816AD1158C11C9667CF727A286E98C8CE6AC5A963334B348D6BBD2494C6B16E8C960C56311B14C238047538FA573AAC59D3E6925DE00504B3229FBA01246073E9E95BC9747EC4F669159C8E6605A560F24B1B9258EC7919B68621B3B140E4FAD38D45A26EDE692E9AA5D3D2FB99CE9B4BAC9B6D36EDA27BF4B69E9A9349692DB33C9A65B8F3A2C39B3B79D446EB8561258B2AAAA395663E4E42337431B290FD8685E214BE4820B83895D3F7723654C85782B223282928C1DCA79C8208078AE66D34F9C466E249D2DC6D199A66652D27CDB523F2F2495206E0B9DA01040CE441770B25BCD7F6F0AA5C22457D750DAE5E595640AD34C123CE2EA366264C7CF26D39DCC173D90739495483B5676B3D2D513FB3257BB6DECFAB7BDF5382BD2A5563ECE6D4947453EB4E5B6EF75DD743D628AE7741D5CDFC22298319514626C1314ABD887C005F1D71C1EA322BA2AF429558D6829A4D774F74FB1E056A53A15254E7BC5EEB66BBA0A28A2B5320A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800AAD777496703CEE0B6DC0545FBCEE78551FD7D064F6A96596382292695C4714485DD9BA2AA8C927F0AF23F14788565DC88CC934A079432A7C8809CA93CE5657182C0038F5E0573626BFB28F2C6DED24B4F2BDECFF0D0ECC1E16589A9D5538BF79FE88B1E23F16322B5B594DFE992A959E68C92B6E9FF003C623C1DE71F33707DB3D3CBFCC79B28CA5B736E25F924E7AF23F5E6926937004B72DBB71DA0027273B780B823F9D46B2471801B706C0E768231B861B2581E873DABC87277936DB93EBF8DBBDAE7D4D1A30A30E5846DF2DFA7FC31A26E3CE08253929118B7FDF7253EE64123A7427D29B9215580DAE4607420F76C81923827191DB22AA2B34CA9F2738665DD852549E42907A93D3356B8420AA988A9C307397619C61B0792071C003D6B37F7FF005B1ADACC96351BD005072C0E7381D4633B7B83D49ED51DDDC08E548A142E609159D17953E6303DF07EEA9C75E78EF5623963DDB33BB0DBBE63C3B1E47DD19FC326B2E69D65BC95634CBDB8456DC5922CB64952F9CF1B793CE3DEAA3B5EDB875D5DACBFAD0E8A22B7281995E32586DCEF1D3E663B781C11D735A91ED758A2BA553216DEBB0907E509EC092475C1F6C1AC349576C71C20BBE763A0C994B338DBB47078C1039E456DC4599E69E495D218446C421018E41F94B16DA01C023827DB02945A5EBD35FBFF00A6672F9FF5B58BE3CA91D42C4A483B43AC7B82919627380493C8E4E38E951F94327CB52DD3E461E5F0E705816CAFB633FCAB3A7D562984A8A8C9146DC451925DCF1B8925801918C1E0706A28750B8B8F301DC220DE6791D3040F97A927214E491CF38AB77B796DB7F4C849FF00C0B9BF1F962396268F259F7ABC659C2AED5C22ED3B383CB1C13DAA159E1C0555DCCC5A300EE65F538DBC1E47527D6B3A49DD90C670CCC1B74AC49E7036850187037707EB598B6D216CB9C062195B20E40230A4907AFB1EC6A2DCCB7F3FEBB0D43BB7F79B4D76CF195854145600E4153B8920E18863D307FF00D552DB46CAF22319258E51B99882A06C60C0E14B90C173C8DD819150A35B452D8C533A4DE63BB48D03A99204882ABFCCC0C6AC7955E4F724738A75C5DA4B24C96C30D6ED20455995FF00728EAA086648D990E771DA18FCB9C000D0A1B4AEAF16B477BFAAD2DD3B8397D949D9A7AF4FF3DC04B1C4D98D020620063FBE91578DC376D18CB743B14E3D6A097F7A436C90F180228F7966C9CB1390E3E6C67249A8030F36363961BF2CA858614609F9B69E383C8C9E2AD44E88C18C71824B45B99861BD3860DC1207240A5577BB56D75FE997156E9A89E53C8AA1D988042901D9885E3A2F238E9D4FD2ADAC322A32A267CA6037B2E4F24E4F6C91F8E39C55AB0B72E703E45C0208FDE6492000D8000C8E3A7A5741676FE5B2BAED42A9B4672C7247DD209CFA95');
   addhex('1C75F5159ABB7A2D9EB6B19D4A8A09ABEA52B589C931CB36F68A356CFCC70AC4B2EDDDD7693F3600F4ABC6C6585C5C46490ADF32FDC27E601B691DBE6049E9EB8AD1863112932CD070D13AB07D8036E7CA00DC0E0118CF23030315BD12C4C8BE60566750DF2FDD2A47192BC7438EBCD74D18ABA8B695FD0F33118B707751E68BD1DBAE9AF43CDDA36D22FADE4B7902D85EBCD736B1965896CEEF6466E215E1818651BA4455C6D01D4615067D36C6ED2F6D62B84FE3452C3D1880483C0E45733AE6991EA36175671048AE964FB459CEC4058EF203BA267C6E2AAC098DDB19F2DDB1D6A97856FF0032A4603AC37B1EF50F9F966440D229DC8A723238393F3609E2BBA32F67569CD3BAAAFD9D5D2D69A7A4BFEDEDFD79998D78AC4E1A53FF0097943557DE54ED7D7F1FBBCCEFA8A28AF44F1428A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2A9EA17B1E9D65737B37DCB689A4C0C02C7A2A8C9032CC428F734A52518B93DA29B7E8B5638C5CA4A3157949A49776F44721E2DD662891ECD5C8580C52CDB0FCD24CD930DB6DC1C8270EC79C003835E21753C92CF249310E1E4F30B063862EC71C1038E70323803A56F6B93CED6F09BAC473DC3B5DC91E4F98259FF007837E467843EFF007B15CB2ACB2AA11B8C2982766475215464E3F88838E3BD78552A4A529CE5F137F725D3E5B1F5F84C3C68528C23AA5BBFE66F77FE44F2CACCDB0282570DB17191B7190092540C77C1E94C10C8CE1DFF00780F0739F2FEF63059461F0791838F7A8F72441D412F2632163DBB41DC30256E00C0E7F8BB76CD279136229A51E52C8B942CC137A2F5C06E7249001CE09F5AE7BFA6DA7FC03B6CAE5B5C5AB930CB223A1DE5BCBC15C1DC31B9CE1863A647E95379D1BA050444F239604E5C28C96EA412724EDE73D7BE2AA4E524611DBD9C96C231BB0E4B1705BAC8C0950460E00F4A75B79AAF9C1E307F749C67EF1E4FCD82BD7240208A15DA4FAF9DBF4B89A5D77346287C8DAF2EE7F6C151800E401F78751838233CD72CB3A4771782FADD8B26A0B1B4D1B641FB4BB3C523A860CBB58A8E01C03935D398CBB26363B3A11F2ED246EC12494F97A91D0B7D38AAD7A9158DFC73CAB1186F2CA50B26D9194DD4215373ECE03146046428213E99DA1B3566DB5D37DF5FC0CDEEB54BD56832D51924132178D6378ED9584F119159F12EE656FDE15C107705C67BD6CDADD324E2D2E1815CA3AC8CAB965E63941277021182F2319561D7AD6459DB3B79070A55104C855824923AE03A18CC9B9836783F2F06B61208EE60B76B694C1342CEC8FC398FA00AC8487C3EDDACADE808E79A5F13DE37D2CFCD7A09DB4DCB0F1BDB6E0F1800B068E41820E47CDC062300F7E87381D2B39AE278DDD844CDB88185608C32BC16041E8C074C71DAB6C284B4D9218E2BCF3583410F2153F76CAC5D822B2B7CD8DAA3A1CE0F159B84964609B76374DA32EA318277E080D8276E327393449C5692DDADAFFE411BB5A6C2FDAFECE024F6F2A4F1C98963224CC6C065B7A90AC3A8E76E3BF4ABD0DC799129C7C8C18EE3DFE6C101BA673C1E47D2A14863811CAA076F2CB492CCFE5924BE30A3736E9319623241E3818AA10A859E492357810FFA4165709F34455405DA0B024B3313924E077ACF962DBE5BDD74BDF7DB5B5EFF002D47D3A3F3FF00817375B0248D9184677070892E5B00E549C2A9192700103E9C542D218E557DA8ACA18F03EEE0E305801EA0E00C1047154EDCCD24D25C5C8263918ECDDB7785C9DA1BCBC8C2F000C939E0D74DA4DBDBF9927DBDAE6E6231C851ADC2C61642DB57E59010005639624F38C2D5421CCDC5CA3793DDF6F9762253518F372B692D92D6FDB528C91A845B887CE845C2852A9F298E5DA090776DDC8EBBB69041CE719C1A833133B149236DB2B8393B8039CEE54C2E17209C32F19E4935D1EA5610CD1DB2E9F1AD9F93E6167927791E62EAB82576851B4063C0C7CDC0AAA74D3039919E290181433B03BB27865C0627728E4E4F20E78CD5558A4D2E7552C95E4B4BBEBBA4FA934EA45ABFBD16DBB45DAFBF95D6DB6A4F691CD16C9320464970590ED73C02BB98F6E067AE4FBD7456D342CD89581319F2CE015525482000080C4103D6B234D6B640F6D2E5D5594C24BEE2B1B6E0C19C1237039C1C83D88A4BEB9F218792CEDBC998C6189512310738C8CE4718C8F63C7392BAD53D7AAFE919545ED24E0D34FA49591D5058660777CCB13162A4E1959D711BAB0233D0A927A6EAB314FF007630863568D7196FB8142AA80391C1C1C1FAD7130EB2F146F14B93B5C85E0AB2ED0490430193C8C641FCC73663D5A109E66E62D9DA85D3694241CF463D8E01C0E319ABF69A2567177EDE6724F072774F55F675BFCFEF3B0BCE4290A18BF0D8DA40E38C86E0E781C579E5B4ED67AF5DC7E64A7CBD5EE2F218C8C6E4BDCDC2FA008A25DA3209C463D6B467D45E4C832794003B382C38CB0562AC0825724679C76AE5F526496F2D66460F398A38F0BF301E4CC76B2F21882B21079E303F1E872E7A725D55A4BFC4B4BF7D5366986C3BA69C25EF2945C5E8F6DF7FC0F728DC491A48BD244571F46008A7D65687319F4AB290E73E598F9EBFBA768C7E8B5AB5EC5397');
   addhex('34212EB28A6FD6DA9F37523C95270FE49CA3F73B0514515640514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005705E34D5161FB269BB0488E1F52BA5660A1A1B30648E3E411F34E10FF00C040E735DED783F8A6E85C6A7AECF247BD566874C452C0FF00A998798701811C443FAF5AE3C6CDC69C629DB9E5BFA6ABF1B1E8E594A352BB9495E34A0E5FF6F3D17F9FC8E2F51D527D4677B89DC48D34CD305DD8084820807038C703D3A557BDB9F3238E08DBC88A352560562D891B962CD81B8B772147E3515D59BC50DA970A04B17DA558392CC849C640270060F0403C73914F5D3666322ADBC6CD6D0ADD4DE748161484B46A8F23B322AC659D47DF1F7864F35E5495DE9B2F9EDFE47D546D15156B5D5BC97919D13C89F282D873F7029746750CAADB7904F2403DB3DEAC233DC4C44CC542A1DA4273C1270157A1CE49E41C7E5575349BB67B88963F2E4B5805CDCE5A33B610C9F3B3330431EE75C1DE410475A963D1AE5E59C49E545F645F3AE1A69A288451B1440ECC4AA042D228C8206586719A4E37F2D3EEF31F32D55FA14D0B45E611842E817AA9C2649DBEA09619CF5C70315A508C3447CBDC3CB2C3A97393B81232C471C00473F5AD14D25ADE45844B125CCCA40F3A78230149520DBBBBE1D9C15395C7CA71D09AD787485B39ADE1B82239991E431F9C85CAA12CC542E4B6D43B8B7CD8C723BD4DB76B6DAFF95C994969DDAD3D176324C8D2488CC598ED4DCB1A2C18088B1AA0D8B8C04503EEE49E482726B4AEF48BB96DA0B8473144AEE8E8A818CF14D1E1CC71B14E621F3F5C9C151D6B567BA82DD1628C4853CC6977485915506D8C385CAB00581E71EE0600AA97BAAC71470452C7733486409208E3192C31B5628C120800EE67618201356A5CAEFE5BBEECCBDE95B955B5FC0E49239CB225C5AED9ACA696059A16552CB23068623190AED84F98104804F23279D70CB023AA05452D9504E0E40C0206E0339CFF00FAAA1998992631E14E40C394F3085E00F3142AB0DAC141EB91DAA297695308F97692DB9C6DDF8C00559BA2E0AE3A678A87352BB8AB2F5FD4B50E55ABBBDFD7BE88B8C8F7B17EE491790100071B449B70420DCC4F2492ABCE3DB3496D6E11A3F2646139558CACC0C6ECF9562491B908233B4E73D38151DB5D7D9D183A962CECD801642AD8F94918EA063048E38AD88E68A6134322C8EA4EE57558C950A7950CB99170133B89385380685EF2D7A697F5FF00213F76F6DBD489E25BA0232A4DC34BB1148D8C39CFDE271C1CE471D8E6AF45A2DCC966D736E152379632236651B4282E5412723710A7DF683CE0555911275B86844B10016430CF22B48A620413D41F2CA8F9B3B89DA453659673026E22389A50EC67271B91997F791A333AFF0011000270334B55BA725AE8BF5FBC9BDED66A2F996EAFF85CD7B57F2EDAD1218E19A49A5F32E65922DFB595950223B23050A09276E73DC1AD6BD997CF8F4EB7F25D6232B79BF655B41D0B2AEC46DEC808C83F2EE273B7BD7062F42EE30AB6FB762F2943B999598E0A2123A2F3824924F15B570D72D6064B8FB4BE9E66F2E179B955950162150FF16C0F9E831D719AD69CE4E2E1C9BAD1DDE896EECBA6BA99CE11E78CB9B5BBD1A5AB7B6BDD7406D46659B6798205C26E78DF72E7E600A01B0A8CF18C93D73C1A7C0EC64467125CF9CA4804ED8860072C9B03125467A824E718AC23246DB3CB49A45219BCC6DE46571B98A02A00030320F39EA0D6DC9A840B64B6E659A421373E42450AC815958A3EEDF206248519C104679ACFADEEBFAD3A9AB5A2B2DC7492C892B07856270A1564762C06FF009F05725011C1C64E33CF3CD5569C1914022621558E0E5F0081801830EA71B883C63A5671BC5FB38096ED1A339F319E30DBB203637B727207CBC7D3150F25C3284058300ABEB9E8C5892339C8ED91CF4A9D5BD6FAFF009D8AB2FEB53519D98AF9C1923CC9921949C8C606DC83DC039EBF855B865B78C113472CAB164FCB325BEEE542B6F68E5C838C9001FAD66473C2046ACD2391B9892EAAA246C1E081938EB838E73E9CD69E75924DF90EEB2E72E4B679C905B7153D3B639E7DEA937BEEC4D5F4E9E4DAFC8D9798189D941019C9518C81827081B20B1E7AE074AA5338F3AC9F241105E96E58619638C30E06428F623200A6349D766DF972E417628B9C70091EA3D7D3D29972F2C4D04CCAC42D84D323E339127EEF7162083BB91CFE75B475BA5777FCDE8B4F999BB2DF4B27FF00A4B3D83C1EECFA245B94295B9BA5C03B871331E0E4FAE3A9AEA2B91F022B2F85B4B670434C2E67C312C712DCCACBC9E4FCA4575D5EC50FE143E7F7733B1F298AFF0079ADE5524BE69D98514515B1CE145145001451450014514500145145001451450014514500145145001451450014514500145145001451466800A29293340AE3A8A4A5A061451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001D393D057CC1A8DC9B9B59EEDFF0078D7BA95FC85559637F37728424B6063E566EBCF72326BE97BB62B6974C3395B795863AE42135F2D48DBAC61C22A9DF76410595A2CDCE40EB8C8C8C67D79AF371EFDEA6BB27F8BBFFEDA7B');
   addhex('993A56AF2B75A7F77BDFE65EB99ACAE92CC1736D246F6966C932991520DA5A5B9DD1C6418D5BAAAB3498270A7BCF67776725DEA705C39B58AF2E6DA34BF685E78D2CED6612B62DF76E632AAA20564C8E7017208C0DACE1901D991872C73B7DD8023238E87A9C539225C8557276B1249240246074E800C9C6335C1CCAF7693F2DFB5D3FEBA9EFB4ECD5DAECFCF7B9D4D96A10BEB3A889228DED6FC0B349AF632D64209643CCB145708D1A801781B8AE38C8AD1D3345BE9F4FD6AEAC2D63B9BB8A3821B6B798AECB944921B9982EEC022589648D4EE4DAFB78C567E8FA4BDC5C88B7728164776DACBCE540E581C91EABEB5EA6F25969965B2011ACC0441FE6456DC08CE0306CF048C12319C528CE2A3776B46FBBDDBD3A1CD88A92A6D469EB527CAAD6BC524D6B2D4C5F1069626B7D3C41696F68E974B3CFB1A355B78E0B59834711279DEDB542A9E73581A9C8D7AF0BA6E32DB4FF00691248EA822F2449E692E5D4132C619061B2C5C0E49ACDD43577BA25A547545380C870E645DC9863C8C60F3CF61D2B20DE623121568E4F314A847382A0EFF9B27231204DB8180467347B4E6F79A69395DEBF32A9D2946314DA94968B4BEB2EDAEA6B5E5DBDDB4D72E8D2BF9652341186860B78CEF288899F2D57F8428C649CF24D62BB2CE62E256404ED243AEF66CB1C2060C147F08CF19C915426BD9EE32C5A65070C4B1DE4024E3CC3D012A4B9E73F8D4F3DEED8A22CDB7E50CAB0A10538009321525816248C8E31C75ACDB94B45E7F79D0A2A0ACAD75BDBA7922EDC46B1052CEB1C0154797111BCB2803EFCAAFF003B124F5C63B5508AE897682E76B2A18C89324305C8E8DC0E060F391EDCD57BAD45EE51239826FDE6413705B615036193070B92718C60839246310CAAE3058ED460DB54608529DBA655B69C2E4720D54236493D24FAF990DF55B5FF00ADCDF72F6E0F967CFB7661877218824ABE1F691F282320A81E9CD01D65422D0959A1E44329E5C0E782A46F3923190181E9915CBC378F6B26496F2CBED28A482BB88E48DA430C1048C0E9D6B41BF79892DCED8CFDE40E5CA923AA91D8E703BFEB4F5836BAB5A766BD04AD2F55F7AF5EE69BDD490319D43B246FB6400AE1A5917795C3127EF2F03209C1EB5A17128B686179E00E6601E349B39F2D4939DEF08CEE51B46010724F354F4A9BC8C5CBCF033893F773C64497306DC6E53183B993079C6194F208C551D46D312B5C47746E95819B281FCC61237CDB8B90E4EE273C13839C9AB8B8DF4F8FFAFC4992BBD5FBABAD8D0179030674B57815A27DA91C8CC9B4C8BB449BD7732A0C81821BE6203714979A81BCF99A28E040984B7B54FB3DA42C301B601BBF85724FDE6CF2D58114B0A7FAC8DAE0F3857628A7AE19947CC36E7BB1CFB7795EE9FEFEDDDE67EF18856CF5ECD9CEDDC381D39F6A25396B1D7CFA5FD46A115AE975F79AFF006958764916D5C758D5BCD31838C06DCA15B2412AA3A7734924B04CCAA2521D4BBBC92E0A7CCC1808D1173C6EC6DEA0E7F0C45661BCB36CEA0058F76F6C1F520FCCDB79C77ED565F645E486D9BCA0CC61F7380724339C61411D1721BBE2B36BC9DEC5DFF0367E451F7BCC90B1E1A50555101C058FCCE3FE06DDBA1AAB35E0655042AECCEE110F2F241E858487B0E301467B567FDA245C103CBC295EFC2303CB0E1981C9CF34E4E1012C91C6436031DD96F60172381C1E7078CD2B35FD5AE1F8961A78B7261CAEF0198151F2904E00C6E27DF38A7DB85794216C820B286E7A2EE3C039CE477AA7B970725D76A6D3D06790C015E0919FA53ADE499630E485462C719C367033C1E703FAD559AB79E82FC8DE128280C9B13706E540F988C6EE0F249EA38EBD7359BAADD18E29CC6DB0FD9D6CE162A4E58C67E42086FF0058EFB3006012338EB53DAC819C34AED1A26657CC81F78E3276EE19EFDEAAE8F8D67C67A1D9ED630453CBA8DC1054E05B06BA1BC0E9BA448973DF35BD24D2724AF6D77DECEE97CDA473D469295F45CAEFE96D5FDD73E8DD0ED7EC3A369567801ADB4FB585B03037A44A1CE3DDB35AB505B8223C9FE26247B0E83F4153D7B34E3CB0847F96297DCAC7C8D5973549C9EF29B6FD5BBB0A28A2AC80A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A293346680168A4CD2668B0AE3A8CD3334669D82E3B3466999A4CD3B05C7E69334CCD2669D843F3499A6669334EC04F4669B9A3353618F06969946695863E8A6D2D20168A4A5A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A006488248E48CF491190FD18115F28DA90F6F2413901E0BC96062182E18852D9F949FBC3A0EBC139AFAC6BE56B8CD878B7C45A748E512E2FAEDE260A0EDD9712DC440739C9466E7D12BCFC7C5F2C64BA465F859FF0099EE64B25CD5E0FAA8497CAEBF545730FEF4C022913E7460251B8B13820E4633D4F1DBBD6DDADA6151DE291958C6EBB97EF12635202E33F331E3DCAE2B6D74DB3BA4CCB27948ED1B398DC1224230D860C02AF00E73D4738AE92D8C50241988B980C8E1D482D831B460B1CEE18006E1C7272315E2F3A7D5AB3B3FE91EF4E765A46EFF00E07996B4AB348213883ECDE6C7E6C932EE120E42A01C28E38C923B73D6B93D6350F365755600AC855972DC82D9627E660CEC7A9039273C55ED575F65CC6018BCC4070B22BBA2E080148DB824024FCBC67BD79C4D365F796770AC186F23232C4285C00C79');
   addhex('C739C9CD5C5296CB4B6E65084949CE7BCADA6F634279F3E59F244425C05CE771524E5806CA85041E719CE79ACBB990B32C63323EEC79699EA406E581EC791F4E9D68867219889846B92AB233028DC92C170721739391D68F352294CBE6BAB478D9F21C9E0648DC72064E3DFD2ABADB44BF33A15E177F6975ED7DD2F31EC24824485808DF6B2C87E65F94B330E8327A9EB93E9D2914A3A94132019272F2448C0203B81662155413C0C0249C62A2DF23BB4F14C932B1CE379439DC7E4F2D8738078E4E33D298B7052558E689448E0B61CED002F2D93280B9C6714D4777BFA7EBD49727B5F95F9EC22ED60CC1838DD90636F994A678E73D037078A92EAF119173B4A8554F30A618BE028F37680B9DD801B68381C9279A8A5449559E0C2B49C92C03A6474F973B94903DB8C1EF58F13234AD6D75702189C2A799387F2896E0B36D42D80C463E5EF5A2B3BB4DBB74B6ABD37275BD9A57E8FB9619B1192ECC1F69214232EDC720E4E7823904E2AF698D3CA3F70D1C222899A5325C048B0851F3E612429381C0E4E36F24D43730CFB0308619360C3BD832CAAE51B1BC6C2CC3230482011E95CFF9A0CCD12B373875273BB78C0C63039C1F4ED4F49475D5A7AF5FC84D34F4D2EADFA9DBACF0EDBB3FBA93CF39528AD8594C4236742413D30D823AF351CD75242F6F70BBB6DBB23158E47495CEE3BC3B039208E080178E983CD64DA4F0B2476F2B6D69093B95B9527015FA800AE39539241A7A5E3433982F11239626642C000B2678391D81EA31E9509BB3D13B5EFB5CA504FAB5DBB7E1A11CB74F2B193CC246D2CFB80DAA793B768F638E87AF1496F3124C85B685F94EDEA7D4E38C719FA53AE6D3CC701264642B98581E1C679463FC2C06307BD662C8D1C8558364121931803BF3DFAD3BA96A9F9B1DADA6BB1E8BA5C367A8DA5B4169A6DEEA3AABDE1338F3596086C57E5528E063CE3C37CC1914039F5346C24D1E2935193534BC98246E6CA186401DA72C440656F9542150C6420F7E01AADA6788E182CDF4DBEFB7C9A7DC387B98EC365B9288BB52207CDCBC68493862031392B595A5EA16D05E3B5F426E74B9DA1924B551B67492DB7EC314DB8280C8ECAE194E7AF51569FBA9DBDE8B5EEF46AFD3FA5A19F2EB34EF66B469BBDF4BF5D36B25F89B58B5C5A5CC76EC1268D5A7B799CC8229D1B6BA2489B1CAB01F2E7E6C75AB5A7368E6F6E9F561702C2DD647115A9DF2160E1238E3DC46324E0166C0C7358775A959DC6A0B38B67D3EC85C2B456F032CF2C56EA49C07930ACE580CB376FA567C77AD15E34F85782646B79EDE51BB7A34C92EE8D832EC954AF04E47B5269DDFBCA56B6CF7B3D6DF2D06ECE3B38B92975D537B5F7DBE66D5C4B05DC2F7496E6D648EE9E111098CA8F0127C993E60183000EFE48E463142DC4B8877B06F250A46A3A2AE0E463B7A9A8350D5AC2E9D21D36C25B2854292B3CE259249368524B04555030D8519FBC4FB55281B3962C0172EEEED9385CE589E9C6DA249B6AE96EDE9D13D6DF2D83A2D1AE9ABBBDADD0D896E63B7B590CCD1C6B1C724A412C4CAE8412A1B3D5B700307079AEBFE17E984FDA75B977B5CEB771B602E0652D10EFE3BE18E49E79502BC92E55B5DBF8B4A8098E39184931CEE11DBC3F29E3A8396C75E58FB57D2FE0BB3510C73A294B6B1822B5817B6E5882103D76A77EE5BDABA68C39E708ABBD54A5F2F857DFAFC8E0C6D4F6542A3764DC6D1F57BFDFA1E82005000E8001F952D45E651BEBD7E53E5AE4B4543BE977D1CAC5725A2A1DF4BBE8E561725A2A2DD46EA2C1725A33516EA37516024CD19A8F752669D82E499A3351EEA3751601F9A335193499A76112668CD479A4CD16024CD26EA8F34669D807E69334CCD26EA76024CD377533753734580909F7A4DD51934D34EC2252D499A8B3C526EA045DCD19E6A3CD2E6958B24DD4B9A8F34B9A56024CD19A8F34B9A56024CD19A8F34B9A2C0499A5CD459A5CD2B00FDD4B9A8F34668B0126452D479A5CD2B00FA2999A3345863E8A66697345807514DCD19A2C03A8A6EEA3751601D45377526EA2C03E8A8F7526EA2C0499AF973E28C12E8FE2A5D4E01B7CDDB7258E369570C8C38E73CC8A48E8197BD7D3A5EBC93E2F68E350F0E9D4543799A5C88D2EC5DCC6D669238E5CFFB31929311DFCBC679ACABD2E7A6F4BDB5B796CCEBC0D7F618984AED297B8FD25B7DCEC711A76A714BB03A33A98D1A33C2EE2401B4ED0ABCA9C8041040F5E6B5A5D61FCC430C6D1AC719513659CBA052A3F763014B104672BC91CE060F89E87A93412358C8ACB35B890AB6EC6E45766319CB11942E71803E5FF779EBC5E24F0BE0EC661DDB0CC40E368C65B23E626BE72A61F925D2CB67EA7D829A946F6E8F4DECFA976FF5292E6590310A01DA300AAEC24E4F2DD72C792D8E49AC196EE459E38D07EF9E113A73F2A8C9505B1F30DDD547FC0BA75491D7CE54998C7131DF2CA3B44ABB9B1B782D8E319CE6A95AB995E5B9758D55E479DBFBAA24002A93F78055DAAA0761E95B28D95ADEBE63BDBDE5BDF4F2B6ADDBBAE86944F2332232A920EEDDF7036DCA630C78009E0E3071C7351C93C636B29FDF00CDE5CB9F264000E15800C991CE198A9E831552EAE92468A3C111C6428604E594E5989E40E7249C0FE554E791A7FDEA331F2800B201C303C018E0FD7D6AD435DBD4C9CFBBD6E6847751AED694B33330931192840192541DA541E3B71CD48D76D3C72452A09130A3713F3AB762');
   addhex('B9E7D720F5AC75B9054C6CCA1CAE46DC0CE49CEE20E013CF03DA9D15DAC522A15215CE32DCE18719183C8273C1ED43D35B6ABFAD057BE8DE8FFAD49FEDB2D8CF244F23326D1F672F821803C64E4160064607E3525E3C57C91B862B2A796C020014AB649C67D0AE464F5A8A7823D42392DFCC315CC4BE7C3B8021F031B14E7201EA38EA3A563D8BB885C364F95210719E03671DBD29A49FBCB492D1AF5EA17927C92BB83D9DFB7437EDDCCD669346CEDB80C8524E08182D81C8FC466B32FA45478E52DBC640DE09C9DC338EB9E3D6A1D3AF36CD7767228F2E6959D5B8180FDB0001D47EB576EA3DD6ED004F91172A40C648047239EC7AD0972C9A6BFF00D97B157728A6BA77EE88BCF655063E8DCF39E73DF3DF35A8F731DE4097132E66859629981CB140A42B1CF7CF5AE6ECEE580F25D0A9864643920B81D73D071822B4ECAE3CB79C850F1EC3F2939E7FDDCE4F15128D9BD355E7BA654657B767DFA1A70DCC119D9967873C824F418E40E80E2B46EAD16E194A4E85A41BE29B851267F81CFF007FA573C503C0D25B0F361CB170A32E80E31919C91C71C525BCD208BC94903444172B210BF32FFB3B49CFE350E2EF74D76772F996CD6DDBCC9E747B69DE29188603240040C2FA679E7D6A349F0CADB5594A9C0627046080480413FD6A66BC70D159EA287C965CDB5C86DC541E5BA8C301C65491552EADBCB611B3874C0656E9E62F5520671822AEFF00276F556EEBFAD08FC56DDB5F324699F681F29C7438EBEBD7DEA4567675EE58052324F6CF1EE2A92055047078C1E9DCF0722944EA484006E2FB571DC93803F2A5ABD3F41BD8BA588628A4E47CB9C8EE48C63DC9A9EEAED6DACE78CCFF00BE8C468CAAA3180C0EC073DBBE392DC5549664B147791A279F68181D62EBC771B8AFAF4C5674170F77702EA755581242D147DC9FE1279E9E95AA4F4B2EA4E9AB93B69A2EFF00D753B7F09E9CF14887699753D4CA4410E3E55760CB1AE391D32C7F1AFA8EC604D32C6D6C23C1F26251230FE3948CC8C7EAF93ED5E53E01D25F4F84EBB7CBB6E2EE1315A42C30D1C2E43798C49CEE703818185FAD7A08BCC9E7BFBFD6BD6C1D0718B9CB791F3199E2956A9ECE0EF0A7D7BCBFE01BE25E9CD3BCCAC3FB48E39EFDAA417073EA7AFA576D8F2EE6C79BFE14A24AC9139EE31F8D3C4DFE734585734FCC14BBEB384C29DE68C7AD2B05CD0DF4BBFDEB3C4B9A5F34516197B7D2EFAA424A0494582E5DDF46FAA5E67E94EF3051602DEFA37554F3281251602D6EA5DD55B7D1BE8B01677521355F78A37D16113EEA4DD50EECF7A377D280252C3BD266A227349BB14C2E4B9A4DD51EEA66EC7BD16026CD349A8B7526FA2C225CD21350EEA4DD4EC068EE14B9AAFBB14BBAA6C55C9F752E6A1CD1BBB63F2A009F752E6A00D4BBA8B01366977543BA97752B012E68CD459F7A3340C9B751BAA2DD46EA2C04D9A3350EEA5DD4AC04B9A5CD43BA8DD458097752E6A1DD46EA76026DD46EAAE5B3485F34AC058DD485B1F4AAFBE9BBE9D80B3BFDE8DFEF554C98A8FCEE7DE8B016CC87DBF1A6992A999071D38A8DA5EB834EC05B32FBD52BC48AEEDAE2D6750F0DC44F0BA9E4157041041F6A89E618EBEDC55492E3AE4F5F5A7CB7D18AE7C71E2ED0EFBC37ACCB6CBE7892D24F36C6750419EC864AB06C60CB02E11B03EE0CE30398B4FD685D44082B1CD100B2C60BFCCC303CC552C4ED20E78E1718AFA17C79E1F5F12E9ABE44820D46C66FB55A4C172772AB650F39DAC0F38F4079AF932FA0B8B3B8B8BAB756B6BBB3B8717B6D8DAD0C81B648C8380D0BB13C01F28E0E4735E6E230DBF4B6A9FF0099F4181C75E294DDE4BE2F35D19E837134D770CA12768A6F2D137B1C8288C876316CFCA428031DAA3F366110867410B8C156C1111070490C0907710483919ED5C9E9FADC777FBB1886E8007CB6394908E0EC6E09FF007704FA135D01BF91A3585DD7C80FB826C2C171C0C1201C1FEEE7AF35C0E128BB34AF7BFF00C33EA7ADCF1A8AF195D5ADE5F73D89DD5B016460C3FBBC85C60B6739CE33F89A92495A51BD3CB57DFB4C418AA6C51F2B227380403903273CF7A7691A45E6B37B1D969B716D0A476F75717735FCDB6DA38205333CC5F68789238B86CEFE7B7359537DA6248E4B8B49ACF32CD007725A3796355322C5285D8C4248A49EA030E051BE9A3BADBFE07C88775BDFD7CBFAEE2B39DE4B47CA92030EA4B1E381CFE1F9D11C8BB595E55E0F2490197B803B927D07A7355BCE28A0ED03721071D3DD7A03CAFE3F5AAE1D263B88D9BC1F948E847A7E1ED4F97417359EFBEFE86DDA5EB79915BCCCB1FCDBA0B85C92AD9E118E480AC40C83D0D509AE5A1BCBB0AA0976DD8208507181E9FE155999A31FBA180067009E7A138E319EFED51DEEAA2EA5B7B8685958C222940E8ED0E0039DBC1C60D28C75768DD35F8EFB79FA8E5515BE2B34FB747A7E048B36DB8731FDE27796E0800AA83C76191FAD74715F89232C42807E42A7A81FCF9AE1E3924324D2A7C8A54023B13EE71CE78AD049C432A856005C80E013F74F71EFED553A7F7A5F86EC54EB5BD1BFC5BD0BF3C822BA9E5419DF1A1C67BE586475E718A9ECE68A19F3938C296C91F78F5E47D7F1AC892479243238D807CA00DC324719C7EB4FF30ED1F229DA70587F939A1C6EACFAAD7CC39DDDB5EABCB537DD9ED6E45C5949B55FE668C9186E7D323A512FDAD984DA6A2C8E06F9605524EDE85940F9F00D62979248D829');
   addhex('C3C2DB80519CAB7DEC9E076A5B6B9961956584CE93A9F976F4C753CF423D722B3E576BDD36B477EBDAFF00E669ED2EF97549F6DD7A7F917E0BB3751C96978009118AA86F97072791939CF6AD4D2A07BA56B3BA127936E1E68A758D9DA0C7F7CE0FEECF39F7C7354E5BDB29D85D5DC03ED9D0FD9D942BB000EE75DBC1FD7DAA4B63A86A2CF02C8D043700B952EB1978E142FB72C506154672C40E32454B4E5F0AE44DDF577B3EBCBDF4348E8EF27CEDAE9D56E9C880B3CAED1DBC6CDCE72A3E4CF4CB3740314D9AE60D323244A92DD3AFCE410769EB8503EEFA13D48E959771E278ED6DA7B2B1B6884536D5370E59E4F973931F000CF7620FB0EF5CABDCBDC4A24624B6738CF3CF3927A924D6F1A32968D5976EBF37FA18CEB421ADEEFEE5F23764BB9AE6432CED8859BF77120DB939E491C9C57A8F81BC34D7D2C5ABEAD1B47A7404490C4E36FDA9F1F26030E61070723EF63D2B96F0B785CDF18F51D5B74365195314057E7B8C64E4F20A20E3B1CD7B2ADF0DA91A0548A2458E38D38088A30AA00EC0015E850C3276949597E76D2CBF53C6C663A4DCA9D39795D745E4763F6E2EC395C018500F0001C003B5585BA1EB8FF39FE75C9457209F4FC7F1AB8973DB273FE7BD7A078CFF0013A95BA1FDE181EFFF00D7F5A956EBDF23AFE7EF5CCADD0CF278C77353ADD741914C968E952E7DFF0033C54C2E8119CFF9FCEB985B924F6E39EBD7A54EB719EE7DE80B1D28B8F7A78B8FD6B9D17207FF00AEA6173F9F5E690ADE46F098F1D31EF4F597DFFAD61ADCF1FE1532DC6476EBD334580DA12FE74E130E3902B205C5384D9EF4580D7F3BE86944B594253D33CF5A904D4AC069093DC52EFF004C56779A33DCFAF34F1303C5005E129FFF005538499AA1BE9DE60C7345845EF33DC51BC7AD52F3052EFA065D120C51BC7AD52DE7AFA52EFC5022E6FA37FBD54F33B51BFDE802D6FA37D56DDEF46EE6981637D26EA8375377D022C16A6EEA8370A4DDC5006986F7A5DD5583F7A5DF4AC5167751BAAB6FF7C538B516027CFEB4BBBEB506EA3751602C6EFF003FE79A5DDE87F3355B752EEFA7F9FD6958658DD4BBAAB86146EA2C059DD46EAAFBBF2FC693751611637FF934BBBEB558BD37CCF5A2C32D6FFAD05C555DFDF8A6993E94580B7BC7AD377FBD54320F5A679A33D79A761170C9F8D26FE3AFE5548CA075CD33CD23BF6EF45865DF371DFBD30CB8F4AA5E6F0726A279703AF39CFE14580BFE767D7BFF009EB8A8CCC3DFAD6734C3B1C7B5577B8009F98F273DFDB8F4A7611A6D37F9E2AB3DC75E7FCE6B31EEB1D181EFF375FD381549EEB23AEDE7D7DBD476A2C3359EE3DCE471FD6B3A5B8EBC9F7C7F81EF59F25CF5F9AB3E5BA61BB0C3F5F6A63B16EE2EC8F5C67DB3DEBC9FC6BE1A5D533AB699B60D5603BB38DA265FE257DA0E49524027D706BB99EE73C649E7B7E3DBAD644F71D72DD7DBF4EB5324A4ACCA839424A51DD1F315FD8F9B349108FEC1A8C6CC25B77FDDC4EDFC4D11FE124E38381F4A8ED75DB8B67306A092388D7CB063502752BC0CE4AAB03EA4FB835ED3E22D1AC3598B2EA915DA9CA5C46A15F201C02CBC915E39AAE997B625A3BFB7F3EDD5884B95C39C038524AE587E35C5528746935FD6CFA1EA50C54BA370975ECFD7B9B76D7CAE82E2DA667031B2485F12A1E41561C30EE0E78ABD73AB5C5E69B0E9F24A2486D5A448720931F9B70D752055C6DF9E63976C9638518C0C5797B43344C25B4B96CAF4DAE51C74E8C083FF00EAA9E1D6AFEDDB6DC0332F3B8C99127D44ABC9E7D73D2B96586D6E9A6D3BA4F469A3BE38CD1C649C53566D6B1B3DCEC8493C4BF295C005B6E77678190D9C1E9E80D3975081C067530B74E395E07E8335896FAE58CC079F2496EC073E6C6D2A75E9BE204FE69C55F37565328905CD99560C399046C48E3EEC8109C7D2A5C1ABB9425EABFCF66546517F0558E9AA4DFF004D1796F817088CAC245186C8F5E983D38E9514F34EE0C26D8C6C24DD9232DF37190476C54090DB3B029B19954731BC4C327D831FFEB53D6D65208135C82BE92678EB81F3118A8BC13BE8BD7FE0791ADAA496B76BCADB7CC7C28E1999F7F18EBD3214727B66A63E5CF0A9046FB697EF1200C60E33CE0E0D30D834C15B74CC080581B808BCF18C33A8CFAF149F66B78B3BC5842BCEE373790039FA1909269732BDD3D7CADF35B8284ECD725A3DDDFE4F6E83D753813725CC832BC640CF4F4ED4C5BD320516D0CAEB8CE480A8411D7764D466EB4687292DF59073D0DA4325CA8E73F79232A4FE354E4D7F4B8005B78AE6F36F03CE22DE33EF84C923D881D6A942FB539DDF7D17E36FCC995451F8EB53567D1A72FB95DFE069C577319F68009381B21567E9D412319F7AD794A8FDF5FCF6D631E7912362423B058973DBB938F5AF3F97C437EE0ADB88AC97B0B141037BE6507CC3FF007D56519A4762D23B3B6492598B1E7A9C939EBD6ADD0BB4FE1B2E9AB7F7EDF899C71718C5A5CD535FB5EEC57977FC8EF67F10E9F684AE9D14F34D9CFDA270985C1E8A092A01F5E7E95857DAD5DDF7FC7C4B98958B2C4A008D4F4C9EECD8EE735CFAF99210B1A3364E3FCE2B72CB469A521AEB31478079E58F4C00BC9E7DEB485149AB2D6FBEEFEFFF00231A98B93BA72B2ECB45E96EA55B74B8BD90470A348EDC01D7FA600AF4DF0F6856DA6B25D5F797737414148BAC71B7072DBBEF30C63D2A95947059A94B68C47C0DCC146F6C7AB7DEFC2B621624');
   addhex('8C927BF1FA9EBEB5D50A696AFEE382A5794F44DDBBF53B28EFDA439DDD38C0E00F61ED5A10DD1CF53D3F2F53D6B9385C819071DCFE5E95AB14846DEFC74E9DABA13395ABFF0048EA23B9C63278EDFE735752E7032323D3F1AE6A39881DBA74EBEF56D265F5E9C639FF00F5D3B90D7A9D02DD1C0049CF5AB42E38CF3D3FCE2B9C598763EF81F9F43F4AB2B373D7F2EB45C968E816E303AF1FE7BD4EB718C76EDFFEBAE7966CF73F4FF1A9967C707E9C9EDEC29DC2C740B719FE2F6A996E338E4E2B9F5B81C73FE7E95389C71C8E9DFF009F145C2C740B7191D7FC8A916E31DF3CFAF1580B73C919CE3F2A945C0CF5E7D69DC563A04B8CF7FF00EB558171EFFAD738B3707E6C73EFFE353ADC74E68B8ADF33A213F07AFE1DEA459B3D722B016E3DC7E39A9D67F7A02C6E0B800609A9166C8E0E6B19661CE483C548B28CF5E3FAD02360CA3FFD54E1275C9ACBF3863EF7F3A7ACDEA79A0563543D2F983DEB344B8EFF00CE9FE66475FF003ED401A3E6FF00851E6D67893DCD49BF23AFF4A02C5CF333ED4FDF54778CF5F7A51203DFA53158B9BCE7AFB52EF38AA7BFDE943FBD0162E07F7A37FE955038F5C51E66781408B391CD1BAABEF269BBF8EB406C6AEE1EF4BBFDEAAEE1EE682DE871F4A2C32DEEEFC8A037AE722AAEF38EE7B75FF22943FB9EFF00AD1602DEEEFD3EB4BBBDEAA87FA8FA74A037B9CFF9CD202DEE1EB46EAA9B8F4EBD7A5297FCFA7345865A0FEF46F1EB5577FE3FE7F3A69707BD005BF3293CC1C8AA9BC77FD699B86074E3A7F2C51602EEFF00A8FAFE34C3275E4D51DC739C90076E0E7F1EA28F331C13D3D4FE74580B8653CFF414DF37FCF1553CDFF23FFAD51197DFFCFF003A00BAD2678FC29A641D6A834AB9EA79E7BD33CEC77C7F2A63B174CA738E2A3794038CF1D7BFFF00AAA834DD4E4FF9FAE2ABBDC7079EBC606680469B4FD79C7D39F4AAED3FA1E33DCF3DFDEB35AE075047B107FC3FAD547B8F4C9FE9EBD39A00D47B8C77FE7FE7AD5392E0F3839FAF4C5663DCE33F31F5EF9FAF4C55392E3AF3DFBE7AD0348D292E7D49E7B71DF1CE735524B8E38EFF00E7D6B31EE09EFCFB13EDEB54DEE0E396C7F5FAFE34AE558D27B924609391EFCF1939AA52DD7DEF9B9F4CE6A83DC1E724119E3B1EDEDEDC551966073F3118C7193DBF0A571A45A9AE47F7BDB8CF5ED58F7171DB7118E78E38FD453259B8FC7F4FF0359B2CA707A63B73CF352D969115C4E5B201E33EBFA7F9CD615D32C88F1CAAAE846D21C67F9FBD5E998907BF4FEB5952AB738E9D463FCFA5272EF62D24CE3750D0207264B27F21CB13B093E5F7E38C91CFD6B94BAB1BCB6C89620EA3F893E643F5047AFEB5E93229C9CFD49FCFA552917A820107B71DB07A56524BB1A294E3D6E8F31658F3CA321F6E3A9C7E75118FA6D90E31DC1E9F811F8D7A0CD656B2677C09E9C2807F3EB59B268D68C7E5DC9F4F43F91A8E5B5ECDFE657B4EE97E471FB5C631201D31F31F7F634A1EE063F7A7073C076F4E3D2BA56D0D3F8653EC0E7DBD3350FF0061B64E255E38E7208F6A5663534B557F3D4C2DD31C665CE3B6E6F6A4018E49933CE7939FE7ED5BE344F5997039E87E9E953268D10EB29FC17FC727BD3B30E78E976FEF39C19EBC9FD3FF00AF4A149E15777618E7DEBAC4D2ECD3EF02FF005C55B4B7B58FEE431EEFF741FE74B95873A5B27B7E7EA729058DCCFC08D88F5EC3FA56B41A2104199D07B2E58FE640FE75BCA7D0631E9C0FD054C80B633FE7154A2BD49736F6FEBE657B7B4820C7971AEEFEF360B7F87E55A68849F5A238C7A0F4FD3F3ABB1C78ED9C0EFEF83FE7915497621B6F7DC7C31E7D88207F9E2B522503071DB1CD578D703DC7F9EF57631F419F4F5AB4896CB917183DB1FE3F855F46200C6074F5FF003DEB394FA373FE78FAD5A56C72491C11FE4D52D88FC0D14908E3AFE1EF53A499EC077CFF002ACF46E73BB39E79E47FF5AA70CA3D3FCFA0C530B1A29211D793FE78A78B80ADC9C91FCBD0E2A806E9E9EC714E0FCE0E0E7F1FCE9058D559C71824F5FF001A984DF5E7D3FCE6B2558FB73DC71D7D3E95207E0751EE0FF93D281DBF33544C7A64E7F9FE1DAA559F9C139EA7EB594B28CE327F1E99A7F99919279C7A9A2FA2158D859C03FCBF2C773532DC0E84D622C87D791D7BD3FCF24FF9FF003DE9DC4D1BAB3E4F7C0E2AC2DC01EBFE73DAB01251D33D78E7BFBD4EB37BFB77C7F2A2E2B58DD4B8FA67BD5A5B819C66B9D1301DF1CE473F9D5859F3820E3EBFFD634EE4DBF03A059FA107F3F6FC6A649B3DF15CFA4FCE33FE7F955A13E067391F5FE54EE163744CBC13CE2A5137F2F5F7AC349F279EE3BFF33DEA7128E80F27FCFF009E68B89A3696627BF1EB8A944A7F4AC64978183EDFE4E31532CC7904FF009C0A64D8D5127BD3BCDC11FD3E83FCF359EAFC7269E24CF03345C0BC1C93D7AFA54AB27D6A807A50F93D69FCC468EF3EB416F7E6A8EFF7A7092802E6FCF14E0D8C5521273CD3B7FF009347908B7BCD287E39C9FA554F347AFE1D7F1A04AB8EBFE7F9D303577FBE7F2A5DE3F4AADBBFCF4FD294B9E3FAE68116449EFDA94483D715577E3BFE38FF0026977104E4FE79A00B5BCFA9A76EFAFE355038F5FF001A6971D8FF009FCE8B0CB9E611CF27E9CD344BC9E4F63EDF8554DFD79E3FAFE149E67A92793CE7DFFA521970C9DF3FE7F0A6993E86A919093C1C751F8FE7419074CFE64D3B0168C9FAFAFF00F5A9864FAD54328F61F5E3');
   addhex('EBD4FF003A89A520FDECE39C67B7E7480B8643C739EDFF00D7EB485C7F788238F6FF001AA2D2F07F2E738EF51B4C01F5CFBF7ED8079FC29817FCDE31FCFA544D3738CFE3E9FE7DEA8998F7207D7B7F9FC6A1328393B81CFF009EE290CBC66F4C9F7FA1FAD4266C73D7E9E871D39AA2D28E79E327A71F8F4AACF38FEF7E592281D8D069C6719CFF002FE754DEE3927B74E3B74E2A93CF9EFD0F5E6AA3CFC9E4D2B8D22FBDC03DCFD78CFEA6A9BDC1C7A823D718F4E2A8BCDFED303D3AFF009EF555A6F46209E79C7F414AE3B179A7E7F8BF4FE84D5779BD370EA3B76F6AA0F31C6793DF93FE3555E619C83B7BE707191CFBD2B8ECCBCF373D7AFA9FA77FFF005D5379BA9E71DF278F7AA8F3161F2B1C9E73CF3E8075EF559A552739E4E491CFA8FAD26CB48B4F3904637119E9C74E7FCF7AA724DCF6EDD49FEA7FFAD5034A0F19271D073E9FE7AD567727B903A1FE7F4A4DF62ADFD7CC959C1CE7A67D38AA2EDCB77CD3989F7CE7E9FCEA0739EBFCFF000EE6A58D7E25790FB938FC7F95537C9F7E33FE7FFD5569FA9F5C773FD2AB3E0F7C73E87BF4EBEB48A5F229489938C633D3FC7F2AA72443D0F1F9FA64568B8FAFA71F8F6E6A0751CF6FF3F8D2D0A325E23FAFF4FF001AAAD19F4E9FAFF3AD7741EBDBA75FA7E42AB3276C0FFEB678A56F98BC9994C8DF4C8F7A84AB0FFEB75AD568F3DBF2FAE6A030E7FC8FC2977F20FC0CEE47B71DC51926AE7919C641E3FA7FF5E9C2DB1D47F93408A233FCCFFF005AA5504E382715716DFDBF2C7E7CD4CB0638C73CFA639A3A88A8884FFF005AADA29FAFF9FA54E9063A0E7DBFC6AD245EA3AFF3AAB7905C8635C75FD79FE42AF46318EBD3D3EB42C43A7F33C558543C71FAFE5DE9A1587A2919CE07F9FCF9AB4A0FB7E79E2A25079E9FD7F3A9D463B1C91F87B7534EE2FEBFA64E99E9E9E95383F99F5E86AB2D4CAC33C039CFD29DC56FD0B2AD918207F9EFC7D2A5FC463A75E3FF00AF55D48CF3C77FF1E9DA9E1BDCFA714F61DBF12C64F4DDC7FF005BDF8A9370C7DE3FE7F0F4AABE66DC771CFF009F5C53B7A9E83D0FB7AD2BFCC0B41B1CE73F8D4824FAFE3FD7FAD530F9E8723AF1DFA74A78639E00E39E9F87D3A53F5EA05B0E0E7914EF338EE47AFF00FAAAA07CF4E7F5E9D7B53812476F4A3D40B3E6E0FF00FABD7AD48241DCF707D3B75AA791EBD31FE7F2A70231CFF9FD680B22F2C8A79EBFFEBFAE3E9530947AF7EFEDED59BBC741F5E681267D3278E7F9FAD1EA2B1ACB283FE7EA71D7FA54EB28C000F18AC65988EFC83FE7B9A91262064E723D3147F9E82B1B6B2FE1C559597DFF002AC359FA1248FD78A9D6519E1BB74E7FAFBD1A936F237566000FEBFE7F4A984A73C1EFDAB1127F7C9FF3DBEB56566F7FD7B50163692423A9C7E5F855859475CD622CC7D739153ACDCE29DC9B6E6C8981E391FE7F2A9925E958CB2FBFEB56126E9CFE7557158D41293DFDBF4A943F1C1E6B34483D7AFA54A24F43D7FCF5A2E2B178487DEA4121FF00F5D510FDF26A40FCFF008D3B88BA1F3DE8DE3A66AA6FF7A5DE3FCFF9F5A77158B59E99E94F561F95550FC7AFF9E69DBF3DF8A05B1AC1CF7FAD3B7FAF6FE75537E33F9FF9E68F301F6C7BD508B5BFDFA52F99EFFAD53DFF008FD7F952EF1D73DFB7F8500592FDF8E7D4FE7407279E9DBAD532FF00ED1C75FF003834DF339FE2CFFF005BEB4865C2E47519FC69A642077E3DF39FD2AA34A7F9FF009ED4D2FEFF0037B7F9140CB5E613DBF5C534CA0753CFE7C7F2AA65BF5F4EBF89C54448CEE3D47033CFD6802EB4A3AFB67BE3A545E60FEF03DBD3F9F3550C9DF9C93FE79CE69864CF51DFD7D3F1A432D9947D3B7F9E4F6A84CD9F7E09FF0039AAAD37419E0FBFF4355DA72338CFE3E9F4CD1702E34C79C75F7233D33E86ABBCDE83FCF3EE2AA34F8EF838FC2AAB4F9CE5BBE39FC7F1A572AC5C79FF00C7E9C8EC3D38AACD37B919FC7D7E9555A604819F53DFDC640AAAD37539EFD39E3EBCF14AE558B6F3E3A83D7AE7FA62AB3CC0FAF1EF91FF00EBFC6AAB4FEE07AE09E7F5C555798633DB81F8D2B8D22D49313D0E473DFD3F0CD5392627D87A83F5ED551E7381F31279FBC7EBEFFE73559E5CF009041E0903FA6690EC5979DC67E604F4C6EF4CF3F4A81A5279EA0FBFF2EBEFCD567727AE30413FAE3D735097EC72467A11C76EC7FA1349FE255B52D3499E9F5F4FAF1D3F9542CC48E98F71C638AAECE0F3C74F527D3A76EF4C69073CB9E9EA07028D7FAFD07F81316F53B8FB67AF7C9CD464F6E3EBE9CFA66A31275E0FF3EE7D6A32FE993DFD38E3DA97F5E41FA8E66F7EFF00407F3FFEB540E49E31CFE1F5A7120E4E39CFA0FE44FB546C73DFF9FF0091487E631FE87F3FF1A85B07FC29CE4E06077E793F8D447D41C7E748A232B9EDC7B8EDFCAA161E873E9C7F93560A8E3273C7E7F9D30AE7B67B73D71DBFCF146EC68A657271C038F4EF9FA7BD31A3183F5C7D3FC9ABA53D00E9FE473D29BB40038CFF009FAD20287920F2723E9FFEAE94C30FB678CFE7CF5E95A253D063F0FAF6A4D9F5FE9F9734583EF2879591D3AF1FE34A2107D3AFE1EBD7A74CD5FF002C74E073FD3E94A10771C1F4FEB45856290871D47D38E7EBDFB548B0FA76EBC7F9E6AE08F18E33FE7E99A78419E38FE74FF10D0AAB17B7F9FF003F5A9963F63F8F3ED53841DF9EC7EB8FF39A9157F9FF009E734088846003C7F9FF003E952228E39EFD0FE35205F4238FAF1EB5201D08E3B7E3');
   addhex('FA53EE2183E83D38FCBEB5281F51498E7B71EBF9F7A7838ED9E3F2C1EDC7146E1F70A001D0F6EC3FCF4A7F0071CF7FF3CD3411D7A700907FA7F3A77078239E9FFD7A62EE283C7BFD29CA41C9DDDFA7FF00AA9B8CF23F4FE751AC603EE1DBDF8EFEF9A365FF000C0583CE3F23F4A70C8E09CFA7A543D49EBF8F4A7838EFEDFE3405C9C363AF6FF3DA8DC01EBFE27EBCFF004A879CF41F8FBFF8D182472783F8FE98A10762C6EC74FD3A1F4EF49BBEA7FCFE550EE20E074CF53CF1DE94393D79C7AFF8530E84FB89C738EDD4FB75A7838CF24F355F70EB8FC78CF140607E9EFEBEC7A5205B16B77503273C7A7F3F7A030CF6E38E3EB55B79E467FC3F4A3700463279EDCF3D4F3D690EFA16831E7A73F8741FA53C30C641FCFF00CF4AAA0F419E3927DEA40D8F51DB03FCF6AA1775DFBFF5DCB2B211F9F43F977F5A9C3E3073CD67F5EE4FF8FE1520627FCFBD00D1A6B2F3D73CFAF6AB0930CF07FF00AFDFBD630931D339FF00EBFE9CD4AB21E0668158DD59BF5153A4D9FF003FCB8AC68E5E39279FF39E6AC24BD8F1FD6913636524C9ED823BD4EAFD39FF003D2B1D66C0EA7DBB7F9C55A49BDCE7AFF9E69DC2C6BACA3F2F5A944BFCF1592B363F4FEA2A559493919C7D7AD3B93635965FE7FCEA412E6B3164EFFE7F9D4AAF4EE2B1A2AFF87F5A93774C77AA0B276FA0F7A93CC18CF3EF4EE4D8BBE66053F7FA5511271FE34F0F8C734C56360371E9F5A4327BFE5FD6AA17F7FE7CD2F983B67D3AFF009E6AC82C97EDD87F914864C7E1553CC3CF26937F7273DFD281965A4C8CF4C71C7149BF017BF18EBD6AAEF3FF00EBE691A41F80F4FF0038A43FD0B264E7AFF9E94C32633CF7FEBD3BD553275C9E7FCFBD465BDF1FFD6EB4016CCBEDFE1FE7150B4C40C7AFF93FE7DEAAB49D473C7AFEBD4D445B8E7F2FF27D690CB666CFE5EDFF00EB35134C7AF27B63D7F2E45542F8F6FAFF004C540D2919F9876E87E9EFE9498CB2F3138EDC8E87A6392327E950BCF8C8207D73EB551E6C8EFF00D3A7BF5E3350348304E7FCF6A571FE3FD6A59926E723F5271555E4CF5E3BF07FC3D6AABC83919C7D339F5EC73D6AAB4A7FBC0919FD7B52BFFC02D22E34B91D7B63AF3F91AACD3F2707B743823EB555A4C7396E3A74FE8735559CFAFE79CE7EB52D94A25B69C679CAF39FC3F2AACD2F3C75F4EBF9718CFA5572FD39FCBE6C76C1AAED23678C75FE2FE7C522AD65B1397F53839C9E483D7F5A83CCE0939233CE78C7D715197DDDB1DBBFE1D6A22FFCBB0FCE987CC98B0FD7FF00AFF9544F2EC031C924000904963FFD6A8F7FA0C0FA7F3A87073967662BD8F0A3A8C0E8290160B7E44638C7E7EB49D3907DBFC8A8CB28EFF960F5FA7F8D349C77E7AF3E9F5FA5003F3F439F5FC4F049F7A66EEB9C1EDEBFD293773FE4FF0085377E49C0C7D3A9C7BF4E297C8109BBBF4FA74FF1EF48791EDFFD6E7EA29D9C7F77FC9F6F7A6E01FCBF1F4A0A1A718C939E9D00A6606476FF003C67F9D4981DBF4F97EBD3DA8DBCF407E9F852022207383D7FC334983D0E31EC3FCF7A9703F9F43ED4DC139E33C9F5A008B03BF1F99CD1B41EFF00E47BD3B200E9D077CFB71FE452F207233F4CFF002F7A63DBEF23DB8EFDBB1FF1A4DBCF7FF3D6A4CF1F28FE9F95380E7A7D7BFF00F5E907E0458CF4FC85285EFDFD3FFD5536DE3F2CFF00934053E8318EFF00FD7A05F811F7C63F2C9A5E9DBA8FFF0057E3526077F4FF0027A5380C1EFF008FD31402634640CF1C81D7A538608C93C1E463F2A5DA3BFAFF009EA7D334A00038C74C7B502107F5A900031D7F1A4C9FFF005F4C73EF4F1F9E719FFF005530EA18FA1239FE74A17F1FA76FC8503A7F9F5FE94EC7E279ED9FC2810C1E9E9FE7AFD29E17B0FAD04E4FA01FE4D2E318E9C0A6860323F0FF002682DDF1CF7F43C9C76A320F61939FC7D7AD0307AF3FE7FCF6A7F7E82DF6B8D2E3AF52697764F707A73FD297DFFCF3F8D1EF819A402E73D7B1FE5EB4EC918ED9F4FCBD693AFD7FFAF484FD7F3FA7BD01F21F9EFF0087249FD33487EBE9D3A75A4EBEDC7E38A391D09FF3C53014700F19C0FC3B8A3D33FCFD299C9E391FFD6A5CF4E7247F93407E571E727804F3DF9FFF0055341238E08F6FF39A6313C631FE7F0A50C49EB9079E9480981207F9FD69FBF18FEA7FC6A00474FF00269D9F7FE5DA8F50EA4FBF3DBD87F3F61DA94BE38FC39E3A7EB55F39E9C7207F3E94BB89C7273FFEBA045A0C3AFF002EBFCBB53D5FF03FCBDBF4AA609FF3C8A782477E7FC0E28F540CBA1FDFBE38FF003EF5615FD49E7DF9ACD5C9C73EFD49C7E9F9D48AE71D4FE67F9FFF005E81AF3B1ACB27A1271FD3F5AB2927F2E3FCFE59AC8573D3F9FD381F9D594947D3FCFF00F5AA7B035E86B2C87DFD2A757E39FA565AC83D7F2E3D7DB8E2AC2C9D067DB8FA5325A34D5FFC9ED53AC9D0647F2ACC1263BF6FF1A9849CF5CD55C9350383D7E952071EF59CB254824F7FF3F85344B4686E1FAFB53C38F5FD6A887E3FC3FAE69E1B1DCFE7E954268D70E7A76A4DDEFF00CBDEAB6FCF4CFAD1B8FF009FCEB4332C6FF5269A5C639E7F4AAC5F1D3AF6A617C75CE7AD21D8B45F8E3F5F7F6A6993D87BFF008D562F8E73FF00D7151993EBFA8FEB4AE0592FF97F9CD46CE7FCFF009F5AAC64233D7A7BE3A706A3329FAE3BFBD2289DDFFCF5FF003D2A2690FE9F4155DA523BF5F7FEA79A81A5C93F31EDF4F5ED45C1161A4CFB73EA7FCF7AAED201DF23DB9FD31503C9EE7F');
   addhex('3C55779BD0F4E39F7A43489DE4EB86E33D7FA73C75FA55379B0BC73DBA93CFBFD6A279B1D4E4E3B0E39FAD547981CFDE3EE7DBA7F9C54BFC0B48B0D2E7B8CF5F4FE593DEABBCB9FC3DFE98E71D38AACD2F6CF1F523DEA167E491C7D3D3A63AFF005A4D94913348723383F5FF001A8998F507DB9F5FA541BFA93C76FEB4D2C723AE3B6EC54F62BFC890C878EB9CFF009E6A36901EC411DF3C7EA2A367E98E3FCFB530927FC7F0FCA98AFF003D0796CF5C9F6CFF009EE69B9EF9E0F3CF5FE5FD2A3CFA63E839A4278E307A741FFD6A1FA079F41E4F6C7F8FAF18E4E7F0A69CF1C7239C13FE1516EEBF2851FE7A7F852FE2C4FD7A7E278A3F32871F70DDFDE81E9C6073EF4CC1E8718CF6E83D683838E9EFF963AF5A417063C8F9793C820FD29579E78FE47F9D37BF191C7B9FA52E3F13D0F6E9FAD01DC5F5EF93E9DF8EFF004A3E6E0F183CF7A39EFC639E7A546E4E09E9839E3AFD2801E08C9C71DB9E466939EBD4FB7F9FE74839E78E7F43CD2F5EBDB8EF9CF19EB4BFE00073DB9A6E483D33D7FCF734FF0063F4E7FCFF009347EBF5E3BFD314FC9811E07707AF6FCFFF00AF48C4E7038C67FF00ADD4F352600E7FCFB5275EE0E78E7FC3B7FF005A801858E70303BF4A0003AE493E9C6307E94EDA3B71D79FFF0055382FD4FD7F0F5FE748634E7FDA1EB83F4FAD28270091D7D7AFBFF2A3181CFBFF009C0A5C639CF7CD1A8851CF53C81CFF00FAFAD19C63238CFEBED40039E78F7FE54BB7B6727F4FE5405D0BF91FF38A518EBB87E1498CF71F89CFF4A5FE9400E18CE3F2FF0039A39F6FC0520C75C743F974F7A5EBD323B5301C323A118F7F5A786E9C01EB5163B720FB53801DF079EBF5F4C7B50BCC43CE09E7278FD6978FD299C027FAD29CE3AFF9FF003ED4C3B8BDF900FF009E9FE4D1BB183FCFF3FE74CC907B934107DC7FFABDA90C7E73FE7A7F851CD307A13EFCFF00F5E9DD3DF34EE21D9183DFB77A66493F53FE23EB4DEA71F8714A38F7FF000347E7F201F9C73FCB1FCE97271FD7F5F4A8C1CFE39FC3B53BF1EBFE1F4A2F70EE21623AFE7481893E9FCA90919231CFE7CFF3A5C0F6E78FD3F3A4029E73E9FAF1CD00800E075EDF8F51934DDA739C9F7FE42819F4FEBCD3B80F0D8E48FF003DAA4C83C11C7F85427B7247F87F914A0F3C67BFAD0C3EFF00F862618F5A4C8F5F7FF38A88BE33DBFCFBD01B3919F6E4FD7BD1A7DE04BBBD09A7649E87BF6FA7B545BBF1EDFF00D7FCA941C77EDFCA8BA0FC89C37D3FCE69FBC0C6319FF3E955C13D8F1F8F5F7A07D4FF009FC7FA502FD4B824E7FCFA54AB27D7D3F3AA3BBEB9C66A40C78F6FF3F5F4A56FC869FA1A4927D4FF008558493A5652CBC9C8E38C66AC2B720F4F5FF3FF00EAA43B686B2BF4C9F5EFEB53ABF4FCBD2B2D64EE7FAFB7D6A7128C1CFA7E34C968D457F5FD2A40FF00E79ACE494F1D7D3F5AB21C7B1FF3EF4EE4B8F7D2E5E5623AF3F43528931FFD6FF0AA21FB7E35206CFF009FC6992EFD8D72E33CE31F9FF4A42E38EDCFF9EF506F1C73FE1FA530B8FF003FE735B191317EB8CFE1FF00D7A6B39C707A7F5FFF005D425C75FF00EBFEBC7AD44CFF00E47E3487A226331F4069BE675F5A837E0771EFFE4D465FAFFF005BEBEB48098CB804F4E3E9FE3509973D33C71FCBFCFE15033E78ED9CD445BD0E31C75E3F97A522AC4E64232300F3F8FF00FAB9A81A53FDDCFE59EBF85577723F9FAFE9503381D3079FAFE748AB133CA720F61DBFCFB555924E3AE38EA3BF6FF3C546F2772467A0C67B75AAAEFD7E6FCFDCD276F9956EE4ACE7B1273DF3F8555691B3C1EF9FA7FF00AAA3326793C11FE735117F4E7039C8A577F328919D8FA7E7F5F7FF003D2A32FDB041C1FF0039A6673D0FE78EB9FE54CDC3A1CFAFE5F53486484E3273FCBF3A633648E4E0FE9DFD298CDEDF5FAFE74CE79E49CFF9F5FD28063CB73DC81EB834CDE3D40CFF00F5E933F4FC3BFE1F4A66FF00607078E7FA7F8D1A8BFCFF0021C1BF3CF6E3D31CD1EE403FE3C73D2933823D7E9FFEAED40E9C019FA9CFF3E7140FA875C8EA476E0520F4CE31CF3D80A5DC3A73FE7DF8A68E07BF5E7B7FFAE80DBBEA293C7439FD0FF9FC29013EC3923A0CFD3D6938F7FC7FFADFCA9C31FAF7F5CD20173CF27BFAF6EDFCE9430C63DBF3FEB4C241C104F3FE7D693B718EBDC91401267F100FBF15131E7006477FF3FF00D6A5C91DF8C74EDFE7147B8C63FCFB7AD001D7A70052E4E3B9C0F61D28E31EFEFD69031CF3823DFF009F4A07F2147FB5F867F5E9ED4E1C0EA0FAFEBDA93F0EDDB1471D71CF7CFF009EB8147E22023B8C63F1FE7401DF38EF91CFE54647F87E9FE149C139FA67DE818EE9D738FF003ED4023FCFE1E82A2EF95F6E839FCEA419C7619FD3BD02F21F91D734718E0F3D7D7BFF00851807BE3A7BE3F1A38C0ED8F6CD0021F6EF4007F03F853BD307DBFC2939C7A7FF00ABDE8013183DC7D07E1E80D3BFCF3FAD193F4FFF0057F9F4A518E80E680B8A38EA3FAF14A49EFE99E693A73DBA519E9E9FAD1D8351DF4206693763B76EFEBEB4CDDD7DFF005C839A72B83D47F9FA6680177E78C639EBFE14ECFA7E9F5F6A8CEDC7F3C63F5A50463D7F01E9476F501E339EFE9F8FF91484FF009E3E94DEA79CFE18FEBF4A5E33D3BFD680EE3811D71D7D3F9D203EE4669BF4CFAD211D8F5C7F2A7A812673DC1E7FC693BF4C0CD378FC3AF4FEB474E47A7F9F7A5B7CC2C389FA0F7FF2693238C7F2FF0038A66EE9C7FF00AE');
   addhex('807D07E78A1DC0781CFAFD7EB4B8E3F4F7A6EEED8FF0FE7467181D476E280F4D87027AF1C5192BC1F5C7BFE34DE873FD28DC3FCF4A3F1FEBA00E273F9FD3F9D3093D8F19E9EDF953B20FF2FE74C391C8FF003C77A7F20D3B0ECFD33F5A538E29A07F9FCBB0A79C1FCFFC3DA900BDBDFB67B73F952F5FAFFF00AFFF00AD4C181F4033FE734B9CFF009FAD2B0121E38E9FFD7A07F9FC299D7BE3FF00AD8FF0A4FA678F4E86AB5B01364F1CE3FCF1FAD00E3F2FF0FC2A024FF9FEB4E193DFD8FE228F2116D5C7B73FCAA75703AF1C7F4F4ACFCE3FFD5F854CAFFE14AC3BEA682BFF0091532B03F8FF00F5EB383D4C1FD71D3FAD2655CD38DC0F4E99FF003DEA7490703B7F9FE95941CFB9FF003D8D4AAC475FEBF9D34435F7335964E79FA7F9FC6A657F73FCAB2849F5E2A649391F4FE7542FF2374B7D47F5CD34BFA73FE735117EBDFF002FE74C2DFA7FF5FF001AD4E7B136FC1FF1A617F5FCFB74FCEA12F8E9EBFE351B3FA70704D27F78D1316F5C67F1E9EDFD6A079300E3B7F88F6F4A88BE3D4E7D3F1FF3D6A2693AE3D7B7F3A3F21A252F904720FB9F7FFEB540CE7A72707DBFCFE94C7933EDEDDFFC31555D8F50783F8F7A5FD7F4CAB1333E33CE3AF527F2E2AAB498CF4EB8E79A8DE418EB8C7BFF002C557698E7A0079FF3D6A5B297CEE48F2F7CE3EBCFE58AAECE1BB1FD31F96334C6901EF9FCBDF150961FCC724FFF00AA915EA3C9EC08FC33F97151927E847BE0FE7FFD6A613CF0474C719EB46E07DFF1FA1FE74BB0C76EE700E71C71485C71919FAFEBFAD318AF4E7FCFE751E40181CFD7B7D4F7A5FD7F561E9E64A587A91CF4C8C1EBC75A613D793FE7F5A6D00E0753C71FCB8EB4C40093F4E3BFAD1CE7B13F9E28E4FDE0ADD7A0E9F8F4FA5275E48C75E9CFF875A0077F5EE3FA77A419C7A7A9E0FF008526E3EA3F3238F634B93C75DDEA3FFAE2818B819041071D8D19FCFDFF00FD749853EB9F6FCA8E3A0FD7F01F9D1F787EA0704761F4FF00F553719F43EDF4FF000A712475C7E1F963D69075FF000FD69200C63BF7ED4A78EE33ED499FA7E5F9F140C9F407DB23E9EF407F981C8E833FE79E9474F4FCBFC9A0823A7EB9C7E349924FF80C503FCC3767181C8FCA9E71CE7EF714D1D393D39E98F5FF00F551F8FD3F3FCA988760F033EBC7F234671DBFCFD7DE8183FE7AFF009341F5A401BB9E98CF4FFF005523671E949E9C648FF3F5A6EE20F7009EDF4F6F4A6BB00EC851CE7D71DE9E08EDCFF5C75A68F63C74E40FFEBD281F41DBAD20FB85C9F61E9E9DE9DCFE23FCF279A674E33D71F4F4F7E28C700903F0A603C7F9C7F3A5CF627F1FFF00575A6FBFE3FE78C51C71F4C7FF005E907CC7E320727D7FCFF2A41C743C5333CF3F5FAFF5A5C723A0FCFF00AD1DC2C3F2075C907F1E3FFAF46ECF3DBD3AF7F5EB518FFF0057A7F8D2F4F5E9DC751FE7E947E61F31F9E7A7F9273DFE940C7FFABF9F7EF499E7DFFCE7A7D68E3B81EBC7E940790B8FA8E7BF43EF49D3201E33D87E78FCE8ED81FF00D7FD690E7FFD7F850038B7B7B7E94BBD7BF527BFB7D6A2CE4E08FF003ED4AB8FE5D7D3F9D03B2FC09B239FAFF3FC29370E7FAFE9CF4A67D7EBEBFD2978FEBEBEDFE7D685FD7EA2F51DD7FA7FF5E90639E49A6E33C75EA39A5E7FAF3400BC0F7FF23EA28CF1C7D78C7D2985803D7FC7A74EFDA99BB3EDFE7E9ED4FB012E738E3F33FE451F9FA74A629F61F87E1FD29C08F4FCBF0A5DC351DD3F3F4EF9EFC52640FC3FAE6999FF000FC3B8A5CE33C7F9FE54301723D08E98FF003F9D0727A7A76C8A6649EA7FCFE58A7E73FE78FF00EB71400BCF7FF39F414E1EFD71C1C53323AF4FD4F5A01FD0D3FF008617E63F8A5079E99EFE94C240FD3FCFA74A33EDD0F7F7FC69751A1F93F9F3FD28CFEBE99FE629B9FF003FFEAA4CFEBFFD6FEB407E1624CF3F43DBF3A01FF3FCF9EF4CC9E9EDEF47E3EF40B6F98FCF23BF6F5A507A7E751823F5E69C08F4A77FEBF40F993A9F5E0FE1EFC54A1FFF00D633553774C77E3F5FFEB53D5BB75EF9FCA876F98EE5C573D39F4EF53ABFE3544376FE5522B8E3DFF0FF0038CD25FA7417FC31A21FFCFF009E2A60C3208EF59C1F8EA063EBD2A647CF53FE71DE98B737F763FF00AD4D2E7F0CF5F715017E9EDF4FFEBFE14C2E3BF5C56C60BF0252F9FBB838EBC66A32C79F4EBC8EB50B3F7F51DBAF39F6C544D20FC4D21AD74262FCF6FA8FCFFCE6A069327AE31FE7A7D6A17933D0E7EBDBE9503BE31DFF00A75F6A3F51F72C3B1FAF7CFF009E2AB31EB827D3BE3F4A85A4CF1D3FCFB557697F841CF3EFEB51AF994912B39ECDDFDBA7D0D5767232783C7AF5FCBA734C2DD39FF1F6FAD44580E9FE7FCFF5A9B94890B6EFFF0057E74C63DC738A8F7139FAF6A682475F53FCA82FEE1FB81EBC76181FD69A48FAFF0093CD213D3BF1CE3F2A8896CF6E9FE49A1069F81213DFAF3FD3F3A8D9C1E80F3E9D0534A938E3348A49C6EE3A723FA8A62245248E0F7EE7E87FA538723A9E9DF3FCE9981D73FE734BD39FF3FE7F3A00737E1E9DC7F4E683D47F8FE7483E61F5EE4F19FF00EBD1F28EFEFF005FF2697900B903B81F5F4F5A5E99E49EDE9FAFD69303D06338FF00269B8070323FFD5FA75A60480FA7FF005C73C7B5213E9CFF0091EB4C071D0E3F514B9CF6EC7A7BD2EC31DB8773D3D3F9F4A5CE30463FCF14C073C15FCC7F9E294F3DBB75F7FC6801F91D00E47D7BD070727BFF009C7F914D1D3D3F5F638C9A327B64E7');
   addhex('EB47601C0E3AE69320F18E0F4C114D18EFF973FD0D1DF3FA7D3D6801E4E0FA03EFF95267E9FE7F1A403A9C73F873474FF3D6801727A673CFF4FF0039A50477EB499F5EDDBA73CD267F2EBFE18A02E3B83EB9F6EFED4B9EC78FAFAF4FF269A38EB9E9D3F9528C11E9C7F8E4FE74075179F634B9F5FA807AFB1ED4C27B609FA7F9C5193D7B501FD7EA484A8FC7FF00D44D27EA07D7EB51B00718EBCF4CD28278FF001F5FA51F780FCFA7EB9EBD69723AF41F871FE4D30119F6F5FF00EB7B52F5F538EFED47F907614F5E9C74FE5F85291EFD7F5EBE94DEF8141FCFD280FEBE41CFF9E734BCFF009FAFF9E29B93C74F6FF3F5A78FD383D450026718C8FD7AE3341C9E476F4E9814BCF7FF003D78A43C7E278FE9E9E940201EBC8FF3F4C53F8FF3FCAA3CFF009EDFCA90FAEE1C7028FEBA8C79CFA77CE78A01FF0023DE9A5B1EF4E196E4F739A5B0850724F1D07EB9CD19E78E9FE7DE907AF27D793FFEAA3279C64F6E6980993EBDFDC7AFBE69C3DFDBDA9BD7EBD381F89A08F423F1FEBFE7BD01FD7CC5FD3F0F6FAD26DC673F4E3B53791F875E3D68CFE3FE7E94583F51FF00E47F9EB477E7FCF03D69BB876EA067FA7BD293C7A7F9E7DE900B9FCBFC7141E4F1FE39A6649FC3FCF14631C9FF003FE4D003F039FF003FA518CF739C773CD3464F7C01C8FF00F57F914671EDFE7DF9A7F301D8F43FA1A07F9FD3B53327D4F4FEBC52F43C91DBD3DFDA8F980F27D8FD7F5A70C62A3071FE7D3F5A706FE5F8FD714B701DD303F5E7A519F5E3BFE1C9EFC669075CFF0093FE34BC76E3FCFF00F5A800CFA7D7FAD2E7D7B7D29BD31F9FBF1F9D267FCFE5FD680EE49E94838E87AF5A667A7AE71FD68FF3DBA7B53F260499FF000E9FFD614B9FFEBF3EFF00875A8C673EBDB3F4A507FAF5EDD68F4DC44D9ED93FE1DB8A9149E3BFD3F4AAD93C76E7FCF1C53C37B761FE7F5A3C97F5F90FA16D5BA7D2A5563F963F0FCAA906FF00F57D3FFAD4F0D9EE79F5C7E3EF408DF2FF004FF3FF00EA14C2DEA076350647E38FCF39A8D9FF005E7BFAF4ADBD4C499A4E3E950339393C7E3FE73DAA32DC123DFB7F5A85C9F6FCFEB53741DB6B0FDD9DC49E0FA7E5E9E951B3E3903A77FF0038A899F8EE0F238FF3F4A859B3D33FE7391EB4994B51ECDD79C67D2A02D8FF00EBFEBD69ACFC73FE7B7F5A84B03D4E0FF9EF52F62D2B7F5A8F2D9EFD3B546CC481E9FE71DE984E38073C77FD3B5267D4E695BF018FCFBFB9A3776EA7FCFAD47BB8E0F1DFFC69A491FA7D3FA53192337D3F4FF3D69BBBD7AE3FCFB533EB9FE7F4FAD273E9EDFE34213D47E40EE7DB1FA500FF004E98F5EF4DEDD39F7E7F4A5CFD07FF00AFEB405FD50A3AE4E3FCF269F91EDFA7E7D7BD30673C038C93EBFCE97AFF002FF38FC281FE63FD976FE1FF00D6A4FCCF34CDBD48073FE78F4A70CFAE7AFE428B885CFAF6CF4FC29D95FD71EDD3FCF7A6673ED9E3D697A73D6818B81D3181F87A7FFAA94291D33C7AD2027BE7D3FF00D78A4C8FFF00552FEBB80E6CE3938E78CF5E31467D467FFD5499CE703DC7E34A4F6FF3FCE8D83E42F3CFB71D7F0E94A0F3C0EBC7F9FC299EFD33CFAFAFBD1D07E1DBFCFB53EE1D74FEB51FB873C74E6938FF003DBBFD3FFD74DDDC74E99FCFFF00D74B9EC707FCE6900EFF001EF47CBDB3C71C53383DBAF341FAF4F6F7A0077AF4FF003CD341C1EBF966973C7D3B74E2979FFF005E7DFA9E940003EE718C7F8D2F20E73EFCFF009ED4DC1CFF005FF1E94A781EBD28D7FAD8050C7A71F88F4FFEB5389F5C73CFF2FC2980FE5D81E9FE147E7FE1C0A34BEC1F88EEC3B9CE3FCFE14BE83F9FFF00AFBD37D3FCFB5293F81FFEBD1FF0442E73DBF1A39E48CF4FEBF853323D7FCE0519CF7E7AE3DE81A1DBBB77FCFBD00B5307A8FAD3811C60E07FFAFAF1400EE7A923F5E69473FCFB8E00FAD267F9E3FCFE14873EDFAFA7FF005E801FD7A751CFB7D6933FCFDA999C90B8C7BF7FF0A00E7B1FFEB7E2051A07A8EFAFEBF8D46F91CF5E73FF00EBEF5293C7F8D47CE71E9C7EBF951FD761F6F4115B232793EE734A18FF009EDFE7148DFD7FFD5FA5282719F7EFFD28DBE6225071DFFC7FA9A4C907F0EDFE734C0D8CFF004FC29339EB9A107F5725CE33FD6909FCBA7AFB7A53475F5E946EC1FE5F87BF5FAD01A8EEBD7FCFEB498039CF3F503F9FAD2673FE7FA75A4CF3C7F9EFD68B031DFE7F134678E293D0FF009C7EB4671FE7F4E2806BAFF4C774E9EF4B83D87F3F5EF9A6F6CE4F3F4A09FF003FCBF5A003F5FD7F3A4C67FCFB8A5CE73D4F3FFD7E9467BFF33DA800C7E5EDF8FE9475FAF23FAF3D68C8E79A3FCFD6800E7E9EFC0A01F7FE7FD293FCF1499FD38CFB7B1A06484F6FEBFF00D7A3F1F4EA7E94839CF6EE7B7E7F87BD2F7C7E3D7FFD7400E073F8E3DFD3F0A31EFEDDBF3E6A3E7F0EBCD049F6C502D893FCFA77FF00EBD1FE3E9DEA1C9E87BFF2A77E1FAD003FB7A73FD3FF00AF499FF26933FF00EAFA7E3EB41233EA7A7F9FD28F4B85B61E0F38FF0039ED4A0FF2FC7FCFD2A2CF1800F4E9DB9FAD3813DBF4A064D9A901FC7FA5419FA7F9CF34E04F7FF3FD6908D72FC75EB9FF001C54258E7EBC019FF3FE4D465BF0CFF2E7B7E74C67FAF5FEBC679AD998243D9FF1EDEDD3E99A88BFD3B9E3FF00D75197E3FC78E9F8542CDF88CE78FF003EF52348959BF01FE7DAA0693FCF39FF001A6173F97A7F9F4A80BE49E31E952FE45A5F80E67CD4791D739FD7B629BBB8EFD477FCA9');
   addhex('A4F5FC282BFC8909CF23823D3D29BF97A53370E7A528E39FCBF5C6281A17D4E783F4FF003F8D267A7F9FC7147BE4FF009FAD379F6FF3FA74A103F21C0FF9FF00238A767F0F6FC6A1271D7F218FF0C5286E7FC8FC69EFE8224EDCF07FA75A064771C1FF0038FCA981BAFBFF009F4A7EE3FE7FFD74ADA07E62E4E38EFF00D7EB4B939C13FF00EBC8FF000A667FCFE54BCFA7E7FE41A062827B63FCF4A50C7D3FFD5DA9B93EF467B73E9CF5A03F02438F4CFF009F4CD2161FCBAD3723A0FAD28F7E71F97F851EA02F6C839FFF005500F4FA7BD349CF51C0FF003C9A5C641E3DF9FF003EF407DC3F273D47F871D3F2A33939E3A7F2A8C8FCC0FF00EB67F2A4071EA0FBD21FDC4BC8F4EBDBFCFE14A1B9F5FF003F5F4A8F9E4E7FCFFF00AC537AFD7F3F4EF40AC4C48CF3FF00D7A407F11FE7BD44391EE3F0A7F5C60E3B73EBFE140FA8FE4FFF005BE99A43C7E3FE473C5371F5EBFE7DFD6973C8EA7FFD5DE8FEAC4FCC5FA7F9EFCD381241E00EF8FD6998C7AF4EF4849EFC60FE1F4A7F31F444991DF3DA93381EBD3A9A67AFF9E98F4A5E7AE7A7B7F4A5FA8598EDC0E0138FAE3F9D2F18EBDFB8A8FF00023FCFF9F4A518E718E4FD3F2A7F21F98FCF3C74F6FF003DA97AF6EDF8F634D3F8F1D6933F81CF6E3DFF00AD217E43FA75FD71FAF341C75C0EBF971F9D3727D7F98E9406EFC74E3A7E94C3524E3D31FA7E1498E7A639FF003EFD29B9CFE1F87AE07B527E27F0A431E78C73F4FE7499E074E9FA9FD4D3327D7FCF7A507F1E29885CE7B7F3A53FE7B7F4A6E7AF1EBD7A73F8668CFD7F1F73F5A41BF71727D79CFEB4EDC79E9E9DF3FF00EAA60C753F5EBF41CFD2949A7D8071EBD3DF8FF39A4E3BF5FC3B5373D78F7E2937738F4FCBA76A43EDD07FBE6933EDDB1FA53738A33EDD73F9F1EDD8500BF524C8007E5F4F6FCA8CE4FE9F9E3B8A67F9E7FCF5A53D318047BF342FC407E073F5F7A38FCBD7FF00AD4DCF1FAF7FE4283DFAF5FD7A7FF5E80F41DDF8FA739EF47D7FCFBF5A6FF9EDEDF8500E3F0F4FF3ED407A741DFA7340E7B8FE7F97F934CDC334673F97E1430F41C4E7AFF9EBF8521EB4DE7AFD0F3FD28FC3DFF4A005C7F8D3811EFEB4CCFF009CFB934B9FAFE79A603F3F8FFF005FDE8E3F3F5A667BD0323FAE3D681120E9CE3FCFEB4BEBEFCFF9E2A3CFEB4B9F7ED8E7FAD161A24CFF009FCE9A4F3FE18F5EF4CCFA8F4A3F5C7F5A05FD7617914993EDE9CFE3F5A3F03C631F4F4CE28FCFD3B8A00507AE4FE5E9CD2E7B7E1DBF5CD3738E79CFD3FCFF009146EEDFE7FCF140EC3F81F4FF003CD19C5465B3FE78CF4F6A424FBF3FE47E945844DBB8FF003FA52EE3FE7A7F3A841FF3C77A703FAFD2819FFFD9FFE108DD687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D27EFBBBF272069643D2757354D304D7043656869487A7265537A4E54637A6B633964273F3E0D0A3C783A786D706D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F223E3C7264663A52444620786D6C6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E7461782D6E7323222F3E3C2F783A786D706D6574613E0D0A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020');
   addhex('20202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020203C3F787061636B657420656E643D2777273F3EFFDB0043000201010201010202020202020202030503030303030604040305070607070706070708090B0908080A0807070A0D0A0A0B0C0C0C0C07090E0F0D0C0E0B0C0C0CFFDB004301020202030303060303060C0807080C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108004B006003012200021101031101FFC4001F0000010501010101010100000000000000000102030405060708090A0BFFC400B5100002010303020403050504040000017D01020300041105122131410613516107227114328191A1082342B1C11552D1F02433627282090A161718191A25262728292A3435363738393A434445464748494A535455565758595A636465666768696A737475767778797A838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F0100030101010101010101010000000000000102030405060708090A0BFFC400B51100020102040403040705040400010277000102031104052131061241510761711322328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A35363738393A434445464748494A535455565758595A636465666768696A737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00FDFCA28A2800A19828C938CD617C42F88FA3FC30F0E5C6A9ACDF5B58DA5BAEE6795F680338F73D48000049240009201F867F68AFDBE75D');
   addhex('F8ADA65FE9FE1EBCBEF0CE912AFF00A334236DDEA8A71866911B312310C851486523E666C951E6E3B34A3865696B2EDFE7DBFAD0F6F27C8713984ED495A3D64F65FE6FFA763EC2F891FB4E7843E1A5E4F6577AB5BCFA9C113CCD676EC1E5013390C4908A720801981278009E2BC3BE20FEDFBAACBA34577E1FD0A445B9B992D156F4B36D9232415D916189C6C3912630E39C8207C8DE1BD6AFBC4BA868F1DE6A125BFF0063A8B786F164904E1718508F9246D5E004000009E4B3357A0F84A3D32C2CAD7ECF6A84C84B1B895DA5918293F337015541C0381F292324D7CAE233CC455D9F2AECBFCF7FCBD0FD0F09C1D82C324EA2737E7B7C92FF00827A0DDFED17F11FC45A45CDE15D6219E56FDD436914EA91292B863B9D9F6E3710325BE56E704628F8ABF6AAF14786FC54D676571E284B2663F669AE6498CD7499C07C314DA080480501518079C9ACB867998462DEF2E2368147987CD66C12704139F9874E3A6719F7D117F75359B43753BBDB484C691CB724A4B26D3B14210C3249503A125BA7AF12C6CEFF0016FE67A8F2FC3476A51B2E96FEAE77DA37EDA1E21D36D5EE74FBF875BD334D8C1BE7D4E252C0E46E5492258CB15E0EED84618704E2BD93E127ED79E1DF893710D8DEC73E83AACCC6348AE41304CC06711CC06D271CE0E0E08C807207C2FA8453585C1996065825972E238DCA33839C67038E1480D9230BD0D775E14D623F11ACF14D6B6A6E2E65F2BEC4D84B68946E62C58B021C3608272F939053095DD85CEEAC27CB297C9EBFD7C8F2B31E16C1D5A6E508F2BEEB4FBFA3F9F4EA8FD06A2BE7AFD9EBE395D784F55B1F0B6BF792DE69D7A5A1D2F509D8192DE45603ECB330E09C3028C42965E8BF2B88FE85AFB2C2E2A35E1CD1FEBFAFEB5BA3F30CC301530957D9CF5ECFBAFEB75FA6A1591E3CF1AD97C3CF08DFEB37ECC2DAC2232155E5E520708BEE4F1CF1DC90326B5EBE1DFF0082B1FED016FA7C1178392F1A211C3992154244F3C81725DBF856285870325CDD27646CE598E2FEAF41D45BECBD7FAD4E8C932D78EC5C70FD377E9FD69F33E7BFDACBF6A7D47F684F13DC4F25E5C268915CE6D6D03614955237851CE7EF05C8C80C7BB313C0E8B78F74AD949218F69290B1E5D704961C73C641C1EFEB9AE2EFBC4B6D69AADC431CB79710A0CCB7516D324A001B8201C282401F302700743907534ADFAADE401C057836AE1312ACBD0EE63CEF624E33C703D863F36AB5A739372EA7EF386C253A14952A6AC9743A5D73C5F69A7EABA05B48B7310769EF9A3F33648C9198D0B05C83901C7B28273C1E7D5FC21F13EDA1F0E1BB817CF795A2468A390C4223264AC8E495C92B850178247523AF9FF8ABE17DCEB5E1D97598EC6EEED748B8124D2B421992075058A025496C46A576963C630464D6CF82E68B4CF224C16D42689ADD14CACA2E90A0F9272CA188DC49046DC165CE14BA9D16966DD8E7A8D4AE9743B1D3FE30C9AC59DD2452D859EA0CA51F64A5FCBE48DCD9FBC49C60000770A31CDBB7D63C8B6171A99B9D4EE046EC640556256DC806DC9C9C2976EDC84E0E4EDE32CFC3326ABA44DF68B1856FE63948661C26700F1D9C67246011EBC1AEEFC13F0B67B1D52E61D6B5078E4D3034735A6CF359522DAEC46D620991988DA73900F002F39C13A92B2FC4CEA385357FCB7FF31924F3DE5E4AD768F3095D48D8495F9D432103A1521B703D483CE7A57B2FC2BF859A7EABA7C578419CA286DCA84796DDF8240C90C467FDAC8E82BCDEEEFF00C35E20D5DC5B699721EC8085963947D9AD860821550120333E4B6402C01DD57B52F8F3224F6525922C17D6A9BE4915373DCE0E46E4C0C125893C007271DAA2A462AA377BFF005FD6E7362235AAD2E4A5EEBEFDBFAF2FC8FA0FC75F0BB4BF18FC37BA1688F61AC2C4AD14CDB336F72BCC2CEA09C912615941F99649141C357A2FECDFF125BE28FC25D37519998DE460DBDC863960EA7009E9925769CE39CF1C60D7C931FED29AC8D1D91AF6D526742CF15BF9AAEEB8C8624FCB82080A1581CFF0E3AFAB7FC1393C4AD7F1F8DAC002B126A1F6D5419D91992499182E7A0262CE3D49AFABC8F177AB18256BA6BF55F97E2CF85CF328AB4B0139D697338C935F3D1AFCBEE47D375F921FB6678D2D7C73FB44F8D9F56170D1C3A95F5A43B06E111B7BB5B7DC46E1D63808E3FBCBC127E5FD6FAFC8DF8C3F0B6FFC55FB4D7C4FD2E0F2FF00B4749F166A32953288D8C57128BB4232400765D260920673923048DF89E7CB4A127B26C5C0118BC4D56DEA92FBAFAFE3639CF87FF0FB4CF8ADA9AE93A2787EF27D5AFED9E1B7F3031FB3DCEE8C8723710C02ACA0602FCAEB9E5493ED5E3FF867E19F827A9BD8DB2E8E3528ADA64090B9B88AD66172E6271941C18157707DCC37E064216367C37FD8FF00B257806FF5292E639FC4379094B316FBD5D572B924B30033824ED19E073C73F37F8B7C792F8B5AE2E4CA22BA7C24D2C87E6049C33124F385C74C73C71C13F1D1AEE4B6563F478D39D6AB7526A0BF17FE4BA77773D2BC4FF142E3C55A8CD045ABAC16934ABF68C5C2AC68855D56224F44039240DB939EB8038683C756969AB7973CE96AF6AE4412A92AAEC5B695C8C9439E8C4B06C2F038238DBAB989E16B58C048E6C8B5328F284C5725082032B3104B7538DDD873581A86A936B72B6936F66DFF0012B563347B7323A9CEDE002581CE37638C28270C28852E66DCCE9924972D3D8FA0B4BF8953EB');
   addhex('3791E9D13C1742104CD1DC6124B6507717E3821490C36E490C542824668E99F186C7FB4A7BEB14D42510BBEDF3E611C2AC49C49D15B9CA12BBF71DA09601486F14F85FF17A44B65B78CDCC97B62AD1B32B942E5483B53610ECC02B3609CFCD803B56778C7C617AF241A90962B9B295413776EAA77A973CB1C72FD179E30173D79DD249EA95CC950E6D75B7DDFF0004F75B0F8B9225A5D5BDBDECE86ED5619E54453F28C02A3006C1C1FB8392476CE62D43C7EAB7C64B7926BCB81F31B824484923A0527D7DCF51E99AE374BF15785EF749F094093E82350D562B986FD6F6FAE6DACAD6601BC896E591F7AA8C8388D110E5016625CAD5D27E21786A5BCB8B6315A5BDBDC5AB4D14F7B7D3C4B06C9DCBEE29D6E0C2A111182AEE60DB777065E19DD31C64B5B2B7F56FD3EED8F49F0B78C24D6EEE779EE0C935D4821089C386070B95EE43311C9047E383F64FFC128EDCEAFE19F1EF885548B4BFD6BFB3ED4E490E2D94990A93C10259A442471BA361D54D7E6AB7C5197C3FA12BD9C0D7BA9DD49FD9DA5C1FEA9EEEEE53B235C8E7976F998F201CE4718FD74FD833E1B5B7C10FD94BC1FA046DE67D9ECCCAF201FF001F324B23CD2CFF00F6DA69259BFEDA8E074AFA2E1DC3B759CFB2FF00807C5F1B6214305ECD7DA697DDAFF91EB53EB2A8A412A31D79AFCA3FF82BFDEDFF00ECA7FB6DE83F126DB11F85FE26D843617F3380D0C77F68422EEECA7CB963219BB3B11C46C57F42F56F88D142AC3CD1CF6CF35F39FEDDDE0CF0DFED65F00F5BF047885E38A2BC5F36C6F5E3129D3AED4111CE14FDE5F98ABAE46F8DDD72320D7D7E65952C561DD36AFD7FAFD3CEC7E799166D2C063235D6DB3F47FF0006CCFCF8F8C7F1E6F3C6F1452C97CD2ACC1A2851DF044CE7A609E1B737D30A793D6B83D47C7314314B058CC6EA48E105E59395120639209E830140EFBB0578E2BE7AF17F8B7C47FB2678FEFF00C21E39B1696D34A9157CF911AED628BFE59B37199A061FEAEE1391C2B0593217A6D33E22E97AE68F3DE41AEC114C90B340860FB45BDE858E6762B708C7E663E5C4A8D1B2B6E62D22E369F80965AE87BAD688FDA2966B4F11052A2D773D1ADBE234176AD63712CE6DAE23F2E58F2106ECF0C49033F3630C7A120E462B2353F1D5CE81AA40BAB94D51748BB48239828124B6928EE0F2A46EC907A3478AF255F1FDB5F49B166480797BA588FC8EC0F27721EABDB8F7ACBF14F8F1B58BAB38A37B696511C76ED34523C8F246ADB90BAB703E560BD79080D5C70AF9ACC978D8F2F327A9ED7E23BF9BC2DE258E4134C91DE43E745710E3E59621C918E7046D201E78AE9EC3E20BE9B3CB770A5AC905C44B2DEDBCA8A844722F322F42CA1C90186EDB8C30C1E7E7F97C7171796B15BDCDC450ADAFEF6232C80095768270C4E3E56C823AFCA2B4347F8952EB4D0DAD9DFC57335A6442810CBE6A3120C6B956CF6F97904120D635306DABB3A29E60B9ACBAEC7B06B3A943733CCFA6B456930512B5AAB79D194202996265E4C618ED6563B90B739186AA96BE24861370F7176B1456D1F9B3DCCA4ECB753DCFFB5C703AF3DB935E6FAA7ED03E19F857712F9D2DA6917F02CDE6D9E9CCB757103C8A559618F3E5DAA9EE1DC952D9083016B0BE1437887F6BBF12DBC70C56DE12F04D8C804D70A8CF6C1828C94573BAE273C7538048C955C0ADB0B9655AD24927633C5E6F87C3C1BAB25F23ED6FF82737C3F5FDA5BE3D5AEAF710CF6DE13F06A29B99DB00C71B8398C13FF2DEE30C800E6389A56207CB8FD79B0F8C30CCA8231145181B52341848D40C0503B000003E95F9BBFB3FF8C342F847E03D37C35E1B816C347D3FE6C6FDD35D4A40DF71337F1CAF81963D000A005000F61D0FE3A062AA676248E9E666BF43CAF2C86169DB793DCFC6F88B39A998E239DAB463A25FAFAB3A3F157C7073BC099CE38C67A73F9D7937C41F8D85E3954CEC3AE46735C5F8A35098C8CA64241F61EA6BCD3C6DA8CEECEA65620577CAA347974A8A6EC711FB59C5A0FC6DD18596BB62D3C968C4D9DE42E62BAB3246098DFAE0F746CA377078AFCF5F891F003C47F0CB5392E7C33A94D7106EDF9B3222727FDBB66CC64E3BA1C1F415F7278D58CE0EFF00981EBE9D2BC77C676B182E420076E7F5AF371108CF56B5FEB73D7C3549D35683B7F5F81F27DC7C75D7F47885AEB5A66997B2A11F35C4325ACA707B8E573C7F0E07B54D6BFB4CC71A047F0E40C9B76E1355744C63A00071CF3F9FAD7B36BBC9743F320C8DADF30FD6B9EB8D36D4485BEC969B89EBE427F8579FFD9F4E4F6FCD7E47A71CEB131D39BF27F9A679EBFED1D35CC4B158785B4247CE13CE692E4AF39E02ECE73EE7BFAD4A2F7E23FC495649EE6EACECE6C06558D2C2065F42B1A82E3EBB8D7A14370F66FB61DB0A9EC8A17F956A6904CB3067258939E4D10C1528F4FEBE6454CDF113D1C9FE4BEE564735F0D7F671B48AE23975590EA920E440B98EDC7D40C16FC71F4AFA8BE1C5ACD670DBA1D91C508DB1C68BB12351D0003000F615C478421464505462BD1FC2E48298E376335E9D1A5182D0F26B579D4DD9EB5E12F1249610A032313803B1E6BBAD1FC7F244A18B1181918EB5E45A3B18BEE920053F4EA2BA2B1B8768D89624838AEA4F439796FB9FFFD9');
   update my_images set blobimage = v_lob where id = 1;
   commit;
end;

Using the code examples above as a model you should be able to send attachments along with email. These work with authenticated and unauthenticated connections as well as those with or without TLS encryption.

Thank you for reading. Questions and comments, as always, are welcome.

2 thoughts on “Sending Email with Oracle, Part 7: UTL_SMTP – Attachments

  1. Why could it be that if I use multipart/mixed it doesn’t show the text/html in the mail?

    This does not appear for me: This is a multi-part message in MIME format

    1. If you don’t have your mime blocks properly delimited that could do it. It could be a setting on your email client. If you have a small example that doesn’t render properly, you can email me a copy and I can take a look at what I get or better yet, send the code too.

Comments are closed.