tx · A7ZdxZ895MU6GEHkV9ZRtM7K3PbknVEMwnecSGNqWbTk

3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh:  -0.02700000 Waves

2024.11.28 03:49 [3390590] smart account 3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh > SELF 0.00000000 Waves

{ "type": 13, "id": "A7ZdxZ895MU6GEHkV9ZRtM7K3PbknVEMwnecSGNqWbTk", "fee": 2700000, "feeAssetId": null, "timestamp": 1732755008800, "version": 2, "chainId": 84, "sender": "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh", "senderPublicKey": "3QtfC1XbLZXdeawMDeSERy9vvjUmj1XYd2GFmrvx7pWQ", "proofs": [ "5BuXP5jGSuqAN3ywtf6Rdr2piy9ztymiMuZL4NgJNzwe9f67u4jgawCWGuhX2UHU1LvGPdMVMJBeLhkYeuqXs5FV" ], "script": "base64:BgJGCAISABIECgIICBIDCgEEEgMKAQESABIAEgMKAQESABIECgIIARIAEgMKAQgSAwoBCBIECgIIARIECgIIARIAEgMKAQgSAGEAA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDcAgK3iBAAFTVVMVDgAgMLXLwAKREFZX01JTExJUwCAuJkpABVVU0RUMkFDUkVTX01VTFRJUExJRVIACgATT05FX1BFUkNFTlRfRElWSVNPUgBkAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALV0VFS19CTE9DS1MEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAA4E4DCQAAAgEBVAUHJG1hdGNoMAC0AQkAAgECDVVua25vd24gY2hhaW4AC3VzZHRBc3NldElkBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwASCE2nqyCAM/TtG7yo7ui5O8yYLdC136B5ao1CP5qA//uQMJAAACAQFUBQckbWF0Y2gwASBVsdifcoeC7+XjW42sBatl3ppDoS8WuwXzGreHpfHFGAkAAgECDVVua25vd24gY2hhaW4AFmRlZmF1bHRSZXN0MkFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQRndZdGE4YmlFejMxenBlRmU1REpLOHdFNXRyU3BRVkY4AwkAAAIBAVQFByRtYXRjaDACIzNON1V1WWFyNjI2NFA1OEZCaFZXS1BRQWg0WXVhMmhnbmd2CQACAQINVW5rbm93biBjaGFpbgAOYXJiaXRyYWdlRGVsYXkEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAFCkRBWV9NSUxMSVMDCQAAAgEBVAUHJG1hdGNoMADg1AMJAAIBAg1Vbmtub3duIGNoYWluABVvbGRTdGFraW5nQ29udHJhY3RTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQTG5jWHRTMVU4M0Q2Y1FiRkQzSDhyQkhQTGd6eFNGS1oxAwkAAAIBAVQFByRtYXRjaDACIzNOREN5Qkc1cTg1SnVhUmlpZ1VlRXRhaW55akNRVDNYcFptCQACAQINVW5rbm93biBjaGFpbgEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEElkeENmZ0FjcmVzMkRhcHAAAQANSWR4Q2ZnV2xnRGFwcAACABRJZHhDZmdJbnZlc3RGdW5kRGFwcAAFAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBD2tleVJlc3QyQWRkcmVzcwACDSVzX19yZXN0MkFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAghyZXN0MkNmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCHJlc3QyQ2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAANcmVzdDJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPa2V5UmVzdDJBZGRyZXNzAAUWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgAIcmVzdDJDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDXJlc3QyQ29udHJhY3QADmFjcmVzMkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFEElkeENmZ0FjcmVzMkRhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFDUlkeENmZ1dsZ0RhcHAAEmludmVzdEZ1bmRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCHJlc3QyQ2ZnBRRJZHhDZmdJbnZlc3RGdW5kRGFwcAATb2xkQWNyZXNDb250cmFjdEtleQIQb2xkQWNyZXNDb250cmFjdAEKa2V5QmxvY2tlZAACEGNvbnRyYWN0c0Jsb2NrZWQBFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEEYWRkcgkArAICAhNsYXN0V2Vla1R4SWRCeVVzZXJfBQRhZGRyARRrZXlDdXJXZWVrVHhJZEJ5VXNlcgEEYWRkcgkArAICAhJjdXJXZWVrVHhJZEJ5VXNlcl8FBGFkZHIAFGFjcmVzSXNzdWVkQW1vdW50S2V5AhFhY3Jlc0lzc3VlZEFtb3VudAAPYWNyZXNBc3NldElkS2V5AgxhY3Jlc0Fzc2V0SWQADGFjcmVzQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFDmFjcmVzMkNvbnRyYWN0BQ9hY3Jlc0Fzc2V0SWRLZXkCF0FDUkVTIGlzIG5vdCBpc3N1ZWQgeWV0ARhrZXlBY3Jlc1N0YWtlZFRpbWVCeVVzZXIBBGFkZHIJAKwCAgIWYWNyZXNTdGFrZWRUaW1lQnlVc2VyXwUEYWRkcgEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQlvd25lckFkZHIJAKwCAgITc3Rha2VkTGFuZHNCeU93bmVyXwUJb3duZXJBZGRyARRrZXlTdGFrZWREdWNrQnlPd25lcgEJb3duZXJBZGRyCQCsAgICEnN0YWtlZER1Y2tCeU93bmVyXwUJb3duZXJBZGRyAR5rZXlTdGFrZWRUaW1lQnlBc3NldElkQW5kT3duZXICB2Fzc2V0SWQEYWRkcgkArAICCQCsAgIJAKwCAgIDc3RfBQdhc3NldElkAgFfBQRhZGRyARRrZXlTdGFrZWRORlRzQnlPd25lcgEJb3duZXJBZGRyCQCsAgICEnN0YWtlZE5GVHNCeU93bmVyXwUJb3duZXJBZGRyAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBDGFzVHVwbGU1SW50cwEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIZKEludCwgSW50LCBJbnQsIEludCwgSW50KQQBdAUHJG1hdGNoMAUBdAkAAgECK2ZhaWwgdG8gY2FzdCBpbnRvIChJbnQsIEludCwgSW50LCBJbnQsIEludCkBDGFzVHVwbGU0SW50cwEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIUKEludCwgSW50LCBJbnQsIEludCkEAXQFByRtYXRjaDAFAXQJAAIBAiZmYWlsIHRvIGNhc3QgaW50byAoSW50LCBJbnQsIEludCwgSW50KQEMYXNUdXBsZTNJbnRzAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAg8oSW50LCBJbnQsIEludCkEAXQFByRtYXRjaDAFAXQJAAIBAiFmYWlsIHRvIGNhc3QgaW50byAoSW50LCBJbnQsIEludCkBDGFzVHVwbGUySW50cwEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQBdAUHJG1hdGNoMAUBdAkAAgECHGZhaWwgdG8gY2FzdCBpbnRvIChJbnQsIEludCkBCmZpeGVkUG9pbnQCA3ZhbAhkZWNpbWFscwQGdGVuUG93CQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgQHbG93UGFydAkApAMBCQBqAgUDdmFsBQZ0ZW5Qb3cEBnplcm9lcwkAsAICCQCkAwEFBnRlblBvdwkAZAIAAQkAsQIBBQdsb3dQYXJ0CQCsAgIJAKwCAgkArAICCQCkAwEJAGkCBQN2YWwFBnRlblBvdwIBLgUGemVyb2VzBQdsb3dQYXJ0AANNNl8AwIQ9AANNOF8AgMLXLwAPd2xnSXNzdWVkQW10S2V5AhB3bGdfaXNzdWVkQW1vdW50AA56Yklzc3VlZEFtdEtleQISemJpbGxfaXNzdWVkQW1vdW50ARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEEYWRkcgkArAICAhhhY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcl8FBGFkZHIBFWtleUZhcm1pbmdQb3dlckJ5VXNlcgEEYWRkcgkArAICAhNmYXJtaW5nUG93ZXJCeVVzZXJfBQRhZGRyABJhY3Jlc1N0YWtkVG90YWxLZXkCFmFjcmVzU3Rha2VkQW1vdW50VG90YWwAFHRvdGFsRmFybWluZ1Bvd2VyS2V5AhF0b3RhbEZhcm1pbmdQb3dlcgAVSWR4RHR4M1BlcmNDb252ZXJzaW9uAAAAC01BWF9XTF9ORlRTAAMADE1BWF9BUktfTkZUUwABAA1BUktfTkZUX0JPTlVTAIgnABdNQVhfTkZUU19TVEFLRURfQllfVVNFUgAEABFrZXlOZnRUb3RhbElzc3VlZAIObmZ0VG90YWxJc3N1ZWQAEWtleU5mdFRvdGFsQnVybmVkAg5uZnRUb3RhbEJ1cm5lZAATa2V5V2xOZnRUb3RhbFN0YWtlZAIQV2xOZnRUb3RhbFN0YWtlZAAUa2V5QXJrTmZ0VG90YWxTdGFrZWQCEUFya05mdFRvdGFsU3Rha2VkARVrZXlOZnROdW1iZXJCeUFzc2V0SWQBB2Fzc2V0SWQJAKwCAgITbmZ0TnVtYmVyQnlBc3NldElkXwUHYXNzZXRJZAESa2V5VXNlcldsTmZ0TnVtYmVyAQRhZGRyCQCsAgICEHVzZXJXbE5mdE51bWJlcl8FBGFkZHIBE2tleVVzZXJBcmtOZnROdW1iZXIBBGFkZHIJAKwCAgIRdXNlckFya05mdE51bWJlcl8FBGFkZHIBEGtleVVzZXJGdWxsQm9udXMBBGFkZHIJAKwCAgIOdXNlckZ1bGxCb251c18FBGFkZHIACmxldmVsQWNyZXMJAMwIAgAACQDMCAIACgkAzAgCABQJAMwIAgAoCQDMCAIAUAkAzAgCAJYBCQDMCAIA+gEJAMwIAgCQAwkAzAgCALwFCQDMCAIA6AcFA25pbAEPZ2V0TGV2ZWxCeUFjcmVzAQVhY3JlcwQDYWNyCQBpAgkAZAIFBWFjcmVzAP/B1y8FA004XwoBB2NoZWNrZXICA2FjYwRpdGVtAwkAZwIFBGl0ZW0FA2FjcgUDYWNjCQBkAgUDYWNjAAEKAAIkbAUKbGV2ZWxBY3JlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHY2hlY2tlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFYWNyZXMJAGgCCQBoAgUFYWNyZXMAFAkAZAIJAQ9nZXRMZXZlbEJ5QWNyZXMBBQVhY3JlcwAEAR5nZXRGYXJtaW5nUG93ZXJCeUFjcmVzQW5kQm9udXMCBWFjcmVzBmJvbnVzNgQKbm90Qm9udXNlZAkBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBQVhY3JlcwkAlAoCCQBrAwUKbm90Qm9udXNlZAkAZAIFA002XwUGYm9udXM2BQNNNl8FCm5vdEJvbnVzZWQBGWtleUxhc3RXbGdUcmFkZVRpbWVCeVVzZXIBBGFkZHIJAKwCAgIQbGFzdEFyYlRpbWVVc2VyXwUEYWRkcgAUa2V5TGFzdEFjcmVzU2VsbFRpbWUCEWxhc3RBY3Jlc1NlbGxUaW1lABBrZXlMYXN0TGltaXRMZWZ0Ag1sYXN0TGltaXRMZWZ0AAhuZnROYW1lcwkAzAgCAglTSE9WRUwtUDMJAMwIAgIKUElDS0FYRS1DMQkAzAgCAgpQSUNLQVhFLUMzCQDMCAICClBJQ0tBWEUtQzUJAMwIAgILUElDS0FYRS1DMTAFA25pbAALY29udGVudEtleXMJAMwIAgIPY29udGVudFNob3ZlbFAzCQDMCAICEGNvbnRlbnRQaWNrYXhlQzEJAMwIAgIQY29udGVudFBpY2theGVDMwkAzAgCAhBjb250ZW50UGlja2F4ZUM1CQDMCAICEWNvbnRlbnRQaWNrYXhlQzEwBQNuaWwABW5hbWVzCQDMCAICC0dvbGQgc2hvdmVsCQDMCAICB1BpY2theGUJAMwIAgIHUGlja2F4ZQkAzAgCAgdQaWNrYXhlCQDMCAICB1BpY2theGUFA25pbAAMZGVzY3JpcHRpb25zCQDMCAICFlJld2FyZCBmb3IgZWFybHkgYmlyZHMJAMwIAgITSW5jcmVhc2VzIEZhcm1Qb3dlcgkAzAgCAhNJbmNyZWFzZXMgRmFybVBvd2VyCQDMCAICE0luY3JlYXNlcyBGYXJtUG93ZXIJAMwIAgITSW5jcmVhc2VzIEZhcm1Qb3dlcgUDbmlsAAhyYXJpdGllcwkAzAgCAgVQcm9tbwkAzAgCAgZDb21tb24JAMwIAgIGQ29tbW9uCQDMCAICBkNvbW1vbgkAzAgCAgZDb21tb24FA25pbAAHYm9udXNlcwkAzAgCAAMJAMwIAgABCQDMCAIAAwkAzAgCAAUJAMwIAgAKBQNuaWwBBnByb2xvZwEBaQMDCQECIT0CCAUBaQxvcmlnaW5DYWxsZXIFDXJlc3QyQ29udHJhY3QJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBCmtleUJsb2NrZWQABwcJAAIBAh9Db250cmFjdHMgYXJlIHVuZGVyIG1haW50ZW5hbmNlBARhZGRyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQEd2VlawkAaQIFBmhlaWdodAULV0VFS19CTE9DS1MEEmxhc3RXZWVrVHhJZEJ5VXNlcgkAoggBCQEVa2V5TGFzdFdlZWtUeElkQnlVc2VyAQUEYWRkcgQEdHhJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAN3dHgJAKwCAgkArAICCQCkAwEFBHdlZWsCAV8FBHR4SWQDCQEJaXNEZWZpbmVkAQUSbGFzdFdlZWtUeElkQnlVc2VyBApsYXN0V2Vla1R4CQC1CQIJAQV2YWx1ZQEFEmxhc3RXZWVrVHhJZEJ5VXNlcgIBXwMJAAACCQCRAwIFCmxhc3RXZWVrVHgAAAkApAMBBQR3ZWVrCQDMCAIJAQtTdHJpbmdFbnRyeQIJARVrZXlMYXN0V2Vla1R4SWRCeVVzZXIBBQRhZGRyBQN3dHgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFGtleUN1cldlZWtUeElkQnlVc2VyAQUEYWRkcgUDd3R4BQNuaWwDCQAAAgkAkQMCBQpsYXN0V2Vla1R4AAAJAKQDAQkAZQIFBHdlZWsAAQkAzAgCCQELU3RyaW5nRW50cnkCCQEUa2V5Q3VyV2Vla1R4SWRCeVVzZXIBBQRhZGRyBQN3dHgFA25pbAQRY3VyV2Vla1R4SWRCeVVzZXIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJARVrZXlMYXN0V2Vla1R4SWRCeVVzZXIBBQRhZGRyBAljdXJXZWVrVHgJALUJAgURY3VyV2Vla1R4SWRCeVVzZXICAV8DCQAAAgkAkQMCBQljdXJXZWVrVHgAAAkApAMBBQR3ZWVrCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRrZXlDdXJXZWVrVHhJZEJ5VXNlcgEFBGFkZHIFA3d0eAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIJARVrZXlMYXN0V2Vla1R4SWRCeVVzZXIBBQRhZGRyBRFjdXJXZWVrVHhJZEJ5VXNlcgkAzAgCCQELU3RyaW5nRW50cnkCCQEUa2V5Q3VyV2Vla1R4SWRCeVVzZXIBBQRhZGRyBQN3dHgFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCCQEVa2V5TGFzdFdlZWtUeElkQnlVc2VyAQUEYWRkcgUDd3R4CQDMCAIJAQtTdHJpbmdFbnRyeQIJARRrZXlDdXJXZWVrVHhJZEJ5VXNlcgEFBGFkZHIFA3d0eAUDbmlsARRjcmVhdGVOZnREZXNjcmlwdGlvbgIIbmZ0SW5kZXgJbmZ0U2VyaWFsCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiJ7InVybCI6ICJodHRwczovL3dhdmVzbGFuZHMuY29tIiwgAg8iY29udGVudEtleSI6ICIJAJEDAgULY29udGVudEtleXMFCG5mdEluZGV4AgMiLCACCiJudW1iZXIiOiAFCW5mdFNlcmlhbAICLCACHCJjb2xsZWN0aW9uIjogIkRpZ2dpbmcgdG9vbHMCAyIsIAIJIm5hbWUiOiAiCQCRAwIFBW5hbWVzBQhuZnRJbmRleAIDIiwgAhAiZGVzY3JpcHRpb24iOiAiCQCRAwIFDGRlc2NyaXB0aW9ucwUIbmZ0SW5kZXgCAyIsIAIJInJhcmUiOiAiCQCRAwIFCHJhcml0aWVzBQhuZnRJbmRleAIDIiwgAgkiYm9udXMiOiAJAKQDAQkAkQMCBQdib251c2VzBQhuZnRJbmRleAICLCACGSJib251c1R5cGUiOiAiRmFybVBvd2VyIn0BEGlzc3VlTkZUaW50ZXJuYWwCCG5mdEluZGV4BGFkZHIDCQBnAgUIbmZ0SW5kZXgJAJADAQULY29udGVudEtleXMJAAIBAhZuZnRJbmRleCBvdXQgb2YgYm91bmRzBAluZnRTZXJpYWwJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFEWtleU5mdFRvdGFsSXNzdWVkAP///////////wEAAQQFaXNzdWUJAMIIBQkAkQMCBQhuZnROYW1lcwUIbmZ0SW5kZXgJARRjcmVhdGVOZnREZXNjcmlwdGlvbgIFCG5mdEluZGV4CQCkAwEFCW5mdFNlcmlhbAABAAAHBApuZnRBc3NldElkCQC4CAEFBWlzc3VlCQCUCgIJAMwIAgUFaXNzdWUJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtleU5mdFRvdGFsSXNzdWVkCQBkAgUJbmZ0U2VyaWFsAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJARVrZXlOZnROdW1iZXJCeUFzc2V0SWQBCQDYBAEFCm5mdEFzc2V0SWQFCW5mdFNlcmlhbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQRhZGRyAAEFCm5mdEFzc2V0SWQFA25pbAUKbmZ0QXNzZXRJZAEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAMDYW10B2FkZHJlc3MKYm9udXNEZWx0YQMDCQAAAgUDYW10AAAJAAACBQpib251c0RlbHRhAAAHCQACAQINTm90aGluZyB0byBkbwQJd2xnUmVzdWx0CQD8BwQFC3dsZ0NvbnRyYWN0AhJvblN0YWtlVW5zdGFrZUxhbmQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUJd2xnUmVzdWx0BQl3bGdSZXN1bHQEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEB3RpbWVLZXkJARhrZXlBY3Jlc1N0YWtlZFRpbWVCeVVzZXIBBQdhZGRyZXNzBAlhbW91bnRLZXkJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFB2FkZHJlc3MEDm9sZEFjcmVzQW1vdW50CQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAAAwMJAGYCAAAFA2FtdAkAZgIAAAkAZAIFDm9sZEFjcmVzQW1vdW50BQNhbXQHCQACAQkArAICCQCsAgIJAKwCAgIOWW91IGhhdmUgb25seSAJAQpmaXhlZFBvaW50AgUOb2xkQWNyZXNBbW91bnQACAIgIEFDUkVTIHN0YWtlZCwgdHJpZWQgdG8gdW5zdGFrZSAJAQpmaXhlZFBvaW50AgkBAS0BBQNhbXQACAQObmV3QWNyZXNBbW91bnQJAGQCBQ5vbGRBY3Jlc0Ftb3VudAUDYW10BAhvbGRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRJhY3Jlc1N0YWtkVG90YWxLZXkAAAQJdXNlckZwS2V5CQEVa2V5RmFybWluZ1Bvd2VyQnlVc2VyAQUHYWRkcmVzcwQFb2xkRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJdXNlckZwS2V5AAAECGJvbnVzS2V5CQEQa2V5VXNlckZ1bGxCb251cwEFB2FkZHJlc3MECG9sZEJvbnVzCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0BQhib251c0tleQAAAwMJAGYCAAAFCmJvbnVzRGVsdGEJAGYCAAAJAGQCBQhvbGRCb251cwUKYm9udXNEZWx0YQcJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICDllvdSBoYXZlIG9ubHkgCQEKZml4ZWRQb2ludAIFCG9sZEJvbnVzAAQCHiUgYm9udXMsIGFuZCB0cmllZCB0byB1bnN0YWtlIAkBCmZpeGVkUG9pbnQCCQEBLQEFCmJvbnVzRGVsdGEABAIBJQQLJHQwNTc5NDU4OTMJAR5nZXRGYXJtaW5nUG93ZXJCeUFjcmVzQW5kQm9udXMCBQ5uZXdBY3Jlc0Ftb3VudAkAZAIFCG9sZEJvbnVzBQpib251c0RlbHRhBAxuZXdCb251c2VkRnAIBQskdDA1Nzk0NTg5MwJfMQQHaWdub3JlZAgFCyR0MDU3OTQ1ODkzAl8yBApvbGRUb3RhbEZwCQELdmFsdWVPckVsc2UCCQCfCAEFFHRvdGFsRmFybWluZ1Bvd2VyS2V5AAAEDGFjcmVzQWN0aW9ucwMJAAACBQNhbXQAAAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlhbW91bnRLZXkFDm5ld0FjcmVzQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJhY3Jlc1N0YWtkVG90YWxLZXkJAGQCBQhvbGRUb3RhbAUDYW10BQNuaWwJAJQKAgkAzQgCCQDNCAIJAM0IAgkAzQgCBQxhY3Jlc0FjdGlvbnMJAQxJbnRlZ2VyRW50cnkCBQd0aW1lS2V5CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkBDEludGVnZXJFbnRyeQIFCXVzZXJGcEtleQUMbmV3Qm9udXNlZEZwCQEMSW50ZWdlckVudHJ5AgUUdG90YWxGYXJtaW5nUG93ZXJLZXkJAGUCCQBkAgUKb2xkVG90YWxGcAUMbmV3Qm9udXNlZEZwBQVvbGRGcAkBDEludGVnZXJFbnRyeQIFCGJvbnVzS2V5CQBkAgUIb2xkQm9udXMFCmJvbnVzRGVsdGEFCXdsZ1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgELZ2V0V2xnUHJpY2UBFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQMaXNzdWVkQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgULd2xnQ29udHJhY3QFD3dsZ0lzc3VlZEFtdEtleQIYV0xHT0xEIGlzIG5vdCBpc3N1ZWQgeWV0BAZ3bGdVc2QJAPAHAgULd2xnQ29udHJhY3QFC3VzZHRBc3NldElkBAlhY3JlczJVc2QJAGUCCQDwBwIFDmFjcmVzMkNvbnRyYWN0BQt1c2R0QXNzZXRJZAUVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBA9pbnZlc3RGdW5kVG90YWwJAGQCCQDwBwIFEmludmVzdEZ1bmRDb250cmFjdAULdXNkdEFzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQ56Yklzc3VlZEFtdEtleQAABA10b3RhbEZ1bmRzVXNkCQBkAgkAZAIFCWFjcmVzMlVzZAUGd2xnVXNkBQ9pbnZlc3RGdW5kVG90YWwJAGsDBQ10b3RhbEZ1bmRzVXNkBQVNVUxUOAUMaXNzdWVkQW1vdW50ARFnZXRTd2FwTGltaXRBY3JlcwAEBndsZ1VzZAkA8AcCBQt3bGdDb250cmFjdAULdXNkdEFzc2V0SWQECWFjcmVzMlVzZAkA8AcCBQR0aGlzBQt1c2R0QXNzZXRJZAQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRJpbnZlc3RGdW5kQ29udHJhY3QFC3VzZHRBc3NldElkCQELdmFsdWVPckVsc2UCCQCaCAIFEmludmVzdEZ1bmRDb250cmFjdAUOemJJc3N1ZWRBbXRLZXkAAAQMZGVmYXVsdExpbWl0CQBpAgkAZAIJAGQCBQlhY3JlczJVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsBRNPTkVfUEVSQ0VOVF9ESVZJU09SBA1sYXN0TGltaXRMZWZ0CQELdmFsdWVPckVsc2UCCQCfCAEFEGtleUxhc3RMaW1pdExlZnQFDGRlZmF1bHRMaW1pdAQIbGFzdFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUa2V5TGFzdEFjcmVzU2VsbFRpbWUAAAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQMY3VycmVudExpbWl0CQBkAgUNbGFzdExpbWl0TGVmdAkAawMFDGRlZmF1bHRMaW1pdAkAZQIFA25vdwUIbGFzdFRpbWUFCkRBWV9NSUxMSVMEDWxpbWl0TGVmdFVzZHQJAJcDAQkAzAgCBQxjdXJyZW50TGltaXQJAMwIAgUMZGVmYXVsdExpbWl0BQNuaWwJAJQKAgkBDEludGVnZXJFbnRyeQIFFGtleUxhc3RBY3Jlc1NlbGxUaW1lBQNub3cFDWxpbWl0TGVmdFVzZHQACWFya09yYWNsZQkBEUBleHRyTmF0aXZlKDEwNjIpAQIjM1BKZ1o2QUsxV1ZDcGRDbUVacGVzSG1hS3ZyUURkWEc1b2cACWluY3ViYXRvcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQlhcmtPcmFjbGUCF3N0YXRpY19pbmN1YmF0b3JBZGRyZXNzAgAAB2JyZWVkZXIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUJYXJrT3JhY2xlAhVzdGF0aWNfYnJlZWRlckFkZHJlc3MCAAAPdHVydGxlSW5jdWJhdG9yCQELdmFsdWVPckVsc2UCCQCdCAIFCWFya09yYWNsZQIdc3RhdGljX3R1cnRsZUluY3ViYXRvckFkZHJlc3MCAAANdHVydGxlQnJlZWRlcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQlhcmtPcmFjbGUCG3N0YXRpY190dXJ0bGVCcmVlZGVyQWRkcmVzcwIAAA9jYW5pbmVJbmN1YmF0b3IJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUJYXJrT3JhY2xlAh1zdGF0aWNfY2FuaW5lSW5jdWJhdG9yQWRkcmVzcwIAAA1jYW5pbmVCcmVlZGVyCQELdmFsdWVPckVsc2UCCQCdCAIFCWFya09yYWNsZQIbc3RhdGljX2NhbmluZUJyZWVkZXJBZGRyZXNzAgAAD2ZlbGluZUluY3ViYXRvcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQlhcmtPcmFjbGUCHXN0YXRpY19mZWxpbmVJbmN1YmF0b3JBZGRyZXNzAgAADWZlbGluZUJyZWVkZXIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUJYXJrT3JhY2xlAhtzdGF0aWNfZmVsaW5lQnJlZWRlckFkZHJlc3MCAAANbXV0YW50QnJlZWRlcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQlhcmtPcmFjbGUCHXN0YXRpY19tdXRhbnRJbmN1YmF0b3JBZGRyZXNzAgABD2lzQXJraW1hbElzc3VlZAEDbmZvBAZpc3N1ZXIJAKUIAQgFA25mbwZpc3N1ZXIDAwMDAwMDAwMDCQAAAgUFY2hhaW4BAVQJAAACBQZpc3N1ZXIFFW9sZFN0YWtpbmdDb250cmFjdFN0cgcGCQAAAgUGaXNzdWVyBQlpbmN1YmF0b3IGCQAAAgUGaXNzdWVyBQdicmVlZGVyBgkAAAIFBmlzc3VlcgUPdHVydGxlSW5jdWJhdG9yBgkAAAIFBmlzc3VlcgUNdHVydGxlQnJlZWRlcgYJAAACBQZpc3N1ZXIFD2NhbmluZUluY3ViYXRvcgYJAAACBQZpc3N1ZXIFDWNhbmluZUJyZWVkZXIGCQAAAgUGaXNzdWVyBQ9mZWxpbmVJbmN1YmF0b3IGCQAAAgUGaXNzdWVyBQ1mZWxpbmVCcmVlZGVyCAUDbmZvBG5hbWUDCQAAAgUGaXNzdWVyBQ1tdXRhbnRCcmVlZGVyCAUDbmZvC2Rlc2NyaXB0aW9uAgABEmJvbnVzQnlEZXNjcmlwdGlvbgEFZGVzY3IDCQEBIQEJAQhjb250YWlucwIFBWRlc2NyAhgiYm9udXNUeXBlIjogIkZhcm1Qb3dlciIJAAIBCQCsAgICFk5GVCBpcyBub3Qgc3VwcG9ydGVkOiAFBWRlc2NyBAhib251c1N0cgkAkQMCCQC8CQIJAJEDAgkAvAkCBQVkZXNjcgIIImJvbnVzIjoAAQIBLAAACQENcGFyc2VJbnRWYWx1ZQEJALACAgUIYm9udXNTdHIJAGQCCQELdmFsdWVPckVsc2UCCQC3CQIFCGJvbnVzU3RyAgEgAP///////////wEAAQEQc3Rha2VOZnRJbnRlcm5hbAYEYWRkcgphc3NldElkU3RyBmJvbnVzNgp1c2VyTnVtS2V5C3RvdGFsTnVtS2V5BWxpbWl0BAluZnROdW1iZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUKdXNlck51bUtleQAAAwkAZwIFCW5mdE51bWJlcgUFbGltaXQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiBzdGFrZSBtYXggCQCkAwEFBWxpbWl0Ag0gb2Ygc3VjaCBORlRzBA0kdDAxMDQwNzEwNDgzCQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAMAAAUEYWRkcgUGYm9udXM2BAdhY3Rpb25zCAUNJHQwMTA0MDcxMDQ4MwJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDEwNDA3MTA0ODMCXzIJAJQKAgkAzQgCCQDNCAIJAM0IAgUHYWN0aW9ucwkBDEludGVnZXJFbnRyeQIFCnVzZXJOdW1LZXkJAGQCBQluZnROdW1iZXIAAQkBDEludGVnZXJFbnRyeQIFC3RvdGFsTnVtS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQt0b3RhbE51bUtleQAAAAEJAQxJbnRlZ2VyRW50cnkCCQEea2V5U3Rha2VkVGltZUJ5QXNzZXRJZEFuZE93bmVyAgUKYXNzZXRJZFN0cgUEYWRkcggFCWxhc3RCbG9jawl0aW1lc3RhbXAFEHdsZ0NsYWltZWRBbW91bnQRAWkBCnNhdmVMYXN0VHgAAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQt3bGdDb250cmFjdAUDbmlsCAUBaQZjYWxsZXIJAAIBAg1BY2Nlc3MgZGVuaWVkCQCUCgIJAQZwcm9sb2cBBQFpACoBaQENY29uc3RydWN0b3JWMQIJcmVzdDJBZGRyDm9sZEFjckNvbnRyYWN0AwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDm9sZEFjckNvbnRBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQ5vbGRBY3JDb250cmFjdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUYWNyZXNJc3N1ZWRBbW91bnRLZXkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDm9sZEFjckNvbnRBZGRyBRRhY3Jlc0lzc3VlZEFtb3VudEtleQkAzAgCCQELQmluYXJ5RW50cnkCBQ9hY3Jlc0Fzc2V0SWRLZXkJARFAZXh0ck5hdGl2ZSgxMDUyKQIFDm9sZEFjckNvbnRBZGRyBQ9hY3Jlc0Fzc2V0SWRLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleVJlc3QyQWRkcmVzcwAFCXJlc3QyQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBRNvbGRBY3Jlc0NvbnRyYWN0S2V5BQ5vbGRBY3JDb250cmFjdAUDbmlsAWkBCnNldEJsb2NrZWQBCWlzQmxvY2tlZAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEXBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQxCb29sZWFuRW50cnkCCQEKa2V5QmxvY2tlZAAFCWlzQmxvY2tlZAUDbmlsAWkBDHVuc3Rha2VBY3JlcwEGYW1vdW50BA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAGcCAAAFBmFtb3VudAkAAgECGUFtb3VudCBzaG91bGQgYmUgcG9zaXRpdmUEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEDmFyYlJlbGVhc2VUaW1lCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQt3bGdDb250cmFjdAkBGWtleUxhc3RXbGdUcmFkZVRpbWVCeVVzZXIBBQdhZGRyZXNzAAAFDmFyYml0cmFnZURlbGF5AwkAZgIFDmFyYlJlbGVhc2VUaW1lCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAAgEJAKwCAgItWW91IHRyYWRlZCBzb21lIFdMR09MRCwgY2Fubm90IHVuc3Rha2UgdW50aWwgCQCkAwEFDmFyYlJlbGVhc2VUaW1lBA0kdDAxMjA1NzEyMTM3CQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAMJAQEtAQUGYW1vdW50BQdhZGRyZXNzAAAEB2FjdGlvbnMIBQ0kdDAxMjA1NzEyMTM3Al8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMTIwNTcxMjEzNwJfMgkAlAoCCQDOCAIJAM0IAgUHYWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQFDGFjcmVzQXNzZXRJZAUNcHJvbG9nQWN0aW9ucwUQd2xnQ2xhaW1lZEFtb3VudAFpAQpzdGFrZUFjcmVzAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQxhY3Jlc0Fzc2V0SWQJAAIBAhRBQ1JFUyBwYXltZW50cyBvbmx5IQQNJHQwMTI1ODgxMjY2NAkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwDBQNhbXQFB2FkZHJlc3MAAAQHYWN0aW9ucwgFDSR0MDEyNTg4MTI2NjQCXzEEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAxMjU4ODEyNjY0Al8yCQCUCgIJAM4IAgUHYWN0aW9ucwUNcHJvbG9nQWN0aW9ucwUQd2xnQ2xhaW1lZEFtb3VudAFpAQhidXlBY3JlcwAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAECnVzZHRBbW91bnQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkAZgIFBU1VTFQ2BQp1c2R0QW1vdW50CQACAQkArAICCQCsAgICFk1pbiBwYXltZW50IHNob3VsZCBiZSAJAQpmaXhlZFBvaW50AgUFTVVMVDYABgIFIFVTRFQEC2FjcmVzQW1vdW50CQBoAgUKdXNkdEFtb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSBAl3bGdBbW91bnQJAGsDBQp1c2R0QW1vdW50BQVNVUxUOAkBC2dldFdsZ1ByaWNlAQUKdXNkdEFtb3VudAQPb2xkQWNyZXNBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1OCkBBRNvbGRBY3Jlc0NvbnRyYWN0S2V5BANyZXEJAPwHBAUPb2xkQWNyZXNBZGRyZXNzAhRyZXF1ZXN0QWNyZXNDYWxsYmFjawkAzAgCBQthY3Jlc0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUDcmVxBQNyZXEECXdsZ1JlbWFpbgkBBWFzSW50AQkA/AcEBQt3bGdDb250cmFjdAIKYnVybldsZ29sZAkAzAgCBQl3bGdBbW91bnQFA25pbAUDbmlsCQCUCgIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2FjcmVzQW1vdW50BQxhY3Jlc0Fzc2V0SWQFA25pbAUNcHJvbG9nQWN0aW9ucwUJd2xnUmVtYWluCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGJ1eUFjcmVzUkVBRE9OTFkBCnVzZHRBbW91bnQEC2FjcmVzQW1vdW50CQBoAgUKdXNkdEFtb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSBAl3bGdUb0J1cm4JAGsDBQp1c2R0QW1vdW50BQVNVUxUOAkBC2dldFdsZ1ByaWNlAQUKdXNkdEFtb3VudAkAlAoCBQNuaWwJAMwIAgULYWNyZXNBbW91bnQJAMwIAgUFTVVMVDYJAMwIAgULYWNyZXNBbW91bnQJAMwIAgUJd2xnVG9CdXJuBQNuaWwBaQEJc2VsbEFjcmVzAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQLYWNyZXNBbW91bnQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAUMYWNyZXNBc3NldElkCQACAQIUQUNSRVMgcGF5bWVudHMgb25seSEDCQBmAgUFTVVMVDcFC2FjcmVzQW1vdW50CQACAQkArAICCQCsAgICFk1pbiBwYXltZW50IHNob3VsZCBiZSAJAQpmaXhlZFBvaW50AgUFTVVMVDcACAIGIEFDUkVTBARhZGRyCQClCAEIBQFpBmNhbGxlcgQNJHQwMTQ1MjExNDU2OQkBEWdldFN3YXBMaW1pdEFjcmVzAAQLbGltaXRBY3Rpb24IBQ0kdDAxNDUyMTE0NTY5Al8xBAdtYXhVc2R0CAUNJHQwMTQ1MjExNDU2OQJfMgQIbWF4QWNyZXMJAGgCBQdtYXhVc2R0BRVVU0RUMkFDUkVTX01VTFRJUExJRVIDCQBmAgULYWNyZXNBbW91bnQFCG1heEFjcmVzCQACAQkArAICCQCsAgICEVlvdSBjYW4gc2VsbCBtYXggCQEKZml4ZWRQb2ludAIFCG1heEFjcmVzAAgCBiBBQ1JFUwQKdXNkdEFtb3VudAkAaQIJAGkCBQthY3Jlc0Ftb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAAIJAJQKAgkAzggCCQDMCAIFC2xpbWl0QWN0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrZXlMYXN0TGltaXRMZWZ0CQBlAgUHbWF4VXNkdAUKdXNkdEFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCnVzZHRBbW91bnQFC3VzZHRBc3NldElkBQNuaWwFDXByb2xvZ0FjdGlvbnMFCnVzZHRBbW91bnQBaQERc2VsbEFjcmVzUkVBRE9OTFkCB2FkZHJlc3MLYWNyZXNBbW91bnQEDSR0MDE1MDY1MTUxMTMJARFnZXRTd2FwTGltaXRBY3JlcwAEC2xpbWl0QWN0aW9uCAUNJHQwMTUwNjUxNTExMwJfMQQHbWF4VXNkdAgFDSR0MDE1MDY1MTUxMTMCXzIECnVzZHRBbW91bnQJAGkCCQBpAgULYWNyZXNBbW91bnQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgACCQCUCgIFA25pbAkAzAgCBQp1c2R0QW1vdW50CQDMCAIFBU1VTFQ3CQDMCAIJAGgCBQdtYXhVc2R0BRVVU0RUMkFDUkVTX01VTFRJUExJRVIJAMwIAgAABQNuaWwBaQEQY29udmVydE9sZFN0YWtlcwADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhRUZW1wb3JhcmlseSBkaXNhYmxlZAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQPb2xkQWNyZXNBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1OCkBBRNvbGRBY3Jlc0NvbnRyYWN0S2V5BAZhbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPb2xkQWNyZXNBZGRyZXNzCQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQdhZGRyZXNzAAAECWdvdEFjcmVzMAMJAGYCBQZhbW91bnQAAAkBDGFzVHVwbGUySW50cwEJAPwHBAUPb2xkQWNyZXNBZGRyZXNzAhR1bnN0YWtlQWNyZXNDYWxsYmFjawkAzAgCBQZhbW91bnQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJQKAgAAAAAEEW9sZFN0YWtpbmdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRVvbGRTdGFraW5nQ29udHJhY3RTdHIECGxhbmRzU3RyCQCdCAIFEW9sZFN0YWtpbmdBZGRyZXNzCQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUHYWRkcmVzcwQLbGFuZHNSZXN1bHQDCQEJaXNEZWZpbmVkAQUIbGFuZHNTdHIEBWxhbmRzCQC9CQIJAQV2YWx1ZQEFCGxhbmRzU3RyAgFfCgEHb25lTGFuZAIDYWNjC2xhbmRBc3NldElkAwkAAAIFC2xhbmRBc3NldElkAgAJAAIBAhdsYW5kQXNzZXRJZCBpcyByZXF1aXJlZAQBcgkBDGFzVHVwbGU1SW50cwEJAPwHBAURb2xkU3Rha2luZ0FkZHJlc3MCE3Vuc3Rha2VMYW5kQ2Fs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CAUCcnICXzIIBQJycgJfMwgFAnJyAl80BQpuZnRBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCXCgUAAAAAAAAAAAUDbmlsBAtkdWNrQXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAnQgCBRFvbGRTdGFraW5nQWRkcmVzcwkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUHYWRkcmVzcwIABApkdWNrUmVzdWx0AwkBAiE9AgULZHVja0Fzc2V0SWQCAAkBDGFzVHVwbGUzSW50cwEJAPwHBAURb2xkU3Rha2luZ0FkZHJlc3MCE3Vuc3Rha2VEdWNrQ2FsbGJhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJUKAwAAAAAAAAQBeAkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwDCQBkAgkAZAIJAGQCCQBkAgkAZAIJAGQCCQBkAggFCWdvdEFjcmVzMAJfMQgFC2xhbmRzUmVzdWx0Al8xCAULbGFuZHNSZXN1bHQCXzIIBQtsYW5kc1Jlc3VsdAJfMwgFC2xhbmRzUmVzdWx0Al80CAUKZHVja1Jlc3VsdAJfMQgFCmR1Y2tSZXN1bHQCXzIIBQpkdWNrUmVzdWx0Al8zBQdhZGRyZXNzAAAJAJQKAgkAzggCCAULbGFuZHNSZXN1bHQCXzUIBQF4Al8xCAUBeAJfMgFpARR1bnN0YWtlTGFuZHNSRUFET05MWQEHYWRkcmVzcwQRb2xkU3Rha2luZ0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFFW9sZFN0YWtpbmdDb250cmFjdFN0cgQIbGFuZHNTdHIJAJ0IAgURb2xkU3Rha2luZ0FkZHJlc3MJARVrZXlTdGFrZWRMYW5kc0J5T3duZXIBBQdhZGRyZXNzBAtsYW5kc1Jlc3VsdAMJAQlpc0RlZmluZWQBBQhsYW5kc1N0cgQFbGFuZHMJAL0JAgkBBXZhbHVlAQUIbGFuZHNTdHICAV8KAQdvbmVMYW5kAgNhY2MLbGFuZEFzc2V0SWQDCQAAAgULbGFuZEFzc2V0SWQCAAkA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VXNlcgEFB2FkZHJlc3MEDm5ld0FjcmVzQW1vdW50CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlhbW91bnRLZXkAAAULYWRkZWRBbW91bnQECG9sZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFEmFjcmVzU3Rha2RUb3RhbEtleQAABAl1c2VyRnBLZXkJARVrZXlGYXJtaW5nUG93ZXJCeVVzZXIBBQdhZGRyZXNzBAVvbGRGcAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQl1c2VyRnBLZXkAAAQJdXNlckJvbnVzCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0CQEQa2V5VXNlckZ1bGxCb251cwEFB2FkZHJlc3MAAAQNJHQwMTkyMjcxOTMxNAkBHmdldEZhcm1pbmdQb3dlckJ5QWNyZXNBbmRCb251cwIFDm5ld0FjcmVzQW1vdW50BQl1c2VyQm9udXMEDG5ld0JvbnVzZWRGcAgFDSR0MDE5MjI3MTkzMTQCXzEEB2lnbm9yZWQIBQ0kdDAxOTIyNzE5MzE0Al8yBApvbGRUb3RhbEZwCQELdmFsdWVPckVsc2UCCQCfCAEFFHRvdGFsRmFybWluZ1Bvd2VyS2V5AAAECm5ld1RvdGFsRnAJAGUCCQBkAgUKb2xkVG90YWxGcAUMbmV3Qm9udXNlZEZwBQVvbGRGcAkAlAoCBQNuaWwJAMwIAgUFb2xkRnAJAMwIAgUMbmV3Qm9udXNlZEZwCQDMCAIFCm9sZFRvdGFsRnAJAMwIAgUKbmV3VG90YWxGcAUDbmlsAWkBCGlzc3VlTkZUAgpmb3JBZGRyZXNzCG5mdEluZGV4AwkBAiE9AggFAWkGY2FsbGVyBQt3bGdDb250cmFjdAkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQEQaXNzdWVORlRpbnRlcm5hbAIFCG5mdEluZGV4CQERQGV4dHJOYXRpdmUoMTA2MikBBQpmb3JBZGRyZXNzAWkBCHN0YWtlTkZUAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhxFeGFjdGx5IG9uZSBwYXltZW50IHJlcXVpcmVkBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAMJAQIhPQIIBQNwbXQGYW1vdW50AAEJAAIBAidORlQgdG9rZW4gc2hvdWxkIGJlIGF0dGFjaGVkIGFzIHBheW1lbnQEB2Fzc2V0SWQJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAQFYXNzZXQJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAQKYXNzZXRJZFN0cgkA2AQBBQdhc3NldElkBARhZGRyCQClCAEIBQFpBmNhbGxlcgQHbmZ0c0tleQkBFGtleVN0YWtlZE5GVHNCeU93bmVyAQUEYWRkcgQHbmZ0c1N0cgkAoggBBQduZnRzS2V5BARuZnRzAwkBCWlzRGVmaW5lZAEFB25mdHNTdHIJALwJAgkBBXZhbHVlAQUHbmZ0c1N0cgIBXwUDbmlsAwkBD2NvbnRhaW5zRWxlbWVudAIFBG5mdHMFCmFzc2V0SWRTdHIJAAIBCQCsAgICIVlvdXIgc3Rha2VkIE5GVHMgYWxyZWFkeSBjb250YWluIAUKYXNzZXRJZFN0cgMJAGcCCQCQAwEFBG5mdHMFF01BWF9ORlRTX1NUQUtFRF9CWV9VU0VSCQACAQkArAICCQCsAgICGVlvdXIgYWxyZWFkeSBzdGFrZWQgbWF4ICgJAKQDAQUXTUFYX05GVFNfU1RBS0VEX0JZX1VTRVICBikgTkZUcwQKbGlzdEFjdGlvbgkBC1N0cmluZ0VudHJ5AgUHbmZ0c0tleQkAugkCCQDNCAIFBG5mdHMFCmFzc2V0SWRTdHICAV8DCQAAAggFBWFzc2V0Bmlzc3VlcgUEdGhpcwQNJHQwMjA3MzEyMDkyMQkBEHN0YWtlTmZ0SW50ZXJuYWwGBQRhZGRyBQphc3NldElkU3RyCQBoAgkBEmJvbnVzQnlEZXNjcmlwdGlvbgEJAQV2YWx1ZQEIBQVhc3NldAtkZXNjcmlwdGlvbgCQTgkBEmtleVVzZXJXbE5mdE51bWJlcgEFBGFkZHIFE2tleVdsTmZ0VG90YWxTdGFrZWQFC01BWF9XTF9ORlRTBAdhY3Rpb25zCAUNJHQwMjA3MzEyMDkyMQJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDIwNzMxMjA5MjECXzIJAJQKAgkAzQgCCQDOCAIFDXByb2xvZ0FjdGlvbnMFB2FjdGlvbnMFCmxpc3RBY3Rpb24FEHdsZ0NsYWltZWRBbW91bnQDCQAAAgkBD2lzQXJraW1hbElzc3VlZAEFBWFzc2V0AgAJAAIBAjRPbmx5IFdhdmVzTGFuZHMgYW5kIEFya2ltYWxzIE5GVCB0b2tlbnMgYXJlIGFjY2VwdGVkBA0kdDAyMTEwMjIxMjUzCQEQc3Rha2VOZnRJbnRlcm5hbAYFBGFkZHIFCmFzc2V0SWRTdHIFDUFSS19ORlRfQk9OVVMJARNrZXlVc2VyQXJrTmZ0TnVtYmVyAQUEYWRkcgUUa2V5QXJrTmZ0VG90YWxTdGFrZWQFDE1BWF9BUktfTkZUUwQHYWN0aW9ucwgFDSR0MDIxMTAyMjEyNTMCXzEEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAyMTEwMjIxMjUzAl8yCQCUCgIJAM0IAgkAzggCBQ1wcm9sb2dBY3Rpb25zBQdhY3Rpb25zBQpsaXN0QWN0aW9uBRB3bGdDbGFpbWVkQW1vdW50AWkBCnVuc3Rha2VORlQBCmFzc2V0SWRTdHIEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEB2Fzc2V0SWQJANkEAQUKYXNzZXRJZFN0cgQEYWRkcgkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQEB3RpbWVLZXkJAR5rZXlTdGFrZWRUaW1lQnlBc3NldElkQW5kT3duZXICBQphc3NldElkU3RyBQRhZGRyAwkBASEBCQEJaXNEZWZpbmVkAQkAnwgBBQd0aW1lS2V5CQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAhUgaXMgbm90IHN0YWtlZCBieSB5b3UEB25mdHNLZXkJARRrZXlTdGFrZWRORlRzQnlPd25lcgEFBGFkZHIEBG5mdHMJALwJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQduZnRzS2V5AgACAV8EA2lkeAkAzwgCBQRuZnRzBQphc3NldElkU3RyAwkBASEBCQEJaXNEZWZpbmVkAQUDaWR4CQACAQkArAICAh9Zb3VyIHN0YWtlZCBORlRzIGRvbid0IGNvbnRhaW4gBQphc3NldElkU3RyBApsaXN0QWN0aW9uAwkAZgIJAJADAQUEbmZ0cwABCQELU3RyaW5nRW50cnkCBQduZnRzS2V5CQC6CQIJANEIAgUEbmZ0cwkBBXZhbHVlAQUDaWR4AgFfCQELRGVsZXRlRW50cnkBBQduZnRzS2V5BARpc1dMCQAAAggFBWFzc2V0Bmlzc3VlcgUEdGhpcwMFBGlzV0wEC3dsTmZ0TnVtYmVyCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlVc2VyV2xOZnROdW1iZXIBBQRhZGRyAAAECGJvbnVzVmFsCQBoAgkBEmJvbnVzQnlEZXNjcmlwdGlvbgEJAQV2YWx1ZQEIBQVhc3NldAtkZXNjcmlwdGlvbgCQTgQNJHQwMjI0MTgyMjQ5NwkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwDAAAFBGFkZHIJAQEtAQUIYm9udXNWYWwEB2FjdGlvbnMIBQ0kdDAyMjQxODIyNDk3Al8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMjI0MTgyMjQ5NwJfMgkAlAoCCQDOCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCBQdhY3Rpb25zBQpsaXN0QWN0aW9uCQEMSW50ZWdlckVudHJ5AgkBEmtleVVzZXJXbE5mdE51bWJlcgEFBGFkZHIJAGUCBQt3bE5mdE51bWJlcgABCQEMSW50ZWdlckVudHJ5AgUTa2V5V2xOZnRUb3RhbFN0YWtlZAkAlgMBCQDMCAIAAAkAzAgCCQBlAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRNrZXlXbE5mdFRvdGFsU3Rha2VkAAAAAQUDbmlsCQELRGVsZXRlRW50cnkBCQEea2V5U3Rha2VkVGltZUJ5QXNzZXRJZEFuZE93bmVyAgkA2AQBBQdhc3NldElkBQRhZGRyCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQUHYXNzZXRJZAUNcHJvbG9nQWN0aW9ucwUQd2xnQ2xhaW1lZEFtb3VudAQLYXJraW1hbE5hbWUJAQ9pc0Fya2ltYWxJc3N1ZWQBBQVhc3NldAMJAAACBQthcmtpbWFsTmFtZQIACQACAQI0T25seSBXYXZlc0xhbmRzIGFuZCBBcmtpbWFscyBORlQgdG9rZW5zIGFyZSBhY2NlcHRlZAQMYXJrTmZ0TnVtYmVyCQELdmFsdWVPckVsc2UCCQCfCAEJARNrZXlVc2VyQXJrTmZ0TnVtYmVyAQUEYWRkcgAABA0kdDAyMzE1NzIzMjQxCQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAMAAAUEYWRkcgkBAS0BBQ1BUktfTkZUX0JPTlVTBAdhY3Rpb25zCAUNJHQwMjMxNTcyMzI0MQJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDIzMTU3MjMyNDECXzIJAJQKAgkAzggCCQDNCAIJAM0IAgkAzQgCCQDNCAIFB2FjdGlvbnMFCmxpc3RBY3Rpb24JAQxJbnRlZ2VyRW50cnkCCQETa2V5VXNlckFya05mdE51bWJlcgEFBGFkZHIJAGUCBQxhcmtOZnROdW1iZXIAAQkBC0RlbGV0ZUVudHJ5AQkBHmtleVN0YWtlZFRpbWVCeUFzc2V0SWRBbmRPd25lcgIJANgEAQUHYXNzZXRJZAUEYWRkcgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEFB2Fzc2V0SWQFDXByb2xvZ0FjdGlvbnMFEHdsZ0NsYWltZWRBbW91bnQBaQEMZXhjaGFuZ2VORlRzAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQBmAgADCQCQAwEIBQFpCHBheW1lbnRzCQACAQInTWluIG9uZSBVU0RUIGFuZCAyIE5GVCBwYXltZW50cyBhbGxvd2VkAwkAZgIJAJADAQgFAWkIcGF5bWVudHMABgkAAgECJ01heCBvbmUgVVNEVCBhbmQgNSBORlQgcGF5bWVudHMgYWxsb3dlZAQEYWRkcgkApQgBCAUBaQZjYWxsZXIKAQVhZGRVcAIDYWNjA3BtdAQHYXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCGldBVkVTIHBheW1lbnRzIG5vdCBhbGxvd2VkAwkAAAIFB2Fzc2V0SWQFC3VzZHRBc3NldElkCQCVCgMJAGQCCAUDYWNjAl8xCAUDcG10BmFtb3VudAgFA2FjYwJfMggFA2FjYwJfMwQFYXNzZXQJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAMJAQIhPQIIBQVhc3NldAZpc3N1ZXIFBHRoaXMJAAIBAhtPbmx5IFdMLWlzc3VlZCBORlRzIGFsbG93ZWQECWJvbnVzUGVyYwkBEmJvbnVzQnlEZXNjcmlwdGlvbgEJAQV2YWx1ZQEIBQVhc3NldAtkZXNjcmlwdGlvbgkAlQoDCAUDYWNjAl8xCQBkAggFA2FjYwJfMgUJYm9udXNQZXJjCQDNCAIIBQNhY2MCXzMJAQRCdXJuAgUHYXNzZXRJZAABBA0kdDAyNDM4OTI0NDY4CgACJGwIBQFpCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDAAAAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRVcAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgQHdXNkdEZlZQgFDSR0MDI0Mzg5MjQ0NjgCXzEECnRvdGFsQm9udXMIBQ0kdDAyNDM4OTI0NDY4Al8yBAtidXJuQWN0aW9ucwgFDSR0MDI0Mzg5MjQ0NjgCXzMECG5mdEluZGV4AwkAAAIFCnRvdGFsQm9udXMAAwACAwkAAAIFCnRvdGFsQm9udXMABQADAwkAAAIFCnRvdGFsQm9udXMACgAECQACAQIrT25seSBib251c2VzIG9mIDMlLCA1JSBvciAxMCUgYXJlIHN1cHBvcnRlZAQGY2hhbmdlCQBlAgUHdXNkdEZlZQkAaAIFCnRvdGFsQm9udXMFBU1VTFQ2AwkAZgIAAAUGY2hhbmdlCQACAQkArAICCQCsAgICE1lvdSBuZWVkIHRvIGF0dGFjaCAJAKQDAQUKdG90YWxCb251cwIMIFVTRFQgYXMgZmVlBA1jaGFuZ2VBY3Rpb25zAwkAZgIFBmNoYW5nZQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGY2hhbmdlBQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwEDSR0MDI0OTI1MjQ5OTcJARBpc3N1ZU5GVGludGVybmFsAgUIbmZ0SW5kZXgIBQFpBmNhbGxlcgQPaXNzdWVOZnRBY3Rpb25zCAUNJHQwMjQ5MjUyNDk5NwJfMQQKbmZ0QXNzZXRJZAgFDSR0MDI0OTI1MjQ5OTcCXzIEBmJ1cm5lZAkAkAMBBQtidXJuQWN0aW9ucwQSYnVybkNvdW50ZXJBY3Rpb25zAwkAAAIFBmJ1cm5lZAAABQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtleU5mdFRvdGFsQnVybmVkCQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRFrZXlOZnRUb3RhbEJ1cm5lZAAABQZidXJuZWQFA25pbAkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIFD2lzc3VlTmZ0QWN0aW9ucwULYnVybkFjdGlvbnMFEmJ1cm5Db3VudGVyQWN0aW9ucwUNcHJvbG9nQWN0aW9ucwUNY2hhbmdlQWN0aW9ucwUKbmZ0QXNzZXRJZADAiP8T", "height": 3390590, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3eBv7G3dZH3x5CCrig5BdUvVBSBWAX6YLpDWb1H9tHEf Next: A8VGKJakrnEL9esjq6YUKBHKw6ojsKmQD8wDjW83XPtL Diff:
OldNewDifferences
207207
208208 let keyWlNftTotalStaked = "WlNftTotalStaked"
209209
210+let keyArkNftTotalStaked = "ArkNftTotalStaked"
211+
210212 func keyNftNumberByAssetId (assetId) = ("nftNumberByAssetId_" + assetId)
211213
212214
258260
259261 let keyLastLimitLeft = "lastLimitLeft"
260262
261-let nftDescriptions = [", \"collection\": \"Digging tools\", \"name\": \"Gold shovel\", \"description\": \"Reward for early birds\", \"rare\": \"Promo\", \"bonus\": 3, \"bonusType\": \"FarmPower\"}", ", \"collection\": \"Digging tools\", \"name\": \"Pickaxe\", \"description\": \"Increases FarmPower\", \"rare\": \"Common\", \"bonus\": 1, \"bonusType\": \"FarmPower\"}", ", \"collection\": \"Digging tools\", \"name\": \"Pickaxe\", \"description\": \"Increases FarmPower\", \"rare\": \"Common\", \"bonus\": 3, \"bonusType\": \"FarmPower\"}", ", \"collection\": \"Digging tools\", \"name\": \"Pickaxe\", \"description\": \"Increases FarmPower\", \"rare\": \"Common\", \"bonus\": 5, \"bonusType\": \"FarmPower\"}", ", \"collection\": \"Digging tools\", \"name\": \"Pickaxe\", \"description\": \"Increases FarmPower\", \"rare\": \"Common\", \"bonus\": 10, \"bonusType\": \"FarmPower\"}"]
262-
263263 let nftNames = ["SHOVEL-P3", "PICKAXE-C1", "PICKAXE-C3", "PICKAXE-C5", "PICKAXE-C10"]
264264
265265 let contentKeys = ["contentShovelP3", "contentPickaxeC1", "contentPickaxeC3", "contentPickaxeC5", "contentPickaxeC10"]
266266
267-let URL = "\"url\": \"https://waveslands.com\", "
267+let names = ["Gold shovel", "Pickaxe", "Pickaxe", "Pickaxe", "Pickaxe"]
268+
269+let descriptions = ["Reward for early birds", "Increases FarmPower", "Increases FarmPower", "Increases FarmPower", "Increases FarmPower"]
270+
271+let rarities = ["Promo", "Common", "Common", "Common", "Common"]
272+
273+let bonuses = [3, 1, 3, 5, 10]
268274
269275 func prolog (i) = if (if ((i.originCaller != rest2Contract))
270276 then valueOrElse(getBoolean(keyBlocked()), false)
295301 }
296302
297303
304+func createNftDescription (nftIndex,nftSerial) = ((((((((((((((((((((("{\"url\": \"https://waveslands.com\", " + "\"contentKey\": \"") + contentKeys[nftIndex]) + "\", ") + "\"number\": ") + nftSerial) + ", ") + "\"collection\": \"Digging tools") + "\", ") + "\"name\": \"") + names[nftIndex]) + "\", ") + "\"description\": \"") + descriptions[nftIndex]) + "\", ") + "\"rare\": \"") + rarities[nftIndex]) + "\", ") + "\"bonus\": ") + toString(bonuses[nftIndex])) + ", ") + "\"bonusType\": \"FarmPower\"}")
305+
306+
298307 func issueNFTinternal (nftIndex,addr) = if ((nftIndex >= size(contentKeys)))
299308 then throw("nftIndex out of bounds")
300309 else {
301310 let nftSerial = (valueOrElse(getInteger(keyNftTotalIssued), -1) + 1)
302- let issue = Issue(nftNames[nftIndex], (((((("{" + URL) + "\"contentKey\": \"") + contentKeys[nftIndex]) + "\", \"number\": ") + toString(nftSerial)) + nftDescriptions[nftIndex]), 1, 0, false)
311+ let issue = Issue(nftNames[nftIndex], createNftDescription(nftIndex, toString(nftSerial)), 1, 0, false)
303312 let nftAssetId = calculateAssetId(issue)
304- $Tuple2([issue, IntegerEntry(keyNftTotalIssued, nftSerial), IntegerEntry(keyNftNumberByAssetId(toBase58String(nftAssetId)), nftSerial), ScriptTransfer(addr, 1, nftAssetId)], nftAssetId)
313+ $Tuple2([issue, IntegerEntry(keyNftTotalIssued, (nftSerial + 1)), IntegerEntry(keyNftNumberByAssetId(toBase58String(nftAssetId)), nftSerial), ScriptTransfer(addr, 1, nftAssetId)], nftAssetId)
305314 }
306315
307316
333342 else false)
334343 then throw((((("You have only " + fixedPoint(oldBonus, 4)) + "% bonus, and tried to unstake ") + fixedPoint(-(bonusDelta), 4)) + "%"))
335344 else {
336- let $t059586057 = getFarmingPowerByAcresAndBonus(newAcresAmount, (oldBonus + bonusDelta))
337- let newBonusedFp = $t059586057._1
338- let ignored = $t059586057._2
345+ let $t057945893 = getFarmingPowerByAcresAndBonus(newAcresAmount, (oldBonus + bonusDelta))
346+ let newBonusedFp = $t057945893._1
347+ let ignored = $t057945893._2
339348 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
340349 let acresActions = if ((amt == 0))
341350 then nil
394403
395404 func isArkimalIssued (nfo) = {
396405 let issuer = toString(nfo.issuer)
397- if (if (if (if (if (if (if (if ((issuer == incubator))
406+ if (if (if (if (if (if (if (if (if (if ((chain == base58'2T'))
407+ then (issuer == oldStakingContractStr)
408+ else false)
409+ then true
410+ else (issuer == incubator))
398411 then true
399412 else (issuer == breeder))
400413 then true
422435 let bonusStr = split_4C(split_4C(descr, "\"bonus\":")[1], ",")[0]
423436 parseIntValue(drop(bonusStr, (valueOrElse(lastIndexOf(bonusStr, " "), -1) + 1)))
424437 }
438+
439+
440+func stakeNftInternal (addr,assetIdStr,bonus6,userNumKey,totalNumKey,limit) = {
441+ let nftNumber = valueOrElse(getInteger(userNumKey), 0)
442+ if ((nftNumber >= limit))
443+ then throw((("You can stake max " + toString(limit)) + " of such NFTs"))
444+ else {
445+ let $t01040710483 = stakeUnstakeAcresInternal(0, addr, bonus6)
446+ let actions = $t01040710483._1
447+ let wlgClaimedAmount = $t01040710483._2
448+ $Tuple2((((actions :+ IntegerEntry(userNumKey, (nftNumber + 1))) :+ IntegerEntry(totalNumKey, (valueOrElse(getInteger(totalNumKey), 0) + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)), wlgClaimedAmount)
449+ }
450+ }
425451
426452
427453 @Callable(i)
462488 if ((arbReleaseTime > lastBlock.timestamp))
463489 then throw(("You traded some WLGOLD, cannot unstake until " + toString(arbReleaseTime)))
464490 else {
465- let $t01155211632 = stakeUnstakeAcresInternal(-(amount), address, 0)
466- let actions = $t01155211632._1
467- let wlgClaimedAmount = $t01155211632._2
491+ let $t01205712137 = stakeUnstakeAcresInternal(-(amount), address, 0)
492+ let actions = $t01205712137._1
493+ let wlgClaimedAmount = $t01205712137._2
468494 $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
469495 }
470496 }
487513 else (value(pmt.assetId) != acresAssetId))
488514 then throw("ACRES payments only!")
489515 else {
490- let $t01208312159 = stakeUnstakeAcresInternal(amt, address, 0)
491- let actions = $t01208312159._1
492- let wlgClaimedAmount = $t01208312159._2
516+ let $t01258812664 = stakeUnstakeAcresInternal(amt, address, 0)
517+ let actions = $t01258812664._1
518+ let wlgClaimedAmount = $t01258812664._2
493519 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
494520 }
495521 }
553579 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
554580 else {
555581 let addr = toString(i.caller)
556- let $t01401614064 = getSwapLimitAcres()
557- let limitAction = $t01401614064._1
558- let maxUsdt = $t01401614064._2
582+ let $t01452114569 = getSwapLimitAcres()
583+ let limitAction = $t01452114569._1
584+ let maxUsdt = $t01452114569._2
559585 let maxAcres = (maxUsdt * USDT2ACRES_MULTIPLIER)
560586 if ((acresAmount > maxAcres))
561587 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
571597
572598 @Callable(i)
573599 func sellAcresREADONLY (address,acresAmount) = {
574- let $t01456014608 = getSwapLimitAcres()
575- let limitAction = $t01456014608._1
576- let maxUsdt = $t01456014608._2
600+ let $t01506515113 = getSwapLimitAcres()
601+ let limitAction = $t01506515113._1
602+ let maxUsdt = $t01506515113._2
577603 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
578604 $Tuple2(nil, [usdtAmount, MULT7, (maxUsdt * USDT2ACRES_MULTIPLIER), 0])
579605 }
625651 let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
626652 if ((req == req))
627653 then {
628- let $t01648016560 = issueNFTinternal(IdxDtx3PercConversion, i.caller)
629- let nftActions = $t01648016560._1
630- let nftAssetId = $t01648016560._2
654+ let $t01698217062 = issueNFTinternal(IdxDtx3PercConversion, i.caller)
655+ let nftActions = $t01698217062._1
656+ let nftAssetId = $t01698217062._2
631657 $Tuple5(rr._1, rr._2, rr._3, rr._4, nftActions)
632658 }
633659 else throw("Strict value is not equal to itself.")
694720 let userFpKey = keyFarmingPowerByUser(address)
695721 let oldFp = valueOrElse(getInteger(userFpKey), 0)
696722 let userBonus = valueOrElse(getInteger(acres2Contract, keyUserFullBonus(address)), 0)
697- let $t01872518812 = getFarmingPowerByAcresAndBonus(newAcresAmount, userBonus)
698- let newBonusedFp = $t01872518812._1
699- let ignored = $t01872518812._2
723+ let $t01922719314 = getFarmingPowerByAcresAndBonus(newAcresAmount, userBonus)
724+ let newBonusedFp = $t01922719314._1
725+ let ignored = $t01922719314._2
700726 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
701727 let newTotalFp = ((oldTotalFp + newBonusedFp) - oldFp)
702728 $Tuple2(nil, [oldFp, newBonusedFp, oldTotalFp, newTotalFp])
736762 then throw((("Your already staked max (" + toString(MAX_NFTS_STAKED_BY_USER)) + ") NFTs"))
737763 else {
738764 let listAction = StringEntry(nftsKey, makeString_2C((nfts :+ assetIdStr), "_"))
739- let isWL = (asset.issuer == this)
740- if (isWL)
765+ if ((asset.issuer == this))
741766 then {
742- let wlNftNumber = valueOrElse(getInteger(keyUserWlNftNumber(addr)), 0)
743- if ((wlNftNumber >= MAX_WL_NFTS))
744- then throw((("You can stake max " + toString(MAX_WL_NFTS)) + " of WavesLands NFTs"))
745- else {
746- let bonusVal = (bonusByDescription(value(asset.description)) * 10000)
747- let $t02058720665 = stakeUnstakeAcresInternal(0, addr, bonusVal)
748- let actions = $t02058720665._1
749- let wlgClaimedAmount = $t02058720665._2
750- $Tuple2((((((actions :+ listAction) :+ IntegerEntry(keyUserWlNftNumber(addr), (wlNftNumber + 1))) :+ IntegerEntry(keyWlNftTotalStaked, (valueOrElse(getInteger(keyWlNftTotalStaked), 0) + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)) ++ prologActions), wlgClaimedAmount)
751- }
767+ let $t02073120921 = stakeNftInternal(addr, assetIdStr, (bonusByDescription(value(asset.description)) * 10000), keyUserWlNftNumber(addr), keyWlNftTotalStaked, MAX_WL_NFTS)
768+ let actions = $t02073120921._1
769+ let wlgClaimedAmount = $t02073120921._2
770+ $Tuple2(((prologActions ++ actions) :+ listAction), wlgClaimedAmount)
752771 }
753- else {
754- let arkimalName = isArkimalIssued(asset)
755- if ((arkimalName == ""))
756- then throw("Only WavesLands and Arkimals NFT tokens are accepted")
757- else {
758- let arkNftNumber = valueOrElse(getInteger(keyUserArkNftNumber(addr)), 0)
759- if ((arkNftNumber >= MAX_ARK_NFTS))
760- then throw((("You can stake max " + toString(MAX_ARK_NFTS)) + " of Arkimals NFTs"))
761- else {
762- let $t02140021483 = stakeUnstakeAcresInternal(0, addr, ARK_NFT_BONUS)
763- let actions = $t02140021483._1
764- let wlgClaimedAmount = $t02140021483._2
765- $Tuple2(((((actions :+ listAction) :+ IntegerEntry(keyUserArkNftNumber(addr), (arkNftNumber + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)) ++ prologActions), wlgClaimedAmount)
766- }
767- }
768- }
772+ else if ((isArkimalIssued(asset) == ""))
773+ then throw("Only WavesLands and Arkimals NFT tokens are accepted")
774+ else {
775+ let $t02110221253 = stakeNftInternal(addr, assetIdStr, ARK_NFT_BONUS, keyUserArkNftNumber(addr), keyArkNftTotalStaked, MAX_ARK_NFTS)
776+ let actions = $t02110221253._1
777+ let wlgClaimedAmount = $t02110221253._2
778+ $Tuple2(((prologActions ++ actions) :+ listAction), wlgClaimedAmount)
779+ }
769780 }
770781 }
771782 }
800811 then {
801812 let wlNftNumber = valueOrElse(getInteger(keyUserWlNftNumber(addr)), 0)
802813 let bonusVal = (bonusByDescription(value(asset.description)) * 10000)
803- let $t02280422883 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
804- let actions = $t02280422883._1
805- let wlgClaimedAmount = $t02280422883._2
814+ let $t02241822497 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
815+ let actions = $t02241822497._1
816+ let wlgClaimedAmount = $t02241822497._2
806817 $Tuple2(((((((actions :+ listAction) :+ IntegerEntry(keyUserWlNftNumber(addr), (wlNftNumber - 1))) :+ IntegerEntry(keyWlNftTotalStaked, max([0, (valueOrElse(getInteger(keyWlNftTotalStaked), 0) - 1)]))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
807818 }
808819 else {
811822 then throw("Only WavesLands and Arkimals NFT tokens are accepted")
812823 else {
813824 let arkNftNumber = valueOrElse(getInteger(keyUserArkNftNumber(addr)), 0)
814- let $t02354323627 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
815- let actions = $t02354323627._1
816- let wlgClaimedAmount = $t02354323627._2
825+ let $t02315723241 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
826+ let actions = $t02315723241._1
827+ let wlgClaimedAmount = $t02315723241._2
817828 $Tuple2((((((actions :+ listAction) :+ IntegerEntry(keyUserArkNftNumber(addr), (arkNftNumber - 1))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
818829 }
819830 }
848859 }
849860 }
850861
851- let $t02477524854 = {
862+ let $t02438924468 = {
852863 let $l = i.payments
853864 let $s = size($l)
854865 let $acc0 = $Tuple3(0, 0, nil)
862873
863874 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
864875 }
865- let usdtFee = $t02477524854._1
866- let totalBonus = $t02477524854._2
867- let burnActions = $t02477524854._3
876+ let usdtFee = $t02438924468._1
877+ let totalBonus = $t02438924468._2
878+ let burnActions = $t02438924468._3
868879 let nftIndex = if ((totalBonus == 3))
869880 then 2
870881 else if ((totalBonus == 5))
879890 let changeActions = if ((change > 0))
880891 then [ScriptTransfer(i.caller, change, usdtAssetId)]
881892 else nil
882- let $t02531125383 = issueNFTinternal(nftIndex, i.caller)
883- let issueNftActions = $t02531125383._1
884- let nftAssetId = $t02531125383._2
893+ let $t02492524997 = issueNFTinternal(nftIndex, i.caller)
894+ let issueNftActions = $t02492524997._1
895+ let nftAssetId = $t02492524997._2
885896 let burned = size(burnActions)
886897 let burnCounterActions = if ((burned == 0))
887898 then nil
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let MULT6 = 1000000
77
88 let MULT7 = 10000000
99
1010 let MULT8 = 100000000
1111
1212 let DAY_MILLIS = 86400000
1313
1414 let USDT2ACRES_MULTIPLIER = 10
1515
1616 let ONE_PERCENT_DIVISOR = 100
1717
1818 let chain = take(drop(this.bytes, 1), 1)
1919
2020 let WEEK_BLOCKS = match chain {
2121 case _ =>
2222 if ((base58'2W' == $match0))
2323 then 10080
2424 else if ((base58'2T' == $match0))
2525 then 180
2626 else throw("Unknown chain")
2727 }
2828
2929 let usdtAssetId = match chain {
3030 case _ =>
3131 if ((base58'2W' == $match0))
3232 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
3333 else if ((base58'2T' == $match0))
3434 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
3535 else throw("Unknown chain")
3636 }
3737
3838 let defaultRest2AddressStr = match chain {
3939 case _ =>
4040 if ((base58'2W' == $match0))
4141 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
4242 else if ((base58'2T' == $match0))
4343 then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
4444 else throw("Unknown chain")
4545 }
4646
4747 let arbitrageDelay = match chain {
4848 case _ =>
4949 if ((base58'2W' == $match0))
5050 then DAY_MILLIS
5151 else if ((base58'2T' == $match0))
5252 then 60000
5353 else throw("Unknown chain")
5454 }
5555
5656 let oldStakingContractStr = match chain {
5757 case _ =>
5858 if ((base58'2W' == $match0))
5959 then "3PLncXtS1U83D6cQbFD3H8rBHPLgzxSFKZ1"
6060 else if ((base58'2T' == $match0))
6161 then "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm"
6262 else throw("Unknown chain")
6363 }
6464
6565 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
6666
6767
6868 let IdxCfgAcres2Dapp = 1
6969
7070 let IdxCfgWlgDapp = 2
7171
7272 let IdxCfgInvestFundDapp = 5
7373
7474 func keyRestCfg () = "%s__restConfig"
7575
7676
7777 func keyRest2Address () = "%s__rest2Addr"
7878
7979
8080 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
8181
8282
8383 func getContractAddressOrFail (rest2Cfg,idx) = valueOrErrorMessage(addressFromString(rest2Cfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
8484
8585
8686 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
8787
8888 let rest2Cfg = readRestCfgOrFail(rest2Contract)
8989
9090 let acres2Contract = getContractAddressOrFail(rest2Cfg, IdxCfgAcres2Dapp)
9191
9292 let wlgContract = getContractAddressOrFail(rest2Cfg, IdxCfgWlgDapp)
9393
9494 let investFundContract = getContractAddressOrFail(rest2Cfg, IdxCfgInvestFundDapp)
9595
9696 let oldAcresContractKey = "oldAcresContract"
9797
9898 func keyBlocked () = "contractsBlocked"
9999
100100
101101 func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
102102
103103
104104 func keyCurWeekTxIdByUser (addr) = ("curWeekTxIdByUser_" + addr)
105105
106106
107107 let acresIssuedAmountKey = "acresIssuedAmount"
108108
109109 let acresAssetIdKey = "acresAssetId"
110110
111111 let acresAssetId = valueOrErrorMessage(getBinary(acres2Contract, acresAssetIdKey), "ACRES is not issued yet")
112112
113113 func keyAcresStakedTimeByUser (addr) = ("acresStakedTimeByUser_" + addr)
114114
115115
116116 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
117117
118118
119119 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
120120
121121
122122 func keyStakedTimeByAssetIdAndOwner (assetId,addr) = ((("st_" + assetId) + "_") + addr)
123123
124124
125125 func keyStakedNFTsByOwner (ownerAddr) = ("stakedNFTsByOwner_" + ownerAddr)
126126
127127
128128 func asInt (v) = match v {
129129 case n: Int =>
130130 n
131131 case _ =>
132132 throw("fail to cast into Int")
133133 }
134134
135135
136136 func asTuple5Ints (val) = match val {
137137 case t: (Int, Int, Int, Int, Int) =>
138138 t
139139 case _ =>
140140 throw("fail to cast into (Int, Int, Int, Int, Int)")
141141 }
142142
143143
144144 func asTuple4Ints (val) = match val {
145145 case t: (Int, Int, Int, Int) =>
146146 t
147147 case _ =>
148148 throw("fail to cast into (Int, Int, Int, Int)")
149149 }
150150
151151
152152 func asTuple3Ints (val) = match val {
153153 case t: (Int, Int, Int) =>
154154 t
155155 case _ =>
156156 throw("fail to cast into (Int, Int, Int)")
157157 }
158158
159159
160160 func asTuple2Ints (val) = match val {
161161 case t: (Int, Int) =>
162162 t
163163 case _ =>
164164 throw("fail to cast into (Int, Int)")
165165 }
166166
167167
168168 func fixedPoint (val,decimals) = {
169169 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
170170 let lowPart = toString((val % tenPow))
171171 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
172172 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
173173 }
174174
175175
176176 let M6_ = 1000000
177177
178178 let M8_ = 100000000
179179
180180 let wlgIssuedAmtKey = "wlg_issuedAmount"
181181
182182 let zbIssuedAmtKey = "zbill_issuedAmount"
183183
184184 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
185185
186186
187187 func keyFarmingPowerByUser (addr) = ("farmingPowerByUser_" + addr)
188188
189189
190190 let acresStakdTotalKey = "acresStakedAmountTotal"
191191
192192 let totalFarmingPowerKey = "totalFarmingPower"
193193
194194 let IdxDtx3PercConversion = 0
195195
196196 let MAX_WL_NFTS = 3
197197
198198 let MAX_ARK_NFTS = 1
199199
200200 let ARK_NFT_BONUS = 5000
201201
202202 let MAX_NFTS_STAKED_BY_USER = 4
203203
204204 let keyNftTotalIssued = "nftTotalIssued"
205205
206206 let keyNftTotalBurned = "nftTotalBurned"
207207
208208 let keyWlNftTotalStaked = "WlNftTotalStaked"
209209
210+let keyArkNftTotalStaked = "ArkNftTotalStaked"
211+
210212 func keyNftNumberByAssetId (assetId) = ("nftNumberByAssetId_" + assetId)
211213
212214
213215 func keyUserWlNftNumber (addr) = ("userWlNftNumber_" + addr)
214216
215217
216218 func keyUserArkNftNumber (addr) = ("userArkNftNumber_" + addr)
217219
218220
219221 func keyUserFullBonus (addr) = ("userFullBonus_" + addr)
220222
221223
222224 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
223225
224226 func getLevelByAcres (acres) = {
225227 let acr = ((acres + 99999999) / M8_)
226228 func checker (acc,item) = if ((item >= acr))
227229 then acc
228230 else (acc + 1)
229231
230232 let $l = levelAcres
231233 let $s = size($l)
232234 let $acc0 = 0
233235 func $f0_1 ($a,$i) = if (($i >= $s))
234236 then $a
235237 else checker($a, $l[$i])
236238
237239 func $f0_2 ($a,$i) = if (($i >= $s))
238240 then $a
239241 else throw("List size exceeds 10")
240242
241243 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
242244 }
243245
244246
245247 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
246248
247249
248250 func getFarmingPowerByAcresAndBonus (acres,bonus6) = {
249251 let notBonused = getFarmingPowerByAcres(acres)
250252 $Tuple2(fraction(notBonused, (M6_ + bonus6), M6_), notBonused)
251253 }
252254
253255
254256 func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
255257
256258
257259 let keyLastAcresSellTime = "lastAcresSellTime"
258260
259261 let keyLastLimitLeft = "lastLimitLeft"
260262
261-let nftDescriptions = [", \"collection\": \"Digging tools\", \"name\": \"Gold shovel\", \"description\": \"Reward for early birds\", \"rare\": \"Promo\", \"bonus\": 3, \"bonusType\": \"FarmPower\"}", ", \"collection\": \"Digging tools\", \"name\": \"Pickaxe\", \"description\": \"Increases FarmPower\", \"rare\": \"Common\", \"bonus\": 1, \"bonusType\": \"FarmPower\"}", ", \"collection\": \"Digging tools\", \"name\": \"Pickaxe\", \"description\": \"Increases FarmPower\", \"rare\": \"Common\", \"bonus\": 3, \"bonusType\": \"FarmPower\"}", ", \"collection\": \"Digging tools\", \"name\": \"Pickaxe\", \"description\": \"Increases FarmPower\", \"rare\": \"Common\", \"bonus\": 5, \"bonusType\": \"FarmPower\"}", ", \"collection\": \"Digging tools\", \"name\": \"Pickaxe\", \"description\": \"Increases FarmPower\", \"rare\": \"Common\", \"bonus\": 10, \"bonusType\": \"FarmPower\"}"]
262-
263263 let nftNames = ["SHOVEL-P3", "PICKAXE-C1", "PICKAXE-C3", "PICKAXE-C5", "PICKAXE-C10"]
264264
265265 let contentKeys = ["contentShovelP3", "contentPickaxeC1", "contentPickaxeC3", "contentPickaxeC5", "contentPickaxeC10"]
266266
267-let URL = "\"url\": \"https://waveslands.com\", "
267+let names = ["Gold shovel", "Pickaxe", "Pickaxe", "Pickaxe", "Pickaxe"]
268+
269+let descriptions = ["Reward for early birds", "Increases FarmPower", "Increases FarmPower", "Increases FarmPower", "Increases FarmPower"]
270+
271+let rarities = ["Promo", "Common", "Common", "Common", "Common"]
272+
273+let bonuses = [3, 1, 3, 5, 10]
268274
269275 func prolog (i) = if (if ((i.originCaller != rest2Contract))
270276 then valueOrElse(getBoolean(keyBlocked()), false)
271277 else false)
272278 then throw("Contracts are under maintenance")
273279 else {
274280 let addr = toString(i.originCaller)
275281 let week = (height / WEEK_BLOCKS)
276282 let lastWeekTxIdByUser = getString(keyLastWeekTxIdByUser(addr))
277283 let txId = toBase58String(i.transactionId)
278284 let wtx = ((toString(week) + "_") + txId)
279285 if (isDefined(lastWeekTxIdByUser))
280286 then {
281287 let lastWeekTx = split(value(lastWeekTxIdByUser), "_")
282288 if ((lastWeekTx[0] == toString(week)))
283289 then [StringEntry(keyLastWeekTxIdByUser(addr), wtx), StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
284290 else if ((lastWeekTx[0] == toString((week - 1))))
285291 then [StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
286292 else {
287293 let curWeekTxIdByUser = getStringValue(keyLastWeekTxIdByUser(addr))
288294 let curWeekTx = split(curWeekTxIdByUser, "_")
289295 if ((curWeekTx[0] == toString(week)))
290296 then [StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
291297 else [StringEntry(keyLastWeekTxIdByUser(addr), curWeekTxIdByUser), StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
292298 }
293299 }
294300 else [StringEntry(keyLastWeekTxIdByUser(addr), wtx), StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
295301 }
296302
297303
304+func createNftDescription (nftIndex,nftSerial) = ((((((((((((((((((((("{\"url\": \"https://waveslands.com\", " + "\"contentKey\": \"") + contentKeys[nftIndex]) + "\", ") + "\"number\": ") + nftSerial) + ", ") + "\"collection\": \"Digging tools") + "\", ") + "\"name\": \"") + names[nftIndex]) + "\", ") + "\"description\": \"") + descriptions[nftIndex]) + "\", ") + "\"rare\": \"") + rarities[nftIndex]) + "\", ") + "\"bonus\": ") + toString(bonuses[nftIndex])) + ", ") + "\"bonusType\": \"FarmPower\"}")
305+
306+
298307 func issueNFTinternal (nftIndex,addr) = if ((nftIndex >= size(contentKeys)))
299308 then throw("nftIndex out of bounds")
300309 else {
301310 let nftSerial = (valueOrElse(getInteger(keyNftTotalIssued), -1) + 1)
302- let issue = Issue(nftNames[nftIndex], (((((("{" + URL) + "\"contentKey\": \"") + contentKeys[nftIndex]) + "\", \"number\": ") + toString(nftSerial)) + nftDescriptions[nftIndex]), 1, 0, false)
311+ let issue = Issue(nftNames[nftIndex], createNftDescription(nftIndex, toString(nftSerial)), 1, 0, false)
303312 let nftAssetId = calculateAssetId(issue)
304- $Tuple2([issue, IntegerEntry(keyNftTotalIssued, nftSerial), IntegerEntry(keyNftNumberByAssetId(toBase58String(nftAssetId)), nftSerial), ScriptTransfer(addr, 1, nftAssetId)], nftAssetId)
313+ $Tuple2([issue, IntegerEntry(keyNftTotalIssued, (nftSerial + 1)), IntegerEntry(keyNftNumberByAssetId(toBase58String(nftAssetId)), nftSerial), ScriptTransfer(addr, 1, nftAssetId)], nftAssetId)
305314 }
306315
307316
308317 func stakeUnstakeAcresInternal (amt,address,bonusDelta) = if (if ((amt == 0))
309318 then (bonusDelta == 0)
310319 else false)
311320 then throw("Nothing to do")
312321 else {
313322 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
314323 if ((wlgResult == wlgResult))
315324 then {
316325 let now = lastBlock.timestamp
317326 let timeKey = keyAcresStakedTimeByUser(address)
318327 let amountKey = keyAcresStakedAmtByUser(address)
319328 let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
320329 if (if ((0 > amt))
321330 then (0 > (oldAcresAmount + amt))
322331 else false)
323332 then throw(((("You have only " + fixedPoint(oldAcresAmount, 8)) + " ACRES staked, tried to unstake ") + fixedPoint(-(amt), 8)))
324333 else {
325334 let newAcresAmount = (oldAcresAmount + amt)
326335 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
327336 let userFpKey = keyFarmingPowerByUser(address)
328337 let oldFp = valueOrElse(getInteger(userFpKey), 0)
329338 let bonusKey = keyUserFullBonus(address)
330339 let oldBonus = valueOrElse(getInteger(acres2Contract, bonusKey), 0)
331340 if (if ((0 > bonusDelta))
332341 then (0 > (oldBonus + bonusDelta))
333342 else false)
334343 then throw((((("You have only " + fixedPoint(oldBonus, 4)) + "% bonus, and tried to unstake ") + fixedPoint(-(bonusDelta), 4)) + "%"))
335344 else {
336- let $t059586057 = getFarmingPowerByAcresAndBonus(newAcresAmount, (oldBonus + bonusDelta))
337- let newBonusedFp = $t059586057._1
338- let ignored = $t059586057._2
345+ let $t057945893 = getFarmingPowerByAcresAndBonus(newAcresAmount, (oldBonus + bonusDelta))
346+ let newBonusedFp = $t057945893._1
347+ let ignored = $t057945893._2
339348 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
340349 let acresActions = if ((amt == 0))
341350 then nil
342351 else [IntegerEntry(amountKey, newAcresAmount), IntegerEntry(acresStakdTotalKey, (oldTotal + amt))]
343352 $Tuple2(((((acresActions :+ IntegerEntry(timeKey, lastBlock.timestamp)) :+ IntegerEntry(userFpKey, newBonusedFp)) :+ IntegerEntry(totalFarmingPowerKey, ((oldTotalFp + newBonusedFp) - oldFp))) :+ IntegerEntry(bonusKey, (oldBonus + bonusDelta))), wlgResult)
344353 }
345354 }
346355 }
347356 else throw("Strict value is not equal to itself.")
348357 }
349358
350359
351360 func getWlgPrice (usdtBalanceCorrection) = {
352361 let issuedAmount = valueOrErrorMessage(getInteger(wlgContract, wlgIssuedAmtKey), "WLGOLD is not issued yet")
353362 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
354363 let acres2Usd = (assetBalance(acres2Contract, usdtAssetId) - usdtBalanceCorrection)
355364 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
356365 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
357366 fraction(totalFundsUsd, MULT8, issuedAmount)
358367 }
359368
360369
361370 func getSwapLimitAcres () = {
362371 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
363372 let acres2Usd = assetBalance(this, usdtAssetId)
364373 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
365374 let defaultLimit = (((acres2Usd + wlgUsd) + investFundTotal) / ONE_PERCENT_DIVISOR)
366375 let lastLimitLeft = valueOrElse(getInteger(keyLastLimitLeft), defaultLimit)
367376 let lastTime = valueOrElse(getInteger(keyLastAcresSellTime), 0)
368377 let now = lastBlock.timestamp
369378 let currentLimit = (lastLimitLeft + fraction(defaultLimit, (now - lastTime), DAY_MILLIS))
370379 let limitLeftUsdt = min([currentLimit, defaultLimit])
371380 $Tuple2(IntegerEntry(keyLastAcresSellTime, now), limitLeftUsdt)
372381 }
373382
374383
375384 let arkOracle = addressFromStringValue("3PJgZ6AK1WVCpdCmEZpesHmaKvrQDdXG5og")
376385
377386 let incubator = valueOrElse(getString(arkOracle, "static_incubatorAddress"), "")
378387
379388 let breeder = valueOrElse(getString(arkOracle, "static_breederAddress"), "")
380389
381390 let turtleIncubator = valueOrElse(getString(arkOracle, "static_turtleIncubatorAddress"), "")
382391
383392 let turtleBreeder = valueOrElse(getString(arkOracle, "static_turtleBreederAddress"), "")
384393
385394 let canineIncubator = valueOrElse(getString(arkOracle, "static_canineIncubatorAddress"), "")
386395
387396 let canineBreeder = valueOrElse(getString(arkOracle, "static_canineBreederAddress"), "")
388397
389398 let felineIncubator = valueOrElse(getString(arkOracle, "static_felineIncubatorAddress"), "")
390399
391400 let felineBreeder = valueOrElse(getString(arkOracle, "static_felineBreederAddress"), "")
392401
393402 let mutantBreeder = valueOrElse(getString(arkOracle, "static_mutantIncubatorAddress"), "")
394403
395404 func isArkimalIssued (nfo) = {
396405 let issuer = toString(nfo.issuer)
397- if (if (if (if (if (if (if (if ((issuer == incubator))
406+ if (if (if (if (if (if (if (if (if (if ((chain == base58'2T'))
407+ then (issuer == oldStakingContractStr)
408+ else false)
409+ then true
410+ else (issuer == incubator))
398411 then true
399412 else (issuer == breeder))
400413 then true
401414 else (issuer == turtleIncubator))
402415 then true
403416 else (issuer == turtleBreeder))
404417 then true
405418 else (issuer == canineIncubator))
406419 then true
407420 else (issuer == canineBreeder))
408421 then true
409422 else (issuer == felineIncubator))
410423 then true
411424 else (issuer == felineBreeder))
412425 then nfo.name
413426 else if ((issuer == mutantBreeder))
414427 then nfo.description
415428 else ""
416429 }
417430
418431
419432 func bonusByDescription (descr) = if (!(contains(descr, "\"bonusType\": \"FarmPower\"")))
420433 then throw(("NFT is not supported: " + descr))
421434 else {
422435 let bonusStr = split_4C(split_4C(descr, "\"bonus\":")[1], ",")[0]
423436 parseIntValue(drop(bonusStr, (valueOrElse(lastIndexOf(bonusStr, " "), -1) + 1)))
424437 }
438+
439+
440+func stakeNftInternal (addr,assetIdStr,bonus6,userNumKey,totalNumKey,limit) = {
441+ let nftNumber = valueOrElse(getInteger(userNumKey), 0)
442+ if ((nftNumber >= limit))
443+ then throw((("You can stake max " + toString(limit)) + " of such NFTs"))
444+ else {
445+ let $t01040710483 = stakeUnstakeAcresInternal(0, addr, bonus6)
446+ let actions = $t01040710483._1
447+ let wlgClaimedAmount = $t01040710483._2
448+ $Tuple2((((actions :+ IntegerEntry(userNumKey, (nftNumber + 1))) :+ IntegerEntry(totalNumKey, (valueOrElse(getInteger(totalNumKey), 0) + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)), wlgClaimedAmount)
449+ }
450+ }
425451
426452
427453 @Callable(i)
428454 func saveLastTx () = if (!(containsElement([wlgContract], i.caller)))
429455 then throw("Access denied")
430456 else $Tuple2(prolog(i), 42)
431457
432458
433459
434460 @Callable(i)
435461 func constructorV1 (rest2Addr,oldAcrContract) = if ((i.caller != this))
436462 then throw("Permission denied")
437463 else {
438464 let oldAcrContAddr = addressFromStringValue(oldAcrContract)
439465 [IntegerEntry(acresIssuedAmountKey, getIntegerValue(oldAcrContAddr, acresIssuedAmountKey)), BinaryEntry(acresAssetIdKey, getBinaryValue(oldAcrContAddr, acresAssetIdKey)), StringEntry(keyRest2Address(), rest2Addr), StringEntry(oldAcresContractKey, oldAcrContract)]
440466 }
441467
442468
443469
444470 @Callable(i)
445471 func setBlocked (isBlocked) = if ((i.caller != this))
446472 then throw("permission denied")
447473 else [BooleanEntry(keyBlocked(), isBlocked)]
448474
449475
450476
451477 @Callable(i)
452478 func unstakeAcres (amount) = {
453479 let prologActions = prolog(i)
454480 if ((0 >= amount))
455481 then throw("Amount should be positive")
456482 else {
457483 let address = toString(i.caller)
458484 if ((size(i.payments) != 0))
459485 then throw("No payments required")
460486 else {
461487 let arbReleaseTime = (valueOrElse(getInteger(wlgContract, keyLastWlgTradeTimeByUser(address)), 0) + arbitrageDelay)
462488 if ((arbReleaseTime > lastBlock.timestamp))
463489 then throw(("You traded some WLGOLD, cannot unstake until " + toString(arbReleaseTime)))
464490 else {
465- let $t01155211632 = stakeUnstakeAcresInternal(-(amount), address, 0)
466- let actions = $t01155211632._1
467- let wlgClaimedAmount = $t01155211632._2
491+ let $t01205712137 = stakeUnstakeAcresInternal(-(amount), address, 0)
492+ let actions = $t01205712137._1
493+ let wlgClaimedAmount = $t01205712137._2
468494 $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
469495 }
470496 }
471497 }
472498 }
473499
474500
475501
476502 @Callable(i)
477503 func stakeAcres () = {
478504 let prologActions = prolog(i)
479505 let address = toString(i.caller)
480506 if ((size(i.payments) != 1))
481507 then throw("exactly 1 payment must be attached")
482508 else {
483509 let pmt = i.payments[0]
484510 let amt = pmt.amount
485511 if (if (!(isDefined(pmt.assetId)))
486512 then true
487513 else (value(pmt.assetId) != acresAssetId))
488514 then throw("ACRES payments only!")
489515 else {
490- let $t01208312159 = stakeUnstakeAcresInternal(amt, address, 0)
491- let actions = $t01208312159._1
492- let wlgClaimedAmount = $t01208312159._2
516+ let $t01258812664 = stakeUnstakeAcresInternal(amt, address, 0)
517+ let actions = $t01258812664._1
518+ let wlgClaimedAmount = $t01258812664._2
493519 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
494520 }
495521 }
496522 }
497523
498524
499525
500526 @Callable(i)
501527 func buyAcres () = {
502528 let prologActions = prolog(i)
503529 if ((size(i.payments) != 1))
504530 then throw("exactly 1 payment must be attached")
505531 else {
506532 let pmt = i.payments[0]
507533 let usdtAmount = pmt.amount
508534 if (if (!(isDefined(pmt.assetId)))
509535 then true
510536 else (value(pmt.assetId) != usdtAssetId))
511537 then throw("USDT payments only!")
512538 else if ((MULT6 > usdtAmount))
513539 then throw((("Min payment should be " + fixedPoint(MULT6, 6)) + " USDT"))
514540 else {
515541 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
516542 let wlgAmount = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
517543 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
518544 let req = invoke(oldAcresAddress, "requestAcresCallback", [acresAmount], nil)
519545 if ((req == req))
520546 then {
521547 let wlgRemain = asInt(invoke(wlgContract, "burnWlgold", [wlgAmount], nil))
522548 $Tuple2(([ScriptTransfer(i.caller, acresAmount, acresAssetId)] ++ prologActions), wlgRemain)
523549 }
524550 else throw("Strict value is not equal to itself.")
525551 }
526552 }
527553 }
528554
529555
530556
531557 @Callable(i)
532558 func buyAcresREADONLY (usdtAmount) = {
533559 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
534560 let wlgToBurn = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
535561 $Tuple2(nil, [acresAmount, MULT6, acresAmount, wlgToBurn])
536562 }
537563
538564
539565
540566 @Callable(i)
541567 func sellAcres () = {
542568 let prologActions = prolog(i)
543569 if ((size(i.payments) != 1))
544570 then throw("exactly 1 payment must be attached")
545571 else {
546572 let pmt = i.payments[0]
547573 let acresAmount = pmt.amount
548574 if (if (!(isDefined(pmt.assetId)))
549575 then true
550576 else (value(pmt.assetId) != acresAssetId))
551577 then throw("ACRES payments only!")
552578 else if ((MULT7 > acresAmount))
553579 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
554580 else {
555581 let addr = toString(i.caller)
556- let $t01401614064 = getSwapLimitAcres()
557- let limitAction = $t01401614064._1
558- let maxUsdt = $t01401614064._2
582+ let $t01452114569 = getSwapLimitAcres()
583+ let limitAction = $t01452114569._1
584+ let maxUsdt = $t01452114569._2
559585 let maxAcres = (maxUsdt * USDT2ACRES_MULTIPLIER)
560586 if ((acresAmount > maxAcres))
561587 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
562588 else {
563589 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
564590 $Tuple2(([limitAction, IntegerEntry(keyLastLimitLeft, (maxUsdt - usdtAmount)), ScriptTransfer(i.caller, usdtAmount, usdtAssetId)] ++ prologActions), usdtAmount)
565591 }
566592 }
567593 }
568594 }
569595
570596
571597
572598 @Callable(i)
573599 func sellAcresREADONLY (address,acresAmount) = {
574- let $t01456014608 = getSwapLimitAcres()
575- let limitAction = $t01456014608._1
576- let maxUsdt = $t01456014608._2
600+ let $t01506515113 = getSwapLimitAcres()
601+ let limitAction = $t01506515113._1
602+ let maxUsdt = $t01506515113._2
577603 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
578604 $Tuple2(nil, [usdtAmount, MULT7, (maxUsdt * USDT2ACRES_MULTIPLIER), 0])
579605 }
580606
581607
582608
583609 @Callable(i)
584610 func convertOldStakes () = if ((i.caller != this))
585611 then throw("Temporarily disabled")
586612 else {
587613 let address = toString(i.caller)
588614 if ((size(i.payments) != 0))
589615 then throw("No payments required")
590616 else {
591617 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
592618 let amount = valueOrElse(getInteger(oldAcresAddress, keyAcresStakedAmtByUser(address)), 0)
593619 let gotAcres0 = if ((amount > 0))
594620 then asTuple2Ints(invoke(oldAcresAddress, "unstakeAcresCallback", [amount, address], nil))
595621 else $Tuple2(0, 0)
596622 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
597623 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
598624 let landsResult = if (isDefined(landsStr))
599625 then {
600626 let lands = split_51C(value(landsStr), "_")
601627 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
602628 then throw("landAssetId is required")
603629 else {
604630 let r = asTuple5Ints(invoke(oldStakingAddress, "unstakeLandCallback", [landAssetId, address], nil))
605631 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
606632 }
607633
608634 let rr = {
609635 let $l = lands
610636 let $s = size($l)
611637 let $acc0 = $Tuple4(0, 0, 0, 0)
612638 func $f0_1 ($a,$i) = if (($i >= $s))
613639 then $a
614640 else oneLand($a, $l[$i])
615641
616642 func $f0_2 ($a,$i) = if (($i >= $s))
617643 then $a
618644 else throw("List size exceeds 100")
619645
620646 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
621647 }
622648 let finalize = invoke(oldStakingAddress, "unstakeLandsFinalizeCallback", [address], nil)
623649 if ((finalize == finalize))
624650 then {
625651 let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
626652 if ((req == req))
627653 then {
628- let $t01648016560 = issueNFTinternal(IdxDtx3PercConversion, i.caller)
629- let nftActions = $t01648016560._1
630- let nftAssetId = $t01648016560._2
654+ let $t01698217062 = issueNFTinternal(IdxDtx3PercConversion, i.caller)
655+ let nftActions = $t01698217062._1
656+ let nftAssetId = $t01698217062._2
631657 $Tuple5(rr._1, rr._2, rr._3, rr._4, nftActions)
632658 }
633659 else throw("Strict value is not equal to itself.")
634660 }
635661 else throw("Strict value is not equal to itself.")
636662 }
637663 else $Tuple5(0, 0, 0, 0, nil)
638664 let duckAssetId = valueOrElse(getString(oldStakingAddress, keyStakedDuckByOwner(address)), "")
639665 let duckResult = if ((duckAssetId != ""))
640666 then asTuple3Ints(invoke(oldStakingAddress, "unstakeDuckCallback", [duckAssetId, address], nil))
641667 else $Tuple3(0, 0, 0)
642668 let x = stakeUnstakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address, 0)
643669 $Tuple2((landsResult._5 ++ x._1), x._2)
644670 }
645671 }
646672
647673
648674
649675 @Callable(i)
650676 func unstakeLandsREADONLY (address) = {
651677 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
652678 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
653679 let landsResult = if (isDefined(landsStr))
654680 then {
655681 let lands = split_51C(value(landsStr), "_")
656682 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
657683 then throw("landAssetId is required")
658684 else {
659685 let r = asTuple4Ints(invoke(oldStakingAddress, "unstakeLandREADONLY", [landAssetId, address], nil))
660686 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
661687 }
662688
663689 let $l = lands
664690 let $s = size($l)
665691 let $acc0 = $Tuple4(0, 0, 0, 0)
666692 func $f0_1 ($a,$i) = if (($i >= $s))
667693 then $a
668694 else oneLand($a, $l[$i])
669695
670696 func $f0_2 ($a,$i) = if (($i >= $s))
671697 then $a
672698 else throw("List size exceeds 100")
673699
674700 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
675701 }
676702 else $Tuple4(0, 0, 0, 0)
677703 $Tuple2(nil, landsResult)
678704 }
679705
680706
681707
682708 @Callable(i)
683709 func stakeAcresCallback (addr) = if ((i.caller != addressFromStringValue(oldStakingContractStr)))
684710 then throw("Permission denied")
685711 else stakeUnstakeAcresInternal(i.payments[0].amount, addr, 0)
686712
687713
688714
689715 @Callable(i)
690716 func simulateStakeAcresREADONLY (address,addedAmount) = {
691717 let amountKey = keyAcresStakedAmtByUser(address)
692718 let newAcresAmount = (valueOrElse(getInteger(amountKey), 0) + addedAmount)
693719 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
694720 let userFpKey = keyFarmingPowerByUser(address)
695721 let oldFp = valueOrElse(getInteger(userFpKey), 0)
696722 let userBonus = valueOrElse(getInteger(acres2Contract, keyUserFullBonus(address)), 0)
697- let $t01872518812 = getFarmingPowerByAcresAndBonus(newAcresAmount, userBonus)
698- let newBonusedFp = $t01872518812._1
699- let ignored = $t01872518812._2
723+ let $t01922719314 = getFarmingPowerByAcresAndBonus(newAcresAmount, userBonus)
724+ let newBonusedFp = $t01922719314._1
725+ let ignored = $t01922719314._2
700726 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
701727 let newTotalFp = ((oldTotalFp + newBonusedFp) - oldFp)
702728 $Tuple2(nil, [oldFp, newBonusedFp, oldTotalFp, newTotalFp])
703729 }
704730
705731
706732
707733 @Callable(i)
708734 func issueNFT (forAddress,nftIndex) = if ((i.caller != wlgContract))
709735 then throw("Permission denied")
710736 else issueNFTinternal(nftIndex, addressFromStringValue(forAddress))
711737
712738
713739
714740 @Callable(i)
715741 func stakeNFT () = {
716742 let prologActions = prolog(i)
717743 if ((size(i.payments) != 1))
718744 then throw("Exactly one payment required")
719745 else {
720746 let pmt = value(i.payments[0])
721747 if ((pmt.amount != 1))
722748 then throw("NFT token should be attached as payment")
723749 else {
724750 let assetId = value(pmt.assetId)
725751 let asset = value(assetInfo(assetId))
726752 let assetIdStr = toBase58String(assetId)
727753 let addr = toString(i.caller)
728754 let nftsKey = keyStakedNFTsByOwner(addr)
729755 let nftsStr = getString(nftsKey)
730756 let nfts = if (isDefined(nftsStr))
731757 then split_4C(value(nftsStr), "_")
732758 else nil
733759 if (containsElement(nfts, assetIdStr))
734760 then throw(("Your staked NFTs already contain " + assetIdStr))
735761 else if ((size(nfts) >= MAX_NFTS_STAKED_BY_USER))
736762 then throw((("Your already staked max (" + toString(MAX_NFTS_STAKED_BY_USER)) + ") NFTs"))
737763 else {
738764 let listAction = StringEntry(nftsKey, makeString_2C((nfts :+ assetIdStr), "_"))
739- let isWL = (asset.issuer == this)
740- if (isWL)
765+ if ((asset.issuer == this))
741766 then {
742- let wlNftNumber = valueOrElse(getInteger(keyUserWlNftNumber(addr)), 0)
743- if ((wlNftNumber >= MAX_WL_NFTS))
744- then throw((("You can stake max " + toString(MAX_WL_NFTS)) + " of WavesLands NFTs"))
745- else {
746- let bonusVal = (bonusByDescription(value(asset.description)) * 10000)
747- let $t02058720665 = stakeUnstakeAcresInternal(0, addr, bonusVal)
748- let actions = $t02058720665._1
749- let wlgClaimedAmount = $t02058720665._2
750- $Tuple2((((((actions :+ listAction) :+ IntegerEntry(keyUserWlNftNumber(addr), (wlNftNumber + 1))) :+ IntegerEntry(keyWlNftTotalStaked, (valueOrElse(getInteger(keyWlNftTotalStaked), 0) + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)) ++ prologActions), wlgClaimedAmount)
751- }
767+ let $t02073120921 = stakeNftInternal(addr, assetIdStr, (bonusByDescription(value(asset.description)) * 10000), keyUserWlNftNumber(addr), keyWlNftTotalStaked, MAX_WL_NFTS)
768+ let actions = $t02073120921._1
769+ let wlgClaimedAmount = $t02073120921._2
770+ $Tuple2(((prologActions ++ actions) :+ listAction), wlgClaimedAmount)
752771 }
753- else {
754- let arkimalName = isArkimalIssued(asset)
755- if ((arkimalName == ""))
756- then throw("Only WavesLands and Arkimals NFT tokens are accepted")
757- else {
758- let arkNftNumber = valueOrElse(getInteger(keyUserArkNftNumber(addr)), 0)
759- if ((arkNftNumber >= MAX_ARK_NFTS))
760- then throw((("You can stake max " + toString(MAX_ARK_NFTS)) + " of Arkimals NFTs"))
761- else {
762- let $t02140021483 = stakeUnstakeAcresInternal(0, addr, ARK_NFT_BONUS)
763- let actions = $t02140021483._1
764- let wlgClaimedAmount = $t02140021483._2
765- $Tuple2(((((actions :+ listAction) :+ IntegerEntry(keyUserArkNftNumber(addr), (arkNftNumber + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)) ++ prologActions), wlgClaimedAmount)
766- }
767- }
768- }
772+ else if ((isArkimalIssued(asset) == ""))
773+ then throw("Only WavesLands and Arkimals NFT tokens are accepted")
774+ else {
775+ let $t02110221253 = stakeNftInternal(addr, assetIdStr, ARK_NFT_BONUS, keyUserArkNftNumber(addr), keyArkNftTotalStaked, MAX_ARK_NFTS)
776+ let actions = $t02110221253._1
777+ let wlgClaimedAmount = $t02110221253._2
778+ $Tuple2(((prologActions ++ actions) :+ listAction), wlgClaimedAmount)
779+ }
769780 }
770781 }
771782 }
772783 }
773784
774785
775786
776787 @Callable(i)
777788 func unstakeNFT (assetIdStr) = {
778789 let prologActions = prolog(i)
779790 if ((size(i.payments) != 0))
780791 then throw("No payments required")
781792 else {
782793 let assetId = fromBase58String(assetIdStr)
783794 let addr = toString(i.caller)
784795 let asset = value(assetInfo(assetId))
785796 let timeKey = keyStakedTimeByAssetIdAndOwner(assetIdStr, addr)
786797 if (!(isDefined(getInteger(timeKey))))
787798 then throw((("NFT " + asset.name) + " is not staked by you"))
788799 else {
789800 let nftsKey = keyStakedNFTsByOwner(addr)
790801 let nfts = split_4C(valueOrElse(getString(nftsKey), ""), "_")
791802 let idx = indexOf(nfts, assetIdStr)
792803 if (!(isDefined(idx)))
793804 then throw(("Your staked NFTs don't contain " + assetIdStr))
794805 else {
795806 let listAction = if ((size(nfts) > 1))
796807 then StringEntry(nftsKey, makeString_2C(removeByIndex(nfts, value(idx)), "_"))
797808 else DeleteEntry(nftsKey)
798809 let isWL = (asset.issuer == this)
799810 if (isWL)
800811 then {
801812 let wlNftNumber = valueOrElse(getInteger(keyUserWlNftNumber(addr)), 0)
802813 let bonusVal = (bonusByDescription(value(asset.description)) * 10000)
803- let $t02280422883 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
804- let actions = $t02280422883._1
805- let wlgClaimedAmount = $t02280422883._2
814+ let $t02241822497 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
815+ let actions = $t02241822497._1
816+ let wlgClaimedAmount = $t02241822497._2
806817 $Tuple2(((((((actions :+ listAction) :+ IntegerEntry(keyUserWlNftNumber(addr), (wlNftNumber - 1))) :+ IntegerEntry(keyWlNftTotalStaked, max([0, (valueOrElse(getInteger(keyWlNftTotalStaked), 0) - 1)]))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
807818 }
808819 else {
809820 let arkimalName = isArkimalIssued(asset)
810821 if ((arkimalName == ""))
811822 then throw("Only WavesLands and Arkimals NFT tokens are accepted")
812823 else {
813824 let arkNftNumber = valueOrElse(getInteger(keyUserArkNftNumber(addr)), 0)
814- let $t02354323627 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
815- let actions = $t02354323627._1
816- let wlgClaimedAmount = $t02354323627._2
825+ let $t02315723241 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
826+ let actions = $t02315723241._1
827+ let wlgClaimedAmount = $t02315723241._2
817828 $Tuple2((((((actions :+ listAction) :+ IntegerEntry(keyUserArkNftNumber(addr), (arkNftNumber - 1))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
818829 }
819830 }
820831 }
821832 }
822833 }
823834 }
824835
825836
826837
827838 @Callable(i)
828839 func exchangeNFTs () = {
829840 let prologActions = prolog(i)
830841 if ((3 > size(i.payments)))
831842 then throw("Min one USDT and 2 NFT payments allowed")
832843 else if ((size(i.payments) > 6))
833844 then throw("Max one USDT and 5 NFT payments allowed")
834845 else {
835846 let addr = toString(i.caller)
836847 func addUp (acc,pmt) = {
837848 let assetId = valueOrErrorMessage(pmt.assetId, "WAVES payments not allowed")
838849 if ((assetId == usdtAssetId))
839850 then $Tuple3((acc._1 + pmt.amount), acc._2, acc._3)
840851 else {
841852 let asset = value(assetInfo(assetId))
842853 if ((asset.issuer != this))
843854 then throw("Only WL-issued NFTs allowed")
844855 else {
845856 let bonusPerc = bonusByDescription(value(asset.description))
846857 $Tuple3(acc._1, (acc._2 + bonusPerc), (acc._3 :+ Burn(assetId, 1)))
847858 }
848859 }
849860 }
850861
851- let $t02477524854 = {
862+ let $t02438924468 = {
852863 let $l = i.payments
853864 let $s = size($l)
854865 let $acc0 = $Tuple3(0, 0, nil)
855866 func $f0_1 ($a,$i) = if (($i >= $s))
856867 then $a
857868 else addUp($a, $l[$i])
858869
859870 func $f0_2 ($a,$i) = if (($i >= $s))
860871 then $a
861872 else throw("List size exceeds 6")
862873
863874 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
864875 }
865- let usdtFee = $t02477524854._1
866- let totalBonus = $t02477524854._2
867- let burnActions = $t02477524854._3
876+ let usdtFee = $t02438924468._1
877+ let totalBonus = $t02438924468._2
878+ let burnActions = $t02438924468._3
868879 let nftIndex = if ((totalBonus == 3))
869880 then 2
870881 else if ((totalBonus == 5))
871882 then 3
872883 else if ((totalBonus == 10))
873884 then 4
874885 else throw("Only bonuses of 3%, 5% or 10% are supported")
875886 let change = (usdtFee - (totalBonus * MULT6))
876887 if ((0 > change))
877888 then throw((("You need to attach " + toString(totalBonus)) + " USDT as fee"))
878889 else {
879890 let changeActions = if ((change > 0))
880891 then [ScriptTransfer(i.caller, change, usdtAssetId)]
881892 else nil
882- let $t02531125383 = issueNFTinternal(nftIndex, i.caller)
883- let issueNftActions = $t02531125383._1
884- let nftAssetId = $t02531125383._2
893+ let $t02492524997 = issueNFTinternal(nftIndex, i.caller)
894+ let issueNftActions = $t02492524997._1
895+ let nftAssetId = $t02492524997._2
885896 let burned = size(burnActions)
886897 let burnCounterActions = if ((burned == 0))
887898 then nil
888899 else [IntegerEntry(keyNftTotalBurned, (valueOrElse(getInteger(keyNftTotalBurned), 0) + burned))]
889900 $Tuple2(((((issueNftActions ++ burnActions) ++ burnCounterActions) ++ prologActions) ++ changeActions), nftAssetId)
890901 }
891902 }
892903 }
893904
894905

github/deemru/w8io/026f985 
118.89 ms