tx · 8NByfqanwCqdiaefVdpq4Zjij92Tj4hLAJLNhPphwPhV 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep: -0.03600000 Waves 2023.09.02 15:52 [2737769] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves
{ "type": 13, "id": "8NByfqanwCqdiaefVdpq4Zjij92Tj4hLAJLNhPphwPhV", "fee": 3600000, "feeAssetId": null, "timestamp": 1693659227567, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "3cQsyUUMKa3ifS8XeGmtPnJTAeDpAmBcvHA6F8rUq4HYASdcn9LwSq5GnHafwE8fcc2gzBinLRSSDs1eijpYhwBZ" ], "script": "base64:BgI7CAISBAoCCBgSAwoBCBIECgIRERIECgIRERIDCgEREgQKAgEBEgQKAggIEgUKAwgICBIDCgEREgMKAQhTAAd4cFRyYWRlAJBOAAd4cENyYWZ0AJBOAAp4cFNlbGxUb0VzAJBOAAZ4cFNob3AAkE4ACkxBTkRQUkVGSVgCBExBTkQABk5VTVJFUwAGAA9ERUZBVUxUTE9DQVRJT04CD0FmcmljYV9GX0FmcmljYQAQUkVTT1VSQ0VQUklDRU1JTgDVtQIADUVTTUFYUEFDS0FHRVMAAwAJRVNCVVlDT0VGAAQACHJlc1R5cGVzCQDMCAICA09pbAkAzAgCAgNPcmUJAMwIAgIEV29vZAkAzAgCAgRTYW5kCQDMCAICBENsYXkJAMwIAgIHT3JnYW5pYwUDbmlsAAhtYXRUeXBlcwkAzAgCAgRGdWVsCQDMCAICBU1ldGFsCQDMCAICBVBsYW5rCQDMCAICBUdsYXNzCQDMCAICB1BsYXN0aWMJAMwIAgIHUHJvdGVpbgUDbmlsAAlwcm9kVHlwZXMJAMwIAgIQRmlyc3QgQWlkIEtpdCBMMQkAzAgCAhBGaXJzdCBBaWQgS2l0IEwyCQDMCAICEEZpcnN0IEFpZCBLaXQgTDMJAMwIAgILQmFja3BhY2sgTDEJAMwIAgILQmFja3BhY2sgTDIJAMwIAgILQmFja3BhY2sgTDMJAMwIAgIORm9vZCBSYXRpb24gTDEJAMwIAgIORm9vZCBSYXRpb24gTDIJAMwIAgIORm9vZCBSYXRpb24gTDMJAMwIAgILSmV0IFBhY2sgTDEJAMwIAgILSmV0IFBhY2sgTDIJAMwIAgILSmV0IFBhY2sgTDMJAMwIAgIJU2hpZWxkIEwxCQDMCAICCVNoaWVsZCBMMgkAzAgCAglTaGllbGQgTDMJAMwIAgIHTWluZSBMMQkAzAgCAgdNaW5lIEwyCQDMCAICB01pbmUgTDMJAMwIAgIHVHJhcCBMMQkAzAgCAgdUcmFwIEwyCQDMCAICB1RyYXAgTDMFA25pbAAKY29udGluZW50cwkAzAgCAghBbWVyaWNhcwkAzAgCAgZFdXJvcGUJAMwIAgIEQXNpYQkAzAgCAgZBZnJpY2EJAMwIAgIHT2NlYW5pYQUDbmlsAAlDT0VGRjJNQVQAgK3iBAAQcHJvZHVjdGlvbk1hdHJpeAkAzAgCAiU4XzhfOF8xN18xN180Ml8xMl8wXzMwXzAsMCwwLDAsMCwwLDBfCQDMCAICJThfOF84XzE3XzE3XzQyXzI0XzBfNjBfMCwwLDUsMiwwLDAsMF8JAMwIAgInOF84XzhfMTdfMTdfNDJfMzZfMF8xMjBfMCwwLDEwLDQsMCwwLDBfCQDMCAICKThfMTlfMTlfOF8yN18xOV8yNl8xXzIwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICKThfMTlfMTlfOF8yN18xOV81Ml8xXzQwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICKThfMTlfMTlfOF8yN18xOV83OF8xXzgwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICJThfOF84XzhfOF82MF8xM18yXzJfMCwwLDAsMCwwLDAsMF8wMTEJAMwIAgIlOF84XzhfOF84XzYwXzI2XzJfNF8wLDAsMCwwLDAsMCwwXzAxMQkAzAgCAiU4XzhfOF84XzhfNjBfMzlfMl84XzAsMCwwLDAsMCwwLDBfMDExCQDMCAICKTMwXzMwXzNfMTdfMTdfM18zMF8zXzMwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKTMwXzMwXzNfMTdfMTdfM182MF8zXzUwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKTMwXzMwXzNfMTdfMTdfM185MF8zXzcwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKzE4XzE4XzEwXzE4XzE4XzE4XzExXzRfMTBfMCwwLDAsMCwwLDAsMF8yMDEJAMwIAgIrMThfMThfMTBfMThfMThfMThfMjJfNF8yMF8wLDAsMCwwLDAsMCwwXzIwMQkAzAgCAisxOF8xOF8xMF8xOF8xOF8xOF8zM180XzMwXzAsMCwwLDAsMCwwLDBfMjAxCQDMCAICKjRfMTNfMjJfNF8zNV8yMl8yM18wXzUwLDEsMF8wLDAsMCwwLDAsMCwwXwkAzAgCAio0XzEzXzIyXzRfMzVfMjJfNDZfMF81MCwxLDFfMCwyLDUsMCwwLDAsMF8JAMwIAgIrNF8xM18yMl80XzM1XzIyXzY5XzBfNTAsMiwxXzAsNSwxMCwwLDAsMCwwXwkAzAgCAio1XzI1XzQwXzVfMTBfMTVfMjBfMV8zMCwxLDFfMCwwLDAsMCwwLDAsMF8JAMwIAgIqNV8yNV80MF81XzEwXzE1XzQwXzFfMzAsMSwyXzIsMSwzLDAsMCwwLDBfCQDMCAICKjVfMjVfNDBfNV8xMF8xNV82MF8xXzMwLDEsM181LDIsOCwwLDAsMCwwXwUDbmlsAAlySWR4Q29lZmYABgANcklkeENvbnRpbmVudAAHAApSRUNJUEVTSVpFAAsADlBST0RVQ1RQS0dTSVpFAAoAC3doSWR4TGV2ZWxzAAAACHdoSWR4UmVzAAEACHdoSWR4TWF0AAIACXdoSWR4UHJvZAADAAl3aElkeExPRlQABAAJdm9sTG9ja2VkAAAACHZvbFRvdGFsAAMACmJwSWR4TGV2ZWwAAAAIYnBJZHhSZXMAAQAIYnBJZHhNYXQAAgAJYnBJZHhQcm9kAAMBFWtleUxhbmRBc3NldElkVG9Pd25lcgEHYXNzZXRJZAkArAICAgluZnRPd25lcl8FB2Fzc2V0SWQBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBB2Fzc2V0SWQJAKwCAgILc3Rha2VkVGltZV8FB2Fzc2V0SWQBD2tleUFkZHJlc3NSZWZCeQEEYWRkcgkArAICAglhY2NSZWZCeV8FBGFkZHIBFGtleVN0YWtlZER1Y2tCeU93bmVyAQlvd25lckFkZHIJAKwCAgISc3Rha2VkRHVja0J5T3duZXJfBQlvd25lckFkZHIBEWtleUJhY2twYWNrQnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAgliYWNrUGFja18FC2R1Y2tBc3NldElkAQ9rZXlEdWNrTG9jYXRpb24BC2R1Y2tBc3NldElkCQCsAgICDWR1Y2tMb2NhdGlvbl8FC2R1Y2tBc3NldElkAQ5rZXlPcmRlckJ5TGFuZAELbGFuZEFzc2V0SWQJAKwCAgIKbGFuZE9yZGVyXwULbGFuZEFzc2V0SWQBDmtleUVzV2FyZWhvdXNlAAIaZW1lcmdlbmN5V2FyZWhvdXNlUHJvZHVjdHMAD2xvY0lkeENvbnRpbmVudAAAAApsb2NJZHhUeXBlAAEACGxvY0lkeElkAAIBEmdldFJlY2lwZU1hdGVyaWFscwEGcmVjaXBlCQBoAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnJlY2lwZQUJcklkeENvZWZmBQlDT0VGRjJNQVQABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgADU0VQAgJfXwAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAAZNVUxUMTAAgMivoCUADk1JTlNIT1BQQVlNRU5UAKCNBgAFSVRFUjYJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEUlkeENmZ1N0YWtpbmdEYXBwAAEBCmtleVJlc3RDZmcAAg4lc19fcmVzdENvbmZpZwEOa2V5UmVzdEFkZHJlc3MAAgwlc19fcmVzdEFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgdyZXN0Q2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHcmVzdENmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgADHJlc3RDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5UmVzdEFkZHJlc3MABRVkZWZhdWx0UmVzdEFkZHJlc3NTdHIAB3Jlc3RDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDHJlc3RDb250cmFjdAAPc3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnU3Rha2luZ0RhcHABCGFzU3RyaW5nAQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAUBcwkAAgECGGZhaWwgdG8gY2FzdCBpbnRvIFN0cmluZwEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAFuBQckbWF0Y2gwBQFuCQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQprZXlCbG9ja2VkAAIQY29udHJhY3RzQmxvY2tlZAEKZml4ZWRQb2ludAIDdmFsCGRlY2ltYWxzBAZ0ZW5Qb3cJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOBAdsb3dQYXJ0CQCkAwEJAGoCBQN2YWwFBnRlblBvdwQGemVyb2VzCQCwAgIJAKQDAQUGdGVuUG93CQBkAgABCQCxAgEFB2xvd1BhcnQJAKwCAgkArAICCQCsAgIJAKQDAQkAaQIFA3ZhbAUGdGVuUG93AgEuBQZ6ZXJvZXMFB2xvd1BhcnQAE0ZBQ1RPUllNQVhXQVJFSE9VU0UAgMivoCUADlNFTExNVUxUSVBMSUVSAMgBAA1CVVlNVUxUSVBMSUVSAKwCAApBVUNUSU9ORkVFAJBOAR5rZXlGYWN0b3J5V2FyZWhvdXNlQnlJZEFuZFR5cGUCCWZhY3RvcnlJZAdyZXNUeXBlCQCsAgIJAKwCAgkArAICAhtmYWN0b3J5V2hCeUNvbnRpbmVudEFuZFJlc18FCWZhY3RvcnlJZAIBXwkApAMBBQdyZXNUeXBlAAlvcmRJZHhSZXMAAAAJb3JkSWR4TWF0AAEACm9yZElkeFByb2QAAgEIZ2V0T3JkZXIBBm9yZEtleQQBcAkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEFBm9yZEtleQIwMEAwXzBAMF8wQDBfMEAwXzBAMF8wQDA6MEAwXzBAMF8wQDBfMEAwXzBAMF8wQDA6AgE6CQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUJb3JkSWR4UmVzAgFfBQZOVU1SRVMJAJEDAgUBcAUJb3JkSWR4UmVzAhcwQDBfMEAwXzBAMF8wQDBfMEAwXzBAMAkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCW9yZElkeE1hdAIBXwUGTlVNUkVTCQCRAwIFAXAFCW9yZElkeE1hdAIXMEAwXzBAMF8wQDBfMEAwXzBAMF8wQDAJAMwIAgkAkQMCBQFwBQpvcmRJZHhQcm9kBQNuaWwBCHRvVm9sdW1lAwZhbW91bnQHcGtnU2l6ZQlpc1Byb2R1Y3QDBQlpc1Byb2R1Y3QEBHBrZ3MDCQBnAgUGYW1vdW50AAAJAGkCCQBlAgkAZAIFBmFtb3VudAUHcGtnU2l6ZQABBQdwa2dTaXplCQEBLQEJAGkCCQBlAgkAZAIJAQEtAQUGYW1vdW50BQdwa2dTaXplAAEFB3BrZ1NpemUJAGgCBQRwa2dzBQVNVUxUOAUGYW1vdW50AQxzZWxsSW50ZXJuYWwEBWxvY0lkB3Jlc1R5cGUGYW1vdW50CG1pblByaWNlBAV3aEtleQkBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIFBWxvY0lkBQdyZXNUeXBlBAJ3MAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQV3aEtleQAABAJyMAMJAGYCBQJ3MAUTRkFDVE9SWU1BWFdBUkVIT1VTRQAAAwkAZgIJAGQCBQJ3MAUGYW1vdW50BRNGQUNUT1JZTUFYV0FSRUhPVVNFCQBlAgUTRkFDVE9SWU1BWFdBUkVIT1VTRQUCdzAFBmFtb3VudAQMdXNkdFJlY2VpdmVkCQBkAgkAawMFAnIwCQBlAgkAaAIFDlNFTExNVUxUSVBMSUVSBRBSRVNPVVJDRVBSSUNFTUlOCQBrAwkAZAIJAGgCAGQFAncwCQBoAgAyBQJyMAUQUkVTT1VSQ0VQUklDRU1JTgUTRkFDVE9SWU1BWFdBUkVIT1VTRQUGTVVMVDEwCQBrAwkAZQIFBmFtb3VudAUCcjAFEFJFU09VUkNFUFJJQ0VNSU4FBU1VTFQ4BAVtaW45OQkAZQIFCG1pblByaWNlCQBpAgUIbWluUHJpY2UAZAMJAGYCCQBoAgUFbWluOTkFBmFtb3VudAkAaAIFDHVzZHRSZWNlaXZlZAUFTVVMVDgJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICD0FjdHVhbCBwcmljZSA9IAkApAMBBQx1c2R0UmVjZWl2ZWQCAyAvIAkApAMBBQZhbW91bnQCDiA8IG1pblByaWNlID0gCQCkAwEFCG1pblByaWNlAgMsICgFBWxvY0lkAgIsIAkAkQMCBQhyZXNUeXBlcwUHcmVzVHlwZQIBKQkAlAoCCQEMSW50ZWdlckVudHJ5AgUFd2hLZXkJAGQCBQJ3MAUGYW1vdW50BQx1c2R0UmVjZWl2ZWQBC2J1eUludGVybmFsBAVsb2NJZAdtYXRUeXBlBmFtb3VudAhtYXhQcmljZQQFd2hLZXkJAR5rZXlGYWN0b3J5V2FyZWhvdXNlQnlJZEFuZFR5cGUCBQVsb2NJZAUHbWF0VHlwZQQCdzAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUFd2hLZXkAAAQCbTEDCQBmAgUCdzAFE0ZBQ1RPUllNQVhXQVJFSE9VU0UJAJcDAQkAzAgCBQZhbW91bnQJAMwIAgkAZQIFAncwBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQNuaWwAAAQCbTAJAJcDAQkAzAgCBQJ3MAkAzAgCCQBlAgUGYW1vdW50BQJtMQUDbmlsBAFtCQBkAgUCbTAFAm0xBAl1c2R0U3BlbnQJAGQCCQBrAwUCbTAJAGUCCQBoAgUNQlVZTVVMVElQTElFUgUQUkVTT1VSQ0VQUklDRU1JTgkAawMJAGUCCQBoAgBkBQJ3MAkAaAIAMgUCbTAFEFJFU09VUkNFUFJJQ0VNSU4FE0ZBQ1RPUllNQVhXQVJFSE9VU0UFBk1VTFQxMAkAawMFAm0xCQBoAgACBRBSRVNPVVJDRVBSSUNFTUlOBQVNVUxUOAQGbWF4MTAxCQBkAgUIbWF4UHJpY2UJAGkCBQhtYXhQcmljZQBkAwkAZgIJAGgCBQl1c2R0U3BlbnQFBU1VTFQ4CQBoAgUGbWF4MTAxBQFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BY3R1YWwgcHJpY2UgPSAJAKQDAQUJdXNkdFNwZW50AgMgLyAJAKQDAQUBbQIOID4gbWF4UHJpY2UgPSAJAKQDAQUIbWF4UHJpY2UCAywgKAUFbG9jSWQCAiwgCQCRAwIFCG1hdFR5cGVzBQdtYXRUeXBlAgEpCQCVCgMJAQxJbnRlZ2VyRW50cnkCBQV3aEtleQkAZQIFAncwBQFtBQl1c2R0U3BlbnQFAW0BC2dldEJhY2twYWNrAQVicEtleQQBcAkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAUFYnBLZXkCGjA6MF8wXzBfMF8wXzA6MF8wXzBfMF8wXzA6AgE6CQDMCAIJAKQDAQkBC3ZhbHVlT3JFbHNlAgkAtgkBCQCRAwIFAXAFCmJwSWR4TGV2ZWwAAAkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCGJwSWR4UmVzAgFfBQZOVU1SRVMJAJEDAgUBcAUIYnBJZHhSZXMCCzBfMF8wXzBfMF8wCQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUIYnBJZHhNYXQCAV8FBk5VTVJFUwkAkQMCBQFwBQhicElkeE1hdAILMF8wXzBfMF8wXzAJAMwIAgkAkQMCBQFwBQlicElkeFByb2QFA25pbAEMY2hlY2tCbG9ja2VkAAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUPc3Rha2luZ0NvbnRyYWN0CQEKa2V5QmxvY2tlZAAHCQACAQIfQ29udHJhY3RzIGFyZSB1bmRlciBtYWludGVuYW5jZQUEdW5pdAEGcHJvbG9nAAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCCnNhdmVMYXN0VHgFA25pbAUDbmlsAQlzZXRDb21tb24CA2FjYwRpdGVtBAFqCAUDYWNjAl8xBAZpc1Byb2QIBQNhY2MCXzgECWl0ZW1QYXJ0cwkAtQkCBQRpdGVtAgFAAwkBAiE9AgkAkAMBBQlpdGVtUGFydHMAAgkAAgECLkluY29ycmVjdCBvcmRlciBmb3JtYXQsIHNob3VsZCBiZSBhbW91bnRAcHJpY2UECG5ld09yZEFtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJaXRlbVBhcnRzAAAECG5ld09yZFByCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJaXRlbVBhcnRzAAEECW5ld09yZFVzZAkAawMFCG5ld09yZEFtBQhuZXdPcmRQcgUFTVVMVDgECW5ld09yZFZvbAkBCHRvVm9sdW1lAwUIbmV3T3JkQW0FDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QEBndoSW5pdAMJAGYCCQCQAwEIBQNhY2MCXzYFAWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCCAUDYWNjAl82BQFqAAAEC2N1ck9yZFBhcnRzCQC1CQIDCQBmAgkAkAMBCAUDYWNjAl83BQFqCQCRAwIIBQNhY2MCXzcFAWoCAzBAMAIBQAQIY3VyT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJPcmRQYXJ0cwAABAhjdXJPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ck9yZFBhcnRzAAEDAwkAZgIAAAUIY3VyT3JkUHIGCQBmAgAABQhuZXdPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAljdXJPcmRVc2QJAGsDBQhjdXJPcmRBbQUIY3VyT3JkUHIFBU1VTFQ4AwkAAAIFCG5ld09yZEFtAAADCQBmAgUIY3VyT3JkQW0AAAkAmwoJCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQUGd2hJbml0CAUDYWNjAl8zCAUDYWNjAl80CQBlAggFA2FjYwJfNQUJY3VyT3JkVXNkCAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAGQCCAUDYWNjAl85CQEIdG9Wb2x1bWUDBQZ3aEluaXQFDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QJAJsKCQkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQZ3aEluaXQFCGN1ck9yZEFtCAUDYWNjAl8zCAUDYWNjAl80CAUDYWNjAl81CAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAGQCCAUDYWNjAl85CQEIdG9Wb2x1bWUDCQBlAgUGd2hJbml0BQhjdXJPcmRBbQUOUFJPRFVDVFBLR1NJWkUFBmlzUHJvZAMJAGYCBQhuZXdPcmRBbQAAAwkAZgIAAAUIY3VyT3JkQW0JAJsKCQkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQZ3aEluaXQFCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUJbmV3T3JkVm9sCAUDYWNjAl80CQBkAggFA2FjYwJfNQUJbmV3T3JkVXNkCAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAQh0b1ZvbHVtZQMJAGUCBQZ3aEluaXQFCGN1ck9yZEFtBQ5QUk9EVUNUUEtHU0laRQUGaXNQcm9kCQCbCgkJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQZ3aEluaXQJAGQCCAUDYWNjAl8zBQluZXdPcmRWb2wIBQNhY2MCXzQJAGUCCQBkAggFA2FjYwJfNQUJbmV3T3JkVXNkBQljdXJPcmRVc2QIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkBCHRvVm9sdW1lAwUGd2hJbml0BQ5QUk9EVUNUUEtHU0laRQUGaXNQcm9kAwkAZgIAAAUIY3VyT3JkQW0EBmFtRGlmZgkAZQIFCGN1ck9yZEFtBQhuZXdPcmRBbQMJAGYCAAAJAGUCBQZ3aEluaXQFBmFtRGlmZgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBBQZhbURpZmYCGiBmcm9tIHdhcmVob3VzZSwgYnV0IG9ubHkgCQCkAwEFBndoSW5pdAIKIGF2YWlsYWJsZQkAmwoJCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFBndoSW5pdAUGYW1EaWZmCAUDYWNjAl8zCQBlAggFA2FjYwJfNAUJbmV3T3JkVm9sCAUDYWNjAl81CAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAQh0b1ZvbHVtZQMJAGUCBQZ3aEluaXQFBmFtRGlmZgUOUFJPRFVDVFBLR1NJWkUFBmlzUHJvZAMJAGYCAAAJAGQCBQZ3aEluaXQFCG5ld09yZEFtCQACAQkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHRha2UgCQCkAwEJAQEtAQUIbmV3T3JkQW0CGiBmcm9tIHdhcmVob3VzZSwgYnV0IG9ubHkgCQCkAwEFBndoSW5pdAIKIGF2YWlsYWJsZQkAmwoJCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZAIFBndoSW5pdAUIbmV3T3JkQW0IBQNhY2MCXzMJAGUCCAUDYWNjAl80BQluZXdPcmRWb2wJAGUCCAUDYWNjAl81BQljdXJPcmRVc2QIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkBCHRvVm9sdW1lAwkAZAIFBndoSW5pdAUIbmV3T3JkQW0FDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QBC3NldEludGVybmFsAwljdXJyZW50V2gKY3VycmVudE9yZAZuZXdPcmQECWN1cnJXaFJlcwkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8ECWN1cnJXaE1hdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8ECmN1cnJXaFByb2QDCQAAAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIBXwQNY3VycmVudE9yZFJlcwkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCW9yZElkeFJlcwIBXwQNY3VycmVudE9yZE1hdAkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCW9yZElkeE1hdAIBXwQOY3VycmVudE9yZFByb2QDCQAAAgkAkQMCBQpjdXJyZW50T3JkBQpvcmRJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFCmN1cnJlbnRPcmQFCm9yZElkeFByb2QCAV8DCQECIT0CCQCQAwEFBm5ld09yZAADCQACAQIzbmV3T3JkZXJTdHIgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSAyICc6JyBzZXBhcmF0b3JzBAhyZXNQYXJ0cwkAtQkCCQCRAwIFBm5ld09yZAAAAgFfBAhtYXRQYXJ0cwkAtQkCCQCRAwIFBm5ld09yZAABAgFfBAlwcm9kUGFydHMDCQAAAgkAkQMCBQZuZXdPcmQAAgIABQNuaWwJALwJAgkAkQMCBQZuZXdPcmQAAgIBXwMJAQIhPQIJAJADAQUIcmVzUGFydHMFBk5VTVJFUwkAAgECIEFsbCA2IHJlc291cmNlcyBzaG91bGQgYmUg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cmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJwT3JkUGFydHMAAAQHYnBPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJwT3JkUGFydHMAAQMJAGYCAAAFB2JwT3JkUHIJAAIBAhdQcmljZSBjYW4ndCBiZSBuZWdhdGl2ZQQIYnBPcmRVc2QJAGsDBQdicE9yZEFtBQdicE9yZFByBQVNVUxUOAQGYnBJbml0AwkAZgIJAJADAQgFA2FjYwJfOAUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIIBQNhY2MCXzgFAWoAAAQGd2hJbml0AwkAZgIJAJADAQgFA2FjYwJfOQUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIIBQNhY2MCXzkFAWoAAAQJd2hPcmRJbml0AwkAZgIJAJADAQgFA2FjYwNfMTAFAWoJAJEDAggFA2FjYwNfMTAFAWoCAzBAMAQKd2hPcmRQYXJ0cwkAtQkCBQl3aE9yZEluaXQCAUAEB3doT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAAEB3doT3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAEDAwkBAiE9AgUHYnBPcmRBbQAACQECIT0CBQdicE9yZFByBQd3aE9yZFByBwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgpQcmljZXMgb2YgCQCRAwIIBQNhY2MDXzExBQFqAhcgZG9uJ3QgbWF0Y2ghIFdIIHByaWNlPQkApAMBBQd3aE9yZFByAg0sIHlvdXIgcHJpY2U9CQCkAwEFB2JwT3JkUHIECHdoT3JkVXNkCQBrAwUHd2hPcmRBbQUHd2hPcmRQcgUFTVVMVDgECGRlbHRhVm9sCQEIdG9Wb2x1bWUDBQdicE9yZEFtBQ5QUk9EVUNUUEtHU0laRQUGaXNQcm9kAwkAAAIFB2JwT3JkQW0AAAkAnwoNCQDNCAIIBQNhY2MCXzEJAKQDAQUGd2hJbml0CQDNCAIIBQNhY2MCXzIFCXdoT3JkSW5pdAkAzQgCCAUDYWNjAl8zCQCkAwEFBmJwSW5pdAgFA2FjYwJfNAgFA2FjYwJfNQgFA2FjYwJfNgkAZAIIBQNhY2MCXzcAAQgFA2FjYwJfOAgFA2FjYwJfOQgFA2FjYwNfMTAIBQNhY2MDXzExBQZpc1Byb2QIBQNhY2MDXzEzAwkAZgIFB2JwT3JkQW0AAAMJAGYCAAAFB3doT3JkQW0DCQBmAgUHYnBPcmRBbQkBAS0BBQd3aE9yZEFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICD0F0dGVtcHQgdG8gYnV5IAkApAMBBQdicE9yZEFtAgQgb2YgCQCRAwIIBQNhY2MDXzExBQFqAhssIGJ1dCB3YXJlaG91c2Ugb25seSBzZWxscyAJAKQDAQkBAS0BBQd3aE9yZEFtCQCfCg0JAM0IAggFA2FjYwJfMQkApAMBBQZ3aEluaXQJAM0IAggFA2FjYwJfMgkArAICCQCsAgIJAKQDAQkAZAIFB3doT3JkQW0FB2JwT3JkQW0CAUAJAKQDAQUHd2hPcmRQcgkAzQgCCAUDYWNjAl8zCQCkAwEJAGQCBQZicEluaXQFB2JwT3JkQW0JAGQCCAUDYWNjAl80BQhkZWx0YVZvbAgFA2FjYwJfNQkAZAIIBQNhY2MCXzYFCGJwT3JkVXNkCQBkAggFA2FjYwJfNwABCAUDYWNjAl84CAUDYWNjAl85CAUDYWNjA18xMAgFA2FjYwNfMTEFBmlzUHJvZAkAZAIIBQNhY2MDXzEzAwUGaXNQcm9kCQBoAgUHYnBPcmRBbQUFTVVMVDgFB2JwT3JkQW0JAAIBCQCsAgIJAKwCAgIPQXR0ZW1wdCB0byBidXkgCQCRAwIIBQNhY2MDXzExBQFqAiAgd2hpbGUgd2FyZWhvdXNlIGRvZXNuJ3Qgc2VsbCBpdAMJAGYCBQd3aE9yZEFtAAADCQBmAgkBAS0BBQdicE9yZEFtBQd3aE9yZEFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAKQDAQkBAS0BBQdicE9yZEFtAgQgb2YgCQCRAwIIBQNhY2MDXzExBQFqAhosIGJ1dCB3YXJlaG91c2Ugb25seSBidXlzIAkApAMBBQd3aE9yZEFtAwkAZgIJAQEtAQUHYnBPcmRBbQUGYnBJbml0CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAKQDAQkBAS0BBQdicE9yZEFtAhQsIGJ1dCB5b3Ugb25seSBoYXZlIAkApAMBBQZicEluaXQCBCBvZiAJAJEDAggFA2FjYwNfMTEFAWoJAJ8KDQkAzQgCCAUDYWNjAl8xCQCkAwEJAGUCBQZ3aEluaXQFB2JwT3JkQW0JAM0IAggFA2FjYwJfMgkArAICCQCsAgIJAKQDAQkAZAIFB3doT3JkQW0FB2JwT3JkQW0CAUAJAKQDAQUHd2hPcmRQcgkAzQgCCAUDYWNjAl8zCQCkAwEJAGQCBQZicEluaXQFB2JwT3JkQW0JAGUCCAUDYWNjAl80BQhkZWx0YVZvbAkAZQIIBQNhY2MCXzUFCGJwT3JkVXNkCAUDYWNjAl82CQBkAggFA2FjYwJfNwABCAUDYWNjAl84CAUDYWNjAl85CAUDYWNjA18xMAgFA2FjYwNfMTEFBmlzUHJvZAkAZQIIBQNhY2MDXzEzAwUGaXNQcm9kCQBoAgUHYnBPcmRBbQUFTVVMVDgFB2JwT3JkQW0JAAIBCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byBzZWxsIAkAkQMCCAUDYWNjA18xMQUBagIfIHdoaWxlIHdhcmVob3VzZSBkb2Vzbid0IGJ1eSBpdAoBaQEacmVjYWxjTG9ja2VkVm9sdW1lUkVBRE9OTFkCC2xhbmRBc3NldElkAndoBApjdXJyZW50T3JkCQEIZ2V0T3JkZXIBCQEOa2V5T3JkZXJCeUxhbmQBBQtsYW5kQXNzZXRJZAQBegkBC3NldEludGVybmFsAwUCd2gFCmN1cnJlbnRPcmQFCmN1cnJlbnRPcmQJAJQKAgUDbmlsCQBkAggFAXoCXzQIBQF6Al81AWkBDWNvbnN0cnVjdG9yVjEBCHJlc3RBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleVJlc3RBZGRyZXNzAAUIcmVzdEFkZHIFA25pbAFpAQ1zZWxsUmVzb3VyY2VzAgdhbW91bnRzCW1pblByaWNlcwQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIqc2VsbFJlc291cmNlcyBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBWxvY0lkCQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdyZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfCgEFYWRkZXICA2FjYwFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCRAwIFB3Jlc0xpc3QFAWoCBCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCFCwgYnV0IHRyaWVkIHRvIHNlbGwgCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCAAAJAJEDAgUHYW1vdW50cwUBagkAAgEJAKwCAgkArAICCQCsAgICJVlvdSB0cmllZCB0byBzZWxsIG5lZ2F0aXZlIGFtb3VudCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCAjogCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoAAAQBYgkBDHNlbGxJbnRlcm5hbAQFBWxvY0lkBQFqCQCRAwIFB2Ftb3VudHMFAWoJAJEDAgUJbWluUHJpY2VzBQFqCQCWCgQJAM0IAggFA2FjYwJfMQgFAWICXzEJAM0IAggFA2FjYwJfMgkApAMBCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAJEDAgUHYW1vdW50cwUBagkAZAIIBQNhY2MCXzMIBQFiAl8yCQBkAggFA2FjYwJfNAkAkQMCBQdhbW91bnRzBQFqCQCWCgQIBQNhY2MCXzEJAM0IAggFA2FjYwJfMgkAkQMCBQdyZXNMaXN0BQFqCAUDYWNjAl8zCAUDYWNjAl80BAZtZXJnZWQKAAIkbAUFSVRFUjYKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQFA25pbAUDbmlsAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAggFBm1lcmdlZAJfMgIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQd4cFRyYWRlCAUGbWVyZ2VkAl80BQVNVUxUOAUDbmlsBQNuaWwJAJQKAgkAzQgCCAUGbWVyZ2VkAl8xCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIIBQZtZXJnZWQCXzMFC3VzZHRBc3NldElkCQCVCgMFBnJlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAFpAQxidXlNYXRlcmlhbHMCB2Ftb3VudHMJbWF4UHJpY2VzBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cABAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAVsb2NJZAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwoBCG1VcGRhdGVyAgNhY2MBagMJAGYCAAAJAJEDAgUHYW1vdW50cwUBagkAAgEJAKwCAgkArAICCQCsAgICJFlvdSB0cmllZCB0byBidXkgbmVnYXRpdmUgYW1vdW50IG9mIAkAkQMCBQhtYXRUeXBlcwUBagICOiAJAKQDAQkAkQMCBQdhbW91bnRzBQFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagAABAFiCQELYnV5SW50ZXJuYWwEBQVsb2NJZAUBagkAkQMCBQdhbW91bnRzBQFqCQCRAwIFCW1heFByaWNlcwUBagkAlgoECQDNCAIIBQNhY2MCXzEIBQFiAl8xCQDNCAIIBQNhY2MCXzIJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0BQFqCAUBYgJfMwkAZAIIBQNhY2MCXzMIBQFiAl8yCQBkAggFA2FjYwJfNAkAkQMCBQdhbW91bnRzBQFqCQCWCgQIBQNhY2MCXzEJAM0IAggFA2FjYwJfMgkAkQMCBQdtYXRMaXN0BQFqCAUDYWNjAl8zCAUDYWNjAl80BAZtZXJnZWQKAAIkbAUFSVRFUjYKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQFA25pbAUDbmlsAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIbVVwZGF0ZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYDCQBmAggFBm1lcmdlZAJfMwUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkApAMBBQNhbXQCCywgcmVxdWlyZWQ9CQCkAwEIBQZtZXJnZWQCXzMEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAggFBm1lcmdlZAJfMgIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEBHJlc3QDCQBmAgkAZQIFA2FtdAgFBm1lcmdlZAJfMwAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAgFBm1lcmdlZAJfMwULdXNkdEFzc2V0SWQFA25pbAUDbmlsBBBhY3Rpdml0aWVzQW1vdW50CQBpAggFBm1lcmdlZAJfMwBkBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUHeHBUcmFkZQgFBm1lcmdlZAJfNAUFTVVMVDgFA25pbAUDbmlsCQCUCgIJAM0IAgkAzggCCAUGbWVyZ2VkAl8xBQRyZXN0CQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFEGFjdGl2aXRpZXNBbW91bnQFC3VzZHRBc3NldElkCQCVCgMFBnJlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAFpARFleGNoYW5nZVJlc291cmNlcwEHYW1vdW50cwQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQFbG9jSWQJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB3Jlc0xpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMCAV8EB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8KAQlleGNoYW5nZXICA2FjYwFqBAV3aEtleQkBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIFBWxvY0lkBQFqBAJ3MAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQV3aEtleQAABANhbWoJAJEDAgUHYW1vdW50cwUBagMJAGYCBQNhbWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkAkQMCBQdyZXNMaXN0BQFqAgQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAhgsIGJ1dCB0cmllZCB0byBleGNoYW5nZSAJAKQDAQUDYW1qAwkAZgIAAAUDYW1qCQACAQkArAICCQCsAgIJAKwCAgIpWW91IHRyaWVkIHRvIGV4Y2hhbmdlIG5lZ2F0aXZlIGFtb3VudCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCAjogCQCkAwEFA2FtagMJAGYCBQNhbWoAAAkAlwoFCQDNCAIIBQNhY2MCXzEJAKQDAQkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqBQNhbWoJAM0IAggFA2FjYwJfMgkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB21hdExpc3QFAWoFA2FtagkAZAIIBQNhY2MCXzMJAGsDBQNhbWoFEFJFU09VUkNFUFJJQ0VNSU4FBU1VTFQ4CQDNCAIIBQNhY2MCXzQJAQxJbnRlZ2VyRW50cnkCBQV3aEtleQUCdzAJAGQCCAUDYWNjAl81BQNhbWoJAJcKBQkAzQgCCAUDYWNjAl8xCQCRAwIFB3Jlc0xpc3QFAWoJAM0IAggFA2FjYwJfMgkAkQMCBQdtYXRMaXN0BQFqCAUDYWNjAl8zCAUDYWNjAl80CAUDYWNjAl81BAZtZXJnZWQKAAIkbAUFSVRFUjYKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCXCgUFA25pbAUDbmlsAAAFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlleGNoYW5nZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYDCQBmAggFBm1lcmdlZAJfMwUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkApAMBBQNhbXQCCywgcmVxdWlyZWQ9CQCkAwEIBQZtZXJnZWQCXzMEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAggFBm1lcmdlZAJfMQIBXwkAzAgCCQC5CQIIBQZtZXJnZWQCXzICAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEBnJlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBARyZXN0AwkAZgIJAGUCBQNhbXQIBQZtZXJnZWQCXzMAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQIBQZtZXJnZWQCXzMFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIIBQZtZXJnZWQCXzMAZAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFB3hwVHJhZGUIBQZtZXJnZWQCXzUFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDNCAIJAM4IAgUEcmVzdAgFBm1lcmdlZAJfNAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkAlQoDBQZyZXN1bHQFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQBaQEKY3JhZnRHb29kcwIKcHJvZHVjdElkeAhxdWFudGl0eQQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUDYW10BQVNVUxUNgkAAgECKmV4YWN0bHkgMSBVU0RUIG11c3QgYmUgYXR0YWNoZWQgYXMgcGF5bWVudAMJAGcCAAAFCHF1YW50aXR5CQACAQIbUXVhbnRpdHkgc2hvdWxkIGJlIHBvc2l0aXZlBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAU0JAAIBCQCsAgICMUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgTWFudWZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBGNvbnQJAJEDAgULY3VyTG9jYXRpb24FD2xvY0lkeENvbnRpbmVudAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfAwMJAGYCAAAFCnByb2R1Y3RJZHgGCQBnAgUKcHJvZHVjdElkeAkAkAMBBRBwcm9kdWN0aW9uTWF0cml4CQACAQkArAICAhRVbmtub3duIHByb2R1Y3QgaWR4PQkApAMBBQpwcm9kdWN0SWR4BAZyZWNpcGUJALUJAgkAkQMCBRBwcm9kdWN0aW9uTWF0cml4BQpwcm9kdWN0SWR4AgFfAwkBAiE9AgkAkAMBBQZyZWNpcGUFClJFQ0lQRVNJWkUJAAIBCQCsAgICF0ZhdGFsOiB1bmtub3duIHJlY2lwZTogCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgEDnByb2R1Y3RDb250SWR4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGcmVjaXBlBQ1ySWR4Q29udGluZW50AwkBAiE9AgkAkQMCBQpjb250aW5lbnRzBQ5wcm9kdWN0Q29udElkeAUEY29udAkAAgEJAKwCAgkArAICCQCsAgICHVRoaXMgcHJvZHVjdCBpcyBhdmFpbGFibGUgaW4gCQCRAwIFCmNvbnRpbmVudHMFDnByb2R1Y3RDb250SWR4AhEsIGJ1dCB5b3UgYXJlIGluIAUEY29udAQIcHJvZExpc3QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8KAQZmaWxsZXICA2FjYwtpZ25vcmVkSXRlbQQBbggFA2FjYwJfMgQCeHMDCQBmAgkAkAMBBQhwcm9kTGlzdAUBbgkAkQMCBQhwcm9kTGlzdAUBbgIBMAQBeAkBDXBhcnNlSW50VmFsdWUBBQJ4cwQGYW1vdW50CQBoAgUIcXVhbnRpdHkFDlBST0RVQ1RQS0dTSVpFBAF5AwkAAAIFAW4FCnByb2R1Y3RJZHgJAKQDAQkAZAIFAXgFBmFtb3VudAUCeHMJAJQKAgkAzQgCCAUDYWNjAl8xBQF5CQBkAgUBbgABBAZicFByb2QICgACJGwFEHByb2R1Y3Rpb25NYXRyaXgKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQZmaWxsZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgJfMQoBCHByb2R1Y2VyAgNhY2MBagQHbmVlZE1hdAkAaAIJAGgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGcmVjaXBlBQFqBQVNVUxUNgUIcXVhbnRpdHkEB2hhdmVNYXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0BQFqAwkAZgIFB25lZWRNYXQFB2hhdmVNYXQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkBCmZpeGVkUG9pbnQCBQdoYXZlTWF0AAgCBCBvZiAJAJEDAgUIbWF0VHlwZXMFAWoCFiwgYnV0IHJlY2lwZSByZXF1aXJlcyAJAQpmaXhlZFBvaW50AgUHbmVlZE1hdAAIAg4gZm9yIHF1YW50aXR5IAkApAMBBQhxdWFudGl0eQMJAGYCBQduZWVkTWF0AAAJAJQKAgkAzQgCCAUDYWNjAl8xCQCkAwEJAGUCBQdoYXZlTWF0BQduZWVkTWF0CQBkAggFA2FjYwJfMgUHbmVlZE1hdAkAlAoCCQDNCAIIBQNhY2MCXzEJAJEDAgUHbWF0TGlzdAUBaggFA2FjYwJfMgQGbWVyZ2VkCgACJGwFBUlURVI2CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIcHJvZHVjZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAggFBm1lcmdlZAJfMQIBXwkAzAgCCQC6CQIFBmJwUHJvZAIBXwUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFB3hwQ3JhZnQIBQZtZXJnZWQCXzIFBU1VTFQ4BQNuaWwFA25pbAkAlAoCBQNuaWwJAJUKAwUGcmVzdWx0BQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0AWkBEXNldFdhcmVob3VzZU9yZGVyAgtuZXdPcmRlclN0cgtsYW5kQXNzZXRJZAQEdXNlcggFAWkMb3JpZ2luQ2FsbGVyBARhZGRyCQClCAEFBHVzZXIEBnJlc3VsdAMJAQIhPQIFBHVzZXIFDHJlc3RDb250cmFjdAkBDGNoZWNrQmxvY2tlZAAHBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMDCQECIT0CBQR1c2VyBQxyZXN0Q29udHJhY3QJAQIhPQIFBW93bmVyBQRhZGRyBwkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQIbmV3T3JkZXIJALwJAgULbmV3T3JkZXJTdHICAToEAndoCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIUZ2V0V2FyZWhvdXNlUkVBRE9OTFkJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAljdXJyZW50V2gJALwJAgUCd2gCAToEBGxvZnQJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAIBXwQHd2hUb3RhbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFCHZvbFRvdGFsBAZvcmRLZXkJAQ5rZXlPcmRlckJ5TGFuZAEFC2xhbmRBc3NldElkBApjdXJyZW50T3JkCQEIZ2V0T3JkZXIBBQZvcmRLZXkEAXoJAQtzZXRJbnRlcm5hbAMFCWN1cnJlbnRXaAUKY3VycmVudE9yZAUIbmV3T3JkZXIEC2J1eVZvbFNhbGRvCAUBegJfNAQMc2VsbFZvbFNhbGRvCAUBegJfNQQKd2hPY2N1cGllZAgFAXoCXzcECHdoTG9ja2VkCQBkAgULYnV5Vm9sU2FsZG8FDHNlbGxWb2xTYWxkbwQGd2hGcmVlCQBlAgkAZQIFB3doVG90YWwFCndoT2NjdXBpZWQFCHdoTG9ja2VkAwkAZgIAAAUGd2hGcmVlCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgITQXR0ZW1wdCB0byByZXNlcnZlIAkApAMBBQtidXlWb2xTYWxkbwIbIHNwYWNlIGZvciBidXkgb3JkZXJzLCBhbmQgCQCkAwEFDHNlbGxWb2xTYWxkbwIlIHNwYWNlIGZvciBzZWxsIG9yZGVycyAoYW5kIG9jY3VwaWVkPQkApAMBBQp3aE9jY3VwaWVkAh8pLCBsZWFkcyB0byBuZWdhdGl2ZSBmcmVlIHNwYWNlBAV3aFN0cgkAugkCCQDMCAIJAJEDAgUJY3VycmVudFdoBQt3aElkeExldmVscwkAzAgCCQC5CQIIBQF6Al8xAgFfCQDMCAIJALkJAggFAXoCXzICAV8JAMwIAgkAugkCCAUBegJfMwIBXwkAzAgCCQCkAwEFCHdoTG9ja2VkBQNuaWwCAToEBndoU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDXNhdmVXYXJlaG91c2UJAMwIAgUFd2hTdHIJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAh1c2RTYWxkbwgFAXoCXzYEB2FjdGlvbnMDCQBmAgUIdXNkU2FsZG8AAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUDYW10BQh1c2RTYWxkbwkAAgEJAKwCAgISUGF5bWVudCBuZWVkZWQgaXMgCQCkAwEFCHVzZFNhbGRvCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQULbmV3T3JkZXJTdHIFA25pbAMJAAACBQh1c2RTYWxkbwAAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQISTm8gcGF5bWVudHMgbmVlZGVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQULbmV3T3JkZXJTdHIFA25pbAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECEk5vIHBheW1lbnRzIG5lZWRlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQVvd25lcgkBAS0BBQh1c2RTYWxkbwULdXNkdEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQtuZXdPcmRlclN0cgUDbmlsCQCUCgIFB2FjdGlvbnMJAJQKAgUGcmVzdWx0BQZ3aFNhdmUBaQEUYWNjZXB0V2FyZWhvdXNlT3JkZXIDCmJwT3JkZXJTdHILbGFuZEFzc2V0SWQLZHVja0Fzc2V0SWQEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwAEBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyBApjYWxsZXJBZGRyCQClCAEFBmNhbGxlcgQRc3Rha2VkRHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFCmNhbGxlckFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFEXN0YWtlZER1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04EA2xvYwkAtQkCCQEFdmFsdWUBBQtjdXJMb2NhdGlvbgIBXwMJAQIhPQIJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAgFMCQACAQkArAICCQCsAgICFkR1Y2sgbG9jYXRpb24gdHlwZSBpcyAJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAhEsIGJ1dCBzaG91bGQgYmUgTAMJAQIhPQIFEXN0YWtlZER1Y2tBc3NldElkBQtkdWNrQXNzZXRJZAkAAgEJAKwCAgkArAICCQCsAgICFFlvdXIgc3Rha2VkIGR1Y2sgaXMgBRFzdGFrZWREdWNrQXNzZXRJZAINLCBidXQgcGFzc2VkIAULZHVja0Fzc2V0SWQECWxhbmRBc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQJAAIBCQCsAgIJAKwCAgIETkZUIAgFCWxhbmRBc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQJbGFuZE93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUJbGFuZEFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAAACBQlsYW5kT3duZXIFCmNhbGxlckFkZHIJAAIBAh5Zb3UgY2Fubm90IHRyYWRlIHdpdGggeW91cnNlbGYEDGJwT3JkZXJQYXJ0cwkAvAkCBQpicE9yZGVyU3RyAgE6AwkBAiE9AgkAkAMBBQxicE9yZGVyUGFydHMAAwkAAgECMmJwT3JkZXJTdHIgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSAyICc6JyBzZXBhcmF0b3JzBAhicE9yZFJlcwkAtQkCCQCRAwIFDGJwT3JkZXJQYXJ0cwAAAgFfBAhicE9yZE1hdAkAtQkCCQCRAwIFDGJwT3JkZXJQYXJ0cwABAgFfBAlicE9yZFByb2QDCQAAAgkAkQMCBQxicE9yZGVyUGFydHMAAgIABQNuaWwJALwJAgkAkQMCBQxicE9yZGVyUGFydHMAAgIBXwMJAQIhPQIJAJADAQUIYnBPcmRSZXMFBk5VTVJFUwkAAgECIEFsbCA2IHJlc291cmNlcyBzaG91bGQgYmUgcGFzc2VkAwkBAiE9AgkAkAMBBQhicE9yZE1hdAUGTlVNUkVTCQACAQIgQWxsIDYgbWF0ZXJpYWxzIHNob3VsZCBiZSBwYXNzZWQEAndoCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIUZ2V0V2FyZWhvdXNlUkVBRE9OTFkJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAljdXJyZW50V2gJALwJAgUCd2gCAToECWN1cnJXaFJlcwkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8ECWN1cnJXaE1hdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8ECmN1cnJXaFByb2QDCQAAAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIBXwQPY3VycldoTG9ja2VkVm9sCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgkAtQkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUAgFfBQl2b2xMb2NrZWQEBWJwS2V5CQERa2V5QmFj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Y2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUIbmV3QnBTdHIFA25pbAUDbmlsBA9kdWNrU3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFBnhwU2hvcAgFAXADXzEzBQVNVUxUOAUDbmlsBQNuaWwEDmFjY1N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQWNjU3RhdHMJAMwIAgUJbGFuZE93bmVyCQDMCAIJAGsDBQZ4cFNob3AIBQFwA18xMwUFTVVMVDgFA25pbAUDbmlsBAdhY3Rpb25zCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQULbmV3V2hPcmRTdHIFA25pbAQNdXNkV2gyQnBTYWxkbwgFAXACXzUECGFjdGlvbnMxAwkAZgIFDXVzZFdoMkJwU2FsZG8AAAQLdXNkV2gyQnBGZWUJAGsDCAUBcAJfNQUKQVVDVElPTkZFRQUFTVVMVDYECHJlZkJ5S2V5CQEPa2V5QWRkcmVzc1JlZkJ5AQUKY2FsbGVyQWRkcgQFcmVmQnkJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQhyZWZCeUtleQMJAQlpc0RlZmluZWQBBQVyZWZCeQkAzQgCCQDNCAIJAM0IAgUHYWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCQBlAggFAXACXzUJAGgCAAMFC3VzZFdoMkJwRmVlBQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQt1c2RXaDJCcEZlZQULdXNkdEFzc2V0SWQJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFBXJlZkJ5BQt1c2RXaDJCcEZlZQULdXNkdEFzc2V0SWQJAM0IAgkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIJAGUCCAUBcAJfNQkAaAIAAwULdXNkV2gyQnBGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFC3VzZFdoMkJwRmVlBQt1c2R0QXNzZXRJZAUHYWN0aW9ucwQNdXNkQnAyV2hTYWxkbwgFAXACXzYECGFjdGlvbnMyAwkAZgIFDXVzZEJwMldoU2FsZG8AAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUDYW10BQ11c2RCcDJXaFNhbGRvCQACAQkArAICAhJQYXltZW50IG5lZWRlZCBpcyAJAKQDAQUNdXNkQnAyV2hTYWxkbwMJAGYCBQ5NSU5TSE9QUEFZTUVOVAUDYW10CQACAQkArAICAhtQYXltZW50IHNob3VsZCBiZSBhdCBsZWFzdCAJAKQDAQUOTUlOU0hPUFBBWU1FTlQEC3VzZEJwMldoRmVlCQBrAwgFAXACXzYFCkFVQ1RJT05GRUUFBU1VTFQ2BAhyZWZCeUtleQkBD2tleUFkZHJlc3NSZWZCeQEFCWxhbmRPd25lcgQFcmVmQnkJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQhyZWZCeUtleQMJAQlpc0RlZmluZWQBBQVyZWZCeQkAzQgCCQDNCAIJAM0IAgUIYWN0aW9uczEJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCWxhbmRPd25lcgkAZQIIBQFwAl82CQBoAgADBQt1c2RCcDJXaEZlZQULdXNkdEFzc2V0SWQJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAULdXNkQnAyV2hGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQVyZWZCeQULdXNkQnAyV2hGZWUFC3VzZHRBc3NldElkCQDNCAIJAM0IAgUIYWN0aW9uczEJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCWxhbmRPd25lcgkAZQIIBQFwAl82CQBoAgADBQt1c2RCcDJXaEZlZQULdXNkdEFzc2V0SWQJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAULdXNkQnAyV2hGZWUFC3VzZHRBc3NldElkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQISTm8gcGF5bWVudHMgbmVlZGVkBQhhY3Rpb25zMQkAlAoCBQhhY3Rpb25zMgkAlwoFBQxwcm9sb2dSZXN1bHQFBndoU2F2ZQUGYnBTYXZlBQ9kdWNrU3RhdHNSZXN1bHQFDmFjY1N0YXRzUmVzdWx0AWkBEHNlbGxQcm9kdWN0c1RvRVMBB2Ftb3VudHMEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhJObyBwYXltZW50cyBuZWVkZWQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBQQkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBBaXJwb3J0LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQECHByb2RMaXN0AwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfBAVlc0tleQkBDmtleUVzV2FyZWhvdXNlAAQIZXhpc3RTdHIJAKIIAQUFZXNLZXkEDGV4aXN0QW1vdW50cwMJAQlpc0RlZmluZWQBBQhleGlzdFN0cgkAtQkCCQEFdmFsdWUBBQhleGlzdFN0cgIBXwUDbmlsCgEIbW92ZVByb2QCA2FjYwlyZWNpcGVTdHIEAWoIBQNhY2MCXzEECHF1YW50aXR5AwkAZgIJAJADAQUHYW1vdW50cwUBagkAkQMCBQdhbW91bnRzBQFqAAADCQBmAgAABQhxdWFudGl0eQkAAgECG1F1YW50aXR5IGNhbm5vdCBiZSBuZWdhdGl2ZQQGcmVjaXBlCQC1CQIFCXJlY2lwZVN0cgIBXwMJAQIhPQIJAJADAQUGcmVjaXBlBQpSRUNJUEVTSVpFCQACAQkArAICAhdGYXRhbDogdW5rbm93biByZWNpcGU6IAUJcmVjaXBlU3RyBAltYXhBbW91bnQJAGgCBQ1FU01BWFBBQ0tBR0VTBQ5QUk9EVUNUUEtHU0laRQQLZXhpc3RBbW91bnQDCQBmAgkAkAMBBQxleGlzdEFtb3VudHMFAWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQxleGlzdEFtb3VudHMFAWoAAAQGY2FuQnV5CQBlAgUJbWF4QW1vdW50BQtleGlzdEFtb3VudAMJAGYCBQhxdWFudGl0eQUGY2FuQnV5CQACAQkArAICCQCsAgIJAKwCAgIXV2FyZWhvdXNlIGNhbiBidXkgb25seSAJAKQDAQUGY2FuQnV5AgQgb2YgCQCRAwIFCXByb2RUeXBlcwUBagQIdG90YWxNYXQJARJnZXRSZWNpcGVNYXRlcmlhbHMBBQZyZWNpcGUECXVuaXRQcmljZQkAawMJAGgCBQh0b3RhbE1hdAUJRVNCVVlDT0VGBRBSRVNPVVJDRVBSSUNFTUlOCQBoAgUFTVVMVDgFDlBST0RVQ1RQS0dTSVpFBAxicFByb2RBbW91bnQDCQBmAgkAkAMBBQhwcm9kTGlzdAUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCHByb2RMaXN0BQFqAAADCQBmAgUIcXVhbnRpdHkFDGJwUHJvZEFtb3VudAkAAgEJAKwCAgkArAICCQCsAgICDllvdSBoYXZlIG9ubHkgCQCkAwEFDGJwUHJvZEFtb3VudAIEIG9mIAkAkQMCBQlwcm9kVHlwZXMFAWoJAJcKBQkAZAIFAWoAAQkAZAIIBQNhY2MCXzIJAGgCBQl1bml0UHJpY2UFCHF1YW50aXR5CQDNCAIIBQNhY2MCXzMJAKQDAQkAZQIFDGJwUHJvZEFtb3VudAUIcXVhbnRpdHkJAM0IAggFA2FjYwJfNAkApAMBCQBkAgULZXhpc3RBbW91bnQFCHF1YW50aXR5CQBkAggFA2FjYwJfNQkAaAIFCHRvdGFsTWF0BQhxdWFudGl0eQQGbWVyZ2VkCgACJGwFEHByb2R1Y3Rpb25NYXRyaXgKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCXCgUAAAAABQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhtb3ZlUHJvZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyBAhuZXdCcFN0cgkAugkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQJAMwIAgkAugkCCAUGbWVyZ2VkAl8zAgFfBQNuaWwCAToEBmJwU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFCG5ld0JwU3RyBQNuaWwFA25pbAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFCnhwU2VsbFRvRXMIBQZtZXJnZWQCXzUJAGgCBQVNVUxUOAAKBQNuaWwFA25pbAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWVzS2V5CQC5CQIIBQZtZXJnZWQCXzQCAV8JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCAUGbWVyZ2VkAl8yBQt1c2R0QXNzZXRJZAUDbmlsCQCVCgMFBmJwU2F2ZQUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAFpAQ91cGRhdGVFc1N0b3JhZ2UBCm5ld1N0b3JhZ2UDCQECIT0CCAUBaQZjYWxsZXIFD3N0YWtpbmdDb250cmFjdAkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUVzV2FyZWhvdXNlAAUKbmV3U3RvcmFnZQUDbmlsBQpuZXdTdG9yYWdlAD2k+xs=", "height": 2737769, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: C9wvppKJz23u8PPEUYHJsVqj6nnFTQ75KJCqFtickoxc Next: CXvTAkVN8av4LCYe7SA3iSPL31q5jKqjKjju94S5P7fU Diff:
Old | New | Differences | |
---|---|---|---|
81 | 81 | func O (N) = ("duckLocation_" + N) | |
82 | 82 | ||
83 | 83 | ||
84 | - | func P () = " | |
84 | + | func P (Q) = ("landOrder_" + Q) | |
85 | 85 | ||
86 | 86 | ||
87 | - | func | |
87 | + | func R () = "emergencyWarehouseProducts" | |
88 | 88 | ||
89 | 89 | ||
90 | - | func S () = "emergencyWarehouseProducts" | |
90 | + | let S = 0 | |
91 | + | ||
92 | + | let T = 1 | |
93 | + | ||
94 | + | let U = 2 | |
95 | + | ||
96 | + | func V (W) = (parseIntValue(W[q]) * o) | |
91 | 97 | ||
92 | 98 | ||
93 | - | let | |
99 | + | let X = take(drop(this.bytes, 1), 1) | |
94 | 100 | ||
95 | - | let U = 1 | |
96 | - | ||
97 | - | let V = 2 | |
98 | - | ||
99 | - | func W (X) = (parseIntValue(X[q]) * o) | |
100 | - | ||
101 | - | ||
102 | - | let Y = take(drop(this.bytes, 1), 1) | |
103 | - | ||
104 | - | let Z = { | |
105 | - | let aa = Y | |
106 | - | if ((base58'2W' == aa)) | |
101 | + | let Y = { | |
102 | + | let Z = X | |
103 | + | if ((base58'2W' == Z)) | |
107 | 104 | then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi' | |
108 | - | else if ((base58'2T' == | |
105 | + | else if ((base58'2T' == Z)) | |
109 | 106 | then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63' | |
110 | 107 | else throw("Unknown chain") | |
111 | 108 | } | |
112 | 109 | ||
113 | - | let | |
114 | - | let | |
115 | - | if ((base58'2W' == | |
110 | + | let aa = { | |
111 | + | let Z = X | |
112 | + | if ((base58'2W' == Z)) | |
116 | 113 | then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv" | |
117 | - | else if ((base58'2T' == | |
114 | + | else if ((base58'2T' == Z)) | |
118 | 115 | then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy" | |
119 | 116 | else throw("Unknown chain") | |
120 | 117 | } | |
121 | 118 | ||
122 | - | let | |
119 | + | let ab = "__" | |
123 | 120 | ||
124 | - | let | |
121 | + | let ac = 1000000 | |
125 | 122 | ||
126 | - | let | |
123 | + | let ad = 100000000 | |
127 | 124 | ||
128 | - | let | |
125 | + | let ae = 10000000000 | |
129 | 126 | ||
130 | - | let | |
127 | + | let af = 100000 | |
131 | 128 | ||
132 | - | let | |
129 | + | let ag = [0, 1, 2, 3, 4, 5] | |
133 | 130 | ||
134 | - | func | |
131 | + | func ah (ai,aj) = valueOrErrorMessage(getString(ai, aj), makeString(["mandatory ", toString(ai), ".", aj, " is not defined"], "")) | |
135 | 132 | ||
136 | 133 | ||
137 | - | let | |
134 | + | let ak = 1 | |
138 | 135 | ||
139 | - | func | |
136 | + | func al () = "%s__restConfig" | |
140 | 137 | ||
141 | 138 | ||
142 | - | func | |
139 | + | func am () = "%s__restAddr" | |
143 | 140 | ||
144 | 141 | ||
145 | - | func | |
142 | + | func an (ao) = split_4C(ah(ao, al()), ab) | |
146 | 143 | ||
147 | 144 | ||
148 | - | func | |
145 | + | func ap (aq,ar) = valueOrErrorMessage(addressFromString(aq[ar]), ("Rest cfg doesn't contain address at index " + toString(ar))) | |
149 | 146 | ||
150 | 147 | ||
151 | - | let | |
148 | + | let as = addressFromStringValue(valueOrElse(getString(this, am()), aa)) | |
152 | 149 | ||
153 | - | let | |
150 | + | let aq = an(as) | |
154 | 151 | ||
155 | - | let | |
152 | + | let at = ap(aq, ak) | |
156 | 153 | ||
157 | - | func | |
158 | - | let | |
159 | - | if ($isInstanceOf( | |
154 | + | func au (av) = { | |
155 | + | let Z = av | |
156 | + | if ($isInstanceOf(Z, "String")) | |
160 | 157 | then { | |
161 | - | let | |
162 | - | | |
158 | + | let aw = Z | |
159 | + | aw | |
163 | 160 | } | |
164 | 161 | else throw("fail to cast into String") | |
165 | 162 | } | |
166 | 163 | ||
167 | 164 | ||
168 | - | func | |
169 | - | let | |
170 | - | if ($isInstanceOf( | |
165 | + | func ax (av) = { | |
166 | + | let Z = av | |
167 | + | if ($isInstanceOf(Z, "Int")) | |
171 | 168 | then { | |
172 | - | let | |
173 | - | | |
169 | + | let ay = Z | |
170 | + | ay | |
174 | 171 | } | |
175 | 172 | else throw("fail to cast into Int") | |
176 | 173 | } | |
174 | + | ||
175 | + | ||
176 | + | func az () = "contractsBlocked" | |
177 | 177 | ||
178 | 178 | ||
179 | 179 | func aA (aB,aC) = { | |
216 | 216 | let aX = if ((aU >= 0)) | |
217 | 217 | then (((aU + aV) - 1) / aV) | |
218 | 218 | else -((((-(aU) + aV) - 1) / aV)) | |
219 | - | (aX * | |
219 | + | (aX * ad) | |
220 | 220 | } | |
221 | 221 | else aU | |
222 | 222 | ||
229 | 229 | else if (((bc + aU) > aG)) | |
230 | 230 | then (aG - bc) | |
231 | 231 | else aU | |
232 | - | let be = (fraction(bd, ((aH * h) - fraction(((100 * bc) + (50 * bd)), h, aG)), | |
232 | + | let be = (fraction(bd, ((aH * h) - fraction(((100 * bc) + (50 * bd)), h, aG)), ae) + fraction((aU - bd), h, ad)) | |
233 | 233 | let bf = (ba - (ba / 100)) | |
234 | - | if (((bf * aU) > (be * | |
234 | + | if (((bf * aU) > (be * ad))) | |
235 | 235 | then throw((((((((((("Actual price = " + toString(be)) + " / ") + toString(aU)) + " < minPrice = ") + toString(ba)) + ", (") + aZ) + ", ") + k[aM]) + ")")) | |
236 | 236 | else $Tuple2(IntegerEntry(bb, (bc + aU)), be) | |
237 | 237 | } | |
245 | 245 | else 0 | |
246 | 246 | let bk = min([bc, (aU - bj)]) | |
247 | 247 | let bl = (bk + bj) | |
248 | - | let bm = (fraction(bk, ((aI * h) - fraction(((100 * bc) - (50 * bk)), h, aG)), | |
248 | + | let bm = (fraction(bk, ((aI * h) - fraction(((100 * bc) - (50 * bk)), h, aG)), ae) + fraction(bj, (2 * h), ad)) | |
249 | 249 | let bn = (bi + (bi / 100)) | |
250 | - | if (((bm * | |
250 | + | if (((bm * ad) > (bn * bl))) | |
251 | 251 | then throw((((((((((("Actual price = " + toString(bm)) + " / ") + toString(bl)) + " > maxPrice = ") + toString(bi)) + ", (") + aZ) + ", ") + l[bh]) + ")")) | |
252 | 252 | else $Tuple3(IntegerEntry(bb, (bc - bl)), bm, bl) | |
253 | 253 | } | |
254 | 254 | ||
255 | 255 | ||
256 | 256 | func bo (bp) = { | |
257 | - | let aS = split(valueOrElse(getString( | |
257 | + | let aS = split(valueOrElse(getString(at, bp), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":") | |
258 | 258 | [toString(valueOrElse(parseInt(aS[B]), 0)), if ((size(split(aS[C], "_")) == f)) | |
259 | 259 | then aS[C] | |
260 | 260 | else "0_0_0_0_0_0", if ((size(split(aS[D], "_")) == f)) | |
263 | 263 | } | |
264 | 264 | ||
265 | 265 | ||
266 | - | func bq () = if (valueOrElse(getBoolean( | |
266 | + | func bq () = if (valueOrElse(getBoolean(at, az()), false)) | |
267 | 267 | then throw("Contracts are under maintenance") | |
268 | 268 | else unit | |
269 | 269 | ||
270 | 270 | ||
271 | - | func br () = | |
271 | + | func br () = ax(invoke(at, "saveLastTx", nil, nil)) | |
272 | 272 | ||
273 | 273 | ||
274 | 274 | func bs (bt,bu) = { | |
280 | 280 | else { | |
281 | 281 | let by = parseIntValue(bx[0]) | |
282 | 282 | let bz = parseIntValue(bx[1]) | |
283 | - | let bA = fraction(by, bz, | |
283 | + | let bA = fraction(by, bz, ad) | |
284 | 284 | let bB = aT(by, t, bw) | |
285 | 285 | let bC = if ((size(bt._6) > bv)) | |
286 | 286 | then parseIntValue(bt._6[bv]) | |
295 | 295 | else (0 > bz)) | |
296 | 296 | then throw("Price can't be negative") | |
297 | 297 | else { | |
298 | - | let bG = fraction(bE, bF, | |
298 | + | let bG = fraction(bE, bF, ad) | |
299 | 299 | if ((by == 0)) | |
300 | 300 | then if ((bE > 0)) | |
301 | 301 | then $Tuple9((bv + 1), (bt._2 :+ toString(bC)), bt._3, bt._4, (bt._5 - bG), bt._6, bt._7, bw, (bt._9 + aT(bC, t, bw))) | |
405 | 405 | if ((0 > cl)) | |
406 | 406 | then throw("Price can't be negative") | |
407 | 407 | else { | |
408 | - | let cm = fraction(ck, cl, | |
408 | + | let cm = fraction(ck, cl, ad) | |
409 | 409 | let cn = if ((size(bt._8) > bv)) | |
410 | 410 | then parseIntValue(bt._8[bv]) | |
411 | 411 | else 0 | |
423 | 423 | else false) | |
424 | 424 | then throw(((((("Prices of " + bt._11[bv]) + " don't match! WH price=") + toString(cr)) + ", your price=") + toString(cl))) | |
425 | 425 | else { | |
426 | - | let cs = fraction(cq, cr, | |
426 | + | let cs = fraction(cq, cr, ad) | |
427 | 427 | let ct = aT(ck, t, bw) | |
428 | 428 | if ((ck == 0)) | |
429 | 429 | then $Tuple13((bt._1 :+ toString(bC)), (bt._2 :+ co), (bt._3 :+ toString(cn)), bt._4, bt._5, bt._6, (bt._7 + 1), bt._8, bt._9, bt._10, bt._11, bw, bt._13) | |
432 | 432 | then if ((ck > -(cq))) | |
433 | 433 | then throw(((((("Attempt to buy " + toString(ck)) + " of ") + bt._11[bv]) + ", but warehouse only sells ") + toString(-(cq)))) | |
434 | 434 | else $Tuple13((bt._1 :+ toString(bC)), (bt._2 :+ ((toString((cq + ck)) + "@") + toString(cr))), (bt._3 :+ toString((cn + ck))), (bt._4 + ct), bt._5, (bt._6 + cm), (bt._7 + 1), bt._8, bt._9, bt._10, bt._11, bw, (bt._13 + (if (bw) | |
435 | - | then (ck * | |
435 | + | then (ck * ad) | |
436 | 436 | else ck))) | |
437 | 437 | else throw((("Attempt to buy " + bt._11[bv]) + " while warehouse doesn't sell it")) | |
438 | 438 | else if ((cq > 0)) | |
441 | 441 | else if ((-(ck) > cn)) | |
442 | 442 | then throw(((((("Attempt to sell " + toString(-(ck))) + ", but you only have ") + toString(cn)) + " of ") + bt._11[bv])) | |
443 | 443 | else $Tuple13((bt._1 :+ toString((bC - ck))), (bt._2 :+ ((toString((cq + ck)) + "@") + toString(cr))), (bt._3 :+ toString((cn + ck))), (bt._4 - ct), (bt._5 - cm), bt._6, (bt._7 + 1), bt._8, bt._9, bt._10, bt._11, bw, (bt._13 - (if (bw) | |
444 | - | then (ck * | |
444 | + | then (ck * ad) | |
445 | 445 | else ck))) | |
446 | 446 | else throw((("Attempt to sell " + bt._11[bv]) + " while warehouse doesn't buy it")) | |
447 | 447 | } | |
451 | 451 | ||
452 | 452 | ||
453 | 453 | @Callable(cu) | |
454 | - | func recalcLockedVolumeREADONLY ( | |
455 | - | let bK = aQ(Q | |
454 | + | func recalcLockedVolumeREADONLY (Q,cv) = { | |
455 | + | let bK = aQ(P(Q)) | |
456 | 456 | let cw = bI(cv, bK, bK) | |
457 | 457 | $Tuple2(nil, (cw._4 + cw._5)) | |
458 | 458 | } | |
462 | 462 | @Callable(cu) | |
463 | 463 | func constructorV1 (cx) = if ((cu.caller != this)) | |
464 | 464 | then throw("Permission denied") | |
465 | - | else [StringEntry( | |
465 | + | else [StringEntry(am(), cx)] | |
466 | 466 | ||
467 | 467 | ||
468 | 468 | ||
469 | 469 | @Callable(cu) | |
470 | 470 | func sellResources (cy,cz) = { | |
471 | 471 | let cA = br() | |
472 | - | let N = valueOrErrorMessage(getString( | |
472 | + | let N = valueOrErrorMessage(getString(at, K(toString(cu.caller))), "You don't have a duck staked") | |
473 | 473 | if ((size(cu.payments) != 0)) | |
474 | 474 | then throw("sellResources doesn't require any payments") | |
475 | 475 | else { | |
476 | - | let cB = split(valueOrElse(getString( | |
477 | - | if ((cB[ | |
478 | - | then throw(("Duck location type should be Factory, but is " + cB[ | |
476 | + | let cB = split(valueOrElse(getString(at, O(N)), g), "_") | |
477 | + | if ((cB[T] != "F")) | |
478 | + | then throw(("Duck location type should be Factory, but is " + cB[T])) | |
479 | 479 | else { | |
480 | - | let aZ = cB[ | |
480 | + | let aZ = cB[U] | |
481 | 481 | let cC = bo(M(N)) | |
482 | 482 | let cD = split(cC[C], "_") | |
483 | 483 | func cE (bt,bv) = if ((cy[bv] > parseIntValue(cD[bv]))) | |
492 | 492 | else $Tuple4(bt._1, (bt._2 :+ cD[bv]), bt._3, bt._4) | |
493 | 493 | ||
494 | 494 | let cG = { | |
495 | - | let bW = | |
495 | + | let bW = ag | |
496 | 496 | let bX = size(bW) | |
497 | 497 | let bY = $Tuple4(nil, nil, 0, 0) | |
498 | 498 | func bZ (ca,cb) = if ((cb >= bX)) | |
506 | 506 | cc(bZ(bZ(bZ(bZ(bZ(bZ(bY, 0), 1), 2), 3), 4), 5), 6) | |
507 | 507 | } | |
508 | 508 | let cH = makeString([cC[B], makeString(cG._2, "_"), cC[D], cC[E]], ":") | |
509 | - | let cI = | |
510 | - | let cJ = | |
511 | - | $Tuple2((cG._1 :+ ScriptTransfer(cu.caller, cG._3, | |
509 | + | let cI = au(invoke(at, "updateBackpack", [N, cH], nil)) | |
510 | + | let cJ = ax(invoke(at, "updateDuckStats", [N, fraction(a, cG._4, ad)], nil)) | |
511 | + | $Tuple2((cG._1 :+ ScriptTransfer(cu.caller, cG._3, Y)), $Tuple3(cI, cA, cJ)) | |
512 | 512 | } | |
513 | 513 | } | |
514 | 514 | } | |
518 | 518 | @Callable(cu) | |
519 | 519 | func buyMaterials (cy,cK) = { | |
520 | 520 | let cA = br() | |
521 | - | let N = valueOrErrorMessage(getString( | |
521 | + | let N = valueOrErrorMessage(getString(at, K(toString(cu.caller))), "You don't have a duck staked") | |
522 | 522 | if ((size(cu.payments) != 1)) | |
523 | 523 | then throw("exactly 1 payment must be attached") | |
524 | 524 | else { | |
525 | 525 | let cL = cu.payments[0] | |
526 | 526 | let cM = cL.amount | |
527 | 527 | let cN = valueOrErrorMessage(cL.assetId, "WAVES can't be used as payment") | |
528 | - | if ((cN != | |
528 | + | if ((cN != Y)) | |
529 | 529 | then throw("USDT payments only!") | |
530 | 530 | else { | |
531 | - | let cB = split(valueOrElse(getString( | |
532 | - | if ((cB[ | |
533 | - | then throw(("Duck location type should be Factory, but is " + cB[ | |
531 | + | let cB = split(valueOrElse(getString(at, O(N)), g), "_") | |
532 | + | if ((cB[T] != "F")) | |
533 | + | then throw(("Duck location type should be Factory, but is " + cB[T])) | |
534 | 534 | else { | |
535 | - | let aZ = cB[ | |
535 | + | let aZ = cB[U] | |
536 | 536 | let cC = bo(M(N)) | |
537 | 537 | let cO = split(cC[D], "_") | |
538 | 538 | func cP (bt,bv) = if ((0 > cy[bv])) | |
545 | 545 | else $Tuple4(bt._1, (bt._2 :+ cO[bv]), bt._3, bt._4) | |
546 | 546 | ||
547 | 547 | let cG = { | |
548 | - | let bW = | |
548 | + | let bW = ag | |
549 | 549 | let bX = size(bW) | |
550 | 550 | let bY = $Tuple4(nil, nil, 0, 0) | |
551 | 551 | func bZ (ca,cb) = if ((cb >= bX)) | |
562 | 562 | then throw(((("Insufficient payment! Attached=" + toString(cM)) + ", required=") + toString(cG._3))) | |
563 | 563 | else { | |
564 | 564 | let cH = makeString([cC[B], cC[C], makeString(cG._2, "_"), cC[E]], ":") | |
565 | - | let cI = | |
566 | - | let | |
567 | - | then [ScriptTransfer(cu.caller, (cM - cG._3), | |
565 | + | let cI = au(invoke(at, "updateBackpack", [N, cH], nil)) | |
566 | + | let ao = if (((cM - cG._3) > 0)) | |
567 | + | then [ScriptTransfer(cu.caller, (cM - cG._3), Y)] | |
568 | 568 | else nil | |
569 | 569 | let cQ = (cG._3 / 100) | |
570 | - | let cJ = | |
571 | - | $Tuple2(((cG._1 ++ | |
570 | + | let cJ = ax(invoke(at, "updateDuckStats", [N, fraction(a, cG._4, ad)], nil)) | |
571 | + | $Tuple2(((cG._1 ++ ao) :+ ScriptTransfer(as, cQ, Y)), $Tuple3(cI, cA, cJ)) | |
572 | 572 | } | |
573 | 573 | } | |
574 | 574 | } | |
580 | 580 | @Callable(cu) | |
581 | 581 | func exchangeResources (cy) = { | |
582 | 582 | let cA = br() | |
583 | - | let N = valueOrErrorMessage(getString( | |
583 | + | let N = valueOrErrorMessage(getString(at, K(toString(cu.caller))), "You don't have a duck staked") | |
584 | 584 | if ((size(cu.payments) != 1)) | |
585 | 585 | then throw("exactly 1 payment must be attached") | |
586 | 586 | else { | |
587 | 587 | let cL = cu.payments[0] | |
588 | 588 | let cM = cL.amount | |
589 | 589 | let cN = valueOrErrorMessage(cL.assetId, "WAVES can't be used as payment") | |
590 | - | if ((cN != | |
590 | + | if ((cN != Y)) | |
591 | 591 | then throw("USDT payments only!") | |
592 | 592 | else { | |
593 | - | let cB = split(valueOrElse(getString( | |
594 | - | if ((cB[ | |
595 | - | then throw(("Duck location type should be Factory, but is " + cB[ | |
593 | + | let cB = split(valueOrElse(getString(at, O(N)), g), "_") | |
594 | + | if ((cB[T] != "F")) | |
595 | + | then throw(("Duck location type should be Factory, but is " + cB[T])) | |
596 | 596 | else { | |
597 | - | let aZ = cB[ | |
597 | + | let aZ = cB[U] | |
598 | 598 | let cC = bo(M(N)) | |
599 | 599 | let cD = split(cC[C], "_") | |
600 | 600 | let cO = split(cC[D], "_") | |
607 | 607 | else if ((0 > cS)) | |
608 | 608 | then throw(((("You tried to exchange negative amount of " + k[bv]) + ": ") + toString(cS))) | |
609 | 609 | else if ((cS > 0)) | |
610 | - | then $Tuple5((bt._1 :+ toString((parseIntValue(cD[bv]) - cS))), (bt._2 :+ toString((parseIntValue(cO[bv]) + cS))), (bt._3 + fraction(cS, h, | |
610 | + | then $Tuple5((bt._1 :+ toString((parseIntValue(cD[bv]) - cS))), (bt._2 :+ toString((parseIntValue(cO[bv]) + cS))), (bt._3 + fraction(cS, h, ad)), (bt._4 :+ IntegerEntry(bb, bc)), (bt._5 + cS)) | |
611 | 611 | else $Tuple5((bt._1 :+ cD[bv]), (bt._2 :+ cO[bv]), bt._3, bt._4, bt._5) | |
612 | 612 | } | |
613 | 613 | ||
614 | 614 | let cG = { | |
615 | - | let bW = | |
615 | + | let bW = ag | |
616 | 616 | let bX = size(bW) | |
617 | 617 | let bY = $Tuple5(nil, nil, 0, nil, 0) | |
618 | 618 | func bZ (ca,cb) = if ((cb >= bX)) | |
629 | 629 | then throw(((("Insufficient payment! Attached=" + toString(cM)) + ", required=") + toString(cG._3))) | |
630 | 630 | else { | |
631 | 631 | let cH = makeString([cC[B], makeString(cG._1, "_"), makeString(cG._2, "_"), cC[E]], ":") | |
632 | - | let cI = | |
633 | - | let | |
634 | - | then [ScriptTransfer(cu.caller, (cM - cG._3), | |
632 | + | let cI = au(invoke(at, "updateBackpack", [N, cH], nil)) | |
633 | + | let ao = if (((cM - cG._3) > 0)) | |
634 | + | then [ScriptTransfer(cu.caller, (cM - cG._3), Y)] | |
635 | 635 | else nil | |
636 | 636 | let cQ = (cG._3 / 100) | |
637 | - | let cJ = | |
638 | - | $Tuple2((( | |
637 | + | let cJ = ax(invoke(at, "updateDuckStats", [N, fraction(a, cG._5, ad)], nil)) | |
638 | + | $Tuple2(((ao ++ cG._4) :+ ScriptTransfer(as, cQ, Y)), $Tuple3(cI, cA, cJ)) | |
639 | 639 | } | |
640 | 640 | } | |
641 | 641 | } | |
653 | 653 | let cL = cu.payments[0] | |
654 | 654 | let cM = cL.amount | |
655 | 655 | let cN = valueOrErrorMessage(cL.assetId, "WAVES can't be used as payment") | |
656 | - | if ((cN != | |
656 | + | if ((cN != Y)) | |
657 | 657 | then throw("USDT payments only!") | |
658 | - | else if ((cM != | |
658 | + | else if ((cM != ac)) | |
659 | 659 | then throw("exactly 1 USDT must be attached as payment") | |
660 | 660 | else if ((0 >= cU)) | |
661 | 661 | then throw("Quantity should be positive") | |
662 | 662 | else { | |
663 | - | let N = valueOrErrorMessage(getString( | |
664 | - | let cB = split(valueOrElse(getString( | |
665 | - | if ((cB[ | |
666 | - | then throw(("Duck location type should be Manufactory, but is " + cB[ | |
663 | + | let N = valueOrErrorMessage(getString(at, K(toString(cu.caller))), "You don't have a duck staked") | |
664 | + | let cB = split(valueOrElse(getString(at, O(N)), g), "_") | |
665 | + | if ((cB[T] != "M")) | |
666 | + | then throw(("Duck location type should be Manufactory, but is " + cB[T])) | |
667 | 667 | else { | |
668 | - | let cV = cB[ | |
668 | + | let cV = cB[S] | |
669 | 669 | let cC = bo(M(N)) | |
670 | 670 | let cO = split(cC[D], "_") | |
671 | 671 | if (if ((0 > cT)) | |
673 | 673 | else (cT >= size(p))) | |
674 | 674 | then throw(("Unknown product idx=" + toString(cT))) | |
675 | 675 | else { | |
676 | - | let | |
677 | - | if ((size( | |
676 | + | let W = split(p[cT], "_") | |
677 | + | if ((size(W) != s)) | |
678 | 678 | then throw(("Fatal: unknown recipe: " + p[cT])) | |
679 | 679 | else { | |
680 | - | let cW = parseIntValue( | |
680 | + | let cW = parseIntValue(W[r]) | |
681 | 681 | if ((n[cW] != cV)) | |
682 | 682 | then throw(((("This product is available in " + n[cW]) + ", but you are in ") + cV)) | |
683 | 683 | else { | |
685 | 685 | then nil | |
686 | 686 | else split_4C(cC[E], "_") | |
687 | 687 | func cY (bt,cZ) = { | |
688 | - | let | |
689 | - | let da = if ((size(cX) > | |
690 | - | then cX[ | |
688 | + | let ay = bt._2 | |
689 | + | let da = if ((size(cX) > ay)) | |
690 | + | then cX[ay] | |
691 | 691 | else "0" | |
692 | 692 | let db = parseIntValue(da) | |
693 | 693 | let aU = (cU * t) | |
694 | - | let dc = if (( | |
694 | + | let dc = if ((ay == cT)) | |
695 | 695 | then toString((db + aU)) | |
696 | 696 | else da | |
697 | - | $Tuple2((bt._1 :+ dc), ( | |
697 | + | $Tuple2((bt._1 :+ dc), (ay + 1)) | |
698 | 698 | } | |
699 | 699 | ||
700 | 700 | let dd = ( let bW = p | |
710 | 710 | ||
711 | 711 | cc(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bY, 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 | |
712 | 712 | func de (bt,bv) = { | |
713 | - | let df = ((parseIntValue( | |
713 | + | let df = ((parseIntValue(W[bv]) * ac) * cU) | |
714 | 714 | let dg = parseIntValue(cO[bv]) | |
715 | 715 | if ((df > dg)) | |
716 | 716 | then throw(((((((("You have " + aA(dg, 8)) + " of ") + l[bv]) + ", but recipe requires ") + aA(df, 8)) + " for quantity ") + toString(cU))) | |
720 | 720 | } | |
721 | 721 | ||
722 | 722 | let cG = { | |
723 | - | let bW = | |
723 | + | let bW = ag | |
724 | 724 | let bX = size(bW) | |
725 | 725 | let bY = $Tuple2(nil, 0) | |
726 | 726 | func cd (ca,cb) = if ((cb >= bX)) | |
734 | 734 | ce(cd(cd(cd(cd(cd(cd(bY, 0), 1), 2), 3), 4), 5), 6) | |
735 | 735 | } | |
736 | 736 | let cH = makeString([cC[B], cC[C], makeString(cG._1, "_"), makeString_2C(dd, "_")], ":") | |
737 | - | let cI = | |
738 | - | let cJ = | |
737 | + | let cI = au(invoke(at, "updateBackpack", [N, cH], nil)) | |
738 | + | let cJ = ax(invoke(at, "updateDuckStats", [N, fraction(b, cG._2, ad)], nil)) | |
739 | 739 | $Tuple2(nil, $Tuple3(cI, cA, cJ)) | |
740 | 740 | } | |
741 | 741 | } | |
748 | 748 | ||
749 | 749 | ||
750 | 750 | @Callable(cu) | |
751 | - | func setWarehouseOrder (dh, | |
751 | + | func setWarehouseOrder (dh,Q) = { | |
752 | 752 | let di = cu.originCaller | |
753 | 753 | let J = toString(di) | |
754 | - | let cI = if ((di != | |
754 | + | let cI = if ((di != as)) | |
755 | 755 | then bq() | |
756 | 756 | else false | |
757 | - | let dj = value(assetInfo(fromBase58String( | |
758 | - | if (!(isDefined(getInteger( | |
757 | + | let dj = value(assetInfo(fromBase58String(Q))) | |
758 | + | if (!(isDefined(getInteger(at, H(Q))))) | |
759 | 759 | then throw((("NFT " + dj.name) + " is not staked")) | |
760 | 760 | else { | |
761 | - | let dk = valueOrErrorMessage(getString( | |
762 | - | if (if ((di != | |
761 | + | let dk = valueOrErrorMessage(getString(at, F(Q)), (("NFT " + dj.name) + " is orphaned")) | |
762 | + | if (if ((di != as)) | |
763 | 763 | then (dk != J) | |
764 | 764 | else false) | |
765 | 765 | then throw((e + " is not yours")) | |
766 | 766 | else { | |
767 | 767 | let dl = split_4C(dh, ":") | |
768 | - | let cv = | |
768 | + | let cv = au(invoke(at, "getWarehouseREADONLY", [Q], nil)) | |
769 | 769 | let bJ = split_4C(cv, ":") | |
770 | 770 | let dm = split(bJ[y], "_") | |
771 | 771 | let dn = parseIntValue(dm[A]) | |
772 | - | let aR = Q | |
772 | + | let aR = P(Q) | |
773 | 773 | let bK = aQ(aR) | |
774 | 774 | let cw = bI(bJ, bK, dl) | |
775 | 775 | let do = cw._4 | |
781 | 781 | then throw((((((("Attempt to reserve " + toString(do)) + " space for buy orders, and ") + toString(dp)) + " space for sell orders (and occupied=") + toString(dq)) + "), leads to negative free space")) | |
782 | 782 | else { | |
783 | 783 | let dt = makeString_2C([bJ[u], makeString(cw._1, "_"), makeString(cw._2, "_"), makeString_2C(cw._3, "_"), toString(dr)], ":") | |
784 | - | let du = | |
784 | + | let du = au(invoke(at, "saveWarehouse", [dt, Q], nil)) | |
785 | 785 | let dv = cw._6 | |
786 | 786 | let dw = if ((dv > 0)) | |
787 | 787 | then if ((size(cu.payments) != 1)) | |
790 | 790 | let cL = cu.payments[0] | |
791 | 791 | let cM = cL.amount | |
792 | 792 | let cN = valueOrErrorMessage(cL.assetId, "WAVES can't be used as payment") | |
793 | - | if ((cN != | |
793 | + | if ((cN != Y)) | |
794 | 794 | then throw("USDT payments only!") | |
795 | 795 | else if ((cM != dv)) | |
796 | 796 | then throw(("Payment needed is " + toString(dv))) | |
802 | 802 | else [StringEntry(aR, dh)] | |
803 | 803 | else if ((size(cu.payments) != 0)) | |
804 | 804 | then throw("No payments needed") | |
805 | - | else [ScriptTransfer(addressFromStringValue(dk), -(dv), | |
805 | + | else [ScriptTransfer(addressFromStringValue(dk), -(dv), Y), StringEntry(aR, dh)] | |
806 | 806 | $Tuple2(dw, $Tuple2(cI, du)) | |
807 | 807 | } | |
808 | 808 | } | |
812 | 812 | ||
813 | 813 | ||
814 | 814 | @Callable(cu) | |
815 | - | func acceptWarehouseOrder (dx, | |
815 | + | func acceptWarehouseOrder (dx,Q,N) = { | |
816 | 816 | let cA = br() | |
817 | 817 | let dy = cu.originCaller | |
818 | 818 | let dz = toString(dy) | |
819 | - | let dA = valueOrErrorMessage(getString( | |
820 | - | let cB = valueOrElse(getString( | |
819 | + | let dA = valueOrErrorMessage(getString(at, K(dz)), "You don't have a duck staked") | |
820 | + | let cB = valueOrElse(getString(at, O(dA)), g) | |
821 | 821 | let dB = split(value(cB), "_") | |
822 | - | if ((dB[ | |
823 | - | then throw((("Duck location type is " + dB[ | |
822 | + | if ((dB[T] != "L")) | |
823 | + | then throw((("Duck location type is " + dB[T]) + ", but should be L")) | |
824 | 824 | else if ((dA != N)) | |
825 | 825 | then throw(((("Your staked duck is " + dA) + ", but passed ") + N)) | |
826 | 826 | else { | |
827 | - | let dC = value(assetInfo(fromBase58String( | |
828 | - | if (!(isDefined(getInteger( | |
827 | + | let dC = value(assetInfo(fromBase58String(Q))) | |
828 | + | if (!(isDefined(getInteger(at, H(Q))))) | |
829 | 829 | then throw((("NFT " + dC.name) + " is not staked")) | |
830 | 830 | else { | |
831 | - | let dD = valueOrErrorMessage(getString( | |
831 | + | let dD = valueOrErrorMessage(getString(at, F(Q)), (("NFT " + dC.name) + " is orphaned")) | |
832 | 832 | if ((dD == dz)) | |
833 | 833 | then throw("You cannot trade with yourself") | |
834 | 834 | else { | |
846 | 846 | else if ((size(dG) != f)) | |
847 | 847 | then throw("All 6 materials should be passed") | |
848 | 848 | else { | |
849 | - | let cv = | |
849 | + | let cv = au(invoke(at, "getWarehouseREADONLY", [Q], nil)) | |
850 | 850 | let bJ = split_4C(cv, ":") | |
851 | 851 | let bM = split(bJ[v], "_") | |
852 | 852 | let bN = split(bJ[w], "_") | |
861 | 861 | let dL = if ((cC[E] == "")) | |
862 | 862 | then nil | |
863 | 863 | else split_4C(cC[E], "_") | |
864 | - | let aR = Q | |
864 | + | let aR = P(Q) | |
865 | 865 | let dM = aQ(aR) | |
866 | 866 | let dN = split(dM[aN], "_") | |
867 | 867 | let dO = split(dM[aO], "_") | |
919 | 919 | let dt = makeString_2C([bJ[u], makeString(bV._1, "_"), makeString(bl._1, "_"), makeString_2C(aS._1, "_"), toString(dR)], ":") | |
920 | 920 | let dS = makeString_2C([makeString(bV._2, "_"), makeString(bl._2, "_"), makeString_2C(aS._2, "_")], ":") | |
921 | 921 | let dT = makeString_2C([cC[B], makeString(bV._3, "_"), makeString(bl._3, "_"), makeString_2C(aS._3, "_")], ":") | |
922 | - | let du = | |
923 | - | let dU = | |
924 | - | let dV = | |
925 | - | let dW = | |
922 | + | let du = au(invoke(at, "saveWarehouse", [dt, Q], nil)) | |
923 | + | let dU = au(invoke(at, "updateBackpack", [N, dT], nil)) | |
924 | + | let dV = ax(invoke(at, "updateDuckStats", [N, fraction(d, aS._13, ad)], nil)) | |
925 | + | let dW = ax(invoke(at, "updateAccStats", [dD, fraction(d, aS._13, ad)], nil)) | |
926 | 926 | let dw = [StringEntry(aR, dS)] | |
927 | 927 | let dX = aS._5 | |
928 | 928 | let dY = if ((dX > 0)) | |
929 | 929 | then { | |
930 | - | let dZ = fraction(aS._5, aJ, | |
930 | + | let dZ = fraction(aS._5, aJ, ac) | |
931 | 931 | let ea = I(dz) | |
932 | - | let eb = getString( | |
932 | + | let eb = getString(at, ea) | |
933 | 933 | if (isDefined(eb)) | |
934 | - | then (((dw :+ ScriptTransfer(dy, (aS._5 - (3 * dZ)), | |
935 | - | else ((dw :+ ScriptTransfer(dy, (aS._5 - (3 * dZ)), | |
934 | + | then (((dw :+ ScriptTransfer(dy, (aS._5 - (3 * dZ)), Y)) :+ ScriptTransfer(as, dZ, Y)) :+ ScriptTransfer(addressFromStringValue(value(eb)), dZ, Y)) | |
935 | + | else ((dw :+ ScriptTransfer(dy, (aS._5 - (3 * dZ)), Y)) :+ ScriptTransfer(as, dZ, Y)) | |
936 | 936 | } | |
937 | 937 | else dw | |
938 | 938 | let ec = aS._6 | |
943 | 943 | let cL = cu.payments[0] | |
944 | 944 | let cM = cL.amount | |
945 | 945 | let cN = valueOrErrorMessage(cL.assetId, "WAVES can't be used as payment") | |
946 | - | if ((cN != | |
946 | + | if ((cN != Y)) | |
947 | 947 | then throw("USDT payments only!") | |
948 | 948 | else if ((cM != ec)) | |
949 | 949 | then throw(("Payment needed is " + toString(ec))) | |
950 | - | else if (( | |
951 | - | then throw(("Payment should be at least " + toString( | |
950 | + | else if ((af > cM)) | |
951 | + | then throw(("Payment should be at least " + toString(af))) | |
952 | 952 | else { | |
953 | - | let ee = fraction(aS._6, aJ, | |
953 | + | let ee = fraction(aS._6, aJ, ac) | |
954 | 954 | let ea = I(dD) | |
955 | - | let eb = getString( | |
955 | + | let eb = getString(at, ea) | |
956 | 956 | if (isDefined(eb)) | |
957 | - | then (((dY :+ ScriptTransfer(addressFromStringValue(dD), (aS._6 - (3 * ee)), | |
958 | - | else ((dY :+ ScriptTransfer(addressFromStringValue(dD), (aS._6 - (3 * ee)), | |
957 | + | then (((dY :+ ScriptTransfer(addressFromStringValue(dD), (aS._6 - (3 * ee)), Y)) :+ ScriptTransfer(as, ee, Y)) :+ ScriptTransfer(addressFromStringValue(value(eb)), ee, Y)) | |
958 | + | else ((dY :+ ScriptTransfer(addressFromStringValue(dD), (aS._6 - (3 * ee)), Y)) :+ ScriptTransfer(as, ee, Y)) | |
959 | 959 | } | |
960 | 960 | } | |
961 | 961 | else if ((size(cu.payments) != 0)) | |
977 | 977 | if ((size(cu.payments) != 0)) | |
978 | 978 | then throw("No payments needed") | |
979 | 979 | else { | |
980 | - | let N = valueOrErrorMessage(getString( | |
981 | - | let cB = split(valueOrElse(getString( | |
982 | - | if ((cB[ | |
983 | - | then throw(("Duck location type should be Airport, but is " + cB[ | |
980 | + | let N = valueOrErrorMessage(getString(at, K(toString(cu.caller))), "You don't have a duck staked") | |
981 | + | let cB = split(valueOrElse(getString(at, O(N)), g), "_") | |
982 | + | if ((cB[T] != "A")) | |
983 | + | then throw(("Duck location type should be Airport, but is " + cB[T])) | |
984 | 984 | else { | |
985 | 985 | let cC = bo(M(N)) | |
986 | 986 | let cX = if ((cC[E] == "")) | |
987 | 987 | then nil | |
988 | 988 | else split_4C(cC[E], "_") | |
989 | - | let ef = | |
989 | + | let ef = R() | |
990 | 990 | let eg = getString(ef) | |
991 | 991 | let eh = if (isDefined(eg)) | |
992 | 992 | then split(value(eg), "_") | |
999 | 999 | if ((0 > cU)) | |
1000 | 1000 | then throw("Quantity cannot be negative") | |
1001 | 1001 | else { | |
1002 | - | let | |
1003 | - | if ((size( | |
1002 | + | let W = split(ej, "_") | |
1003 | + | if ((size(W) != s)) | |
1004 | 1004 | then throw(("Fatal: unknown recipe: " + ej)) | |
1005 | 1005 | else { | |
1006 | 1006 | let ek = (i * t) | |
1011 | 1011 | if ((cU > em)) | |
1012 | 1012 | then throw(((("Warehouse can buy only " + toString(em)) + " of ") + m[bv])) | |
1013 | 1013 | else { | |
1014 | - | let en = W | |
1015 | - | let eo = fraction((en * j), h, ( | |
1014 | + | let en = V(W) | |
1015 | + | let eo = fraction((en * j), h, (ad * t)) | |
1016 | 1016 | let ep = if ((size(cX) > bv)) | |
1017 | 1017 | then parseIntValue(cX[bv]) | |
1018 | 1018 | else 0 | |
1039 | 1039 | cc(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bY, 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) | |
1040 | 1040 | } | |
1041 | 1041 | let dT = makeString_2C([cC[B], cC[C], cC[D], makeString_2C(cG._3, "_")], ":") | |
1042 | - | let dU = | |
1043 | - | let cJ = | |
1044 | - | $Tuple2([StringEntry(ef, makeString(cG._4, "_")), ScriptTransfer(cu.caller, cG._2, | |
1042 | + | let dU = au(invoke(at, "updateBackpack", [N, dT], nil)) | |
1043 | + | let cJ = ax(invoke(at, "updateDuckStats", [N, fraction(c, cG._5, (ad * 10))], nil)) | |
1044 | + | $Tuple2([StringEntry(ef, makeString(cG._4, "_")), ScriptTransfer(cu.caller, cG._2, Y)], $Tuple3(dU, cA, cJ)) | |
1045 | 1045 | } | |
1046 | 1046 | } | |
1047 | 1047 | } | |
1049 | 1049 | ||
1050 | 1050 | ||
1051 | 1051 | @Callable(cu) | |
1052 | - | func updateEsStorage (eq) = if ((cu.caller != | |
1052 | + | func updateEsStorage (eq) = if ((cu.caller != at)) | |
1053 | 1053 | then throw("Permission denied") | |
1054 | - | else $Tuple2([StringEntry( | |
1054 | + | else $Tuple2([StringEntry(R(), eq)], eq) | |
1055 | 1055 | ||
1056 | 1056 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let a = 10000 | |
5 | 5 | ||
6 | 6 | let b = 10000 | |
7 | 7 | ||
8 | 8 | let c = 10000 | |
9 | 9 | ||
10 | 10 | let d = 10000 | |
11 | 11 | ||
12 | 12 | let e = "LAND" | |
13 | 13 | ||
14 | 14 | let f = 6 | |
15 | 15 | ||
16 | 16 | let g = "Africa_F_Africa" | |
17 | 17 | ||
18 | 18 | let h = 39637 | |
19 | 19 | ||
20 | 20 | let i = 3 | |
21 | 21 | ||
22 | 22 | let j = 4 | |
23 | 23 | ||
24 | 24 | let k = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"] | |
25 | 25 | ||
26 | 26 | let l = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"] | |
27 | 27 | ||
28 | 28 | let m = ["First Aid Kit L1", "First Aid Kit L2", "First Aid Kit L3", "Backpack L1", "Backpack L2", "Backpack L3", "Food Ration L1", "Food Ration L2", "Food Ration L3", "Jet Pack L1", "Jet Pack L2", "Jet Pack L3", "Shield L1", "Shield L2", "Shield L3", "Mine L1", "Mine L2", "Mine L3", "Trap L1", "Trap L2", "Trap L3"] | |
29 | 29 | ||
30 | 30 | let n = ["Americas", "Europe", "Asia", "Africa", "Oceania"] | |
31 | 31 | ||
32 | 32 | let o = 10000000 | |
33 | 33 | ||
34 | 34 | let p = ["8_8_8_17_17_42_12_0_30_0,0,0,0,0,0,0_", "8_8_8_17_17_42_24_0_60_0,0,5,2,0,0,0_", "8_8_8_17_17_42_36_0_120_0,0,10,4,0,0,0_", "8_19_19_8_27_19_26_1_20_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_52_1_40_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_78_1_80_0,0,0,0,0,0,0_001", "8_8_8_8_8_60_13_2_2_0,0,0,0,0,0,0_011", "8_8_8_8_8_60_26_2_4_0,0,0,0,0,0,0_011", "8_8_8_8_8_60_39_2_8_0,0,0,0,0,0,0_011", "30_30_3_17_17_3_30_3_30_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_60_3_50_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_90_3_70_0,0,0,0,0,0,0_111", "18_18_10_18_18_18_11_4_10_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_22_4_20_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_33_4_30_0,0,0,0,0,0,0_201", "4_13_22_4_35_22_23_0_50,1,0_0,0,0,0,0,0,0_", "4_13_22_4_35_22_46_0_50,1,1_0,2,5,0,0,0,0_", "4_13_22_4_35_22_69_0_50,2,1_0,5,10,0,0,0,0_", "5_25_40_5_10_15_20_1_30,1,1_0,0,0,0,0,0,0_", "5_25_40_5_10_15_40_1_30,1,2_2,1,3,0,0,0,0_", "5_25_40_5_10_15_60_1_30,1,3_5,2,8,0,0,0,0_"] | |
35 | 35 | ||
36 | 36 | let q = 6 | |
37 | 37 | ||
38 | 38 | let r = 7 | |
39 | 39 | ||
40 | 40 | let s = 11 | |
41 | 41 | ||
42 | 42 | let t = 10 | |
43 | 43 | ||
44 | 44 | let u = 0 | |
45 | 45 | ||
46 | 46 | let v = 1 | |
47 | 47 | ||
48 | 48 | let w = 2 | |
49 | 49 | ||
50 | 50 | let x = 3 | |
51 | 51 | ||
52 | 52 | let y = 4 | |
53 | 53 | ||
54 | 54 | let z = 0 | |
55 | 55 | ||
56 | 56 | let A = 3 | |
57 | 57 | ||
58 | 58 | let B = 0 | |
59 | 59 | ||
60 | 60 | let C = 1 | |
61 | 61 | ||
62 | 62 | let D = 2 | |
63 | 63 | ||
64 | 64 | let E = 3 | |
65 | 65 | ||
66 | 66 | func F (G) = ("nftOwner_" + G) | |
67 | 67 | ||
68 | 68 | ||
69 | 69 | func H (G) = ("stakedTime_" + G) | |
70 | 70 | ||
71 | 71 | ||
72 | 72 | func I (J) = ("accRefBy_" + J) | |
73 | 73 | ||
74 | 74 | ||
75 | 75 | func K (L) = ("stakedDuckByOwner_" + L) | |
76 | 76 | ||
77 | 77 | ||
78 | 78 | func M (N) = ("backPack_" + N) | |
79 | 79 | ||
80 | 80 | ||
81 | 81 | func O (N) = ("duckLocation_" + N) | |
82 | 82 | ||
83 | 83 | ||
84 | - | func P () = " | |
84 | + | func P (Q) = ("landOrder_" + Q) | |
85 | 85 | ||
86 | 86 | ||
87 | - | func | |
87 | + | func R () = "emergencyWarehouseProducts" | |
88 | 88 | ||
89 | 89 | ||
90 | - | func S () = "emergencyWarehouseProducts" | |
90 | + | let S = 0 | |
91 | + | ||
92 | + | let T = 1 | |
93 | + | ||
94 | + | let U = 2 | |
95 | + | ||
96 | + | func V (W) = (parseIntValue(W[q]) * o) | |
91 | 97 | ||
92 | 98 | ||
93 | - | let | |
99 | + | let X = take(drop(this.bytes, 1), 1) | |
94 | 100 | ||
95 | - | let U = 1 | |
96 | - | ||
97 | - | let V = 2 | |
98 | - | ||
99 | - | func W (X) = (parseIntValue(X[q]) * o) | |
100 | - | ||
101 | - | ||
102 | - | let Y = take(drop(this.bytes, 1), 1) | |
103 | - | ||
104 | - | let Z = { | |
105 | - | let aa = Y | |
106 | - | if ((base58'2W' == aa)) | |
101 | + | let Y = { | |
102 | + | let Z = X | |
103 | + | if ((base58'2W' == Z)) | |
107 | 104 | then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi' | |
108 | - | else if ((base58'2T' == | |
105 | + | else if ((base58'2T' == Z)) | |
109 | 106 | then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63' | |
110 | 107 | else throw("Unknown chain") | |
111 | 108 | } | |
112 | 109 | ||
113 | - | let | |
114 | - | let | |
115 | - | if ((base58'2W' == | |
110 | + | let aa = { | |
111 | + | let Z = X | |
112 | + | if ((base58'2W' == Z)) | |
116 | 113 | then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv" | |
117 | - | else if ((base58'2T' == | |
114 | + | else if ((base58'2T' == Z)) | |
118 | 115 | then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy" | |
119 | 116 | else throw("Unknown chain") | |
120 | 117 | } | |
121 | 118 | ||
122 | - | let | |
119 | + | let ab = "__" | |
123 | 120 | ||
124 | - | let | |
121 | + | let ac = 1000000 | |
125 | 122 | ||
126 | - | let | |
123 | + | let ad = 100000000 | |
127 | 124 | ||
128 | - | let | |
125 | + | let ae = 10000000000 | |
129 | 126 | ||
130 | - | let | |
127 | + | let af = 100000 | |
131 | 128 | ||
132 | - | let | |
129 | + | let ag = [0, 1, 2, 3, 4, 5] | |
133 | 130 | ||
134 | - | func | |
131 | + | func ah (ai,aj) = valueOrErrorMessage(getString(ai, aj), makeString(["mandatory ", toString(ai), ".", aj, " is not defined"], "")) | |
135 | 132 | ||
136 | 133 | ||
137 | - | let | |
134 | + | let ak = 1 | |
138 | 135 | ||
139 | - | func | |
136 | + | func al () = "%s__restConfig" | |
140 | 137 | ||
141 | 138 | ||
142 | - | func | |
139 | + | func am () = "%s__restAddr" | |
143 | 140 | ||
144 | 141 | ||
145 | - | func | |
142 | + | func an (ao) = split_4C(ah(ao, al()), ab) | |
146 | 143 | ||
147 | 144 | ||
148 | - | func | |
145 | + | func ap (aq,ar) = valueOrErrorMessage(addressFromString(aq[ar]), ("Rest cfg doesn't contain address at index " + toString(ar))) | |
149 | 146 | ||
150 | 147 | ||
151 | - | let | |
148 | + | let as = addressFromStringValue(valueOrElse(getString(this, am()), aa)) | |
152 | 149 | ||
153 | - | let | |
150 | + | let aq = an(as) | |
154 | 151 | ||
155 | - | let | |
152 | + | let at = ap(aq, ak) | |
156 | 153 | ||
157 | - | func | |
158 | - | let | |
159 | - | if ($isInstanceOf( | |
154 | + | func au (av) = { | |
155 | + | let Z = av | |
156 | + | if ($isInstanceOf(Z, "String")) | |
160 | 157 | then { | |
161 | - | let | |
162 | - | | |
158 | + | let aw = Z | |
159 | + | aw | |
163 | 160 | } | |
164 | 161 | else throw("fail to cast into String") | |
165 | 162 | } | |
166 | 163 | ||
167 | 164 | ||
168 | - | func | |
169 | - | let | |
170 | - | if ($isInstanceOf( | |
165 | + | func ax (av) = { | |
166 | + | let Z = av | |
167 | + | if ($isInstanceOf(Z, "Int")) | |
171 | 168 | then { | |
172 | - | let | |
173 | - | | |
169 | + | let ay = Z | |
170 | + | ay | |
174 | 171 | } | |
175 | 172 | else throw("fail to cast into Int") | |
176 | 173 | } | |
174 | + | ||
175 | + | ||
176 | + | func az () = "contractsBlocked" | |
177 | 177 | ||
178 | 178 | ||
179 | 179 | func aA (aB,aC) = { | |
180 | 180 | let aD = pow(10, 0, aC, 0, 0, DOWN) | |
181 | 181 | let aE = toString((aB % aD)) | |
182 | 182 | let aF = drop(toString(aD), (1 + size(aE))) | |
183 | 183 | (((toString((aB / aD)) + ".") + aF) + aE) | |
184 | 184 | } | |
185 | 185 | ||
186 | 186 | ||
187 | 187 | let aG = 10000000000 | |
188 | 188 | ||
189 | 189 | let aH = 200 | |
190 | 190 | ||
191 | 191 | let aI = 300 | |
192 | 192 | ||
193 | 193 | let aJ = 10000 | |
194 | 194 | ||
195 | 195 | func aK (aL,aM) = ((("factoryWhByContinentAndRes_" + aL) + "_") + toString(aM)) | |
196 | 196 | ||
197 | 197 | ||
198 | 198 | let aN = 0 | |
199 | 199 | ||
200 | 200 | let aO = 1 | |
201 | 201 | ||
202 | 202 | let aP = 2 | |
203 | 203 | ||
204 | 204 | func aQ (aR) = { | |
205 | 205 | let aS = split(valueOrElse(getString(aR), "0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:"), ":") | |
206 | 206 | [if ((size(split(aS[aN], "_")) == f)) | |
207 | 207 | then aS[aN] | |
208 | 208 | else "0@0_0@0_0@0_0@0_0@0_0@0", if ((size(split(aS[aO], "_")) == f)) | |
209 | 209 | then aS[aO] | |
210 | 210 | else "0@0_0@0_0@0_0@0_0@0_0@0", aS[aP]] | |
211 | 211 | } | |
212 | 212 | ||
213 | 213 | ||
214 | 214 | func aT (aU,aV,aW) = if (aW) | |
215 | 215 | then { | |
216 | 216 | let aX = if ((aU >= 0)) | |
217 | 217 | then (((aU + aV) - 1) / aV) | |
218 | 218 | else -((((-(aU) + aV) - 1) / aV)) | |
219 | - | (aX * | |
219 | + | (aX * ad) | |
220 | 220 | } | |
221 | 221 | else aU | |
222 | 222 | ||
223 | 223 | ||
224 | 224 | func aY (aZ,aM,aU,ba) = { | |
225 | 225 | let bb = aK(aZ, aM) | |
226 | 226 | let bc = valueOrElse(getInteger(bb), 0) | |
227 | 227 | let bd = if ((bc > aG)) | |
228 | 228 | then 0 | |
229 | 229 | else if (((bc + aU) > aG)) | |
230 | 230 | then (aG - bc) | |
231 | 231 | else aU | |
232 | - | let be = (fraction(bd, ((aH * h) - fraction(((100 * bc) + (50 * bd)), h, aG)), | |
232 | + | let be = (fraction(bd, ((aH * h) - fraction(((100 * bc) + (50 * bd)), h, aG)), ae) + fraction((aU - bd), h, ad)) | |
233 | 233 | let bf = (ba - (ba / 100)) | |
234 | - | if (((bf * aU) > (be * | |
234 | + | if (((bf * aU) > (be * ad))) | |
235 | 235 | then throw((((((((((("Actual price = " + toString(be)) + " / ") + toString(aU)) + " < minPrice = ") + toString(ba)) + ", (") + aZ) + ", ") + k[aM]) + ")")) | |
236 | 236 | else $Tuple2(IntegerEntry(bb, (bc + aU)), be) | |
237 | 237 | } | |
238 | 238 | ||
239 | 239 | ||
240 | 240 | func bg (aZ,bh,aU,bi) = { | |
241 | 241 | let bb = aK(aZ, bh) | |
242 | 242 | let bc = valueOrElse(getInteger(bb), 0) | |
243 | 243 | let bj = if ((bc > aG)) | |
244 | 244 | then min([aU, (bc - aG)]) | |
245 | 245 | else 0 | |
246 | 246 | let bk = min([bc, (aU - bj)]) | |
247 | 247 | let bl = (bk + bj) | |
248 | - | let bm = (fraction(bk, ((aI * h) - fraction(((100 * bc) - (50 * bk)), h, aG)), | |
248 | + | let bm = (fraction(bk, ((aI * h) - fraction(((100 * bc) - (50 * bk)), h, aG)), ae) + fraction(bj, (2 * h), ad)) | |
249 | 249 | let bn = (bi + (bi / 100)) | |
250 | - | if (((bm * | |
250 | + | if (((bm * ad) > (bn * bl))) | |
251 | 251 | then throw((((((((((("Actual price = " + toString(bm)) + " / ") + toString(bl)) + " > maxPrice = ") + toString(bi)) + ", (") + aZ) + ", ") + l[bh]) + ")")) | |
252 | 252 | else $Tuple3(IntegerEntry(bb, (bc - bl)), bm, bl) | |
253 | 253 | } | |
254 | 254 | ||
255 | 255 | ||
256 | 256 | func bo (bp) = { | |
257 | - | let aS = split(valueOrElse(getString( | |
257 | + | let aS = split(valueOrElse(getString(at, bp), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":") | |
258 | 258 | [toString(valueOrElse(parseInt(aS[B]), 0)), if ((size(split(aS[C], "_")) == f)) | |
259 | 259 | then aS[C] | |
260 | 260 | else "0_0_0_0_0_0", if ((size(split(aS[D], "_")) == f)) | |
261 | 261 | then aS[D] | |
262 | 262 | else "0_0_0_0_0_0", aS[E]] | |
263 | 263 | } | |
264 | 264 | ||
265 | 265 | ||
266 | - | func bq () = if (valueOrElse(getBoolean( | |
266 | + | func bq () = if (valueOrElse(getBoolean(at, az()), false)) | |
267 | 267 | then throw("Contracts are under maintenance") | |
268 | 268 | else unit | |
269 | 269 | ||
270 | 270 | ||
271 | - | func br () = | |
271 | + | func br () = ax(invoke(at, "saveLastTx", nil, nil)) | |
272 | 272 | ||
273 | 273 | ||
274 | 274 | func bs (bt,bu) = { | |
275 | 275 | let bv = bt._1 | |
276 | 276 | let bw = bt._8 | |
277 | 277 | let bx = split(bu, "@") | |
278 | 278 | if ((size(bx) != 2)) | |
279 | 279 | then throw("Incorrect order format, should be amount@price") | |
280 | 280 | else { | |
281 | 281 | let by = parseIntValue(bx[0]) | |
282 | 282 | let bz = parseIntValue(bx[1]) | |
283 | - | let bA = fraction(by, bz, | |
283 | + | let bA = fraction(by, bz, ad) | |
284 | 284 | let bB = aT(by, t, bw) | |
285 | 285 | let bC = if ((size(bt._6) > bv)) | |
286 | 286 | then parseIntValue(bt._6[bv]) | |
287 | 287 | else 0 | |
288 | 288 | let bD = split(if ((size(bt._7) > bv)) | |
289 | 289 | then bt._7[bv] | |
290 | 290 | else "0@0", "@") | |
291 | 291 | let bE = parseIntValue(bD[0]) | |
292 | 292 | let bF = parseIntValue(bD[1]) | |
293 | 293 | if (if ((0 > bF)) | |
294 | 294 | then true | |
295 | 295 | else (0 > bz)) | |
296 | 296 | then throw("Price can't be negative") | |
297 | 297 | else { | |
298 | - | let bG = fraction(bE, bF, | |
298 | + | let bG = fraction(bE, bF, ad) | |
299 | 299 | if ((by == 0)) | |
300 | 300 | then if ((bE > 0)) | |
301 | 301 | then $Tuple9((bv + 1), (bt._2 :+ toString(bC)), bt._3, bt._4, (bt._5 - bG), bt._6, bt._7, bw, (bt._9 + aT(bC, t, bw))) | |
302 | 302 | else $Tuple9((bv + 1), (bt._2 :+ toString((bC - bE))), bt._3, bt._4, bt._5, bt._6, bt._7, bw, (bt._9 + aT((bC - bE), t, bw))) | |
303 | 303 | else if ((by > 0)) | |
304 | 304 | then if ((0 > bE)) | |
305 | 305 | then $Tuple9((bv + 1), (bt._2 :+ toString((bC - bE))), (bt._3 + bB), bt._4, (bt._5 + bA), bt._6, bt._7, bw, aT((bC - bE), t, bw)) | |
306 | 306 | else $Tuple9((bv + 1), (bt._2 :+ toString(bC)), (bt._3 + bB), bt._4, ((bt._5 + bA) - bG), bt._6, bt._7, bw, aT(bC, t, bw)) | |
307 | 307 | else if ((0 > bE)) | |
308 | 308 | then { | |
309 | 309 | let bH = (bE - by) | |
310 | 310 | if ((0 > (bC - bH))) | |
311 | 311 | then throw((((("Attempt to take " + toString(bH)) + " from warehouse, but only ") + toString(bC)) + " available")) | |
312 | 312 | else $Tuple9((bv + 1), (bt._2 :+ toString((bC - bH))), bt._3, (bt._4 - bB), bt._5, bt._6, bt._7, bw, aT((bC - bH), t, bw)) | |
313 | 313 | } | |
314 | 314 | else if ((0 > (bC + by))) | |
315 | 315 | then throw((((("Attempt to take " + toString(-(by))) + " from warehouse, but only ") + toString(bC)) + " available")) | |
316 | 316 | else $Tuple9((bv + 1), (bt._2 :+ toString((bC + by))), bt._3, (bt._4 - bB), (bt._5 - bG), bt._6, bt._7, bw, aT((bC + by), t, bw)) | |
317 | 317 | } | |
318 | 318 | } | |
319 | 319 | } | |
320 | 320 | ||
321 | 321 | ||
322 | 322 | func bI (bJ,bK,bL) = { | |
323 | 323 | let bM = split(bJ[v], "_") | |
324 | 324 | let bN = split(bJ[w], "_") | |
325 | 325 | let bO = if ((bJ[x] == "")) | |
326 | 326 | then nil | |
327 | 327 | else split_4C(bJ[x], "_") | |
328 | 328 | let bP = split(bK[aN], "_") | |
329 | 329 | let bQ = split(bK[aO], "_") | |
330 | 330 | let bR = if ((bK[aP] == "")) | |
331 | 331 | then nil | |
332 | 332 | else split_4C(bK[aP], "_") | |
333 | 333 | if ((size(bL) != 3)) | |
334 | 334 | then throw("newOrderStr should contain exactly 2 ':' separators") | |
335 | 335 | else { | |
336 | 336 | let bS = split(bL[0], "_") | |
337 | 337 | let bT = split(bL[1], "_") | |
338 | 338 | let bU = if ((bL[2] == "")) | |
339 | 339 | then nil | |
340 | 340 | else split_4C(bL[2], "_") | |
341 | 341 | if ((size(bS) != f)) | |
342 | 342 | then throw("All 6 resources should be passed") | |
343 | 343 | else if ((size(bT) != f)) | |
344 | 344 | then throw("All 6 materials should be passed") | |
345 | 345 | else { | |
346 | 346 | let bV = { | |
347 | 347 | let bW = bS | |
348 | 348 | let bX = size(bW) | |
349 | 349 | let bY = $Tuple9(0, nil, 0, 0, 0, bM, bP, false, 0) | |
350 | 350 | func bZ (ca,cb) = if ((cb >= bX)) | |
351 | 351 | then ca | |
352 | 352 | else bs(ca, bW[cb]) | |
353 | 353 | ||
354 | 354 | func cc (ca,cb) = if ((cb >= bX)) | |
355 | 355 | then ca | |
356 | 356 | else throw("List size exceeds 6") | |
357 | 357 | ||
358 | 358 | cc(bZ(bZ(bZ(bZ(bZ(bZ(bY, 0), 1), 2), 3), 4), 5), 6) | |
359 | 359 | } | |
360 | 360 | let bl = { | |
361 | 361 | let bW = bT | |
362 | 362 | let bX = size(bW) | |
363 | 363 | let bY = $Tuple9(0, nil, bV._3, bV._4, bV._5, bN, bQ, false, bV._9) | |
364 | 364 | func cd (ca,cb) = if ((cb >= bX)) | |
365 | 365 | then ca | |
366 | 366 | else bs(ca, bW[cb]) | |
367 | 367 | ||
368 | 368 | func ce (ca,cb) = if ((cb >= bX)) | |
369 | 369 | then ca | |
370 | 370 | else throw("List size exceeds 6") | |
371 | 371 | ||
372 | 372 | ce(cd(cd(cd(cd(cd(cd(bY, 0), 1), 2), 3), 4), 5), 6) | |
373 | 373 | } | |
374 | 374 | let aS = if ((size(bU) != 0)) | |
375 | 375 | then { | |
376 | 376 | let bW = bU | |
377 | 377 | let bX = size(bW) | |
378 | 378 | let bY = $Tuple9(0, nil, bl._3, bl._4, bl._5, bO, bR, true, bl._9) | |
379 | 379 | func cf (ca,cb) = if ((cb >= bX)) | |
380 | 380 | then ca | |
381 | 381 | else bs(ca, bW[cb]) | |
382 | 382 | ||
383 | 383 | func cg (ca,cb) = if ((cb >= bX)) | |
384 | 384 | then ca | |
385 | 385 | else throw("List size exceeds 50") | |
386 | 386 | ||
387 | 387 | cg(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(bY, 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) | |
388 | 388 | } | |
389 | 389 | else $Tuple9(0, bO, bl._3, bl._4, bl._5, bO, bR, true, bl._9) | |
390 | 390 | $Tuple7(bV._2, bl._2, aS._2, aS._3, aS._4, aS._5, aS._9) | |
391 | 391 | } | |
392 | 392 | } | |
393 | 393 | } | |
394 | 394 | ||
395 | 395 | ||
396 | 396 | func ch (bt,ci) = { | |
397 | 397 | let bv = bt._7 | |
398 | 398 | let bw = bt._12 | |
399 | 399 | let cj = split(ci, "@") | |
400 | 400 | if ((size(cj) != 2)) | |
401 | 401 | then throw("Incorrect order format, should be amount@price") | |
402 | 402 | else { | |
403 | 403 | let ck = parseIntValue(cj[0]) | |
404 | 404 | let cl = parseIntValue(cj[1]) | |
405 | 405 | if ((0 > cl)) | |
406 | 406 | then throw("Price can't be negative") | |
407 | 407 | else { | |
408 | - | let cm = fraction(ck, cl, | |
408 | + | let cm = fraction(ck, cl, ad) | |
409 | 409 | let cn = if ((size(bt._8) > bv)) | |
410 | 410 | then parseIntValue(bt._8[bv]) | |
411 | 411 | else 0 | |
412 | 412 | let bC = if ((size(bt._9) > bv)) | |
413 | 413 | then parseIntValue(bt._9[bv]) | |
414 | 414 | else 0 | |
415 | 415 | let co = if ((size(bt._10) > bv)) | |
416 | 416 | then bt._10[bv] | |
417 | 417 | else "0@0" | |
418 | 418 | let cp = split(co, "@") | |
419 | 419 | let cq = parseIntValue(cp[0]) | |
420 | 420 | let cr = parseIntValue(cp[1]) | |
421 | 421 | if (if ((ck != 0)) | |
422 | 422 | then (cl != cr) | |
423 | 423 | else false) | |
424 | 424 | then throw(((((("Prices of " + bt._11[bv]) + " don't match! WH price=") + toString(cr)) + ", your price=") + toString(cl))) | |
425 | 425 | else { | |
426 | - | let cs = fraction(cq, cr, | |
426 | + | let cs = fraction(cq, cr, ad) | |
427 | 427 | let ct = aT(ck, t, bw) | |
428 | 428 | if ((ck == 0)) | |
429 | 429 | then $Tuple13((bt._1 :+ toString(bC)), (bt._2 :+ co), (bt._3 :+ toString(cn)), bt._4, bt._5, bt._6, (bt._7 + 1), bt._8, bt._9, bt._10, bt._11, bw, bt._13) | |
430 | 430 | else if ((ck > 0)) | |
431 | 431 | then if ((0 > cq)) | |
432 | 432 | then if ((ck > -(cq))) | |
433 | 433 | then throw(((((("Attempt to buy " + toString(ck)) + " of ") + bt._11[bv]) + ", but warehouse only sells ") + toString(-(cq)))) | |
434 | 434 | else $Tuple13((bt._1 :+ toString(bC)), (bt._2 :+ ((toString((cq + ck)) + "@") + toString(cr))), (bt._3 :+ toString((cn + ck))), (bt._4 + ct), bt._5, (bt._6 + cm), (bt._7 + 1), bt._8, bt._9, bt._10, bt._11, bw, (bt._13 + (if (bw) | |
435 | - | then (ck * | |
435 | + | then (ck * ad) | |
436 | 436 | else ck))) | |
437 | 437 | else throw((("Attempt to buy " + bt._11[bv]) + " while warehouse doesn't sell it")) | |
438 | 438 | else if ((cq > 0)) | |
439 | 439 | then if ((-(ck) > cq)) | |
440 | 440 | then throw(((((("Attempt to sell " + toString(-(ck))) + " of ") + bt._11[bv]) + ", but warehouse only buys ") + toString(cq))) | |
441 | 441 | else if ((-(ck) > cn)) | |
442 | 442 | then throw(((((("Attempt to sell " + toString(-(ck))) + ", but you only have ") + toString(cn)) + " of ") + bt._11[bv])) | |
443 | 443 | else $Tuple13((bt._1 :+ toString((bC - ck))), (bt._2 :+ ((toString((cq + ck)) + "@") + toString(cr))), (bt._3 :+ toString((cn + ck))), (bt._4 - ct), (bt._5 - cm), bt._6, (bt._7 + 1), bt._8, bt._9, bt._10, bt._11, bw, (bt._13 - (if (bw) | |
444 | - | then (ck * | |
444 | + | then (ck * ad) | |
445 | 445 | else ck))) | |
446 | 446 | else throw((("Attempt to sell " + bt._11[bv]) + " while warehouse doesn't buy it")) | |
447 | 447 | } | |
448 | 448 | } | |
449 | 449 | } | |
450 | 450 | } | |
451 | 451 | ||
452 | 452 | ||
453 | 453 | @Callable(cu) | |
454 | - | func recalcLockedVolumeREADONLY ( | |
455 | - | let bK = aQ(Q | |
454 | + | func recalcLockedVolumeREADONLY (Q,cv) = { | |
455 | + | let bK = aQ(P(Q)) | |
456 | 456 | let cw = bI(cv, bK, bK) | |
457 | 457 | $Tuple2(nil, (cw._4 + cw._5)) | |
458 | 458 | } | |
459 | 459 | ||
460 | 460 | ||
461 | 461 | ||
462 | 462 | @Callable(cu) | |
463 | 463 | func constructorV1 (cx) = if ((cu.caller != this)) | |
464 | 464 | then throw("Permission denied") | |
465 | - | else [StringEntry( | |
465 | + | else [StringEntry(am(), cx)] | |
466 | 466 | ||
467 | 467 | ||
468 | 468 | ||
469 | 469 | @Callable(cu) | |
470 | 470 | func sellResources (cy,cz) = { | |
471 | 471 | let cA = br() | |
472 | - | let N = valueOrErrorMessage(getString( | |
472 | + | let N = valueOrErrorMessage(getString(at, K(toString(cu.caller))), "You don't have a duck staked") | |
473 | 473 | if ((size(cu.payments) != 0)) | |
474 | 474 | then throw("sellResources doesn't require any payments") | |
475 | 475 | else { | |
476 | - | let cB = split(valueOrElse(getString( | |
477 | - | if ((cB[ | |
478 | - | then throw(("Duck location type should be Factory, but is " + cB[ | |
476 | + | let cB = split(valueOrElse(getString(at, O(N)), g), "_") | |
477 | + | if ((cB[T] != "F")) | |
478 | + | then throw(("Duck location type should be Factory, but is " + cB[T])) | |
479 | 479 | else { | |
480 | - | let aZ = cB[ | |
480 | + | let aZ = cB[U] | |
481 | 481 | let cC = bo(M(N)) | |
482 | 482 | let cD = split(cC[C], "_") | |
483 | 483 | func cE (bt,bv) = if ((cy[bv] > parseIntValue(cD[bv]))) | |
484 | 484 | then throw(((((("You have " + cD[bv]) + " of ") + k[bv]) + ", but tried to sell ") + toString(cy[bv]))) | |
485 | 485 | else if ((0 > cy[bv])) | |
486 | 486 | then throw(((("You tried to sell negative amount of " + k[bv]) + ": ") + toString(cy[bv]))) | |
487 | 487 | else if ((cy[bv] > 0)) | |
488 | 488 | then { | |
489 | 489 | let cF = aY(aZ, bv, cy[bv], cz[bv]) | |
490 | 490 | $Tuple4((bt._1 :+ cF._1), (bt._2 :+ toString((parseIntValue(cD[bv]) - cy[bv]))), (bt._3 + cF._2), (bt._4 + cy[bv])) | |
491 | 491 | } | |
492 | 492 | else $Tuple4(bt._1, (bt._2 :+ cD[bv]), bt._3, bt._4) | |
493 | 493 | ||
494 | 494 | let cG = { | |
495 | - | let bW = | |
495 | + | let bW = ag | |
496 | 496 | let bX = size(bW) | |
497 | 497 | let bY = $Tuple4(nil, nil, 0, 0) | |
498 | 498 | func bZ (ca,cb) = if ((cb >= bX)) | |
499 | 499 | then ca | |
500 | 500 | else cE(ca, bW[cb]) | |
501 | 501 | ||
502 | 502 | func cc (ca,cb) = if ((cb >= bX)) | |
503 | 503 | then ca | |
504 | 504 | else throw("List size exceeds 6") | |
505 | 505 | ||
506 | 506 | cc(bZ(bZ(bZ(bZ(bZ(bZ(bY, 0), 1), 2), 3), 4), 5), 6) | |
507 | 507 | } | |
508 | 508 | let cH = makeString([cC[B], makeString(cG._2, "_"), cC[D], cC[E]], ":") | |
509 | - | let cI = | |
510 | - | let cJ = | |
511 | - | $Tuple2((cG._1 :+ ScriptTransfer(cu.caller, cG._3, | |
509 | + | let cI = au(invoke(at, "updateBackpack", [N, cH], nil)) | |
510 | + | let cJ = ax(invoke(at, "updateDuckStats", [N, fraction(a, cG._4, ad)], nil)) | |
511 | + | $Tuple2((cG._1 :+ ScriptTransfer(cu.caller, cG._3, Y)), $Tuple3(cI, cA, cJ)) | |
512 | 512 | } | |
513 | 513 | } | |
514 | 514 | } | |
515 | 515 | ||
516 | 516 | ||
517 | 517 | ||
518 | 518 | @Callable(cu) | |
519 | 519 | func buyMaterials (cy,cK) = { | |
520 | 520 | let cA = br() | |
521 | - | let N = valueOrErrorMessage(getString( | |
521 | + | let N = valueOrErrorMessage(getString(at, K(toString(cu.caller))), "You don't have a duck staked") | |
522 | 522 | if ((size(cu.payments) != 1)) | |
523 | 523 | then throw("exactly 1 payment must be attached") | |
524 | 524 | else { | |
525 | 525 | let cL = cu.payments[0] | |
526 | 526 | let cM = cL.amount | |
527 | 527 | let cN = valueOrErrorMessage(cL.assetId, "WAVES can't be used as payment") | |
528 | - | if ((cN != | |
528 | + | if ((cN != Y)) | |
529 | 529 | then throw("USDT payments only!") | |
530 | 530 | else { | |
531 | - | let cB = split(valueOrElse(getString( | |
532 | - | if ((cB[ | |
533 | - | then throw(("Duck location type should be Factory, but is " + cB[ | |
531 | + | let cB = split(valueOrElse(getString(at, O(N)), g), "_") | |
532 | + | if ((cB[T] != "F")) | |
533 | + | then throw(("Duck location type should be Factory, but is " + cB[T])) | |
534 | 534 | else { | |
535 | - | let aZ = cB[ | |
535 | + | let aZ = cB[U] | |
536 | 536 | let cC = bo(M(N)) | |
537 | 537 | let cO = split(cC[D], "_") | |
538 | 538 | func cP (bt,bv) = if ((0 > cy[bv])) | |
539 | 539 | then throw(((("You tried to buy negative amount of " + l[bv]) + ": ") + toString(cy[bv]))) | |
540 | 540 | else if ((cy[bv] > 0)) | |
541 | 541 | then { | |
542 | 542 | let cF = bg(aZ, bv, cy[bv], cK[bv]) | |
543 | 543 | $Tuple4((bt._1 :+ cF._1), (bt._2 :+ toString((parseIntValue(cO[bv]) + cF._3))), (bt._3 + cF._2), (bt._4 + cy[bv])) | |
544 | 544 | } | |
545 | 545 | else $Tuple4(bt._1, (bt._2 :+ cO[bv]), bt._3, bt._4) | |
546 | 546 | ||
547 | 547 | let cG = { | |
548 | - | let bW = | |
548 | + | let bW = ag | |
549 | 549 | let bX = size(bW) | |
550 | 550 | let bY = $Tuple4(nil, nil, 0, 0) | |
551 | 551 | func bZ (ca,cb) = if ((cb >= bX)) | |
552 | 552 | then ca | |
553 | 553 | else cP(ca, bW[cb]) | |
554 | 554 | ||
555 | 555 | func cc (ca,cb) = if ((cb >= bX)) | |
556 | 556 | then ca | |
557 | 557 | else throw("List size exceeds 6") | |
558 | 558 | ||
559 | 559 | cc(bZ(bZ(bZ(bZ(bZ(bZ(bY, 0), 1), 2), 3), 4), 5), 6) | |
560 | 560 | } | |
561 | 561 | if ((cG._3 > cM)) | |
562 | 562 | then throw(((("Insufficient payment! Attached=" + toString(cM)) + ", required=") + toString(cG._3))) | |
563 | 563 | else { | |
564 | 564 | let cH = makeString([cC[B], cC[C], makeString(cG._2, "_"), cC[E]], ":") | |
565 | - | let cI = | |
566 | - | let | |
567 | - | then [ScriptTransfer(cu.caller, (cM - cG._3), | |
565 | + | let cI = au(invoke(at, "updateBackpack", [N, cH], nil)) | |
566 | + | let ao = if (((cM - cG._3) > 0)) | |
567 | + | then [ScriptTransfer(cu.caller, (cM - cG._3), Y)] | |
568 | 568 | else nil | |
569 | 569 | let cQ = (cG._3 / 100) | |
570 | - | let cJ = | |
571 | - | $Tuple2(((cG._1 ++ | |
570 | + | let cJ = ax(invoke(at, "updateDuckStats", [N, fraction(a, cG._4, ad)], nil)) | |
571 | + | $Tuple2(((cG._1 ++ ao) :+ ScriptTransfer(as, cQ, Y)), $Tuple3(cI, cA, cJ)) | |
572 | 572 | } | |
573 | 573 | } | |
574 | 574 | } | |
575 | 575 | } | |
576 | 576 | } | |
577 | 577 | ||
578 | 578 | ||
579 | 579 | ||
580 | 580 | @Callable(cu) | |
581 | 581 | func exchangeResources (cy) = { | |
582 | 582 | let cA = br() | |
583 | - | let N = valueOrErrorMessage(getString( | |
583 | + | let N = valueOrErrorMessage(getString(at, K(toString(cu.caller))), "You don't have a duck staked") | |
584 | 584 | if ((size(cu.payments) != 1)) | |
585 | 585 | then throw("exactly 1 payment must be attached") | |
586 | 586 | else { | |
587 | 587 | let cL = cu.payments[0] | |
588 | 588 | let cM = cL.amount | |
589 | 589 | let cN = valueOrErrorMessage(cL.assetId, "WAVES can't be used as payment") | |
590 | - | if ((cN != | |
590 | + | if ((cN != Y)) | |
591 | 591 | then throw("USDT payments only!") | |
592 | 592 | else { | |
593 | - | let cB = split(valueOrElse(getString( | |
594 | - | if ((cB[ | |
595 | - | then throw(("Duck location type should be Factory, but is " + cB[ | |
593 | + | let cB = split(valueOrElse(getString(at, O(N)), g), "_") | |
594 | + | if ((cB[T] != "F")) | |
595 | + | then throw(("Duck location type should be Factory, but is " + cB[T])) | |
596 | 596 | else { | |
597 | - | let aZ = cB[ | |
597 | + | let aZ = cB[U] | |
598 | 598 | let cC = bo(M(N)) | |
599 | 599 | let cD = split(cC[C], "_") | |
600 | 600 | let cO = split(cC[D], "_") | |
601 | 601 | func cR (bt,bv) = { | |
602 | 602 | let bb = aK(aZ, bv) | |
603 | 603 | let bc = valueOrElse(getInteger(bb), 0) | |
604 | 604 | let cS = cy[bv] | |
605 | 605 | if ((cS > parseIntValue(cD[bv]))) | |
606 | 606 | then throw(((((("You have " + cD[bv]) + " of ") + k[bv]) + ", but tried to exchange ") + toString(cS))) | |
607 | 607 | else if ((0 > cS)) | |
608 | 608 | then throw(((("You tried to exchange negative amount of " + k[bv]) + ": ") + toString(cS))) | |
609 | 609 | else if ((cS > 0)) | |
610 | - | then $Tuple5((bt._1 :+ toString((parseIntValue(cD[bv]) - cS))), (bt._2 :+ toString((parseIntValue(cO[bv]) + cS))), (bt._3 + fraction(cS, h, | |
610 | + | then $Tuple5((bt._1 :+ toString((parseIntValue(cD[bv]) - cS))), (bt._2 :+ toString((parseIntValue(cO[bv]) + cS))), (bt._3 + fraction(cS, h, ad)), (bt._4 :+ IntegerEntry(bb, bc)), (bt._5 + cS)) | |
611 | 611 | else $Tuple5((bt._1 :+ cD[bv]), (bt._2 :+ cO[bv]), bt._3, bt._4, bt._5) | |
612 | 612 | } | |
613 | 613 | ||
614 | 614 | let cG = { | |
615 | - | let bW = | |
615 | + | let bW = ag | |
616 | 616 | let bX = size(bW) | |
617 | 617 | let bY = $Tuple5(nil, nil, 0, nil, 0) | |
618 | 618 | func bZ (ca,cb) = if ((cb >= bX)) | |
619 | 619 | then ca | |
620 | 620 | else cR(ca, bW[cb]) | |
621 | 621 | ||
622 | 622 | func cc (ca,cb) = if ((cb >= bX)) | |
623 | 623 | then ca | |
624 | 624 | else throw("List size exceeds 6") | |
625 | 625 | ||
626 | 626 | cc(bZ(bZ(bZ(bZ(bZ(bZ(bY, 0), 1), 2), 3), 4), 5), 6) | |
627 | 627 | } | |
628 | 628 | if ((cG._3 > cM)) | |
629 | 629 | then throw(((("Insufficient payment! Attached=" + toString(cM)) + ", required=") + toString(cG._3))) | |
630 | 630 | else { | |
631 | 631 | let cH = makeString([cC[B], makeString(cG._1, "_"), makeString(cG._2, "_"), cC[E]], ":") | |
632 | - | let cI = | |
633 | - | let | |
634 | - | then [ScriptTransfer(cu.caller, (cM - cG._3), | |
632 | + | let cI = au(invoke(at, "updateBackpack", [N, cH], nil)) | |
633 | + | let ao = if (((cM - cG._3) > 0)) | |
634 | + | then [ScriptTransfer(cu.caller, (cM - cG._3), Y)] | |
635 | 635 | else nil | |
636 | 636 | let cQ = (cG._3 / 100) | |
637 | - | let cJ = | |
638 | - | $Tuple2((( | |
637 | + | let cJ = ax(invoke(at, "updateDuckStats", [N, fraction(a, cG._5, ad)], nil)) | |
638 | + | $Tuple2(((ao ++ cG._4) :+ ScriptTransfer(as, cQ, Y)), $Tuple3(cI, cA, cJ)) | |
639 | 639 | } | |
640 | 640 | } | |
641 | 641 | } | |
642 | 642 | } | |
643 | 643 | } | |
644 | 644 | ||
645 | 645 | ||
646 | 646 | ||
647 | 647 | @Callable(cu) | |
648 | 648 | func craftGoods (cT,cU) = { | |
649 | 649 | let cA = br() | |
650 | 650 | if ((size(cu.payments) != 1)) | |
651 | 651 | then throw("exactly 1 payment must be attached") | |
652 | 652 | else { | |
653 | 653 | let cL = cu.payments[0] | |
654 | 654 | let cM = cL.amount | |
655 | 655 | let cN = valueOrErrorMessage(cL.assetId, "WAVES can't be used as payment") | |
656 | - | if ((cN != | |
656 | + | if ((cN != Y)) | |
657 | 657 | then throw("USDT payments only!") | |
658 | - | else if ((cM != | |
658 | + | else if ((cM != ac)) | |
659 | 659 | then throw("exactly 1 USDT must be attached as payment") | |
660 | 660 | else if ((0 >= cU)) | |
661 | 661 | then throw("Quantity should be positive") | |
662 | 662 | else { | |
663 | - | let N = valueOrErrorMessage(getString( | |
664 | - | let cB = split(valueOrElse(getString( | |
665 | - | if ((cB[ | |
666 | - | then throw(("Duck location type should be Manufactory, but is " + cB[ | |
663 | + | let N = valueOrErrorMessage(getString(at, K(toString(cu.caller))), "You don't have a duck staked") | |
664 | + | let cB = split(valueOrElse(getString(at, O(N)), g), "_") | |
665 | + | if ((cB[T] != "M")) | |
666 | + | then throw(("Duck location type should be Manufactory, but is " + cB[T])) | |
667 | 667 | else { | |
668 | - | let cV = cB[ | |
668 | + | let cV = cB[S] | |
669 | 669 | let cC = bo(M(N)) | |
670 | 670 | let cO = split(cC[D], "_") | |
671 | 671 | if (if ((0 > cT)) | |
672 | 672 | then true | |
673 | 673 | else (cT >= size(p))) | |
674 | 674 | then throw(("Unknown product idx=" + toString(cT))) | |
675 | 675 | else { | |
676 | - | let | |
677 | - | if ((size( | |
676 | + | let W = split(p[cT], "_") | |
677 | + | if ((size(W) != s)) | |
678 | 678 | then throw(("Fatal: unknown recipe: " + p[cT])) | |
679 | 679 | else { | |
680 | - | let cW = parseIntValue( | |
680 | + | let cW = parseIntValue(W[r]) | |
681 | 681 | if ((n[cW] != cV)) | |
682 | 682 | then throw(((("This product is available in " + n[cW]) + ", but you are in ") + cV)) | |
683 | 683 | else { | |
684 | 684 | let cX = if ((cC[E] == "")) | |
685 | 685 | then nil | |
686 | 686 | else split_4C(cC[E], "_") | |
687 | 687 | func cY (bt,cZ) = { | |
688 | - | let | |
689 | - | let da = if ((size(cX) > | |
690 | - | then cX[ | |
688 | + | let ay = bt._2 | |
689 | + | let da = if ((size(cX) > ay)) | |
690 | + | then cX[ay] | |
691 | 691 | else "0" | |
692 | 692 | let db = parseIntValue(da) | |
693 | 693 | let aU = (cU * t) | |
694 | - | let dc = if (( | |
694 | + | let dc = if ((ay == cT)) | |
695 | 695 | then toString((db + aU)) | |
696 | 696 | else da | |
697 | - | $Tuple2((bt._1 :+ dc), ( | |
697 | + | $Tuple2((bt._1 :+ dc), (ay + 1)) | |
698 | 698 | } | |
699 | 699 | ||
700 | 700 | let dd = ( let bW = p | |
701 | 701 | let bX = size(bW) | |
702 | 702 | let bY = $Tuple2(nil, 0) | |
703 | 703 | func bZ (ca,cb) = if ((cb >= bX)) | |
704 | 704 | then ca | |
705 | 705 | else cY(ca, bW[cb]) | |
706 | 706 | ||
707 | 707 | func cc (ca,cb) = if ((cb >= bX)) | |
708 | 708 | then ca | |
709 | 709 | else throw("List size exceeds 50") | |
710 | 710 | ||
711 | 711 | cc(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bY, 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 | |
712 | 712 | func de (bt,bv) = { | |
713 | - | let df = ((parseIntValue( | |
713 | + | let df = ((parseIntValue(W[bv]) * ac) * cU) | |
714 | 714 | let dg = parseIntValue(cO[bv]) | |
715 | 715 | if ((df > dg)) | |
716 | 716 | then throw(((((((("You have " + aA(dg, 8)) + " of ") + l[bv]) + ", but recipe requires ") + aA(df, 8)) + " for quantity ") + toString(cU))) | |
717 | 717 | else if ((df > 0)) | |
718 | 718 | then $Tuple2((bt._1 :+ toString((dg - df))), (bt._2 + df)) | |
719 | 719 | else $Tuple2((bt._1 :+ cO[bv]), bt._2) | |
720 | 720 | } | |
721 | 721 | ||
722 | 722 | let cG = { | |
723 | - | let bW = | |
723 | + | let bW = ag | |
724 | 724 | let bX = size(bW) | |
725 | 725 | let bY = $Tuple2(nil, 0) | |
726 | 726 | func cd (ca,cb) = if ((cb >= bX)) | |
727 | 727 | then ca | |
728 | 728 | else de(ca, bW[cb]) | |
729 | 729 | ||
730 | 730 | func ce (ca,cb) = if ((cb >= bX)) | |
731 | 731 | then ca | |
732 | 732 | else throw("List size exceeds 6") | |
733 | 733 | ||
734 | 734 | ce(cd(cd(cd(cd(cd(cd(bY, 0), 1), 2), 3), 4), 5), 6) | |
735 | 735 | } | |
736 | 736 | let cH = makeString([cC[B], cC[C], makeString(cG._1, "_"), makeString_2C(dd, "_")], ":") | |
737 | - | let cI = | |
738 | - | let cJ = | |
737 | + | let cI = au(invoke(at, "updateBackpack", [N, cH], nil)) | |
738 | + | let cJ = ax(invoke(at, "updateDuckStats", [N, fraction(b, cG._2, ad)], nil)) | |
739 | 739 | $Tuple2(nil, $Tuple3(cI, cA, cJ)) | |
740 | 740 | } | |
741 | 741 | } | |
742 | 742 | } | |
743 | 743 | } | |
744 | 744 | } | |
745 | 745 | } | |
746 | 746 | } | |
747 | 747 | ||
748 | 748 | ||
749 | 749 | ||
750 | 750 | @Callable(cu) | |
751 | - | func setWarehouseOrder (dh, | |
751 | + | func setWarehouseOrder (dh,Q) = { | |
752 | 752 | let di = cu.originCaller | |
753 | 753 | let J = toString(di) | |
754 | - | let cI = if ((di != | |
754 | + | let cI = if ((di != as)) | |
755 | 755 | then bq() | |
756 | 756 | else false | |
757 | - | let dj = value(assetInfo(fromBase58String( | |
758 | - | if (!(isDefined(getInteger( | |
757 | + | let dj = value(assetInfo(fromBase58String(Q))) | |
758 | + | if (!(isDefined(getInteger(at, H(Q))))) | |
759 | 759 | then throw((("NFT " + dj.name) + " is not staked")) | |
760 | 760 | else { | |
761 | - | let dk = valueOrErrorMessage(getString( | |
762 | - | if (if ((di != | |
761 | + | let dk = valueOrErrorMessage(getString(at, F(Q)), (("NFT " + dj.name) + " is orphaned")) | |
762 | + | if (if ((di != as)) | |
763 | 763 | then (dk != J) | |
764 | 764 | else false) | |
765 | 765 | then throw((e + " is not yours")) | |
766 | 766 | else { | |
767 | 767 | let dl = split_4C(dh, ":") | |
768 | - | let cv = | |
768 | + | let cv = au(invoke(at, "getWarehouseREADONLY", [Q], nil)) | |
769 | 769 | let bJ = split_4C(cv, ":") | |
770 | 770 | let dm = split(bJ[y], "_") | |
771 | 771 | let dn = parseIntValue(dm[A]) | |
772 | - | let aR = Q | |
772 | + | let aR = P(Q) | |
773 | 773 | let bK = aQ(aR) | |
774 | 774 | let cw = bI(bJ, bK, dl) | |
775 | 775 | let do = cw._4 | |
776 | 776 | let dp = cw._5 | |
777 | 777 | let dq = cw._7 | |
778 | 778 | let dr = (do + dp) | |
779 | 779 | let ds = ((dn - dq) - dr) | |
780 | 780 | if ((0 > ds)) | |
781 | 781 | then throw((((((("Attempt to reserve " + toString(do)) + " space for buy orders, and ") + toString(dp)) + " space for sell orders (and occupied=") + toString(dq)) + "), leads to negative free space")) | |
782 | 782 | else { | |
783 | 783 | let dt = makeString_2C([bJ[u], makeString(cw._1, "_"), makeString(cw._2, "_"), makeString_2C(cw._3, "_"), toString(dr)], ":") | |
784 | - | let du = | |
784 | + | let du = au(invoke(at, "saveWarehouse", [dt, Q], nil)) | |
785 | 785 | let dv = cw._6 | |
786 | 786 | let dw = if ((dv > 0)) | |
787 | 787 | then if ((size(cu.payments) != 1)) | |
788 | 788 | then throw("exactly 1 payment must be attached") | |
789 | 789 | else { | |
790 | 790 | let cL = cu.payments[0] | |
791 | 791 | let cM = cL.amount | |
792 | 792 | let cN = valueOrErrorMessage(cL.assetId, "WAVES can't be used as payment") | |
793 | - | if ((cN != | |
793 | + | if ((cN != Y)) | |
794 | 794 | then throw("USDT payments only!") | |
795 | 795 | else if ((cM != dv)) | |
796 | 796 | then throw(("Payment needed is " + toString(dv))) | |
797 | 797 | else [StringEntry(aR, dh)] | |
798 | 798 | } | |
799 | 799 | else if ((dv == 0)) | |
800 | 800 | then if ((size(cu.payments) != 0)) | |
801 | 801 | then throw("No payments needed") | |
802 | 802 | else [StringEntry(aR, dh)] | |
803 | 803 | else if ((size(cu.payments) != 0)) | |
804 | 804 | then throw("No payments needed") | |
805 | - | else [ScriptTransfer(addressFromStringValue(dk), -(dv), | |
805 | + | else [ScriptTransfer(addressFromStringValue(dk), -(dv), Y), StringEntry(aR, dh)] | |
806 | 806 | $Tuple2(dw, $Tuple2(cI, du)) | |
807 | 807 | } | |
808 | 808 | } | |
809 | 809 | } | |
810 | 810 | } | |
811 | 811 | ||
812 | 812 | ||
813 | 813 | ||
814 | 814 | @Callable(cu) | |
815 | - | func acceptWarehouseOrder (dx, | |
815 | + | func acceptWarehouseOrder (dx,Q,N) = { | |
816 | 816 | let cA = br() | |
817 | 817 | let dy = cu.originCaller | |
818 | 818 | let dz = toString(dy) | |
819 | - | let dA = valueOrErrorMessage(getString( | |
820 | - | let cB = valueOrElse(getString( | |
819 | + | let dA = valueOrErrorMessage(getString(at, K(dz)), "You don't have a duck staked") | |
820 | + | let cB = valueOrElse(getString(at, O(dA)), g) | |
821 | 821 | let dB = split(value(cB), "_") | |
822 | - | if ((dB[ | |
823 | - | then throw((("Duck location type is " + dB[ | |
822 | + | if ((dB[T] != "L")) | |
823 | + | then throw((("Duck location type is " + dB[T]) + ", but should be L")) | |
824 | 824 | else if ((dA != N)) | |
825 | 825 | then throw(((("Your staked duck is " + dA) + ", but passed ") + N)) | |
826 | 826 | else { | |
827 | - | let dC = value(assetInfo(fromBase58String( | |
828 | - | if (!(isDefined(getInteger( | |
827 | + | let dC = value(assetInfo(fromBase58String(Q))) | |
828 | + | if (!(isDefined(getInteger(at, H(Q))))) | |
829 | 829 | then throw((("NFT " + dC.name) + " is not staked")) | |
830 | 830 | else { | |
831 | - | let dD = valueOrErrorMessage(getString( | |
831 | + | let dD = valueOrErrorMessage(getString(at, F(Q)), (("NFT " + dC.name) + " is orphaned")) | |
832 | 832 | if ((dD == dz)) | |
833 | 833 | then throw("You cannot trade with yourself") | |
834 | 834 | else { | |
835 | 835 | let dE = split_4C(dx, ":") | |
836 | 836 | if ((size(dE) != 3)) | |
837 | 837 | then throw("bpOrderStr should contain exactly 2 ':' separators") | |
838 | 838 | else { | |
839 | 839 | let dF = split(dE[0], "_") | |
840 | 840 | let dG = split(dE[1], "_") | |
841 | 841 | let dH = if ((dE[2] == "")) | |
842 | 842 | then nil | |
843 | 843 | else split_4C(dE[2], "_") | |
844 | 844 | if ((size(dF) != f)) | |
845 | 845 | then throw("All 6 resources should be passed") | |
846 | 846 | else if ((size(dG) != f)) | |
847 | 847 | then throw("All 6 materials should be passed") | |
848 | 848 | else { | |
849 | - | let cv = | |
849 | + | let cv = au(invoke(at, "getWarehouseREADONLY", [Q], nil)) | |
850 | 850 | let bJ = split_4C(cv, ":") | |
851 | 851 | let bM = split(bJ[v], "_") | |
852 | 852 | let bN = split(bJ[w], "_") | |
853 | 853 | let bO = if ((bJ[x] == "")) | |
854 | 854 | then nil | |
855 | 855 | else split_4C(bJ[x], "_") | |
856 | 856 | let dI = parseIntValue(split(bJ[y], "_")[z]) | |
857 | 857 | let bp = M(N) | |
858 | 858 | let cC = bo(bp) | |
859 | 859 | let dJ = split(cC[C], "_") | |
860 | 860 | let dK = split(cC[D], "_") | |
861 | 861 | let dL = if ((cC[E] == "")) | |
862 | 862 | then nil | |
863 | 863 | else split_4C(cC[E], "_") | |
864 | - | let aR = Q | |
864 | + | let aR = P(Q) | |
865 | 865 | let dM = aQ(aR) | |
866 | 866 | let dN = split(dM[aN], "_") | |
867 | 867 | let dO = split(dM[aO], "_") | |
868 | 868 | let dP = if ((dM[aP] == "")) | |
869 | 869 | then nil | |
870 | 870 | else split_4C(dM[aP], "_") | |
871 | 871 | let bV = { | |
872 | 872 | let bW = dF | |
873 | 873 | let bX = size(bW) | |
874 | 874 | let bY = $Tuple13(nil, nil, nil, 0, 0, 0, 0, dJ, bM, dN, k, false, 0) | |
875 | 875 | func bZ (ca,cb) = if ((cb >= bX)) | |
876 | 876 | then ca | |
877 | 877 | else ch(ca, bW[cb]) | |
878 | 878 | ||
879 | 879 | func cc (ca,cb) = if ((cb >= bX)) | |
880 | 880 | then ca | |
881 | 881 | else throw("List size exceeds 6") | |
882 | 882 | ||
883 | 883 | cc(bZ(bZ(bZ(bZ(bZ(bZ(bY, 0), 1), 2), 3), 4), 5), 6) | |
884 | 884 | } | |
885 | 885 | let bl = { | |
886 | 886 | let bW = dG | |
887 | 887 | let bX = size(bW) | |
888 | 888 | let bY = $Tuple13(nil, nil, nil, bV._4, bV._5, bV._6, 0, dK, bN, dO, l, false, bV._13) | |
889 | 889 | func cd (ca,cb) = if ((cb >= bX)) | |
890 | 890 | then ca | |
891 | 891 | else ch(ca, bW[cb]) | |
892 | 892 | ||
893 | 893 | func ce (ca,cb) = if ((cb >= bX)) | |
894 | 894 | then ca | |
895 | 895 | else throw("List size exceeds 6") | |
896 | 896 | ||
897 | 897 | ce(cd(cd(cd(cd(cd(cd(bY, 0), 1), 2), 3), 4), 5), 6) | |
898 | 898 | } | |
899 | 899 | let aS = if ((size(dH) != 0)) | |
900 | 900 | then { | |
901 | 901 | let bW = dH | |
902 | 902 | let bX = size(bW) | |
903 | 903 | let bY = $Tuple13(nil, nil, nil, bl._4, bl._5, bl._6, 0, dL, bO, dP, m, true, bl._13) | |
904 | 904 | func cf (ca,cb) = if ((cb >= bX)) | |
905 | 905 | then ca | |
906 | 906 | else ch(ca, bW[cb]) | |
907 | 907 | ||
908 | 908 | func cg (ca,cb) = if ((cb >= bX)) | |
909 | 909 | then ca | |
910 | 910 | else throw("List size exceeds 50") | |
911 | 911 | ||
912 | 912 | cg(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(cf(bY, 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) | |
913 | 913 | } | |
914 | 914 | else $Tuple13(bO, dP, dL, bl._4, bl._5, bl._6, 0, dL, bO, dP, m, true, bl._13) | |
915 | 915 | let dQ = aS._4 | |
916 | 916 | let dR = if ((0 > (dI - dQ))) | |
917 | 917 | then 0 | |
918 | 918 | else (dI - dQ) | |
919 | 919 | let dt = makeString_2C([bJ[u], makeString(bV._1, "_"), makeString(bl._1, "_"), makeString_2C(aS._1, "_"), toString(dR)], ":") | |
920 | 920 | let dS = makeString_2C([makeString(bV._2, "_"), makeString(bl._2, "_"), makeString_2C(aS._2, "_")], ":") | |
921 | 921 | let dT = makeString_2C([cC[B], makeString(bV._3, "_"), makeString(bl._3, "_"), makeString_2C(aS._3, "_")], ":") | |
922 | - | let du = | |
923 | - | let dU = | |
924 | - | let dV = | |
925 | - | let dW = | |
922 | + | let du = au(invoke(at, "saveWarehouse", [dt, Q], nil)) | |
923 | + | let dU = au(invoke(at, "updateBackpack", [N, dT], nil)) | |
924 | + | let dV = ax(invoke(at, "updateDuckStats", [N, fraction(d, aS._13, ad)], nil)) | |
925 | + | let dW = ax(invoke(at, "updateAccStats", [dD, fraction(d, aS._13, ad)], nil)) | |
926 | 926 | let dw = [StringEntry(aR, dS)] | |
927 | 927 | let dX = aS._5 | |
928 | 928 | let dY = if ((dX > 0)) | |
929 | 929 | then { | |
930 | - | let dZ = fraction(aS._5, aJ, | |
930 | + | let dZ = fraction(aS._5, aJ, ac) | |
931 | 931 | let ea = I(dz) | |
932 | - | let eb = getString( | |
932 | + | let eb = getString(at, ea) | |
933 | 933 | if (isDefined(eb)) | |
934 | - | then (((dw :+ ScriptTransfer(dy, (aS._5 - (3 * dZ)), | |
935 | - | else ((dw :+ ScriptTransfer(dy, (aS._5 - (3 * dZ)), | |
934 | + | then (((dw :+ ScriptTransfer(dy, (aS._5 - (3 * dZ)), Y)) :+ ScriptTransfer(as, dZ, Y)) :+ ScriptTransfer(addressFromStringValue(value(eb)), dZ, Y)) | |
935 | + | else ((dw :+ ScriptTransfer(dy, (aS._5 - (3 * dZ)), Y)) :+ ScriptTransfer(as, dZ, Y)) | |
936 | 936 | } | |
937 | 937 | else dw | |
938 | 938 | let ec = aS._6 | |
939 | 939 | let ed = if ((ec > 0)) | |
940 | 940 | then if ((size(cu.payments) != 1)) | |
941 | 941 | then throw("exactly 1 payment must be attached") | |
942 | 942 | else { | |
943 | 943 | let cL = cu.payments[0] | |
944 | 944 | let cM = cL.amount | |
945 | 945 | let cN = valueOrErrorMessage(cL.assetId, "WAVES can't be used as payment") | |
946 | - | if ((cN != | |
946 | + | if ((cN != Y)) | |
947 | 947 | then throw("USDT payments only!") | |
948 | 948 | else if ((cM != ec)) | |
949 | 949 | then throw(("Payment needed is " + toString(ec))) | |
950 | - | else if (( | |
951 | - | then throw(("Payment should be at least " + toString( | |
950 | + | else if ((af > cM)) | |
951 | + | then throw(("Payment should be at least " + toString(af))) | |
952 | 952 | else { | |
953 | - | let ee = fraction(aS._6, aJ, | |
953 | + | let ee = fraction(aS._6, aJ, ac) | |
954 | 954 | let ea = I(dD) | |
955 | - | let eb = getString( | |
955 | + | let eb = getString(at, ea) | |
956 | 956 | if (isDefined(eb)) | |
957 | - | then (((dY :+ ScriptTransfer(addressFromStringValue(dD), (aS._6 - (3 * ee)), | |
958 | - | else ((dY :+ ScriptTransfer(addressFromStringValue(dD), (aS._6 - (3 * ee)), | |
957 | + | then (((dY :+ ScriptTransfer(addressFromStringValue(dD), (aS._6 - (3 * ee)), Y)) :+ ScriptTransfer(as, ee, Y)) :+ ScriptTransfer(addressFromStringValue(value(eb)), ee, Y)) | |
958 | + | else ((dY :+ ScriptTransfer(addressFromStringValue(dD), (aS._6 - (3 * ee)), Y)) :+ ScriptTransfer(as, ee, Y)) | |
959 | 959 | } | |
960 | 960 | } | |
961 | 961 | else if ((size(cu.payments) != 0)) | |
962 | 962 | then throw("No payments needed") | |
963 | 963 | else dY | |
964 | 964 | $Tuple2(ed, $Tuple5(cA, du, dU, dV, dW)) | |
965 | 965 | } | |
966 | 966 | } | |
967 | 967 | } | |
968 | 968 | } | |
969 | 969 | } | |
970 | 970 | } | |
971 | 971 | ||
972 | 972 | ||
973 | 973 | ||
974 | 974 | @Callable(cu) | |
975 | 975 | func sellProductsToES (cy) = { | |
976 | 976 | let cA = br() | |
977 | 977 | if ((size(cu.payments) != 0)) | |
978 | 978 | then throw("No payments needed") | |
979 | 979 | else { | |
980 | - | let N = valueOrErrorMessage(getString( | |
981 | - | let cB = split(valueOrElse(getString( | |
982 | - | if ((cB[ | |
983 | - | then throw(("Duck location type should be Airport, but is " + cB[ | |
980 | + | let N = valueOrErrorMessage(getString(at, K(toString(cu.caller))), "You don't have a duck staked") | |
981 | + | let cB = split(valueOrElse(getString(at, O(N)), g), "_") | |
982 | + | if ((cB[T] != "A")) | |
983 | + | then throw(("Duck location type should be Airport, but is " + cB[T])) | |
984 | 984 | else { | |
985 | 985 | let cC = bo(M(N)) | |
986 | 986 | let cX = if ((cC[E] == "")) | |
987 | 987 | then nil | |
988 | 988 | else split_4C(cC[E], "_") | |
989 | - | let ef = | |
989 | + | let ef = R() | |
990 | 990 | let eg = getString(ef) | |
991 | 991 | let eh = if (isDefined(eg)) | |
992 | 992 | then split(value(eg), "_") | |
993 | 993 | else nil | |
994 | 994 | func ei (bt,ej) = { | |
995 | 995 | let bv = bt._1 | |
996 | 996 | let cU = if ((size(cy) > bv)) | |
997 | 997 | then cy[bv] | |
998 | 998 | else 0 | |
999 | 999 | if ((0 > cU)) | |
1000 | 1000 | then throw("Quantity cannot be negative") | |
1001 | 1001 | else { | |
1002 | - | let | |
1003 | - | if ((size( | |
1002 | + | let W = split(ej, "_") | |
1003 | + | if ((size(W) != s)) | |
1004 | 1004 | then throw(("Fatal: unknown recipe: " + ej)) | |
1005 | 1005 | else { | |
1006 | 1006 | let ek = (i * t) | |
1007 | 1007 | let el = if ((size(eh) > bv)) | |
1008 | 1008 | then parseIntValue(eh[bv]) | |
1009 | 1009 | else 0 | |
1010 | 1010 | let em = (ek - el) | |
1011 | 1011 | if ((cU > em)) | |
1012 | 1012 | then throw(((("Warehouse can buy only " + toString(em)) + " of ") + m[bv])) | |
1013 | 1013 | else { | |
1014 | - | let en = W | |
1015 | - | let eo = fraction((en * j), h, ( | |
1014 | + | let en = V(W) | |
1015 | + | let eo = fraction((en * j), h, (ad * t)) | |
1016 | 1016 | let ep = if ((size(cX) > bv)) | |
1017 | 1017 | then parseIntValue(cX[bv]) | |
1018 | 1018 | else 0 | |
1019 | 1019 | if ((cU > ep)) | |
1020 | 1020 | then throw(((("You have only " + toString(ep)) + " of ") + m[bv])) | |
1021 | 1021 | else $Tuple5((bv + 1), (bt._2 + (eo * cU)), (bt._3 :+ toString((ep - cU))), (bt._4 :+ toString((el + cU))), (bt._5 + (en * cU))) | |
1022 | 1022 | } | |
1023 | 1023 | } | |
1024 | 1024 | } | |
1025 | 1025 | } | |
1026 | 1026 | ||
1027 | 1027 | let cG = { | |
1028 | 1028 | let bW = p | |
1029 | 1029 | let bX = size(bW) | |
1030 | 1030 | let bY = $Tuple5(0, 0, nil, nil, 0) | |
1031 | 1031 | func bZ (ca,cb) = if ((cb >= bX)) | |
1032 | 1032 | then ca | |
1033 | 1033 | else ei(ca, bW[cb]) | |
1034 | 1034 | ||
1035 | 1035 | func cc (ca,cb) = if ((cb >= bX)) | |
1036 | 1036 | then ca | |
1037 | 1037 | else throw("List size exceeds 50") | |
1038 | 1038 | ||
1039 | 1039 | cc(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bZ(bY, 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) | |
1040 | 1040 | } | |
1041 | 1041 | let dT = makeString_2C([cC[B], cC[C], cC[D], makeString_2C(cG._3, "_")], ":") | |
1042 | - | let dU = | |
1043 | - | let cJ = | |
1044 | - | $Tuple2([StringEntry(ef, makeString(cG._4, "_")), ScriptTransfer(cu.caller, cG._2, | |
1042 | + | let dU = au(invoke(at, "updateBackpack", [N, dT], nil)) | |
1043 | + | let cJ = ax(invoke(at, "updateDuckStats", [N, fraction(c, cG._5, (ad * 10))], nil)) | |
1044 | + | $Tuple2([StringEntry(ef, makeString(cG._4, "_")), ScriptTransfer(cu.caller, cG._2, Y)], $Tuple3(dU, cA, cJ)) | |
1045 | 1045 | } | |
1046 | 1046 | } | |
1047 | 1047 | } | |
1048 | 1048 | ||
1049 | 1049 | ||
1050 | 1050 | ||
1051 | 1051 | @Callable(cu) | |
1052 | - | func updateEsStorage (eq) = if ((cu.caller != | |
1052 | + | func updateEsStorage (eq) = if ((cu.caller != at)) | |
1053 | 1053 | then throw("Permission denied") | |
1054 | - | else $Tuple2([StringEntry( | |
1054 | + | else $Tuple2([StringEntry(R(), eq)], eq) | |
1055 | 1055 | ||
1056 | 1056 |
github/deemru/w8io/169f3d6 320.05 ms ◑