tx · 8am3twGrHuPNjNqnt6diF7Z8kjMoz1iJuzHfafm5cHA3

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.03600000 Waves

2023.07.15 19:32 [2667231] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "8am3twGrHuPNjNqnt6diF7Z8kjMoz1iJuzHfafm5cHA3", "fee": 3600000, "feeAssetId": null, "timestamp": 1689438731311, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "WCZybUSErst1RrVuttqc6rKbNZrpRTQ36CLEEWQHpbCiALgzmVADx8Fp25B4UQLHMbRVbG1f4diSqQeN6nd5vdr" ], "script": "base64:BgI7CAISBAoCCBgSAwoBCBIECgIRERIECgIRERIDCgEREgQKAgEBEgQKAggIEgUKAwgICBIDCgEREgMKAQhRAAd4cFRyYWRlAKCNBgAHeHBDcmFmdACgjQYACnhwU2VsbFRvRXMAoI0GAAZ4cFNob3AAoI0GAApMQU5EUFJFRklYAgRMQU5EAAZOVU1SRVMABgAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EAEFJFU09VUkNFUFJJQ0VNSU4A1bUCAA1FU01BWFBBQ0tBR0VTAAMACUVTQlVZQ09FRgAEAAhyZXNUeXBlcwkAzAgCAgNPaWwJAMwIAgIDT3JlCQDMCAICBFdvb2QJAMwIAgIEU2FuZAkAzAgCAgRDbGF5CQDMCAICB09yZ2FuaWMFA25pbAAIbWF0VHlwZXMJAMwIAgIERnVlbAkAzAgCAgVNZXRhbAkAzAgCAgVQbGFuawkAzAgCAgVHbGFzcwkAzAgCAgdQbGFzdGljCQDMCAICB1Byb3RlaW4FA25pbAAJcHJvZFR5cGVzCQDMCAICEEZpcnN0IEFpZCBLaXQgTDEJAMwIAgIQRmlyc3QgQWlkIEtpdCBMMgkAzAgCAhBGaXJzdCBBaWQgS2l0IEwzCQDMCAICC0JhY2twYWNrIEwxCQDMCAICC0JhY2twYWNrIEwyCQDMCAICC0JhY2twYWNrIEwzCQDMCAICDkZvb2QgUmF0aW9uIEwxCQDMCAICDkZvb2QgUmF0aW9uIEwyCQDMCAICDkZvb2QgUmF0aW9uIEwzCQDMCAICC0pldCBQYWNrIEwxCQDMCAICC0pldCBQYWNrIEwyCQDMCAICC0pldCBQYWNrIEwzCQDMCAICCVNoaWVsZCBMMQkAzAgCAglTaGllbGQgTDIJAMwIAgIJU2hpZWxkIEwzBQNuaWwACmNvbnRpbmVudHMJAMwIAgIIQW1lcmljYXMJAMwIAgIGRXVyb3BlCQDMCAICBEFzaWEJAMwIAgIGQWZyaWNhCQDMCAICB09jZWFuaWEFA25pbAAQcHJvZHVjdGlvbk1hdHJpeAkAzAgCAiQ4XzhfOF8xN18xN180Ml8xMl8wXzMwXzAsMCwwLDAsMCwwLDAJAMwIAgIkOF84XzhfMTdfMTdfNDJfMjRfMF82MF8wLDAsNSwyLDAsMCwwCQDMCAICJjhfOF84XzE3XzE3XzQyXzM2XzBfMTIwXzAsMCwxMCw0LDAsMCwwCQDMCAICJThfMTlfMTlfOF8yN18xOV8yNl8xXzIwXzAsMCwwLDAsMCwwLDAJAMwIAgIlOF8xOV8xOV84XzI3XzE5XzUyXzFfNDBfMCwwLDAsMCwwLDAsMAkAzAgCAiU4XzE5XzE5XzhfMjdfMTlfNzhfMV84MF8wLDAsMCwwLDAsMCwwCQDMCAICIThfOF84XzhfOF82MF8xM18yXzJfMCwwLDAsMCwwLDAsMAkAzAgCAiE4XzhfOF84XzhfNjBfMjZfMl80XzAsMCwwLDAsMCwwLDAJAMwIAgIhOF84XzhfOF84XzYwXzM5XzJfOF8wLDAsMCwwLDAsMCwwCQDMCAICJTMwXzMwXzNfMTdfMTdfM18zMF8zXzMwXzAsMCwwLDAsMCwwLDAJAMwIAgIlMzBfMzBfM18xN18xN18zXzYwXzNfNTBfMCwwLDAsMCwwLDAsMAkAzAgCAiUzMF8zMF8zXzE3XzE3XzNfOTBfM183MF8wLDAsMCwwLDAsMCwwCQDMCAICJzE4XzE4XzEwXzE4XzE4XzE4XzExXzRfMzBfMCwwLDAsMCwwLDAsMAkAzAgCAicxOF8xOF8xMF8xOF8xOF8xOF8yMl80XzUwXzAsMCwwLDAsMCwwLDAJAMwIAgInMThfMThfMTBfMThfMThfMThfMzNfNF83MF8wLDAsMCwwLDAsMCwwBQNuaWwACXJJZHhDb2VmZgAGAA1ySWR4Q29udGluZW50AAcAClJFQ0lQRVNJWkUACgAOUFJPRFVDVFBLR1NJWkUACgALd2hJZHhMZXZlbHMAAAAId2hJZHhSZXMAAQAId2hJZHhNYXQAAgAJd2hJZHhQcm9kAAMACXdoSWR4TE9GVAAEAAl2b2xMb2NrZWQAAAAIdm9sVG90YWwAAwAKYnBJZHhMZXZlbAAAAAhicElkeFJlcwABAAhicElkeE1hdAACAAlicElkeFByb2QAAwEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQdhc3NldElkCQCsAgICCW5mdE93bmVyXwUHYXNzZXRJZAEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEHYXNzZXRJZAkArAICAgtzdGFrZWRUaW1lXwUHYXNzZXRJZAEPa2V5QWRkcmVzc1JlZkJ5AQRhZGRyCQCsAgICCWFjY1JlZkJ5XwUEYWRkcgEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgERa2V5QmFja3BhY2tCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICCWJhY2tQYWNrXwULZHVja0Fzc2V0SWQBD2tleUR1Y2tMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgINZHVja0xvY2F0aW9uXwULZHVja0Fzc2V0SWQBCmtleUJsb2NrZWQAAhBjb250cmFjdHNCbG9ja2VkAQ5rZXlPcmRlckJ5TGFuZAELbGFuZEFzc2V0SWQJAKwCAgIKbGFuZE9yZGVyXwULbGFuZEFzc2V0SWQBDmtleUVzV2FyZWhvdXNlAAIaZW1lcmdlbmN5V2FyZWhvdXNlUHJvZHVjdHMAD2xvY0lkeENvbnRpbmVudAAAAApsb2NJZHhUeXBlAAEACGxvY0lkeElkAAIBEmdldFJlY2lwZU1hdGVyaWFscwEGcmVjaXBlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGcmVjaXBlBQlySWR4Q29lZmYABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgADU0VQAgJfXwAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAAZNVUxUMTAAgMivoCUADk1JTlNIT1BQQVlNRU5UAKCNBgEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEUlkeENmZ1N0YWtpbmdEYXBwAAEBCmtleVJlc3RDZmcAAg4lc19fcmVzdENvbmZpZwEOa2V5UmVzdEFkZHJlc3MAAgwlc19fcmVzdEFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgdyZXN0Q2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHcmVzdENmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgADHJlc3RDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5UmVzdEFkZHJlc3MABRVkZWZhdWx0UmVzdEFkZHJlc3NTdHIAB3Jlc3RDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDHJlc3RDb250cmFjdAAPc3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnU3Rha2luZ0RhcHABCGFzU3RyaW5nAQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAUBcwkAAgECGGZhaWwgdG8gY2FzdCBpbnRvIFN0cmluZwEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAFuBQckbWF0Y2gwBQFuCQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQpmaXhlZFBvaW50AgN2YWwIZGVjaW1hbHMEBnRlblBvdwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04JAKwCAgkArAICCQCkAwEJAGkCBQN2YWwFBnRlblBvdwIBLgkApAMBCQBqAgUDdmFsBQZ0ZW5Qb3cAE0ZBQ1RPUllNQVhXQVJFSE9VU0UAgMivoCUADlNFTExNVUxUSVBMSUVSAMgBAA1CVVlNVUxUSVBMSUVSAKwCAApBVUNUSU9ORkVFAJBOAR5rZXlGYWN0b3J5V2FyZWhvdXNlQnlJZEFuZFR5cGUCCWZhY3RvcnlJZAdyZXNUeXBlCQCsAgIJAKwCAgkArAICAhtmYWN0b3J5V2hCeUNvbnRpbmVudEFuZFJlc18FCWZhY3RvcnlJZAIBXwkApAMBBQdyZXNUeXBlAAlvcmRJZHhSZXMAAAAJb3JkSWR4TWF0AAEACm9yZElkeFByb2QAAgEIZ2V0T3JkZXIBBm9yZEtleQQBcAkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEFBm9yZEtleQIwMEAwXzBAMF8wQDBfMEAwXzBAMF8wQDA6MEAwXzBAMF8wQDBfMEAwXzBAMF8wQDA6AgE6CQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUJb3JkSWR4UmVzAgFfBQZOVU1SRVMJAJEDAgUBcAUJb3JkSWR4UmVzAhcwQDBfMEAwXzBAMF8wQDBfMEAwXzBAMAkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCW9yZElkeE1hdAIBXwUGTlVNUkVTCQCRAwIFAXAFCW9yZElkeE1hdAIXMEAwXzBAMF8wQDBfMEAwXzBAMF8wQDAJAMwIAgkAkQMCBQFwBQpvcmRJZHhQcm9kBQNuaWwBCHRvVm9sdW1lAwZhbW91bnQHcGtnU2l6ZQlpc1Byb2R1Y3QDBQlpc1Byb2R1Y3QEBHBrZ3MDCQBnAgUGYW1vdW50AAAJAGkCCQBlAgkAZAIFBmFtb3VudAUHcGtnU2l6ZQABBQdwa2dTaXplCQEBLQEJAGkCCQBlAgkAZAIJAQEtAQUGYW1vdW50BQdwa2dTaXplAAEFB3BrZ1NpemUJAGgCBQRwa2dzBQVNVUxUOAUGYW1vdW50AQxzZWxsSW50ZXJuYWwEBWxvY0lkB3Jlc1R5cGUGYW1vdW50CG1pblByaWNlBAV3aEtleQkBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIFBWxvY0lkBQdyZXNUeXBlBAJ3MAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQV3aEtleQAABAJyMAMJAGYCBQJ3MAUTRkFDVE9SWU1BWFdBUkVIT1VTRQAAAwkAZgIJAGQCBQJ3MAUGYW1vdW50BRNGQUNUT1JZTUFYV0FSRUhPVVNFCQBlAgUTRkFDVE9SWU1BWFdBUkVIT1VTRQUCdzAFBmFtb3VudAQMdXNkdFJlY2VpdmVkCQBkAgkAawMFAnIwCQBlAgkAaAIFDlNFTExNVUxUSVBMSUVSBRBSRVNPVVJDRVBSSUNFTUlOCQBrAwkAZAIJAGgCAGQFAncwCQBoAgAyBQJyMAUQUkVTT1VSQ0VQUklDRU1JTgUTRkFDVE9SWU1BWFdBUkVIT1VTRQUGTVVMVDEwCQBrAwkAZQIFBmFtb3VudAUCcjAFEFJFU09VUkNFUFJJQ0VNSU4FBU1VTFQ4BAVtaW45OQkAZQIFCG1pblByaWNlCQBpAgUIbWluUHJpY2UAZAMJAGYCCQBoAgUFbWluOTkFBmFtb3VudAkAaAIFDHVzZHRSZWNlaXZlZAUFTVVMVDgJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICD0FjdHVhbCBwcmljZSA9IAkApAMBBQx1c2R0UmVjZWl2ZWQCAyAvIAkApAMBBQZhbW91bnQCDiA8IG1pblByaWNlID0gCQCkAwEFCG1pblByaWNlAgMsICgFBWxvY0lkAgIsIAkAkQMCBQhyZXNUeXBlcwUHcmVzVHlwZQIBKQkAlAoCCQEMSW50ZWdlckVudHJ5AgUFd2hLZXkJAGQCBQJ3MAUGYW1vdW50BQx1c2R0UmVjZWl2ZWQBC2J1eUludGVybmFsBAVsb2NJZAdtYXRUeXBlBmFtb3VudAhtYXhQcmljZQQFd2hLZXkJAR5rZXlGYWN0b3J5V2FyZWhvdXNlQnlJZEFuZFR5cGUCBQVsb2NJZAUHbWF0VHlwZQQCdzAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUFd2hLZXkAAAQCbTEDCQBmAgUCdzAFE0ZBQ1RPUllNQVhXQVJFSE9VU0UJAJcDAQkAzAgCBQZhbW91bnQJAMwIAgkAZQIFAncwBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQNuaWwAAAQCbTAJAJcDAQkAzAgCBQJ3MAkAzAgCCQBlAgUGYW1vdW50BQJtMQUDbmlsBAFtCQBkAgUCbTAFAm0xBAl1c2R0U3BlbnQJAGQCCQBrAwUCbTAJAGUCCQBoAgUNQlVZTVVMVElQTElFUgUQUkVTT1VSQ0VQUklDRU1JTgkAawMJAGUCCQBoAgBkBQJ3MAkAaAIAMgUCbTAFEFJFU09VUkNFUFJJQ0VNSU4FE0ZBQ1RPUllNQVhXQVJFSE9VU0UFBk1VTFQxMAkAawMFAm0xCQBoAgACBRBSRVNPVVJDRVBSSUNFTUlOBQVNVUxUOAQGbWF4MTAxCQBkAgUIbWF4UHJpY2UJAGkCBQhtYXhQcmljZQBkAwkAZgIJAGgCBQl1c2R0U3BlbnQFBU1VTFQ4CQBoAgUGbWF4MTAxBQFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BY3R1YWwgcHJpY2UgPSAJAKQDAQUJdXNkdFNwZW50AgMgLyAJAKQDAQUBbQIOID4gbWF4UHJpY2UgPSAJAKQDAQUIbWF4UHJpY2UCAywgKAUFbG9jSWQCAiwgCQCRAwIFCG1hdFR5cGVzBQdtYXRUeXBlAgEpCQCVCgMJAQxJbnRlZ2VyRW50cnkCBQV3aEtleQkAZQIFAncwBQFtBQl1c2R0U3BlbnQFAW0BC2dldEJhY2twYWNrAQVicEtleQQBcAkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAUFYnBLZXkCGjA6MF8wXzBfMF8wXzA6MF8wXzBfMF8wXzA6AgE6CQDMCAIJAKQDAQkBC3ZhbHVlT3JFbHNlAgkAtgkBCQCRAwIFAXAFCmJwSWR4TGV2ZWwAAAkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCGJwSWR4UmVzAgFfBQZOVU1SRVMJAJEDAgUBcAUIYnBJZHhSZXMCCzBfMF8wXzBfMF8wCQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUIYnBJZHhNYXQCAV8FBk5VTVJFUwkAkQMCBQFwBQhicElkeE1hdAILMF8wXzBfMF8wXzAJAMwIAgkAkQMCBQFwBQlicElkeFByb2QFA25pbAEMY2hlY2tCbG9ja2VkAAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUPc3Rha2luZ0NvbnRyYWN0CQEKa2V5QmxvY2tlZAAHCQACAQIfQ29udHJhY3RzIGFyZSB1bmRlciBtYWludGVuYW5jZQUEdW5pdAEGcHJvbG9nAAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCCnNhdmVMYXN0VHgFA25pbAUDbmlsAQlzZXRDb21tb24CA2FjYwRpdGVtBAFqCAUDYWNjAl8xBAZpc1Byb2QIBQNhY2MCXzgECWl0ZW1QYXJ0cwkAtQkCBQRpdGVtAgFAAwkBAiE9AgkAkAMBBQlpdGVtUGFydHMAAgkAAgECLkluY29ycmVjdCBvcmRlciBmb3JtYXQsIHNob3VsZCBiZSBhbW91bnRAcHJpY2UECG5ld09yZEFtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJaXRlbVBhcnRzAAAECG5ld09yZFByCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJaXRlbVBhcnRzAAEECW5ld09yZFVzZAkAawMFCG5ld09yZEFtBQhuZXdPcmRQcgUFTVVMVDgECW5ld09yZFZvbAkBCHRvVm9sdW1lAwUIbmV3T3JkQW0FDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QEBndoSW5pdAMJAGYCCQCQAwEIBQNhY2MCXzYFAWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCCAUDYWNjAl82BQFqAAAEC2N1ck9yZFBhcnRzCQC1CQIDCQBmAgkAkAMBCAUDYWNjAl83BQFqCQCRAwIIBQNhY2MCXzcFAWoCAzBAMAIBQAQIY3VyT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJPcmRQYXJ0cwAABAhjdXJPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ck9yZFBhcnRzAAEDAwkAZgIAAAUIY3VyT3JkUHIGCQBmAgAABQhuZXdPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAljdXJPcmRVc2QJAGsDBQhjdXJPcmRBbQUIY3VyT3JkUHIFBU1VTFQ4AwkAAAIFCG5ld09yZEFtAAADCQBmAgUIY3VyT3JkQW0AAAkAmwoJCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQUGd2hJbml0CAUDYWNjAl8zCAUDYWNjAl80CQBlAggFA2FjYwJfNQUJY3VyT3JkVXNkCAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAGQCCAUDYWNjAl85CQEIdG9Wb2x1bWUDBQZ3aEluaXQFDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QJAJsKCQkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQZ3aEluaXQFCGN1ck9yZEFtCAUDYWNjAl8zCAUDYWNjAl80CAUDYWNjAl81CAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAGQCCAUDYWNjAl85CQEIdG9Wb2x1bWUDCQBlAgUGd2hJbml0BQhjdXJPcmRBbQUOUFJPRFVDVFBLR1NJWkUFBmlzUHJvZAMJAGYCBQhuZXdPcmRBbQAAAwkAZgIAAAUIY3VyT3JkQW0JAJsKCQkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQZ3aEluaXQFCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUJbmV3T3JkVm9sCAUDYWNjAl80CQBkAggFA2FjYwJfNQUJbmV3T3JkVXNkCAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAQh0b1ZvbHVtZQMJAGUCBQZ3aEluaXQFCGN1ck9yZEFtBQ5QUk9EVUNUUEtHU0laRQUGaXNQcm9kCQCbCgkJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQZ3aEluaXQJAGQCCAUDYWNjAl8zBQluZXdPcmRWb2wIBQNhY2MCXzQJAGUCCQBkAggFA2FjYwJfNQUJbmV3T3JkVXNkBQljdXJPcmRVc2QIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkBCHRvVm9sdW1lAwUGd2hJbml0BQ5QUk9EVUNUUEtHU0laRQUGaXNQcm9kAwkAZgIAAAUIY3VyT3JkQW0EBmFtRGlmZgkAZQIFCGN1ck9yZEFtBQhuZXdPcmRBbQMJAGYCAAAJAGUCBQZ3aEluaXQFBmFtRGlmZgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBBQZhbURpZmYCGiBmcm9tIHdhcmVob3VzZSwgYnV0IG9ubHkgCQCkAwEFBndoSW5pdAIKIGF2YWlsYWJsZQkAmwoJCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFBndoSW5pdAUGYW1EaWZmCAUDYWNjAl8zCQBlAggFA2FjYwJfNAUJbmV3T3JkVm9sCAUDYWNjAl81CAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAQh0b1ZvbHVtZQMJAGUCBQZ3aEluaXQFBmFtRGlmZgUOUFJPRFVDVFBLR1NJWkUFBmlzUHJvZAMJAGYCAAAJAGQCBQZ3aEluaXQFCG5ld09yZEFtCQACAQkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHRha2UgCQCkAwEJAQEtAQUIbmV3T3JkQW0CGiBmcm9tIHdhcmVob3VzZSwgYnV0IG9ubHkgCQCkAwEFBndoSW5pdAIKIGF2YWlsYWJsZQkAmwoJCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZAIFBndoSW5pdAUIbmV3T3JkQW0IBQNhY2MCXzMJAGUCCAUDYWNjAl80BQluZXdPcmRWb2wJAGUCCAUDYWNjAl81BQljdXJPcmRVc2QIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkBCHRvVm9sdW1lAwkAZAIFBndoSW5pdAUIbmV3T3JkQW0FDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QBC3NldEludGVybmFsAwljdXJyZW50V2gKY3VycmVudE9yZAZuZXdPcmQECWN1cnJXaFJlcwkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8ECWN1cnJXaE1hdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8ECmN1cnJXaFByb2QDCQAAAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIBXwQNY3VycmVudE9yZFJlcwkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCW9yZElkeFJlcwIBXwQNY3VycmVudE9yZE1hdAkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCW9yZElkeE1hdAIBXwQOY3VycmVudE9yZFByb2QDCQAAAgkAkQMCBQpjdXJyZW50T3JkBQpvcmRJZHhQcm9k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LgAvADAAMQAyCQCbCgkAAAUKY3VycldoUHJvZAgFAW0CXzMIBQFtAl80CAUBbQJfNQUKY3VycldoUHJvZAUOY3VycmVudE9yZFByb2QGCAUBbQJfOQkAmQoHCAUBcgJfMggFAW0CXzIIBQFwAl8yCAUBcAJfMwgFAXACXzQIBQFwAl81CAUBcAJfOQEMYWNjZXB0Q29tbW9uAgNhY2MJYnBPcmRJdGVtBAFqCAUDYWNjAl83BAZpc1Byb2QIBQNhY2MDXzEyBApicE9yZFBhcnRzCQC1CQIFCWJwT3JkSXRlbQIBQAMJAQIhPQIJAJADAQUKYnBPcmRQYXJ0cwACCQACAQIuSW5jb3JyZWN0IG9yZGVyIGZvcm1hdCwgc2hvdWxkIGJlIGFtb3VudEBwcmljZQQHYnBPcmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJwT3JkUGFydHMAAAQHYnBPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJwT3JkUGFydHMAAQMJAGYCAAAFB2JwT3JkUHIJAAIBAhdQcmljZSBjYW4ndCBiZSBuZWdhdGl2ZQQIYnBPcmRVc2QJAGsDBQdicE9yZEFtBQdicE9yZFByBQVNVUxUOAQGYnBJbml0AwkAZgIJAJADAQgFA2FjYwJfOAUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIIBQNhY2MCXzgFAWoAAAQGd2hJbml0AwkAZgIJAJADAQgFA2FjYwJfOQUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIIBQNhY2MCXzkFAWoAAAQJd2hPcmRJbml0AwkAZgIJAJADAQgFA2FjYwNfMTAFAWoJAJEDAggFA2FjYwNfMTAFAWoCAzBAMAQKd2hPcmRQYXJ0cwkAtQkCBQl3aE9yZEluaXQCAUAEB3doT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAAEB3doT3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAEDAwkBAiE9AgUHYnBPcmRBbQAACQECIT0CBQdicE9yZFByBQd3aE9yZFByBwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgpQcmljZXMgb2YgCQCRAwIIBQNhY2MDXzExBQFqAhcgZG9uJ3QgbWF0Y2ghIFdIIHByaWNlPQkApAMBBQd3aE9yZFByAg0sIHlvdXIgcHJpY2U9CQCkAwEFB2JwT3JkUHIECHdoT3JkVXNkCQBrAwUHd2hPcmRBbQUHd2hPcmRQcgUFTVVMVDgECGRlbHRhVm9sCQEIdG9Wb2x1bWUDBQdicE9yZEFtBQ5QUk9EVUNUUEtHU0laRQUGaXNQcm9kAwkAAAIFB2JwT3JkQW0AAAkAnwoNCQDNCAIIBQNhY2MCXzEJAKQDAQUGd2hJbml0CQDNCAIIBQNhY2MCXzIFCXdoT3JkSW5pdAkAzQgCCAUDYWNjAl8zCQCkAwEFBmJwSW5pdAgFA2FjYwJfNAgFA2FjYwJfNQgFA2FjYwJfNgkAZAIIBQNhY2MCXzcAAQgFA2FjYwJfOAgFA2FjYwJfOQgFA2FjYwNfMTAIBQNhY2MDXzExBQZpc1Byb2QIBQNhY2MDXzEzAwkAZgIFB2JwT3JkQW0AAAMJAGYCAAAFB3doT3JkQW0DCQBmAgUHYnBPcmRBbQkBAS0BBQd3aE9yZEFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICD0F0dGVtcHQgdG8gYnV5IAkApAMBBQdicE9yZEFtAgQgb2YgCQCRAwIIBQNhY2MDXzExBQFqAhssIGJ1dCB3YXJlaG91c2Ugb25seSBzZWxscyAJAKQDAQkBAS0BBQd3aE9yZEFtCQCfCg0JAM0IAggFA2FjYwJfMQkApAMBBQZ3aEluaXQJAM0IAggFA2FjYwJfMgkArAICCQCsAgIJAKQDAQkAZAIFB3doT3JkQW0FB2JwT3JkQW0CAUAJAKQDAQUHd2hPcmRQcgkAzQgCCAUDYWNjAl8zCQCkAwEJAGQCBQZicEluaXQFB2JwT3JkQW0JAGQCCAUDYWNjAl80BQhkZWx0YVZvbAgFA2FjYwJfNQkAZAIIBQNhY2MCXzYFCGJwT3JkVXNkCQBkAggFA2FjYwJfNwABCAUDYWNjAl84CAUDYWNjAl85CAUDYWNjA18xMAgFA2FjYwNfMTEFBmlzUHJvZAkAZAIIBQNhY2MDXzEzAwUGaXNQcm9kCQBoAgUHYnBPcmRBbQUFTVVMVDgFB2JwT3JkQW0JAAIBCQCsAgIJAKwCAgIPQXR0ZW1wdCB0byBidXkgCQCRAwIIBQNhY2MDXzExBQFqAiAgd2hpbGUgd2FyZWhvdXNlIGRvZXNuJ3Qgc2VsbCBpdAMJAGYCBQd3aE9yZEFtAAADCQBmAgkBAS0BBQdicE9yZEFtBQd3aE9yZEFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAKQDAQkBAS0BBQdicE9yZEFtAgQgb2YgCQCRAwIIBQNhY2MDXzExBQFqAhosIGJ1dCB3YXJlaG91c2Ugb25seSBidXlzIAkApAMBBQd3aE9yZEFtAwkAZgIJAQEtAQUHYnBPcmRBbQUGYnBJbml0CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAKQDAQkBAS0BBQdicE9yZEFtAhQsIGJ1dCB5b3Ugb25seSBoYXZlIAkApAMBBQZicEluaXQCBCBvZiAJAJEDAggFA2FjYwNfMTEFAWoJAJ8KDQkAzQgCCAUDYWNjAl8xCQCkAwEJAGUCBQZ3aEluaXQFB2JwT3JkQW0JAM0IAggFA2FjYwJfMgkArAICCQCsAgIJAKQDAQkAZAIFB3doT3JkQW0FB2JwT3JkQW0CAUAJAKQDAQUHd2hPcmRQcgkAzQgCCAUDYWNjAl8zCQCkAwEJAGQCBQZicEluaXQFB2JwT3JkQW0JAGUCCAUDYWNjAl80BQhkZWx0YVZvbAkAZQIIBQNhY2MCXzUFCGJwT3JkVXNkCAUDYWNjAl82CQBkAggFA2FjYwJfNwABCAUDYWNjAl84CAUDYWNjAl85CAUDYWNjA18xMAgFA2FjYwNfMTEFBmlzUHJvZAkAZQIIBQNhY2MDXzEzAwUGaXNQcm9kCQBoAgUHYnBPcmRBbQUFTVVMVDgFB2JwT3JkQW0JAAIBCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byBzZWxsIAkAkQMCCAUDYWNjA18xMQUBagIfIHdoaWxlIHdhcmVob3VzZSBkb2Vzbid0IGJ1eSBpdAoBaQEacmVjYWxjTG9ja2VkVm9sdW1lUkVBRE9OTFkCC2xhbmRBc3NldElkAndoBApjdXJyZW50T3JkCQEIZ2V0T3JkZXIBCQEOa2V5T3JkZXJCeUxhbmQBBQtsYW5kQXNzZXRJZAQBegkBC3NldEludGVybmFsAwUCd2gFCmN1cnJlbnRPcmQFCmN1cnJlbnRPcmQJAJQKAgUDbmlsCQBkAggFAXoCXzQIBQF6Al81AWkBDWNvbnN0cnVjdG9yVjEBCHJlc3RBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleVJlc3RBZGRyZXNzAAUIcmVzdEFkZHIFA25pbAFpAQ1zZWxsUmVzb3VyY2VzAgdhbW91bnRzCW1pblByaWNlcwQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIqc2VsbFJlc291cmNlcyBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBWxvY0lkCQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdyZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfCgEFYWRkZXICA2FjYwFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCRAwIFB3Jlc0xpc3QFAWoCBCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCFCwgYnV0IHRyaWVkIHRvIHNlbGwgCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCAAAJAJEDAgUHYW1vdW50cwUBagkAAgEJAKwCAgkArAICCQCsAgICJVlvdSB0cmllZCB0byBzZWxsIG5lZ2F0aXZlIGFtb3VudCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCAjogCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoAAAQBYgkBDHNlbGxJbnRlcm5hbAQFBWxvY0lkBQFqCQCRAwIFB2Ftb3VudHMFAWoJAJEDAgUJbWluUHJpY2VzBQFqCQCWCgQJAM0IAggFA2FjYwJfMQgFAWICXzEJAM0IAggFA2FjYwJfMgkApAMBCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAJEDAgUHYW1vdW50cwUBagkAZAIIBQNhY2MCXzMIBQFiAl8yCQBkAggFA2FjYwJfNAkAkQMCBQdhbW91bnRzBQFqCQCWCgQIBQNhY2MCXzEJAM0IAggFA2FjYwJfMgkAkQMCBQdyZXNMaXN0BQFqCAUDYWNjAl8zCAUDYWNjAl80BAZtZXJnZWQKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEBQNuaWwFA25pbAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWFkZGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIIBQZtZXJnZWQCXzICAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEBnJlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUHeHBUcmFkZQgFBm1lcmdlZAJfNAUFTVVMVDgFA25pbAUDbmlsCQCUCgIJAM0IAggFBm1lcmdlZAJfMQkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCAUGbWVyZ2VkAl8zBQt1c2R0QXNzZXRJZAkAlQoDBQZyZXN1bHQFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQBaQEMYnV5TWF0ZXJpYWxzAgdhbW91bnRzCW1heFByaWNlcwQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQFbG9jSWQJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8KAQhtVXBkYXRlcgIDYWNjAWoDCQBmAgAACQCRAwIFB2Ftb3VudHMFAWoJAAIBCQCsAgIJAKwCAgkArAICAiRZb3UgdHJpZWQgdG8gYnV5IG5lZ2F0aXZlIGFtb3VudCBvZiAJAJEDAgUIbWF0VHlwZXMFAWoCAjogCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoAAAQBYgkBC2J1eUludGVybmFsBAUFbG9jSWQFAWoJAJEDAgUHYW1vdW50cwUBagkAkQMCBQltYXhQcmljZXMFAWoJAJYKBAkAzQgCCAUDYWNjAl8xCAUBYgJfMQkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHbWF0TGlzdAUBaggFAWICXzMJAGQCCAUDYWNjAl8zCAUBYgJfMgkAZAIIBQNhY2MCXzQJAJEDAgUHYW1vdW50cwUBagkAlgoECAUDYWNjAl8xCQDNCAIIBQNhY2MCXzIJAJEDAgUHbWF0TGlzdAUBaggFA2FjYwJfMwgFA2FjYwJfNAQGbWVyZ2VkCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAUDbmlsBQNuaWwAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhtVXBkYXRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgMJAGYCCAUGbWVyZ2VkAl8zBQNhbXQJAAIBCQCsAgIJAKwCAgkArAICAh9JbnN1ZmZpY2llbnQgcGF5bWVudCEgQXR0YWNoZWQ9CQCkAwEFA2FtdAILLCByZXF1aXJlZD0JAKQDAQgFBm1lcmdlZAJfMwQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgkAuQkCCAUGbWVyZ2VkAl8yAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQEcmVzdAMJAGYCCQBlAgUDYW10CAUGbWVyZ2VkAl8zAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUDYW10CAUGbWVyZ2VkAl8zBQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwEEGFjdGl2aXRpZXNBbW91bnQJAGkCCAUGbWVyZ2VkAl8zAGQEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQd4cFRyYWRlCAUGbWVyZ2VkAl80BQVNVUxUOAUDbmlsBQNuaWwJAJQKAgkAzQgCCQDOCAIIBQZtZXJnZWQCXzEFBHJlc3QJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAJUKAwUGcmVzdWx0BQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0AWkBEWV4Y2hhbmdlUmVzb3VyY2VzAQdhbW91bnRzBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cABAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAVsb2NJZAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwoBCWV4Y2hhbmdlcgIDYWNjAWoEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFAWoEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEA2FtagkAkQMCBQdhbW91bnRzBQFqAwkAZgIFA2FtagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCRAwIFB3Jlc0xpc3QFAWoCBCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCGCwgYnV0IHRyaWVkIHRvIGV4Y2hhbmdlIAkApAMBBQNhbWoDCQBmAgAABQNhbWoJAAIBCQCsAgIJAKwCAgkArAICAilZb3UgdHJpZWQgdG8gZXhjaGFuZ2UgbmVnYXRpdmUgYW1vdW50IG9mIAkAkQMCBQhyZXNUeXBlcwUBagICOiAJAKQDAQUDYW1qAwkAZgIFA2FtagAACQCXCgUJAM0IAggFA2FjYwJfMQkApAMBCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoFA2FtagkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHbWF0TGlzdAUBagUDYW1qCQBkAggFA2FjYwJfMwkAawMFA2FtagUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgJAM0IAggFA2FjYwJfNAkBDEludGVnZXJFbnRyeQIFBXdoS2V5BQJ3MAkAZAIIBQNhY2MCXzUFA2FtagkAlwoFCQDNCAIIBQNhY2MCXzEJAJEDAgUHcmVzTGlzdAUBagkAzQgCCAUDYWNjAl8yCQCRAwIFB21hdExpc3QFAWoIBQNhY2MCXzMIBQNhY2MCXzQIBQNhY2MCXzUEBm1lcmdlZAoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCXCgUFA25pbAUDbmlsAAAFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlleGNoYW5nZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYDCQBmAggFBm1lcmdlZAJfMwUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkApAMBBQNhbXQCCywgcmVxdWlyZWQ9CQCkAwEIBQZtZXJnZWQCXzMEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAggFBm1lcmdlZAJfMQIBXwkAzAgCCQC5CQIIBQZtZXJnZWQCXzICAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEBnJlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBARyZXN0AwkAZgIJAGUCBQNhbXQIBQZtZXJnZWQCXzMAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQIBQZtZXJnZWQCXzMFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIIBQZtZXJnZWQCXzMAZAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFB3hwVHJhZGUIBQZtZXJnZWQCXzUFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDNCAIJAM4IAgUEcmVzdAgFBm1lcmdlZAJfNAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkAlQoDBQZyZXN1bHQFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQBaQEKY3JhZnRHb29kcwIKcHJvZHVjdElkeAhxdWFudGl0eQQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUDYW10BQVNVUxUNgkAAgECKmV4YWN0bHkgMSBVU0RUIG11c3QgYmUgYXR0YWNoZWQgYXMgcGF5bWVudAMJAGcCAAAFCHF1YW50aXR5CQACAQIbUXVhbnRpdHkgc2hvdWxkIGJlIHBvc2l0aXZlBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAU0JAAIBCQCsAgICMUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgTWFudWZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBGNvbnQJAJEDAgULY3VyTG9jYXRpb24FD2xvY0lkeENvbnRpbmVudAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfAwMJAGYCAAAFCnByb2R1Y3RJZHgGCQBnAgUKcHJvZHVjdElkeAkAkAMBBRBwcm9kdWN0aW9uTWF0cml4CQACAQkArAICAhRVbmtub3duIHByb2R1Y3QgaWR4PQkApAMBBQpwcm9kdWN0SWR4BAZyZWNpcGUJALUJAgkAkQMCBRBwcm9kdWN0aW9uTWF0cml4BQpwcm9kdWN0SWR4AgFfAwkBAiE9AgkAkAMBBQZyZWNpcGUFClJFQ0lQRVNJWkUJAAIBCQCsAgICF0ZhdGFsOiB1bmtub3duIHJlY2lwZTogCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgEDnByb2R1Y3RDb250SWR4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGcmVjaXBlBQ1ySWR4Q29udGluZW50AwkBAiE9AgkAkQMCBQpjb250aW5lbnRzBQ5wcm9kdWN0Q29udElkeAUEY29udAkAAgEJAKwCAgkArAICCQCsAgICHVRoaXMgcHJvZHVjdCBpcyBhdmFpbGFibGUgaW4gCQCRAwIFCmNvbnRpbmVudHMFDnByb2R1Y3RDb250SWR4AhEsIGJ1dCB5b3UgYXJlIGluIAUEY29udAQIcHJvZExpc3QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8KAQZmaWxsZXICA2FjYwtpZ25vcmVkSXRlbQQBbggFA2FjYwJfMgQCeHMDCQBmAgkAkAMBBQhwcm9kTGlzdAUBbgkAkQMCBQhwcm9kTGlzdAUBbgIBMAQBeAkBDXBhcnNlSW50VmFsdWUBBQJ4cwQGYW1vdW50CQBoAgUIcXVhbnRpdHkFDlBST0RVQ1RQS0dTSVpFBAF5AwkAAAIFAW4FCnByb2R1Y3RJZHgJAKQDAQkAZAIFAXgFBmFtb3VudAUCeHMJAJQKAgkAzQgCCAUDYWNjAl8xBQF5CQBkAgUBbgABBAZicFByb2QICgACJGwFEHByb2R1Y3Rpb25NYXRyaXgKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYw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AJQKAgUDbmlsCQCVCgMFBnJlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAFpARFzZXRXYXJlaG91c2VPcmRlcgILbmV3T3JkZXJTdHILbGFuZEFzc2V0SWQEBHVzZXIIBQFpDG9yaWdpbkNhbGxlcgQEYWRkcgkApQgBBQR1c2VyBAZyZXN1bHQDCQECIT0CBQR1c2VyBQxyZXN0Q29udHJhY3QJAQxjaGVja0Jsb2NrZWQABwQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDAwkBAiE9AgUEdXNlcgUMcmVzdENvbnRyYWN0CQECIT0CBQVvd25lcgUEYWRkcgcJAAIBCQCsAgIFCkxBTkRQUkVGSVgCDSBpcyBub3QgeW91cnMECG5ld09yZGVyCQC8CQIFC25ld09yZGVyU3RyAgE6BAJ3aAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCFGdldFdhcmVob3VzZVJFQURPTkxZCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQJY3VycmVudFdoCQC8CQIFAndoAgE6BARsb2Z0CQC1CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeExPRlQCAV8EB3doVG90YWwJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQh2b2xUb3RhbAQGb3JkS2V5CQEOa2V5T3JkZXJCeUxhbmQBBQtsYW5kQXNzZXRJZAQKY3VycmVudE9yZAkBCGdldE9yZGVyAQUGb3JkS2V5BAF6CQELc2V0SW50ZXJuYWwDBQljdXJyZW50V2gFCmN1cnJlbnRPcmQFCG5ld09yZGVyBAtidXlWb2xTYWxkbwgFAXoCXzQEDHNlbGxWb2xTYWxkbwgFAXoCXzUECndoT2NjdXBpZWQIBQF6Al83BAh3aExvY2tlZAkAZAIFC2J1eVZvbFNhbGRvBQxzZWxsVm9sU2FsZG8EBndoRnJlZQkAZQIJAGUCBQd3aFRvdGFsBQp3aE9jY3VwaWVkBQh3aExvY2tlZAMJAGYCAAAFBndoRnJlZQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICE0F0dGVtcHQgdG8gcmVzZXJ2ZSAJAKQDAQULYnV5Vm9sU2FsZG8CGyBzcGFjZSBmb3IgYnV5IG9yZGVycywgYW5kIAkApAMBBQxzZWxsVm9sU2FsZG8CJSBzcGFjZSBmb3Igc2VsbCBvcmRlcnMgKGFuZCBvY2N1cGllZD0JAKQDAQUKd2hPY2N1cGllZAIfKSwgbGVhZHMgdG8gbmVnYXRpdmUgZnJlZSBzcGFjZQQFd2hTdHIJALoJAgkAzAgCCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMJAMwIAgkAuQkCCAUBegJfMQIBXwkAzAgCCQC5CQIIBQF6Al8yAgFfCQDMCAIJALkJAggFAXoCXzMCAV8JAMwIAgkApAMBBQh3aExvY2tlZAUDbmlsAgE6BAZ3aFNhdmUJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag1zYXZlV2FyZWhvdXNlCQDMCAIFBXdoU3RyCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQIdXNkU2FsZG8IBQF6Al82BAdhY3Rpb25zAwkAZgIFCHVzZFNhbGRvAAADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQMJAQIhPQIFA2FtdAUIdXNkU2FsZG8JAAIBCQCsAgICElBheW1lbnQgbmVlZGVkIGlzIAkApAMBBQh1c2RTYWxkbwkAzAgCCQELU3RyaW5nRW50cnkCBQZvcmRLZXkFC25ld09yZGVyU3RyBQNuaWwDCQAAAgUIdXNkU2FsZG8AAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECEk5vIHBheW1lbnRzIG5lZWRlZAkAzAgCCQELU3RyaW5nRW50cnkCBQZvcmRLZXkFC25ld09yZGVyU3RyBQNuaWwDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhJObyBwYXltZW50cyBuZWVkZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUFb3duZXIJAQEtAQUIdXNkU2FsZG8FC3VzZHRBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQULbmV3T3JkZXJTdHIFA25pbAkAlAoCBQdhY3Rpb25zCQCUCgIFBnJlc3VsdAUGd2hTYXZlAWkBFGFjY2VwdFdhcmVob3VzZU9yZGVyAwpicE9yZGVyU3RyC2xhbmRBc3NldElkC2R1Y2tBc3NldElkBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cABAZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcgQKY2FsbGVyQWRkcgkApQgBBQZjYWxsZXIEEXN0YWtlZER1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQpjYWxsZXJBZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBRFzdGFrZWREdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OBANsb2MJALUJAgkBBXZhbHVlAQULY3VyTG9jYXRpb24CAV8DCQECIT0CCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIBTAkAAgEJAKwCAgkArAICAhZEdWNrIGxvY2F0aW9uIHR5cGUgaXMgCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIRLCBidXQgc2hvdWxkIGJlIEwDCQECIT0CBRFzdGFrZWREdWNrQXNzZXRJZAULZHVja0Fzc2V0SWQJAAIBCQCsAgIJAKwCAgkArAICAhRZb3VyIHN0YWtlZCBkdWNrIGlzIAURc3Rha2VkRHVja0Fzc2V0SWQCDSwgYnV0IHBhc3NlZCAFC2R1Y2tBc3NldElkBAlsYW5kQXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQlsYW5kQXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQECWxhbmRPd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFCWxhbmRBc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQAAAgUJbGFuZE93bmVyBQpjYWxsZXJBZGRyCQACAQIeWW91IGNhbm5vdCB0cmFkZSB3aXRoIHlvdXJzZWxmBAxicE9yZGVyUGFydHMJALwJAgUKYnBPcmRlclN0cgIBOgMJAQIhPQIJAJADAQUMYnBPcmRlclBhcnRzAAMJAAIBAjJicE9yZGVyU3RyIHNob3VsZCBjb250YWluIGV4YWN0bHkgMiAnOicgc2VwYXJhdG9ycwQIYnBPcmRSZXMJALUJAgkAkQMCBQxicE9yZGVyUGFydHMAAAIBXwQIYnBPcmRNYXQJALUJAgkAkQMCBQxicE9yZGVyUGFydHMAAQIBXwQJYnBPcmRQcm9kAwkAAAIJAJEDAgUMYnBPcmRlclBhcnRzAAICAAUDbmlsCQC1CQIJAJEDAgUMYnBPcmRlclBhcnRzAAICAV8DCQECIT0CCQCQAwEFCGJwT3JkUmVzBQZOVU1SRVMJAAIBAiBBbGwgNiByZXNvdXJjZXMgc2hvdWxkIGJlIHBhc3NlZAMJAQIhPQIJAJADAQUIYnBPcmRNYXQFBk5VTVJFUwkAAgECIEFsbCA2IG1hdGVyaWFscyBzaG91bGQgYmUgcGFzc2VkBAJ3aAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCFGdldFdhcmVob3VzZVJFQURPTkxZCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQJY3VycmVudFdoCQC8CQIFAndoAgE6BAljdXJyV2hSZXMJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfBAljdXJyV2hNYXQJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0AgFfBApjdXJyV2hQcm9kAwkAAAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAAUDbmlsCQC1CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAV8ED2N1cnJXaExvY2tlZFZvbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAIBXwUJdm9sTG9ja2VkBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQJYnBSZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBAlicE1hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8ECmJwUHJvZExpc3QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8EBm9yZEtleQkBDmtleU9yZGVyQnlMYW5kAQULbGFuZEFzc2V0SWQEBXdoT3JkCQEIZ2V0T3JkZXIBBQZvcmRLZXkECHdoT3JkUmVzCQC1CQIJAJEDAgUFd2hPcmQFCW9yZElkeFJlcwIBXwQId2hPcmRNYXQJALUJAgkAkQMCBQV3aE9yZAUJb3JkSWR4TWF0AgFfBAl3aE9yZFByb2QDCQAAAgkAkQMCBQV3aE9yZAUKb3JkSWR4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CWN1cnJlbnRXaAULd2hJZHhMZXZlbHMJAMwIAgkAuQkCCAUBcgJfMQIBXwkAzAgCCQC5CQIIBQFtAl8xAgFfCQDMCAIJALkJAggFAXACXzECAV8JAMwIAgkApAMBBQxuZXdMb2NrZWRWb2wFA25pbAIBOgQLbmV3V2hPcmRTdHIJALoJAgkAzAgCCQC5CQIIBQFyAl8yAgFfCQDMCAIJALkJAggFAW0CXzICAV8JAMwIAgkAuQkCCAUBcAJfMgIBXwUDbmlsAgE6BAhuZXdCcFN0cgkAugkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAuQkCCAUBcgJfMwIBXwkAzAgCCQC5CQIIBQFtAl8zAgFfCQDMCAIJALkJAggFAXACXzMCAV8FA25pbAIBOgQGd2hTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAINc2F2ZVdhcmVob3VzZQkAzAgCBQV3aFN0cgkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwEBmJwU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFCG5ld0JwU3RyBQNuaWwFA25pbAQPZHVja1N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQZ4cFNob3AIBQFwA18xMwUFTVVMVDgFA25pbAUDbmlsBA5hY2NTdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUFjY1N0YXRzCQDMCAIFCWxhbmRPd25lcgkAzAgCCQBrAwUGeHBTaG9wCAUBcANfMTMFBU1VTFQ4BQNuaWwFA25pbAQHYWN0aW9ucwkAzAgCCQELU3RyaW5nRW50cnkCBQZvcmRLZXkFC25ld1doT3JkU3RyBQNuaWwEDXVzZFdoMkJwU2FsZG8IBQFwAl81BAhhY3Rpb25zMQMJAGYCBQ11c2RXaDJCcFNhbGRvAAAEC3VzZFdoMkJwRmVlCQBrAwgFAXACXzUFCkFVQ1RJT05GRUUFBU1VTFQ2BAhyZWZCeUtleQkBD2tleUFkZHJlc3NSZWZCeQEFCmNhbGxlckFkZHIEBXJlZkJ5CQCdCAIFD3N0YWtpbmdDb250cmFjdAUIcmVmQnlLZXkDCQEJaXNEZWZpbmVkAQUFcmVmQnkJAM0IAgkAzQgCCQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgkAZQIIBQFwAl81CQBoAgADBQt1c2RXaDJCcEZlZQULdXNkdEFzc2V0SWQJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAULdXNkV2gyQnBGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQVyZWZCeQULdXNkV2gyQnBGZWUFC3VzZHRBc3NldElkCQDNCAIJAM0IAgUHYWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCQBlAggFAXACXzUJAGgCAAMFC3VzZFdoMkJwRmVlBQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQt1c2RXaDJCcEZlZQULdXNkdEFzc2V0SWQFB2FjdGlvbnMEDXVzZEJwMldoU2FsZG8IBQFwAl82BAhhY3Rpb25zMgMJAGYCBQ11c2RCcDJXaFNhbGRvAAADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQMJAQIhPQIFA2FtdAUNdXNkQnAyV2hTYWxkbwkAAgEJAKwCAgISUGF5bWVudCBuZWVkZWQgaXMgCQCkAwEFDXVzZEJwMldoU2FsZG8DCQBmAgUOTUlOU0hPUFBBWU1FTlQFA2FtdAkAAgEJAKwCAgIbUGF5bWVudCBzaG91bGQgYmUgYXQgbGVhc3QgCQCkAwEFDk1JTlNIT1BQQVlNRU5UBAt1c2RCcDJXaEZlZQkAawMIBQFwAl82BQpBVUNUSU9ORkVFBQVNVUxUNgQIcmVmQnlLZXkJAQ9rZXlBZGRyZXNzUmVmQnkBBQlsYW5kT3duZXIEBXJlZkJ5CQCdCAIFD3N0YWtpbmdDb250cmFjdAUIcmVmQnlLZXkDCQEJaXNEZWZpbmVkAQUFcmVmQnkJAM0IAgkAzQgCCQDNCAIFCGFjdGlvbnMxCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQlsYW5kT3duZXIJAGUCCAUBcAJfNgkAaAIAAwULdXNkQnAyV2hGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUFcmVmQnkFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAkAzQgCCQDNCAIFCGFjdGlvbnMxCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQlsYW5kT3duZXIJAGUCCAUBcAJfNgkAaAIAAwULdXNkQnAyV2hGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECEk5vIHBheW1lbnRzIG5lZWRlZAUIYWN0aW9uczEJAJQKAgUIYWN0aW9uczIJAJcKBQUMcHJvbG9nUmVzdWx0BQZ3aFNhdmUFBmJwU2F2ZQUPZHVja1N0YXRzUmVzdWx0BQ5hY2NTdGF0c1Jlc3VsdAFpARBzZWxsUHJvZHVjdHNUb0VTAQdhbW91bnRzBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQISTm8gcGF5bWVudHMgbmVlZGVkBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUEJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgQWlycG9ydCwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAhwcm9kTGlzdAMJAAACCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAAUDbmlsCQC1CQIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIBXwQFZXNLZXkJAQ5rZXlFc1dhcmVob3VzZQAECGV4aXN0U3RyCQCiCAEFBWVzS2V5BAxleGlzdEFtb3VudHMDCQEJaXNEZWZpbmVkAQUIZXhpc3RTdHIJALUJAgkBBXZhbHVlAQUIZXhpc3RTdHICAV8FA25pbAoBCG1vdmVQcm9kAgNhY2MJcmVjaXBlU3RyBAFqCAUDYWNjAl8xBAhxdWFudGl0eQMJAGYCCQCQAwEFB2Ftb3VudHMFAWoJAJEDAgUHYW1vdW50cwUBagAAAwkAZgIAAAUIcXVhbnRpdHkJAAIBAhtRdWFudGl0eSBjYW5ub3QgYmUgbmVnYXRpdmUEBnJlY2lwZQkAtQkCBQlyZWNpcGVTdHICAV8DCQECIT0CCQCQAwEFBnJlY2lwZQUKUkVDSVBFU0laRQkAAgEJAKwCAgIXRmF0YWw6IHVua25vd24gcmVjaXBlOiAFCXJlY2lwZVN0cgQJbWF4QW1vdW50CQBoAgUNRVNNQVhQQUNLQUdFUwUOUFJPRFVDVFBLR1NJWkUEC2V4aXN0QW1vdW50AwkAZgIJAJADAQUMZXhpc3RBbW91bnRzBQFqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUMZXhpc3RBbW91bnRzBQFqAAAEBmNhbkJ1eQkAZQIFCW1heEFtb3VudAULZXhpc3RBbW91bnQDCQBmAgUIcXVhbnRpdHkFBmNhbkJ1eQkAAgEJAKwCAgkArAICCQCsAgICF1dhcmVob3VzZSBjYW4gYnV5IG9ubHkgCQCkAwEFBmNhbkJ1eQIEIG9mIAkAkQMCBQlwcm9kVHlwZXMFAWoECHRvdGFsTWF0CQESZ2V0UmVjaXBlTWF0ZXJpYWxzAQUGcmVjaXBlBAl1bml0UHJpY2UJAGsDCQBoAgUIdG90YWxNYXQFCUVTQlVZQ09FRgUQUkVTT1VSQ0VQUklDRU1JTgkAaAIACgUOUFJPRFVDVFBLR1NJWkUEDGJwUHJvZEFtb3VudAMJAGYCCQCQAwEFCHByb2RMaXN0BQFqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIcHJvZExpc3QFAWoAAAMJAGYCBQhxdWFudGl0eQUMYnBQcm9kQW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIOWW91IGhhdmUgb25seSAJAKQDAQUMYnBQcm9kQW1vdW50AgQgb2YgCQCRAwIFCXByb2RUeXBlcwUBagkAlwoFCQBkAgUBagABCQBkAggFA2FjYwJfMgkAaAIFCXVuaXRQcmljZQUIcXVhbnRpdHkJAM0IAggFA2FjYwJfMwkApAMBCQBlAgUMYnBQcm9kQW1vdW50BQhxdWFudGl0eQkAzQgCCAUDYWNjAl80CQCkAwEJAGQCBQtleGlzdEFtb3VudAUIcXVhbnRpdHkJAGQCCAUDYWNjAl81CQBoAgUIdG90YWxNYXQFCHF1YW50aXR5BAZtZXJnZWQKAAIkbAUQcHJvZHVjdGlvbk1hdHJpeAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJcKBQAAAAAFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCG1vdmVQcm9kAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA1MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIECG5ld0JwU3RyCQC6CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCCQC5CQIIBQZtZXJnZWQCXzMCAV8FA25pbAIBOgQGYnBTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUIbmV3QnBTdHIFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUKeHBTZWxsVG9FcwgFBm1lcmdlZAJfNQkAaAIFBU1VTFQ4AAoFA25pbAUDbmlsCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUFZXNLZXkJALkJAggFBm1lcmdlZAJfNAIBXwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIIBQZtZXJnZWQCXzIFC3VzZHRBc3NldElkBQNuaWwJAJUKAwUGYnBTYXZlBQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0AWkBD3VwZGF0ZUVzU3RvcmFnZQEKbmV3U3RvcmFnZQMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5RXNXYXJlaG91c2UABQpuZXdTdG9yYWdlBQNuaWwFCm5ld1N0b3JhZ2UAcFIzzQ==", "height": 2667231, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3Lw7iQVbsjmtycd4YNqzkJVymMH9feytbEVnoiTk9n5T Next: DmN7n6Cyw9agN1ASX1ctstMwSsZ1e87X2FhapuSxsmSZ Diff:
OldNewDifferences
256256 else unit
257257
258258
259-func prolog () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
260- then throw("Contracts are under maintenance")
261- else asInt(invoke(stakingContract, "saveLastTx", nil, nil))
259+func prolog () = asInt(invoke(stakingContract, "saveLastTx", nil, nil))
262260
263261
264262 func setCommon (acc,item) = {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let xpTrade = 100000
55
66 let xpCraft = 100000
77
88 let xpSellToEs = 100000
99
1010 let xpShop = 100000
1111
1212 let LANDPREFIX = "LAND"
1313
1414 let NUMRES = 6
1515
1616 let DEFAULTLOCATION = "Africa_F_Africa"
1717
1818 let RESOURCEPRICEMIN = 39637
1919
2020 let ESMAXPACKAGES = 3
2121
2222 let ESBUYCOEF = 4
2323
2424 let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
2525
2626 let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
2727
2828 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"]
2929
3030 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
3131
3232 let productionMatrix = ["8_8_8_17_17_42_12_0_30_0,0,0,0,0,0,0", "8_8_8_17_17_42_24_0_60_0,0,5,2,0,0,0", "8_8_8_17_17_42_36_0_120_0,0,10,4,0,0,0", "8_19_19_8_27_19_26_1_20_0,0,0,0,0,0,0", "8_19_19_8_27_19_52_1_40_0,0,0,0,0,0,0", "8_19_19_8_27_19_78_1_80_0,0,0,0,0,0,0", "8_8_8_8_8_60_13_2_2_0,0,0,0,0,0,0", "8_8_8_8_8_60_26_2_4_0,0,0,0,0,0,0", "8_8_8_8_8_60_39_2_8_0,0,0,0,0,0,0", "30_30_3_17_17_3_30_3_30_0,0,0,0,0,0,0", "30_30_3_17_17_3_60_3_50_0,0,0,0,0,0,0", "30_30_3_17_17_3_90_3_70_0,0,0,0,0,0,0", "18_18_10_18_18_18_11_4_30_0,0,0,0,0,0,0", "18_18_10_18_18_18_22_4_50_0,0,0,0,0,0,0", "18_18_10_18_18_18_33_4_70_0,0,0,0,0,0,0"]
3333
3434 let rIdxCoeff = 6
3535
3636 let rIdxContinent = 7
3737
3838 let RECIPESIZE = 10
3939
4040 let PRODUCTPKGSIZE = 10
4141
4242 let whIdxLevels = 0
4343
4444 let whIdxRes = 1
4545
4646 let whIdxMat = 2
4747
4848 let whIdxProd = 3
4949
5050 let whIdxLOFT = 4
5151
5252 let volLocked = 0
5353
5454 let volTotal = 3
5555
5656 let bpIdxLevel = 0
5757
5858 let bpIdxRes = 1
5959
6060 let bpIdxMat = 2
6161
6262 let bpIdxProd = 3
6363
6464 func keyLandAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
6565
6666
6767 func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
6868
6969
7070 func keyAddressRefBy (addr) = ("accRefBy_" + addr)
7171
7272
7373 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
7474
7575
7676 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
7777
7878
7979 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
8080
8181
8282 func keyBlocked () = "contractsBlocked"
8383
8484
8585 func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
8686
8787
8888 func keyEsWarehouse () = "emergencyWarehouseProducts"
8989
9090
9191 let locIdxContinent = 0
9292
9393 let locIdxType = 1
9494
9595 let locIdxId = 2
9696
9797 func getRecipeMaterials (recipe) = parseIntValue(recipe[rIdxCoeff])
9898
9999
100100 let chain = take(drop(this.bytes, 1), 1)
101101
102102 let usdtAssetId = match chain {
103103 case _ =>
104104 if ((base58'2W' == $match0))
105105 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
106106 else if ((base58'2T' == $match0))
107107 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
108108 else throw("Unknown chain")
109109 }
110110
111111 let defaultRestAddressStr = match chain {
112112 case _ =>
113113 if ((base58'2W' == $match0))
114114 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
115115 else if ((base58'2T' == $match0))
116116 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
117117 else throw("Unknown chain")
118118 }
119119
120120 let SEP = "__"
121121
122122 let MULT6 = 1000000
123123
124124 let MULT8 = 100000000
125125
126126 let MULT10 = 10000000000
127127
128128 let MINSHOPPAYMENT = 100000
129129
130130 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
131131
132132
133133 let IdxCfgStakingDapp = 1
134134
135135 func keyRestCfg () = "%s__restConfig"
136136
137137
138138 func keyRestAddress () = "%s__restAddr"
139139
140140
141141 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
142142
143143
144144 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
145145
146146
147147 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
148148
149149 let restCfg = readRestCfgOrFail(restContract)
150150
151151 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
152152
153153 func asString (v) = match v {
154154 case s: String =>
155155 s
156156 case _ =>
157157 throw("fail to cast into String")
158158 }
159159
160160
161161 func asInt (v) = match v {
162162 case n: Int =>
163163 n
164164 case _ =>
165165 throw("fail to cast into Int")
166166 }
167167
168168
169169 func fixedPoint (val,decimals) = {
170170 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
171171 ((toString((val / tenPow)) + ".") + toString((val % tenPow)))
172172 }
173173
174174
175175 let FACTORYMAXWAREHOUSE = 10000000000
176176
177177 let SELLMULTIPLIER = 200
178178
179179 let BUYMULTIPLIER = 300
180180
181181 let AUCTIONFEE = 10000
182182
183183 func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
184184
185185
186186 let ordIdxRes = 0
187187
188188 let ordIdxMat = 1
189189
190190 let ordIdxProd = 2
191191
192192 func getOrder (ordKey) = {
193193 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:"), ":")
194194 [if ((size(split(p[ordIdxRes], "_")) == NUMRES))
195195 then p[ordIdxRes]
196196 else "0@0_0@0_0@0_0@0_0@0_0@0", if ((size(split(p[ordIdxMat], "_")) == NUMRES))
197197 then p[ordIdxMat]
198198 else "0@0_0@0_0@0_0@0_0@0_0@0", p[ordIdxProd]]
199199 }
200200
201201
202202 func toVolume (amount,pkgSize,isProduct) = if (isProduct)
203203 then {
204204 let pkgs = if ((amount >= 0))
205205 then (((amount + pkgSize) - 1) / pkgSize)
206206 else -((((-(amount) + pkgSize) - 1) / pkgSize))
207207 (pkgs * MULT8)
208208 }
209209 else amount
210210
211211
212212 func sellInternal (locId,resType,amount,minPrice) = {
213213 let whKey = keyFactoryWarehouseByIdAndType(locId, resType)
214214 let w0 = valueOrElse(getInteger(whKey), 0)
215215 let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
216216 then 0
217217 else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
218218 then (FACTORYMAXWAREHOUSE - w0)
219219 else amount
220220 let usdtReceived = (fraction(r0, ((SELLMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) + (50 * r0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction((amount - r0), RESOURCEPRICEMIN, MULT8))
221221 let min99 = (minPrice - (minPrice / 100))
222222 if (((min99 * amount) > (usdtReceived * MULT8)))
223223 then throw((((((((((("Actual price = " + toString(usdtReceived)) + " / ") + toString(amount)) + " < minPrice = ") + toString(minPrice)) + ", (") + locId) + ", ") + resTypes[resType]) + ")"))
224224 else $Tuple2(IntegerEntry(whKey, (w0 + amount)), usdtReceived)
225225 }
226226
227227
228228 func buyInternal (locId,matType,amount,maxPrice) = {
229229 let whKey = keyFactoryWarehouseByIdAndType(locId, matType)
230230 let w0 = valueOrElse(getInteger(whKey), 0)
231231 let m1 = if ((w0 > FACTORYMAXWAREHOUSE))
232232 then min([amount, (w0 - FACTORYMAXWAREHOUSE)])
233233 else 0
234234 let m0 = min([w0, (amount - m1)])
235235 let m = (m0 + m1)
236236 let usdtSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
237237 let max101 = (maxPrice + (maxPrice / 100))
238238 if (((usdtSpent * MULT8) > (max101 * m)))
239239 then throw((((((((((("Actual price = " + toString(usdtSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
240240 else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdtSpent, m)
241241 }
242242
243243
244244 func getBackpack (bpKey) = {
245245 let p = split(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
246246 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
247247 then p[bpIdxRes]
248248 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
249249 then p[bpIdxMat]
250250 else "0_0_0_0_0_0", p[bpIdxProd]]
251251 }
252252
253253
254254 func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
255255 then throw("Contracts are under maintenance")
256256 else unit
257257
258258
259-func prolog () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
260- then throw("Contracts are under maintenance")
261- else asInt(invoke(stakingContract, "saveLastTx", nil, nil))
259+func prolog () = asInt(invoke(stakingContract, "saveLastTx", nil, nil))
262260
263261
264262 func setCommon (acc,item) = {
265263 let j = acc._1
266264 let isProd = acc._8
267265 let itemParts = split(item, "@")
268266 if ((size(itemParts) != 2))
269267 then throw("Incorrect order format, should be amount@price")
270268 else {
271269 let newOrdAm = parseIntValue(itemParts[0])
272270 let newOrdPr = parseIntValue(itemParts[1])
273271 let newOrdUsd = fraction(newOrdAm, newOrdPr, MULT8)
274272 let newOrdVol = toVolume(newOrdAm, PRODUCTPKGSIZE, isProd)
275273 let whInit = if ((size(acc._6) > j))
276274 then parseIntValue(acc._6[j])
277275 else 0
278276 let curOrdParts = split(if ((size(acc._7) > j))
279277 then acc._7[j]
280278 else "0@0", "@")
281279 let curOrdAm = parseIntValue(curOrdParts[0])
282280 let curOrdPr = parseIntValue(curOrdParts[1])
283281 if (if ((0 > curOrdPr))
284282 then true
285283 else (0 > newOrdPr))
286284 then throw("Price can't be negative")
287285 else {
288286 let curOrdUsd = fraction(curOrdAm, curOrdPr, MULT8)
289287 if ((newOrdAm == 0))
290288 then if ((curOrdAm > 0))
291289 then $Tuple9((j + 1), (acc._2 :+ toString(whInit)), acc._3, acc._4, (acc._5 - curOrdUsd), acc._6, acc._7, isProd, (acc._9 + toVolume(whInit, PRODUCTPKGSIZE, isProd)))
292290 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), PRODUCTPKGSIZE, isProd)))
293291 else if ((newOrdAm > 0))
294292 then if ((0 > curOrdAm))
295293 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), PRODUCTPKGSIZE, isProd))
296294 else $Tuple9((j + 1), (acc._2 :+ toString(whInit)), (acc._3 + newOrdVol), acc._4, ((acc._5 + newOrdUsd) - curOrdUsd), acc._6, acc._7, isProd, toVolume(whInit, PRODUCTPKGSIZE, isProd))
297295 else if ((0 > curOrdAm))
298296 then {
299297 let amDiff = (curOrdAm - newOrdAm)
300298 if ((0 > (whInit - amDiff)))
301299 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whInit)) + " available"))
302300 else $Tuple9((j + 1), (acc._2 :+ toString((whInit - amDiff))), acc._3, (acc._4 - newOrdVol), acc._5, acc._6, acc._7, isProd, toVolume((whInit - amDiff), PRODUCTPKGSIZE, isProd))
303301 }
304302 else if ((0 > (whInit + newOrdAm)))
305303 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whInit)) + " available"))
306304 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), PRODUCTPKGSIZE, isProd))
307305 }
308306 }
309307 }
310308
311309
312310 func setInternal (currentWh,currentOrd,newOrd) = {
313311 let currWhRes = split(currentWh[whIdxRes], "_")
314312 let currWhMat = split(currentWh[whIdxMat], "_")
315313 let currWhProd = if ((currentWh[whIdxProd] == ""))
316314 then nil
317315 else split(currentWh[whIdxProd], "_")
318316 let currentOrdRes = split(currentOrd[ordIdxRes], "_")
319317 let currentOrdMat = split(currentOrd[ordIdxMat], "_")
320318 let currentOrdProd = if ((currentOrd[ordIdxProd] == ""))
321319 then nil
322320 else split(currentOrd[ordIdxProd], "_")
323321 if ((size(newOrd) != 3))
324322 then throw("newOrderStr should contain exactly 2 ':' separators")
325323 else {
326324 let resParts = split(newOrd[0], "_")
327325 let matParts = split(newOrd[1], "_")
328326 let prodParts = if ((newOrd[2] == ""))
329327 then nil
330328 else split(newOrd[2], "_")
331329 if ((size(resParts) != NUMRES))
332330 then throw("All 6 resources should be passed")
333331 else if ((size(matParts) != NUMRES))
334332 then throw("All 6 materials should be passed")
335333 else {
336334 let r = {
337335 let $l = resParts
338336 let $s = size($l)
339337 let $acc0 = $Tuple9(0, nil, 0, 0, 0, currWhRes, currentOrdRes, false, 0)
340338 func $f0_1 ($a,$i) = if (($i >= $s))
341339 then $a
342340 else setCommon($a, $l[$i])
343341
344342 func $f0_2 ($a,$i) = if (($i >= $s))
345343 then $a
346344 else throw("List size exceeds 6")
347345
348346 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
349347 }
350348 let m = {
351349 let $l = matParts
352350 let $s = size($l)
353351 let $acc0 = $Tuple9(0, nil, r._3, r._4, r._5, currWhMat, currentOrdMat, false, r._9)
354352 func $f1_1 ($a,$i) = if (($i >= $s))
355353 then $a
356354 else setCommon($a, $l[$i])
357355
358356 func $f1_2 ($a,$i) = if (($i >= $s))
359357 then $a
360358 else throw("List size exceeds 6")
361359
362360 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
363361 }
364362 let p = if ((size(prodParts) != 0))
365363 then {
366364 let $l = prodParts
367365 let $s = size($l)
368366 let $acc0 = $Tuple9(0, nil, m._3, m._4, m._5, currWhProd, currentOrdProd, true, m._9)
369367 func $f2_1 ($a,$i) = if (($i >= $s))
370368 then $a
371369 else setCommon($a, $l[$i])
372370
373371 func $f2_2 ($a,$i) = if (($i >= $s))
374372 then $a
375373 else throw("List size exceeds 50")
376374
377375 $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)
378376 }
379377 else $Tuple9(0, currWhProd, m._3, m._4, m._5, currWhProd, currentOrdProd, true, m._9)
380378 $Tuple7(r._2, m._2, p._2, p._3, p._4, p._5, p._9)
381379 }
382380 }
383381 }
384382
385383
386384 func acceptCommon (acc,bpOrdItem) = {
387385 let j = acc._7
388386 let isProd = acc._12
389387 let bpOrdParts = split(bpOrdItem, "@")
390388 if ((size(bpOrdParts) != 2))
391389 then throw("Incorrect order format, should be amount@price")
392390 else {
393391 let bpOrdAm = parseIntValue(bpOrdParts[0])
394392 let bpOrdPr = parseIntValue(bpOrdParts[1])
395393 if ((0 > bpOrdPr))
396394 then throw("Price can't be negative")
397395 else {
398396 let bpOrdUsd = fraction(bpOrdAm, bpOrdPr, MULT8)
399397 let bpInit = if ((size(acc._8) > j))
400398 then parseIntValue(acc._8[j])
401399 else 0
402400 let whInit = if ((size(acc._9) > j))
403401 then parseIntValue(acc._9[j])
404402 else 0
405403 let whOrdInit = if ((size(acc._10) > j))
406404 then acc._10[j]
407405 else "0@0"
408406 let whOrdParts = split(whOrdInit, "@")
409407 let whOrdAm = parseIntValue(whOrdParts[0])
410408 let whOrdPr = parseIntValue(whOrdParts[1])
411409 if (if ((bpOrdAm != 0))
412410 then (bpOrdPr != whOrdPr)
413411 else false)
414412 then throw(((((("Prices of " + acc._11[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
415413 else {
416414 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
417415 let deltaVol = toVolume(bpOrdAm, PRODUCTPKGSIZE, isProd)
418416 if ((bpOrdAm == 0))
419417 then $Tuple13((acc._1 :+ toString(whInit)), (acc._2 :+ whOrdInit), (acc._3 :+ toString(bpInit)), acc._4, acc._5, acc._6, (acc._7 + 1), acc._8, acc._9, acc._10, acc._11, isProd, acc._13)
420418 else if ((bpOrdAm > 0))
421419 then if ((0 > whOrdAm))
422420 then if ((bpOrdAm > -(whOrdAm)))
423421 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + acc._11[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
424422 else $Tuple13((acc._1 :+ toString(whInit)), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpInit + bpOrdAm))), (acc._4 + deltaVol), acc._5, (acc._6 + bpOrdUsd), (acc._7 + 1), acc._8, acc._9, acc._10, acc._11, isProd, (acc._13 + (if (isProd)
425423 then (bpOrdAm * MULT8)
426424 else bpOrdAm)))
427425 else throw((("Attempt to buy " + acc._11[j]) + " while warehouse doesn't sell it"))
428426 else if ((whOrdAm > 0))
429427 then if ((-(bpOrdAm) > whOrdAm))
430428 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + acc._11[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
431429 else if ((-(bpOrdAm) > bpInit))
432430 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + toString(bpInit)) + " of ") + acc._11[j]))
433431 else $Tuple13((acc._1 :+ toString((whInit - bpOrdAm))), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpInit + bpOrdAm))), (acc._4 - deltaVol), (acc._5 - bpOrdUsd), acc._6, (acc._7 + 1), acc._8, acc._9, acc._10, acc._11, isProd, (acc._13 - (if (isProd)
434432 then (bpOrdAm * MULT8)
435433 else bpOrdAm)))
436434 else throw((("Attempt to sell " + acc._11[j]) + " while warehouse doesn't buy it"))
437435 }
438436 }
439437 }
440438 }
441439
442440
443441 @Callable(i)
444442 func recalcLockedVolumeREADONLY (landAssetId,wh) = {
445443 let currentOrd = getOrder(keyOrderByLand(landAssetId))
446444 let z = setInternal(wh, currentOrd, currentOrd)
447445 $Tuple2(nil, (z._4 + z._5))
448446 }
449447
450448
451449
452450 @Callable(i)
453451 func constructorV1 (restAddr) = if ((i.caller != this))
454452 then throw("Permission denied")
455453 else [StringEntry(keyRestAddress(), restAddr)]
456454
457455
458456
459457 @Callable(i)
460458 func sellResources (amounts,minPrices) = {
461459 let prologResult = prolog()
462460 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
463461 if ((size(i.payments) != 0))
464462 then throw("sellResources doesn't require any payments")
465463 else {
466464 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
467465 if ((curLocation[locIdxType] != "F"))
468466 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
469467 else {
470468 let locId = curLocation[locIdxId]
471469 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
472470 let resList = split(currentPack[bpIdxRes], "_")
473471 func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
474472 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
475473 else if ((0 > amounts[j]))
476474 then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
477475 else if ((amounts[j] > 0))
478476 then {
479477 let b = sellInternal(locId, j, amounts[j], minPrices[j])
480478 $Tuple4((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2), (acc._4 + amounts[j]))
481479 }
482480 else $Tuple4(acc._1, (acc._2 :+ resList[j]), acc._3, acc._4)
483481
484482 let merged = {
485483 let $l = [0, 1, 2, 3, 4, 5]
486484 let $s = size($l)
487485 let $acc0 = $Tuple4(nil, nil, 0, 0)
488486 func $f0_1 ($a,$i) = if (($i >= $s))
489487 then $a
490488 else adder($a, $l[$i])
491489
492490 func $f0_2 ($a,$i) = if (($i >= $s))
493491 then $a
494492 else throw("List size exceeds 6")
495493
496494 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
497495 }
498496 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
499497 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
500498 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, merged._4, MULT8)], nil))
501499 $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdtAssetId)), $Tuple3(result, prologResult, statsResult))
502500 }
503501 }
504502 }
505503
506504
507505
508506 @Callable(i)
509507 func buyMaterials (amounts,maxPrices) = {
510508 let prologResult = prolog()
511509 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
512510 if ((size(i.payments) != 1))
513511 then throw("exactly 1 payment must be attached")
514512 else {
515513 let pmt = i.payments[0]
516514 let amt = pmt.amount
517515 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
518516 if ((pmtAssetId != usdtAssetId))
519517 then throw("USDT payments only!")
520518 else {
521519 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
522520 if ((curLocation[locIdxType] != "F"))
523521 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
524522 else {
525523 let locId = curLocation[locIdxId]
526524 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
527525 let matList = split(currentPack[bpIdxMat], "_")
528526 func mUpdater (acc,j) = if ((0 > amounts[j]))
529527 then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
530528 else if ((amounts[j] > 0))
531529 then {
532530 let b = buyInternal(locId, j, amounts[j], maxPrices[j])
533531 $Tuple4((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2), (acc._4 + amounts[j]))
534532 }
535533 else $Tuple4(acc._1, (acc._2 :+ matList[j]), acc._3, acc._4)
536534
537535 let merged = {
538536 let $l = [0, 1, 2, 3, 4, 5]
539537 let $s = size($l)
540538 let $acc0 = $Tuple4(nil, nil, 0, 0)
541539 func $f0_1 ($a,$i) = if (($i >= $s))
542540 then $a
543541 else mUpdater($a, $l[$i])
544542
545543 func $f0_2 ($a,$i) = if (($i >= $s))
546544 then $a
547545 else throw("List size exceeds 6")
548546
549547 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
550548 }
551549 if ((merged._3 > amt))
552550 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
553551 else {
554552 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
555553 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
556554 let rest = if (((amt - merged._3) > 0))
557555 then [ScriptTransfer(i.caller, (amt - merged._3), usdtAssetId)]
558556 else nil
559557 let activitiesAmount = (merged._3 / 100)
560558 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, merged._4, MULT8)], nil))
561559 $Tuple2(((merged._1 ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(result, prologResult, statsResult))
562560 }
563561 }
564562 }
565563 }
566564 }
567565
568566
569567
570568 @Callable(i)
571569 func exchangeResources (amounts) = {
572570 let prologResult = prolog()
573571 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
574572 if ((size(i.payments) != 1))
575573 then throw("exactly 1 payment must be attached")
576574 else {
577575 let pmt = i.payments[0]
578576 let amt = pmt.amount
579577 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
580578 if ((pmtAssetId != usdtAssetId))
581579 then throw("USDT payments only!")
582580 else {
583581 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
584582 if ((curLocation[locIdxType] != "F"))
585583 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
586584 else {
587585 let locId = curLocation[locIdxId]
588586 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
589587 let resList = split(currentPack[bpIdxRes], "_")
590588 let matList = split(currentPack[bpIdxMat], "_")
591589 func exchanger (acc,j) = {
592590 let whKey = keyFactoryWarehouseByIdAndType(locId, j)
593591 let w0 = valueOrElse(getInteger(whKey), 0)
594592 let amj = amounts[j]
595593 if ((amj > parseIntValue(resList[j])))
596594 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to exchange ") + toString(amj)))
597595 else if ((0 > amj))
598596 then throw(((("You tried to exchange negative amount of " + resTypes[j]) + ": ") + toString(amj)))
599597 else if ((amj > 0))
600598 then $Tuple5((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)), (acc._5 + amj))
601599 else $Tuple5((acc._1 :+ resList[j]), (acc._2 :+ matList[j]), acc._3, acc._4, acc._5)
602600 }
603601
604602 let merged = {
605603 let $l = [0, 1, 2, 3, 4, 5]
606604 let $s = size($l)
607605 let $acc0 = $Tuple5(nil, nil, 0, nil, 0)
608606 func $f0_1 ($a,$i) = if (($i >= $s))
609607 then $a
610608 else exchanger($a, $l[$i])
611609
612610 func $f0_2 ($a,$i) = if (($i >= $s))
613611 then $a
614612 else throw("List size exceeds 6")
615613
616614 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
617615 }
618616 if ((merged._3 > amt))
619617 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
620618 else {
621619 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._1, "_"), makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
622620 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
623621 let rest = if (((amt - merged._3) > 0))
624622 then [ScriptTransfer(i.caller, (amt - merged._3), usdtAssetId)]
625623 else nil
626624 let activitiesAmount = (merged._3 / 100)
627625 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, merged._5, MULT8)], nil))
628626 $Tuple2(((rest ++ merged._4) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(result, prologResult, statsResult))
629627 }
630628 }
631629 }
632630 }
633631 }
634632
635633
636634
637635 @Callable(i)
638636 func craftGoods (productIdx,quantity) = {
639637 let prologResult = prolog()
640638 if ((size(i.payments) != 1))
641639 then throw("exactly 1 payment must be attached")
642640 else {
643641 let pmt = i.payments[0]
644642 let amt = pmt.amount
645643 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
646644 if ((pmtAssetId != usdtAssetId))
647645 then throw("USDT payments only!")
648646 else if ((amt != MULT6))
649647 then throw("exactly 1 USDT must be attached as payment")
650648 else if ((0 >= quantity))
651649 then throw("Quantity should be positive")
652650 else {
653651 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
654652 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
655653 if ((curLocation[locIdxType] != "M"))
656654 then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
657655 else {
658656 let cont = curLocation[locIdxContinent]
659657 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
660658 let matList = split(currentPack[bpIdxMat], "_")
661659 if (if ((0 > productIdx))
662660 then true
663661 else (productIdx >= size(productionMatrix)))
664662 then throw(("Unknown product idx=" + toString(productIdx)))
665663 else {
666664 let recipe = split(productionMatrix[productIdx], "_")
667665 if ((size(recipe) != RECIPESIZE))
668666 then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
669667 else {
670668 let productContIdx = parseIntValue(recipe[rIdxContinent])
671669 if ((continents[productContIdx] != cont))
672670 then throw(((("This product is available in " + continents[productContIdx]) + ", but you are in ") + cont))
673671 else {
674672 let prodList = if ((currentPack[bpIdxProd] == ""))
675673 then nil
676674 else split(currentPack[bpIdxProd], "_")
677675 func filler (acc,ignoredItem) = {
678676 let n = acc._2
679677 let xs = if ((size(prodList) > n))
680678 then prodList[n]
681679 else "0"
682680 let x = parseIntValue(xs)
683681 let amount = (quantity * PRODUCTPKGSIZE)
684682 let y = if ((n == productIdx))
685683 then toString((x + amount))
686684 else xs
687685 $Tuple2((acc._1 :+ y), (n + 1))
688686 }
689687
690688 let bpProd = ( let $l = productionMatrix
691689 let $s = size($l)
692690 let $acc0 = $Tuple2(nil, 0)
693691 func $f0_1 ($a,$i) = if (($i >= $s))
694692 then $a
695693 else filler($a, $l[$i])
696694
697695 func $f0_2 ($a,$i) = if (($i >= $s))
698696 then $a
699697 else throw("List size exceeds 50")
700698
701699 $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
702700 func producer (acc,j) = {
703701 let needMat = ((parseIntValue(recipe[j]) * MULT6) * quantity)
704702 let haveMat = parseIntValue(matList[j])
705703 if ((needMat > haveMat))
706704 then throw(((((((("You have " + fixedPoint(haveMat, 8)) + " of ") + matTypes[j]) + ", but recipe requires ") + fixedPoint(needMat, 8)) + " for quantity ") + toString(quantity)))
707705 else if ((needMat > 0))
708706 then $Tuple2((acc._1 :+ toString((haveMat - needMat))), (acc._2 + needMat))
709707 else $Tuple2((acc._1 :+ matList[j]), acc._2)
710708 }
711709
712710 let merged = {
713711 let $l = [0, 1, 2, 3, 4, 5]
714712 let $s = size($l)
715713 let $acc0 = $Tuple2(nil, 0)
716714 func $f1_1 ($a,$i) = if (($i >= $s))
717715 then $a
718716 else producer($a, $l[$i])
719717
720718 func $f1_2 ($a,$i) = if (($i >= $s))
721719 then $a
722720 else throw("List size exceeds 6")
723721
724722 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
725723 }
726724 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._1, "_"), makeString(bpProd, "_")], ":")
727725 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
728726 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpCraft, merged._2, MULT8)], nil))
729727 $Tuple2(nil, $Tuple3(result, prologResult, statsResult))
730728 }
731729 }
732730 }
733731 }
734732 }
735733 }
736734 }
737735
738736
739737
740738 @Callable(i)
741739 func setWarehouseOrder (newOrderStr,landAssetId) = {
742740 let user = i.originCaller
743741 let addr = toString(user)
744742 let result = if ((user != restContract))
745743 then checkBlocked()
746744 else false
747745 let asset = value(assetInfo(fromBase58String(landAssetId)))
748746 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
749747 then throw((("NFT " + asset.name) + " is not staked"))
750748 else {
751749 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
752750 if (if ((user != restContract))
753751 then (owner != addr)
754752 else false)
755753 then throw((LANDPREFIX + " is not yours"))
756754 else {
757755 let newOrder = split_4C(newOrderStr, ":")
758756 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
759757 let currentWh = split_4C(wh, ":")
760758 let loft = split(currentWh[whIdxLOFT], "_")
761759 let whTotal = parseIntValue(loft[volTotal])
762760 let ordKey = keyOrderByLand(landAssetId)
763761 let currentOrd = getOrder(ordKey)
764762 let z = setInternal(currentWh, currentOrd, newOrder)
765763 let buyVolSaldo = z._4
766764 let sellVolSaldo = z._5
767765 let whOccupied = z._7
768766 let whLocked = (buyVolSaldo + sellVolSaldo)
769767 let whFree = ((whTotal - whOccupied) - whLocked)
770768 if ((0 > whFree))
771769 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"))
772770 else {
773771 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(z._1, "_"), makeString(z._2, "_"), makeString(z._3, "_"), toString(whLocked)], ":")
774772 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
775773 let usdSaldo = z._6
776774 let actions = if ((usdSaldo > 0))
777775 then if ((size(i.payments) != 1))
778776 then throw("exactly 1 payment must be attached")
779777 else {
780778 let pmt = i.payments[0]
781779 let amt = pmt.amount
782780 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
783781 if ((pmtAssetId != usdtAssetId))
784782 then throw("USDT payments only!")
785783 else if ((amt != usdSaldo))
786784 then throw(("Payment needed is " + toString(usdSaldo)))
787785 else [StringEntry(ordKey, newOrderStr)]
788786 }
789787 else if ((usdSaldo == 0))
790788 then if ((size(i.payments) != 0))
791789 then throw("No payments needed")
792790 else [StringEntry(ordKey, newOrderStr)]
793791 else if ((size(i.payments) != 0))
794792 then throw("No payments needed")
795793 else [ScriptTransfer(addressFromStringValue(owner), -(usdSaldo), usdtAssetId), StringEntry(ordKey, newOrderStr)]
796794 $Tuple2(actions, $Tuple2(result, whSave))
797795 }
798796 }
799797 }
800798 }
801799
802800
803801
804802 @Callable(i)
805803 func acceptWarehouseOrder (bpOrderStr,landAssetId,duckAssetId) = {
806804 let prologResult = prolog()
807805 let caller = i.originCaller
808806 let callerAddr = toString(caller)
809807 let stakedDuckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
810808 let curLocation = valueOrElse(getString(stakingContract, keyDuckLocation(stakedDuckAssetId)), DEFAULTLOCATION)
811809 let loc = split(value(curLocation), "_")
812810 if ((loc[locIdxType] != "L"))
813811 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
814812 else if ((stakedDuckAssetId != duckAssetId))
815813 then throw(((("Your staked duck is " + stakedDuckAssetId) + ", but passed ") + duckAssetId))
816814 else {
817815 let landAsset = value(assetInfo(fromBase58String(landAssetId)))
818816 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
819817 then throw((("NFT " + landAsset.name) + " is not staked"))
820818 else {
821819 let landOwner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + landAsset.name) + " is orphaned"))
822820 if ((landOwner == callerAddr))
823821 then throw("You cannot trade with yourself")
824822 else {
825823 let bpOrderParts = split_4C(bpOrderStr, ":")
826824 if ((size(bpOrderParts) != 3))
827825 then throw("bpOrderStr should contain exactly 2 ':' separators")
828826 else {
829827 let bpOrdRes = split(bpOrderParts[0], "_")
830828 let bpOrdMat = split(bpOrderParts[1], "_")
831829 let bpOrdProd = if ((bpOrderParts[2] == ""))
832830 then nil
833831 else split(bpOrderParts[2], "_")
834832 if ((size(bpOrdRes) != NUMRES))
835833 then throw("All 6 resources should be passed")
836834 else if ((size(bpOrdMat) != NUMRES))
837835 then throw("All 6 materials should be passed")
838836 else {
839837 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
840838 let currentWh = split_4C(wh, ":")
841839 let currWhRes = split(currentWh[whIdxRes], "_")
842840 let currWhMat = split(currentWh[whIdxMat], "_")
843841 let currWhProd = if ((currentWh[whIdxProd] == ""))
844842 then nil
845843 else split(currentWh[whIdxProd], "_")
846844 let currWhLockedVol = parseIntValue(split(currentWh[whIdxLOFT], "_")[volLocked])
847845 let bpKey = keyBackpackByDuck(duckAssetId)
848846 let currentPack = getBackpack(bpKey)
849847 let bpResList = split(currentPack[bpIdxRes], "_")
850848 let bpMatList = split(currentPack[bpIdxMat], "_")
851849 let bpProdList = if ((currentPack[bpIdxProd] == ""))
852850 then nil
853851 else split(currentPack[bpIdxProd], "_")
854852 let ordKey = keyOrderByLand(landAssetId)
855853 let whOrd = getOrder(ordKey)
856854 let whOrdRes = split(whOrd[ordIdxRes], "_")
857855 let whOrdMat = split(whOrd[ordIdxMat], "_")
858856 let whOrdProd = if ((whOrd[ordIdxProd] == ""))
859857 then nil
860858 else split(whOrd[ordIdxProd], "_")
861859 let r = {
862860 let $l = bpOrdRes
863861 let $s = size($l)
864862 let $acc0 = $Tuple13(nil, nil, nil, 0, 0, 0, 0, bpResList, currWhRes, whOrdRes, resTypes, false, 0)
865863 func $f0_1 ($a,$i) = if (($i >= $s))
866864 then $a
867865 else acceptCommon($a, $l[$i])
868866
869867 func $f0_2 ($a,$i) = if (($i >= $s))
870868 then $a
871869 else throw("List size exceeds 6")
872870
873871 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
874872 }
875873 let m = {
876874 let $l = bpOrdMat
877875 let $s = size($l)
878876 let $acc0 = $Tuple13(nil, nil, nil, r._4, r._5, r._6, 0, bpMatList, currWhMat, whOrdMat, matTypes, false, r._13)
879877 func $f1_1 ($a,$i) = if (($i >= $s))
880878 then $a
881879 else acceptCommon($a, $l[$i])
882880
883881 func $f1_2 ($a,$i) = if (($i >= $s))
884882 then $a
885883 else throw("List size exceeds 6")
886884
887885 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
888886 }
889887 let p = if ((size(bpOrdProd) != 0))
890888 then {
891889 let $l = bpOrdProd
892890 let $s = size($l)
893891 let $acc0 = $Tuple13(nil, nil, nil, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd, prodTypes, true, m._13)
894892 func $f2_1 ($a,$i) = if (($i >= $s))
895893 then $a
896894 else acceptCommon($a, $l[$i])
897895
898896 func $f2_2 ($a,$i) = if (($i >= $s))
899897 then $a
900898 else throw("List size exceeds 50")
901899
902900 $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)
903901 }
904902 else $Tuple13(currWhProd, whOrdProd, bpProdList, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd, prodTypes, true, m._13)
905903 let volSaldo = p._4
906904 let newLockedVol = if ((0 > (currWhLockedVol - volSaldo)))
907905 then 0
908906 else (currWhLockedVol - volSaldo)
909907 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(r._1, "_"), makeString(m._1, "_"), makeString(p._1, "_"), toString(newLockedVol)], ":")
910908 let newWhOrdStr = makeString_2C([makeString(r._2, "_"), makeString(m._2, "_"), makeString(p._2, "_")], ":")
911909 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(r._3, "_"), makeString(m._3, "_"), makeString(p._3, "_")], ":")
912910 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
913911 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
914912 let duckStatsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpShop, p._13, MULT8)], nil))
915913 let accStatsResult = asInt(invoke(stakingContract, "updateAccStats", [landOwner, fraction(xpShop, p._13, MULT8)], nil))
916914 let actions = [StringEntry(ordKey, newWhOrdStr)]
917915 let usdWh2BpSaldo = p._5
918916 let actions1 = if ((usdWh2BpSaldo > 0))
919917 then {
920918 let usdWh2BpFee = fraction(p._5, AUCTIONFEE, MULT6)
921919 let refByKey = keyAddressRefBy(callerAddr)
922920 let refBy = getString(stakingContract, refByKey)
923921 if (isDefined(refBy))
924922 then (((actions :+ ScriptTransfer(caller, (p._5 - (3 * usdWh2BpFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdWh2BpFee, usdtAssetId)) :+ ScriptTransfer(addressFromStringValue(value(refBy)), usdWh2BpFee, usdtAssetId))
925923 else ((actions :+ ScriptTransfer(caller, (p._5 - (3 * usdWh2BpFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdWh2BpFee, usdtAssetId))
926924 }
927925 else actions
928926 let usdBp2WhSaldo = p._6
929927 let actions2 = if ((usdBp2WhSaldo > 0))
930928 then if ((size(i.payments) != 1))
931929 then throw("exactly 1 payment must be attached")
932930 else {
933931 let pmt = i.payments[0]
934932 let amt = pmt.amount
935933 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
936934 if ((pmtAssetId != usdtAssetId))
937935 then throw("USDT payments only!")
938936 else if ((amt != usdBp2WhSaldo))
939937 then throw(("Payment needed is " + toString(usdBp2WhSaldo)))
940938 else if ((MINSHOPPAYMENT > amt))
941939 then throw(("Payment should be at least " + toString(MINSHOPPAYMENT)))
942940 else {
943941 let usdBp2WhFee = fraction(p._6, AUCTIONFEE, MULT6)
944942 let refByKey = keyAddressRefBy(landOwner)
945943 let refBy = getString(stakingContract, refByKey)
946944 if (isDefined(refBy))
947945 then (((actions1 :+ ScriptTransfer(addressFromStringValue(landOwner), (p._6 - (3 * usdBp2WhFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdBp2WhFee, usdtAssetId)) :+ ScriptTransfer(addressFromStringValue(value(refBy)), usdBp2WhFee, usdtAssetId))
948946 else ((actions1 :+ ScriptTransfer(addressFromStringValue(landOwner), (p._6 - (3 * usdBp2WhFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdBp2WhFee, usdtAssetId))
949947 }
950948 }
951949 else if ((size(i.payments) != 0))
952950 then throw("No payments needed")
953951 else actions1
954952 $Tuple2(actions2, $Tuple5(prologResult, whSave, bpSave, duckStatsResult, accStatsResult))
955953 }
956954 }
957955 }
958956 }
959957 }
960958 }
961959
962960
963961
964962 @Callable(i)
965963 func sellProductsToES (amounts) = {
966964 let prologResult = prolog()
967965 if ((size(i.payments) != 0))
968966 then throw("No payments needed")
969967 else {
970968 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
971969 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
972970 if ((curLocation[locIdxType] != "A"))
973971 then throw(("Duck location type should be Airport, but is " + curLocation[locIdxType]))
974972 else {
975973 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
976974 let prodList = if ((currentPack[bpIdxProd] == ""))
977975 then nil
978976 else split(currentPack[bpIdxProd], "_")
979977 let esKey = keyEsWarehouse()
980978 let existStr = getString(esKey)
981979 let existAmounts = if (isDefined(existStr))
982980 then split(value(existStr), "_")
983981 else nil
984982 func moveProd (acc,recipeStr) = {
985983 let j = acc._1
986984 let quantity = if ((size(amounts) > j))
987985 then amounts[j]
988986 else 0
989987 if ((0 > quantity))
990988 then throw("Quantity cannot be negative")
991989 else {
992990 let recipe = split(recipeStr, "_")
993991 if ((size(recipe) != RECIPESIZE))
994992 then throw(("Fatal: unknown recipe: " + recipeStr))
995993 else {
996994 let maxAmount = (ESMAXPACKAGES * PRODUCTPKGSIZE)
997995 let existAmount = if ((size(existAmounts) > j))
998996 then parseIntValue(existAmounts[j])
999997 else 0
1000998 let canBuy = (maxAmount - existAmount)
1001999 if ((quantity > canBuy))
10021000 then throw(((("Warehouse can buy only " + toString(canBuy)) + " of ") + prodTypes[j]))
10031001 else {
10041002 let totalMat = getRecipeMaterials(recipe)
10051003 let unitPrice = fraction((totalMat * ESBUYCOEF), RESOURCEPRICEMIN, (10 * PRODUCTPKGSIZE))
10061004 let bpProdAmount = if ((size(prodList) > j))
10071005 then parseIntValue(prodList[j])
10081006 else 0
10091007 if ((quantity > bpProdAmount))
10101008 then throw(((("You have only " + toString(bpProdAmount)) + " of ") + prodTypes[j]))
10111009 else $Tuple5((j + 1), (acc._2 + (unitPrice * quantity)), (acc._3 :+ toString((bpProdAmount - quantity))), (acc._4 :+ toString((existAmount + quantity))), (acc._5 + (totalMat * quantity)))
10121010 }
10131011 }
10141012 }
10151013 }
10161014
10171015 let merged = {
10181016 let $l = productionMatrix
10191017 let $s = size($l)
10201018 let $acc0 = $Tuple5(0, 0, nil, nil, 0)
10211019 func $f0_1 ($a,$i) = if (($i >= $s))
10221020 then $a
10231021 else moveProd($a, $l[$i])
10241022
10251023 func $f0_2 ($a,$i) = if (($i >= $s))
10261024 then $a
10271025 else throw("List size exceeds 50")
10281026
10291027 $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)
10301028 }
10311029 let newBpStr = makeString_2C([currentPack[bpIdxLevel], currentPack[bpIdxRes], currentPack[bpIdxMat], makeString(merged._3, "_")], ":")
10321030 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
10331031 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpSellToEs, merged._5, (MULT8 * 10))], nil))
10341032 $Tuple2([StringEntry(esKey, makeString(merged._4, "_")), ScriptTransfer(i.caller, merged._2, usdtAssetId)], $Tuple3(bpSave, prologResult, statsResult))
10351033 }
10361034 }
10371035 }
10381036
10391037
10401038
10411039 @Callable(i)
10421040 func updateEsStorage (newStorage) = if ((i.caller != stakingContract))
10431041 then throw("Permission denied")
10441042 else $Tuple2([StringEntry(keyEsWarehouse(), newStorage)], newStorage)
10451043
10461044

github/deemru/w8io/873ac7e 
597.17 ms