Programming Languages on Power

Power Programming Languages

IBM Power, including the AIX, IBM i, and Linux operating systems, support a wide range of programming languages, catering to both traditional enterprise applications and modern development needs.


#Power


#Servers
#Programminglanguages
 View Only
Expand all | Collapse all

Decode Base64 PDF

  • 1.  Decode Base64 PDF

    Posted 01/19/24 04:43 PM

    I am getting a base 64 PDF string, about 130,000 long, in my DS from a web service and trying to get it as a PDF on the IFS.

    How do I decode something that long?

    I am rather new to SQL so all the guidance is appreciated! 

    I can't seem to make the fields long enough to hold strings.

    Code Is not working. 

     
      // Report Response From API Call
      Dcl-ds EODReportResponse                 Qualified;
     
        success                            Ind;
        warning                            Ind;
        cnt_messages                       Int(5);
        ApiReference1                      VarChar(100);
        ApiReference2                      VarChar(100);
        ApiReference3                      VarChar(100);
        ApiReference4                      VarChar(100);
        messages                           VarChar(100)        Dim(10);
        transmitid                         VarChar(20);
        transactionid                      VarChar(50);
        summarypdfb64                      VarChar(4096)       CCSID(1208);
     
      End-Ds;
     Dcl-S DecodedReportBinary  SQLType(VARBINARY : 16000);
      Dcl-S DecodedReport        VarChar(4096)       CCSID(1208);   
            // Parse Response JSON Label Doc Using YAJL
            data-into EODReportResponse %DATA(ResponseFile
                 : 'doc=file case=any countprefix=cnt_ allowmissing=yes allowextra=yes')
                 %PARSER('YAJLINTO');
     
            // Decode the encoded text into an EBCDIC VarBinary field
            Clear DecodedReportBinary;
            Exec SQL Values QSYS2.BASE64_DECODE(:EODReportResponse.SummaryPDFB64)
                Into :DecodedReportBinary;
            If DecodedReportBinary <> *Blanks;
                DecodedReport = DecodedReportBinary;
                                                          
                                            
                                        


    ------------------------------
    Jerry Forss
    ------------------------------

    #SQL


  • 2.  RE: Decode Base64 PDF

    Posted 01/20/24 04:43 AM

    Please check first either the SQLCODE or the SQLSTATE immediately after the SQL Statement. If will tell if there is an error and which error occured.



    ------------------------------
    Birgitta Hauser
    Database and Software Engineer
    Selfemployed - Modernization-Education-Consulting on IBM i
    Kaufering
    +49 170 5269964
    ------------------------------



  • 3.  RE: Decode Base64 PDF

    Posted 01/22/24 07:34 AM

    Hi Brigitta

    The SQLState is 00000.

    I think my problem is the length of the resulting json element.  It's 152,356 long.

    If you are interested, I can send the json.  It's just a test PDF report.

    When I copy/paste the json result into a on line decoder the resulting PDF is correct. 



    ------------------------------
    Jerry Forss
    ------------------------------



  • 4.  RE: Decode Base64 PDF

    Posted 01/21/24 06:49 AM
    Edited by Satid Singkorapoom 01/21/24 06:49 AM

    Dear Jerry

    >>>>  I am rather new to SQL so all the guidance is appreciated!   <<<<

    I have no answer for your question but if you want to pick up your SQL skill for DB2 for i. I suggest a good resource for you to digest on this here https://www.rpgpgm.com/p/list-of-all-posts.html  and use the hot link on SQL and programming.  There are an abundant amount of SQL articles to digest. 



    ------------------------------
    Chance favors only the prepared mind.
    -- Louis Pasteur
    ------------------------------
    Satid S.
    ------------------------------



  • 5.  RE: Decode Base64 PDF

    Posted 01/23/24 07:33 AM

    Please be aware that QSYS2.BASE64_DECODE returns a data type of BLOB(16M).
    Perhaps SQLType(VARBINARY : 16000) simply isn't large enough to hold the result.

    Good luck!



    ------------------------------
    Scott Forstie
    ------------------------------



  • 6.  RE: Decode Base64 PDF

    Posted 01/23/24 08:42 AM

    When I try and make it larger the compile fails with a SQL0312 reason code 1.

    Still digging.

     






  • 7.  RE: Decode Base64 PDF

    Posted 01/24/24 11:49 AM

    Change the SQL data type in the D spec from VARBINARY to BLOB and increase the variables length to something like 1000000 and try it again. Note you may also need to increase your "PDF" variable from 4k to something larger.



    ------------------------------
    Robert Cozzi
    ------------------------------



  • 8.  RE: Decode Base64 PDF

    Posted 01/26/24 08:24 AM

    Hi All

    Here is where I am at. The ResponseFile is the path to the json.

    dcl-s db64 sqltype(clob:180000);

    dcl-s pdf sqltype(clob:180000);  

    Dcl-S DecodedReportBinary  SQLType(VarBinary : 32740);     

    Dcl-S DecodedReport        VarChar(16000)      CCSID(1208);   

    exec sql SET OPTION COMMIT = *CS, NAMING = *SYS, CLOSQLCSR = *ENDMOD;

    exec sql set :db64 =

        get_clob_from_file(:ResponseFile,0);

    exec sql commit;

    exec sql set :pdf = json_query(:db64,'$.summarypdfb64' omit quotes);

             Clear DecodedReportBinary;

              Exec SQL Values QSYS2.BASE64_DECODE(:PDF)

                  Into :DecodedReportBinary;

              DecodedReport = DecodedReportBinary;  

    The SQLState is 01004, right truncation.

    I just have never had to deal with variable this long.

    What am I doing wrong???

    The pdf variable contains the base 64 field from the json.

    I am finding so little documentation on the qsys2.base64_decode!

    Can the qsys2.base64_decode accept a clob as the input string?

    If not, how do I convert clob to blob or varchar?

    Is what I am trying to do so unique that I am not finding documentation?  I wouldn't think so.

    I am getting feedback from people that the decode routines can't do more that 4096 at a time and I have to decode in chunks?

    Is that right?

    I feel I am so close!!

    This is what is working on a much small object. DecodedLabel contains the ZPL code.     

      // Label Response From API Call

      Dcl-ds LabelResponse                 Qualified;

        success                            Ind;

        warning                            Ind;

        cnt_messages                       Int(5);

        ApiReference1                      VarChar(100);

        ApiReference2                      VarChar(100);

        ApiReference3                      VarChar(100);

        ApiReference4                      VarChar(100);

        messages                           VarChar(100)        Dim(10);

        labeltype                          Char(10);

        base64data                         VarChar(4096)       CCSID(1208);

      End-Ds;

                                                        

      Dcl-S DecodedLabelBinary   SQLType(VARBINARY:4096);

      Dcl-S DecodedLabel         VarChar(4096)       CCSID(1208);           

                                         

             Clear DecodedReportBinary;

              Exec SQL Values QSYS2.BASE64_DECODE(:Labelresponse.base64data) Into :DecodedLabelBinary;

                  Into :DecodedReportBinary;      

            DecodedLabel = DecodedLabelBinary;                



    ------------------------------
    Jerry Forss
    ------------------------------



  • 9.  RE: Decode Base64 PDF

    Posted 01/26/24 10:26 AM

    In cases like this where you cannot find what you're looking for in the documentation, you can always check the Schemas view to see how the function is defined.
    This goes for other object types as well.
    After checking the Bas64Decode definition, the parameter size is indeed 4096.

    I have needed to split Clob data to use against built-in-functions before so I of course have endured the pain so you do not have to.
    To split the data, I used a recursive CTE. This loops over the clob while performing a substring.
    In the end, each substring performed will add 1 row to your end result. 

    This example is for 32k so make the necessary changes for 4096 or smaller.
    In the final select, you could try performing the decode function over substring_data as once you make the changes, it should be a maximum size of 4096.
    If it still doesn't work, its possible the implicit data length assigned to that column is larger than 4096.
    You can try explicitly casting it before calling the decode function just to be sure.

     

    WITH
                        a (clob_data) as (
                            values clob_value
                        ),
                        
                        b (substring_start, substring_end, substring_data, remaining_data) as (
                            select 1, 32000, substr(clob_data, 1, 32000), substr(clob_data, 32001)
                            from a
                            union all
                            select substring_start + 32000, substring_end + 32000, 
                                   substr(remaining_data, 1, substring_end),
                                   substr(remaining_data, substring_end + 32000 + 1) 
                            from b
                            where substring_start = substring_start 
                              and trim(remaining_data) <> ' '
                        )
                        
                        select substring_data
                        from b;

    -Mike Z



    ------------------------------
    Mike Zaringhalam
    ------------------------------



  • 10.  RE: Decode Base64 PDF

    Posted 01/26/24 02:42 PM

    Have it working but have a question.

    Code

    dcl-s Base64json             SQLType(clob : 2000000);
    Dcl-S Base64PDF              SQLType(clob : 2000000);
    Dcl-S DecodedPDF             SQLType(blob : 2000000);     

      exec sql SET OPTION COMMIT = *CS, NAMING = *SYS, CLOSQLCSR = *ENDMOD;
     
        exec sql set :Base64json =
          get_clob_from_file(:JSONPath,0);
     
        exec sql commit;
     
        exec sql set :pdf = json_query(:db64, :ElementFied'$.summarypdfb64' omit quotes);
     
        // Decode
        Clear DecodedPDF;
        Exec SQL Values QSYS2.BASE64_DECODE(:Base64PDF)
            Into :DecodedPDF;                                      
    The question is can I make the $.summarypdfb64 a variable?
    Tried this and it fails.
    Element = '$.' + %Trim(EntElement);
      exec sql set :Base64PDF = json_query(:Base64json, :Element omit quotes); 
    I would like to make this a separate pgm that I pass parameters to.


    ------------------------------
    Jerry Forss
    ------------------------------



  • 11.  RE: Decode Base64 PDF

    Posted 02/24/24 01:07 PM

    I gave you the answer earlier... change from VARBINARY to BLOB and increase the length. You did that and it now works. Great. 

    Note sure what this new example has to do with the original...

    Also the syntax of your json_query(...) call is clearly not correct as shown. Perhaps a cut/paste issue?

    Did you mean _> 

    exec sql set :pdf = json_query(:db64, :ElementFied,    '$.summarypdfb64' omit quotes);
     



    ------------------------------
    Robert Cozzi
    ------------------------------



  • 12.  RE: Decode Base64 PDF

    Posted 02/14/24 09:32 AM

    Here is what I have working. 

    I would like to get 2 elements from the json, first a tracking number and then the base64.

    The tracking number ends up with ??????????? and the base64 is correct?

    What obvious thing am I doing wrong?

         Exec SQL Set :Base64json =
            Get_Clob_From_File(:EntJSONPath, 0);

          Exec SQL Commit;
                            

              Exec SQL Set :Tracking = json_Query(:Base64json,
                '$.output.transactionShipments[0].pieceResponses[0].trackingNumber'
                Omit Quotes)
                          ,:Base64Doc = json_Query(:Base64json,
                '$.output.transactionShipments[0].pieceResponses[0].packageDocuments[0].encodedLabel'
                Omit Quotes);
                                         

    json

    {
    "transactionId": "a7a9b3dc-284d-4afb-92f7-c2a718b75428",
    "output": {
    "transactionShipments": [
    {
    "masterTrackingNumber": "794987383633",
    "serviceType": "FEDEX_GROUND",
    "shipDatestamp": "2024-02-14",
    "serviceName": "FedEx Ground®",
    "pieceResponses": [
    {
    "masterTrackingNumber": "794987383633",
    "deliveryDatestamp": "2024-02-15",
    "trackingNumber": "794987383633",
    "additionalChargesDiscount": 0.0,
    "netRateAmount": 0.0,
    "netChargeAmount": 0.0,
    "netDiscountAmount": 0.0,
    "packageDocuments": [
    {
    "contentType": "LABEL",
    "copiesToPrint": 1,
    "encodedLabel": "XlhBXkNGLDAsMCwwXlBSMTJeTUQzMF5QVzgwMF5QT0leQ0kxM15MSDAsMjAKXkZPMTIsMTI0XkdCNzU1LDIsMl5GUwpeRk8xMiwzOTBeR0I3NzcsMiwyXkZTCl5GTzMyLDNeQWROLDAsMF5GV05eRkheRkRGUk9NOl5GUwpeRk8zMiwxOV5BZE4sMCwwXkZXTl5GSF5GRF5GUwpeRk8zMiwzN15BZE4sMCwwXkZXTl5GSF5GRFdhbHpDcmFmdF5GUwpeRk8zMiw1NV5BZE4sMCwwXkZXTl5GSF5GRDI2MDAgSGVtc3RvY2sgU3ReRlMKXkZPMzIsNzNeQWROLDAsMF5GV05eRkheRkReRlMKXkZPMzIsMTA5XkFkTiwwLDBeRldOXkZIXkZEVVMgXkZTCl5GTzIyNCwzXkFkTiwwLDBeRldOXkZIXkZEKDYwOCkgNzgxLTYzNTVeRlMKXkZPMjgsNzQyXkEwTiwyNCwyNF5GV05eRkheRkRUUksjXkZTCl5GTzI4LDgwMF5BME4sMjcsMzJeRldOXkZIXkZEXkZTCl5GTzEzNiw3MTJeQTBOLDI3LDM2XkZXTl5GSF5GRF5GUwpeRk8zMiw5MV5BZE4sMCwwXkZXTl5GSF5GRExhIENyb3NzZSBXSSA1NDYwM15GUwpeRk80NzgsM15BZE4sMCwwXkZXTl5GSF5GRFNISVAgREFURTogMTRGRUIyNF5GUwpeRk80NzgsMTleQWROLDAsMF5GV05eRkheRkRBQ1RXR1Q6IDE1LjAwIExCXkZTCl5GTzQ3OCwzN15BZE4sMCwwXkZXTl5GSF5GRENBRDogMDAwMDAwMC9GQVBJMjIwOF5GUwpeRk80NzgsOTFeQWROLDAsMF5GV05eRkheRkRCSUxMIFNFTkRFUl5GUwpeRk8zOSwxMzZeQTBOLDM5LDM5XkZXTl5GSF5GRF5GUwpeRk8zOSwxNzheQTBOLDM5LDM5XkZXTl5GSF5GREpFUlJZIEZPUlNTXkZTCl5GTzM5LDIyMF5BME4sMzksMzleRldOXkZIXkZEODYxNyBGQUlSV0FZIFBMIFNURSA2XkZTCl5GTzM5LDI2Ml5BME4sMzksMzleRldOXkZIXkZEKipURVNUIExBQkVMIC0gRE8gTk9UIFNISVAqKl5GUwpeRk8zOSwzNDdeQWROLDAsMF5GV05eRkheRkQoNjA4KSA0NDUtMjE4Nl5GUwpeRk8zOSwzMDReQTBOLDQzLDQwXkZXTl5GSF5GRE1JRERMRVRPTiBXSSA1MzU2Ml5GUwpeRk83MTksMzA0XkEwTiw0Myw0MF5GV05eRkheRkQoVVMpXkZTCl5GTzcwOSw0NDBeQTBOLDE5LDI2XkZXTl5GSF5GREdyb3VuZF5GUwpeRk82ODksNDgwXkEwTiwxMjgsMTM3XkZXTl5GSF5GREdeRlMKXkZPNjc3LDQ2Ml5HQjEwNCwxMCwxMF5GUwpeRk82NzcsNDcyXkdCMTAsMTEyLDEwXkZTCl5GTzc3MSw0NzJeR0IxMCwxMTIsMTBeRlMKXkZPNjc3LDU4NF5HQjEwNCwxMCwxMF5GUwpeRk80NjQsLS1eR0IyLDEyNiwyXkZTCl5GTzY1NCw0MDJeQTBOLDQzLDU4XkZXTl5GSF5GREZlZEV4XkZTCl5GTzcwOSw0NDBeQTBOLDE5LDI2XkZXTl5GSF5GREdyb3VuZF5GUwpeRk82ODksNDgwXkEwTiwxMjgsMTM3XkZXTl5GSF5GREdeRlMKXkZPNzkxLDQ5M15BME4sMTMsMTheRldCXkZIXkZESjI0MTAyNDAxMTAwMXV2XkZTCl5GTzksMTM2XkEwTiwyMSwyMV5GV05eRkheRkRUT15GUwpeRk8yMSw0MTJeQlkyLDJeQjdOLDEwLDUsMTReRkheRldOXkZIXkZEWyk+XzFFMDFfMUQwMjUzNTYyXzFEODQwXzFEMDE5XzFENzk0OTg3MzgzNjMzXzFERkRFR18xRDQ5MTAyMjFfMUQwNDVfMURfMUQxLzFfMUQxNS4wMExCXzFETl8xRDg2MTcgRkFJUldBWSBQTCBTVEUgNl8xRE1JRERMRVRPTl8xRFdJXzFESkVSUlkgRk9SU1NfMUUwNl8xRDEwWkdEMDA5XzFEMTJaNjA4NDQ1MjE4Nl8xRDIwWl8xQ18xRDMxWjk2MjIwMDE5MDAwMDQ5MTAyMjEzMDA3OTQ5ODczODM2MzNfMUQzNFowMV8xRF8xRV8wNF5GUwpeRk8yOCw4MzdeQTBOLDEwNyw5Nl5GV05eRkheRkReRlMKXkZPMTIsNjgxXkdCNzc3LDIsMl5GUwpeRk80OTQsODg1XkEwTiw0Myw0M15GV05eRkheRkReRlMKXkZPNzg4LDI4XkFiTiwxMSw3XkZXQl5GSF5GRDU4M0o1L0VDMkIvOUFFM15GUwpeRk85NSw3NDZeQTBOLDUzLDQwXkZXTl5GSF5GRDAwMDAgMDAwMCAwMDAwXkZTCl5GTzQwOSw2OTVeQTBOLDUxLDM4XkZXTl5GSF5GQjM5MCwsLFIsXkZEICAgICAgICAgICAgICAgICAgIF5GUwpeRk80MDQsNzQ3XkEwTiw1MSwzOF5GV05eRkheRkI0MDAsLCxSLF5GRCAgICAgICAgICAgICAgICAgICBeRlMKXkZPNDEzLDc5OV5BME4sNDAsNDBeRldOXkZIXkZCMzg2LCwsUixeRkQgICAgICAgICAgICAgICAgXkZTCl5GTzQ5NSw4NDFeQTBOLDQ0LDQ0XkZXTl5GSF5GQjI5OCwsLFIsXkZEICAgICA1MzU2Ml5GUwpeRk81NzQsOTAxXkEwTiwyNCwyNF5GV05eRkheRkIxMjAsLCxSLF5GRCAgICAgIF5GUwpeRk82OTUsODg1XkEwTiw0Myw0M15GV05eRkheRkIxMDAsLCxSLF5GRCAgIF5GUwpeRk8zOSw5MjdeQTBOLDI3LDM2XkZXTl5GSF5GRDAwMDAgMDAwMCAwICgwMDAgMDAwIDAwMDApIDAgMDAgMDAwMCAwMDAwIDAwMDBeRlMKXkZPNzUsOTY4XkJZMywyXkJDTiwyMDAsTixOLE4sTl5GV05eRkQ+Ozk2MjIwMDE5MDAwMDQ5MTAyMjEzMDAwMDAwMDAwMDAwMDBeRlMKXkZPMTM1LDEwMjheQTBOLDEyOCwxMzdeRldOXkZIXkZEU0FNUExFXkZTCl5GTzMyOSwzNDleQWJOLDExLDdeRldOXkZIXkZEUkVGOiBeRlMKXkZPMzksMzYzXkFiTiwxMSw3XkZXTl5GSF5GRElOVjogXkZTCl5GTzM5LDM3N15BYk4sMTEsN15GV05eRkheRkRQTzogXkZTCl5GTzQyOSwzNzdeQWJOLDExLDdeRldOXkZIXkZEREVQVDogXkZTCl5QUTEKXlhaCg==",
    "docType": "ZPLII"
    }
    ],
     
    }
    ],
    }
    ]
    }
    }


    ------------------------------
    Jerry Forss
    ------------------------------



  • 13.  RE: Decode Base64 PDF

    Posted 02/16/24 10:52 AM

    What is the data type of :Tracking?



    ------------------------------
    Michael Werner
    ------------------------------



  • 14.  RE: Decode Base64 PDF

    Posted 02/22/24 10:25 AM

    Sorry, didn't see you posted. It is a varchar(25)

    I do have another question.

    What is wrong with my code?  I am getting a null, i think.

          Exec SQL Set :Base64json =
            Get_Clob_From_File(:EntJSONPath, 0);
                                                       

          Exec SQL Commit;

              Exec SQL Set :Base64Doc = json_Query(:Base64json,
              '$.ShipmentResponse.ShipmentResults.PackageResults.ShippingLabel.GraphicImage'
              Omit Quotes);
                                          

    SQLCode is -305 SQLState is 22002

    If i add :BaseInd it is -1

    json

    {"ShipmentResponse":{"Response":{"ResponseStatus":{"Code":"1","Description":"Success"},"Alert":{"Code":"129001","Description":"Additional Handling has automatically been set on Package 1."},"TransactionReference":{"CustomerContext":"testing"}},"ShipmentResults":{"ShipmentCharges":{"TransportationCharges":{"CurrencyCode":"USD","MonetaryValue":"87.14"},"ServiceOptionsCharges":{"CurrencyCode":"USD","MonetaryValue":"28.00"},"TotalCharges":{"CurrencyCode":"USD","MonetaryValue":"115.14"}},"BillingWeight":{"UnitOfMeasurement":{"Code":"LBS","Description":"Pounds"},"Weight":"98.0"},"ShipmentIdentificationNumber":"1ZXXXXXXXXXXXXXXXX","PackageResults":{"TrackingNumber":"1ZXXXXXXXXXXXXXXXX","BaseServiceCharge":{"CurrencyCode":"USD","MonetaryValue":"71.26"},"ServiceOptionsCharges":{"CurrencyCode":"USD","MonetaryValue":"28.00"},"ShippingLabel":{"ImageFormat":{"Code":"ZPL","Description":"ZPL"},"GraphicImage":"Cl5YQQ0KXkxSTg0KXk1OWQ0KXk1GTixODQpeTEgxMCwxMg0KXk1DWQ0KXlBPSQ0KXlBXODEyDQpeQ0kyNw0KXkZPMTUsN15BME4sMjAsMjReRlZTSElQUEVSWlMgQVRUTiBOQU1FXkZTDQpeRk8xNSwyN15BME4sMjAsMjReRlYxMTE1NTU0NzU4XkZTDQpeRk8xNSw0N15BME4sMjAsMjReRlZTSElQUEVSTkFNRV5GUw0KXkZPMTUsNjdeQTBOLDIwLDI0XkZWMjMxMSBZT1JLIFJEXkZTDQpeRk8xNSw4N15BME4sMjAsMjReRlZUSU1PTklVTSAgTUQgMjEwOTNeRlMNCl5GTzE1LDE0Ml5BME4sMjgsMzJeRlZTSElQIFRPOiBeRlMNCl5GTzYxLDE2Nl5BME4sMjgsMzJeRlYxMTYwQl83NF5GUw0KXkZPNjEsMTk0XkEwTiwyOCwzMl5GVjkyMjUzNzcxNzFeRlMNCl5GTzYxLDIyMl5BME4sMjgsMzJeRlZIQVBQWSBET0cgUEVUIFNVUFBMWV5GUw0KXkZPNjEsMjUxXkEwTiwyOCwzMl5GVjEyMyBNQUlOIFNUXkZTDQpeRk82MSwyNzleQTBOLDQ1LDQ0XkZWVElNT05JVU0gIE1EICAyMTAzMF5GUw0KXkZPNDQ2LDleQTBOLDMwLDM0XkZWNSBMQlNeRlMNCl5GTzY4Myw5XkEwTiwyOCwzMl5GVjEgT0YgMV5GUw0KXkZPNTA4LDUxXkEwTiwyMiwyNl5GVkRXVDogNDUsMzAsMTBeRlMNCl5GTzUwOCw3M15BME4sMjIsMjZeRlZBSF5GUw0KXkZPNTk5LDM2OV5BME4sNTYsNTheRlZTQU1QTEVeRlMNCl5GTzEwNiw0NTJeQTBOLDMwLDM0XkZWVVBTXkZTDQpeRk82NCw0ODJeQTBOLDMwLDM0XkZWTUFYSUNPREVeRlMNCl5GTzM4LDUxMl5BME4sMzAsMzReRlZQUklOVFMgSEVSRV5GUw0KXkZPMzAwLDQzNl5BME4sMzAsMzReRlZVUFMgUk9VVElORyBDT0RFIFBSSU5UUyBIRVJFXkZTDQpeRk8yNzAsNTI0XkEwTiwyOCwzMl5GVlVQUyBQT1NUQUwgQkFSQ09ERSBQUklOVFMgSEVSRV5GUw0KXkZPMTAsMTAzMV5BME4sMjIsMjZeRlZCSUxMSU5HOiBQL1BeRlMNCl5GTzQxNiwxMDMxXkEwTiw0NCwzNl5GVlNBTVBMRV5GUw0KXkZPMTgwLDEyMDNeQTBOLDE0LDIwXkZWWE9MIDI0LjAxLjIzICAgICAgICAgIE5WNDUgOC4wQSAwMi8yMDI0Kl5GUw0KXkZPOSw2NzBeQTBOLDU2LDU4XkZWVVBTIEdST1VORF5GUw0KXkZPOSw3MzFeQTBOLDI0LDI4XkZWVFJBQ0tJTkcgIzogVVBTIFRSQUNLSU5HIE5VTUJFUiBQUklOVFMgSEVSRV5GUw0KXkZPNTksODczXkEwTiwzMCwzNF5GVlVQUyBUUkFDS0lORyBOVU1CRVIgQkFSQ09ERSBQUklOVFMgSEVSRV5GUw0KXkZPNjg5LDY1MF5HQjEyNCwxMjUsMTI0LEIsMF5GUw0KXkZPMCw2NDheR0I4MTEsMTQsMTQsQiwwXkZTDQpeRk8wLDQyM15HQjgxMiw0LDQsQiwwXkZTDQpeRk8yNDQsNDIzXkdCNCwyMjUsNCxCLDBeRlMNCl5GTzAsNzc0XkdCODEyLDUsNSxCLDBeRlMNCl5GTzAsMTAxM15HQjgxMiwxNCwxNCxCLDBeRlMNCl5GTzYyOSwxMTQ3Cl5HRkEsMDA5NjksMDA5NjksMDE5LEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMDAwMDAwMDAwDQpGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjAwMDAwMDAwMA0KRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYwMDAwMDAwMDANCkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMDAwMDAwMDAwDQpGMDAwMDAwMDAwMDAwMUY4MDAwMDAwMDAwMDAwRjAwMDAwMDAwMA0KRjAwMDAwMDAwMDAwMDFGODAwMDAwMDAwMDAwMEYwMDAwMDAwMDANCkYwMDAwMDAwMDAzRjgxRjgzRkMwMDAwMDAwMDBGMDAwMDAwMDAwDQpGMDAwMDAwMDAwM0Y4MUY4M0ZDMDAwMDAwMDAwRjAwMDAwMDAwMA0KRjAwMDAwMDAwMEZGRjlGOUZGRjAwMDAwMDAwMEYwMDAwMDAwMDANCkYwMDAwMDAwMDBGRkY5RjlGRkYwMDAwMDAwMDBGMDAwMDAwMDAwDQpGMDAwMDAwMDAwRkZGRkZGRkZGQzAwMDAwMDAwRjAwMDAwMDAwMA0KRjAwMDAwMDAwMEZGRkZGRkZGRkMwMDAwMDAwMEYwMDAwMDAwMDANCkYwMDAwMDAwMDBGMDdGRkZGMEZDMDAwMDAwMDBGMDAwMDAwMDAwDQpGMDAwMDAwMDAwRjA3RkZGRjBGQzAwMDAwMDAwRjAwMDAwMDAwMA0KRjAwMDAwMDAwMEZDMUZGRkMzRjAwMDAwMDAwMEYwMDAwMDAwMDANCkYwMDAwMDAwMDBGQzFGRkZDM0YwMDAwMDAwMDBGMDAwMDAwMDAwDQpGMDAwMDAwMDAwRkZGRkZGRkZGMDAwMDAwMDAwRjAwMDAwMDAwMA0KRjAwMDAwMDAwMEZGRkZGRkZGRjAwMDAwMDAwMEYwMDAwMDAwMDANCkYwMDAwMDAwMDAzRkZGRkZGRkMwMDAwMDAwMDBGMDAwMDAwMDAwDQpGMDAwMDAwMDAwM0ZGRkZGRkZDMDAwMDAwMDAwRjAwMDAwMDAwMA0KRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYwMDAwMDAwMDANCkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMDAwMDAwMDAwDQpGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjAwMDAwMDAwMA0KRjAwMDAwMDAwMDAxRkZGRkYwMDAwMDAwMDAwMEYwMDAwMDAwMDANCkYwMDAwMDAwMDAwMUZGRkZGMDAwMDAwMDAwMDBGMDAwMDAwMDAwDQpGMDAwMDAwMDAwMDNGRkY5RkMwMDAwMDAwMDAwRjAwMDAwMDAwMA0KRjAwMDAwMDAwMDAzRkZGOUZDMDAwMDAwMDAwMEYwMDAwMDAwMDANCkYwMDAwMDAwMDAzRkUxRjg3RkMwMDAwMDAwMDBGMDAwMDAwMDAwDQpGMDAwMDAwMDAwM0ZFMUY4N0ZDMDAwMDAwMDAwRjAwMDAwMDAwMA0KRjAwMDAwMDAwMEZGODFGODNGRjAwMDAwMDAwMEYwMDAwMDAwMDANCkYwMDAwMDAwMDBGRjgxRjgzRkYwMDAwMDAwMDBGMDAwMDAwMDAwDQpGMDAwMDAwMDAwRkUwMUY4MDNGMDAwMDAwMDAwRjAwMDAwMDAwMA0KRjAwMDAwMDAwMEZFMDFGODAzRjAwMDAwMDAwMEYwMDAwMDAwMDANCkYwMDAwMDAwMDBGMDAxRjgwMEYwMDAwMDAwMDBGMDAwMDAwMDAwDQpGMDAwMDAwMDAwRjAwMUY4MDBGMDAwMDAwMDAwRjAwMDAwMDAwMA0KRjAwMDAwMDAwMDAwMDFGODAwMDAwMDAwMDAwMEYwMDAwMDAwMDANCkYwMDAwMDAwMDAwMDAxRjgwMDAwMDAwMDAwMDBGMEZGREMxQzAwDQpGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjBGRkRDMUMwMA0KRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYwMEMxRTNDMDANCkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMDBDMUUzQzAwDQpGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjAwQzFBMkMwMA0KRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYwMEMxQjZDMDANCkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMDBDMUI2QzAwDQowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQzFCNkMwMA0KMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEMxOUNDMDANCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBDMTlDQzAwDQowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQzE5Q0MwMA0KMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEMxODhDMDANCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwDQowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMA0KMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDANCl5ETg0KXlhaDQo="},"ItemizedCharges":[{"Code":"100","CurrencyCode":"USD","MonetaryValue":"24.50"},{"Code":"375","CurrencyCode":"USD","MonetaryValue":"15.88"},{"Code":"432","CurrencyCode":"USD","MonetaryValue":"3.50"}]}}}}


                        

     



    ------------------------------
    Jerry Forss
    ------------------------------