tx · FaUMAcUrHNDfEpziwFMrMp5VsWPaZhicwxNi1k7gAPdE

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.06200000 Waves

2023.11.25 16:17 [2858977] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "FaUMAcUrHNDfEpziwFMrMp5VsWPaZhicwxNi1k7gAPdE", "fee": 6200000, "feeAssetId": null, "timestamp": 1700918251187, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "2yWPmPc9NRVjY5FVy2vgV1q6Q8WWTxmHDHpANiQYLtVQw8EmshwdyA1y4KC57EWwauXp734ky8r4QNXkWWUXngRF" ], "script": "base64:BgKSAQgCEgQKAggYEgMKAQgSBAoCERESBAoCCAESAwoBARIFCgMREQgSBgoEEREICBIECgIRERIFCgMREQgSBgoEEREICBIDCgEREgMKARESBAoCEQgSBAoCAQESBQoDAQEIEgYKBAEBCAgSBAoCCAgSBQoDCAgIEgQKAggIEgUKAwgICBIDCgEREgMKAQgSAwoBCBIAaAAHeHBUcmFkZQCQTgAHeHBDcmFmdACQTgAKeHBTZWxsVG9FcwCQTgAGeHBTaG9wAJBOAApMQU5EUFJFRklYAgRMQU5EAAZOVU1SRVMABgAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EAEFJFU09VUkNFUFJJQ0VNSU4A1bUCAA1FU01BWFBBQ0tBR0VTAAoACUVTQlVZQ09FRgAEABVNSU5fVVNEVF9GRUVfREVMSVZFUlkA0IYDABdNSU5fVVNEVF9GRUVfREVMSVZFUlkxNQD4yQQAD0NSQUZUX1VTRFRfQ09TVADAhD0AFENSQUZUX0RFTElWRVJZX0NPRUZGAAoAFVVTRFQyQUNSRVNfTVVMVElQTElFUgAKAAhyZXNUeXBlcwkAzAgCAgNPaWwJAMwIAgIDT3JlCQDMCAICBFdvb2QJAMwIAgIEU2FuZAkAzAgCAgRDbGF5CQDMCAICB09yZ2FuaWMFA25pbAAIbWF0VHlwZXMJAMwIAgIERnVlbAkAzAgCAgVNZXRhbAkAzAgCAgVQbGFuawkAzAgCAgVHbGFzcwkAzAgCAgdQbGFzdGljCQDMCAICB1Byb3RlaW4FA25pbAAJcHJvZFR5cGVzCQDMCAICEEZpcnN0IEFpZCBLaXQgTDEJAMwIAgIQRmlyc3QgQWlkIEtpdCBMMgkAzAgCAhBGaXJzdCBBaWQgS2l0IEwzCQDMCAICC0JhY2twYWNrIEwxCQDMCAICC0JhY2twYWNrIEwyCQDMCAICC0JhY2twYWNrIEwzCQDMCAICDkZvb2QgUmF0aW9uIEwxCQDMCAICDkZvb2QgUmF0aW9uIEwyCQDMCAICDkZvb2QgUmF0aW9uIEwzCQDMCAICC0pldCBQYWNrIEwxCQDMCAICC0pldCBQYWNrIEwyCQDMCAICC0pldCBQYWNrIEwzCQDMCAICCVNoaWVsZCBMMQkAzAgCAglTaGllbGQgTDIJAMwIAgIJU2hpZWxkIEwzCQDMCAICB01pbmUgTDEJAMwIAgIHTWluZSBMMgkAzAgCAgdNaW5lIEwzCQDMCAICB1RyYXAgTDEJAMwIAgIHVHJhcCBMMgkAzAgCAgdUcmFwIEwzCQDMCAICC0Jvb20tRG9nIEwxCQDMCAICC0Jvb20tRG9nIEwyCQDMCAICC0Jvb20tRG9nIEwzBQNuaWwACmNvbnRpbmVudHMJAMwIAgIIQW1lcmljYXMJAMwIAgIGRXVyb3BlCQDMCAICBEFzaWEJAMwIAgIGQWZyaWNhCQDMCAICB09jZWFuaWEFA25pbAAJQ09FRkYyTUFUAICt4gQAEHByb2R1Y3Rpb25NYXRyaXgJAMwIAgIlOF84XzhfMTdfMTdfNDJfMTJfMF8zMF8wLDAsMCwwLDAsMCwwXwkAzAgCAiU4XzhfOF8xN18xN180Ml8yNF8wXzYwXzAsMCw1LDIsMCwwLDBfCQDMCAICJzhfOF84XzE3XzE3XzQyXzM2XzBfMTIwXzAsMCwxMCw0LDAsMCwwXwkAzAgCAik4XzE5XzE5XzhfMjdfMTlfMjZfMV8yMF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAik4XzE5XzE5XzhfMjdfMTlfNTJfMV80MF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAik4XzE5XzE5XzhfMjdfMTlfNzhfMV84MF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAiU4XzhfOF84XzhfNjBfMTNfMl8yXzAsMCwwLDAsMCwwLDBfMDExCQDMCAICJThfOF84XzhfOF82MF8yNl8yXzRfMCwwLDAsMCwwLDAsMF8wMTEJAMwIAgIlOF84XzhfOF84XzYwXzM5XzJfOF8wLDAsMCwwLDAsMCwwXzAxMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfMzBfM18zMF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfNjBfM181MF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfOTBfM183MF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAisxOF8xOF8xMF8xOF8xOF8xOF8xMV80XzEwXzAsMCwwLDAsMCwwLDBfMjAxCQDMCAICKzE4XzE4XzEwXzE4XzE4XzE4XzIyXzRfMjBfMCwwLDAsMCwwLDAsMF8yMDEJAMwIAgIrMThfMThfMTBfMThfMThfMThfMzNfNF8zMF8wLDAsMCwwLDAsMCwwXzIwMQkAzAgCAio0XzEzXzIyXzRfMzVfMjJfMjNfMF81MCwxLDBfMCwwLDAsMCwwLDAsMF8JAMwIAgIqNF8xM18yMl80XzM1XzIyXzQ2XzBfNTAsMSwxXzAsMiw1LDAsMCwwLDBfCQDMCAICKzRfMTNfMjJfNF8zNV8yMl82OV8wXzUwLDIsMV8wLDUsMTAsMCwwLDAsMF8JAMwIAgIqNV8yNV80MF81XzEwXzE1XzIwXzFfMzAsMSwxXzAsMCwwLDAsMCwwLDBfCQDMCAICKjVfMjVfNDBfNV8xMF8xNV80MF8xXzMwLDEsMl8yLDEsMywwLDAsMCwwXwkAzAgCAio1XzI1XzQwXzVfMTBfMTVfNjBfMV8zMCwxLDNfNSwyLDgsMCwwLDAsMF8JAMwIAgInMjNfMjNfNV8yMF8yM182XzM1XzJfMTAwXzAsMCwwLDAsMCwwLDBfCQDMCAICJzIzXzIzXzVfMjBfMjNfNl83MF8yXzE1MF8wLDAsMCwwLDAsMCwwXwkAzAgCAigyM18yM181XzIwXzIzXzZfMTA1XzJfMjAwXzAsMCwwLDAsMCwwLDBfBQNuaWwACXJJZHhDb2VmZgAGAA1ySWR4Q29udGluZW50AAcAClJFQ0lQRVNJWkUACwAOUFJPRFVDVFBLR1NJWkUACgALd2hJZHhMZXZlbHMAAAAId2hJZHhSZXMAAQAId2hJZHhNYXQAAgAJd2hJZHhQcm9kAAMACXdoSWR4TE9GVAAEAAl2b2xMb2NrZWQAAAAIdm9sVG90YWwAAwAKYnBJZHhMZXZlbAAAAAhicElkeFJlcwABAAhicElkeE1hdAACAAlicElkeFByb2QAAwAPbG9jSWR4Q29udGluZW50AAAACmxvY0lkeFR5cGUAAQAIbG9jSWR4SWQAAgEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQdhc3NldElkCQCsAgICA25vXwUHYXNzZXRJZAEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEHYXNzZXRJZAkArAICAgNzdF8FB2Fzc2V0SWQBD2tleUFkZHJlc3NSZWZCeQEEYWRkcgkArAICAglhY2NSZWZCeV8FBGFkZHIBFGtleVN0YWtlZER1Y2tCeU93bmVyAQlvd25lckFkZHIJAKwCAgISc3Rha2VkRHVja0J5T3duZXJfBQlvd25lckFkZHIBEWtleUJhY2twYWNrQnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAgliYWNrUGFja18FC2R1Y2tBc3NldElkAQ9rZXlEdWNrTG9jYXRpb24BC2R1Y2tBc3NldElkCQCsAgICDWR1Y2tMb2NhdGlvbl8FC2R1Y2tBc3NldElkAQ5rZXlPcmRlckJ5TGFuZAELbGFuZEFzc2V0SWQJAKwCAgIKbGFuZE9yZGVyXwULbGFuZEFzc2V0SWQBDmtleUVzV2FyZWhvdXNlAAIaZW1lcmdlbmN5V2FyZWhvdXNlUHJvZHVjdHMAD2RlbGl2ZXJ5RnVuZEtleQIMZGVsaXZlcnlGdW5kARJnZXRSZWNpcGVNYXRlcmlhbHMBBnJlY2lwZQkAaAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZyZWNpcGUFCXJJZHhDb2VmZgUJQ09FRkYyTUFUAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4AA1NFUAICX18ABU1VTFQ1AKCNBgAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAAZNVUxUMTAAgMivoCUADk1JTlNIT1BQQVlNRU5UAKCNBgAFSVRFUjYJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEUlkeENmZ1N0YWtpbmdEYXBwAAEAFElkeENmZ0ludmVzdEZ1bmREYXBwAAYAD0lkeENmZ0FjcmVzRGFwcAAIAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBDmtleVJlc3RBZGRyZXNzAAIMJXNfX3Jlc3RBZGRyARFyZWFkUmVzdENmZ09yRmFpbAEEcmVzdAkAvAkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEcmVzdAkBCmtleVJlc3RDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIHcmVzdENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFB3Jlc3RDZmcFA2lkeAkArAICAipSZXN0IGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AAxyZXN0Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleVJlc3RBZGRyZXNzAAUVZGVmYXVsdFJlc3RBZGRyZXNzU3RyAAdyZXN0Q2ZnCQERcmVhZFJlc3RDZmdPckZhaWwBBQxyZXN0Q29udHJhY3QAD3N0YWtpbmdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ1N0YWtpbmdEYXBwABJpbnZlc3RGdW5kQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRRJZHhDZmdJbnZlc3RGdW5kRGFwcAANYWNyZXNDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFD0lkeENmZ0FjcmVzRGFwcAEIYXNTdHJpbmcBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBCmtleUJsb2NrZWQAAhBjb250cmFjdHNCbG9ja2VkAQpmaXhlZFBvaW50AgN2YWwIZGVjaW1hbHMEBnRlblBvdwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04EB2xvd1BhcnQJAKQDAQkAagIFA3ZhbAUGdGVuUG93BAZ6ZXJvZXMJALACAgkApAMBBQZ0ZW5Qb3cJAGQCAAEJALECAQUHbG93UGFydAkArAICCQCsAgIJAKwCAgkApAMBCQBpAgUDdmFsBQZ0ZW5Qb3cCAS4FBnplcm9lcwUHbG93UGFydAATRkFDVE9SWU1BWFdBUkVIT1VTRQCAyK+gJQAOU0VMTE1VTFRJUExJRVIAyAEADUJVWU1VTFRJUExJRVIArAIACkFVQ1RJT05GRUUAkE4ADERFTElWRVJZX0ZFRQCQTgAOREVMSVZFUllfRkVFMTUAmHUBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIJZmFjdG9yeUlkB3Jlc1R5cGUJAKwCAgkArAICCQCsAgICG2ZhY3RvcnlXaEJ5Q29udGluZW50QW5kUmVzXwUJZmFjdG9yeUlkAgFfCQCkAwEFB3Jlc1R5cGUACW9yZElkeFJlcwAAAAlvcmRJZHhNYXQAAQAKb3JkSWR4UHJvZAACAQhnZXRPcmRlcgEGb3JkS2V5BAFwCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUGb3JkS2V5AjAwQDBfMEAwXzBAMF8wQDBfMEAwXzBAMDowQDBfMEAwXzBAMF8wQDBfMEAwXzBAMDoCAToJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQlvcmRJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQFwBQlvcmRJZHhSZXMCFzBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwCQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUJb3JkSWR4TWF0AgFfBQZOVU1SRVMJAJEDAgUBcAUJb3JkSWR4TWF0AhcwQDBfMEAwXzBAMF8wQDBfMEAwXzBAMAkAzAgCCQCRAwIFAXAFCm9yZElkeFByb2QFA25pbAEIdG9Wb2x1bWUDBmFtb3VudAdwa2dTaXplCWlzUHJvZHVjdAMFCWlzUHJvZHVjdAQEcGtncwMJAGcCBQZhbW91bnQAAAkAaQIJAGUCCQBkAgUGYW1vdW50BQdwa2dTaXplAAEFB3BrZ1NpemUJAQEtAQkAaQIJAGUCCQBkAgkBAS0BBQZhbW91bnQFB3BrZ1NpemUAAQUHcGtnU2l6ZQkAaAIFBHBrZ3MFBU1VTFQ4BQZhbW91bnQBDHNlbGxJbnRlcm5hbAQFbG9jSWQHcmVzVHlwZQZhbW91bnQIbWluUHJpY2UEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFB3Jlc1R5cGUEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEAnIwAwkAZgIFAncwBRNGQUNUT1JZTUFYV0FSRUhPVVNFAAADCQBmAgkAZAIFAncwBQZhbW91bnQFE0ZBQ1RPUllNQVhXQVJFSE9VU0UJAGUCBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQJ3MAUGYW1vdW50BAx1c2R0UmVjZWl2ZWQJAGQCCQBrAwUCcjAJAGUCCQBoAgUOU0VMTE1VTFRJUExJRVIFEFJFU09VUkNFUFJJQ0VNSU4JAGsDCQBkAgkAaAIAZAUCdzAJAGgCADIFAnIwBRBSRVNPVVJDRVBSSUNFTUlOBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQZNVUxUMTAJAGsDCQBlAgUGYW1vdW50BQJyMAUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgEBW1pbjk5CQBlAgUIbWluUHJpY2UJAGkCBQhtaW5QcmljZQBkAwkAZgIJAGgCBQVtaW45OQUGYW1vdW50CQBoAgUMdXNkdFJlY2VpdmVkBQVNVUxUOAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIPQWN0dWFsIHByaWNlID0gCQCkAwEFDHVzZHRSZWNlaXZlZAIDIC8gCQCkAwEFBmFtb3VudAIOIDwgbWluUHJpY2UgPSAJAKQDAQUIbWluUHJpY2UCAywgKAUFbG9jSWQCAiwgCQCRAwIFCHJlc1R5cGVzBQdyZXNUeXBlAgEpCQCUCgIJAQxJbnRlZ2VyRW50cnkCBQV3aEtleQkAZAIFAncwBQZhbW91bnQFDHVzZHRSZWNlaXZlZAELYnV5SW50ZXJuYWwEBWxvY0lkB21hdFR5cGUGYW1vdW50CG1heFByaWNlBAV3aEtleQkBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIFBWxvY0lkBQdtYXRUeXBlBAJ3MAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQV3aEtleQAABAJtMQMJAGYCBQJ3MAUTRkFDVE9SWU1BWFdBUkVIT1VTRQkAlwMBCQDMCAIFBmFtb3VudAkAzAgCCQBlAgUCdzAFE0ZBQ1RPUllNQVhXQVJFSE9VU0UFA25pbAAABAJtMAkAlwMBCQDMCAIFAncwCQDMCAIJAGUCBQZhbW91bnQFAm0xBQNuaWwEAW0JAGQCBQJtMAUCbTEEBXcwbWluCQCXAwEJAMwIAgUCdzAJAMwIAgUTRkFDVE9SWU1BWFdBUkVIT1VTRQUDbmlsBAl1c2R0U3BlbnQJAGQCCQBrAwUCbTAJAGUCCQBoAgUNQlVZTVVMVElQTElFUgUQUkVTT1VSQ0VQUklDRU1JTgkAawMJAGUCCQBoAgBkBQV3MG1pbgkAaAIAMgUCbTAFEFJFU09VUkNFUFJJQ0VNSU4FE0ZBQ1RPUllNQVhXQVJFSE9VU0UFBk1VTFQxMAkAawMFAm0xCQBoAgACBRBSRVNPVVJDRVBSSUNFTUlOBQVNVUxUOAQGbWF4MTAxCQBkAgUIbWF4UHJpY2UJAGkCBQhtYXhQcmljZQBkAwkAZgIJAGgCBQl1c2R0U3BlbnQFBU1VTFQ4CQBoAgUGbWF4MTAxBQFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BY3R1YWwgcHJpY2UgPSAJAKQDAQUJdXNkdFNwZW50AgMgLyAJAKQDAQUBbQIOID4gbWF4UHJpY2UgPSAJAKQDAQUIbWF4UHJpY2UCAywgKAUFbG9jSWQCAiwgCQCRAwIFCG1hdFR5cGVzBQdtYXRUeXBlAgEpCQCVCgMJAQxJbnRlZ2VyRW50cnkCBQV3aEtleQkAZQIFAncwBQFtBQl1c2R0U3BlbnQFAW0BC2dldEJhY2twYWNrAQVicEtleQQBcAkAvAkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAUFYnBLZXkCGjA6MF8wXzBfMF8wXzA6MF8wXzBfMF8wXzA6AgE6CQDMCAIJAKQDAQkBC3ZhbHVlT3JFbHNlAgkAtgkBCQCRAwIFAXAFCmJwSWR4TGV2ZWwAAAkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCGJwSWR4UmVzAgFfBQZOVU1SRVMJAJEDAgUBcAUIYnBJZHhSZXMCCzBfMF8wXzBfMF8wCQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUIYnBJZHhNYXQCAV8FBk5VTVJFUwkAkQMCBQFwBQhicElkeE1hdAILMF8wXzBfMF8wXzAJAMwIAgkAkQMCBQFwBQlicElkeFByb2QFA25pbAEMY2hlY2tCbG9ja2VkAAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUPc3Rha2luZ0NvbnRyYWN0CQEKa2V5QmxvY2tlZAAHCQACAQIfQ29udHJhY3RzIGFyZSB1bmRlciBtYWludGVuYW5jZQUEdW5pdAEGcHJvbG9nAAkBBWFzSW50AQkA/QcEBQ9zdGFraW5nQ29udHJhY3QCCnNhdmVMYXN0VHgFA25pbAUDbmlsAQlzZXRDb21tb24CA2FjYw9pZ25vcmVkSXRlcmF0b3IEAWoIBQNhY2MCXzEEBGl0ZW0DCQBmAgkAkAMBCAUDYWNjA18xMAUBagkAkQMCCAUDYWNjA18xMAUBagIDMEAwBAZpc1Byb2QIBQNhY2MCXzgECWl0ZW1QYXJ0cwkAtQkCBQRpdGVtAgFAAwkBAiE9AgkAkAMBBQlpdGVtUGFydHMAAgkAAgECLkluY29ycmVjdCBvcmRlciBmb3JtYXQsIHNob3VsZCBiZSBhbW91bnRAcHJpY2UECG5ld09yZEFtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJaXRlbVBhcnRzAAAECG5ld09yZFByCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJaXRlbVBhcnRzAAEECW5ld09yZFVzZAMFBmlzUHJvZAkAaAIFCG5ld09yZEFtBQhuZXdPcmRQcgkAawMFCG5ld09yZEFtBQhuZXdPcmRQcgUFTVVMVDgECW5ld09yZFZvbAkBCHRvVm9sdW1lAwUIbmV3T3JkQW0FDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QEBndoSW5pdAMJAGYCCQCQAwEIBQNhY2MCXzYFAWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCCAUDYWNjAl82BQFqAAAEC2N1ck9yZFBhcnRzCQC1CQIDCQBmAgkAkAMBCAUDYWNjAl83BQFqCQCRAwIIBQNhY2MCXzcFAWoCAzBAMAIBQAQIY3VyT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJPcmRQYXJ0cwAABAhjdXJPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ck9yZFBhcnRzAAEDAwkAZgIAAAUIY3VyT3JkUHIGCQBmAgAABQhuZXdPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAljdXJPcmRVc2QDBQZpc1Byb2QJAGgCBQhjdXJPcmRBbQUIY3VyT3JkUHIJAGsDBQhjdXJPcmRBbQUIY3VyT3JkUHIFBU1VTFQ4AwkAAAIFCG5ld09yZEFtAAADCQBmAgUIY3VyT3JkQW0AAAkAnAoKCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQUGd2hJbml0CAUDYWNjAl8zCAUDYWNjAl80CQBlAggFA2FjYwJfNQUJY3VyT3JkVXNkCAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAGQCCAUDYWNjAl85CQEIdG9Wb2x1bWUDBQZ3aEluaXQFDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QIBQNhY2MDXzEwCQCcCgoJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBlAgUGd2hJbml0BQhjdXJPcmRBbQgFA2FjYwJfMwgFA2FjYwJfNAgFA2FjYwJfNQgFA2FjYwJfNggFA2FjYwJfNwUGaXNQcm9kCQBkAggFA2FjYwJfOQkBCHRvVm9sdW1lAwkAZQIFBndoSW5pdAUIY3VyT3JkQW0FDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QIBQNhY2MDXzEwAwkAZgIFCG5ld09yZEFtAAADCQBmAgAABQhjdXJPcmRBbQkAnAoKCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFBndoSW5pdAUIY3VyT3JkQW0JAGQCCAUDYWNjAl8zBQluZXdPcmRWb2wIBQNhY2MCXzQJAGQCCAUDYWNjAl81BQluZXdPcmRVc2QIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkBCHRvVm9sdW1lAwkAZQIFBndoSW5pdAUIY3VyT3JkQW0FDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QIBQNhY2MDXzEwCQCcCgoJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQZ3aEluaXQJAGQCCAUDYWNjAl8zBQluZXdPcmRWb2wIBQNhY2MCXzQJAGUCCQBkAggFA2FjYwJfNQUJbmV3T3JkVXNkBQljdXJPcmRVc2QIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkBCHRvVm9sdW1lAwUGd2hJbml0BQ5QUk9EVUNUUEtHU0laRQUGaXNQcm9kCAUDYWNjA18xMAMJAGYCAAAFCGN1ck9yZEFtBAZhbURpZmYJAGUCBQhjdXJPcmRBbQUIbmV3T3JkQW0DCQBmAgAACQBlAgUGd2hJbml0BQZhbURpZmYJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAJAKQDAQUGYW1EaWZmAhogZnJvbSB3YXJlaG91c2UsIGJ1dCBvbmx5IAkApAMBBQZ3aEluaXQCCiBhdmFpbGFibGUJAJwKCgkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQZ3aEluaXQFBmFtRGlmZggFA2FjYwJfMwkAZQIIBQNhY2MCXzQFCW5ld09yZFZvbAgFA2FjYwJfNQgFA2FjYwJfNggFA2FjYwJfNwUGaXNQcm9kCQEIdG9Wb2x1bWUDCQBlAgUGd2hJbml0BQZhbURpZmYFDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QIBQNhY2MDXzEwAwkAZgIAAAkAZAIFBndoSW5pdAUIbmV3T3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAJAKQDAQkBAS0BBQhuZXdPcmRBbQIaIGZyb20gd2FyZWhvdXNlLCBidXQgb25seSAJAKQDAQUGd2hJbml0AgogYXZhaWxhYmxlCQCcCgoJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBkAgUGd2hJbml0BQhuZXdPcmRBbQgFA2FjYwJfMwkAZQIIBQNhY2MCXzQFCW5ld09yZFZvbAkAZQIIBQNhY2MCXzUFCWN1ck9yZFVzZAgFA2FjYwJfNggFA2FjYwJfNwUGaXNQcm9kCQEIdG9Wb2x1bWUDCQBkAgUGd2hJbml0BQhuZXdPcmRBbQUOUFJPRFVDVFBLR1NJWkUFBmlzUHJvZAgFA2FjYwNfMTABC3NldEludGVybmFsAwljdXJyZW50V2gKY3VycmVudE9yZAZuZXdPcmQECWN1cnJXaFJlcwkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8ECWN1cnJXaE1hdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8ECmN1cnJXaFByb2QDCQAAAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIBXwQNY3VycmVudE9yZFJlcwkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCW9yZElkeFJlcwIBXwQNY3VycmVudE9yZE1hdAkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCW9yZElkeE1hdAIBXwQOY3VycmVudE9yZFByb2QDCQAAAgkAkQMCBQpjdXJyZW50T3JkBQpvcmRJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFCmN1cnJlbnRPcmQFCm9yZElkeFByb2QCAV8DCQECIT0CCQCQAwEFBm5ld09yZAADCQACAQIzbmV3T3JkZXJTdHIgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSAyICc6JyBzZXBhcmF0b3JzBAhyZXNQYXJ0cwkAtQkCCQCRAwIFBm5ld09yZAAAAgFfBAhtYXRQYXJ0cwkAtQkCCQCRAwIFBm5ld09yZAABAgFfBAlwcm9kUGFydHMDCQAAAgkAkQMCBQZuZXdPcmQAAgIABQNuaWwJALwJAgkAkQMCBQZuZXdPcmQAAgIBXwMJAQIhPQIJAJADAQUIcmVzUGFydHMFBk5VTVJFUwkAAgECIEFsbCA2IHJlc291cmNlcyBzaG91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ZQEJAJEDAgUKYnBPcmRQYXJ0cwABAwkAZgIAAAUHYnBPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAhicE9yZFVzZAMFBmlzUHJvZAkAaAIFB2JwT3JkQW0FB2JwT3JkUHIJAGsDBQdicE9yZEFtBQdicE9yZFByBQVNVUxUOAQGYnBJbml0AwkAZgIJAJADAQgFA2FjYwJfOAUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIIBQNhY2MCXzgFAWoAAAQGd2hJbml0AwkAZgIJAJADAQgFA2FjYwJfOQUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIIBQNhY2MCXzkFAWoAAAQJd2hPcmRJbml0AwkAZgIJAJADAQgFA2FjYwNfMTAFAWoJAJEDAggFA2FjYwNfMTAFAWoCAzBAMAQKd2hPcmRQYXJ0cwkAtQkCBQl3aE9yZEluaXQCAUAEB3doT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAAEB3doT3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAEDAwkBAiE9AgUHYnBPcmRBbQAACQECIT0CBQdicE9yZFByBQd3aE9yZFByBwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgpQcmljZXMgb2YgCQCRAwIIBQNhY2MDXzExBQFqAhcgZG9uJ3QgbWF0Y2ghIFdIIHByaWNlPQkApAMBBQd3aE9yZFByAg0sIHlvdXIgcHJpY2U9CQCkAwEFB2JwT3JkUHIECHdoT3JkVXNkAwUGaXNQcm9kCQBoAgUHd2hPcmRBbQUHd2hPcmRQcgkAawMFB3doT3JkQW0FB3doT3JkUHIFBU1VTFQ4BAhkZWx0YVZvbAkBCHRvVm9sdW1lAwUHYnBPcmRBbQUOUFJPRFVDVFBLR1NJWkUFBmlzUHJvZAMJAAACBQdicE9yZEFtAAAJAJ8KDQkAzQgCCAUDYWNjAl8xCQCkAwEFBndoSW5pdAkAzQgCCAUDYWNjAl8yBQl3aE9yZEluaXQJAM0IAggFA2FjYwJfMwkApAMBBQZicEluaXQIBQNhY2MCXzQIBQNhY2MCXzUIBQNhY2MCXzYJAGQCCAUDYWNjAl83AAEIBQNhY2MCXzgIBQNhY2MCXzkIBQNhY2MDXzEwCAUDYWNjA18xMQUGaXNQcm9kCAUDYWNjA18xMwMJAGYCBQdicE9yZEFtAAADCQBmAgAABQd3aE9yZEFtAwkAZgIFB2JwT3JkQW0JAQEtAQUHd2hPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BdHRlbXB0IHRvIGJ1eSAJAKQDAQUHYnBPcmRBbQIEIG9mIAkAkQMCCAUDYWNjA18xMQUBagIbLCBidXQgd2FyZWhvdXNlIG9ubHkgc2VsbHMgCQCkAwEJAQEtAQUHd2hPcmRBbQkAnwoNCQDNCAIIBQNhY2MCXzEJAKQDAQUGd2hJbml0CQDNCAIIBQNhY2MCXzIJAKwCAgkArAICCQCkAwEJAGQCBQd3aE9yZEFtBQdicE9yZEFtAgFACQCkAwEFB3doT3JkUHIJAM0IAggFA2FjYwJfMwkApAMBCQBkAgUGYnBJbml0BQdicE9yZEFtCQBkAggFA2FjYwJfNAUIZGVsdGFWb2wIBQNhY2MCXzUJAGQCCAUDYWNjAl82BQhicE9yZFVzZAkAZAIIBQNhY2MCXzcAAQgFA2FjYwJfOAgFA2FjYwJfOQgFA2FjYwNfMTAIBQNhY2MDXzExBQZpc1Byb2QJAGQCCAUDYWNjA18xMwMFBmlzUHJvZAkAaAIFB2JwT3JkQW0FBU1VTFQ4BQdicE9yZEFtCQACAQkArAICCQCsAgICD0F0dGVtcHQgdG8gYnV5IAkAkQMCCAUDYWNjA18xMQUBagIgIHdoaWxlIHdhcmVob3VzZSBkb2Vzbid0IHNlbGwgaXQDCQBmAgUHd2hPcmRBbQAAAwkAZgIJAQEtAQUHYnBPcmRBbQUHd2hPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCkAwEJAQEtAQUHYnBPcmRBbQIEIG9mIAkAkQMCCAUDYWNjA18xMQUBagIaLCBidXQgd2FyZWhvdXNlIG9ubHkgYnV5cyAJAKQDAQUHd2hPcmRBbQMJAGYCCQEBLQEFB2JwT3JkQW0FBmJwSW5pdAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCkAwEJAQEtAQUHYnBPcmRBbQIULCBidXQgeW91IG9ubHkgaGF2ZSAJAKQDAQUGYnBJbml0AgQgb2YgCQCRAwIIBQNhY2MDXzExBQFqCQCfCg0JAM0IAggFA2FjYwJfMQkApAMBCQBlAgUGd2hJbml0BQdicE9yZEFtCQDNCAIIBQNhY2MCXzIJAKwCAgkArAICCQCkAwEJAGQCBQd3aE9yZEFtBQdicE9yZEFtAgFACQCkAwEFB3doT3JkUHIJAM0IAggFA2FjYwJfMwkApAMBCQBkAgUGYnBJbml0BQdicE9yZEFtCQBlAggFA2FjYwJfNAUIZGVsdGFWb2wJAGUCCAUDYWNjAl81BQhicE9yZFVzZAgFA2FjYwJfNgkAZAIIBQNhY2MCXzcAAQgFA2FjYwJfOAgFA2FjYwJfOQgFA2FjYwNfMTAIBQNhY2MDXzExBQZpc1Byb2QJAGUCCAUDYWNjA18xMwMFBmlzUHJvZAkAaAIFB2JwT3JkQW0FBU1VTFQ4BQdicE9yZEFtCQACAQkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAJEDAggFA2FjYwNfMTEFAWoCHyB3aGlsZSB3YXJlaG91c2UgZG9lc24ndCBidXkgaXQBE3NlbGxSZXNvdXJjZXNDb21tb24EB3Jlc0xpc3QMZmFjdG9yeUxvY0lkB2Ftb3VudHMJbWluUHJpY2VzCgEFYWRkZXICA2FjYwFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCRAwIFB3Jlc0xpc3QFAWoCBCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCFCwgYnV0IHRyaWVkIHRvIHNlbGwgCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCAAAJAJEDAgUHYW1vdW50cwUBagkAAgEJAKwCAgkArAICCQCsAgICJVlvdSB0cmllZCB0byBzZWxsIG5lZ2F0aXZlIGFtb3VudCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCAjogCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoAAAQBYgkBDHNlbGxJbnRlcm5hbAQFDGZhY3RvcnlMb2NJZAUBagkAkQMCBQdhbW91bnRzBQFqCQCRAwIFCW1pblByaWNlcwUBagkAlgoECQDNCAIIBQNhY2MCXzEIBQFiAl8xCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQCRAwIFB2Ftb3VudHMFAWoJAGQCCAUDYWNjAl8zCAUBYgJfMgkAZAIIBQNhY2MCXzQJAJEDAgUHYW1vdW50cwUBagkAlgoECAUDYWNjAl8xCQDNCAIIBQNhY2MCXzIJAJEDAgUHcmVzTGlzdAUBaggFA2FjYwJfMwgFA2FjYwJfNAoAAiRsBQVJVEVSNgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAUDbmlsBQNuaWwAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgESYnV5TWF0ZXJpYWxzQ29tbW9uBAdtYXRMaXN0DGZhY3RvcnlMb2NJZAdhbW91bnRzCW1heFByaWNlcwoBCG1VcGRhdGVyAgNhY2MBagMJAGYCAAAJAJEDAgUHYW1vdW50cwUBagkAAgEJAKwCAgkArAICCQCsAgICJFlvdSB0cmllZCB0byBidXkgbmVnYXRpdmUgYW1vdW50IG9mIAkAkQMCBQhtYXRUeXBlcwUBagICOiAJAKQDAQkAkQMCBQdhbW91bnRzBQFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagAABAFiCQELYnV5SW50ZXJuYWwEBQxmYWN0b3J5TG9jSWQFAWoJAJEDAgUHYW1vdW50cwUBagkAkQMCBQltYXhQcmljZXMFAWoJAJYKBAkAzQgCCAUDYWNjAl8xCAUBYgJfMQkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHbWF0TGlzdAUBaggFAWICXzMJAGQCCAUDYWNjAl8z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ZXIJAGUCCQBlAgUNdXNkV2gyQnBTYWxkbwkAaAIAAwULdXNkV2gyQnBGZWUFC3JlY2VpdmVkRmVlBQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQt1c2RXaDJCcEZlZQULdXNkdEFzc2V0SWQFA25pbAEQdXNlcjJzaG9wQWN0aW9ucwQNdXNkQnAyV2hTYWxkbwRwbXRzDXNob3BMYW5kT3duZXIIc3BlbnRGZWUDCQBmAgUNdXNkQnAyV2hTYWxkbwAAAwkBAiE9AgkAkAMBBQRwbXRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAgUEcG10cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBBB1c2R0U3BlbnRXaXRoRmVlCQBkAgUNdXNkQnAyV2hTYWxkbwUIc3BlbnRGZWUDCQECIT0CBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAh9JbnN1ZmZpY2llbnQgcGF5bWVudCEgQXR0YWNoZWQ9CQEKZml4ZWRQb2ludAIFA2FtdAAGAgssIHJlcXVpcmVkPQkBCmZpeGVkUG9pbnQCBQ11c2RCcDJXaFNhbGRvAAYCASsJAQpmaXhlZFBvaW50AgUIc3BlbnRGZWUABgIOKGRlbGl2ZXJ5IGZlZSkDCQBmAgUOTUlOU0hPUFBBWU1FTlQFDXVzZEJwMldoU2FsZG8JAAIBCQCsAgICEk1pbiBzaG9wIHRyYWRlIGlzIAkBCmZpeGVkUG9pbnQCBQ5NSU5TSE9QUEFZTUVOVAAGBAt1c2RCcDJXaEZlZQkAawMFDXVzZEJwMldoU2FsZG8FCkFVQ1RJT05GRUUFBU1VTFQ2BAhyZWZCeUtleQkBD2tleUFkZHJlc3NSZWZCeQEFDXNob3BMYW5kT3duZXIEBXJlZkJ5CQCdCAIFD3N0YWtpbmdDb250cmFjdAUIcmVmQnlLZXkJAM0IAgkAzQgCAwkBCWlzRGVmaW5lZAEFBXJlZkJ5CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFBXJlZkJ5BQt1c2RCcDJXaEZlZQULdXNkdEFzc2V0SWQFA25pbAUDbmlsCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1zaG9wTGFuZE93bmVyCQBlAgUNdXNkQnAyV2hTYWxkbwkAaAIAAwULdXNkQnAyV2hGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAMJAQIhPQIJAJADAQUEcG10cwAACQACAQISTm8gcGF5bWVudHMgbmVlZGVkBQNuaWwBFWFjY2VwdFNob3BPcmRlckNvbW1vbgYPc2hvcExhbmRBc3NldElkCmNhbGxlckFkZHIKYnBPcmRlclN0cglicFJlc0xpc3QJYnBNYXRMaXN0CmJwUHJvZExpc3QECWxhbmRBc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFD3Nob3BMYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFD3Nob3BMYW5kQXNzZXRJZAkAAgEJAKwCAgkArAICAgRORlQgCAUJbGFuZEFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBA1zaG9wTGFuZE93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQUPc2hvcExhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFCWxhbmRBc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQAAAgUNc2hvcExhbmRPd25lcgUKY2FsbGVyQWRkcgkAAgECHllvdSBjYW5ub3QgdHJhZGUgd2l0aCB5b3Vyc2VsZgQMYnBPcmRlclBhcnRzCQC8CQIFCmJwT3JkZXJTdHICAToDCQECIT0CCQCQAwEFDGJwT3JkZXJQYXJ0cwADCQACAQIyYnBPcmRlclN0ciBzaG91bGQgY29udGFpbiBleGFjdGx5IDIgJzonIHNlcGFyYXRvcnMECGJwT3JkUmVzCQC1CQIJAJEDAgUMYnBPcmRlclBhcnRzAAACAV8ECGJwT3JkTWF0CQC1CQIJAJEDAgUMYnBPcmRlclBhcnRzAAECAV8ECWJwT3JkUHJvZAMJAAACCQCRAwIFDGJwT3JkZXJQYXJ0cwACAgAFA25pbAkAvAkCCQCRAwIFDGJwT3JkZXJQYXJ0cwACAgFfAwkBAiE9AgkAkAMBBQhicE9yZFJlcwUGTlVNUkVTCQACAQIgQWxsIDYgcmVzb3VyY2VzIHNob3VsZCBiZSBwYXNzZWQDCQECIT0CCQCQAwEFCGJwT3JkTWF0BQZOVU1SRVMJAAIBAiBBbGwgNiBtYXRlcmlhbHMgc2hvdWxkIGJlIHBhc3NlZAQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQ9zaG9wTGFuZEFzc2V0SWQFA25pbAUDbmlsBAljdXJyZW50V2gJALwJAgUCd2gCAToECWN1cnJXaFJlcwkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8ECWN1cnJXaE1hdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8ECmN1cnJXaFByb2QDCQAAAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIBXwQPY3VycldoTG9ja2VkVm9sCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgkAtQkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUAgFfBQl2b2xMb2NrZWQEBm9yZEtleQkBDmtleU9yZGVyQnlMYW5kAQUPc2hvcExhbmRBc3NldElkBAV3aE9yZAkBCGdldE9yZGVyAQUGb3JkS2V5BAh3aE9yZFJlcwkAtQkCCQCRAwIFBXdoT3JkBQlvcmRJZHhSZXMCAV8ECHdoT3JkTWF0CQC1CQIJAJEDAgUFd2hPcmQFCW9yZElkeE1hdAIBXwQJd2hPcmRQcm9kAwkAAAIJAJEDAgUFd2hPcmQFCm9yZElk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BQljdXJyZW50V2gFC3doSWR4TGV2ZWxzCQDMCAIJALkJAggFAXICXzECAV8JAMwIAgkAuQkCCAUBbQJfMQIBXwkAzAgCCQC6CQIIBQFwAl8xAgFfCQDMCAIJAKQDAQUMbmV3TG9ja2VkVm9sBQNuaWwCAToEC25ld1doT3JkU3RyCQC6CQIJAMwIAgkAuQkCCAUBcgJfMgIBXwkAzAgCCQC5CQIIBQFtAl8yAgFfCQDMCAIJALoJAggFAXACXzICAV8FA25pbAIBOgQGd2hTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAINc2F2ZVdhcmVob3VzZQkAzAgCBQV3aFN0cgkAzAgCBQ9zaG9wTGFuZEFzc2V0SWQFA25pbAUDbmlsBA5hY2NTdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUFjY1N0YXRzCQDMCAIFDXNob3BMYW5kT3duZXIJAMwIAgkAawMFBnhwU2hvcAgFAXADXzEzBQVNVUxUOAUDbmlsBQNuaWwJAJwKCgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQtuZXdXaE9yZFN0cggFAXICXzMIBQFtAl8zCAUBcAJfMwgFAXACXzUIBQFwAl82CAUBcANfMTMFDXNob3BMYW5kT3duZXIFBndoU2F2ZQUOYWNjU3RhdHNSZXN1bHQBGnNlbGxSZXNvdXJjZXNXb3JsZEludGVybmFsAQZhbW91bnQEBm9uZVJlcwkAaQIFBmFtb3VudAAeBBFvbmVGYWN0b3J5QW1vdW50cwkAzAgCBQZvbmVSZXMJAMwIAgUGb25lUmVzCQDMCAIFBm9uZVJlcwkAzAgCBQZvbmVSZXMJAMwIAgUGb25lUmVzCQDMCAIFBm9uZVJlcwUDbmlsBAFzCQCkAwEFBm9uZVJlcwQHcmVzTGlzdAkAzAgCBQFzCQDMCAIFAXMJAMwIAgUBcwkAzAgCBQFzCQDMCAIFAXMJAMwIAgUBcwUDbmlsBAltaW5QcmljZXMJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAFA25pbAoBCm9uZUZhY3RvcnkCA2FjYwljb250aW5lbnQEAXgJARNzZWxsUmVzb3VyY2VzQ29tbW9uBAUHcmVzTGlzdAUJY29udGluZW50BRFvbmVGYWN0b3J5QW1vdW50cwUJbWluUHJpY2VzCQCVCgMJAM4IAggFA2FjYwJfMQgFAXgCXzEJAGQCCAUDYWNjAl8yCAUBeAJfMwkAZAIIBQNhY2MCXzMIBQF4Al80BA0kdDAyNTI5MjI1MzgyCgACJGwFCmNvbnRpbmVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCm9uZUZhY3RvcnkCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBA5mYWN0b3J5QWN0aW9ucwgFDSR0MDI1MjkyMjUzODICXzEEDHVzZHRSZWNlaXZlZAgFDSR0MDI1MjkyMjUzODICXzIECHRvdGFsUmVzCAUNJHQwMjUyOTIyNTM4MgJfMwQDZmVlCQBrAwUMdXNkdFJlY2VpdmVkBQxERUxJVkVSWV9GRUUFBU1VTFQ2BBBhY3Rpdml0aWVzQW1vdW50CQBpAgUMdXNkdFJlY2VpdmVkAGQECHVzZHRMZWZ0CQBlAgkAZQIFDHVzZHRSZWNlaXZlZAUQYWN0aXZpdGllc0Ftb3VudAUDZmVlCQCXCgUFDmZhY3RvcnlBY3Rpb25zBQh1c2R0TGVmdAUDZmVlBRBhY3Rpdml0aWVzQW1vdW50BQh0b3RhbFJlcwEQY3JhZnRHb29kc0NvbW1vbgUHbWF0TGlzdAhwcm9kTGlzdBRtYW51ZmFjdG9yeUNvbnRpbmVudApwcm9kdWN0SWR4CHF1YW50aXR5AwkAZwIAAAUIcXVhbnRpdHkJAAIBAhtRdWFudGl0eSBzaG91bGQgYmUgcG9zaXRpdmUDAwkAZgIAAAUKcHJvZHVjdElkeAYJAGcCBQpwcm9kdWN0SWR4CQCQAwEFEHByb2R1Y3Rpb25NYXRyaXgJAAIBCQCsAgICFFVua25vd24gcHJvZHVjdCBpZHg9CQCkAwEF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ZQIFB2hhdmVNYXQFB25lZWRNYXQJAGQCCAUDYWNjAl8yBQduZWVkTWF0CQCUCgIJAM0IAggFA2FjYwJfMQkAkQMCBQdtYXRMaXN0BQFqCAUDYWNjAl8yBAZtZXJnZWQKAAIkbAUFSVRFUjYKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhwcm9kdWNlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgkAlQoDCAUGbWVyZ2VkAl8xBQduZXdQcm9kCAUGbWVyZ2VkAl8yGAFpARpyZWNhbGNMb2NrZWRWb2x1bWVSRUFET05MWQILbGFuZEFzc2V0SWQCd2gECmN1cnJlbnRPcmQJAQhnZXRPcmRlcgEJAQ5rZXlPcmRlckJ5TGFuZAEFC2xhbmRBc3NldElkBAF6CQELc2V0SW50ZXJuYWwDBQJ3aAUKY3VycmVudE9yZAUKY3VycmVudE9yZAkAlAoCBQNuaWwJAGQCCAUBegJfNAgFAXoCXzUBaQENY29uc3RydWN0b3JWMQEIcmVzdEFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5UmVzdEFkZHJlc3MABQhyZXN0QWRkcgUDbmlsAWkBDXNlbGxSZXNvdXJjZXMCB2Ftb3VudHMJbWluUHJpY2VzBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAipzZWxsUmVzb3VyY2VzIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudHMEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdyZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBA0kdDAyODkxNTI5MDQxCQETc2VsbFJlc291cmNlc0NvbW1vbgQFB3Jlc0xpc3QJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBQdhbW91bnRzBQltaW5QcmljZXMEDmZhY3RvcnlBY3Rpb25zCAUNJHQwMjg5MTUyOTA0MQJfMQQGbmV3UmVzCAUNJHQwMjg5MTUyOTA0MQJfMgQMdXNkdFJlY2VpdmVkCAUNJHQwMjg5MTUyOTA0MQJfMwQIdG90YWxSZXMIBQ0kdDAyODkxNTI5MDQxAl80BBBhY3Rpdml0aWVzQW1vdW50CQBpAgUMdXNkdFJlY2VpdmVkAGQEB25ld1BhY2sJALoJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAgUGbmV3UmVzAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BA5iYWNrcGFja1Jlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUHeHBUcmFkZQUIdG90YWxSZXMFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDNCAIJAM0IAgUOZmFjdG9yeUFjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFDHVzZHRSZWNlaXZlZAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAJUKAwUOYmFja3BhY2tSZXN1bHQFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESc2VsbFJlc291cmNlc1dvcmxkAgRhZGRyBmFtb3VudAMJAQIhPQIIBQFpBmNhbGxlcgUNYWNyZXNDb250cmFjdAkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA0kdDAyOTgzMzI5OTkwCQEac2VsbFJlc291cmNlc1dvcmxkSW50ZXJuYWwBBQZhbW91bnQEDmZhY3RvcnlBY3Rpb25zCAUNJHQwMjk4MzMyOTk5MAJfMQQIdXNkdExlZnQIBQ0kdDAyOTgzMzI5OTkwAl8yBANmZWUIBQ0kdDAyOTgzMzI5OTkwAl8zBBBhY3Rpdml0aWVzQW1vdW50CAUNJHQwMjk4MzMyOTk5MAJfNAQIdG90YWxSZXMIBQ0kdDAyOTgzMzI5OTkwAl81AwkAZwIAAAUIdXNkdExlZnQJAAIBCQCsAgICK1RoaXMgdHJhZGUgZG9lcyBub3QgY292ZXIgZGVsaXZlcnkgY29zdCBvZiAJAQpmaXhlZFBvaW50AgUDZmVlAAYEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQWNjU3RhdHMJAMwIAgUEYWRkcgkAzAgCCQBrAwUHeHBUcmFkZQUIdG90YWxSZXMFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDNCAIJAM0IAgkAzQgCBQ5mYWN0b3J5QWN0aW9ucwkBDEludGVnZXJFbnRyeQIFD2RlbGl2ZXJ5RnVuZEtleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAFA2ZlZQkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwUSaW52ZXN0RnVuZENvbnRyYWN0BQh1c2R0TGVmdAULdXNkdEFzc2V0SWQJAJQKAgUIdXNkdExlZnQFC3N0YXRzUmVzdWx0AWkBGnNlbGxSZXNvdXJjZXNXb3JsZFJFQURPTkxZAQZhbW91bnQECHVzZHRMZWZ0CAkBGnNlbGxSZXNvdXJjZXNXb3JsZEludGVybmFsAQUGYW1vdW50Al8yCQCUCgIFA25pbAUIdXNkdExlZnQBaQEZc2VsbFJlc291cmNlc0R1Y2tEZWxpdmVyeQMHYW1vdW50cwltaW5QcmljZXMQZmFjdG9yeUNvbnRpbmVudAQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIqc2VsbFJlc291cmNlcyBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB3Jlc0xpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMCAV8EDSR0MDMxMTQ5MzEyNzAJARNzZWxsUmVzb3VyY2VzQ29tbW9uBAUHcmVzTGlzdAUQZmFjdG9yeUNvbnRpbmVudAUHYW1vdW50cwUJbWluUHJpY2VzBA5mYWN0b3J5QWN0aW9ucwgFDSR0MDMxMTQ5MzEyNzACXzEEBm5ld1JlcwgFDSR0MDMxMTQ5MzEyNzACXzIEDHVzZHRSZWNlaXZlZAgFDSR0MDMxMTQ5MzEyNzACXzMECHRvdGFsUmVzCAUNJHQwMzExNDkzMTI3MAJfNAQHbmV3UGFjawkAugkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAuQkCBQZuZXdSZXMCAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEDmJhY2twYWNrUmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQd4cFRyYWRlBQh0b3RhbFJlcwUFTVVMVDgFA25pbAUDbmlsBAdmZWVQYXJ0CQBrAwUMdXNkdFJlY2VpdmVkBQxERUxJVkVSWV9GRUUFBU1VTFQ2BANmZWUJAJYDAQkAzAgCBQdmZWVQYXJ0CQDMCAIFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUDbmlsBBBhY3Rpdml0aWVzQW1vdW50CQBpAgUMdXNkdFJlY2VpdmVkAGQDCQBnAgUDZmVlCQBlAgUMdXNkdFJlY2VpdmVkBRBhY3Rpdml0aWVzQW1vdW50CQACAQkArAICAitUaGlzIHRyYWRlIGRvZXMgbm90IGNvdmVyIGRlbGl2ZXJ5IGNvc3Qgb2YgCQEKZml4ZWRQb2ludAIFA2ZlZQAGBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAJAJQKAgkAzQgCCQDNCAIJAM0IAgUOZmFjdG9yeUFjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIJAGUCBQx1c2R0UmVjZWl2ZWQFEGFjdGl2aXRpZXNBbW91bnQFA2ZlZQULdXNkdEFzc2V0SWQJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkAlQoDBQ5iYWNrcGFja1Jlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARlzZWxsUmVzb3VyY2VzTGFuZERlbGl2ZXJ5BAdhbW91bnRzCW1pblByaWNlcwtsYW5kQXNzZXRJZBBmYWN0b3J5Q29udGluZW50BAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIqc2VsbFJlc291cmNlcyBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzBAR1c2VyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUEdXNlcgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQHcmVzTGlzdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8EDSR0MDMzMTg0MzMzMDUJARNzZWxsUmVzb3VyY2VzQ29tbW9uBAUHcmVzTGlzdAUQZmFjdG9yeUNvbnRpbmVudAUHYW1vdW50cwUJbWluUHJpY2VzBA5mYWN0b3J5QWN0aW9ucwgFDSR0MDMzMTg0MzMzMDUCXzEEBm5ld1JlcwgFDSR0MDMzMTg0MzMzMDUCXzIEDHVzZHRSZWNlaXZlZAgFDSR0MDMzMTg0MzMzMDUCXzMECHRvdGFsUmVzCAUNJHQwMzMxODQzMzMwNQJfNAQFd2hTdHIJALoJAgkAzAgCCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMJAMwIAgkAuQkCBQZuZXdSZXMCAV8JAMwIAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0CQDMCAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QJAMwIAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAUDbmlsAgE6BAZ3aFNhdmUJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag1zYXZlV2FyZWhvdXNlCQDMCAIFBXdoU3RyCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVBY2NTdGF0cwkAzAgCBQRhZGRyCQDMCAIJAGsDBQd4cFRyYWRlBQh0b3RhbFJlcwUFTVVMVDgFA25pbAUDbmlsBAdmZWVQYXJ0CQBrAwUMdXNkdFJlY2VpdmVkBQxERUxJVkVSWV9GRUUFBU1VTFQ2BANmZWUJAJYDAQkAzAgCBQdmZWVQYXJ0CQDMCAIFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUDbmlsBBBhY3Rpdml0aWVzQW1vdW50CQBpAgUMdXNkdFJlY2VpdmVkAGQDCQBnAgUDZmVlCQBlAgUMdXNkdFJlY2VpdmVkBRBhY3Rpdml0aWVzQW1vdW50CQACAQkArAICAitUaGlzIHRyYWRlIGRvZXMgbm90IGNvdmVyIGRlbGl2ZXJ5IGNvc3Qgb2YgCQEKZml4ZWRQb2ludAIFA2ZlZQAGBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAJAJQKAgkAzQgCCQDNCAIJAM0IAgUOZmFjdG9yeUFjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIJAGUCBQx1c2R0UmVjZWl2ZWQFEGFjdGl2aXRpZXNBbW91bnQFA2ZlZQULdXNkdEFzc2V0SWQJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkAlQoDBQZ3aFNhdmUFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMYnV5TWF0ZXJpYWxzAgdhbW91bnRzCW1heFByaWNlcwQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBA0kdDAzNTEyOTM1MjUxCQESYnV5TWF0ZXJpYWxzQ29tbW9uBAUHbWF0TGlzdAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQFB2Ftb3VudHMFCW1heFByaWNlcwQOZmFjdG9yeUFjdGlvbnMIBQ0kdDAzNTEyOTM1MjUxAl8xBAZuZXdNYXQIBQ0kdDAzNTEyOTM1MjUxAl8yBAl1c2R0U3BlbnQIBQ0kdDAzNTEyOTM1MjUxAl8zBAh0b3RhbE1hdAgFDSR0MDM1MTI5MzUyNTECXzQDCQBmAgUJdXNkdFNwZW50BQNhbXQJAAIBCQCsAgIJAKwCAgkArAICAh9JbnN1ZmZpY2llbnQgcGF5bWVudCEgQXR0YWNoZWQ9CQEKZml4ZWRQb2ludAIFA2FtdAAGAgssIHJlcXVpcmVkPQkBCmZpeGVkUG9pbnQCBQl1c2R0U3BlbnQABgQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgkAuQkCBQZuZXdNYXQCAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEDmJhY2twYWNrUmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEBHJlc3QDCQBmAgkAZQIFA2FtdAUJdXNkdFNwZW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUDYW10BQl1c2R0U3BlbnQFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIFCXVzZHRTcGVudABkBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUHeHBUcmFkZQUIdG90YWxNYXQFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDNCAIJAM4IAgUOZmFjdG9yeUFjdGlvbnMFBHJlc3QJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAJUKAwUOYmFja3BhY2tSZXN1bHQFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEYYnV5TWF0ZXJpYWxzRHVja0RlbGl2ZXJ5AwdhbW91bnRzCW1heFByaWNlcxBmYWN0b3J5Q29udGluZW50BAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBA0kdDAzNjY5NTM2ODEyCQESYnV5TWF0ZXJpYWxzQ29tbW9uBAUHbWF0TGlzdAUQZmFjdG9yeUNvbnRpbmVudAUHYW1vdW50cwUJbWF4UHJpY2VzBA5mYWN0b3J5QWN0aW9ucwgFDSR0MDM2Njk1MzY4MTICXzEEBm5ld01hdAgFDSR0MDM2Njk1MzY4MTICXzIECXVzZHRTcGVudAgFDSR0MDM2Njk1MzY4MTICXzMECHRvdGFsTWF0CAUNJHQwMzY2OTUzNjgxMgJfNAQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgkAuQkCBQZuZXdNYXQCAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEDmJhY2twYWNrUmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQd4cFRyYWRlBQh0b3RhbE1hdAUFTVVMVDgFA25pbAUDbmlsBAdmZWVQYXJ0CQBrAwUJdXNkdFNwZW50BQxERUxJVkVSWV9GRUUFBU1VTFQ2BANmZWUJAJYDAQkAzAgCBQdmZWVQYXJ0CQDMCAIFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUDbmlsBBB1c2R0U3BlbnRXaXRoRmVlCQBkAgUJdXNkdFNwZW50BQNmZWUDCQBmAgUQdXNkdFNwZW50V2l0aEZlZQUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUJdXNkdFNwZW50AAYCASsJAQpmaXhlZFBvaW50AgUDZmVlAAYCDihkZWxpdmVyeSBmZWUpBARyZXN0AwkAZgIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIFCXVzZHRTcGVudABkBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAJAJQKAgkAzQgCCQDNCAIJAM4IAgUOZmFjdG9yeUFjdGlvbnMFBHJlc3QJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkAlQoDBQ5iYWNrcGFja1Jlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARhidXlNYXRlcmlhbHNMYW5kRGVsaXZlcnkEB2Ftb3VudHMJbWF4UHJpY2VzC2xhbmRBc3NldElkEGZhY3RvcnlDb250aW5lbnQEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQEdXNlcggFAWkGY2FsbGVyBARhZGRyCQClCAEFBHVzZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkBAiE9AgUFb3duZXIFBGFkZHIJAAIBCQCsAgIFCkxBTkRQUkVGSVgCDSBpcyBub3QgeW91cnMEAndoCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIUZ2V0V2FyZWhvdXNlUkVBRE9OTFkJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAljdXJyZW50V2gJALwJAgUCd2gCAToEB21hdExpc3QJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0AgFfBA0kdDAzODk3NzM5MDk0CQESYnV5TWF0ZXJpYWxzQ29tbW9uBAUHbWF0TGlzdAUQZmFjdG9yeUNvbnRpbmVudAUHYW1vdW50cwUJbWF4UHJpY2VzBA5mYWN0b3J5QWN0aW9ucwgFDSR0MDM4OTc3MzkwOTQCXzEEBm5ld01hdAgFDSR0MDM4OTc3MzkwOTQCXzIECXVzZHRTcGVudAgFDSR0MDM4OTc3MzkwOTQCXzMECHRvdGFsTWF0CAUNJHQwMzg5NzczOTA5NAJfNAQFd2hTdHIJALoJAgkAzAgCCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMJAMwIAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzCQDMCAIJALkJAgUGbmV3TWF0AgFfCQDMCAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QJAMwIAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAUDbmlsAgE6BAZ3aFNhdmUJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag1zYXZlV2FyZWhvdXNlCQDMCAIFBXdoU3RyCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVBY2NTdGF0cwkAzAgCBQRhZGRyCQDMCAIJAGsDBQd4cFRyYWRlBQh0b3RhbE1hdAUFTVVMVDgFA25pbAUDbmlsBAdmZWVQYXJ0CQBrAwUJdXNkdFNwZW50BQxERUxJVkVSWV9GRUUFBU1VTFQ2BANmZWUJAJYDAQkAzAgCBQdmZWVQYXJ0CQDMCAIFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUDbmlsBBB1c2R0U3BlbnRXaXRoRmVlCQBkAgUJdXNkdFNwZW50BQNmZWUDCQBmAgUQdXNkdFNwZW50V2l0aEZlZQUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUJdXNkdFNwZW50AAYCASsJAQpmaXhlZFBvaW50AgUDZmVlAAYCDihkZWxpdmVyeSBmZWUpBARyZXN0AwkAZgIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIFCXVzZHRTcGVudABkBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAJAJQKAgkAzQgCCQDNCAIJAM4IAgUOZmFjdG9yeUFjdGlvbnMFBHJlc3QJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkAlQoDBQZ3aFNhdmUFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERZXhjaGFuZ2VSZXNvdXJjZXMBB2Ftb3VudHMEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQNJHQwNDExNzI0MTI3OAkBF2V4Y2hhbmdlUmVzb3VyY2VzQ29tbW9uAwUHcmVzTGlzdAUHbWF0TGlzdAUHYW1vdW50cwQGbmV3UmVzCAUNJHQwNDExNzI0MTI3OAJfMQQGbmV3TWF0CAUNJHQwNDExNzI0MTI3OAJfMgQJdXNkdFNwZW50CAUNJHQwNDExNzI0MTI3OAJfMwQUdG90YWxBbW91bnRDb252ZXJ0ZWQIBQ0kdDA0MTE3MjQxMjc4Al80AwkAZgIFCXVzZHRTcGVudAUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUJdXNkdFNwZW50AAYEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAgUGbmV3UmVzAgFfCQDMCAIJALkJAgUGbmV3TWF0AgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BA5iYWNrcGFja1Jlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBARyZXN0AwkAZgIJAGUCBQNhbXQFCXVzZHRTcGVudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAUJdXNkdFNwZW50BQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwEEGFjdGl2aXRpZXNBbW91bnQJAGkCBQl1c2R0U3BlbnQAZAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFB3hwVHJhZGUFFHRvdGFsQW1vdW50Q29udmVydGVkBQVNVUxUOAUDbmlsBQNuaWwJAJQKAgkAzQgCBQRyZXN0CQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFEGFjdGl2aXRpZXNBbW91bnQFC3VzZHRBc3NldElkCQCVCgMFDmJhY2twYWNrUmVzdWx0BQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHWV4Y2hhbmdlUmVzb3VyY2VzRHVja0RlbGl2ZXJ5AQdhbW91bnRzBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdyZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBA0kdDA0MjcxNjQyODIyCQEXZXhjaGFuZ2VSZXNvdXJjZXNDb21tb24DBQdyZXNMaXN0BQdtYXRMaXN0BQdhbW91bnRzBAZuZXdSZXMIBQ0kdDA0MjcxNjQyODIyAl8xBAZuZXdNYXQIBQ0kdDA0MjcxNjQyODIyAl8yBAl1c2R0U3BlbnQIBQ0kdDA0MjcxNjQyODIyAl8zBBR0b3RhbEFtb3VudENvbnZlcnRlZAgFDSR0MDQyNzE2NDI4MjICXzQEB2ZlZVBhcnQJAGsDBQl1c2R0U3BlbnQFDkRFTElWRVJZX0ZFRTE1BQVNVUxUNgQDZmVlCQCWAwEJAMwIAgUHZmVlUGFydAkAzAgCBRdNSU5fVVNEVF9GRUVfREVMSVZFUlkxNQUDbmlsBBB1c2R0U3BlbnRXaXRoRmVlCQBkAgUJdXNkdFNwZW50BQNmZWUDCQBmAgUQdXNkdFNwZW50V2l0aEZlZQUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUJdXNkdFNwZW50AAYCASsJAQpmaXhlZFBvaW50AgUDZmVlAAYCDihkZWxpdmVyeSBmZWUpBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIFBm5ld1JlcwIBXwkAzAgCCQC5CQIFBm5ld01hdAIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQOYmFja3BhY2tSZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQEcmVzdAMJAGYCCQBlAgUDYW10BRB1c2R0U3BlbnRXaXRoRmVlAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUDYW10BRB1c2R0U3BlbnRXaXRoRmVlBQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwEEGFjdGl2aXRpZXNBbW91bnQJAGkCBQl1c2R0U3BlbnQAZAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFB3hwVHJhZGUFFHRvdGFsQW1vdW50Q29udmVydGVkBQVNVUxUOAUDbmlsBQNuaWwECWZ1bmRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9kZWxpdmVyeUZ1bmRLZXkAAAkAlAoCCQDNCAIJAM0IAgUEcmVzdAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkBDEludGVnZXJFbnRyeQIFD2RlbGl2ZXJ5RnVuZEtleQkAZAIFCWZ1bmRUb3RhbAUDZmVlCQCVCgMFDmJhY2twYWNrUmVzdWx0BQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHWV4Y2hhbmdlUmVzb3VyY2VzTGFuZERlbGl2ZXJ5AgdhbW91bnRzC2xhbmRBc3NldElkBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEBHVzZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQR1c2VyBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQRhZGRyCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBAJ3aAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCFGdldFdhcmVob3VzZVJFQURPTkxZCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQJY3VycmVudFdoCQC8CQIFAndoAgE6BAdyZXNMaXN0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwIBXwQHbWF0TGlzdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8EDSR0MDQ1MDA3NDUxMTMJARdleGNoYW5nZVJlc291cmNlc0NvbW1vbgMFB3Jlc0xpc3QFB21hdExpc3QFB2Ftb3VudHMEBm5ld1JlcwgFDSR0MDQ1MDA3NDUxMTMCXzEEBm5ld01hdAgFDSR0MDQ1MDA3NDUxMTMCXzIECXVzZHRTcGVudAgFDSR0MDQ1MDA3NDUxMTMCXzMEFHRvdGFsQW1vdW50Q29udmVydGVkCAUNJHQwNDUwMDc0NTExMwJfNAQFd2hTdHIJALoJAgkAzAgCCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMJAMwIAgkAuQkCBQZuZXdSZXMCAV8JAMwIAgkAuQkCBQZuZXdNYXQCAV8JAMwIAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAkAzAgCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUBQNuaWwCAToEBndoU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDXNhdmVXYXJlaG91c2UJAMwIAgUFd2hTdHIJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUFjY1N0YXRzCQDMCAIFBGFkZHIJAMwIAgkAawMFB3hwVHJhZGUFFHRvdGFsQW1vdW50Q29udmVydGVkBQVNVUxUOAUDbmlsBQNuaWwEB2ZlZVBhcnQJAGsDBQl1c2R0U3BlbnQFDkRFTElWRVJZX0ZFRTE1BQVNVUxUNgQDZmVlCQCWAwEJAMwIAgUHZmVlUGFydAkAzAgCBRdNSU5fVVNEVF9GRUVfREVMSVZFUlkxNQUDbmlsBBB1c2R0U3BlbnRXaXRoRmVlCQBkAgUJdXNkdFNwZW50BQNmZWUDCQBmAgUQdXNkdFNwZW50V2l0aEZlZQUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUJdXNkdFNwZW50AAYCASsJAQpmaXhlZFBvaW50AgUDZmVlAAYCDihkZWxpdmVyeSBmZWUpBARyZXN0AwkAZgIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIFCXVzZHRTcGVudABkBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAJAJQKAgkAzQgCCQDNCAIFBHJlc3QJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkAlQoDBQZ3aFNhdmUFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKY3JhZnRHb29kcwIKcHJvZHVjdElkeAhxdWFudGl0eQQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUDYW10BQVNVUxUNgkAAgEJAKwCAgkArAICAghleGFjdGx5IAkBCmZpeGVkUG9pbnQCBQ9DUkFGVF9VU0RUX0NPU1QABgIhIFVTRFQgbXVzdCBiZSBhdHRhY2hlZCBhcyBwYXltZW50BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAU0JAAIBCQCsAgICMUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgTWFudWZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBGNvbnQJAJEDAgULY3VyTG9jYXRpb24FD2xvY0lkeENvbnRpbmVudAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBAhwcm9kTGlzdAMJAAACCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIBXwQNJHQwNDc0Mzg0NzUzNQkBEGNyYWZ0R29vZHNDb21tb24FBQdtYXRMaXN0BQhwcm9kTGlzdAUEY29udAUKcHJvZHVjdElkeAUIcXVhbnRpdHkEBm5ld01hdAgFDSR0MDQ3NDM4NDc1MzUCXzEEB25ld1Byb2QIBQ0kdDA0NzQzODQ3NTM1Al8yBAhtYXRTcGVudAgFDSR0MDQ3NDM4NDc1MzUCXzMEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAgUGbmV3TWF0AgFfCQDMCAIJALoJAgUHbmV3UHJvZAIBXwUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFB3hwQ3JhZnQFCG1hdFNwZW50BQVNVUxUOAUDbmlsBQNuaWwJAJQKAgUDbmlsCQCVCgMFBnJlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARZjcmFmdEdvb2RzRHVja0RlbGl2ZXJ5Awpwcm9kdWN0SWR4CHF1YW50aXR5FG1hbnVmYWN0b3J5Q29udGluZW50BAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBAhwcm9kTGlzdAMJAAACCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIBXwQNJHQwNDg2ODM0ODc5NgkBEGNyYWZ0R29vZHNDb21tb24FBQdtYXRMaXN0BQhwcm9kTGlzdAUUbWFudWZhY3RvcnlDb250aW5lbnQFCnByb2R1Y3RJZHgFCHF1YW50aXR5BAZuZXdNYXQIBQ0kdDA0ODY4MzQ4Nzk2Al8xBAduZXdQcm9kCAUNJHQwNDg2ODM0ODc5NgJfMgQIbWF0U3BlbnQIBQ0kdDA0ODY4MzQ4Nzk2Al8zBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCCQC5CQIFBm5ld01hdAIBXwkAzAgCCQC6CQIFB25ld1Byb2QCAV8FA25pbAIBOgQOYmFja3BhY2tSZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFB3hwQ3JhZnQFCG1hdFNwZW50BQVNVUxUOAUDbmlsBQNuaWwEB2ZlZVBhcnQJAGsDBQhxdWFudGl0eQUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBRRDUkFGVF9ERUxJVkVSWV9DT0VGRgQDZmVlCQCWAwEJAMwIAgUHZmVlUGFydAkAzAgCBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFA25pbAQQdXNkdFNwZW50V2l0aEZlZQkAZAIFD0NSQUZUX1VTRFRfQ09TVAUDZmVlAwkAZgIFEHVzZHRTcGVudFdpdGhGZWUFA2FtdAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICH0luc3VmZmljaWVudCBwYXltZW50ISBBdHRhY2hlZD0JAQpmaXhlZFBvaW50AgUDYW10AAYCCywgcmVxdWlyZWQ9CQEKZml4ZWRQb2ludAIFD0NSQUZUX1VTRFRfQ09TVAAGAgErCQEKZml4ZWRQb2ludAIFA2ZlZQAGAg4oZGVsaXZlcnkgZmVlKQQEcmVzdAMJAGYCCQBlAgUDYW10BRB1c2R0U3BlbnRXaXRoRmVlAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUDYW10BRB1c2R0U3BlbnRXaXRoRmVlBQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwECWZ1bmRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9kZWxpdmVyeUZ1bmRLZXkAAAkAlAoCCQDNCAIFBHJlc3QJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkAlQoDBQ5iYWNrcGFja1Jlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARZjcmFmdEdvb2RzTGFuZERlbGl2ZXJ5BApwcm9kdWN0SWR4CHF1YW50aXR5C2xhbmRBc3NldElkFG1hbnVmYWN0b3J5Q29udGluZW50BAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEBHVzZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQR1c2VyBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQRhZGRyCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBAJ3aAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCFGdldFdhcmVob3VzZVJFQURPTkxZCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQJY3VycmVudFdoCQC8CQIFAndoAgE6BAdtYXRMaXN0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeE1hdAIBXwQIcHJvZExpc3QDCQAAAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIBXwQNJHQwNTA5NjI1MTA3NQkBEGNyYWZ0R29vZHNDb21tb24FBQdtYXRMaXN0BQhwcm9kTGlzdAUUbWFudWZhY3RvcnlDb250aW5lbnQFCnByb2R1Y3RJZHgFCHF1YW50aXR5BAZuZXdNYXQIBQ0kdDA1MDk2MjUxMDc1Al8xBAduZXdQcm9kCAUNJHQwNTA5NjI1MTA3NQJfMgQIbWF0U3BlbnQIBQ0kdDA1MDk2MjUxMDc1Al8zBAV3aFN0cgkAugkCCQDMCAIJAJEDAgUJY3VycmVudFdoBQt3aElkeExldmVscwkAzAgCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMJAMwIAgkAuQkCBQZuZXdNYXQCAV8JAMwIAgkAugkCBQduZXdQcm9kAgFfCQDMCAIJAJEDAgUJY3VycmVudFdoBQl3aElkeExPRlQFA25pbAIBOgQGd2hTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAINc2F2ZVdhcmVob3VzZQkAzAgCBQV3aFN0cgkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQWNjU3RhdHMJAMwIAgUEYWRkcgkAzAgCCQBrAwUHeHBDcmFmdAUIbWF0U3BlbnQFBU1VTFQ4BQNuaWwFA25pbAQHZmVlUGFydAkAawMFCHF1YW50aXR5BRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFFENSQUZUX0RFTElWRVJZX0NPRUZGBANmZWUJAJYDAQkAzAgCBQdmZWVQYXJ0CQDMCAIFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUDbmlsBBB1c2R0U3BlbnRXaXRoRmVlCQBkAgUPQ1JBRlRfVVNEVF9DT1NUBQNmZWUDCQBmAgUQdXNkdFNwZW50V2l0aEZlZQUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUPQ1JBRlRfVVNEVF9DT1NUAAYCASsJAQpmaXhlZFBvaW50AgUDZmVlAAYCDihkZWxpdmVyeSBmZWUpBARyZXN0AwkAZgIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUFC3VzZHRBc3NldElkBQNuaWwFA25pbAQJZnVuZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFD2RlbGl2ZXJ5RnVuZEtleQAACQCUCgIJAM0IAgUEcmVzdAkBDEludGVnZXJFbnRyeQIFD2RlbGl2ZXJ5RnVuZEtleQkAZAIFCWZ1bmRUb3RhbAUDZmVlCQCVCgMFBndoU2F2ZQUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFzZXRXYXJlaG91c2VPcmRlcgILbmV3T3JkZXJTdHILbGFuZEFzc2V0SWQEBHVzZXIIBQFpDG9yaWdpbkNhbGxlcgQEYWRkcgkApQgBBQR1c2VyBAZyZXN1bHQDCQECIT0CBQR1c2VyBQxyZXN0Q29udHJhY3QJAQxjaGVja0Jsb2NrZWQABwQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDAwkBAiE9AgUEdXNlcgUMcmVzdENvbnRyYWN0CQECIT0CBQVvd25lcgUEYWRkcgcJAAIBCQCsAgIFCkxBTkRQUkVGSVgCDSBpcyBub3QgeW91cnMECG5ld09yZGVyCQC8CQIFC25ld09yZGVyU3RyAgE6BAJ3aAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCFGdldFdhcmVob3VzZVJFQURPTkxZCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQJY3VycmVudFdoCQC8CQIFAndoAgE6BARsb2Z0CQC1CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeExPRlQCAV8EB3doVG90YWwJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQh2b2xUb3RhbAQGb3JkS2V5CQEOa2V5T3JkZXJCeUxhbmQBBQtsYW5kQXNzZXRJZAQKY3VycmVudE9yZAkBCGdldE9yZGVyAQUGb3JkS2V5BAF6CQELc2V0SW50ZXJuYWwDBQljdXJyZW50V2gFCmN1cnJlbnRPcmQFCG5ld09yZGVyBAtidXlWb2xTYWxkbwgFAXoCXzQEDHNlbGxWb2xTYWxkbwgFAXoCXzUECndoT2NjdXBpZWQIBQF6Al83BAh3aExvY2tlZAkAZAIFC2J1eVZvbFNhbGRvBQxzZWxsVm9sU2FsZG8EBndoRnJlZQkAZQIJAGUCBQd3aFRvdGFsBQp3aE9jY3VwaWVkBQh3aExvY2tlZAMJAGYCAAAFBndoRnJlZQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICE0F0dGVtcHQgdG8gcmVzZXJ2ZSAJAKQDAQULYnV5Vm9sU2FsZG8CGyBzcGFjZSBmb3IgYnV5IG9yZGVycywgYW5kIAkApAMBBQxzZWxsVm9sU2FsZG8CJSBzcGFjZSBmb3Igc2VsbCBvcmRlcnMgKGFuZCBvY2N1cGllZD0JAKQDAQUKd2hPY2N1cGllZAIfKSwgbGVhZHMgdG8gbmVnYXRpdmUgZnJlZSBzcGFjZQQFd2hTdHIJALoJAgkAzAgCCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMJAMwIAgkAuQkCCAUBegJfMQIBXwkAzAgCCQC5CQIIBQF6Al8yAgFfCQDMCAIJALoJAggFAXoCXzMCAV8JAMwIAgkApAMBBQh3aExvY2tlZAUDbmlsAgE6BAZ3aFNhdmUJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag1zYXZlV2FyZWhvdXNlCQDMCAIFBXdoU3RyCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQIdXNkU2FsZG8IBQF6Al82BAdhY3Rpb25zAwkAZgIFCHVzZFNhbGRvAAADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQMJAQIhPQIFA2FtdAUIdXNkU2FsZG8JAAIBCQCsAgICElBheW1lbnQgbmVlZGVkIGlzIAkApAMBBQh1c2RTYWxkbwkAzAgCCQELU3RyaW5nRW50cnkCBQZvcmRLZXkFC25ld09yZGVyU3RyBQNuaWwDCQAAAgUIdXNkU2FsZG8AAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECEk5vIHBheW1lbnRzIG5lZWRlZAkAzAgCCQELU3RyaW5nRW50cnkCBQZvcmRLZXkFC25ld09yZGVyU3RyBQNuaWwDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhJObyBwYXltZW50cyBuZWVkZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUFb3duZXIJAQEtAQUIdXNkU2FsZG8FC3VzZHRBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQULbmV3T3JkZXJTdHIFA25pbAkAlAoCBQdhY3Rpb25zCQCUCgIFBnJlc3VsdAUGd2hTYXZlAWkBFGFjY2VwdFdhcmVob3VzZU9yZGVyAwpicE9yZGVyU3RyD3Nob3BMYW5kQXNzZXRJZAtkdWNrQXNzZXRJZAQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAQGY2FsbGVyCAUBaQxvcmlnaW5DYWxsZXIECmNhbGxlckFkZHIJAKUIAQUGY2FsbGVyBBFzdGFrZWREdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUKY2FsbGVyQWRkcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQURc3Rha2VkRHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgQDbG9jCQC1CQIJAQV2YWx1ZQEFC2N1ckxvY2F0aW9uAgFfAwkBAiE9AgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAUwJAAIBCQCsAgIJAKwCAgIWRHVjayBsb2NhdGlvbiB0eXBlIGlzIAkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCESwgYnV0IHNob3VsZCBiZSBMAwkBAiE9AgURc3Rha2VkRHVja0Fzc2V0SWQFC2R1Y2tBc3NldElkCQACAQkArAICCQCsAgIJAKwCAgIUWW91ciBzdGFrZWQgZHVjayBpcyAFEXN0YWtlZER1Y2tBc3NldElkAg0sIGJ1dCBwYXNzZWQgBQtkdWNrQXNzZXRJZAQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQUFYnBLZXkECWJwUmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQJYnBNYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBApicFByb2RMaXN0AwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfBA0kdDA1Njk4ODU3MjI4CQEVYWNjZXB0U2hvcE9yZGVyQ29tbW9uBgUPc2hvcExhbmRBc3NldElkBQpjYWxsZXJBZGRyBQpicE9yZGVyU3RyBQlicFJlc0xpc3QFCWJwTWF0TGlzdAUKYnBQcm9kTGlzdAQKc2hvcEFjdGlvbggFDSR0MDU2OTg4NTcyMjgCXzEECm5ld1VzZXJSZXMIBQ0kdDA1Njk4ODU3MjI4Al8yBApuZXdVc2VyTWF0CAUNJHQwNTY5ODg1NzIyOAJfMwQLbmV3VXNlclByb2QIBQ0kdDA1Njk4ODU3MjI4Al80BA11c2RXaDJCcFNhbGRvCAUNJHQwNTY5ODg1NzIyOAJfNQQNdXNkQnAyV2hTYWxkbwgFDSR0MDU2OTg4NTcyMjgCXzYECHhwQW1vdW50CAUNJHQwNTY5ODg1NzIyOAJfNwQNc2hvcExhbmRPd25lcggFDSR0MDU2OTg4NTcyMjgCXzgECnNob3BXaFNhdmUIBQ0kdDA1Njk4ODU3MjI4Al85BA5hY2NTdGF0c1Jlc3VsdAgFDSR0MDU2OTg4NTcyMjgDXzEwBAhhY3Rpb25zMQkAzAgCBQpzaG9wQWN0aW9uCQEQc2hvcDJ1c2VyQWN0aW9ucwMFDXVzZFdoMkJwU2FsZG8FCmNhbGxlckFkZHIAAAQIYWN0aW9uczIJARB1c2VyMnNob3BBY3Rpb25zBAUNdXNkQnAyV2hTYWxkbwgFAWkIcGF5bWVudHMFDXNob3BMYW5kT3duZXIAAAQIbmV3QnBTdHIJALoJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAgUKbmV3VXNlclJlcwIBXwkAzAgCCQC5CQIFCm5ld1VzZXJNYXQCAV8JAMwIAgkAugkCBQtuZXdVc2VyUHJvZAIBXwUDbmlsAgE6BAZicFNhdmUJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQhuZXdCcFN0cgUDbmlsBQNuaWwED2R1Y2tTdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUGeHBTaG9wBQh4cEFtb3VudAUFTVVMVDgFA25pbAUDbmlsCQCUCgIJAM4IAgUIYWN0aW9uczEFCGFjdGlvbnMyCQCXCgUFDHByb2xvZ1Jlc3VsdAUKc2hvcFdoU2F2ZQUGYnBTYXZlBQ9kdWNrU3RhdHNSZXN1bHQFDmFjY1N0YXRzUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBG2FjY2VwdFNob3BPcmRlckR1Y2tEZWxpdmVyeQIIb3JkZXJTdHIPc2hvcExhbmRBc3NldElkBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0BAZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcgQKY2FsbGVyQWRkcgkApQgBBQZjYWxsZXIEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQpjYWxsZXJBZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQJYnBSZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBAlicE1hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8ECmJwUHJvZExpc3QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8EDSR0MDU4NTkzNTg4MzEJARVhY2NlcHRTaG9wT3JkZXJDb21tb24GBQ9zaG9wTGFuZEFzc2V0SWQFCmNhbGxlckFkZHIFCG9yZGVyU3RyBQlicFJlc0xpc3QFCWJwTWF0TGlzdAUKYnBQcm9kTGlzdAQKc2hvcEFjdGlvbggFDSR0MDU4NTkzNTg4MzECXzEECm5ld1VzZXJSZXMIBQ0kdDA1ODU5MzU4ODMxAl8yBApuZXdVc2VyTWF0CAUNJHQwNTg1OTM1ODgzMQJfMwQLbmV3VXNlclByb2QIBQ0kdDA1ODU5MzU4ODMxAl80BA11c2RXaDJCcFNhbGRvCAUNJHQwNTg1OTM1ODgzMQJfNQQNdXNkQnAyV2hTYWxkbwgFDSR0MDU4NTkzNTg4MzECXzYECHhwQW1vdW50CAUNJHQwNTg1OTM1ODgzMQJfNwQNc2hvcExhbmRPd25lcggFDSR0MDU4NTkzNTg4MzECXzgECnNob3BXaFNhdmUIBQ0kdDA1ODU5MzU4ODMxAl85BA5hY2NTdGF0c1Jlc3VsdAgFDSR0MDU4NTkzNTg4MzEDXzEwBA9kZWxpdmVyeUZlZVBhcnQJAGsDCQBkAgUNdXNkQnAyV2hTYWxkbwUNdXNkV2gyQnBTYWxkbwUMREVMSVZFUllfRkVFBQVNVUxUNgQLZGVsaXZlcnlGZWUJAJYDAQkAzAgCBQ9kZWxpdmVyeUZlZVBhcnQJAMwIAgUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQNuaWwECHNwZW50RmVlCQBrAwULZGVsaXZlcnlGZWUFDXVzZEJwMldoU2FsZG8JAGQCBQ11c2RCcDJXaFNhbGRvBQ11c2RXaDJCcFNhbGRvBAtyZWNlaXZlZEZlZQkAZQIFC2RlbGl2ZXJ5RmVlBQhzcGVudEZlZQQJZnVuZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFD2RlbGl2ZXJ5RnVuZEtleQAABAhhY3Rpb25zMQkAzAgCBQpzaG9wQWN0aW9uCQEQc2hvcDJ1c2VyQWN0aW9ucwMFDXVzZFdoMkJwU2FsZG8FCmNhbGxlckFkZHIFC3JlY2VpdmVkRmVlBAhhY3Rpb25zMgkBEHVzZXIyc2hvcEFjdGlvbnMEBQ11c2RCcDJXaFNhbGRvCAUBaQhwYXltZW50cwUNc2hvcExhbmRPd25lcgUIc3BlbnRGZWUECG5ld0JwU3RyCQC6CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIFCm5ld1VzZXJSZXMCAV8JAMwIAgkAuQkCBQpuZXdVc2VyTWF0AgFfCQDMCAIJALoJAgULbmV3VXNlclByb2QCAV8FA25pbAIBOgQGYnBTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUIbmV3QnBTdHIFA25pbAUDbmlsBA9kdWNrU3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFBnhwU2hvcAUIeHBBbW91bnQFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDNCAIJAM4IAgUIYWN0aW9uczEFCGFjdGlvbnMyCQEMSW50ZWdlckVudHJ5AgUPZGVsaXZlcnlGdW5kS2V5CQBkAgUJZnVuZFRvdGFsBQtkZWxpdmVyeUZlZQkAlwoFBQxwcm9sb2dSZXN1bHQFCnNob3BXaFNhdmUFBmJwU2F2ZQUPZHVja1N0YXRzUmVzdWx0BQ5hY2NTdGF0c1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARthY2NlcHRTaG9wT3JkZXJMYW5kRGVsaXZlcnkDCG9yZGVyU3RyD3Nob3BMYW5kQXNzZXRJZA1teUxhbmRBc3NldElkBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0BAZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcgQKY2FsbGVyQWRkcgkApQgBBQZjYWxsZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQUNbXlMYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFDW15TGFuZEFzc2V0SWQJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFDW15TGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkBAiE9AgUFb3duZXIFCmNhbGxlckFkZHIJAAIBCQCsAgIFCkxBTkRQUkVGSVgCDSBpcyBub3QgeW91cnMEAndoCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIUZ2V0V2FyZWhvdXNlUkVBRE9OTFkJAMwIAgUNbXlMYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQHcmVzTGlzdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8EB21hdExpc3QJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0AgFfBAhwcm9kTGlzdAMJAAACCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgFfBA0kdDA2MDk1MjYxMTg0CQEVYWNjZXB0U2hvcE9yZGVyQ29tbW9uBgUPc2hvcExhbmRBc3NldElkBQpjYWxsZXJBZGRyBQhvcmRlclN0cgUHcmVzTGlzdAUHbWF0TGlzdAUIcHJvZExpc3QECnNob3BBY3Rpb24IBQ0kdDA2MDk1MjYxMTg0Al8xBApuZXdVc2VyUmVzCAUNJHQwNjA5NTI2MTE4NAJfMgQKbmV3VXNlck1hdAgFDSR0MDYwOTUyNjExODQCXzMEC25ld1VzZXJQcm9kCAUNJHQwNjA5NTI2MTE4NAJfNAQNdXNkV2gyQnBTYWxkbwgFDSR0MDYwOTUyNjExODQCXzUEDXVzZEJwMldoU2FsZG8IBQ0kdDA2MDk1MjYxMTg0Al82BAh4cEFtb3VudAgFDSR0MDYwOTUyNjExODQCXzcEDXNob3BMYW5kT3duZXIIBQ0kdDA2MDk1MjYxMTg0Al84BApzaG9wV2hTYXZlCAUNJHQwNjA5NTI2MTE4NAJfOQQOYWNjU3RhdHNSZXN1bHQIBQ0kdDA2MDk1MjYxMTg0A18xMAQPZGVsaXZlcnlGZWVQYXJ0CQBrAwkAZAIFDXVzZEJwMldoU2FsZG8FDXVzZFdoMkJwU2FsZG8FDERFTElWRVJZX0ZFRQUFTVVMVDYEC2RlbGl2ZXJ5RmVlCQCWAwEJAMwIAgUPZGVsaXZlcnlGZWVQYXJ0CQDMCAIFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUDbmlsBAhzcGVudEZlZQkAawMFC2RlbGl2ZXJ5RmVlBQ11c2RCcDJXaFNhbGRvCQBkAgUNdXNkQnAyV2hTYWxkbwUNdXNkV2gyQnBTYWxkbwQLcmVjZWl2ZWRGZWUJAGUCBQtkZWxpdmVyeUZlZQUIc3BlbnRGZWUECWZ1bmRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9kZWxpdmVyeUZ1bmRLZXkAAAQIYWN0aW9uczEJAMwIAgUKc2hvcEFjdGlvbgkBEHNob3AydXNlckFjdGlvbnMDBQ11c2RXaDJCcFNhbGRvBQpjYWxsZXJBZGRyBQtyZWNlaXZlZEZlZQQIYWN0aW9uczIJARB1c2VyMnNob3BBY3Rpb25zBAUNdXNkQnAyV2hTYWxkbwgFAWkIcGF5bWVudHMFDXNob3BMYW5kT3duZXIFCHNwZW50RmVlBAV3aFN0cgkAugkCCQDMCAIJAJEDAgUJY3VycmVudFdoBQt3aElkeExldmVscwkAzAgCCQC5CQIFCm5ld1VzZXJSZXMCAV8JAMwIAgkAuQkCBQpuZXdVc2VyTWF0AgFfCQDMCAIJALkJAgULbmV3VXNlclByb2QCAV8JAMwIAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAUDbmlsAgE6BAZ3aFNhdmUJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag1zYXZlV2FyZWhvdXNlCQDMCAIFBXdoU3RyCQDMCAIFDW15TGFuZEFzc2V0SWQFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUFjY1N0YXRzCQDMCAIFCmNhbGxlckFkZHIJAMwIAgkAawMFBnhwU2hvcAUIeHBBbW91bnQFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDNCAIJAM4IAgUIYWN0aW9uczEFCGFjdGlvbnMyCQEMSW50ZWdlckVudHJ5AgUPZGVsaXZlcnlGdW5kS2V5CQBkAgUJZnVuZFRvdGFsBQtkZWxpdmVyeUZlZQkAlwoFBQxwcm9sb2dSZXN1bHQFCnNob3BXaFNhdmUFBndoU2F2ZQULc3RhdHNSZXN1bHQFDmFjY1N0YXRzUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEHNlbGxQcm9kdWN0c1RvRVMBB2Ftb3VudHMEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhJObyBwYXltZW50cyBuZWVkZWQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBQQkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBBaXJwb3J0LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQECHByb2RMaXN0AwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfBAVlc0tleQkBDmtleUVzV2FyZWhvdXNlAAQIZXhpc3RTdHIJAKIIAQUFZXNLZXkEDGV4aXN0QW1vdW50cwMJAQlpc0RlZmluZWQBBQhleGlzdFN0cgkAvAkCCQEFdmFsdWUBBQhleGlzdFN0cgIBXwUDbmlsCgEIbW92ZVByb2QCA2FjYwlyZWNpcGVTdHIEAWoIBQNhY2MCXzEECHF1YW50aXR5AwkAZgIJAJADAQUHYW1vdW50cwUBagkAkQMCBQdhbW91bnRzBQFqAAADCQBmAgAABQhxdWFudGl0eQkAAgECG1F1YW50aXR5IGNhbm5vdCBiZSBuZWdhdGl2ZQQGcmVjaXBlCQC1CQIFCXJlY2lwZVN0cgIBXwMJAQIhPQIJAJADAQUGcmVjaXBlBQpSRUNJUEVTSVpFCQACAQkArAICAhdGYXRhbDogdW5rbm93biByZWNpcGU6IAUJcmVjaXBl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c3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFCnhwU2VsbFRvRXMIBQZtZXJnZWQCXzUJAGgCBQVNVUxUOAAKBQNuaWwFA25pbAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWVzS2V5CQC6CQIIBQZtZXJnZWQCXzQCAV8JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCAUGbWVyZ2VkAl8yBQt1c2R0QXNzZXRJZAUDbmlsCQCVCgMFBmJwU2F2ZQUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ91cGRhdGVFc1N0b3JhZ2UBCm5ld1N0b3JhZ2UDCQECIT0CCAUBaQZjYWxsZXIFD3N0YWtpbmdDb250cmFjdAkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUVzV2FyZWhvdXNlAAUKbmV3U3RvcmFnZQUDbmlsBQpuZXdTdG9yYWdlAWkBEnNlbmREZWxpdmVyeVJld2FyZAEEYWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQECWZ1bmRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9kZWxpdmVyeUZ1bmRLZXkAAAQLYWNyZXNBbW91bnQJAGgCBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFFVVTRFQyQUNSRVNfTVVMVElQTElFUgQLYWNyZXNSZXN1bHQJAPwHBAUNYWNyZXNDb250cmFjdAIJc2VuZEFjcmVzCQDMCAIFBGFkZHIJAMwIAgULYWNyZXNBbW91bnQFA25pbAUDbmlsCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFD2RlbGl2ZXJ5RnVuZEtleQkAZQIFCWZ1bmRUb3RhbAUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQNuaWwFC2FjcmVzUmVzdWx0AWkBFXJlcGxlbmlzaERlbGl2ZXJ5RnVuZAADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQJYWRkZWRVc2R0CAUDcG10BmFtb3VudAMJAGcCAAAFCWFkZGVkVXNkdAkAAgECHGFkZGVkVXNkdCBzaG91bGQgYmUgcG9zaXRpdmUEB2Z1bmROZXcJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFD2RlbGl2ZXJ5RnVuZEtleQAABQlhZGRlZFVzZHQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUPZGVsaXZlcnlGdW5kS2V5BQdmdW5kTmV3BQNuaWwFB2Z1bmROZXcAFGPcTg==", "height": 2858977, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AbVJE5QrgoVHFjVbbSTGt1y8yTtHXBM898xKcC1AZHRq Next: JDXz1XM1D6516q1kFTnQRBUiSdauYKmEs8jHoxCnKUVN Diff:
OldNewDifferences
17271727
17281728
17291729 @Callable(i)
1730-func replenishDeliveryFund (addedUsdt) = if ((i.caller != this))
1731- then throw("Permission denied")
1732- else if ((0 >= addedUsdt))
1733- then throw("addedUsdt should be positive")
1734- else {
1735- let fundNew = (valueOrElse(getInteger(deliveryFundKey), 0) + addedUsdt)
1736- $Tuple2([IntegerEntry(deliveryFundKey, fundNew)], fundNew)
1737- }
1730+func replenishDeliveryFund () = if ((size(i.payments) != 1))
1731+ then throw("exactly 1 payment must be attached")
1732+ else {
1733+ let pmt = i.payments[0]
1734+ if (if (!(isDefined(pmt.assetId)))
1735+ then true
1736+ else (value(pmt.assetId) != usdtAssetId))
1737+ then throw("USDT payments only!")
1738+ else {
1739+ let addedUsdt = pmt.amount
1740+ if ((0 >= addedUsdt))
1741+ then throw("addedUsdt should be positive")
1742+ else {
1743+ let fundNew = (valueOrElse(getInteger(deliveryFundKey), 0) + addedUsdt)
1744+ $Tuple2([IntegerEntry(deliveryFundKey, fundNew)], fundNew)
1745+ }
1746+ }
1747+ }
17381748
17391749
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let xpTrade = 10000
55
66 let xpCraft = 10000
77
88 let xpSellToEs = 10000
99
1010 let xpShop = 10000
1111
1212 let LANDPREFIX = "LAND"
1313
1414 let NUMRES = 6
1515
1616 let DEFAULTLOCATION = "Africa_F_Africa"
1717
1818 let RESOURCEPRICEMIN = 39637
1919
2020 let ESMAXPACKAGES = 10
2121
2222 let ESBUYCOEF = 4
2323
2424 let MIN_USDT_FEE_DELIVERY = 50000
2525
2626 let MIN_USDT_FEE_DELIVERY15 = 75000
2727
2828 let CRAFT_USDT_COST = 1000000
2929
3030 let CRAFT_DELIVERY_COEFF = 10
3131
3232 let USDT2ACRES_MULTIPLIER = 10
3333
3434 let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
3535
3636 let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
3737
3838 let prodTypes = ["First Aid Kit L1", "First Aid Kit L2", "First Aid Kit L3", "Backpack L1", "Backpack L2", "Backpack L3", "Food Ration L1", "Food Ration L2", "Food Ration L3", "Jet Pack L1", "Jet Pack L2", "Jet Pack L3", "Shield L1", "Shield L2", "Shield L3", "Mine L1", "Mine L2", "Mine L3", "Trap L1", "Trap L2", "Trap L3", "Boom-Dog L1", "Boom-Dog L2", "Boom-Dog L3"]
3939
4040 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
4141
4242 let COEFF2MAT = 10000000
4343
4444 let productionMatrix = ["8_8_8_17_17_42_12_0_30_0,0,0,0,0,0,0_", "8_8_8_17_17_42_24_0_60_0,0,5,2,0,0,0_", "8_8_8_17_17_42_36_0_120_0,0,10,4,0,0,0_", "8_19_19_8_27_19_26_1_20_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_52_1_40_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_78_1_80_0,0,0,0,0,0,0_001", "8_8_8_8_8_60_13_2_2_0,0,0,0,0,0,0_011", "8_8_8_8_8_60_26_2_4_0,0,0,0,0,0,0_011", "8_8_8_8_8_60_39_2_8_0,0,0,0,0,0,0_011", "30_30_3_17_17_3_30_3_30_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_60_3_50_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_90_3_70_0,0,0,0,0,0,0_111", "18_18_10_18_18_18_11_4_10_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_22_4_20_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_33_4_30_0,0,0,0,0,0,0_201", "4_13_22_4_35_22_23_0_50,1,0_0,0,0,0,0,0,0_", "4_13_22_4_35_22_46_0_50,1,1_0,2,5,0,0,0,0_", "4_13_22_4_35_22_69_0_50,2,1_0,5,10,0,0,0,0_", "5_25_40_5_10_15_20_1_30,1,1_0,0,0,0,0,0,0_", "5_25_40_5_10_15_40_1_30,1,2_2,1,3,0,0,0,0_", "5_25_40_5_10_15_60_1_30,1,3_5,2,8,0,0,0,0_", "23_23_5_20_23_6_35_2_100_0,0,0,0,0,0,0_", "23_23_5_20_23_6_70_2_150_0,0,0,0,0,0,0_", "23_23_5_20_23_6_105_2_200_0,0,0,0,0,0,0_"]
4545
4646 let rIdxCoeff = 6
4747
4848 let rIdxContinent = 7
4949
5050 let RECIPESIZE = 11
5151
5252 let PRODUCTPKGSIZE = 10
5353
5454 let whIdxLevels = 0
5555
5656 let whIdxRes = 1
5757
5858 let whIdxMat = 2
5959
6060 let whIdxProd = 3
6161
6262 let whIdxLOFT = 4
6363
6464 let volLocked = 0
6565
6666 let volTotal = 3
6767
6868 let bpIdxLevel = 0
6969
7070 let bpIdxRes = 1
7171
7272 let bpIdxMat = 2
7373
7474 let bpIdxProd = 3
7575
7676 let locIdxContinent = 0
7777
7878 let locIdxType = 1
7979
8080 let locIdxId = 2
8181
8282 func keyLandAssetIdToOwner (assetId) = ("no_" + assetId)
8383
8484
8585 func keyStakedTimeByAssetId (assetId) = ("st_" + assetId)
8686
8787
8888 func keyAddressRefBy (addr) = ("accRefBy_" + addr)
8989
9090
9191 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
9292
9393
9494 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
9595
9696
9797 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
9898
9999
100100 func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
101101
102102
103103 func keyEsWarehouse () = "emergencyWarehouseProducts"
104104
105105
106106 let deliveryFundKey = "deliveryFund"
107107
108108 func getRecipeMaterials (recipe) = (parseIntValue(recipe[rIdxCoeff]) * COEFF2MAT)
109109
110110
111111 let chain = take(drop(this.bytes, 1), 1)
112112
113113 let usdtAssetId = match chain {
114114 case _ =>
115115 if ((base58'2W' == $match0))
116116 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
117117 else if ((base58'2T' == $match0))
118118 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
119119 else throw("Unknown chain")
120120 }
121121
122122 let defaultRestAddressStr = match chain {
123123 case _ =>
124124 if ((base58'2W' == $match0))
125125 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
126126 else if ((base58'2T' == $match0))
127127 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
128128 else throw("Unknown chain")
129129 }
130130
131131 let SEP = "__"
132132
133133 let MULT5 = 100000
134134
135135 let MULT6 = 1000000
136136
137137 let MULT8 = 100000000
138138
139139 let MULT10 = 10000000000
140140
141141 let MINSHOPPAYMENT = 100000
142142
143143 let ITER6 = [0, 1, 2, 3, 4, 5]
144144
145145 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
146146
147147
148148 let IdxCfgStakingDapp = 1
149149
150150 let IdxCfgInvestFundDapp = 6
151151
152152 let IdxCfgAcresDapp = 8
153153
154154 func keyRestCfg () = "%s__restConfig"
155155
156156
157157 func keyRestAddress () = "%s__restAddr"
158158
159159
160160 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
161161
162162
163163 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
164164
165165
166166 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
167167
168168 let restCfg = readRestCfgOrFail(restContract)
169169
170170 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
171171
172172 let investFundContract = getContractAddressOrFail(restCfg, IdxCfgInvestFundDapp)
173173
174174 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
175175
176176 func asString (v) = match v {
177177 case s: String =>
178178 s
179179 case _ =>
180180 throw("fail to cast into String")
181181 }
182182
183183
184184 func asInt (v) = match v {
185185 case n: Int =>
186186 n
187187 case _ =>
188188 throw("fail to cast into Int")
189189 }
190190
191191
192192 func keyBlocked () = "contractsBlocked"
193193
194194
195195 func fixedPoint (val,decimals) = {
196196 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
197197 let lowPart = toString((val % tenPow))
198198 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
199199 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
200200 }
201201
202202
203203 let FACTORYMAXWAREHOUSE = 10000000000
204204
205205 let SELLMULTIPLIER = 200
206206
207207 let BUYMULTIPLIER = 300
208208
209209 let AUCTIONFEE = 10000
210210
211211 let DELIVERY_FEE = 10000
212212
213213 let DELIVERY_FEE15 = 15000
214214
215215 func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
216216
217217
218218 let ordIdxRes = 0
219219
220220 let ordIdxMat = 1
221221
222222 let ordIdxProd = 2
223223
224224 func getOrder (ordKey) = {
225225 let p = split(valueOrElse(getString(ordKey), "0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:"), ":")
226226 [if ((size(split(p[ordIdxRes], "_")) == NUMRES))
227227 then p[ordIdxRes]
228228 else "0@0_0@0_0@0_0@0_0@0_0@0", if ((size(split(p[ordIdxMat], "_")) == NUMRES))
229229 then p[ordIdxMat]
230230 else "0@0_0@0_0@0_0@0_0@0_0@0", p[ordIdxProd]]
231231 }
232232
233233
234234 func toVolume (amount,pkgSize,isProduct) = if (isProduct)
235235 then {
236236 let pkgs = if ((amount >= 0))
237237 then (((amount + pkgSize) - 1) / pkgSize)
238238 else -((((-(amount) + pkgSize) - 1) / pkgSize))
239239 (pkgs * MULT8)
240240 }
241241 else amount
242242
243243
244244 func sellInternal (locId,resType,amount,minPrice) = {
245245 let whKey = keyFactoryWarehouseByIdAndType(locId, resType)
246246 let w0 = valueOrElse(getInteger(whKey), 0)
247247 let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
248248 then 0
249249 else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
250250 then (FACTORYMAXWAREHOUSE - w0)
251251 else amount
252252 let usdtReceived = (fraction(r0, ((SELLMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) + (50 * r0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction((amount - r0), RESOURCEPRICEMIN, MULT8))
253253 let min99 = (minPrice - (minPrice / 100))
254254 if (((min99 * amount) > (usdtReceived * MULT8)))
255255 then throw((((((((((("Actual price = " + toString(usdtReceived)) + " / ") + toString(amount)) + " < minPrice = ") + toString(minPrice)) + ", (") + locId) + ", ") + resTypes[resType]) + ")"))
256256 else $Tuple2(IntegerEntry(whKey, (w0 + amount)), usdtReceived)
257257 }
258258
259259
260260 func buyInternal (locId,matType,amount,maxPrice) = {
261261 let whKey = keyFactoryWarehouseByIdAndType(locId, matType)
262262 let w0 = valueOrElse(getInteger(whKey), 0)
263263 let m1 = if ((w0 > FACTORYMAXWAREHOUSE))
264264 then min([amount, (w0 - FACTORYMAXWAREHOUSE)])
265265 else 0
266266 let m0 = min([w0, (amount - m1)])
267267 let m = (m0 + m1)
268268 let w0min = min([w0, FACTORYMAXWAREHOUSE])
269269 let usdtSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0min) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
270270 let max101 = (maxPrice + (maxPrice / 100))
271271 if (((usdtSpent * MULT8) > (max101 * m)))
272272 then throw((((((((((("Actual price = " + toString(usdtSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
273273 else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdtSpent, m)
274274 }
275275
276276
277277 func getBackpack (bpKey) = {
278278 let p = split_4C(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
279279 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
280280 then p[bpIdxRes]
281281 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
282282 then p[bpIdxMat]
283283 else "0_0_0_0_0_0", p[bpIdxProd]]
284284 }
285285
286286
287287 func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
288288 then throw("Contracts are under maintenance")
289289 else unit
290290
291291
292292 func prolog () = asInt(reentrantInvoke(stakingContract, "saveLastTx", nil, nil))
293293
294294
295295 func setCommon (acc,ignoredIterator) = {
296296 let j = acc._1
297297 let item = if ((size(acc._10) > j))
298298 then acc._10[j]
299299 else "0@0"
300300 let isProd = acc._8
301301 let itemParts = split(item, "@")
302302 if ((size(itemParts) != 2))
303303 then throw("Incorrect order format, should be amount@price")
304304 else {
305305 let newOrdAm = parseIntValue(itemParts[0])
306306 let newOrdPr = parseIntValue(itemParts[1])
307307 let newOrdUsd = if (isProd)
308308 then (newOrdAm * newOrdPr)
309309 else fraction(newOrdAm, newOrdPr, MULT8)
310310 let newOrdVol = toVolume(newOrdAm, PRODUCTPKGSIZE, isProd)
311311 let whInit = if ((size(acc._6) > j))
312312 then parseIntValue(acc._6[j])
313313 else 0
314314 let curOrdParts = split(if ((size(acc._7) > j))
315315 then acc._7[j]
316316 else "0@0", "@")
317317 let curOrdAm = parseIntValue(curOrdParts[0])
318318 let curOrdPr = parseIntValue(curOrdParts[1])
319319 if (if ((0 > curOrdPr))
320320 then true
321321 else (0 > newOrdPr))
322322 then throw("Price can't be negative")
323323 else {
324324 let curOrdUsd = if (isProd)
325325 then (curOrdAm * curOrdPr)
326326 else fraction(curOrdAm, curOrdPr, MULT8)
327327 if ((newOrdAm == 0))
328328 then if ((curOrdAm > 0))
329329 then $Tuple10((j + 1), (acc._2 :+ toString(whInit)), acc._3, acc._4, (acc._5 - curOrdUsd), acc._6, acc._7, isProd, (acc._9 + toVolume(whInit, PRODUCTPKGSIZE, isProd)), acc._10)
330330 else $Tuple10((j + 1), (acc._2 :+ toString((whInit - curOrdAm))), acc._3, acc._4, acc._5, acc._6, acc._7, isProd, (acc._9 + toVolume((whInit - curOrdAm), PRODUCTPKGSIZE, isProd)), acc._10)
331331 else if ((newOrdAm > 0))
332332 then if ((0 > curOrdAm))
333333 then $Tuple10((j + 1), (acc._2 :+ toString((whInit - curOrdAm))), (acc._3 + newOrdVol), acc._4, (acc._5 + newOrdUsd), acc._6, acc._7, isProd, toVolume((whInit - curOrdAm), PRODUCTPKGSIZE, isProd), acc._10)
334334 else $Tuple10((j + 1), (acc._2 :+ toString(whInit)), (acc._3 + newOrdVol), acc._4, ((acc._5 + newOrdUsd) - curOrdUsd), acc._6, acc._7, isProd, toVolume(whInit, PRODUCTPKGSIZE, isProd), acc._10)
335335 else if ((0 > curOrdAm))
336336 then {
337337 let amDiff = (curOrdAm - newOrdAm)
338338 if ((0 > (whInit - amDiff)))
339339 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whInit)) + " available"))
340340 else $Tuple10((j + 1), (acc._2 :+ toString((whInit - amDiff))), acc._3, (acc._4 - newOrdVol), acc._5, acc._6, acc._7, isProd, toVolume((whInit - amDiff), PRODUCTPKGSIZE, isProd), acc._10)
341341 }
342342 else if ((0 > (whInit + newOrdAm)))
343343 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whInit)) + " available"))
344344 else $Tuple10((j + 1), (acc._2 :+ toString((whInit + newOrdAm))), acc._3, (acc._4 - newOrdVol), (acc._5 - curOrdUsd), acc._6, acc._7, isProd, toVolume((whInit + newOrdAm), PRODUCTPKGSIZE, isProd), acc._10)
345345 }
346346 }
347347 }
348348
349349
350350 func setInternal (currentWh,currentOrd,newOrd) = {
351351 let currWhRes = split(currentWh[whIdxRes], "_")
352352 let currWhMat = split(currentWh[whIdxMat], "_")
353353 let currWhProd = if ((currentWh[whIdxProd] == ""))
354354 then nil
355355 else split_4C(currentWh[whIdxProd], "_")
356356 let currentOrdRes = split(currentOrd[ordIdxRes], "_")
357357 let currentOrdMat = split(currentOrd[ordIdxMat], "_")
358358 let currentOrdProd = if ((currentOrd[ordIdxProd] == ""))
359359 then nil
360360 else split_4C(currentOrd[ordIdxProd], "_")
361361 if ((size(newOrd) != 3))
362362 then throw("newOrderStr should contain exactly 2 ':' separators")
363363 else {
364364 let resParts = split(newOrd[0], "_")
365365 let matParts = split(newOrd[1], "_")
366366 let prodParts = if ((newOrd[2] == ""))
367367 then nil
368368 else split_4C(newOrd[2], "_")
369369 if ((size(resParts) != NUMRES))
370370 then throw("All 6 resources should be passed")
371371 else if ((size(matParts) != NUMRES))
372372 then throw("All 6 materials should be passed")
373373 else {
374374 let r = {
375375 let $l = resTypes
376376 let $s = size($l)
377377 let $acc0 = $Tuple10(0, nil, 0, 0, 0, currWhRes, currentOrdRes, false, 0, resParts)
378378 func $f0_1 ($a,$i) = if (($i >= $s))
379379 then $a
380380 else setCommon($a, $l[$i])
381381
382382 func $f0_2 ($a,$i) = if (($i >= $s))
383383 then $a
384384 else throw("List size exceeds 6")
385385
386386 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
387387 }
388388 let m = {
389389 let $l = matTypes
390390 let $s = size($l)
391391 let $acc0 = $Tuple10(0, nil, r._3, r._4, r._5, currWhMat, currentOrdMat, false, r._9, matParts)
392392 func $f1_1 ($a,$i) = if (($i >= $s))
393393 then $a
394394 else setCommon($a, $l[$i])
395395
396396 func $f1_2 ($a,$i) = if (($i >= $s))
397397 then $a
398398 else throw("List size exceeds 6")
399399
400400 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
401401 }
402402 let p = {
403403 let $l = prodTypes
404404 let $s = size($l)
405405 let $acc0 = $Tuple10(0, nil, m._3, m._4, m._5, currWhProd, currentOrdProd, true, m._9, prodParts)
406406 func $f2_1 ($a,$i) = if (($i >= $s))
407407 then $a
408408 else setCommon($a, $l[$i])
409409
410410 func $f2_2 ($a,$i) = if (($i >= $s))
411411 then $a
412412 else throw("List size exceeds 50")
413413
414414 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
415415 }
416416 $Tuple7(r._2, m._2, p._2, p._3, p._4, p._5, p._9)
417417 }
418418 }
419419 }
420420
421421
422422 func acceptCommon (acc,bpOrdItem) = {
423423 let j = acc._7
424424 let isProd = acc._12
425425 let bpOrdParts = split(bpOrdItem, "@")
426426 if ((size(bpOrdParts) != 2))
427427 then throw("Incorrect order format, should be amount@price")
428428 else {
429429 let bpOrdAm = parseIntValue(bpOrdParts[0])
430430 let bpOrdPr = parseIntValue(bpOrdParts[1])
431431 if ((0 > bpOrdPr))
432432 then throw("Price can't be negative")
433433 else {
434434 let bpOrdUsd = if (isProd)
435435 then (bpOrdAm * bpOrdPr)
436436 else fraction(bpOrdAm, bpOrdPr, MULT8)
437437 let bpInit = if ((size(acc._8) > j))
438438 then parseIntValue(acc._8[j])
439439 else 0
440440 let whInit = if ((size(acc._9) > j))
441441 then parseIntValue(acc._9[j])
442442 else 0
443443 let whOrdInit = if ((size(acc._10) > j))
444444 then acc._10[j]
445445 else "0@0"
446446 let whOrdParts = split(whOrdInit, "@")
447447 let whOrdAm = parseIntValue(whOrdParts[0])
448448 let whOrdPr = parseIntValue(whOrdParts[1])
449449 if (if ((bpOrdAm != 0))
450450 then (bpOrdPr != whOrdPr)
451451 else false)
452452 then throw(((((("Prices of " + acc._11[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
453453 else {
454454 let whOrdUsd = if (isProd)
455455 then (whOrdAm * whOrdPr)
456456 else fraction(whOrdAm, whOrdPr, MULT8)
457457 let deltaVol = toVolume(bpOrdAm, PRODUCTPKGSIZE, isProd)
458458 if ((bpOrdAm == 0))
459459 then $Tuple13((acc._1 :+ toString(whInit)), (acc._2 :+ whOrdInit), (acc._3 :+ toString(bpInit)), acc._4, acc._5, acc._6, (acc._7 + 1), acc._8, acc._9, acc._10, acc._11, isProd, acc._13)
460460 else if ((bpOrdAm > 0))
461461 then if ((0 > whOrdAm))
462462 then if ((bpOrdAm > -(whOrdAm)))
463463 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + acc._11[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
464464 else $Tuple13((acc._1 :+ toString(whInit)), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpInit + bpOrdAm))), (acc._4 + deltaVol), acc._5, (acc._6 + bpOrdUsd), (acc._7 + 1), acc._8, acc._9, acc._10, acc._11, isProd, (acc._13 + (if (isProd)
465465 then (bpOrdAm * MULT8)
466466 else bpOrdAm)))
467467 else throw((("Attempt to buy " + acc._11[j]) + " while warehouse doesn't sell it"))
468468 else if ((whOrdAm > 0))
469469 then if ((-(bpOrdAm) > whOrdAm))
470470 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + acc._11[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
471471 else if ((-(bpOrdAm) > bpInit))
472472 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + toString(bpInit)) + " of ") + acc._11[j]))
473473 else $Tuple13((acc._1 :+ toString((whInit - bpOrdAm))), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpInit + bpOrdAm))), (acc._4 - deltaVol), (acc._5 - bpOrdUsd), acc._6, (acc._7 + 1), acc._8, acc._9, acc._10, acc._11, isProd, (acc._13 - (if (isProd)
474474 then (bpOrdAm * MULT8)
475475 else bpOrdAm)))
476476 else throw((("Attempt to sell " + acc._11[j]) + " while warehouse doesn't buy it"))
477477 }
478478 }
479479 }
480480 }
481481
482482
483483 func sellResourcesCommon (resList,factoryLocId,amounts,minPrices) = {
484484 func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
485485 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
486486 else if ((0 > amounts[j]))
487487 then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
488488 else if ((amounts[j] > 0))
489489 then {
490490 let b = sellInternal(factoryLocId, j, amounts[j], minPrices[j])
491491 $Tuple4((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2), (acc._4 + amounts[j]))
492492 }
493493 else $Tuple4(acc._1, (acc._2 :+ resList[j]), acc._3, acc._4)
494494
495495 let $l = ITER6
496496 let $s = size($l)
497497 let $acc0 = $Tuple4(nil, nil, 0, 0)
498498 func $f0_1 ($a,$i) = if (($i >= $s))
499499 then $a
500500 else adder($a, $l[$i])
501501
502502 func $f0_2 ($a,$i) = if (($i >= $s))
503503 then $a
504504 else throw("List size exceeds 6")
505505
506506 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
507507 }
508508
509509
510510 func buyMaterialsCommon (matList,factoryLocId,amounts,maxPrices) = {
511511 func mUpdater (acc,j) = if ((0 > amounts[j]))
512512 then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
513513 else if ((amounts[j] > 0))
514514 then {
515515 let b = buyInternal(factoryLocId, j, amounts[j], maxPrices[j])
516516 $Tuple4((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2), (acc._4 + amounts[j]))
517517 }
518518 else $Tuple4(acc._1, (acc._2 :+ matList[j]), acc._3, acc._4)
519519
520520 let $l = ITER6
521521 let $s = size($l)
522522 let $acc0 = $Tuple4(nil, nil, 0, 0)
523523 func $f0_1 ($a,$i) = if (($i >= $s))
524524 then $a
525525 else mUpdater($a, $l[$i])
526526
527527 func $f0_2 ($a,$i) = if (($i >= $s))
528528 then $a
529529 else throw("List size exceeds 6")
530530
531531 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
532532 }
533533
534534
535535 func exchangeResourcesCommon (resList,matList,amounts) = {
536536 func exchanger (acc,j) = {
537537 let amj = amounts[j]
538538 if ((amj > parseIntValue(resList[j])))
539539 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to exchange ") + toString(amj)))
540540 else if ((0 > amj))
541541 then throw(((("You tried to exchange negative amount of " + resTypes[j]) + ": ") + toString(amj)))
542542 else if ((amj > 0))
543543 then $Tuple4((acc._1 :+ toString((parseIntValue(resList[j]) - amj))), (acc._2 :+ toString((parseIntValue(matList[j]) + amj))), (acc._3 + fraction(amj, RESOURCEPRICEMIN, MULT8)), (acc._4 + amj))
544544 else $Tuple4((acc._1 :+ resList[j]), (acc._2 :+ matList[j]), acc._3, acc._4)
545545 }
546546
547547 let $l = ITER6
548548 let $s = size($l)
549549 let $acc0 = $Tuple4(nil, nil, 0, 0)
550550 func $f0_1 ($a,$i) = if (($i >= $s))
551551 then $a
552552 else exchanger($a, $l[$i])
553553
554554 func $f0_2 ($a,$i) = if (($i >= $s))
555555 then $a
556556 else throw("List size exceeds 6")
557557
558558 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
559559 }
560560
561561
562562 func shop2userActions (usdWh2BpSaldo,callerAddr,receivedFee) = if ((usdWh2BpSaldo > 0))
563563 then {
564564 let usdWh2BpFee = fraction(usdWh2BpSaldo, AUCTIONFEE, MULT6)
565565 if ((receivedFee >= (usdWh2BpSaldo - (3 * usdWh2BpFee))))
566566 then throw(("This trade does not cover delivery cost of " + fixedPoint(receivedFee, 6)))
567567 else {
568568 let refByKey = keyAddressRefBy(callerAddr)
569569 let refBy = getString(stakingContract, refByKey)
570570 let caller = addressFromStringValue(callerAddr)
571571 (((if (isDefined(refBy))
572572 then [ScriptTransfer(addressFromStringValue(value(refBy)), usdWh2BpFee, usdtAssetId)]
573573 else nil) :+ ScriptTransfer(caller, ((usdWh2BpSaldo - (3 * usdWh2BpFee)) - receivedFee), usdtAssetId)) :+ ScriptTransfer(restContract, usdWh2BpFee, usdtAssetId))
574574 }
575575 }
576576 else nil
577577
578578
579579 func user2shopActions (usdBp2WhSaldo,pmts,shopLandOwner,spentFee) = if ((usdBp2WhSaldo > 0))
580580 then if ((size(pmts) != 1))
581581 then throw("exactly 1 payment must be attached")
582582 else {
583583 let pmt = pmts[0]
584584 let amt = pmt.amount
585585 if (if (!(isDefined(pmt.assetId)))
586586 then true
587587 else (value(pmt.assetId) != usdtAssetId))
588588 then throw("USDT payments only!")
589589 else {
590590 let usdtSpentWithFee = (usdBp2WhSaldo + spentFee)
591591 if ((amt != usdtSpentWithFee))
592592 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdBp2WhSaldo, 6)) + "+") + fixedPoint(spentFee, 6)) + "(delivery fee)"))
593593 else if ((MINSHOPPAYMENT > usdBp2WhSaldo))
594594 then throw(("Min shop trade is " + fixedPoint(MINSHOPPAYMENT, 6)))
595595 else {
596596 let usdBp2WhFee = fraction(usdBp2WhSaldo, AUCTIONFEE, MULT6)
597597 let refByKey = keyAddressRefBy(shopLandOwner)
598598 let refBy = getString(stakingContract, refByKey)
599599 (((if (isDefined(refBy))
600600 then [ScriptTransfer(addressFromStringValue(value(refBy)), usdBp2WhFee, usdtAssetId)]
601601 else nil) :+ ScriptTransfer(addressFromStringValue(shopLandOwner), (usdBp2WhSaldo - (3 * usdBp2WhFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdBp2WhFee, usdtAssetId))
602602 }
603603 }
604604 }
605605 else if ((size(pmts) != 0))
606606 then throw("No payments needed")
607607 else nil
608608
609609
610610 func acceptShopOrderCommon (shopLandAssetId,callerAddr,bpOrderStr,bpResList,bpMatList,bpProdList) = {
611611 let landAsset = value(assetInfo(fromBase58String(shopLandAssetId)))
612612 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(shopLandAssetId)))))
613613 then throw((("NFT " + landAsset.name) + " is not staked"))
614614 else {
615615 let shopLandOwner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(shopLandAssetId)), (("NFT " + landAsset.name) + " is orphaned"))
616616 if ((shopLandOwner == callerAddr))
617617 then throw("You cannot trade with yourself")
618618 else {
619619 let bpOrderParts = split_4C(bpOrderStr, ":")
620620 if ((size(bpOrderParts) != 3))
621621 then throw("bpOrderStr should contain exactly 2 ':' separators")
622622 else {
623623 let bpOrdRes = split(bpOrderParts[0], "_")
624624 let bpOrdMat = split(bpOrderParts[1], "_")
625625 let bpOrdProd = if ((bpOrderParts[2] == ""))
626626 then nil
627627 else split_4C(bpOrderParts[2], "_")
628628 if ((size(bpOrdRes) != NUMRES))
629629 then throw("All 6 resources should be passed")
630630 else if ((size(bpOrdMat) != NUMRES))
631631 then throw("All 6 materials should be passed")
632632 else {
633633 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [shopLandAssetId], nil))
634634 let currentWh = split_4C(wh, ":")
635635 let currWhRes = split(currentWh[whIdxRes], "_")
636636 let currWhMat = split(currentWh[whIdxMat], "_")
637637 let currWhProd = if ((currentWh[whIdxProd] == ""))
638638 then nil
639639 else split_4C(currentWh[whIdxProd], "_")
640640 let currWhLockedVol = parseIntValue(split(currentWh[whIdxLOFT], "_")[volLocked])
641641 let ordKey = keyOrderByLand(shopLandAssetId)
642642 let whOrd = getOrder(ordKey)
643643 let whOrdRes = split(whOrd[ordIdxRes], "_")
644644 let whOrdMat = split(whOrd[ordIdxMat], "_")
645645 let whOrdProd = if ((whOrd[ordIdxProd] == ""))
646646 then nil
647647 else split_4C(whOrd[ordIdxProd], "_")
648648 let r = {
649649 let $l = bpOrdRes
650650 let $s = size($l)
651651 let $acc0 = $Tuple13(nil, nil, nil, 0, 0, 0, 0, bpResList, currWhRes, whOrdRes, resTypes, false, 0)
652652 func $f0_1 ($a,$i) = if (($i >= $s))
653653 then $a
654654 else acceptCommon($a, $l[$i])
655655
656656 func $f0_2 ($a,$i) = if (($i >= $s))
657657 then $a
658658 else throw("List size exceeds 6")
659659
660660 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
661661 }
662662 let m = {
663663 let $l = bpOrdMat
664664 let $s = size($l)
665665 let $acc0 = $Tuple13(nil, nil, nil, r._4, r._5, r._6, 0, bpMatList, currWhMat, whOrdMat, matTypes, false, r._13)
666666 func $f1_1 ($a,$i) = if (($i >= $s))
667667 then $a
668668 else acceptCommon($a, $l[$i])
669669
670670 func $f1_2 ($a,$i) = if (($i >= $s))
671671 then $a
672672 else throw("List size exceeds 6")
673673
674674 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
675675 }
676676 let p = if ((size(bpOrdProd) != 0))
677677 then {
678678 let $l = bpOrdProd
679679 let $s = size($l)
680680 let $acc0 = $Tuple13(nil, nil, nil, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd, prodTypes, true, m._13)
681681 func $f2_1 ($a,$i) = if (($i >= $s))
682682 then $a
683683 else acceptCommon($a, $l[$i])
684684
685685 func $f2_2 ($a,$i) = if (($i >= $s))
686686 then $a
687687 else throw("List size exceeds 50")
688688
689689 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
690690 }
691691 else $Tuple13(currWhProd, whOrdProd, bpProdList, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd, prodTypes, true, m._13)
692692 let volSaldo = p._4
693693 let newLockedVol = if ((0 > (currWhLockedVol - volSaldo)))
694694 then 0
695695 else (currWhLockedVol - volSaldo)
696696 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(r._1, "_"), makeString(m._1, "_"), makeString_2C(p._1, "_"), toString(newLockedVol)], ":")
697697 let newWhOrdStr = makeString_2C([makeString(r._2, "_"), makeString(m._2, "_"), makeString_2C(p._2, "_")], ":")
698698 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, shopLandAssetId], nil))
699699 let accStatsResult = asInt(invoke(stakingContract, "updateAccStats", [shopLandOwner, fraction(xpShop, p._13, MULT8)], nil))
700700 $Tuple10(StringEntry(ordKey, newWhOrdStr), r._3, m._3, p._3, p._5, p._6, p._13, shopLandOwner, whSave, accStatsResult)
701701 }
702702 }
703703 }
704704 }
705705 }
706706
707707
708708 func sellResourcesWorldInternal (amount) = {
709709 let oneRes = (amount / 30)
710710 let oneFactoryAmounts = [oneRes, oneRes, oneRes, oneRes, oneRes, oneRes]
711711 let s = toString(oneRes)
712712 let resList = [s, s, s, s, s, s]
713713 let minPrices = [0, 0, 0, 0, 0, 0]
714714 func oneFactory (acc,continent) = {
715715 let x = sellResourcesCommon(resList, continent, oneFactoryAmounts, minPrices)
716716 $Tuple3((acc._1 ++ x._1), (acc._2 + x._3), (acc._3 + x._4))
717717 }
718718
719719 let $t02529225382 = {
720720 let $l = continents
721721 let $s = size($l)
722722 let $acc0 = $Tuple3(nil, 0, 0)
723723 func $f0_1 ($a,$i) = if (($i >= $s))
724724 then $a
725725 else oneFactory($a, $l[$i])
726726
727727 func $f0_2 ($a,$i) = if (($i >= $s))
728728 then $a
729729 else throw("List size exceeds 5")
730730
731731 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
732732 }
733733 let factoryActions = $t02529225382._1
734734 let usdtReceived = $t02529225382._2
735735 let totalRes = $t02529225382._3
736736 let fee = fraction(usdtReceived, DELIVERY_FEE, MULT6)
737737 let activitiesAmount = (usdtReceived / 100)
738738 let usdtLeft = ((usdtReceived - activitiesAmount) - fee)
739739 $Tuple5(factoryActions, usdtLeft, fee, activitiesAmount, totalRes)
740740 }
741741
742742
743743 func craftGoodsCommon (matList,prodList,manufactoryContinent,productIdx,quantity) = if ((0 >= quantity))
744744 then throw("Quantity should be positive")
745745 else if (if ((0 > productIdx))
746746 then true
747747 else (productIdx >= size(productionMatrix)))
748748 then throw(("Unknown product idx=" + toString(productIdx)))
749749 else {
750750 let recipe = split(productionMatrix[productIdx], "_")
751751 if ((size(recipe) != RECIPESIZE))
752752 then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
753753 else {
754754 let productContIdx = parseIntValue(recipe[rIdxContinent])
755755 if ((continents[productContIdx] != manufactoryContinent))
756756 then throw(((("This product is available in " + continents[productContIdx]) + ", not in ") + manufactoryContinent))
757757 else {
758758 func filler (acc,ignoredItem) = {
759759 let n = acc._2
760760 let xs = if ((size(prodList) > n))
761761 then prodList[n]
762762 else "0"
763763 let x = parseIntValue(xs)
764764 let amount = (quantity * PRODUCTPKGSIZE)
765765 let y = if ((n == productIdx))
766766 then toString((x + amount))
767767 else xs
768768 $Tuple2((acc._1 :+ y), (n + 1))
769769 }
770770
771771 let newProd = ( let $l = productionMatrix
772772 let $s = size($l)
773773 let $acc0 = $Tuple2(nil, 0)
774774 func $f0_1 ($a,$i) = if (($i >= $s))
775775 then $a
776776 else filler($a, $l[$i])
777777
778778 func $f0_2 ($a,$i) = if (($i >= $s))
779779 then $a
780780 else throw("List size exceeds 50")
781781
782782 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._1
783783 func producer (acc,j) = {
784784 let needMat = (((parseIntValue(recipe[j]) * MULT5) * quantity) * parseIntValue(recipe[rIdxCoeff]))
785785 let haveMat = parseIntValue(matList[j])
786786 if ((needMat > haveMat))
787787 then throw(((((((("You have " + fixedPoint(haveMat, 8)) + " of ") + matTypes[j]) + ", but recipe requires ") + fixedPoint(needMat, 8)) + " for quantity ") + toString(quantity)))
788788 else if ((needMat > 0))
789789 then $Tuple2((acc._1 :+ toString((haveMat - needMat))), (acc._2 + needMat))
790790 else $Tuple2((acc._1 :+ matList[j]), acc._2)
791791 }
792792
793793 let merged = {
794794 let $l = ITER6
795795 let $s = size($l)
796796 let $acc0 = $Tuple2(nil, 0)
797797 func $f1_1 ($a,$i) = if (($i >= $s))
798798 then $a
799799 else producer($a, $l[$i])
800800
801801 func $f1_2 ($a,$i) = if (($i >= $s))
802802 then $a
803803 else throw("List size exceeds 6")
804804
805805 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
806806 }
807807 $Tuple3(merged._1, newProd, merged._2)
808808 }
809809 }
810810 }
811811
812812
813813 @Callable(i)
814814 func recalcLockedVolumeREADONLY (landAssetId,wh) = {
815815 let currentOrd = getOrder(keyOrderByLand(landAssetId))
816816 let z = setInternal(wh, currentOrd, currentOrd)
817817 $Tuple2(nil, (z._4 + z._5))
818818 }
819819
820820
821821
822822 @Callable(i)
823823 func constructorV1 (restAddr) = if ((i.caller != this))
824824 then throw("Permission denied")
825825 else [StringEntry(keyRestAddress(), restAddr)]
826826
827827
828828
829829 @Callable(i)
830830 func sellResources (amounts,minPrices) = {
831831 let prologResult = prolog()
832832 if ((prologResult == prologResult))
833833 then {
834834 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
835835 if ((size(i.payments) != 0))
836836 then throw("sellResources doesn't require any payments")
837837 else {
838838 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
839839 if ((curLocation[locIdxType] != "F"))
840840 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
841841 else {
842842 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
843843 let resList = split(currentPack[bpIdxRes], "_")
844844 let $t02891529041 = sellResourcesCommon(resList, curLocation[locIdxId], amounts, minPrices)
845845 let factoryActions = $t02891529041._1
846846 let newRes = $t02891529041._2
847847 let usdtReceived = $t02891529041._3
848848 let totalRes = $t02891529041._4
849849 let activitiesAmount = (usdtReceived / 100)
850850 let newPack = makeString_2C([currentPack[bpIdxLevel], makeString(newRes, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
851851 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
852852 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalRes, MULT8)], nil))
853853 $Tuple2(((factoryActions :+ ScriptTransfer(i.caller, (usdtReceived - activitiesAmount), usdtAssetId)) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
854854 }
855855 }
856856 }
857857 else throw("Strict value is not equal to itself.")
858858 }
859859
860860
861861
862862 @Callable(i)
863863 func sellResourcesWorld (addr,amount) = if ((i.caller != acresContract))
864864 then throw("Permission denied")
865865 else {
866866 let $t02983329990 = sellResourcesWorldInternal(amount)
867867 let factoryActions = $t02983329990._1
868868 let usdtLeft = $t02983329990._2
869869 let fee = $t02983329990._3
870870 let activitiesAmount = $t02983329990._4
871871 let totalRes = $t02983329990._5
872872 if ((0 >= usdtLeft))
873873 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
874874 else {
875875 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalRes, MULT8)], nil))
876876 $Tuple2((((factoryActions :+ IntegerEntry(deliveryFundKey, (valueOrElse(getInteger(deliveryFundKey), 0) + fee))) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ ScriptTransfer(investFundContract, usdtLeft, usdtAssetId)), $Tuple2(usdtLeft, statsResult))
877877 }
878878 }
879879
880880
881881
882882 @Callable(i)
883883 func sellResourcesWorldREADONLY (amount) = {
884884 let usdtLeft = sellResourcesWorldInternal(amount)._2
885885 $Tuple2(nil, usdtLeft)
886886 }
887887
888888
889889
890890 @Callable(i)
891891 func sellResourcesDuckDelivery (amounts,minPrices,factoryContinent) = {
892892 let prologResult = prolog()
893893 if ((prologResult == prologResult))
894894 then {
895895 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
896896 if ((size(i.payments) != 0))
897897 then throw("sellResources doesn't require any payments")
898898 else {
899899 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
900900 let resList = split(currentPack[bpIdxRes], "_")
901901 let $t03114931270 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
902902 let factoryActions = $t03114931270._1
903903 let newRes = $t03114931270._2
904904 let usdtReceived = $t03114931270._3
905905 let totalRes = $t03114931270._4
906906 let newPack = makeString_2C([currentPack[bpIdxLevel], makeString(newRes, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
907907 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
908908 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalRes, MULT8)], nil))
909909 let feePart = fraction(usdtReceived, DELIVERY_FEE, MULT6)
910910 let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
911911 let activitiesAmount = (usdtReceived / 100)
912912 if ((fee >= (usdtReceived - activitiesAmount)))
913913 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
914914 else {
915915 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
916916 $Tuple2((((factoryActions :+ ScriptTransfer(i.caller, ((usdtReceived - activitiesAmount) - fee), usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
917917 }
918918 }
919919 }
920920 else throw("Strict value is not equal to itself.")
921921 }
922922
923923
924924
925925 @Callable(i)
926926 func sellResourcesLandDelivery (amounts,minPrices,landAssetId,factoryContinent) = {
927927 let prologResult = prolog()
928928 if ((prologResult == prologResult))
929929 then if ((size(i.payments) != 0))
930930 then throw("sellResources doesn't require any payments")
931931 else {
932932 let user = i.caller
933933 let addr = toString(user)
934934 let asset = value(assetInfo(fromBase58String(landAssetId)))
935935 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
936936 then throw((("NFT " + asset.name) + " is not staked"))
937937 else {
938938 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
939939 if ((owner != addr))
940940 then throw((LANDPREFIX + " is not yours"))
941941 else {
942942 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
943943 let currentWh = split_4C(wh, ":")
944944 let resList = split(currentWh[whIdxRes], "_")
945945 let $t03318433305 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
946946 let factoryActions = $t03318433305._1
947947 let newRes = $t03318433305._2
948948 let usdtReceived = $t03318433305._3
949949 let totalRes = $t03318433305._4
950950 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newRes, "_"), currentWh[whIdxMat], currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
951951 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
952952 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalRes, MULT8)], nil))
953953 let feePart = fraction(usdtReceived, DELIVERY_FEE, MULT6)
954954 let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
955955 let activitiesAmount = (usdtReceived / 100)
956956 if ((fee >= (usdtReceived - activitiesAmount)))
957957 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
958958 else {
959959 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
960960 $Tuple2((((factoryActions :+ ScriptTransfer(i.caller, ((usdtReceived - activitiesAmount) - fee), usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(whSave, prologResult, statsResult))
961961 }
962962 }
963963 }
964964 }
965965 else throw("Strict value is not equal to itself.")
966966 }
967967
968968
969969
970970 @Callable(i)
971971 func buyMaterials (amounts,maxPrices) = {
972972 let prologResult = prolog()
973973 if ((prologResult == prologResult))
974974 then {
975975 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
976976 if ((size(i.payments) != 1))
977977 then throw("exactly 1 payment must be attached")
978978 else {
979979 let pmt = i.payments[0]
980980 let amt = pmt.amount
981981 if (if (!(isDefined(pmt.assetId)))
982982 then true
983983 else (value(pmt.assetId) != usdtAssetId))
984984 then throw("USDT payments only!")
985985 else {
986986 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
987987 if ((curLocation[locIdxType] != "F"))
988988 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
989989 else {
990990 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
991991 let matList = split(currentPack[bpIdxMat], "_")
992992 let $t03512935251 = buyMaterialsCommon(matList, curLocation[locIdxId], amounts, maxPrices)
993993 let factoryActions = $t03512935251._1
994994 let newMat = $t03512935251._2
995995 let usdtSpent = $t03512935251._3
996996 let totalMat = $t03512935251._4
997997 if ((usdtSpent > amt))
998998 then throw(((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)))
999999 else {
10001000 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
10011001 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
10021002 let rest = if (((amt - usdtSpent) > 0))
10031003 then [ScriptTransfer(i.caller, (amt - usdtSpent), usdtAssetId)]
10041004 else nil
10051005 let activitiesAmount = (usdtSpent / 100)
10061006 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalMat, MULT8)], nil))
10071007 $Tuple2(((factoryActions ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
10081008 }
10091009 }
10101010 }
10111011 }
10121012 }
10131013 else throw("Strict value is not equal to itself.")
10141014 }
10151015
10161016
10171017
10181018 @Callable(i)
10191019 func buyMaterialsDuckDelivery (amounts,maxPrices,factoryContinent) = {
10201020 let prologResult = prolog()
10211021 if ((prologResult == prologResult))
10221022 then {
10231023 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
10241024 if ((size(i.payments) != 1))
10251025 then throw("exactly 1 payment must be attached")
10261026 else {
10271027 let pmt = i.payments[0]
10281028 let amt = pmt.amount
10291029 if (if (!(isDefined(pmt.assetId)))
10301030 then true
10311031 else (value(pmt.assetId) != usdtAssetId))
10321032 then throw("USDT payments only!")
10331033 else {
10341034 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
10351035 let matList = split(currentPack[bpIdxMat], "_")
10361036 let $t03669536812 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
10371037 let factoryActions = $t03669536812._1
10381038 let newMat = $t03669536812._2
10391039 let usdtSpent = $t03669536812._3
10401040 let totalMat = $t03669536812._4
10411041 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
10421042 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
10431043 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalMat, MULT8)], nil))
10441044 let feePart = fraction(usdtSpent, DELIVERY_FEE, MULT6)
10451045 let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
10461046 let usdtSpentWithFee = (usdtSpent + fee)
10471047 if ((usdtSpentWithFee > amt))
10481048 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
10491049 else {
10501050 let rest = if (((amt - usdtSpentWithFee) > 0))
10511051 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
10521052 else nil
10531053 let activitiesAmount = (usdtSpent / 100)
10541054 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
10551055 $Tuple2((((factoryActions ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(backpackResult, prologResult, statsResult))
10561056 }
10571057 }
10581058 }
10591059 }
10601060 else throw("Strict value is not equal to itself.")
10611061 }
10621062
10631063
10641064
10651065 @Callable(i)
10661066 func buyMaterialsLandDelivery (amounts,maxPrices,landAssetId,factoryContinent) = {
10671067 let prologResult = prolog()
10681068 if ((prologResult == prologResult))
10691069 then if ((size(i.payments) != 1))
10701070 then throw("exactly 1 payment must be attached")
10711071 else {
10721072 let pmt = i.payments[0]
10731073 let amt = pmt.amount
10741074 if (if (!(isDefined(pmt.assetId)))
10751075 then true
10761076 else (value(pmt.assetId) != usdtAssetId))
10771077 then throw("USDT payments only!")
10781078 else {
10791079 let user = i.caller
10801080 let addr = toString(user)
10811081 let asset = value(assetInfo(fromBase58String(landAssetId)))
10821082 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
10831083 then throw((("NFT " + asset.name) + " is not staked"))
10841084 else {
10851085 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
10861086 if ((owner != addr))
10871087 then throw((LANDPREFIX + " is not yours"))
10881088 else {
10891089 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
10901090 let currentWh = split_4C(wh, ":")
10911091 let matList = split(currentWh[whIdxMat], "_")
10921092 let $t03897739094 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
10931093 let factoryActions = $t03897739094._1
10941094 let newMat = $t03897739094._2
10951095 let usdtSpent = $t03897739094._3
10961096 let totalMat = $t03897739094._4
10971097 let whStr = makeString_2C([currentWh[whIdxLevels], currentWh[whIdxRes], makeString(newMat, "_"), currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
10981098 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
10991099 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalMat, MULT8)], nil))
11001100 let feePart = fraction(usdtSpent, DELIVERY_FEE, MULT6)
11011101 let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
11021102 let usdtSpentWithFee = (usdtSpent + fee)
11031103 if ((usdtSpentWithFee > amt))
11041104 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
11051105 else {
11061106 let rest = if (((amt - usdtSpentWithFee) > 0))
11071107 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
11081108 else nil
11091109 let activitiesAmount = (usdtSpent / 100)
11101110 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
11111111 $Tuple2((((factoryActions ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(whSave, prologResult, statsResult))
11121112 }
11131113 }
11141114 }
11151115 }
11161116 }
11171117 else throw("Strict value is not equal to itself.")
11181118 }
11191119
11201120
11211121
11221122 @Callable(i)
11231123 func exchangeResources (amounts) = {
11241124 let prologResult = prolog()
11251125 if ((prologResult == prologResult))
11261126 then {
11271127 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
11281128 if ((size(i.payments) != 1))
11291129 then throw("exactly 1 payment must be attached")
11301130 else {
11311131 let pmt = i.payments[0]
11321132 let amt = pmt.amount
11331133 if (if (!(isDefined(pmt.assetId)))
11341134 then true
11351135 else (value(pmt.assetId) != usdtAssetId))
11361136 then throw("USDT payments only!")
11371137 else {
11381138 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
11391139 if ((curLocation[locIdxType] != "F"))
11401140 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
11411141 else {
11421142 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
11431143 let resList = split(currentPack[bpIdxRes], "_")
11441144 let matList = split(currentPack[bpIdxMat], "_")
11451145 let $t04117241278 = exchangeResourcesCommon(resList, matList, amounts)
11461146 let newRes = $t04117241278._1
11471147 let newMat = $t04117241278._2
11481148 let usdtSpent = $t04117241278._3
11491149 let totalAmountConverted = $t04117241278._4
11501150 if ((usdtSpent > amt))
11511151 then throw(((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)))
11521152 else {
11531153 let newPack = makeString([currentPack[bpIdxLevel], makeString(newRes, "_"), makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
11541154 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
11551155 let rest = if (((amt - usdtSpent) > 0))
11561156 then [ScriptTransfer(i.caller, (amt - usdtSpent), usdtAssetId)]
11571157 else nil
11581158 let activitiesAmount = (usdtSpent / 100)
11591159 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
11601160 $Tuple2((rest :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
11611161 }
11621162 }
11631163 }
11641164 }
11651165 }
11661166 else throw("Strict value is not equal to itself.")
11671167 }
11681168
11691169
11701170
11711171 @Callable(i)
11721172 func exchangeResourcesDuckDelivery (amounts) = {
11731173 let prologResult = prolog()
11741174 if ((prologResult == prologResult))
11751175 then {
11761176 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
11771177 if ((size(i.payments) != 1))
11781178 then throw("exactly 1 payment must be attached")
11791179 else {
11801180 let pmt = i.payments[0]
11811181 let amt = pmt.amount
11821182 if (if (!(isDefined(pmt.assetId)))
11831183 then true
11841184 else (value(pmt.assetId) != usdtAssetId))
11851185 then throw("USDT payments only!")
11861186 else {
11871187 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
11881188 let resList = split(currentPack[bpIdxRes], "_")
11891189 let matList = split(currentPack[bpIdxMat], "_")
11901190 let $t04271642822 = exchangeResourcesCommon(resList, matList, amounts)
11911191 let newRes = $t04271642822._1
11921192 let newMat = $t04271642822._2
11931193 let usdtSpent = $t04271642822._3
11941194 let totalAmountConverted = $t04271642822._4
11951195 let feePart = fraction(usdtSpent, DELIVERY_FEE15, MULT6)
11961196 let fee = max([feePart, MIN_USDT_FEE_DELIVERY15])
11971197 let usdtSpentWithFee = (usdtSpent + fee)
11981198 if ((usdtSpentWithFee > amt))
11991199 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
12001200 else {
12011201 let newPack = makeString([currentPack[bpIdxLevel], makeString(newRes, "_"), makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
12021202 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
12031203 let rest = if (((amt - usdtSpentWithFee) > 0))
12041204 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
12051205 else nil
12061206 let activitiesAmount = (usdtSpent / 100)
12071207 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
12081208 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
12091209 $Tuple2(((rest :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(backpackResult, prologResult, statsResult))
12101210 }
12111211 }
12121212 }
12131213 }
12141214 else throw("Strict value is not equal to itself.")
12151215 }
12161216
12171217
12181218
12191219 @Callable(i)
12201220 func exchangeResourcesLandDelivery (amounts,landAssetId) = {
12211221 let prologResult = prolog()
12221222 if ((prologResult == prologResult))
12231223 then if ((size(i.payments) != 1))
12241224 then throw("exactly 1 payment must be attached")
12251225 else {
12261226 let pmt = i.payments[0]
12271227 let amt = pmt.amount
12281228 if (if (!(isDefined(pmt.assetId)))
12291229 then true
12301230 else (value(pmt.assetId) != usdtAssetId))
12311231 then throw("USDT payments only!")
12321232 else {
12331233 let user = i.caller
12341234 let addr = toString(user)
12351235 let asset = value(assetInfo(fromBase58String(landAssetId)))
12361236 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
12371237 then throw((("NFT " + asset.name) + " is not staked"))
12381238 else {
12391239 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
12401240 if ((owner != addr))
12411241 then throw((LANDPREFIX + " is not yours"))
12421242 else {
12431243 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
12441244 let currentWh = split_4C(wh, ":")
12451245 let resList = split(currentWh[whIdxRes], "_")
12461246 let matList = split(currentWh[whIdxMat], "_")
12471247 let $t04500745113 = exchangeResourcesCommon(resList, matList, amounts)
12481248 let newRes = $t04500745113._1
12491249 let newMat = $t04500745113._2
12501250 let usdtSpent = $t04500745113._3
12511251 let totalAmountConverted = $t04500745113._4
12521252 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newRes, "_"), makeString(newMat, "_"), currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
12531253 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
12541254 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
12551255 let feePart = fraction(usdtSpent, DELIVERY_FEE15, MULT6)
12561256 let fee = max([feePart, MIN_USDT_FEE_DELIVERY15])
12571257 let usdtSpentWithFee = (usdtSpent + fee)
12581258 if ((usdtSpentWithFee > amt))
12591259 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
12601260 else {
12611261 let rest = if (((amt - usdtSpentWithFee) > 0))
12621262 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
12631263 else nil
12641264 let activitiesAmount = (usdtSpent / 100)
12651265 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
12661266 $Tuple2(((rest :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(whSave, prologResult, statsResult))
12671267 }
12681268 }
12691269 }
12701270 }
12711271 }
12721272 else throw("Strict value is not equal to itself.")
12731273 }
12741274
12751275
12761276
12771277 @Callable(i)
12781278 func craftGoods (productIdx,quantity) = {
12791279 let prologResult = prolog()
12801280 if ((prologResult == prologResult))
12811281 then if ((size(i.payments) != 1))
12821282 then throw("exactly 1 payment must be attached")
12831283 else {
12841284 let pmt = i.payments[0]
12851285 let amt = pmt.amount
12861286 if (if (!(isDefined(pmt.assetId)))
12871287 then true
12881288 else (value(pmt.assetId) != usdtAssetId))
12891289 then throw("USDT payments only!")
12901290 else if ((amt != MULT6))
12911291 then throw((("exactly " + fixedPoint(CRAFT_USDT_COST, 6)) + " USDT must be attached as payment"))
12921292 else {
12931293 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
12941294 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
12951295 if ((curLocation[locIdxType] != "M"))
12961296 then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
12971297 else {
12981298 let cont = curLocation[locIdxContinent]
12991299 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
13001300 let matList = split(currentPack[bpIdxMat], "_")
13011301 let prodList = if ((currentPack[bpIdxProd] == ""))
13021302 then nil
13031303 else split_4C(currentPack[bpIdxProd], "_")
13041304 let $t04743847535 = craftGoodsCommon(matList, prodList, cont, productIdx, quantity)
13051305 let newMat = $t04743847535._1
13061306 let newProd = $t04743847535._2
13071307 let matSpent = $t04743847535._3
13081308 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), makeString_2C(newProd, "_")], ":")
13091309 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
13101310 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpCraft, matSpent, MULT8)], nil))
13111311 $Tuple2(nil, $Tuple3(result, prologResult, statsResult))
13121312 }
13131313 }
13141314 }
13151315 else throw("Strict value is not equal to itself.")
13161316 }
13171317
13181318
13191319
13201320 @Callable(i)
13211321 func craftGoodsDuckDelivery (productIdx,quantity,manufactoryContinent) = {
13221322 let prologResult = prolog()
13231323 if ((prologResult == prologResult))
13241324 then {
13251325 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
13261326 if ((size(i.payments) != 1))
13271327 then throw("exactly 1 payment must be attached")
13281328 else {
13291329 let pmt = i.payments[0]
13301330 let amt = pmt.amount
13311331 if (if (!(isDefined(pmt.assetId)))
13321332 then true
13331333 else (value(pmt.assetId) != usdtAssetId))
13341334 then throw("USDT payments only!")
13351335 else {
13361336 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
13371337 let matList = split(currentPack[bpIdxMat], "_")
13381338 let prodList = if ((currentPack[bpIdxProd] == ""))
13391339 then nil
13401340 else split_4C(currentPack[bpIdxProd], "_")
13411341 let $t04868348796 = craftGoodsCommon(matList, prodList, manufactoryContinent, productIdx, quantity)
13421342 let newMat = $t04868348796._1
13431343 let newProd = $t04868348796._2
13441344 let matSpent = $t04868348796._3
13451345 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), makeString_2C(newProd, "_")], ":")
13461346 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
13471347 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpCraft, matSpent, MULT8)], nil))
13481348 let feePart = fraction(quantity, MIN_USDT_FEE_DELIVERY, CRAFT_DELIVERY_COEFF)
13491349 let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
13501350 let usdtSpentWithFee = (CRAFT_USDT_COST + fee)
13511351 if ((usdtSpentWithFee > amt))
13521352 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(CRAFT_USDT_COST, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
13531353 else {
13541354 let rest = if (((amt - usdtSpentWithFee) > 0))
13551355 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
13561356 else nil
13571357 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
13581358 $Tuple2((rest :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(backpackResult, prologResult, statsResult))
13591359 }
13601360 }
13611361 }
13621362 }
13631363 else throw("Strict value is not equal to itself.")
13641364 }
13651365
13661366
13671367
13681368 @Callable(i)
13691369 func craftGoodsLandDelivery (productIdx,quantity,landAssetId,manufactoryContinent) = {
13701370 let prologResult = prolog()
13711371 if ((prologResult == prologResult))
13721372 then if ((size(i.payments) != 1))
13731373 then throw("exactly 1 payment must be attached")
13741374 else {
13751375 let pmt = i.payments[0]
13761376 let amt = pmt.amount
13771377 if (if (!(isDefined(pmt.assetId)))
13781378 then true
13791379 else (value(pmt.assetId) != usdtAssetId))
13801380 then throw("USDT payments only!")
13811381 else {
13821382 let user = i.caller
13831383 let addr = toString(user)
13841384 let asset = value(assetInfo(fromBase58String(landAssetId)))
13851385 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
13861386 then throw((("NFT " + asset.name) + " is not staked"))
13871387 else {
13881388 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
13891389 if ((owner != addr))
13901390 then throw((LANDPREFIX + " is not yours"))
13911391 else {
13921392 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
13931393 let currentWh = split_4C(wh, ":")
13941394 let matList = split(currentWh[whIdxMat], "_")
13951395 let prodList = if ((currentWh[whIdxProd] == ""))
13961396 then nil
13971397 else split_4C(currentWh[whIdxProd], "_")
13981398 let $t05096251075 = craftGoodsCommon(matList, prodList, manufactoryContinent, productIdx, quantity)
13991399 let newMat = $t05096251075._1
14001400 let newProd = $t05096251075._2
14011401 let matSpent = $t05096251075._3
14021402 let whStr = makeString_2C([currentWh[whIdxLevels], currentWh[whIdxRes], makeString(newMat, "_"), makeString_2C(newProd, "_"), currentWh[whIdxLOFT]], ":")
14031403 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
14041404 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpCraft, matSpent, MULT8)], nil))
14051405 let feePart = fraction(quantity, MIN_USDT_FEE_DELIVERY, CRAFT_DELIVERY_COEFF)
14061406 let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
14071407 let usdtSpentWithFee = (CRAFT_USDT_COST + fee)
14081408 if ((usdtSpentWithFee > amt))
14091409 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(CRAFT_USDT_COST, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
14101410 else {
14111411 let rest = if (((amt - usdtSpentWithFee) > 0))
14121412 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
14131413 else nil
14141414 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
14151415 $Tuple2((rest :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(whSave, prologResult, statsResult))
14161416 }
14171417 }
14181418 }
14191419 }
14201420 }
14211421 else throw("Strict value is not equal to itself.")
14221422 }
14231423
14241424
14251425
14261426 @Callable(i)
14271427 func setWarehouseOrder (newOrderStr,landAssetId) = {
14281428 let user = i.originCaller
14291429 let addr = toString(user)
14301430 let result = if ((user != restContract))
14311431 then checkBlocked()
14321432 else false
14331433 let asset = value(assetInfo(fromBase58String(landAssetId)))
14341434 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
14351435 then throw((("NFT " + asset.name) + " is not staked"))
14361436 else {
14371437 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
14381438 if (if ((user != restContract))
14391439 then (owner != addr)
14401440 else false)
14411441 then throw((LANDPREFIX + " is not yours"))
14421442 else {
14431443 let newOrder = split_4C(newOrderStr, ":")
14441444 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
14451445 let currentWh = split_4C(wh, ":")
14461446 let loft = split(currentWh[whIdxLOFT], "_")
14471447 let whTotal = parseIntValue(loft[volTotal])
14481448 let ordKey = keyOrderByLand(landAssetId)
14491449 let currentOrd = getOrder(ordKey)
14501450 let z = setInternal(currentWh, currentOrd, newOrder)
14511451 let buyVolSaldo = z._4
14521452 let sellVolSaldo = z._5
14531453 let whOccupied = z._7
14541454 let whLocked = (buyVolSaldo + sellVolSaldo)
14551455 let whFree = ((whTotal - whOccupied) - whLocked)
14561456 if ((0 > whFree))
14571457 then throw((((((("Attempt to reserve " + toString(buyVolSaldo)) + " space for buy orders, and ") + toString(sellVolSaldo)) + " space for sell orders (and occupied=") + toString(whOccupied)) + "), leads to negative free space"))
14581458 else {
14591459 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(z._1, "_"), makeString(z._2, "_"), makeString_2C(z._3, "_"), toString(whLocked)], ":")
14601460 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
14611461 let usdSaldo = z._6
14621462 let actions = if ((usdSaldo > 0))
14631463 then if ((size(i.payments) != 1))
14641464 then throw("exactly 1 payment must be attached")
14651465 else {
14661466 let pmt = i.payments[0]
14671467 let amt = pmt.amount
14681468 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
14691469 if ((pmtAssetId != usdtAssetId))
14701470 then throw("USDT payments only!")
14711471 else if ((amt != usdSaldo))
14721472 then throw(("Payment needed is " + toString(usdSaldo)))
14731473 else [StringEntry(ordKey, newOrderStr)]
14741474 }
14751475 else if ((usdSaldo == 0))
14761476 then if ((size(i.payments) != 0))
14771477 then throw("No payments needed")
14781478 else [StringEntry(ordKey, newOrderStr)]
14791479 else if ((size(i.payments) != 0))
14801480 then throw("No payments needed")
14811481 else [ScriptTransfer(addressFromStringValue(owner), -(usdSaldo), usdtAssetId), StringEntry(ordKey, newOrderStr)]
14821482 $Tuple2(actions, $Tuple2(result, whSave))
14831483 }
14841484 }
14851485 }
14861486 }
14871487
14881488
14891489
14901490 @Callable(i)
14911491 func acceptWarehouseOrder (bpOrderStr,shopLandAssetId,duckAssetId) = {
14921492 let prologResult = prolog()
14931493 if ((prologResult == prologResult))
14941494 then {
14951495 let caller = i.originCaller
14961496 let callerAddr = toString(caller)
14971497 let stakedDuckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
14981498 let curLocation = valueOrElse(getString(stakingContract, keyDuckLocation(stakedDuckAssetId)), DEFAULTLOCATION)
14991499 let loc = split(value(curLocation), "_")
15001500 if ((loc[locIdxType] != "L"))
15011501 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
15021502 else if ((stakedDuckAssetId != duckAssetId))
15031503 then throw(((("Your staked duck is " + stakedDuckAssetId) + ", but passed ") + duckAssetId))
15041504 else {
15051505 let bpKey = keyBackpackByDuck(duckAssetId)
15061506 let currentPack = getBackpack(bpKey)
15071507 let bpResList = split(currentPack[bpIdxRes], "_")
15081508 let bpMatList = split(currentPack[bpIdxMat], "_")
15091509 let bpProdList = if ((currentPack[bpIdxProd] == ""))
15101510 then nil
15111511 else split_4C(currentPack[bpIdxProd], "_")
15121512 let $t05698857228 = acceptShopOrderCommon(shopLandAssetId, callerAddr, bpOrderStr, bpResList, bpMatList, bpProdList)
15131513 let shopAction = $t05698857228._1
15141514 let newUserRes = $t05698857228._2
15151515 let newUserMat = $t05698857228._3
15161516 let newUserProd = $t05698857228._4
15171517 let usdWh2BpSaldo = $t05698857228._5
15181518 let usdBp2WhSaldo = $t05698857228._6
15191519 let xpAmount = $t05698857228._7
15201520 let shopLandOwner = $t05698857228._8
15211521 let shopWhSave = $t05698857228._9
15221522 let accStatsResult = $t05698857228._10
15231523 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, 0)]
15241524 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, 0)
15251525 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString_2C(newUserProd, "_")], ":")
15261526 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
15271527 let duckStatsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpShop, xpAmount, MULT8)], nil))
15281528 $Tuple2((actions1 ++ actions2), $Tuple5(prologResult, shopWhSave, bpSave, duckStatsResult, accStatsResult))
15291529 }
15301530 }
15311531 else throw("Strict value is not equal to itself.")
15321532 }
15331533
15341534
15351535
15361536 @Callable(i)
15371537 func acceptShopOrderDuckDelivery (orderStr,shopLandAssetId) = {
15381538 let prologResult = prolog()
15391539 if ((prologResult == prologResult))
15401540 then {
15411541 let caller = i.originCaller
15421542 let callerAddr = toString(caller)
15431543 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
15441544 let bpKey = keyBackpackByDuck(duckAssetId)
15451545 let currentPack = getBackpack(bpKey)
15461546 let bpResList = split(currentPack[bpIdxRes], "_")
15471547 let bpMatList = split(currentPack[bpIdxMat], "_")
15481548 let bpProdList = if ((currentPack[bpIdxProd] == ""))
15491549 then nil
15501550 else split_4C(currentPack[bpIdxProd], "_")
15511551 let $t05859358831 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, bpResList, bpMatList, bpProdList)
15521552 let shopAction = $t05859358831._1
15531553 let newUserRes = $t05859358831._2
15541554 let newUserMat = $t05859358831._3
15551555 let newUserProd = $t05859358831._4
15561556 let usdWh2BpSaldo = $t05859358831._5
15571557 let usdBp2WhSaldo = $t05859358831._6
15581558 let xpAmount = $t05859358831._7
15591559 let shopLandOwner = $t05859358831._8
15601560 let shopWhSave = $t05859358831._9
15611561 let accStatsResult = $t05859358831._10
15621562 let deliveryFeePart = fraction((usdBp2WhSaldo + usdWh2BpSaldo), DELIVERY_FEE, MULT6)
15631563 let deliveryFee = max([deliveryFeePart, MIN_USDT_FEE_DELIVERY])
15641564 let spentFee = fraction(deliveryFee, usdBp2WhSaldo, (usdBp2WhSaldo + usdWh2BpSaldo))
15651565 let receivedFee = (deliveryFee - spentFee)
15661566 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
15671567 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, receivedFee)]
15681568 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, spentFee)
15691569 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString_2C(newUserProd, "_")], ":")
15701570 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
15711571 let duckStatsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpShop, xpAmount, MULT8)], nil))
15721572 $Tuple2(((actions1 ++ actions2) :+ IntegerEntry(deliveryFundKey, (fundTotal + deliveryFee))), $Tuple5(prologResult, shopWhSave, bpSave, duckStatsResult, accStatsResult))
15731573 }
15741574 else throw("Strict value is not equal to itself.")
15751575 }
15761576
15771577
15781578
15791579 @Callable(i)
15801580 func acceptShopOrderLandDelivery (orderStr,shopLandAssetId,myLandAssetId) = {
15811581 let prologResult = prolog()
15821582 if ((prologResult == prologResult))
15831583 then {
15841584 let caller = i.originCaller
15851585 let callerAddr = toString(caller)
15861586 let asset = value(assetInfo(fromBase58String(myLandAssetId)))
15871587 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(myLandAssetId)))))
15881588 then throw((("NFT " + asset.name) + " is not staked"))
15891589 else {
15901590 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(myLandAssetId)), (("NFT " + asset.name) + " is orphaned"))
15911591 if ((owner != callerAddr))
15921592 then throw((LANDPREFIX + " is not yours"))
15931593 else {
15941594 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [myLandAssetId], nil))
15951595 let currentWh = split_4C(wh, ":")
15961596 let resList = split(currentWh[whIdxRes], "_")
15971597 let matList = split(currentWh[whIdxMat], "_")
15981598 let prodList = if ((currentWh[whIdxProd] == ""))
15991599 then nil
16001600 else split_4C(currentWh[whIdxProd], "_")
16011601 let $t06095261184 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, resList, matList, prodList)
16021602 let shopAction = $t06095261184._1
16031603 let newUserRes = $t06095261184._2
16041604 let newUserMat = $t06095261184._3
16051605 let newUserProd = $t06095261184._4
16061606 let usdWh2BpSaldo = $t06095261184._5
16071607 let usdBp2WhSaldo = $t06095261184._6
16081608 let xpAmount = $t06095261184._7
16091609 let shopLandOwner = $t06095261184._8
16101610 let shopWhSave = $t06095261184._9
16111611 let accStatsResult = $t06095261184._10
16121612 let deliveryFeePart = fraction((usdBp2WhSaldo + usdWh2BpSaldo), DELIVERY_FEE, MULT6)
16131613 let deliveryFee = max([deliveryFeePart, MIN_USDT_FEE_DELIVERY])
16141614 let spentFee = fraction(deliveryFee, usdBp2WhSaldo, (usdBp2WhSaldo + usdWh2BpSaldo))
16151615 let receivedFee = (deliveryFee - spentFee)
16161616 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
16171617 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, receivedFee)]
16181618 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, spentFee)
16191619 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString(newUserProd, "_"), currentWh[whIdxLOFT]], ":")
16201620 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, myLandAssetId], nil))
16211621 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [callerAddr, fraction(xpShop, xpAmount, MULT8)], nil))
16221622 $Tuple2(((actions1 ++ actions2) :+ IntegerEntry(deliveryFundKey, (fundTotal + deliveryFee))), $Tuple5(prologResult, shopWhSave, whSave, statsResult, accStatsResult))
16231623 }
16241624 }
16251625 }
16261626 else throw("Strict value is not equal to itself.")
16271627 }
16281628
16291629
16301630
16311631 @Callable(i)
16321632 func sellProductsToES (amounts) = {
16331633 let prologResult = prolog()
16341634 if ((prologResult == prologResult))
16351635 then if ((size(i.payments) != 0))
16361636 then throw("No payments needed")
16371637 else {
16381638 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
16391639 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
16401640 if ((curLocation[locIdxType] != "A"))
16411641 then throw(("Duck location type should be Airport, but is " + curLocation[locIdxType]))
16421642 else {
16431643 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
16441644 let prodList = if ((currentPack[bpIdxProd] == ""))
16451645 then nil
16461646 else split_4C(currentPack[bpIdxProd], "_")
16471647 let esKey = keyEsWarehouse()
16481648 let existStr = getString(esKey)
16491649 let existAmounts = if (isDefined(existStr))
16501650 then split_4C(value(existStr), "_")
16511651 else nil
16521652 func moveProd (acc,recipeStr) = {
16531653 let j = acc._1
16541654 let quantity = if ((size(amounts) > j))
16551655 then amounts[j]
16561656 else 0
16571657 if ((0 > quantity))
16581658 then throw("Quantity cannot be negative")
16591659 else {
16601660 let recipe = split(recipeStr, "_")
16611661 if ((size(recipe) != RECIPESIZE))
16621662 then throw(("Fatal: unknown recipe: " + recipeStr))
16631663 else {
16641664 let maxAmount = (ESMAXPACKAGES * PRODUCTPKGSIZE)
16651665 let existAmount = if ((size(existAmounts) > j))
16661666 then parseIntValue(existAmounts[j])
16671667 else 0
16681668 let canBuy = (maxAmount - existAmount)
16691669 if ((quantity > canBuy))
16701670 then throw(((("Warehouse can buy only " + toString(canBuy)) + " of ") + prodTypes[j]))
16711671 else {
16721672 let totalMat = getRecipeMaterials(recipe)
16731673 let unitPrice = fraction((totalMat * ESBUYCOEF), RESOURCEPRICEMIN, (MULT8 * PRODUCTPKGSIZE))
16741674 let bpProdAmount = if ((size(prodList) > j))
16751675 then parseIntValue(prodList[j])
16761676 else 0
16771677 if ((quantity > bpProdAmount))
16781678 then throw(((("You have only " + toString(bpProdAmount)) + " of ") + prodTypes[j]))
16791679 else $Tuple5((j + 1), (acc._2 + (unitPrice * quantity)), (acc._3 :+ toString((bpProdAmount - quantity))), (acc._4 :+ toString((existAmount + quantity))), (acc._5 + (totalMat * quantity)))
16801680 }
16811681 }
16821682 }
16831683 }
16841684
16851685 let merged = {
16861686 let $l = productionMatrix
16871687 let $s = size($l)
16881688 let $acc0 = $Tuple5(0, 0, nil, nil, 0)
16891689 func $f0_1 ($a,$i) = if (($i >= $s))
16901690 then $a
16911691 else moveProd($a, $l[$i])
16921692
16931693 func $f0_2 ($a,$i) = if (($i >= $s))
16941694 then $a
16951695 else throw("List size exceeds 50")
16961696
16971697 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
16981698 }
16991699 let newBpStr = makeString_2C([currentPack[bpIdxLevel], currentPack[bpIdxRes], currentPack[bpIdxMat], makeString_2C(merged._3, "_")], ":")
17001700 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
17011701 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpSellToEs, merged._5, (MULT8 * 10))], nil))
17021702 $Tuple2([StringEntry(esKey, makeString_2C(merged._4, "_")), ScriptTransfer(i.caller, merged._2, usdtAssetId)], $Tuple3(bpSave, prologResult, statsResult))
17031703 }
17041704 }
17051705 else throw("Strict value is not equal to itself.")
17061706 }
17071707
17081708
17091709
17101710 @Callable(i)
17111711 func updateEsStorage (newStorage) = if ((i.caller != stakingContract))
17121712 then throw("Permission denied")
17131713 else $Tuple2([StringEntry(keyEsWarehouse(), newStorage)], newStorage)
17141714
17151715
17161716
17171717 @Callable(i)
17181718 func sendDeliveryReward (addr) = if ((i.caller != stakingContract))
17191719 then throw("Permission denied")
17201720 else {
17211721 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
17221722 let acresAmount = (MIN_USDT_FEE_DELIVERY * USDT2ACRES_MULTIPLIER)
17231723 let acresResult = invoke(acresContract, "sendAcres", [addr, acresAmount], nil)
17241724 $Tuple2([IntegerEntry(deliveryFundKey, (fundTotal - MIN_USDT_FEE_DELIVERY))], acresResult)
17251725 }
17261726
17271727
17281728
17291729 @Callable(i)
1730-func replenishDeliveryFund (addedUsdt) = if ((i.caller != this))
1731- then throw("Permission denied")
1732- else if ((0 >= addedUsdt))
1733- then throw("addedUsdt should be positive")
1734- else {
1735- let fundNew = (valueOrElse(getInteger(deliveryFundKey), 0) + addedUsdt)
1736- $Tuple2([IntegerEntry(deliveryFundKey, fundNew)], fundNew)
1737- }
1730+func replenishDeliveryFund () = if ((size(i.payments) != 1))
1731+ then throw("exactly 1 payment must be attached")
1732+ else {
1733+ let pmt = i.payments[0]
1734+ if (if (!(isDefined(pmt.assetId)))
1735+ then true
1736+ else (value(pmt.assetId) != usdtAssetId))
1737+ then throw("USDT payments only!")
1738+ else {
1739+ let addedUsdt = pmt.amount
1740+ if ((0 >= addedUsdt))
1741+ then throw("addedUsdt should be positive")
1742+ else {
1743+ let fundNew = (valueOrElse(getInteger(deliveryFundKey), 0) + addedUsdt)
1744+ $Tuple2([IntegerEntry(deliveryFundKey, fundNew)], fundNew)
1745+ }
1746+ }
1747+ }
17381748
17391749

github/deemru/w8io/3ef1775 
286.19 ms