tx · AC8LbUgwotjCytKGfaMfD3wqnY679LLjTUeCFTCRaVNq

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.03500000 Waves

2023.06.28 20:30 [2642805] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "AC8LbUgwotjCytKGfaMfD3wqnY679LLjTUeCFTCRaVNq", "fee": 3500000, "feeAssetId": null, "timestamp": 1687973459305, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "2gdAyixuakf4Ko7zfYbFvkKWXnuWBdNWMUvYEM6Jr3W4Z8AS81T3WSsDXCkHTewpimjWorW4sQsu3VZVTHoeSf6R" ], "script": "base64:BgI7CAISBAoCCBgSAwoBCBIECgIRERIECgIRERIDCgEREgQKAgEBEgQKAggIEgUKAwgICBIDCgEREgMKAQhJAApMQU5EUFJFRklYAgRMQU5EAAZOVU1SRVMABgAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EAEFJFU09VUkNFUFJJQ0VNSU4A1bUCAA1FU01BWFBBQ0tBR0VTAAMACUVTQlVZQ09FRgAEAAhyZXNUeXBlcwkAzAgCAgNPaWwJAMwIAgIDT3JlCQDMCAICBFdvb2QJAMwIAgIEU2FuZAkAzAgCAgRDbGF5CQDMCAICB09yZ2FuaWMFA25pbAAIbWF0VHlwZXMJAMwIAgIERnVlbAkAzAgCAgVNZXRhbAkAzAgCAgVQbGFuawkAzAgCAgVHbGFzcwkAzAgCAgdQbGFzdGljCQDMCAICB1Byb3RlaW4FA25pbAAJcHJvZFR5cGVzCQDMCAICEEZpcnN0IEFpZCBLaXQgTDEJAMwIAgIQRmlyc3QgQWlkIEtpdCBMMgkAzAgCAhBGaXJzdCBBaWQgS2l0IEwzCQDMCAICC0JhY2twYWNrIEwxCQDMCAICC0JhY2twYWNrIEwyCQDMCAICC0JhY2twYWNrIEwzCQDMCAICDkZvb2QgUmF0aW9uIEwxCQDMCAICDkZvb2QgUmF0aW9uIEwyCQDMCAICDkZvb2QgUmF0aW9uIEwzCQDMCAICC0pldCBQYWNrIEwxCQDMCAICC0pldCBQYWNrIEwyCQDMCAICC0pldCBQYWNrIEwzCQDMCAICCVNoaWVsZCBMMQkAzAgCAglTaGllbGQgTDIJAMwIAgIJU2hpZWxkIEwzBQNuaWwACmNvbnRpbmVudHMJAMwIAgIIQW1lcmljYXMJAMwIAgIGRXVyb3BlCQDMCAICBEFzaWEJAMwIAgIGQWZyaWNhCQDMCAICB09jZWFuaWEFA25pbAAQcHJvZHVjdGlvbk1hdHJpeAkAzAgCAhIxXzFfMV8yXzJfNV8xXzEwXzAJAMwIAgITMl8yXzJfNF80XzEwXzFfMTBfMAkAzAgCAhMzXzNfM182XzZfMTVfMV8xMF8wCQDMCAICEzJfNV81XzJfN181XzJfMTAwXzEJAMwIAgIXNF8xMF8xMF80XzE0XzEwXzJfMTAwXzEJAMwIAgIXNl8xNV8xNV82XzIxXzE1XzJfMTAwXzEJAMwIAgISMV8xXzFfMV8xXzhfMV8xMF8yCQDMCAICEzJfMl8yXzJfMl8xNl8xXzEwXzIJAMwIAgITM18zXzNfM18zXzI0XzFfMTBfMgkAzAgCAhM5XzlfMV81XzVfMV81XzEwMF8zCQDMCAICFzE4XzE4XzJfMTBfMTBfMl81XzEwMF8zCQDMCAICFzI3XzI3XzNfMTVfMTVfM181XzEwMF8zCQDMCAICEjJfMl8xXzJfMl8yXzFfMTBfNAkAzAgCAhI0XzRfMl80XzRfNF8xXzEwXzQJAMwIAgISNl82XzNfNl82XzZfMV8xMF80BQNuaWwAEXJlY2lwZUlkeFBhY2tzaXplAAcAEnJlY2lwZUlkeENvbnRpbmVudAAIAAt3aElkeExldmVscwAAAAh3aElkeFJlcwABAAh3aElkeE1hdAACAAl3aElkeFByb2QAAwAJd2hJZHhMT0ZUAAQACXZvbExvY2tlZAAAAAh2b2xUb3RhbAADAApicElkeExldmVsAAAACGJwSWR4UmVzAAEACGJwSWR4TWF0AAIACWJwSWR4UHJvZAADARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBB2Fzc2V0SWQJAKwCAgIJbmZ0T3duZXJfBQdhc3NldElkARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQdhc3NldElkCQCsAgICC3N0YWtlZFRpbWVfBQdhc3NldElkAQ9rZXlBZGRyZXNzUmVmQnkBBGFkZHIJAKwCAgIJYWNjUmVmQnlfBQRhZGRyARRrZXlTdGFrZWREdWNrQnlPd25lcgEJb3duZXJBZGRyCQCsAgICEnN0YWtlZER1Y2tCeU93bmVyXwUJb3duZXJBZGRyARFrZXlCYWNrcGFja0J5RHVjawELZHVja0Fzc2V0SWQJAKwCAgIJYmFja1BhY2tfBQtkdWNrQXNzZXRJZAEPa2V5RHVja0xvY2F0aW9uAQtkdWNrQXNzZXRJZAkArAICAg1kdWNrTG9jYXRpb25fBQtkdWNrQXNzZXRJZAEKa2V5QmxvY2tlZAACEGNvbnRyYWN0c0Jsb2NrZWQBDmtleU9yZGVyQnlMYW5kAQtsYW5kQXNzZXRJZAkArAICAgpsYW5kT3JkZXJfBQtsYW5kQXNzZXRJZAEOa2V5RXNXYXJlaG91c2UAAhplbWVyZ2VuY3lXYXJlaG91c2VQcm9kdWN0cwAPbG9jSWR4Q29udGluZW50AAAACmxvY0lkeFR5cGUAAQAIbG9jSWR4SWQAAgESZ2V0UmVjaXBlTWF0ZXJpYWxzAQZyZWNpcGUKAQZhZGRNYXQCAmFjAWoJAGQCBQJhYwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnJlY2lwZQUBagoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBmFkZE1hdAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAFY2hhaW4JAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEAC3VzZHRBc3NldElkBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwASCE2nqyCAM/TtG7yo7ui5O8yYLdC136B5ao1CP5qA//uQMJAAACAQFUBQckbWF0Y2gwASBVsdifcoeC7+XjW42sBatl3ppDoS8WuwXzGreHpfHFGAkAAgECDVVua25vd24gY2hhaW4AFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BRQ3V2RmJ2aDRMa1BVbnJuVTF6M2puYkExcDltM1dOaHYDCQAAAgEBVAUHJG1hdGNoMAIjM011bWtHR3p0Q0tBWHBXRHF4a2Rkb2ZxWFNVYnFRa3ZTSnkJAAIBAg1Vbmtub3duIGNoYWluAANTRVACAl9fAAVNVUxUNgDAhD0ABU1VTFQ3AICt4gQABU1VTFQ4AIDC1y8ABk1VTFQxMACAyK+gJQEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEUlkeENmZ1N0YWtpbmdEYXBwAAEBCmtleVJlc3RDZmcAAg4lc19fcmVzdENvbmZpZwEOa2V5UmVzdEFkZHJlc3MAAgwlc19fcmVzdEFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgdyZXN0Q2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHcmVzdENmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgADHJlc3RDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5UmVzdEFkZHJlc3MABRVkZWZhdWx0UmVzdEFkZHJlc3NTdHIAB3Jlc3RDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDHJlc3RDb250cmFjdAAPc3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnU3Rha2luZ0RhcHABCGFzU3RyaW5nAQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAUBcwkAAgECGGZhaWwgdG8gY2FzdCBpbnRvIFN0cmluZwATRkFDVE9SWU1BWFdBUkVIT1VTRQCAyK+gJQAOU0VMTE1VTFRJUExJRVIAyAEADUJVWU1VTFRJUExJRVIArAIACkFVQ1RJT05GRUUAkE4ADk1JTlNIT1BQQVlNRU5UAKCNBgEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAglmYWN0b3J5SWQHcmVzVHlwZQkArAICCQCsAgIJAKwCAgIbZmFjdG9yeVdoQnlDb250aW5lbnRBbmRSZXNfBQlmYWN0b3J5SWQCAV8JAKQDAQUHcmVzVHlwZQAJb3JkSWR4UmVzAAAACW9yZElkeE1hdAABAApvcmRJZHhQcm9kAAIBCGdldE9yZGVyAQZvcmRLZXkEAXAJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQZvcmRLZXkCMDBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwOjBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwOgIBOgkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCW9yZElkeFJlcwIBXwUGTlVNUkVTCQCRAwIFAXAFCW9yZElkeFJlcwIXMEAwXzBAMF8wQDBfMEAwXzBAMF8wQDAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQlvcmRJZHhNYXQCAV8FBk5VTVJFUwkAkQMCBQFwBQlvcmRJZHhNYXQCFzBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwCQDMCAIJAJEDAgUBcAUKb3JkSWR4UHJvZAUDbmlsAQh0b1ZvbHVtZQMGYW1vdW50B3BrZ1NpemUJaXNQcm9kdWN0AwUJaXNQcm9kdWN0BARwa2dzAwkAZwIFBmFtb3VudAAACQBpAgkAZQIJAGQCBQZhbW91bnQFB3BrZ1NpemUAAQUHcGtnU2l6ZQkBAS0BCQBpAgkAZQIJAGQCCQEBLQEFBmFtb3VudAUHcGtnU2l6ZQABBQdwa2dTaXplCQBoAgUEcGtncwUFTVVMVDgFBmFtb3VudAEMc2VsbEludGVybmFsBAVsb2NJZAdyZXNUeXBlBmFtb3VudAhtaW5QcmljZQQFd2hLZXkJAR5rZXlGYWN0b3J5V2FyZWhvdXNlQnlJZEFuZFR5cGUCBQVsb2NJZAUHcmVzVHlwZQQCdzAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUFd2hLZXkAAAQCcjADCQBmAgUCdzAFE0ZBQ1RPUllNQVhXQVJFSE9VU0UAAAMJAGYCCQBkAgUCdzAFBmFtb3VudAUTRkFDVE9SWU1BWFdBUkVIT1VTRQkAZQIFE0ZBQ1RPUllNQVhXQVJFSE9VU0UFAncwBQZhbW91bnQEDHVzZHRSZWNlaXZlZAkAZAIJAGsDBQJyMAkAZQIJAGgCBQ5TRUxMTVVMVElQTElFUgUQUkVTT1VSQ0VQUklDRU1JTgkAawMJAGQCCQBoAgBkBQJ3MAkAaAIAMgUCcjAFEFJFU09VUkNFUFJJQ0VNSU4FE0ZBQ1RPUllNQVhXQVJFSE9VU0UFBk1VTFQxMAkAawMJAGUCBQZhbW91bnQFAnIwBRBSRVNPVVJDRVBSSUNFTUlOBQVNVUxUOAQFbWluOTkJAGUCBQhtaW5QcmljZQkAaQIFCG1pblByaWNlAGQDCQBmAgkAaAIFBW1pbjk5BQZhbW91bnQJAGgCBQx1c2R0UmVjZWl2ZWQFBU1VTFQ4CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BY3R1YWwgcHJpY2UgPSAJAKQDAQUMdXNkdFJlY2VpdmVkAgMgLyAJAKQDAQUGYW1vdW50Ag4gPCBtaW5QcmljZSA9IAkApAMBBQhtaW5QcmljZQIDLCAoBQVsb2NJZAICLCAJAJEDAgUIcmVzVHlwZXMFB3Jlc1R5cGUCASkJAJQKAgkBDEludGVnZXJFbnRyeQIFBXdoS2V5CQBkAgUCdzAFBmFtb3VudAUMdXNkdFJlY2VpdmVkAQtidXlJbnRlcm5hbAQFbG9jSWQHbWF0VHlwZQZhbW91bnQIbWF4UHJpY2UEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFB21hdFR5cGUEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEAm0xAwkAZgIFAncwBRNGQUNUT1JZTUFYV0FSRUhPVVNFCQCXAwEJAMwIAgUGYW1vdW50CQDMCAIJAGUCBQJ3MAUTRkFDVE9SWU1BWFdBUkVIT1VTRQUDbmlsAAAEAm0wCQCXAwEJAMwIAgUCdzAJAMwIAgkAZQIFBmFtb3VudAUCbTEFA25pbAQBbQkAZAIFAm0wBQJtMQQJdXNkdFNwZW50CQBkAgkAawMFAm0wCQBlAgkAaAIFDUJVWU1VTFRJUExJRVIFEFJFU09VUkNFUFJJQ0VNSU4JAGsDCQBlAgkAaAIAZAUCdzAJAGgCADIFAm0wBRBSRVNPVVJDRVBSSUNFTUlOBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQZNVUxUMTAJAGsDBQJtMQkAaAIAAgUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgEBm1heDEwMQkAZAIFCG1heFByaWNlCQBpAgUIbWF4UHJpY2UAZAMJAGYCCQBoAgUJdXNkdFNwZW50BQVNVUxUOAkAaAIFBm1heDEwMQUBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIPQWN0dWFsIHByaWNlID0gCQCkAwEFCXVzZHRTcGVudAIDIC8gCQCkAwEFAW0CDiA+IG1heFByaWNlID0gCQCkAwEFCG1heFByaWNlAgMsICgFBWxvY0lkAgIsIAkAkQMCBQhtYXRUeXBlcwUHbWF0VHlwZQIBKQkAlQoDCQEMSW50ZWdlckVudHJ5AgUFd2hLZXkJAGUCBQJ3MAUBbQUJdXNkdFNwZW50BQFtAQtnZXRCYWNrcGFjawEFYnBLZXkEAXAJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QFBWJwS2V5AhowOjBfMF8wXzBfMF8wOjBfMF8wXzBfMF8wOgIBOgkAzAgCCQCkAwEJAQt2YWx1ZU9yRWxzZQIJALYJAQkAkQMCBQFwBQpicElkeExldmVsAAAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQhicElkeFJlcwIBXwUGTlVNUkVTCQCRAwIFAXAFCGJwSWR4UmVzAgswXzBfMF8wXzBfMAkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCGJwSWR4TWF0AgFfBQZOVU1SRVMJAJEDAgUBcAUIYnBJZHhNYXQCCzBfMF8wXzBfMF8wCQDMCAIJAJEDAgUBcAUJYnBJZHhQcm9kBQNuaWwBDGNoZWNrQmxvY2tlZAADCQELdmFsdWVPckVsc2UCCQCbCAIFD3N0YWtpbmdDb250cmFjdAkBCmtleUJsb2NrZWQABwkAAgECH0NvbnRyYWN0cyBhcmUgdW5kZXIgbWFpbnRlbmFuY2UFBHVuaXQBCXNldENvbW1vbgIDYWNjBGl0ZW0EAWoIBQNhY2MCXzEEBmlzUHJvZAgFA2FjYwJfOAQHcGtnU2l6ZQMFBmlzUHJvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgkAkQMCBRBwcm9kdWN0aW9uTWF0cml4BQFqAgFfBRFyZWNpcGVJZHhQYWNrc2l6ZQAABAlpdGVtUGFydHMJALUJAgUEaXRlbQIBQAMJAQIhPQIJAJADAQUJaXRlbVBhcnRzAAIJAAIBAi5JbmNvcnJlY3Qgb3JkZXIgZm9ybWF0LCBzaG91bGQgYmUgYW1vdW50QHByaWNlBAhuZXdPcmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWl0ZW1QYXJ0cwAABAhuZXdPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWl0ZW1QYXJ0cwABBAluZXdPcmRVc2QJAGsDBQhuZXdPcmRBbQUIbmV3T3JkUHIFBU1VTFQ4BAluZXdPcmRWb2wJAQh0b1ZvbHVtZQMFCG5ld09yZEFtBQdwa2dTaXplBQZpc1Byb2QEBndoSW5pdAMJAGYCCQCQAwEIBQNhY2MCXzYFAWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCCAUDYWNjAl82BQFqAAAEC2N1ck9yZFBhcnRzCQC1CQIDCQBmAgkAkAMBCAUDYWNjAl83BQFqCQCRAwIIBQNhY2MCXzcFAWoCAzBAMAIBQAQIY3VyT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJPcmRQYXJ0cwAABAhjdXJPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ck9yZFBhcnRzAAEDAwkAZgIAAAUIY3VyT3JkUHIGCQBmAgAABQhuZXdPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAljdXJPcmRVc2QJAGsDBQhjdXJPcmRBbQUIY3VyT3JkUHIFBU1VTFQ4AwkAAAIFCG5ld09yZEFtAAADCQBmAgUIY3VyT3JkQW0AAAkAmwoJCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQUGd2hJbml0CAUDYWNjAl8zCAUDYWNjAl80CQBlAggFA2FjYwJfNQUJY3VyT3JkVXNkCAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAGQCCAUDYWNjAl85CQEIdG9Wb2x1bWUDBQZ3aEluaXQFB3BrZ1NpemUFBmlzUHJvZAkAmwoJCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFBndoSW5pdAUIY3VyT3JkQW0IBQNhY2MCXzMIBQNhY2MCXzQIBQNhY2MCXzUIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkAZAIIBQNhY2MCXzkJAQh0b1ZvbHVtZQMJAGUCBQZ3aEluaXQFCGN1ck9yZEFtBQdwa2dTaXplBQZpc1Byb2QDCQBmAgUIbmV3T3JkQW0AAAMJAGYCAAAFCGN1ck9yZEFtCQCbCgkJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBlAgUGd2hJbml0BQhjdXJPcmRBbQkAZAIIBQNhY2MCXzMFCW5ld09yZFZvbAgFA2FjYwJfNAkAZAIIBQNhY2MCXzUFCW5ld09yZFVzZAgFA2FjYwJfNggFA2FjYwJfNwUGaXNQcm9kCQEIdG9Wb2x1bWUDCQBlAgUGd2hJbml0BQhjdXJPcmRBbQUHcGtnU2l6ZQUGaXNQcm9kCQCbCgkJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQZ3aEluaXQJAGQCCAUDYWNjAl8zBQluZXdPcmRWb2wIBQNhY2MCXzQJAGUCCQBkAggFA2FjYwJfNQUJbmV3T3JkVXNkBQljdXJPcmRVc2QIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkBCHRvVm9sdW1lAwUGd2hJbml0BQdwa2dTaXplBQZpc1Byb2QDCQBmAgAABQhjdXJPcmRBbQQGYW1EaWZmCQBlAgUIY3VyT3JkQW0FCG5ld09yZEFtAwkAZgIAAAkAZQIFBndoSW5pdAUGYW1EaWZmCQACAQkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHRha2UgCQCkAwEFBmFtRGlmZgIaIGZyb20gd2FyZWhvdXNlLCBidXQgb25seSAJAKQDAQUGd2hJbml0AgogYXZhaWxhYmxlCQCbCgkJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBlAgUGd2hJbml0BQZhbURpZmYIBQNhY2MCXzMJAGUCCAUDYWNjAl80BQluZXdPcmRWb2wIBQNhY2MCXzUIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkBCHRvVm9sdW1lAwkAZQIFBndoSW5pdAUGYW1EaWZmBQdwa2dTaXplBQZpc1Byb2QDCQBmAgAACQBkAgUGd2hJbml0BQhuZXdPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBCQEBLQEFCG5ld09yZEFtAhogZnJvbSB3YXJlaG91c2UsIGJ1dCBvbmx5IAkApAMBBQZ3aEluaXQCCiBhdmFpbGFibGUJAJsKCQkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCBQZ3aEluaXQFCG5ld09yZEFtCAUDYWNjAl8zCQBlAggFA2FjYwJfNAUJbmV3T3JkVm9sCQBlAggFA2FjYwJfNQUJY3VyT3JkVXNkCAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAQh0b1ZvbHVtZQMJAGQCBQZ3aEluaXQFCG5ld09yZEFtBQdwa2dTaXplBQZpc1Byb2QBC3NldEludGVybmFsAwljdXJyZW50V2gKY3VycmVudE9yZAZuZXdPcmQECWN1cnJXaFJlcwkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8ECWN1cnJXaE1hdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8ECmN1cnJXaFByb2QDCQAAAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIBXwQNY3VycmVudE9yZFJlcwkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCW9yZElkeFJlcwIBXwQNY3VycmVudE9yZE1hdAkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCW9yZElkeE1hdAIBXwQOY3VycmVudE9yZFByb2QDCQAAAgkAkQMCBQpjdXJyZW50T3JkBQpvcmRJZHhQcm9kAgAFA25pbAkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCm9yZElkeFByb2QCAV8DCQECIT0CCQCQAwEFBm5ld09yZAADCQACAQIzbmV3T3JkZXJTdHIgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSAyICc6JyBzZXBhcmF0b3JzBAhyZXNQYXJ0cwkAtQkCCQCRAwIFBm5ld09yZAAAAgFfBAhtYXRQYXJ0cwkAtQkCCQCRAwIFBm5ld09yZAABAgFfBAlwcm9kUGFydHMDCQAAAgkAkQMCBQZuZXdPcmQAAgIABQNuaWwJALUJAgkAkQMCBQZu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tQkCCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFAWoCAV8FEXJlY2lwZUlkeFBhY2tzaXplAAAECmJwT3JkUGFydHMJALUJAgUJYnBPcmRJdGVtAgFAAwkBAiE9AgkAkAMBBQpicE9yZFBhcnRzAAIJAAIBAi5JbmNvcnJlY3Qgb3JkZXIgZm9ybWF0LCBzaG91bGQgYmUgYW1vdW50QHByaWNlBAdicE9yZEFtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYnBPcmRQYXJ0cwAABAdicE9yZFByCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYnBPcmRQYXJ0cwABAwkAZgIAAAUHYnBPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAhicE9yZFVzZAkAawMFB2JwT3JkQW0FB2JwT3JkUHIFBU1VTFQ4BAZicEluaXQDCQBmAgkAkAMBCAUDYWNjAl84BQFqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAggFA2FjYwJfOAUBagAABAZ3aEluaXQDCQBmAgkAkAMBCAUDYWNjAl85BQFqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAggFA2FjYwJfOQUBagAABAl3aE9yZEluaXQDCQBmAgkAkAMBCAUDYWNjA18xMAUBagkAkQMCCAUDYWNjA18xMAUBagIDMEAwBAp3aE9yZFBhcnRzCQC1CQIFCXdoT3JkSW5pdAIBQAQHd2hPcmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCndoT3JkUGFydHMAAAQHd2hPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCndoT3JkUGFydHMAAQMDCQECIT0CBQdicE9yZEFtAAAJAQIhPQIFB2JwT3JkUHIFB3doT3JkUHIHCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICClByaWNlcyBvZiAJAJEDAggFA2FjYwNfMTEFAWoCFyBkb24ndCBtYXRjaCEgV0ggcHJpY2U9CQCkAwEFB3doT3JkUHICDSwgeW91ciBwcmljZT0JAKQDAQUHYnBPcmRQcgQId2hPcmRVc2QJAGsDBQd3aE9yZEFtBQd3aE9yZFByBQVNVUxUOAQIZGVsdGFWb2wJAQh0b1ZvbHVtZQMFB2JwT3JkQW0FB3BrZ1NpemUFBmlzUHJvZAMJAAACBQdicE9yZEFtAAAJAJ4KDAkAzQgCCAUDYWNjAl8xCQCkAwEFBndoSW5pdAkAzQgCCAUDYWNjAl8yBQl3aE9yZEluaXQJAM0IAggFA2FjYwJfMwkApAMBBQZicEluaXQIBQNhY2MCXzQIBQNhY2MCXzUIBQNhY2MCXzYJAGQCCAUDYWNjAl83AAEIBQNhY2MCXzgIBQNhY2MCXzkIBQNhY2MDXzEwCAUDYWNjA18xMQUGaXNQcm9kAwkAZgIFB2JwT3JkQW0AAAMJAGYCAAAFB3doT3JkQW0DCQBmAgUHYnBPcmRBbQkBAS0BBQd3aE9yZEFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICD0F0dGVtcHQgdG8gYnV5IAkApAMBBQdicE9yZEFtAgQgb2YgCQCRAwIIBQNhY2MDXzExBQFqAhssIGJ1dCB3YXJlaG91c2Ugb25seSBzZWxscyAJAKQDAQkBAS0BBQd3aE9yZEFtCQCeCgwJAM0IAggFA2FjYwJfMQkApAMBBQZ3aEluaXQJAM0IAggFA2FjYwJfMgkArAICCQCsAgIJAKQDAQkAZAIFB3doT3JkQW0FB2JwT3JkQW0CAUAJAKQDAQUHd2hPcmRQcgkAzQgCCAUDYWNjAl8zCQCkAwEJAGQCBQZicEluaXQFB2JwT3JkQW0JAGQCCAUDYWNjAl80BQhkZWx0YVZvbAgFA2FjYwJfNQkAZAIIBQNhY2MCXzYFCGJwT3JkVXNkCQBkAggFA2FjYwJfNwABCAUDYWNjAl84CAUDYWNjAl85CAUDYWNjA18xMAgFA2FjYwNfMTEFBmlzUHJvZAkAAgEJAKwCAgkArAICAg9BdHRlbXB0IHRvIGJ1eSAJAJEDAggFA2FjYwNfMTEFAWoCICB3aGlsZSB3YXJlaG91c2UgZG9lc24ndCBzZWxsIGl0AwkAZgIFB3doT3JkQW0AAAMJAGYCCQEBLQEFB2JwT3JkQW0FB3doT3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byBzZWxsIAkApAMBCQEBLQEFB2JwT3JkQW0CBCBvZiAJAJEDAggFA2FjYwNfMTEFAWoCGiwgYnV0IHdhcmVob3VzZSBvbmx5IGJ1eXMgCQCkAwEFB3doT3JkQW0DCQBmAgkBAS0BBQdicE9yZEFtBQZicEluaXQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byBzZWxsIAkApAMBCQEBLQEFB2JwT3JkQW0CFCwgYnV0IHlvdSBvbmx5IGhhdmUgCQCkAwEFBmJwSW5pdAIEIG9mIAkAkQMCCAUDYWNjA18xMQUBagkAngoMCQDNCAIIBQNhY2MCXzEJAKQDAQkAZQIFBndoSW5pdAUHYnBPcmRBbQkAzQgCCAUDYWNjAl8yCQCsAgIJAKwCAgkApAMBCQBkAgUHd2hPcmRBbQUHYnBPcmRBbQIBQAkApAMBBQd3aE9yZFByCQDNCAIIBQNhY2MCXzMJAKQDAQkAZAIFBmJwSW5pdAUHYnBPcmRBbQkAZQIIBQNhY2MCXzQFCGRlbHRhVm9sCQBlAggFA2FjYwJfNQUIYnBPcmRVc2QIBQNhY2MCXzYJAGQCCAUDYWNjAl83AAEIBQNhY2MCXzgIBQNhY2MCXzkIBQNhY2MDXzEwCAUDYWNjA18xMQUGaXNQcm9kCQACAQkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAJEDAggFA2FjYwNfMTEFAWoCHyB3aGlsZSB3YXJlaG91c2UgZG9lc24ndCBidXkgaXQKAWkBGnJlY2FsY0xvY2tlZFZvbHVtZVJFQURPTkxZAgtsYW5kQXNzZXRJZAJ3aAQKY3VycmVudE9yZAkBCGdldE9yZGVyAQkBDmtleU9yZGVyQnlMYW5kAQULbGFuZEFzc2V0SWQEAXoJAQtzZXRJbnRlcm5hbAMFAndoBQpjdXJyZW50T3JkBQpjdXJyZW50T3JkCQCUCgIFA25pbAkAZAIIBQF6Al80CAUBegJfNQFpAQ1jb25zdHJ1Y3RvclYxAQhyZXN0QWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlSZXN0QWRkcmVzcwAFCHJlc3RBZGRyBQNuaWwBaQENc2VsbFJlc291cmNlcwIHYW1vdW50cwltaW5QcmljZXMEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECKnNlbGxSZXNvdXJjZXMgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50cwQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAVsb2NJZAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwoBBWFkZGVyAgNhY2MBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkAkQMCBQdyZXNMaXN0BQFqAgQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAhQsIGJ1dCB0cmllZCB0byBzZWxsIAkApAMBCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgAACQCRAwIFB2Ftb3VudHMFAWoJAAIBCQCsAgIJAKwCAgkArAICAiVZb3UgdHJpZWQgdG8gc2VsbCBuZWdhdGl2ZSBhbW91bnQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAgI6IAkApAMBCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgkAkQMCBQdhbW91bnRzBQFqAAAEAWIJAQxzZWxsSW50ZXJuYWwEBQVsb2NJZAUBagkAkQMCBQdhbW91bnRzBQFqCQCRAwIFCW1pblByaWNlcwUBagkAlQoDCQDNCAIIBQNhY2MCXzEIBQFiAl8xCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQCRAwIFB2Ftb3VudHMFAWoJAGQCCAUDYWNjAl8zCAUBYgJfMgkAlQoDCAUDYWNjAl8xCQDNCAIIBQNhY2MCXzIJAJEDAgUHcmVzTGlzdAUBaggFA2FjYwJfMwQGbWVyZ2VkCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAggFBm1lcmdlZAJfMgIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwJAJQKAgkAzQgCCAUGbWVyZ2VkAl8xCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIIBQZtZXJnZWQCXzMFC3VzZHRBc3NldElkBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMYnV5TWF0ZXJpYWxzAgdhbW91bnRzCW1heFByaWNlcwQHYmxvY2tlZAkBDGNoZWNrQmxvY2tlZAADCQAAAgUHYmxvY2tlZAUHYmxvY2tlZAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQFbG9jSWQJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8KAQhtVXBkYXRlcgIDYWNjAWoDCQBmAgAACQCRAwIFB2Ftb3VudHMFAWoJAAIBCQCsAgIJAKwCAgkArAICAiRZb3UgdHJpZWQgdG8gYnV5IG5lZ2F0aXZlIGFtb3VudCBvZiAJAJEDAgUIbWF0VHlwZXMFAWoCAjogCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoAAAQBYgkBC2J1eUludGVybmFsBAUFbG9jSWQFAWoJAJEDAgUHYW1vdW50cwUBagkAkQMCBQltYXhQcmljZXMFAWoJAJUKAwkAzQgCCAUDYWNjAl8xCAUBYgJfMQkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHbWF0TGlzdAUBaggFAWICXzMJAGQCCAUDYWNjAl8zCAUBYgJfMgkAlQoDCAUDYWNjAl8xCQDNCAIIBQNhY2MCXzIJAJEDAgUHbWF0TGlzdAUBaggFA2FjYwJfMwQGbWVyZ2VkCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIbVVwZGF0ZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYDCQBmAggFBm1lcmdlZAJfMwUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkApAMBBQNhbXQCCywgcmVxdWlyZWQ9CQCkAwEIBQZtZXJnZWQCXzMEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAggFBm1lcmdlZAJfMgIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEBHJlc3QDCQBmAgkAZQIFA2FtdAgFBm1lcmdlZAJfMwAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAgFBm1lcmdlZAJfMwULdXNkdEFzc2V0SWQFA25pbAUDbmlsBBBhY3Rpdml0aWVzQW1vdW50CQBpAggFBm1lcmdlZAJfMwBkCQCUCgIJAM0IAgkAzggCCAUGbWVyZ2VkAl8xBQRyZXN0CQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFEGFjdGl2aXRpZXNBbW91bnQFC3VzZHRBc3NldElkBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERZXhjaGFuZ2VSZXNvdXJjZXMBB2Ftb3VudHMEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBWxvY0lkCQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdyZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfCgEJZXhjaGFuZ2VyAgNhY2MBagQFd2hLZXkJAR5rZXlGYWN0b3J5V2FyZWhvdXNlQnlJZEFuZFR5cGUCBQVsb2NJZAUBagQCdzAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUFd2hLZXkAAAQDYW1qCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgUDYW1qCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVzTGlzdAUBagkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglZb3UgaGF2ZSAJAJEDAgUHcmVzTGlzdAUBagIEIG9mIAkAkQMCBQhyZXNUeXBlcwUBagIYLCBidXQgdHJpZWQgdG8gZXhjaGFuZ2UgCQCkAwEFA2FtagMJAGYCAAAFA2FtagkAAgEJAKwCAgkArAICCQCsAgICKVlvdSB0cmllZCB0byBleGNoYW5nZSBuZWdhdGl2ZSBhbW91bnQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAgI6IAkApAMBBQNhbWoDCQBmAgUDYW1qAAAJAJYKBAkAzQgCCAUDYWNjAl8xCQCkAwEJAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVzTGlzdAUBagUDYW1qCQDNCAIIBQNhY2MCXzIJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0BQFqBQNhbWoJAGQCCAUDYWNjAl8zCQBrAwUDYW1qBRBSRVNPVVJDRVBSSUNFTUlOBQVNVUxUOAkAzQgCCAUDYWNjAl80CQEMSW50ZWdlckVudHJ5AgUFd2hLZXkFAncwCQCWCgQJAM0IAggFA2FjYwJfMQkAkQMCBQdyZXNMaXN0BQFqCQDNCAIIBQNhY2MCXzIJAJEDAgUHbWF0TGlzdAUBaggFA2FjYwJfMwgFA2FjYwJfNAQGbWVyZ2VkCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAUDbmlsBQNuaWwAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlleGNoYW5nZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYDCQBmAggFBm1lcmdlZAJfMwUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkApAMBBQNhbXQCCywgcmVxdWlyZWQ9CQCkAwEIBQZtZXJnZWQCXzMEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAggFBm1lcmdlZAJfMQIBXwkAzAgCCQC5CQIIBQZtZXJnZWQCXzICAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEBnJlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBARyZXN0AwkAZgIJAGUCBQNhbXQIBQZtZXJnZWQCXzMAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQIBQZtZXJnZWQCXzMFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIIBQZtZXJnZWQCXzMAZAkAlAoCCQDNCAIJAM4IAgUEcmVzdAgFBm1lcmdlZAJfNAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmNyYWZ0R29vZHMCCnByb2R1Y3RJZHgIcXVhbnRpdHkEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQMJAQIhPQIFA2FtdAUFTVVMVDYJAAIBAipleGFjdGx5IDEgVVNEVCBtdXN0IGJlIGF0dGFjaGVkIGFzIHBheW1lbnQDCQBnAgAABQhxdWFudGl0eQkAAgECG1F1YW50aXR5IHNob3VsZCBiZSBwb3NpdGl2ZQQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFNCQACAQkArAICAjFEdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIE1hbnVmYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBARjb250CQCRAwIFC2N1ckxvY2F0aW9uBQ9sb2NJZHhDb250aW5lbnQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwMDCQBmAgAABQpwcm9kdWN0SWR4BgkAZwIFCnByb2R1Y3RJZHgJAJADAQUQcHJvZHVjdGlvbk1hdHJpeAkAAgEJAKwCAgIUVW5rbm93biBwcm9kdWN0IGlkeD0JAKQDAQUKcHJvZHVjdElkeAQGcmVjaXBlCQC1CQIJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAUKcHJvZHVjdElkeAIBXwMJAQIhPQIJAJADAQUGcmVjaXBlCQBkAgUGTlVNUkVTAAMJAAIBCQCsAgICF0ZhdGFsOiB1bmtub3duIHJlY2lwZTogCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgEDnByb2R1Y3RDb250SWR4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGcmVjaXBlBRJyZWNpcGVJZHhDb250aW5lbnQDCQECIT0CCQCRAwIFCmNvbnRpbmVudHMFDnByb2R1Y3RDb250SWR4BQRjb250CQACAQkArAICCQCsAgIJAKwCAgIdVGhpcyBwcm9kdWN0IGlzIGF2YWlsYWJsZSBpbiAJAJEDAgUKY29udGluZW50cwUOcHJvZHVjdENvbnRJZHgCESwgYnV0IHlvdSBhcmUgaW4gBQRjb250BAhwcm9kTGlzdAMJAAACCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAAUDbmlsCQC1CQIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIBXwoBBmZpbGxlcgIDYWNjC2lnbm9y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aWwCAToEBnJlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsCQCUCgIFA25pbAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEXNldFdhcmVob3VzZU9yZGVyAgtuZXdPcmRlclN0cgtsYW5kQXNzZXRJZAQEdXNlcggFAWkMb3JpZ2luQ2FsbGVyBARhZGRyCQClCAEFBHVzZXIEBnJlc3VsdAMJAQIhPQIFBHVzZXIFDHJlc3RDb250cmFjdAkBDGNoZWNrQmxvY2tlZAAHBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMDCQECIT0CBQR1c2VyBQxyZXN0Q29udHJhY3QJAQIhPQIFBW93bmVyBQRhZGRyBwkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQIbmV3T3JkZXIJALwJAgULbmV3T3JkZXJTdHICAToEAndoCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIUZ2V0V2FyZWhvdXNlUkVBRE9OTFkJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAljdXJyZW50V2gJALwJAgUCd2gCAToEBGxvZnQJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAIBXwQHd2hUb3RhbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFCHZvbFRvdGFsBAZvcmRLZXkJAQ5rZXlPcmRlckJ5TGFuZAEFC2xhbmRBc3NldElkBApjdXJyZW50T3JkCQEIZ2V0T3JkZXIBBQZvcmRLZXkEAXoJAQtzZXRJbnRlcm5hbAMFCWN1cnJlbnRXaAUKY3VycmVudE9yZAUIbmV3T3JkZXIEC2J1eVZvbFNhbGRvCAUBegJfNAQMc2VsbFZvbFNhbGRvCAUBegJfNQQKd2hPY2N1cGllZAgFAXoCXzcECHdoTG9ja2VkCQBkAgULYnV5Vm9sU2FsZG8FDHNlbGxWb2xTYWxkbwQGd2hGcmVlCQBlAgkAZQIFB3doVG90YWwFCndoT2NjdXBpZWQFCHdoTG9ja2VkAwkAZgIAAAUGd2hGcmVlCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgITQXR0ZW1wdCB0byByZXNlcnZlIAkApAMBBQtidXlWb2xTYWxkbwIbIHNwYWNlIGZvciBidXkgb3JkZXJzLCBhbmQgCQCkAwEFDHNlbGxWb2xTYWxkbwIlIHNwYWNlIGZvciBzZWxsIG9yZGVycyAoYW5kIG9jY3VwaWVkPQkApAMBBQp3aE9jY3VwaWVkAh8pLCBsZWFkcyB0byBuZWdhdGl2ZSBmcmVlIHNwYWNlBAV3aFN0cgkAugkCCQDMCAIJAJEDAgUJY3VycmVudFdoBQt3aElkeExldmVscwkAzAgCCQC5CQIIBQF6Al8xAgFfCQDMCAIJALkJAggFAXoCXzICAV8JAMwIAgkAuQkCCAUBegJfMwIBXwkAzAgCCQCkAwEFCHdoTG9ja2VkBQNuaWwCAToEBndoU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDXNhdmVXYXJlaG91c2UJAMwIAgUFd2hTdHIJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAh1c2RTYWxkbwgFAXoCXzYEB2FjdGlvbnMDCQBmAgUIdXNkU2FsZG8AAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUDYW10BQh1c2RTYWxkbwkAAgEJAKwCAgISUGF5bWVudCBuZWVkZWQgaXMgCQCkAwEFCHVzZFNhbGRvCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQULbmV3T3JkZXJTdHIFA25pbAMJAAACBQh1c2RTYWxkbwAAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQISTm8gcGF5bWVudHMgbmVlZGVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQULbmV3T3JkZXJTdHIFA25pbAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECEk5vIHBheW1lbnRzIG5lZWRlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQVvd25lcgkBAS0BBQh1c2RTYWxkbwULdXNkdEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQtuZXdPcmRlclN0cgUDbmlsCQCUCgIFB2FjdGlvbnMJAJQKAgUGcmVzdWx0BQZ3aFNhdmUBaQEUYWNjZXB0V2FyZWhvdXNlT3JkZXIDCmJwT3JkZXJTdHILbGFuZEFzc2V0SWQLZHVja0Fzc2V0SWQEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQABAZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcgQKY2FsbGVyQWRkcgkApQgBBQZjYWxsZXIEEXN0YWtlZER1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQpjYWxsZXJBZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBRFzdGFrZWREdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OBANsb2MJALUJAgkBBXZhbHVlAQULY3VyTG9jYXRpb24CAV8DCQECIT0CCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIBTAkAAgEJAKwCAgkArAICAhZEdWNrIGxvY2F0aW9uIHR5cGUgaXMgCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIRLCBidXQgc2hvdWxkIGJlIEwDCQECIT0CBRFzdGFrZWREdWNrQXNzZXRJZAULZHVja0Fzc2V0SWQJAAIBCQCsAgIJAKwCAgkArAICAhRZb3VyIHN0YWtlZCBkdWNrIGlzIAURc3Rha2VkRHVja0Fzc2V0SWQCDSwgYnV0IHBhc3NlZCAFC2R1Y2tBc3NldElkBAlsYW5kQXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQlsYW5kQXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQECWxhbmRPd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFCWxhbmRBc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQAAAgUJbGFuZE93bmVyBQpjYWxsZXJBZGRyCQACAQIeWW91IGNhbm5vdCB0cmFkZSB3aXRoIHlvdXJzZWxmBAxicE9yZGVyUGFydHMJALwJAgUKYnBPcmRlclN0cgIBOgMJAQIhPQIJAJADAQUMYnBPcmRlclBhcnRzAAMJAAIBAjJicE9yZGVyU3RyIHNob3VsZCBjb250YWluIGV4YWN0bHkgMiAnOicgc2VwYXJhdG9ycwQIYnBPcmRSZXMJALUJAgkAkQMCBQxicE9yZGVyUGFydHMAAAIBXwQIYnBPcmRNYXQJALUJAgkAkQMCBQxicE9yZGVyUGFydHMAAQIBXwQJYnBPcmRQcm9kAwkAAAIJAJEDAgUMYnBPcmRlclBhcnRzAAICAAUDbmlsCQC1CQIJAJEDAgUMYnBPcmRlclBhcnRzAAICAV8DCQECIT0CCQCQAwEFCGJwT3JkUmVzBQZOVU1SRVMJAAIBAiBBbGwgNiByZXNvdXJjZXMgc2hvdWxkIGJlIHBhc3NlZAMJAQIhPQIJAJADAQUIYnBPcmRNYXQFBk5VTVJFUwkAAgECIEFsbCA2IG1hdGVyaWFscyBzaG91bGQgYmUgcGFzc2VkBAJ3aAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCFGdldFdhcmVob3VzZVJFQURPTkxZCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQJY3VycmVudFdoCQC8CQIFAndoAgE6BAljdXJyV2hSZXMJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfBAljdXJyV2hNYXQJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0AgFfBApjdXJyV2hQcm9kAwkAAAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAAUDbmlsCQC1CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAV8ED2N1cnJXaExvY2tlZFZvbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAIBXwUJdm9sTG9ja2VkBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQJYnBSZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBAlicE1hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8ECmJwUHJvZExpc3QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8EBm9yZEtleQkBDmtleU9yZGVyQnlMYW5kAQULbGFuZEFzc2V0SWQEBXdoT3JkCQEIZ2V0T3JkZXIBBQZvcmRLZXkE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ZgIAAAkAZQIFD2N1cnJXaExvY2tlZFZvbAUIdm9sU2FsZG8AAAkAZQIFD2N1cnJXaExvY2tlZFZvbAUIdm9sU2FsZG8EBXdoU3RyCQC6CQIJAMwIAgkAkQMCBQljdXJyZW50V2gFC3doSWR4TGV2ZWxzCQDMCAIJALkJAggFAXICXzECAV8JAMwIAgkAuQkCCAUBbQJfMQIBXwkAzAgCCQC5CQIIBQFwAl8xAgFfCQDMCAIJAKQDAQUMbmV3TG9ja2VkVm9sBQNuaWwCAToEC25ld1doT3JkU3RyCQC6CQIJAMwIAgkAuQkCCAUBcgJfMgIBXwkAzAgCCQC5CQIIBQFtAl8yAgFfCQDMCAIJALkJAggFAXACXzICAV8FA25pbAIBOgQIbmV3QnBTdHIJALoJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAggFAXICXzMCAV8JAMwIAgkAuQkCCAUBbQJfMwIBXwkAzAgCCQC5CQIIBQFwAl8zAgFfBQNuaWwCAToEBndoU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDXNhdmVXYXJlaG91c2UJAMwIAgUFd2hTdHIJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAZicFNhdmUJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQhuZXdCcFN0cgUDbmlsBQNuaWwEB2FjdGlvbnMJAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQtuZXdXaE9yZFN0cgUDbmlsBA11c2RXaDJCcFNhbGRvCAUBcAJfNQQIYWN0aW9uczEDCQBmAgUNdXNkV2gyQnBTYWxkbwAABAt1c2RXaDJCcEZlZQkAawMIBQFwAl81BQpBVUNUSU9ORkVFBQVNVUxUNgQIcmVmQnlLZXkJAQ9rZXlBZGRyZXNzUmVmQnkBBQpjYWxsZXJBZGRyBAVyZWZCeQkAnQgCBQ9zdGFraW5nQ29udHJhY3QFCHJlZkJ5S2V5AwkBCWlzRGVmaW5lZAEFBXJlZkJ5CQDNCAIJAM0IAgkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIJAGUCCAUBcAJfNQkAaAIAAwULdXNkV2gyQnBGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFC3VzZFdoMkJwRmVlBQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUFcmVmQnkFC3VzZFdoMkJwRmVlBQt1c2R0QXNzZXRJZAkAzQgCCQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgkAZQIIBQFwAl81CQBoAgADBQt1c2RXaDJCcEZlZQULdXNkdEFzc2V0SWQJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAULdXNkV2gyQnBGZWUFC3VzZHRBc3NldElkBQdhY3Rpb25zBA11c2RCcDJXaFNhbGRvCAUBcAJfNgQIYWN0aW9uczIDCQBmAgUNdXNkQnAyV2hTYWxkbwAAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEDCQECIT0CBQNhbXQFDXVzZEJwMldoU2FsZG8JAAIBCQCsAgICElBheW1lbnQgbmVlZGVkIGlzIAkApAMBBQ11c2RCcDJXaFNhbGRvAwkAZgIFDk1JTlNIT1BQQVlNRU5UBQNhbXQJAAIBCQCsAgICG1BheW1lbnQgc2hvdWxkIGJlIGF0IGxlYXN0IAkApAMBBQ5NSU5TSE9QUEFZTUVOVAQLdXNkQnAyV2hGZWUJAGsDCAUBcAJfNgUKQVVDVElPTkZFRQUFTVVMVDYECHJlZkJ5S2V5CQEPa2V5QWRkcmVzc1JlZkJ5AQUJbGFuZE93bmVyBAVyZWZCeQkAnQgCBQ9zdGFraW5nQ29udHJhY3QFCHJlZkJ5S2V5AwkBCWlzRGVmaW5lZAEFBXJlZkJ5CQDNCAIJAM0IAgkAzQgCBQhhY3Rpb25zMQkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbGFuZE93bmVyCQBlAggFAXACXzYJAGgCAAMFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQt1c2RCcDJXaEZlZQULdXNkdEFzc2V0SWQJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFBXJlZkJ5BQt1c2RCcDJXaEZlZQULdXNkdEFzc2V0SWQJAM0IAgkAzQgCBQhhY3Rpb25zMQkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbGFuZE93bmVyCQBlAggFAXACXzYJAGgCAAMFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQt1c2RCcDJXaEZlZQULdXNkdEFzc2V0SWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhJObyBwYXltZW50cyBuZWVkZWQFCGFjdGlvbnMxCQCUCgIFCGFjdGlvbnMyCQCVCgMFB2Jsb2NrZWQFBndoU2F2ZQUGYnBTYXZlAWkBEHNlbGxQcm9kdWN0c1RvRVMBB2Ftb3VudHMEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhJObyBwYXltZW50cyBuZWVkZWQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBQQkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBBaXJwb3J0LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQECHByb2RMaXN0AwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfBAVlc0tleQkBDmtleUVzV2FyZWhvdXNlAAQIZXhpc3RTdHIJAKIIAQUFZXNLZXkEDGV4aXN0QW1vdW50cwMJAQlpc0RlZmluZWQBBQhleGlzdFN0cgkAtQkCCQEFdmFsdWUBBQhleGlzdFN0cgIBXwUDbmlsCgEIbW92ZVByb2QCA2FjYwlyZWNpcGVTdHIEAWoIBQNhY2MCXzEECHF1YW50aXR5AwkAZgIJAJADAQUHYW1vdW50cwUBagkAkQMCBQdhbW91bnRzBQFqAAADCQBmAgAABQhxdWFudGl0eQkAAgECG1F1YW50aXR5IGNhbm5vdCBiZSBuZWdhdGl2ZQQGcmVjaXBlCQC1CQIFCXJlY2lwZVN0cgIBXwMJAQIhPQIJAJADAQUGcmVjaXBlCQBkAgUGTlVNUkVTAAMJAAIBCQCsAgICF0ZhdGFsOiB1bmtub3duIHJlY2lwZTogBQlyZWNpcGVTdHIECHBhY2tTaXplCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGcmVjaXBlBRFyZWNpcGVJZHhQYWNrc2l6ZQQJbWF4QW1vdW50CQBoAgUNRVNNQVhQQUNLQUdFUwUIcGFja1NpemUEC2V4aXN0QW1vdW50AwkAZgIJAJADAQUMZXhpc3RBbW91bnRzBQFqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUMZXhpc3RBbW91bnRzBQFqAAAEBmNhbkJ1eQkAZQIFCW1heEFtb3VudAULZXhpc3RB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", "height": 2642805, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BakS7xjhzDmNs3dopYyU59GWDFEnnYSRHkJTQmttissc Next: 4XMaEWwviF6xzTmQFhJ9SfWMHkkvwgmDgmKw4pw6AhG6 Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let LANDPREFIX = "LAND"
5+
6+let NUMRES = 6
7+
8+let DEFAULTLOCATION = "Africa_F_Africa"
9+
10+let RESOURCEPRICEMIN = 39637
11+
12+let ESMAXPACKAGES = 3
13+
14+let ESBUYCOEF = 4
15+
16+let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
17+
18+let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
19+
20+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"]
21+
22+let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
23+
24+let productionMatrix = ["1_1_1_2_2_5_1_10_0", "2_2_2_4_4_10_1_10_0", "3_3_3_6_6_15_1_10_0", "2_5_5_2_7_5_2_100_1", "4_10_10_4_14_10_2_100_1", "6_15_15_6_21_15_2_100_1", "1_1_1_1_1_8_1_10_2", "2_2_2_2_2_16_1_10_2", "3_3_3_3_3_24_1_10_2", "9_9_1_5_5_1_5_100_3", "18_18_2_10_10_2_5_100_3", "27_27_3_15_15_3_5_100_3", "2_2_1_2_2_2_1_10_4", "4_4_2_4_4_4_1_10_4", "6_6_3_6_6_6_1_10_4"]
25+
26+let recipeIdxPacksize = 7
27+
28+let recipeIdxContinent = 8
29+
30+let whIdxLevels = 0
31+
32+let whIdxRes = 1
33+
34+let whIdxMat = 2
35+
36+let whIdxProd = 3
37+
38+let whIdxLOFT = 4
39+
40+let volLocked = 0
41+
42+let volTotal = 3
43+
44+let bpIdxLevel = 0
45+
46+let bpIdxRes = 1
47+
48+let bpIdxMat = 2
49+
50+let bpIdxProd = 3
51+
52+func keyLandAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
53+
54+
55+func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
56+
57+
58+func keyAddressRefBy (addr) = ("accRefBy_" + addr)
59+
60+
61+func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
62+
63+
64+func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
65+
66+
67+func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
68+
69+
70+func keyBlocked () = "contractsBlocked"
71+
72+
73+func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
74+
75+
76+func keyEsWarehouse () = "emergencyWarehouseProducts"
77+
78+
79+let locIdxContinent = 0
80+
81+let locIdxType = 1
82+
83+let locIdxId = 2
84+
85+func getRecipeMaterials (recipe) = {
86+ func addMat (ac,j) = (ac + parseIntValue(recipe[j]))
87+
88+ let $l = [0, 1, 2, 3, 4, 5]
89+ let $s = size($l)
90+ let $acc0 = 0
91+ func $f0_1 ($a,$i) = if (($i >= $s))
92+ then $a
93+ else addMat($a, $l[$i])
94+
95+ func $f0_2 ($a,$i) = if (($i >= $s))
96+ then $a
97+ else throw("List size exceeds 6")
98+
99+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
100+ }
101+
102+
4103 let chain = take(drop(this.bytes, 1), 1)
5104
6105 let usdtAssetId = match chain {
21120 else throw("Unknown chain")
22121 }
23122
24-let InfraUpgradeCostS = match chain {
25- case _ =>
26- if ((base58'2W' == $match0))
27- then 10000000000
28- else if ((base58'2T' == $match0))
29- then 100000000
30- else throw("Unknown chain")
31-}
32-
33123 let SEP = "__"
34124
35125 let MULT6 = 1000000
40130
41131 let MULT10 = 10000000000
42132
43-let LANDPREFIX = "LAND"
44-
45-let DUCKPREFIX = "DUCK"
46-
47-let ARTPRESALE = "PRESALE"
48-
49-let NUMRES = 6
50-
51-let SSIZE = 25
52-
53-let MSIZE = 100
54-
55-let LSIZE = 225
56-
57-let XLSIZE = 400
58-
59-let XXLSIZE = 625
60-
61-let DAILYRESBYPIECE = 3456000
62-
63-let DAYMILLIS = 86400000
64-
65-let WHMULTIPLIER = 10000000000
66-
67-let DEFAULTLOCATION = "Africa_F_Africa"
68-
69-let RESOURCEPRICEMIN = 39637
70-
71-let ESMAXPACKAGES = 3
72-
73-let ESBUYCOEF = 4
74-
75-let ESSELLCOEF = 10
76-
77-let MAXHP = 100
78-
79-let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
80-
81-let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
82-
83-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"]
84-
85-let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
86-
87-let productionMatrix = ["1_1_1_2_2_5_1_10_0", "2_2_2_4_4_10_1_10_0", "3_3_3_6_6_15_1_10_0", "2_5_5_2_7_5_2_100_1", "4_10_10_4_14_10_2_100_1", "6_15_15_6_21_15_2_100_1", "1_1_1_1_1_8_1_10_2", "2_2_2_2_2_16_1_10_2", "3_3_3_3_3_24_1_10_2", "9_9_1_5_5_1_5_100_3", "18_18_2_10_10_2_5_100_3", "27_27_3_15_15_3_5_100_3", "2_2_1_2_2_2_1_10_4", "4_4_2_4_4_4_1_10_4", "6_6_3_6_6_6_1_10_4"]
88-
89-let contIdxAmericas = 0
90-
91-let contIdxEurope = 1
92-
93-let contIdxAsia = 2
94-
95-let contIdxAfrica = 3
96-
97-let contIdxOceania = 4
98-
99-let recipeIdxFuel = 0
100-
101-let recipeIdxMetal = 1
102-
103-let recipeIdxPlank = 2
104-
105-let recipeIdxGlass = 3
106-
107-let recipeIdxPlastic = 4
108-
109-let recipeIdxProtein = 5
110-
111-let recipeIdxWeight = 6
112-
113-let recipeIdxPacksize = 7
114-
115-let recipeIdxContinent = 8
116-
117-let recLandNum = 0
118-
119-let recLandSize = 1
120-
121-let recTerrains = 2
122-
123-let recContinent = 3
124-
125-let whIdxLevels = 0
126-
127-let whIdxRes = 1
128-
129-let whIdxMat = 2
130-
131-let whIdxProd = 3
132-
133-let whIdxLOFT = 4
134-
135-let volLocked = 0
136-
137-let volOccupied = 1
138-
139-let volFree = 2
140-
141-let volTotal = 3
142-
143-let bpIdxLevel = 0
144-
145-let bpIdxRes = 1
146-
147-let bpIdxMat = 2
148-
149-let bpIdxProd = 3
150-
151-func getPkgSize (prodIdx) = parseIntValue(split(productionMatrix[prodIdx], "_")[recipeIdxPacksize])
152-
153-
154133 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
155134
156135
157-func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
158-
159-
160136 let IdxCfgStakingDapp = 1
161-
162-let IdxCfgEconomyDapp = 2
163-
164-let IdxCfgGovernanceDapp = 3
165-
166-let IdxCfgWlgDapp = 4
167137
168138 func keyRestCfg () = "%s__restConfig"
169139
183153
184154 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
185155
186-let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
187-
188-let govContract = getContractAddressOrFail(restCfg, IdxCfgGovernanceDapp)
189-
190-let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
191-
192-func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
193-
194-
195-func keyLandAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
196-
197-
198-func keyLandAssetIdToCustomName (assetId) = ("landCustomNameByAssetId_" + assetId)
199-
200-
201-func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
202-
203-
204-func keyInfraLevelByAssetId (assetId) = ("infraLevel_" + assetId)
205-
206-
207-func keyLandArtStatusByTypeAndAssetId (type,assetId) = makeString(["landArtStatus", type, assetId], "_")
208-
209-
210-func keyStakedTimeByTypeAssetIdAndOwner (nftType,assetId,ownerAddr) = ((((("stakedTimeByTypeAssetIdAndOwner_" + nftType) + "_") + assetId) + "_") + ownerAddr)
211-
212-
213-func keyWarehouseByLand (landAssetId) = ("wareHouse_" + landAssetId)
214-
215-
216-func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
217-
218-
219-func keyStakedPiecesByOwner (ownerAddr) = ("stakedPiecesByOwner_" + ownerAddr)
220-
221-
222-func keyDuckAssetIdToCustomName (assetId) = ("duckCustomNameByAssetId_" + assetId)
223-
224-
225-func keyAddressToCustomName (addr) = ("accountCustomNameByAddr_" + addr)
226-
227-
228-func keyAddressRefBy (addr) = ("accRefBy_" + addr)
229-
230-
231-func keyAddressReferrals (addr) = ("accReferrals_" + addr)
232-
233-
234-func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
235-
236-
237-func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
238-
239-
240-func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
241-
242-
243-func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
244-
245-
246-func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
247-
248-
249-func keyResProportions () = "resTypesProportions"
250-
251-
252-func keyBlocked () = "contractsBlocked"
253-
254-
255-func keyUserGwlReleaseTime (userAddr) = ("%s%s__userGwlReleaseTime__" + userAddr)
256-
257-
258-func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
259-
260-
261-func keyEsWarehouse () = "emergencyWarehouseProducts"
262-
263-
264-let locIdxContinent = 0
265-
266-let locIdxType = 1
267-
268-let locIdxId = 2
269-
270156 func asString (v) = match v {
271157 case s: String =>
272158 s
275161 }
276162
277163
278-func asInt (v) = match v {
279- case n: Int =>
280- n
281- case _ =>
282- throw("fail to cast into Int")
283-}
284-
285-
286-func asAnyList (v) = match v {
287- case l: List[Any] =>
288- l
289- case _ =>
290- throw("fail to cast into List[Any]")
291-}
292-
293-
294-func asBoolean (v) = match v {
295- case s: Boolean =>
296- s
297- case _ =>
298- throw("fail to cast into Boolean")
299-}
300-
301-
302-func numPiecesBySize (landSize) = match landSize {
303- case _ =>
304- if (("S" == $match0))
305- then SSIZE
306- else if (("M" == $match0))
307- then MSIZE
308- else if (("L" == $match0))
309- then LSIZE
310- else if (("XL" == $match0))
311- then XLSIZE
312- else if (("XXL" == $match0))
313- then XXLSIZE
314- else throw("Unknown land size")
315-}
316-
317-
318-let IdxEffTotal = 0
319-
320-let IdxEffUser = 1
321-
322-func getVotingPower (userAddrStrOrEmpty) = {
323- let props = split(valueOrElse(getString(stakingContract, keyResProportions()), "0_0_0_0_0_0"), "_")
324- func adder (acc,item) = (acc + parseIntValue(item))
325-
326- let totalPower = {
327- let $l = props
328- let $s = size($l)
329- let $acc0 = 0
330- func $f0_1 ($a,$i) = if (($i >= $s))
331- then $a
332- else adder($a, $l[$i])
333-
334- func $f0_2 ($a,$i) = if (($i >= $s))
335- then $a
336- else throw("List size exceeds 6")
337-
338- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
339- }
340- let usersPower = if ((userAddrStrOrEmpty == ""))
341- then 0
342- else {
343- let landsStr = getString(stakingContract, keyStakedLandsByOwner(userAddrStrOrEmpty))
344- let lands = if (isDefined(landsStr))
345- then split_51C(value(landsStr), "_")
346- else nil
347- func oneLand (acc,landAssetId) = {
348- let asset = value(assetInfo(fromBase58String(landAssetId)))
349- let landSize = split(asset.description, "_")[recLandSize]
350- (acc + numPiecesBySize(landSize))
351- }
352-
353- let $l = lands
354- let $s = size($l)
355- let $acc0 = 0
356- func $f1_1 ($a,$i) = if (($i >= $s))
357- then $a
358- else oneLand($a, $l[$i])
359-
360- func $f1_2 ($a,$i) = if (($i >= $s))
361- then $a
362- else throw("List size exceeds 100")
363-
364- $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_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), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
365- }
366-[totalPower, usersPower]
367- }
368-
369-
370-func getRecipeMaterials (recipe) = {
371- func addMat (ac,j) = (ac + parseIntValue(recipe[j]))
372-
373- let $l = [0, 1, 2, 3, 4, 5]
374- let $s = size($l)
375- let $acc0 = 0
376- func $f0_1 ($a,$i) = if (($i >= $s))
377- then $a
378- else addMat($a, $l[$i])
379-
380- func $f0_2 ($a,$i) = if (($i >= $s))
381- then $a
382- else throw("List size exceeds 6")
383-
384- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
385- }
386-
387-
388164 let FACTORYMAXWAREHOUSE = 10000000000
389-
390-let MINPAYMENT = 10000
391165
392166 let SELLMULTIPLIER = 200
393167
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let LANDPREFIX = "LAND"
5+
6+let NUMRES = 6
7+
8+let DEFAULTLOCATION = "Africa_F_Africa"
9+
10+let RESOURCEPRICEMIN = 39637
11+
12+let ESMAXPACKAGES = 3
13+
14+let ESBUYCOEF = 4
15+
16+let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
17+
18+let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
19+
20+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"]
21+
22+let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
23+
24+let productionMatrix = ["1_1_1_2_2_5_1_10_0", "2_2_2_4_4_10_1_10_0", "3_3_3_6_6_15_1_10_0", "2_5_5_2_7_5_2_100_1", "4_10_10_4_14_10_2_100_1", "6_15_15_6_21_15_2_100_1", "1_1_1_1_1_8_1_10_2", "2_2_2_2_2_16_1_10_2", "3_3_3_3_3_24_1_10_2", "9_9_1_5_5_1_5_100_3", "18_18_2_10_10_2_5_100_3", "27_27_3_15_15_3_5_100_3", "2_2_1_2_2_2_1_10_4", "4_4_2_4_4_4_1_10_4", "6_6_3_6_6_6_1_10_4"]
25+
26+let recipeIdxPacksize = 7
27+
28+let recipeIdxContinent = 8
29+
30+let whIdxLevels = 0
31+
32+let whIdxRes = 1
33+
34+let whIdxMat = 2
35+
36+let whIdxProd = 3
37+
38+let whIdxLOFT = 4
39+
40+let volLocked = 0
41+
42+let volTotal = 3
43+
44+let bpIdxLevel = 0
45+
46+let bpIdxRes = 1
47+
48+let bpIdxMat = 2
49+
50+let bpIdxProd = 3
51+
52+func keyLandAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
53+
54+
55+func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
56+
57+
58+func keyAddressRefBy (addr) = ("accRefBy_" + addr)
59+
60+
61+func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
62+
63+
64+func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
65+
66+
67+func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
68+
69+
70+func keyBlocked () = "contractsBlocked"
71+
72+
73+func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
74+
75+
76+func keyEsWarehouse () = "emergencyWarehouseProducts"
77+
78+
79+let locIdxContinent = 0
80+
81+let locIdxType = 1
82+
83+let locIdxId = 2
84+
85+func getRecipeMaterials (recipe) = {
86+ func addMat (ac,j) = (ac + parseIntValue(recipe[j]))
87+
88+ let $l = [0, 1, 2, 3, 4, 5]
89+ let $s = size($l)
90+ let $acc0 = 0
91+ func $f0_1 ($a,$i) = if (($i >= $s))
92+ then $a
93+ else addMat($a, $l[$i])
94+
95+ func $f0_2 ($a,$i) = if (($i >= $s))
96+ then $a
97+ else throw("List size exceeds 6")
98+
99+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
100+ }
101+
102+
4103 let chain = take(drop(this.bytes, 1), 1)
5104
6105 let usdtAssetId = match chain {
7106 case _ =>
8107 if ((base58'2W' == $match0))
9108 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
10109 else if ((base58'2T' == $match0))
11110 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
12111 else throw("Unknown chain")
13112 }
14113
15114 let defaultRestAddressStr = match chain {
16115 case _ =>
17116 if ((base58'2W' == $match0))
18117 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
19118 else if ((base58'2T' == $match0))
20119 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
21120 else throw("Unknown chain")
22121 }
23122
24-let InfraUpgradeCostS = match chain {
25- case _ =>
26- if ((base58'2W' == $match0))
27- then 10000000000
28- else if ((base58'2T' == $match0))
29- then 100000000
30- else throw("Unknown chain")
31-}
32-
33123 let SEP = "__"
34124
35125 let MULT6 = 1000000
36126
37127 let MULT7 = 10000000
38128
39129 let MULT8 = 100000000
40130
41131 let MULT10 = 10000000000
42132
43-let LANDPREFIX = "LAND"
44-
45-let DUCKPREFIX = "DUCK"
46-
47-let ARTPRESALE = "PRESALE"
48-
49-let NUMRES = 6
50-
51-let SSIZE = 25
52-
53-let MSIZE = 100
54-
55-let LSIZE = 225
56-
57-let XLSIZE = 400
58-
59-let XXLSIZE = 625
60-
61-let DAILYRESBYPIECE = 3456000
62-
63-let DAYMILLIS = 86400000
64-
65-let WHMULTIPLIER = 10000000000
66-
67-let DEFAULTLOCATION = "Africa_F_Africa"
68-
69-let RESOURCEPRICEMIN = 39637
70-
71-let ESMAXPACKAGES = 3
72-
73-let ESBUYCOEF = 4
74-
75-let ESSELLCOEF = 10
76-
77-let MAXHP = 100
78-
79-let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
80-
81-let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
82-
83-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"]
84-
85-let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
86-
87-let productionMatrix = ["1_1_1_2_2_5_1_10_0", "2_2_2_4_4_10_1_10_0", "3_3_3_6_6_15_1_10_0", "2_5_5_2_7_5_2_100_1", "4_10_10_4_14_10_2_100_1", "6_15_15_6_21_15_2_100_1", "1_1_1_1_1_8_1_10_2", "2_2_2_2_2_16_1_10_2", "3_3_3_3_3_24_1_10_2", "9_9_1_5_5_1_5_100_3", "18_18_2_10_10_2_5_100_3", "27_27_3_15_15_3_5_100_3", "2_2_1_2_2_2_1_10_4", "4_4_2_4_4_4_1_10_4", "6_6_3_6_6_6_1_10_4"]
88-
89-let contIdxAmericas = 0
90-
91-let contIdxEurope = 1
92-
93-let contIdxAsia = 2
94-
95-let contIdxAfrica = 3
96-
97-let contIdxOceania = 4
98-
99-let recipeIdxFuel = 0
100-
101-let recipeIdxMetal = 1
102-
103-let recipeIdxPlank = 2
104-
105-let recipeIdxGlass = 3
106-
107-let recipeIdxPlastic = 4
108-
109-let recipeIdxProtein = 5
110-
111-let recipeIdxWeight = 6
112-
113-let recipeIdxPacksize = 7
114-
115-let recipeIdxContinent = 8
116-
117-let recLandNum = 0
118-
119-let recLandSize = 1
120-
121-let recTerrains = 2
122-
123-let recContinent = 3
124-
125-let whIdxLevels = 0
126-
127-let whIdxRes = 1
128-
129-let whIdxMat = 2
130-
131-let whIdxProd = 3
132-
133-let whIdxLOFT = 4
134-
135-let volLocked = 0
136-
137-let volOccupied = 1
138-
139-let volFree = 2
140-
141-let volTotal = 3
142-
143-let bpIdxLevel = 0
144-
145-let bpIdxRes = 1
146-
147-let bpIdxMat = 2
148-
149-let bpIdxProd = 3
150-
151-func getPkgSize (prodIdx) = parseIntValue(split(productionMatrix[prodIdx], "_")[recipeIdxPacksize])
152-
153-
154133 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
155134
156135
157-func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
158-
159-
160136 let IdxCfgStakingDapp = 1
161-
162-let IdxCfgEconomyDapp = 2
163-
164-let IdxCfgGovernanceDapp = 3
165-
166-let IdxCfgWlgDapp = 4
167137
168138 func keyRestCfg () = "%s__restConfig"
169139
170140
171141 func keyRestAddress () = "%s__restAddr"
172142
173143
174144 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
175145
176146
177147 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
178148
179149
180150 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
181151
182152 let restCfg = readRestCfgOrFail(restContract)
183153
184154 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
185155
186-let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
187-
188-let govContract = getContractAddressOrFail(restCfg, IdxCfgGovernanceDapp)
189-
190-let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
191-
192-func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
193-
194-
195-func keyLandAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
196-
197-
198-func keyLandAssetIdToCustomName (assetId) = ("landCustomNameByAssetId_" + assetId)
199-
200-
201-func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
202-
203-
204-func keyInfraLevelByAssetId (assetId) = ("infraLevel_" + assetId)
205-
206-
207-func keyLandArtStatusByTypeAndAssetId (type,assetId) = makeString(["landArtStatus", type, assetId], "_")
208-
209-
210-func keyStakedTimeByTypeAssetIdAndOwner (nftType,assetId,ownerAddr) = ((((("stakedTimeByTypeAssetIdAndOwner_" + nftType) + "_") + assetId) + "_") + ownerAddr)
211-
212-
213-func keyWarehouseByLand (landAssetId) = ("wareHouse_" + landAssetId)
214-
215-
216-func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
217-
218-
219-func keyStakedPiecesByOwner (ownerAddr) = ("stakedPiecesByOwner_" + ownerAddr)
220-
221-
222-func keyDuckAssetIdToCustomName (assetId) = ("duckCustomNameByAssetId_" + assetId)
223-
224-
225-func keyAddressToCustomName (addr) = ("accountCustomNameByAddr_" + addr)
226-
227-
228-func keyAddressRefBy (addr) = ("accRefBy_" + addr)
229-
230-
231-func keyAddressReferrals (addr) = ("accReferrals_" + addr)
232-
233-
234-func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
235-
236-
237-func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
238-
239-
240-func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
241-
242-
243-func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
244-
245-
246-func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
247-
248-
249-func keyResProportions () = "resTypesProportions"
250-
251-
252-func keyBlocked () = "contractsBlocked"
253-
254-
255-func keyUserGwlReleaseTime (userAddr) = ("%s%s__userGwlReleaseTime__" + userAddr)
256-
257-
258-func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
259-
260-
261-func keyEsWarehouse () = "emergencyWarehouseProducts"
262-
263-
264-let locIdxContinent = 0
265-
266-let locIdxType = 1
267-
268-let locIdxId = 2
269-
270156 func asString (v) = match v {
271157 case s: String =>
272158 s
273159 case _ =>
274160 throw("fail to cast into String")
275161 }
276162
277163
278-func asInt (v) = match v {
279- case n: Int =>
280- n
281- case _ =>
282- throw("fail to cast into Int")
283-}
284-
285-
286-func asAnyList (v) = match v {
287- case l: List[Any] =>
288- l
289- case _ =>
290- throw("fail to cast into List[Any]")
291-}
292-
293-
294-func asBoolean (v) = match v {
295- case s: Boolean =>
296- s
297- case _ =>
298- throw("fail to cast into Boolean")
299-}
300-
301-
302-func numPiecesBySize (landSize) = match landSize {
303- case _ =>
304- if (("S" == $match0))
305- then SSIZE
306- else if (("M" == $match0))
307- then MSIZE
308- else if (("L" == $match0))
309- then LSIZE
310- else if (("XL" == $match0))
311- then XLSIZE
312- else if (("XXL" == $match0))
313- then XXLSIZE
314- else throw("Unknown land size")
315-}
316-
317-
318-let IdxEffTotal = 0
319-
320-let IdxEffUser = 1
321-
322-func getVotingPower (userAddrStrOrEmpty) = {
323- let props = split(valueOrElse(getString(stakingContract, keyResProportions()), "0_0_0_0_0_0"), "_")
324- func adder (acc,item) = (acc + parseIntValue(item))
325-
326- let totalPower = {
327- let $l = props
328- let $s = size($l)
329- let $acc0 = 0
330- func $f0_1 ($a,$i) = if (($i >= $s))
331- then $a
332- else adder($a, $l[$i])
333-
334- func $f0_2 ($a,$i) = if (($i >= $s))
335- then $a
336- else throw("List size exceeds 6")
337-
338- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
339- }
340- let usersPower = if ((userAddrStrOrEmpty == ""))
341- then 0
342- else {
343- let landsStr = getString(stakingContract, keyStakedLandsByOwner(userAddrStrOrEmpty))
344- let lands = if (isDefined(landsStr))
345- then split_51C(value(landsStr), "_")
346- else nil
347- func oneLand (acc,landAssetId) = {
348- let asset = value(assetInfo(fromBase58String(landAssetId)))
349- let landSize = split(asset.description, "_")[recLandSize]
350- (acc + numPiecesBySize(landSize))
351- }
352-
353- let $l = lands
354- let $s = size($l)
355- let $acc0 = 0
356- func $f1_1 ($a,$i) = if (($i >= $s))
357- then $a
358- else oneLand($a, $l[$i])
359-
360- func $f1_2 ($a,$i) = if (($i >= $s))
361- then $a
362- else throw("List size exceeds 100")
363-
364- $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_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), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
365- }
366-[totalPower, usersPower]
367- }
368-
369-
370-func getRecipeMaterials (recipe) = {
371- func addMat (ac,j) = (ac + parseIntValue(recipe[j]))
372-
373- let $l = [0, 1, 2, 3, 4, 5]
374- let $s = size($l)
375- let $acc0 = 0
376- func $f0_1 ($a,$i) = if (($i >= $s))
377- then $a
378- else addMat($a, $l[$i])
379-
380- func $f0_2 ($a,$i) = if (($i >= $s))
381- then $a
382- else throw("List size exceeds 6")
383-
384- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
385- }
386-
387-
388164 let FACTORYMAXWAREHOUSE = 10000000000
389-
390-let MINPAYMENT = 10000
391165
392166 let SELLMULTIPLIER = 200
393167
394168 let BUYMULTIPLIER = 300
395169
396170 let AUCTIONFEE = 10000
397171
398172 let MINSHOPPAYMENT = 100000
399173
400174 func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
401175
402176
403177 let ordIdxRes = 0
404178
405179 let ordIdxMat = 1
406180
407181 let ordIdxProd = 2
408182
409183 func getOrder (ordKey) = {
410184 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:"), ":")
411185 [if ((size(split(p[ordIdxRes], "_")) == NUMRES))
412186 then p[ordIdxRes]
413187 else "0@0_0@0_0@0_0@0_0@0_0@0", if ((size(split(p[ordIdxMat], "_")) == NUMRES))
414188 then p[ordIdxMat]
415189 else "0@0_0@0_0@0_0@0_0@0_0@0", p[ordIdxProd]]
416190 }
417191
418192
419193 func toVolume (amount,pkgSize,isProduct) = if (isProduct)
420194 then {
421195 let pkgs = if ((amount >= 0))
422196 then (((amount + pkgSize) - 1) / pkgSize)
423197 else -((((-(amount) + pkgSize) - 1) / pkgSize))
424198 (pkgs * MULT8)
425199 }
426200 else amount
427201
428202
429203 func sellInternal (locId,resType,amount,minPrice) = {
430204 let whKey = keyFactoryWarehouseByIdAndType(locId, resType)
431205 let w0 = valueOrElse(getInteger(whKey), 0)
432206 let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
433207 then 0
434208 else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
435209 then (FACTORYMAXWAREHOUSE - w0)
436210 else amount
437211 let usdtReceived = (fraction(r0, ((SELLMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) + (50 * r0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction((amount - r0), RESOURCEPRICEMIN, MULT8))
438212 let min99 = (minPrice - (minPrice / 100))
439213 if (((min99 * amount) > (usdtReceived * MULT8)))
440214 then throw((((((((((("Actual price = " + toString(usdtReceived)) + " / ") + toString(amount)) + " < minPrice = ") + toString(minPrice)) + ", (") + locId) + ", ") + resTypes[resType]) + ")"))
441215 else $Tuple2(IntegerEntry(whKey, (w0 + amount)), usdtReceived)
442216 }
443217
444218
445219 func buyInternal (locId,matType,amount,maxPrice) = {
446220 let whKey = keyFactoryWarehouseByIdAndType(locId, matType)
447221 let w0 = valueOrElse(getInteger(whKey), 0)
448222 let m1 = if ((w0 > FACTORYMAXWAREHOUSE))
449223 then min([amount, (w0 - FACTORYMAXWAREHOUSE)])
450224 else 0
451225 let m0 = min([w0, (amount - m1)])
452226 let m = (m0 + m1)
453227 let usdtSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
454228 let max101 = (maxPrice + (maxPrice / 100))
455229 if (((usdtSpent * MULT8) > (max101 * m)))
456230 then throw((((((((((("Actual price = " + toString(usdtSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
457231 else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdtSpent, m)
458232 }
459233
460234
461235 func getBackpack (bpKey) = {
462236 let p = split(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
463237 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
464238 then p[bpIdxRes]
465239 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
466240 then p[bpIdxMat]
467241 else "0_0_0_0_0_0", p[bpIdxProd]]
468242 }
469243
470244
471245 func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
472246 then throw("Contracts are under maintenance")
473247 else unit
474248
475249
476250 func setCommon (acc,item) = {
477251 let j = acc._1
478252 let isProd = acc._8
479253 let pkgSize = if (isProd)
480254 then parseIntValue(split(productionMatrix[j], "_")[recipeIdxPacksize])
481255 else 0
482256 let itemParts = split(item, "@")
483257 if ((size(itemParts) != 2))
484258 then throw("Incorrect order format, should be amount@price")
485259 else {
486260 let newOrdAm = parseIntValue(itemParts[0])
487261 let newOrdPr = parseIntValue(itemParts[1])
488262 let newOrdUsd = fraction(newOrdAm, newOrdPr, MULT8)
489263 let newOrdVol = toVolume(newOrdAm, pkgSize, isProd)
490264 let whInit = if ((size(acc._6) > j))
491265 then parseIntValue(acc._6[j])
492266 else 0
493267 let curOrdParts = split(if ((size(acc._7) > j))
494268 then acc._7[j]
495269 else "0@0", "@")
496270 let curOrdAm = parseIntValue(curOrdParts[0])
497271 let curOrdPr = parseIntValue(curOrdParts[1])
498272 if (if ((0 > curOrdPr))
499273 then true
500274 else (0 > newOrdPr))
501275 then throw("Price can't be negative")
502276 else {
503277 let curOrdUsd = fraction(curOrdAm, curOrdPr, MULT8)
504278 if ((newOrdAm == 0))
505279 then if ((curOrdAm > 0))
506280 then $Tuple9((j + 1), (acc._2 :+ toString(whInit)), acc._3, acc._4, (acc._5 - curOrdUsd), acc._6, acc._7, isProd, (acc._9 + toVolume(whInit, pkgSize, isProd)))
507281 else $Tuple9((j + 1), (acc._2 :+ toString((whInit - curOrdAm))), acc._3, acc._4, acc._5, acc._6, acc._7, isProd, (acc._9 + toVolume((whInit - curOrdAm), pkgSize, isProd)))
508282 else if ((newOrdAm > 0))
509283 then if ((0 > curOrdAm))
510284 then $Tuple9((j + 1), (acc._2 :+ toString((whInit - curOrdAm))), (acc._3 + newOrdVol), acc._4, (acc._5 + newOrdUsd), acc._6, acc._7, isProd, toVolume((whInit - curOrdAm), pkgSize, isProd))
511285 else $Tuple9((j + 1), (acc._2 :+ toString(whInit)), (acc._3 + newOrdVol), acc._4, ((acc._5 + newOrdUsd) - curOrdUsd), acc._6, acc._7, isProd, toVolume(whInit, pkgSize, isProd))
512286 else if ((0 > curOrdAm))
513287 then {
514288 let amDiff = (curOrdAm - newOrdAm)
515289 if ((0 > (whInit - amDiff)))
516290 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whInit)) + " available"))
517291 else $Tuple9((j + 1), (acc._2 :+ toString((whInit - amDiff))), acc._3, (acc._4 - newOrdVol), acc._5, acc._6, acc._7, isProd, toVolume((whInit - amDiff), pkgSize, isProd))
518292 }
519293 else if ((0 > (whInit + newOrdAm)))
520294 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whInit)) + " available"))
521295 else $Tuple9((j + 1), (acc._2 :+ toString((whInit + newOrdAm))), acc._3, (acc._4 - newOrdVol), (acc._5 - curOrdUsd), acc._6, acc._7, isProd, toVolume((whInit + newOrdAm), pkgSize, isProd))
522296 }
523297 }
524298 }
525299
526300
527301 func setInternal (currentWh,currentOrd,newOrd) = {
528302 let currWhRes = split(currentWh[whIdxRes], "_")
529303 let currWhMat = split(currentWh[whIdxMat], "_")
530304 let currWhProd = if ((currentWh[whIdxProd] == ""))
531305 then nil
532306 else split(currentWh[whIdxProd], "_")
533307 let currentOrdRes = split(currentOrd[ordIdxRes], "_")
534308 let currentOrdMat = split(currentOrd[ordIdxMat], "_")
535309 let currentOrdProd = if ((currentOrd[ordIdxProd] == ""))
536310 then nil
537311 else split(currentOrd[ordIdxProd], "_")
538312 if ((size(newOrd) != 3))
539313 then throw("newOrderStr should contain exactly 2 ':' separators")
540314 else {
541315 let resParts = split(newOrd[0], "_")
542316 let matParts = split(newOrd[1], "_")
543317 let prodParts = if ((newOrd[2] == ""))
544318 then nil
545319 else split(newOrd[2], "_")
546320 if ((size(resParts) != NUMRES))
547321 then throw("All 6 resources should be passed")
548322 else if ((size(matParts) != NUMRES))
549323 then throw("All 6 materials should be passed")
550324 else {
551325 let r = {
552326 let $l = resParts
553327 let $s = size($l)
554328 let $acc0 = $Tuple9(0, nil, 0, 0, 0, currWhRes, currentOrdRes, false, 0)
555329 func $f0_1 ($a,$i) = if (($i >= $s))
556330 then $a
557331 else setCommon($a, $l[$i])
558332
559333 func $f0_2 ($a,$i) = if (($i >= $s))
560334 then $a
561335 else throw("List size exceeds 6")
562336
563337 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
564338 }
565339 let m = {
566340 let $l = matParts
567341 let $s = size($l)
568342 let $acc0 = $Tuple9(0, nil, r._3, r._4, r._5, currWhMat, currentOrdMat, false, r._9)
569343 func $f1_1 ($a,$i) = if (($i >= $s))
570344 then $a
571345 else setCommon($a, $l[$i])
572346
573347 func $f1_2 ($a,$i) = if (($i >= $s))
574348 then $a
575349 else throw("List size exceeds 6")
576350
577351 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
578352 }
579353 let p = if ((size(prodParts) != 0))
580354 then {
581355 let $l = prodParts
582356 let $s = size($l)
583357 let $acc0 = $Tuple9(0, nil, m._3, m._4, m._5, currWhProd, currentOrdProd, true, m._9)
584358 func $f2_1 ($a,$i) = if (($i >= $s))
585359 then $a
586360 else setCommon($a, $l[$i])
587361
588362 func $f2_2 ($a,$i) = if (($i >= $s))
589363 then $a
590364 else throw("List size exceeds 50")
591365
592366 $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)
593367 }
594368 else $Tuple9(0, currWhProd, m._3, m._4, m._5, currWhProd, currentOrdProd, true, m._9)
595369 $Tuple7(r._2, m._2, p._2, p._3, p._4, p._5, p._9)
596370 }
597371 }
598372 }
599373
600374
601375 func acceptCommon (acc,bpOrdItem) = {
602376 let j = acc._7
603377 let isProd = acc._12
604378 let pkgSize = if (isProd)
605379 then parseIntValue(split(productionMatrix[j], "_")[recipeIdxPacksize])
606380 else 0
607381 let bpOrdParts = split(bpOrdItem, "@")
608382 if ((size(bpOrdParts) != 2))
609383 then throw("Incorrect order format, should be amount@price")
610384 else {
611385 let bpOrdAm = parseIntValue(bpOrdParts[0])
612386 let bpOrdPr = parseIntValue(bpOrdParts[1])
613387 if ((0 > bpOrdPr))
614388 then throw("Price can't be negative")
615389 else {
616390 let bpOrdUsd = fraction(bpOrdAm, bpOrdPr, MULT8)
617391 let bpInit = if ((size(acc._8) > j))
618392 then parseIntValue(acc._8[j])
619393 else 0
620394 let whInit = if ((size(acc._9) > j))
621395 then parseIntValue(acc._9[j])
622396 else 0
623397 let whOrdInit = if ((size(acc._10) > j))
624398 then acc._10[j]
625399 else "0@0"
626400 let whOrdParts = split(whOrdInit, "@")
627401 let whOrdAm = parseIntValue(whOrdParts[0])
628402 let whOrdPr = parseIntValue(whOrdParts[1])
629403 if (if ((bpOrdAm != 0))
630404 then (bpOrdPr != whOrdPr)
631405 else false)
632406 then throw(((((("Prices of " + acc._11[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
633407 else {
634408 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
635409 let deltaVol = toVolume(bpOrdAm, pkgSize, isProd)
636410 if ((bpOrdAm == 0))
637411 then $Tuple12((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)
638412 else if ((bpOrdAm > 0))
639413 then if ((0 > whOrdAm))
640414 then if ((bpOrdAm > -(whOrdAm)))
641415 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + acc._11[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
642416 else $Tuple12((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)
643417 else throw((("Attempt to buy " + acc._11[j]) + " while warehouse doesn't sell it"))
644418 else if ((whOrdAm > 0))
645419 then if ((-(bpOrdAm) > whOrdAm))
646420 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + acc._11[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
647421 else if ((-(bpOrdAm) > bpInit))
648422 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + toString(bpInit)) + " of ") + acc._11[j]))
649423 else $Tuple12((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)
650424 else throw((("Attempt to sell " + acc._11[j]) + " while warehouse doesn't buy it"))
651425 }
652426 }
653427 }
654428 }
655429
656430
657431 @Callable(i)
658432 func recalcLockedVolumeREADONLY (landAssetId,wh) = {
659433 let currentOrd = getOrder(keyOrderByLand(landAssetId))
660434 let z = setInternal(wh, currentOrd, currentOrd)
661435 $Tuple2(nil, (z._4 + z._5))
662436 }
663437
664438
665439
666440 @Callable(i)
667441 func constructorV1 (restAddr) = if ((i.caller != this))
668442 then throw("Permission denied")
669443 else [StringEntry(keyRestAddress(), restAddr)]
670444
671445
672446
673447 @Callable(i)
674448 func sellResources (amounts,minPrices) = {
675449 let blocked = checkBlocked()
676450 if ((blocked == blocked))
677451 then {
678452 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
679453 if ((size(i.payments) != 0))
680454 then throw("sellResources doesn't require any payments")
681455 else {
682456 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
683457 if ((curLocation[locIdxType] != "F"))
684458 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
685459 else {
686460 let locId = curLocation[locIdxId]
687461 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
688462 let resList = split(currentPack[bpIdxRes], "_")
689463 func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
690464 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
691465 else if ((0 > amounts[j]))
692466 then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
693467 else if ((amounts[j] > 0))
694468 then {
695469 let b = sellInternal(locId, j, amounts[j], minPrices[j])
696470 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
697471 }
698472 else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
699473
700474 let merged = {
701475 let $l = [0, 1, 2, 3, 4, 5]
702476 let $s = size($l)
703477 let $acc0 = $Tuple3(nil, nil, 0)
704478 func $f0_1 ($a,$i) = if (($i >= $s))
705479 then $a
706480 else adder($a, $l[$i])
707481
708482 func $f0_2 ($a,$i) = if (($i >= $s))
709483 then $a
710484 else throw("List size exceeds 6")
711485
712486 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
713487 }
714488 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
715489 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
716490 $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdtAssetId)), result)
717491 }
718492 }
719493 }
720494 else throw("Strict value is not equal to itself.")
721495 }
722496
723497
724498
725499 @Callable(i)
726500 func buyMaterials (amounts,maxPrices) = {
727501 let blocked = checkBlocked()
728502 if ((blocked == blocked))
729503 then {
730504 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
731505 if ((size(i.payments) != 1))
732506 then throw("exactly 1 payment must be attached")
733507 else {
734508 let pmt = i.payments[0]
735509 let amt = pmt.amount
736510 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
737511 if ((pmtAssetId != usdtAssetId))
738512 then throw("USDT payments only!")
739513 else {
740514 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
741515 if ((curLocation[locIdxType] != "F"))
742516 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
743517 else {
744518 let locId = curLocation[locIdxId]
745519 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
746520 let matList = split(currentPack[bpIdxMat], "_")
747521 func mUpdater (acc,j) = if ((0 > amounts[j]))
748522 then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
749523 else if ((amounts[j] > 0))
750524 then {
751525 let b = buyInternal(locId, j, amounts[j], maxPrices[j])
752526 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2))
753527 }
754528 else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3)
755529
756530 let merged = {
757531 let $l = [0, 1, 2, 3, 4, 5]
758532 let $s = size($l)
759533 let $acc0 = $Tuple3(nil, nil, 0)
760534 func $f0_1 ($a,$i) = if (($i >= $s))
761535 then $a
762536 else mUpdater($a, $l[$i])
763537
764538 func $f0_2 ($a,$i) = if (($i >= $s))
765539 then $a
766540 else throw("List size exceeds 6")
767541
768542 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
769543 }
770544 if ((merged._3 > amt))
771545 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
772546 else {
773547 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
774548 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
775549 let rest = if (((amt - merged._3) > 0))
776550 then [ScriptTransfer(i.caller, (amt - merged._3), usdtAssetId)]
777551 else nil
778552 let activitiesAmount = (merged._3 / 100)
779553 $Tuple2(((merged._1 ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), result)
780554 }
781555 }
782556 }
783557 }
784558 }
785559 else throw("Strict value is not equal to itself.")
786560 }
787561
788562
789563
790564 @Callable(i)
791565 func exchangeResources (amounts) = {
792566 let blocked = checkBlocked()
793567 if ((blocked == blocked))
794568 then {
795569 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
796570 if ((size(i.payments) != 1))
797571 then throw("exactly 1 payment must be attached")
798572 else {
799573 let pmt = i.payments[0]
800574 let amt = pmt.amount
801575 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
802576 if ((pmtAssetId != usdtAssetId))
803577 then throw("USDT payments only!")
804578 else {
805579 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
806580 if ((curLocation[locIdxType] != "F"))
807581 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
808582 else {
809583 let locId = curLocation[locIdxId]
810584 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
811585 let resList = split(currentPack[bpIdxRes], "_")
812586 let matList = split(currentPack[bpIdxMat], "_")
813587 func exchanger (acc,j) = {
814588 let whKey = keyFactoryWarehouseByIdAndType(locId, j)
815589 let w0 = valueOrElse(getInteger(whKey), 0)
816590 let amj = amounts[j]
817591 if ((amj > parseIntValue(resList[j])))
818592 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to exchange ") + toString(amj)))
819593 else if ((0 > amj))
820594 then throw(((("You tried to exchange negative amount of " + resTypes[j]) + ": ") + toString(amj)))
821595 else if ((amj > 0))
822596 then $Tuple4((acc._1 :+ toString((parseIntValue(resList[j]) - amj))), (acc._2 :+ toString((parseIntValue(matList[j]) + amj))), (acc._3 + fraction(amj, RESOURCEPRICEMIN, MULT8)), (acc._4 :+ IntegerEntry(whKey, w0)))
823597 else $Tuple4((acc._1 :+ resList[j]), (acc._2 :+ matList[j]), acc._3, acc._4)
824598 }
825599
826600 let merged = {
827601 let $l = [0, 1, 2, 3, 4, 5]
828602 let $s = size($l)
829603 let $acc0 = $Tuple4(nil, nil, 0, nil)
830604 func $f0_1 ($a,$i) = if (($i >= $s))
831605 then $a
832606 else exchanger($a, $l[$i])
833607
834608 func $f0_2 ($a,$i) = if (($i >= $s))
835609 then $a
836610 else throw("List size exceeds 6")
837611
838612 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
839613 }
840614 if ((merged._3 > amt))
841615 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
842616 else {
843617 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._1, "_"), makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
844618 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
845619 let rest = if (((amt - merged._3) > 0))
846620 then [ScriptTransfer(i.caller, (amt - merged._3), usdtAssetId)]
847621 else nil
848622 let activitiesAmount = (merged._3 / 100)
849623 $Tuple2(((rest ++ merged._4) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), result)
850624 }
851625 }
852626 }
853627 }
854628 }
855629 else throw("Strict value is not equal to itself.")
856630 }
857631
858632
859633
860634 @Callable(i)
861635 func craftGoods (productIdx,quantity) = {
862636 let blocked = checkBlocked()
863637 if ((blocked == blocked))
864638 then if ((size(i.payments) != 1))
865639 then throw("exactly 1 payment must be attached")
866640 else {
867641 let pmt = i.payments[0]
868642 let amt = pmt.amount
869643 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
870644 if ((pmtAssetId != usdtAssetId))
871645 then throw("USDT payments only!")
872646 else if ((amt != MULT6))
873647 then throw("exactly 1 USDT must be attached as payment")
874648 else if ((0 >= quantity))
875649 then throw("Quantity should be positive")
876650 else {
877651 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
878652 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
879653 if ((curLocation[locIdxType] != "M"))
880654 then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
881655 else {
882656 let cont = curLocation[locIdxContinent]
883657 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
884658 let matList = split(currentPack[bpIdxMat], "_")
885659 if (if ((0 > productIdx))
886660 then true
887661 else (productIdx >= size(productionMatrix)))
888662 then throw(("Unknown product idx=" + toString(productIdx)))
889663 else {
890664 let recipe = split(productionMatrix[productIdx], "_")
891665 if ((size(recipe) != (NUMRES + 3)))
892666 then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
893667 else {
894668 let productContIdx = parseIntValue(recipe[recipeIdxContinent])
895669 if ((continents[productContIdx] != cont))
896670 then throw(((("This product is available in " + continents[productContIdx]) + ", but you are in ") + cont))
897671 else {
898672 let prodList = if ((currentPack[bpIdxProd] == ""))
899673 then nil
900674 else split(currentPack[bpIdxProd], "_")
901675 func filler (acc,ignoredItem) = {
902676 let n = acc._2
903677 let xs = if ((size(prodList) > n))
904678 then prodList[n]
905679 else "0"
906680 let x = parseIntValue(xs)
907681 let amount = (quantity * parseIntValue(recipe[recipeIdxPacksize]))
908682 let y = if ((n == productIdx))
909683 then toString((x + amount))
910684 else xs
911685 $Tuple2((acc._1 :+ y), (n + 1))
912686 }
913687
914688 let bpProd = ( let $l = productionMatrix
915689 let $s = size($l)
916690 let $acc0 = $Tuple2(nil, 0)
917691 func $f0_1 ($a,$i) = if (($i >= $s))
918692 then $a
919693 else filler($a, $l[$i])
920694
921695 func $f0_2 ($a,$i) = if (($i >= $s))
922696 then $a
923697 else throw("List size exceeds 50")
924698
925699 $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
926700 func producer (acc,j) = {
927701 let needMat = ((parseIntValue(recipe[j]) * MULT7) * quantity)
928702 let haveMat = parseIntValue(matList[j])
929703 if ((needMat > haveMat))
930704 then throw(((((((("You have " + matList[j]) + " of ") + matTypes[j]) + ", but recipe requires ") + toString(needMat)) + " for quantity ") + toString(quantity)))
931705 else if ((needMat > 0))
932706 then (acc :+ toString((haveMat - needMat)))
933707 else (acc :+ matList[j])
934708 }
935709
936710 let merged = {
937711 let $l = [0, 1, 2, 3, 4, 5]
938712 let $s = size($l)
939713 let $acc0 = nil
940714 func $f1_1 ($a,$i) = if (($i >= $s))
941715 then $a
942716 else producer($a, $l[$i])
943717
944718 func $f1_2 ($a,$i) = if (($i >= $s))
945719 then $a
946720 else throw("List size exceeds 6")
947721
948722 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
949723 }
950724 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged, "_"), makeString(bpProd, "_")], ":")
951725 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
952726 $Tuple2(nil, result)
953727 }
954728 }
955729 }
956730 }
957731 }
958732 }
959733 else throw("Strict value is not equal to itself.")
960734 }
961735
962736
963737
964738 @Callable(i)
965739 func setWarehouseOrder (newOrderStr,landAssetId) = {
966740 let user = i.originCaller
967741 let addr = toString(user)
968742 let result = if ((user != restContract))
969743 then checkBlocked()
970744 else false
971745 let asset = value(assetInfo(fromBase58String(landAssetId)))
972746 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
973747 then throw((("NFT " + asset.name) + " is not staked"))
974748 else {
975749 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
976750 if (if ((user != restContract))
977751 then (owner != addr)
978752 else false)
979753 then throw((LANDPREFIX + " is not yours"))
980754 else {
981755 let newOrder = split_4C(newOrderStr, ":")
982756 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
983757 let currentWh = split_4C(wh, ":")
984758 let loft = split(currentWh[whIdxLOFT], "_")
985759 let whTotal = parseIntValue(loft[volTotal])
986760 let ordKey = keyOrderByLand(landAssetId)
987761 let currentOrd = getOrder(ordKey)
988762 let z = setInternal(currentWh, currentOrd, newOrder)
989763 let buyVolSaldo = z._4
990764 let sellVolSaldo = z._5
991765 let whOccupied = z._7
992766 let whLocked = (buyVolSaldo + sellVolSaldo)
993767 let whFree = ((whTotal - whOccupied) - whLocked)
994768 if ((0 > whFree))
995769 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"))
996770 else {
997771 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(z._1, "_"), makeString(z._2, "_"), makeString(z._3, "_"), toString(whLocked)], ":")
998772 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
999773 let usdSaldo = z._6
1000774 let actions = if ((usdSaldo > 0))
1001775 then if ((size(i.payments) != 1))
1002776 then throw("exactly 1 payment must be attached")
1003777 else {
1004778 let pmt = i.payments[0]
1005779 let amt = pmt.amount
1006780 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
1007781 if ((pmtAssetId != usdtAssetId))
1008782 then throw("USDT payments only!")
1009783 else if ((amt != usdSaldo))
1010784 then throw(("Payment needed is " + toString(usdSaldo)))
1011785 else [StringEntry(ordKey, newOrderStr)]
1012786 }
1013787 else if ((usdSaldo == 0))
1014788 then if ((size(i.payments) != 0))
1015789 then throw("No payments needed")
1016790 else [StringEntry(ordKey, newOrderStr)]
1017791 else if ((size(i.payments) != 0))
1018792 then throw("No payments needed")
1019793 else [ScriptTransfer(addressFromStringValue(owner), -(usdSaldo), usdtAssetId), StringEntry(ordKey, newOrderStr)]
1020794 $Tuple2(actions, $Tuple2(result, whSave))
1021795 }
1022796 }
1023797 }
1024798 }
1025799
1026800
1027801
1028802 @Callable(i)
1029803 func acceptWarehouseOrder (bpOrderStr,landAssetId,duckAssetId) = {
1030804 let blocked = checkBlocked()
1031805 let caller = i.originCaller
1032806 let callerAddr = toString(caller)
1033807 let stakedDuckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
1034808 let curLocation = valueOrElse(getString(stakingContract, keyDuckLocation(stakedDuckAssetId)), DEFAULTLOCATION)
1035809 let loc = split(value(curLocation), "_")
1036810 if ((loc[locIdxType] != "L"))
1037811 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
1038812 else if ((stakedDuckAssetId != duckAssetId))
1039813 then throw(((("Your staked duck is " + stakedDuckAssetId) + ", but passed ") + duckAssetId))
1040814 else {
1041815 let landAsset = value(assetInfo(fromBase58String(landAssetId)))
1042816 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
1043817 then throw((("NFT " + landAsset.name) + " is not staked"))
1044818 else {
1045819 let landOwner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + landAsset.name) + " is orphaned"))
1046820 if ((landOwner == callerAddr))
1047821 then throw("You cannot trade with yourself")
1048822 else {
1049823 let bpOrderParts = split_4C(bpOrderStr, ":")
1050824 if ((size(bpOrderParts) != 3))
1051825 then throw("bpOrderStr should contain exactly 2 ':' separators")
1052826 else {
1053827 let bpOrdRes = split(bpOrderParts[0], "_")
1054828 let bpOrdMat = split(bpOrderParts[1], "_")
1055829 let bpOrdProd = if ((bpOrderParts[2] == ""))
1056830 then nil
1057831 else split(bpOrderParts[2], "_")
1058832 if ((size(bpOrdRes) != NUMRES))
1059833 then throw("All 6 resources should be passed")
1060834 else if ((size(bpOrdMat) != NUMRES))
1061835 then throw("All 6 materials should be passed")
1062836 else {
1063837 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
1064838 let currentWh = split_4C(wh, ":")
1065839 let currWhRes = split(currentWh[whIdxRes], "_")
1066840 let currWhMat = split(currentWh[whIdxMat], "_")
1067841 let currWhProd = if ((currentWh[whIdxProd] == ""))
1068842 then nil
1069843 else split(currentWh[whIdxProd], "_")
1070844 let currWhLockedVol = parseIntValue(split(currentWh[whIdxLOFT], "_")[volLocked])
1071845 let bpKey = keyBackpackByDuck(duckAssetId)
1072846 let currentPack = getBackpack(bpKey)
1073847 let bpResList = split(currentPack[bpIdxRes], "_")
1074848 let bpMatList = split(currentPack[bpIdxMat], "_")
1075849 let bpProdList = if ((currentPack[bpIdxProd] == ""))
1076850 then nil
1077851 else split(currentPack[bpIdxProd], "_")
1078852 let ordKey = keyOrderByLand(landAssetId)
1079853 let whOrd = getOrder(ordKey)
1080854 let whOrdRes = split(whOrd[ordIdxRes], "_")
1081855 let whOrdMat = split(whOrd[ordIdxMat], "_")
1082856 let whOrdProd = if ((whOrd[ordIdxProd] == ""))
1083857 then nil
1084858 else split(whOrd[ordIdxProd], "_")
1085859 let r = {
1086860 let $l = bpOrdRes
1087861 let $s = size($l)
1088862 let $acc0 = $Tuple12(nil, nil, nil, 0, 0, 0, 0, bpResList, currWhRes, whOrdRes, resTypes, false)
1089863 func $f0_1 ($a,$i) = if (($i >= $s))
1090864 then $a
1091865 else acceptCommon($a, $l[$i])
1092866
1093867 func $f0_2 ($a,$i) = if (($i >= $s))
1094868 then $a
1095869 else throw("List size exceeds 6")
1096870
1097871 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
1098872 }
1099873 let m = {
1100874 let $l = bpOrdMat
1101875 let $s = size($l)
1102876 let $acc0 = $Tuple12(nil, nil, nil, r._4, r._5, r._6, 0, bpMatList, currWhMat, whOrdMat, matTypes, false)
1103877 func $f1_1 ($a,$i) = if (($i >= $s))
1104878 then $a
1105879 else acceptCommon($a, $l[$i])
1106880
1107881 func $f1_2 ($a,$i) = if (($i >= $s))
1108882 then $a
1109883 else throw("List size exceeds 6")
1110884
1111885 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
1112886 }
1113887 let p = if ((size(bpOrdProd) != 0))
1114888 then {
1115889 let $l = bpOrdProd
1116890 let $s = size($l)
1117891 let $acc0 = $Tuple12(nil, nil, nil, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd, prodTypes, true)
1118892 func $f2_1 ($a,$i) = if (($i >= $s))
1119893 then $a
1120894 else acceptCommon($a, $l[$i])
1121895
1122896 func $f2_2 ($a,$i) = if (($i >= $s))
1123897 then $a
1124898 else throw("List size exceeds 50")
1125899
1126900 $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)
1127901 }
1128902 else $Tuple12(currWhProd, whOrdProd, bpProdList, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd, prodTypes, true)
1129903 let volSaldo = p._4
1130904 let newLockedVol = if ((0 > (currWhLockedVol - volSaldo)))
1131905 then 0
1132906 else (currWhLockedVol - volSaldo)
1133907 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(r._1, "_"), makeString(m._1, "_"), makeString(p._1, "_"), toString(newLockedVol)], ":")
1134908 let newWhOrdStr = makeString_2C([makeString(r._2, "_"), makeString(m._2, "_"), makeString(p._2, "_")], ":")
1135909 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(r._3, "_"), makeString(m._3, "_"), makeString(p._3, "_")], ":")
1136910 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
1137911 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
1138912 let actions = [StringEntry(ordKey, newWhOrdStr)]
1139913 let usdWh2BpSaldo = p._5
1140914 let actions1 = if ((usdWh2BpSaldo > 0))
1141915 then {
1142916 let usdWh2BpFee = fraction(p._5, AUCTIONFEE, MULT6)
1143917 let refByKey = keyAddressRefBy(callerAddr)
1144918 let refBy = getString(stakingContract, refByKey)
1145919 if (isDefined(refBy))
1146920 then (((actions :+ ScriptTransfer(caller, (p._5 - (3 * usdWh2BpFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdWh2BpFee, usdtAssetId)) :+ ScriptTransfer(addressFromStringValue(value(refBy)), usdWh2BpFee, usdtAssetId))
1147921 else ((actions :+ ScriptTransfer(caller, (p._5 - (3 * usdWh2BpFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdWh2BpFee, usdtAssetId))
1148922 }
1149923 else actions
1150924 let usdBp2WhSaldo = p._6
1151925 let actions2 = if ((usdBp2WhSaldo > 0))
1152926 then if ((size(i.payments) != 1))
1153927 then throw("exactly 1 payment must be attached")
1154928 else {
1155929 let pmt = i.payments[0]
1156930 let amt = pmt.amount
1157931 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
1158932 if ((pmtAssetId != usdtAssetId))
1159933 then throw("USDT payments only!")
1160934 else if ((amt != usdBp2WhSaldo))
1161935 then throw(("Payment needed is " + toString(usdBp2WhSaldo)))
1162936 else if ((MINSHOPPAYMENT > amt))
1163937 then throw(("Payment should be at least " + toString(MINSHOPPAYMENT)))
1164938 else {
1165939 let usdBp2WhFee = fraction(p._6, AUCTIONFEE, MULT6)
1166940 let refByKey = keyAddressRefBy(landOwner)
1167941 let refBy = getString(stakingContract, refByKey)
1168942 if (isDefined(refBy))
1169943 then (((actions1 :+ ScriptTransfer(addressFromStringValue(landOwner), (p._6 - (3 * usdBp2WhFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdBp2WhFee, usdtAssetId)) :+ ScriptTransfer(addressFromStringValue(value(refBy)), usdBp2WhFee, usdtAssetId))
1170944 else ((actions1 :+ ScriptTransfer(addressFromStringValue(landOwner), (p._6 - (3 * usdBp2WhFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdBp2WhFee, usdtAssetId))
1171945 }
1172946 }
1173947 else if ((size(i.payments) != 0))
1174948 then throw("No payments needed")
1175949 else actions1
1176950 $Tuple2(actions2, $Tuple3(blocked, whSave, bpSave))
1177951 }
1178952 }
1179953 }
1180954 }
1181955 }
1182956 }
1183957
1184958
1185959
1186960 @Callable(i)
1187961 func sellProductsToES (amounts) = {
1188962 let blocked = checkBlocked()
1189963 if ((blocked == blocked))
1190964 then if ((size(i.payments) != 0))
1191965 then throw("No payments needed")
1192966 else {
1193967 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
1194968 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
1195969 if ((curLocation[locIdxType] != "A"))
1196970 then throw(("Duck location type should be Airport, but is " + curLocation[locIdxType]))
1197971 else {
1198972 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
1199973 let prodList = if ((currentPack[bpIdxProd] == ""))
1200974 then nil
1201975 else split(currentPack[bpIdxProd], "_")
1202976 let esKey = keyEsWarehouse()
1203977 let existStr = getString(esKey)
1204978 let existAmounts = if (isDefined(existStr))
1205979 then split(value(existStr), "_")
1206980 else nil
1207981 func moveProd (acc,recipeStr) = {
1208982 let j = acc._1
1209983 let quantity = if ((size(amounts) > j))
1210984 then amounts[j]
1211985 else 0
1212986 if ((0 > quantity))
1213987 then throw("Quantity cannot be negative")
1214988 else {
1215989 let recipe = split(recipeStr, "_")
1216990 if ((size(recipe) != (NUMRES + 3)))
1217991 then throw(("Fatal: unknown recipe: " + recipeStr))
1218992 else {
1219993 let packSize = parseIntValue(recipe[recipeIdxPacksize])
1220994 let maxAmount = (ESMAXPACKAGES * packSize)
1221995 let existAmount = if ((size(existAmounts) > j))
1222996 then parseIntValue(existAmounts[j])
1223997 else 0
1224998 let canBuy = (maxAmount - existAmount)
1225999 if ((quantity > canBuy))
12261000 then throw(((("Warehouse can buy only " + toString(canBuy)) + " of ") + prodTypes[j]))
12271001 else {
12281002 let totalMat = getRecipeMaterials(recipe)
12291003 let unitPrice = fraction((totalMat * ESBUYCOEF), RESOURCEPRICEMIN, (10 * packSize))
12301004 let bpProdAmount = if ((size(prodList) > j))
12311005 then parseIntValue(prodList[j])
12321006 else 0
12331007 if ((quantity > bpProdAmount))
12341008 then throw(((("You have only " + toString(bpProdAmount)) + " of ") + prodTypes[j]))
12351009 else $Tuple4((j + 1), (acc._2 + (unitPrice * quantity)), (acc._3 :+ toString((bpProdAmount - quantity))), (acc._4 :+ toString((existAmount + quantity))))
12361010 }
12371011 }
12381012 }
12391013 }
12401014
12411015 let merged = {
12421016 let $l = productionMatrix
12431017 let $s = size($l)
12441018 let $acc0 = $Tuple4(0, 0, nil, nil)
12451019 func $f0_1 ($a,$i) = if (($i >= $s))
12461020 then $a
12471021 else moveProd($a, $l[$i])
12481022
12491023 func $f0_2 ($a,$i) = if (($i >= $s))
12501024 then $a
12511025 else throw("List size exceeds 50")
12521026
12531027 $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)
12541028 }
12551029 let newBpStr = makeString_2C([currentPack[bpIdxLevel], currentPack[bpIdxRes], currentPack[bpIdxMat], makeString(merged._3, "_")], ":")
12561030 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
12571031 $Tuple2([StringEntry(esKey, makeString(merged._4, "_")), ScriptTransfer(i.caller, merged._2, usdtAssetId)], bpSave)
12581032 }
12591033 }
12601034 else throw("Strict value is not equal to itself.")
12611035 }
12621036
12631037
12641038
12651039 @Callable(i)
12661040 func updateEsStorage (newStorage) = if ((i.caller != stakingContract))
12671041 then throw("Permission denied")
12681042 else $Tuple2([StringEntry(keyEsWarehouse(), newStorage)], newStorage)
12691043
12701044

github/deemru/w8io/873ac7e 
189.22 ms