tx · FWNooDxrfSJk7KEin1oH5RYHccUKiimv4XXtUK3d3Jkg

3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh:  -0.02700000 Waves

2024.11.26 21:35 [3388750] smart account 3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh > SELF 0.00000000 Waves

{ "type": 13, "id": "FWNooDxrfSJk7KEin1oH5RYHccUKiimv4XXtUK3d3Jkg", "fee": 2700000, "feeAssetId": null, "timestamp": 1732646138536, "version": 2, "chainId": 84, "sender": "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh", "senderPublicKey": "3QtfC1XbLZXdeawMDeSERy9vvjUmj1XYd2GFmrvx7pWQ", "proofs": [ "2g1peR5D6M1i55A5ZGnKxknUtU5FHabZgWf6uxykFrLh8hXcSXhoEoFjHN9D5bDuEZYZ2Fhbjx3VHdYxVAH48hSo" ], "script": "base64:BgJGCAISABIECgIICBIDCgEEEgMKAQESABIAEgMKAQESABIECgIIARIAEgMKAQgSAwoBCBIECgIIARIECgIIARIAEgMKAQgSAFwAA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDcAgK3iBAAFTVVMVDgAgMLXLwAKREFZX01JTExJUwCAuJkpABVVU0RUMkFDUkVTX01VTFRJUExJRVIACgATT05FX1BFUkNFTlRfRElWSVNPUgBkAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALV0VFS19CTE9DS1MEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAA4E4DCQAAAgEBVAUHJG1hdGNoMAC0AQkAAgECDVVua25vd24gY2hhaW4AC3VzZHRBc3NldElkBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwASCE2nqyCAM/TtG7yo7ui5O8yYLdC136B5ao1CP5qA//uQMJAAACAQFUBQckbWF0Y2gwASBVsdifcoeC7+XjW42sBatl3ppDoS8WuwXzGreHpfHFGAkAAgECDVVua25vd24gY2hhaW4AFmRlZmF1bHRSZXN0MkFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQRndZdGE4YmlFejMxenBlRmU1REpLOHdFNXRyU3BRVkY4AwkAAAIBAVQFByRtYXRjaDACIzNON1V1WWFyNjI2NFA1OEZCaFZXS1BRQWg0WXVhMmhnbmd2CQACAQINVW5rbm93biBjaGFpbgAOYXJiaXRyYWdlRGVsYXkEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAFCkRBWV9NSUxMSVMDCQAAAgEBVAUHJG1hdGNoMADg1AMJAAIBAg1Vbmtub3duIGNoYWluABVvbGRTdGFraW5nQ29udHJhY3RTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQTG5jWHRTMVU4M0Q2Y1FiRkQzSDhyQkhQTGd6eFNGS1oxAwkAAAIBAVQFByRtYXRjaDACIzNOREN5Qkc1cTg1SnVhUmlpZ1VlRXRhaW55akNRVDNYcFptCQACAQINVW5rbm93biBjaGFpbgEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEElkeENmZ0FjcmVzMkRhcHAAAQANSWR4Q2ZnV2xnRGFwcAACABRJZHhDZmdJbnZlc3RGdW5kRGFwcAAFAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBD2tleVJlc3QyQWRkcmVzcwACDSVzX19yZXN0MkFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAghyZXN0MkNmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCHJlc3QyQ2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAANcmVzdDJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPa2V5UmVzdDJBZGRyZXNzAAUWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgAIcmVzdDJDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDXJlc3QyQ29udHJhY3QADmFjcmVzMkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFEElkeENmZ0FjcmVzMkRhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFDUlkeENmZ1dsZ0RhcHAAEmludmVzdEZ1bmRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCHJlc3QyQ2ZnBRRJZHhDZmdJbnZlc3RGdW5kRGFwcAATb2xkQWNyZXNDb250cmFjdEtleQIQb2xkQWNyZXNDb250cmFjdAEKa2V5QmxvY2tlZAACEGNvbnRyYWN0c0Jsb2NrZWQBFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEEYWRkcgkArAICAhNsYXN0V2Vla1R4SWRCeVVzZXJfBQRhZGRyARRrZXlDdXJXZWVrVHhJZEJ5VXNlcgEEYWRkcgkArAICAhJjdXJXZWVrVHhJZEJ5VXNlcl8FBGFkZHIAFGFjcmVzSXNzdWVkQW1vdW50S2V5AhFhY3Jlc0lzc3VlZEFtb3VudAAPYWNyZXNBc3NldElkS2V5AgxhY3Jlc0Fzc2V0SWQADGFjcmVzQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFDmFjcmVzMkNvbnRyYWN0BQ9hY3Jlc0Fzc2V0SWRLZXkCF0FDUkVTIGlzIG5vdCBpc3N1ZWQgeWV0ARhrZXlBY3Jlc1N0YWtlZFRpbWVCeVVzZXIBBGFkZHIJAKwCAgIWYWNyZXNTdGFrZWRUaW1lQnlVc2VyXwUEYWRkcgEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQlvd25lckFkZHIJAKwCAgITc3Rha2VkTGFuZHNCeU93bmVyXwUJb3duZXJBZGRyARRrZXlTdGFrZWREdWNrQnlPd25lcgEJb3duZXJBZGRyCQCsAgICEnN0YWtlZER1Y2tCeU93bmVyXwUJb3duZXJBZGRyAR5rZXlTdGFrZWRUaW1lQnlBc3NldElkQW5kT3duZXICB2Fzc2V0SWQEYWRkcgkArAICCQCsAgIJAKwCAgIDc3RfBQdhc3NldElkAgFfBQRhZGRyARRrZXlTdGFrZWRORlRzQnlPd25lcgEJb3duZXJBZGRyCQCsAgICEnN0YWtlZE5GVHNCeU93bmVyXwUJb3duZXJBZGRyAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBDGFzVHVwbGU1SW50cwEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIZKEludCwgSW50LCBJbnQsIEludCwgSW50KQQBdAUHJG1hdGNoMAUBdAkAAgECK2ZhaWwgdG8gY2FzdCBpbnRvIChJbnQsIEludCwgSW50LCBJbnQsIEludCkBDGFzVHVwbGU0SW50cwEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIUKEludCwgSW50LCBJbnQsIEludCkEAXQFByRtYXRjaDAFAXQJAAIBAiZmYWlsIHRvIGNhc3QgaW50byAoSW50LCBJbnQsIEludCwgSW50KQEMYXNUdXBsZTNJbnRzAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAg8oSW50LCBJbnQsIEludCkEAXQFByRtYXRjaDAFAXQJAAIBAiFmYWlsIHRvIGNhc3QgaW50byAoSW50LCBJbnQsIEludCkBDGFzVHVwbGUySW50cwEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQBdAUHJG1hdGNoMAUBdAkAAgECHGZhaWwgdG8gY2FzdCBpbnRvIChJbnQsIEludCkBCmZpeGVkUG9pbnQCA3ZhbAhkZWNpbWFscwQGdGVuUG93CQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgQHbG93UGFydAkApAMBCQBqAgUDdmFsBQZ0ZW5Qb3cEBnplcm9lcwkAsAICCQCkAwEFBnRlblBvdwkAZAIAAQkAsQIBBQdsb3dQYXJ0CQCsAgIJAKwCAgkArAICCQCkAwEJAGkCBQN2YWwFBnRlblBvdwIBLgUGemVyb2VzBQdsb3dQYXJ0AANNNl8AwIQ9AANNOF8AgMLXLwAPd2xnSXNzdWVkQW10S2V5AhB3bGdfaXNzdWVkQW1vdW50AA56Yklzc3VlZEFtdEtleQISemJpbGxfaXNzdWVkQW1vdW50ARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEEYWRkcgkArAICAhhhY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcl8FBGFkZHIBFWtleUZhcm1pbmdQb3dlckJ5VXNlcgEEYWRkcgkArAICAhNmYXJtaW5nUG93ZXJCeVVzZXJfBQRhZGRyABJhY3Jlc1N0YWtkVG90YWxLZXkCFmFjcmVzU3Rha2VkQW1vdW50VG90YWwAFHRvdGFsRmFybWluZ1Bvd2VyS2V5AhF0b3RhbEZhcm1pbmdQb3dlcgAVSWR4RHR4M1BlcmNDb252ZXJzaW9uAAAAC01BWF9XTF9ORlRTAAMADE1BWF9BUktfTkZUUwABAA1BUktfTkZUX0JPTlVTAIgnABdNQVhfTkZUU19TVEFLRURfQllfVVNFUgAEABFrZXlOZnRUb3RhbElzc3VlZAIObmZ0VG90YWxJc3N1ZWQAEWtleU5mdFRvdGFsQnVybmVkAg5uZnRUb3RhbEJ1cm5lZAATa2V5V2xOZnRUb3RhbFN0YWtlZAIQV2xOZnRUb3RhbFN0YWtlZAEVa2V5TmZ0TnVtYmVyQnlBc3NldElkAQdhc3NldElkCQCsAgICE25mdE51bWJlckJ5QXNzZXRJZF8FB2Fzc2V0SWQBEmtleVVzZXJXbE5mdE51bWJlcgEEYWRkcgkArAICAhB1c2VyV2xOZnROdW1iZXJfBQRhZGRyARNrZXlVc2VyQXJrTmZ0TnVtYmVyAQRhZGRyCQCsAgICEXVzZXJBcmtOZnROdW1iZXJfBQRhZGRyARBrZXlVc2VyRnVsbEJvbnVzAQRhZGRyCQCsAgICDnVzZXJGdWxsQm9udXNfBQRhZGRyAApsZXZlbEFjcmVzCQDMCAIAAAkAzAgCAAoJAMwIAgAUCQDMCAIAKAkAzAgCAFAJAMwIAgCWAQkAzAgCAPoBCQDMCAIAkAMJAMwIAgC8BQkAzAgCAOgHBQNuaWwBD2dldExldmVsQnlBY3JlcwEFYWNyZXMEA2FjcgkAaQIJAGQCBQVhY3JlcwD/wdcvBQNNOF8KAQdjaGVja2VyAgNhY2MEaXRlbQMJAGcCBQRpdGVtBQNhY3IFA2FjYwkAZAIFA2FjYwABCgACJGwFCmxldmVsQWNyZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2NoZWNrZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBWFjcmVzCQBoAgkAaAIFBWFjcmVzABQJAGQCCQEPZ2V0TGV2ZWxCeUFjcmVzAQUFYWNyZXMABAEeZ2V0RmFybWluZ1Bvd2VyQnlBY3Jlc0FuZEJvbnVzAgVhY3JlcwZib251czYECm5vdEJvbnVzZWQJARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQUFYWNyZXMJAJQKAgkAawMFCm5vdEJvbnVzZWQJAGQCBQNNNl8FBmJvbnVzNgUDTTZfBQpub3RCb251c2VkARlrZXlMYXN0V2xnVHJhZGVUaW1lQnlVc2VyAQRhZGRyCQCsAgICEGxhc3RBcmJUaW1lVXNlcl8FBGFkZHIAFGtleUxhc3RBY3Jlc1NlbGxUaW1lAhFsYXN0QWNyZXNTZWxsVGltZQAQa2V5TGFzdExpbWl0TGVmdAINbGFzdExpbWl0TGVmdAAPbmZ0RGVzY3JpcHRpb25zCQDMCAIClwEsICJjb2xsZWN0aW9uIjogIkRpZ2dpbmcgdG9vbHMiLCAibmFtZSI6ICJHb2xkIHNob3ZlbCIsICJkZXNjcmlwdGlvbiI6ICJSZXdhcmQgZm9yIGVhcmx5IGJpcmRzIiwgInJhcmUiOiAiUHJvbW8iLCAiYm9udXMiOiAzLCAiYm9udXNUeXBlIjogIkZhcm1Qb3dlciJ9CQDMCAICkQEsICJjb2xsZWN0aW9uIjogIkRpZ2dpbmcgdG9vbHMiLCAibmFtZSI6ICJQaWNrYXhlIiwgImRlc2NyaXB0aW9uIjogIkluY3JlYXNlcyBGYXJtUG93ZXIiLCAicmFyZSI6ICJDb21tb24iLCAiYm9udXMiOiAxLCAiYm9udXNUeXBlIjogIkZhcm1Qb3dlciJ9CQDMCAICkQEsICJjb2xsZWN0aW9uIjogIkRpZ2dpbmcgdG9vbHMiLCAibmFtZSI6ICJQaWNrYXhlIiwgImRlc2NyaXB0aW9uIjogIkluY3JlYXNlcyBGYXJtUG93ZXIiLCAicmFyZSI6ICJDb21tb24iLCAiYm9udXMiOiAzLCAiYm9udXNUeXBlIjogIkZhcm1Qb3dlciJ9CQDMCAICkQEsICJjb2xsZWN0aW9uIjogIkRpZ2dpbmcgdG9vbHMiLCAibmFtZSI6ICJQaWNrYXhlIiwgImRlc2NyaXB0aW9uIjogIkluY3JlYXNlcyBGYXJtUG93ZXIiLCAicmFyZSI6ICJDb21tb24iLCAiYm9udXMiOiA1LCAiYm9udXNUeXBlIjogIkZhcm1Qb3dlciJ9CQDMCAICkgEsICJjb2xsZWN0aW9uIjogIkRpZ2dpbmcgdG9vbHMiLCAibmFtZSI6ICJQaWNrYXhlIiwgImRlc2NyaXB0aW9uIjogIkluY3JlYXNlcyBGYXJtUG93ZXIiLCAicmFyZSI6ICJDb21tb24iLCAiYm9udXMiOiAxMCwgImJvbnVzVHlwZSI6ICJGYXJtUG93ZXIifQUDbmlsAAhuZnROYW1lcwkAzAgCAglTSE9WRUwtUDMJAMwIAgIKUElDS0FYRS1DMQkAzAgCAgpQSUNLQVhFLUMzCQDMCAICClBJQ0tBWEUtQzUJAMwIAgILUElDS0FYRS1DMTAFA25pbAALY29udGVudEtleXMJAMwIAgIPY29udGVudFNob3ZlbFAzCQDMCAICEGNvbnRlbnRQaWNrYXhlQzEJAMwIAgIQY29udGVudFBpY2theGVDMwkAzAgCAhBjb250ZW50UGlja2F4ZUM1CQDMCAICEWNvbnRlbnRQaWNrYXhlQzEwBQNuaWwAA1VSTAIhInVybCI6ICJodHRwczovL3dhdmVzbGFuZHMuY29tIiwgAQZwcm9sb2cBAWkDAwkBAiE9AggFAWkMb3JpZ2luQ2FsbGVyBQ1yZXN0MkNvbnRyYWN0CQELdmFsdWVPckVsc2UCCQCgCAEJAQprZXlCbG9ja2VkAAcHCQACAQIfQ29udHJhY3RzIGFyZSB1bmRlciBtYWludGVuYW5jZQQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEBHdlZWsJAGkCBQZoZWlnaHQFC1dFRUtfQkxPQ0tTBBJsYXN0V2Vla1R4SWRCeVVzZXIJAKIIAQkBFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEFBGFkZHIEBHR4SWQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAQDd3R4CQCsAgIJAKwCAgkApAMBBQR3ZWVrAgFfBQR0eElkAwkBCWlzRGVmaW5lZAEFEmxhc3RXZWVrVHhJZEJ5VXNlcgQKbGFzdFdlZWtUeAkAtQkCCQEFdmFsdWUBBRJsYXN0V2Vla1R4SWRCeVVzZXICAV8DCQAAAgkAkQMCBQpsYXN0V2Vla1R4AAAJAKQDAQUEd2VlawkAzAgCCQELU3RyaW5nRW50cnkCCQEVa2V5TGFzdFdlZWtUeElkQnlVc2VyAQUEYWRkcgUDd3R4CQDMCAIJAQtTdHJpbmdFbnRyeQIJARRrZXlDdXJXZWVrVHhJZEJ5VXNlcgEFBGFkZHIFA3d0eAUDbmlsAwkAAAIJAJEDAgUKbGFzdFdlZWtUeAAACQCkAwEJAGUCBQR3ZWVrAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFGtleUN1cldlZWtUeElkQnlVc2VyAQUEYWRkcgUDd3R4BQNuaWwEEWN1cldlZWtUeElkQnlVc2VyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEVa2V5TGFzdFdlZWtUeElkQnlVc2VyAQUEYWRkcgQJY3VyV2Vla1R4CQC1CQIFEWN1cldlZWtUeElkQnlVc2VyAgFfAwkAAAIJAJEDAgUJY3VyV2Vla1R4AAAJAKQDAQUEd2VlawkAzAgCCQELU3RyaW5nRW50cnkCCQEUa2V5Q3VyV2Vla1R4SWRCeVVzZXIBBQRhZGRyBQN3dHgFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCCQEVa2V5TGFzdFdlZWtUeElkQnlVc2VyAQUEYWRkcgURY3VyV2Vla1R4SWRCeVVzZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFGtleUN1cldlZWtUeElkQnlVc2VyAQUEYWRkcgUDd3R4BQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEFBGFkZHIFA3d0eAkAzAgCCQELU3RyaW5nRW50cnkCCQEUa2V5Q3VyV2Vla1R4SWRCeVVzZXIBBQRhZGRyBQN3dHgFA25pbAEQaXNzdWVORlRpbnRlcm5hbAIIbmZ0SW5kZXgEYWRkcgMJAGcCBQhuZnRJbmRleAkAkAMBBQtjb250ZW50S2V5cwkAAgECFm5mdEluZGV4IG91dCBvZiBib3VuZHMECW5mdFNlcmlhbAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQURa2V5TmZ0VG90YWxJc3N1ZWQA////////////AQABBAVpc3N1ZQkAwggFCQCRAwIFCG5mdE5hbWVzBQhuZnRJbmRleAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewUDVVJMAg8iY29udGVudEtleSI6ICIJAJEDAgULY29udGVudEtleXMFCG5mdEluZGV4Ag0iLCAibnVtYmVyIjogCQCkAwEFCW5mdFNlcmlhbAkAkQMCBQ9uZnREZXNjcmlwdGlvbnMFCG5mdEluZGV4AAEAAAcECm5mdEFzc2V0SWQJALgIAQUFaXNzdWUJAJQKAgkAzAgCBQVpc3N1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgURa2V5TmZ0VG90YWxJc3N1ZWQFCW5mdFNlcmlhbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFWtleU5mdE51bWJlckJ5QXNzZXRJZAEJANgEAQUKbmZ0QXNzZXRJZAUJbmZ0U2VyaWFsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBGFkZHIAAQUKbmZ0QXNzZXRJZAUDbmlsBQpuZnRBc3NldElkARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAwNhbXQHYWRkcmVzcwpib251c0RlbHRhAwMJAAACBQNhbXQAAAkAAAIFCmJvbnVzRGVsdGEAAAcJAAIBAg1Ob3RoaW5nIHRvIGRvBAl3bGdSZXN1bHQJAPwHBAULd2xnQ29udHJhY3QCEm9uU3Rha2VVbnN0YWtlTGFuZAkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAMJAAACBQl3bGdSZXN1bHQFCXdsZ1Jlc3VsdAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQHdGltZUtleQkBGGtleUFjcmVzU3Rha2VkVGltZUJ5VXNlcgEFB2FkZHJlc3MECWFtb3VudEtleQkBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQUHYWRkcmVzcwQOb2xkQWNyZXNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJYW1vdW50S2V5AAADAwkAZgIAAAUDYW10CQBmAgAACQBkAgUOb2xkQWNyZXNBbW91bnQFA2FtdAcJAAIBCQCsAgIJAKwCAgkArAICAg5Zb3UgaGF2ZSBvbmx5IAkBCmZpeGVkUG9pbnQCBQ5vbGRBY3Jlc0Ftb3VudAAIAiAgQUNSRVMgc3Rha2VkLCB0cmllZCB0byB1bnN0YWtlIAkBCmZpeGVkUG9pbnQCCQEBLQEFA2FtdAAIBA5uZXdBY3Jlc0Ftb3VudAkAZAIFDm9sZEFjcmVzQW1vdW50BQNhbXQECG9sZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFEmFjcmVzU3Rha2RUb3RhbEtleQAABAl1c2VyRnBLZXkJARVrZXlGYXJtaW5nUG93ZXJCeVVzZXIBBQdhZGRyZXNzBAVvbGRGcAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQl1c2VyRnBLZXkAAAQIYm9udXNLZXkJARBrZXlVc2VyRnVsbEJvbnVzAQUHYWRkcmVzcwQIb2xkQm9udXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QFCGJvbnVzS2V5AAADAwkAZgIAAAUKYm9udXNEZWx0YQkAZgIAAAkAZAIFCG9sZEJvbnVzBQpib251c0RlbHRhBwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIOWW91IGhhdmUgb25seSAJAQpmaXhlZFBvaW50AgUIb2xkQm9udXMABAIeJSBib251cywgYW5kIHRyaWVkIHRvIHVuc3Rha2UgCQEKZml4ZWRQb2ludAIJAQEtAQUKYm9udXNEZWx0YQAEAgElBAskdDA1OTU4NjA1NwkBHmdldEZhcm1pbmdQb3dlckJ5QWNyZXNBbmRCb251cwIFDm5ld0FjcmVzQW1vdW50CQBkAgUIb2xkQm9udXMFCmJvbnVzRGVsdGEEDG5ld0JvbnVzZWRGcAgFCyR0MDU5NTg2MDU3Al8xBAdpZ25vcmVkCAULJHQwNTk1ODYwNTcCXzIECm9sZFRvdGFsRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUdG90YWxGYXJtaW5nUG93ZXJLZXkAAAQMYWNyZXNBY3Rpb25zAwkAAAIFA2FtdAAABQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFCWFtb3VudEtleQUObmV3QWNyZXNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEmFjcmVzU3Rha2RUb3RhbEtleQkAZAIFCG9sZFRvdGFsBQNhbXQFA25pbAkAlAoCCQDNCAIJAM0IAgkAzQgCCQDNCAIFDGFjcmVzQWN0aW9ucwkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQEMSW50ZWdlckVudHJ5AgUJdXNlckZwS2V5BQxuZXdCb251c2VkRnAJAQxJbnRlZ2VyRW50cnkCBRR0b3RhbEZhcm1pbmdQb3dlcktleQkAZQIJAGQCBQpvbGRUb3RhbEZwBQxuZXdCb251c2VkRnAFBW9sZEZwCQEMSW50ZWdlckVudHJ5AgUIYm9udXNLZXkJAGQCBQhvbGRCb251cwUKYm9udXNEZWx0YQUJd2xnUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRXbGdQcmljZQEVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAxpc3N1ZWRBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQt3bGdDb250cmFjdAUPd2xnSXNzdWVkQW10S2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQEBndsZ1VzZAkA8AcCBQt3bGdDb250cmFjdAULdXNkdEFzc2V0SWQECWFjcmVzMlVzZAkAZQIJAPAHAgUOYWNyZXMyQ29udHJhY3QFC3VzZHRBc3NldElkBRV1c2R0QmFsYW5jZUNvcnJlY3Rpb24ED2ludmVzdEZ1bmRUb3RhbAkAZAIJAPAHAgUSaW52ZXN0RnVuZENvbnRyYWN0BQt1c2R0QXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRJpbnZlc3RGdW5kQ29udHJhY3QFDnpiSXNzdWVkQW10S2V5AAAEDXRvdGFsRnVuZHNVc2QJAGQCCQBkAgUJYWNyZXMyVXNkBQZ3bGdVc2QFD2ludmVzdEZ1bmRUb3RhbAkAawMFDXRvdGFsRnVuZHNVc2QFBU1VTFQ4BQxpc3N1ZWRBbW91bnQBEWdldFN3YXBMaW1pdEFjcmVzAAQGd2xnVXNkCQDwBwIFC3dsZ0NvbnRyYWN0BQt1c2R0QXNzZXRJZAQJYWNyZXMyVXNkCQDwBwIFBHRoaXMFC3VzZHRBc3NldElkBA9pbnZlc3RGdW5kVG90YWwJAGQCCQDwBwIFEmludmVzdEZ1bmRDb250cmFjdAULdXNkdEFzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQ56Yklzc3VlZEFtdEtleQAABAxkZWZhdWx0TGltaXQJAGkCCQBkAgkAZAIFCWFjcmVzMlVzZAUGd2xnVXNkBQ9pbnZlc3RGdW5kVG90YWwFE09ORV9QRVJDRU5UX0RJVklTT1IEDWxhc3RMaW1pdExlZnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUQa2V5TGFzdExpbWl0TGVmdAUMZGVmYXVsdExpbWl0BAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBRRrZXlMYXN0QWNyZXNTZWxsVGltZQAABANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAxjdXJyZW50TGltaXQJAGQCBQ1sYXN0TGltaXRMZWZ0CQBrAwUMZGVmYXVsdExpbWl0CQBlAgUDbm93BQhsYXN0VGltZQUKREFZX01JTExJUwQNbGltaXRMZWZ0VXNkdAkAlwMBCQDMCAIFDGN1cnJlbnRMaW1pdAkAzAgCBQxkZWZhdWx0TGltaXQFA25pbAkAlAoCCQEMSW50ZWdlckVudHJ5AgUUa2V5TGFzdEFjcmVzU2VsbFRpbWUFA25vdwUNbGltaXRMZWZ0VXNkdAAJYXJrT3JhY2xlCQERQGV4dHJOYXRpdmUoMTA2MikBAiMzUEpnWjZBSzFXVkNwZENtRVpwZXNIbWFLdnJRRGRYRzVvZwAJaW5jdWJhdG9yCQELdmFsdWVPckVsc2UCCQCdCAIFCWFya09yYWNsZQIXc3RhdGljX2luY3ViYXRvckFkZHJlc3MCAAAHYnJlZWRlcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQlhcmtPcmFjbGUCFXN0YXRpY19icmVlZGVyQWRkcmVzcwIAAA90dXJ0bGVJbmN1YmF0b3IJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUJYXJrT3JhY2xlAh1zdGF0aWNfdHVydGxlSW5jdWJhdG9yQWRkcmVzcwIAAA10dXJ0bGVCcmVlZGVyCQELdmFsdWVPckVsc2UCCQCdCAIFCWFya09yYWNsZQIbc3RhdGljX3R1cnRsZUJyZWVkZXJBZGRyZXNzAgAAD2NhbmluZUluY3ViYXRvcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQlhcmtPcmFjbGUCHXN0YXRpY19jYW5pbmVJbmN1YmF0b3JBZGRyZXNzAgAADWNhbmluZUJyZWVkZXIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUJYXJrT3JhY2xlAhtzdGF0aWNfY2FuaW5lQnJlZWRlckFkZHJlc3MCAAAPZmVsaW5lSW5jdWJhdG9yCQELdmFsdWVPckVsc2UCCQCdCAIFCWFya09yYWNsZQIdc3RhdGljX2ZlbGluZUluY3ViYXRvckFkZHJlc3MCAAANZmVsaW5lQnJlZWRlcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQlhcmtPcmFjbGUCG3N0YXRpY19mZWxpbmVCcmVlZGVyQWRkcmVzcwIAAA1tdXRhbnRCcmVlZGVyCQELdmFsdWVPckVsc2UCCQCdCAIFCWFya09yYWNsZQIdc3RhdGljX211dGFudEluY3ViYXRvckFkZHJlc3MCAAEPaXNBcmtpbWFsSXNzdWVkAQNuZm8EBmlzc3VlcgkApQgBCAUDbmZvBmlzc3VlcgMDAwMDAwMDCQAAAgUGaXNzdWVyBQlpbmN1YmF0b3IGCQAAAgUGaXNzdWVyBQdicmVlZGVyBgkAAAIFBmlzc3VlcgUPdHVydGxlSW5jdWJhdG9yBgkAAAIFBmlzc3VlcgUNdHVydGxlQnJlZWRlcgYJAAACBQZpc3N1ZXIFD2NhbmluZUluY3ViYXRvcgYJAAACBQZpc3N1ZXIFDWNhbmluZUJyZWVkZXIGCQAAAgUGaXNzdWVyBQ9mZWxpbmVJbmN1YmF0b3IGCQAAAgUGaXNzdWVyBQ1mZWxpbmVCcmVlZGVyCAUDbmZvBG5hbWUDCQAAAgUGaXNzdWVyBQ1tdXRhbnRCcmVlZGVyCAUDbmZvC2Rlc2NyaXB0aW9uAgABEmJvbnVzQnlEZXNjcmlwdGlvbgEFZGVzY3IDCQEBIQEJAQhjb250YWlucwIFBWRlc2NyAhgiYm9udXNUeXBlIjogIkZhcm1Qb3dlciIJAAIBCQCsAgICFk5GVCBpcyBub3Qgc3VwcG9ydGVkOiAFBWRlc2NyBAhib251c1N0cgkAkQMCCQC8CQIJAJEDAgkAvAkCBQVkZXNjcgIIImJvbnVzIjoAAQIBLAAACQENcGFyc2VJbnRWYWx1ZQEJALACAgUIYm9udXNTdHIJAGQCCQELdmFsdWVPckVsc2UCCQC3CQIFCGJvbnVzU3RyAgEgAP///////////wEAAREBaQEKc2F2ZUxhc3RUeAADCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFC3dsZ0NvbnRyYWN0BQNuaWwIBQFpBmNhbGxlcgkAAgECDUFjY2VzcyBkZW5pZWQJAJQKAgkBBnByb2xvZwEFAWkAKgFpAQ1jb25zdHJ1Y3RvclYxAglyZXN0MkFkZHIOb2xkQWNyQ29udHJhY3QDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQOb2xkQWNyQ29udEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDm9sZEFjckNvbnRyYWN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRhY3Jlc0lzc3VlZEFtb3VudEtleQkBEUBleHRyTmF0aXZlKDEwNTApAgUOb2xkQWNyQ29udEFkZHIFFGFjcmVzSXNzdWVkQW1vdW50S2V5CQDMCAIJAQtCaW5hcnlFbnRyeQIFD2FjcmVzQXNzZXRJZEtleQkBEUBleHRyTmF0aXZlKDEwNTIpAgUOb2xkQWNyQ29udEFkZHIFD2FjcmVzQXNzZXRJZEtleQkAzAgCCQELU3RyaW5nRW50cnkCCQEPa2V5UmVzdDJBZGRyZXNzAAUJcmVzdDJBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFE29sZEFjcmVzQ29udHJhY3RLZXkFDm9sZEFjckNvbnRyYWN0BQNuaWwBaQEKc2V0QmxvY2tlZAEJaXNCbG9ja2VkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRcGVybWlzc2lvbiBkZW5pZWQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQprZXlCbG9ja2VkAAUJaXNCbG9ja2VkBQNuaWwBaQEMdW5zdGFrZUFjcmVzAQZhbW91bnQEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkAZwIAAAUGYW1vdW50CQACAQIZQW1vdW50IHNob3VsZCBiZSBwb3NpdGl2ZQQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQOYXJiUmVsZWFzZVRpbWUJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFC3dsZ0NvbnRyYWN0CQEZa2V5TGFzdFdsZ1RyYWRlVGltZUJ5VXNlcgEFB2FkZHJlc3MAAAUOYXJiaXRyYWdlRGVsYXkDCQBmAgUOYXJiUmVsZWFzZVRpbWUIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQACAQkArAICAi1Zb3UgdHJhZGVkIHNvbWUgV0xHT0xELCBjYW5ub3QgdW5zdGFrZSB1bnRpbCAJAKQDAQUOYXJiUmVsZWFzZVRpbWUEDSR0MDExNTUyMTE2MzIJARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAwkBAS0BBQZhbW91bnQFB2FkZHJlc3MAAAQHYWN0aW9ucwgFDSR0MDExNTUyMTE2MzICXzEEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAxMTU1MjExNjMyAl8yCQCUCgIJAM4IAgkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAUMYWNyZXNBc3NldElkBQ1wcm9sb2dBY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50AWkBCnN0YWtlQWNyZXMABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFDGFjcmVzQXNzZXRJZAkAAgECFEFDUkVTIHBheW1lbnRzIG9ubHkhBA0kdDAxMjA4MzEyMTU5CQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAMFA2FtdAUHYWRkcmVzcwAABAdhY3Rpb25zCAUNJHQwMTIwODMxMjE1OQJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDEyMDgzMTIxNTkCXzIJAJQKAgkAzggCBQdhY3Rpb25zBQ1wcm9sb2dBY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50AWkBCGJ1eUFjcmVzAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQKdXNkdEFtb3VudAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEDCQBmAgUFTVVMVDYFCnVzZHRBbW91bnQJAAIBCQCsAgIJAKwCAgIWTWluIHBheW1lbnQgc2hvdWxkIGJlIAkBCmZpeGVkUG9pbnQCBQVNVUxUNgAGAgUgVVNEVAQLYWNyZXNBbW91bnQJAGgCBQp1c2R0QW1vdW50BRVVU0RUMkFDUkVTX01VTFRJUExJRVIECXdsZ0Ftb3VudAkAawMFCnVzZHRBbW91bnQFBU1VTFQ4CQELZ2V0V2xnUHJpY2UBBQp1c2R0QW1vdW50BA9vbGRBY3Jlc0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDU4KQEFE29sZEFjcmVzQ29udHJhY3RLZXkEA3JlcQkA/AcEBQ9vbGRBY3Jlc0FkZHJlc3MCFHJlcXVlc3RBY3Jlc0NhbGxiYWNrCQDMCAIFC2FjcmVzQW1vdW50BQNuaWwFA25pbAMJAAACBQNyZXEFA3JlcQQJd2xnUmVtYWluCQEFYXNJbnQBCQD8BwQFC3dsZ0NvbnRyYWN0AgpidXJuV2xnb2xkCQDMCAIFCXdsZ0Ftb3VudAUDbmlsBQNuaWwJAJQKAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULYWNyZXNBbW91bnQFDGFjcmVzQXNzZXRJZAUDbmlsBQ1wcm9sb2dBY3Rpb25zBQl3bGdSZW1haW4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQYnV5QWNyZXNSRUFET05MWQEKdXNkdEFtb3VudAQLYWNyZXNBbW91bnQJAGgCBQp1c2R0QW1vdW50BRVVU0RUMkFDUkVTX01VTFRJUExJRVIECXdsZ1RvQnVybgkAawMFCnVzZHRBbW91bnQFBU1VTFQ4CQELZ2V0V2xnUHJpY2UBBQp1c2R0QW1vdW50CQCUCgIFA25pbAkAzAgCBQthY3Jlc0Ftb3VudAkAzAgCBQVNVUxUNgkAzAgCBQthY3Jlc0Ftb3VudAkAzAgCBQl3bGdUb0J1cm4FA25pbAFpAQlzZWxsQWNyZXMABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAthY3Jlc0Ftb3VudAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQxhY3Jlc0Fzc2V0SWQJAAIBAhRBQ1JFUyBwYXltZW50cyBvbmx5IQMJAGYCBQVNVUxUNwULYWNyZXNBbW91bnQJAAIBCQCsAgIJAKwCAgIWTWluIHBheW1lbnQgc2hvdWxkIGJlIAkBCmZpeGVkUG9pbnQCBQVNVUxUNwAIAgYgQUNSRVMEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBA0kdDAxNDAxNjE0MDY0CQERZ2V0U3dhcExpbWl0QWNyZXMABAtsaW1pdEFjdGlvbggFDSR0MDE0MDE2MTQwNjQCXzEEB21heFVzZHQIBQ0kdDAxNDAxNjE0MDY0Al8yBAhtYXhBY3JlcwkAaAIFB21heFVzZHQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgMJAGYCBQthY3Jlc0Ftb3VudAUIbWF4QWNyZXMJAAIBCQCsAgIJAKwCAgIRWW91IGNhbiBzZWxsIG1heCAJAQpmaXhlZFBvaW50AgUIbWF4QWNyZXMACAIGIEFDUkVTBAp1c2R0QW1vdW50CQBpAgkAaQIFC2FjcmVzQW1vdW50BRVVU0RUMkFDUkVTX01VTFRJUExJRVIAAgkAlAoCCQDOCAIJAMwIAgULbGltaXRBY3Rpb24JAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleUxhc3RMaW1pdExlZnQJAGUCBQdtYXhVc2R0BQp1c2R0QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKdXNkdEFtb3VudAULdXNkdEFzc2V0SWQFA25pbAUNcHJvbG9nQWN0aW9ucwUKdXNkdEFtb3VudAFpARFzZWxsQWNyZXNSRUFET05MWQIHYWRkcmVzcwthY3Jlc0Ftb3VudAQNJHQwMTQ1NjAxNDYwOAkBEWdldFN3YXBMaW1pdEFjcmVzAAQLbGltaXRBY3Rpb24IBQ0kdDAxNDU2MDE0NjA4Al8xBAdtYXhVc2R0CAUNJHQwMTQ1NjAxNDYwOAJfMgQKdXNkdEFtb3VudAkAaQIJAGkCBQthY3Jlc0Ftb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAAIJAJQKAgUDbmlsCQDMCAIFCnVzZHRBbW91bnQJAMwIAgUFTVVMVDcJAMwIAgkAaAIFB21heFVzZHQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgkAzAgCAAAFA25pbAFpARBjb252ZXJ0T2xkU3Rha2VzAAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECFFRlbXBvcmFyaWx5IGRpc2FibGVkBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBA9vbGRBY3Jlc0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDU4KQEFE29sZEFjcmVzQ29udHJhY3RLZXkEBmFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9vbGRBY3Jlc0FkZHJlc3MJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFB2FkZHJlc3MAAAQJZ290QWNyZXMwAwkAZgIFBmFtb3VudAAACQEMYXNUdXBsZTJJbnRzAQkA/AcEBQ9vbGRBY3Jlc0FkZHJlc3MCFHVuc3Rha2VBY3Jlc0NhbGxiYWNrCQDMCAIFBmFtb3VudAkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAkAlAoCAAAAAAQRb2xkU3Rha2luZ0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFFW9sZFN0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AAACBQhmaW5hbGl6ZQUIZmluYWxpemUEA3JlcQkA/AcEBQ9vbGRBY3Jlc0FkZHJlc3MCFHJlcXVlc3RBY3Jlc0NhbGxiYWNrCQDMCAIJAGQCCQBkAgkAZAIIBQJycgJfMQgFAnJyAl8yCAUCcnICXzMIBQJycgJfNAUDbmlsBQNuaWwDCQAAAgUDcmVxBQNyZXEEDSR0MDE2NDgwMTY1NjAJARBpc3N1ZU5GVGludGVybmFsAgUVSWR4RHR4M1BlcmNDb252ZXJzaW9uCAUBaQZjYWxsZXIECm5mdEFjdGlvbnMIBQ0kdDAxNjQ4MDE2NTYwAl8xBApuZnRBc3NldElkCAUNJHQwMTY0ODAxNjU2MAJfMgkAlwoFCAUCcnICXzEIBQJycgJfMggFAnJyAl8zCAUCcnICXzQFCm5mdEFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJcKBQAAAAAAAAAABQNuaWwEC2R1Y2tBc3NldElkCQELdmFsdWVPckVsc2UCCQCdCAIFEW9sZFN0YWtpbmdBZGRyZXNzCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQdhZGRyZXNzAgAECmR1Y2tSZXN1bHQDCQECIT0CBQtkdWNrQXNzZXRJZAIACQEMYXNUdXBsZTNJbnRzAQkA/AcEBRFvbGRTdGFraW5nQWRkcmVzcwITdW5zdGFrZUR1Y2tDYWxsYmFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAkAlQoDAAAAAAAABAF4CQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAMJAGQCCQBkAgkAZAIJAGQCCQBkAgkAZAIJAGQCCAUJZ290QWNyZXMwAl8xCAULbGFuZHNSZXN1bHQCXzEIBQtsYW5kc1Jlc3VsdAJfMggFC2xhbmRzUmVzdWx0Al8zCAULbGFuZHNSZXN1bHQCXzQIBQpkdWNrUmVzdWx0Al8xCAUKZHVja1Jlc3VsdAJfMggFCmR1Y2tSZXN1bHQCXzMFB2FkZHJlc3MAAAkAlAoCCQDOCAIIBQtsYW5kc1Jlc3VsdAJfNQgFAXgCXzEI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AAAAAAAJAJQKAgUDbmlsBQtsYW5kc1Jlc3VsdAFpARJzdGFrZUFjcmVzQ2FsbGJhY2sBBGFkZHIDCQECIT0CCAUBaQZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFFW9sZFN0YWtpbmdDb250cmFjdFN0cgkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAMICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQRhZGRyAAABaQEac2ltdWxhdGVTdGFrZUFjcmVzUkVBRE9OTFkCB2FkZHJlc3MLYWRkZWRBbW91bnQECWFtb3VudEtleQkBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQUHYWRkcmVzcwQObmV3QWNyZXNBbW91bnQJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAABQthZGRlZEFtb3VudAQIb2xkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSYWNyZXNTdGFrZFRvdGFsS2V5AAAECXVzZXJGcEtleQkBFWtleUZhcm1pbmdQb3dlckJ5VXNlcgEFB2FkZHJlc3MEBW9sZEZwCQELdmFsdWVPckVsc2UCCQCfCAEFCXVzZXJGcEtleQAABAl1c2VyQm9udXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARBrZXlVc2VyRnVsbEJvbnVzAQUHYWRkcmVzcwAABA0kdDAxODcyNTE4ODEyCQEeZ2V0RmFybWluZ1Bvd2VyQnlBY3Jlc0FuZEJvbnVzAgUObmV3QWNyZXNBbW91bnQFCXVzZXJCb251cwQMbmV3Qm9udXNlZEZwCAUNJHQwMTg3MjUxODgxMgJfMQQHaWdub3JlZAgFDSR0MDE4NzI1MTg4MTICXzIECm9sZFRvdGFsRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUdG90YWxGYXJtaW5nUG93ZXJLZXkAAAQKbmV3VG90YWxGcAkAZQIJAGQCBQpvbGRUb3RhbEZwBQxuZXdCb251c2VkRnAFBW9sZEZwCQCUCgIFA25pbAkAzAgCBQVvbGRGcAkAzAgCBQxuZXdCb251c2VkRnAJAMwIAgUKb2xkVG90YWxGcAkAzAgCBQpuZXdUb3RhbEZwBQNuaWwBaQEIaXNzdWVORlQCCmZvckFkZHJlc3MIbmZ0SW5kZXgDCQECIT0CCAUBaQZjYWxsZXIFC3dsZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQJARBpc3N1ZU5GVGludGVybmFsAgUIbmZ0SW5kZXgJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCmZvckFkZHJlc3MBaQEIc3Rha2VORlQABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHEV4YWN0bHkgb25lIHBheW1lbnQgcmVxdWlyZWQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AggFA3BtdAZhbW91bnQAAQkAAgECJ05GVCB0b2tlbiBzaG91bGQgYmUgYXR0YWNoZWQgYXMgcGF5bWVudAQHYXNzZXRJZAkBBXZhbHVlAQgFA3BtdAdhc3NldElkBAVhc3NldAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBAphc3NldElkU3RyCQDYBAEFB2Fzc2V0SWQEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBAduZnRzS2V5CQEUa2V5U3Rha2VkTkZUc0J5T3duZXIBBQRhZGRyBAduZnRzU3RyCQCiCAEFB25mdHNLZXkEBG5mdHMDCQEJaXNEZWZpbmVkAQUHbmZ0c1N0cgkAvAkCCQEFdmFsdWUBBQduZnRzU3RyAgFfBQNuaWwDCQEPY29udGFpbnNFbGVtZW50AgUEbmZ0cwUKYXNzZXRJZFN0cgkAAgEJAKwCAgIhWW91ciBzdGFrZWQgTkZUcyBhbHJlYWR5IGNvbnRhaW4gBQphc3NldElkU3RyAwkAZwIJAJADAQUEbmZ0cwUXTUFYX05GVFNfU1RBS0VEX0JZX1VTRVIJAAIBCQCsAgIJAKwCAgIZWW91ciBhbHJlYWR5IHN0YWtlZCBtYXggKAkApAMBBRdNQVhfTkZUU19TVEFLRURfQllfVVNFUgIGKSBORlRzBApsaXN0QWN0aW9uCQELU3RyaW5nRW50cnkCBQduZnRzS2V5CQC6CQIJAM0IAgUEbmZ0cwUKYXNzZXRJZFN0cgIBXwQEaXNXTAkAAAIIBQVhc3NldAZpc3N1ZXIFBHRoaXMDBQRpc1dMBAt3bE5mdE51bWJlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5VXNlcldsTmZ0TnVtYmVyAQUEYWRkcgAAAwkAZwIFC3dsTmZ0TnVtYmVyBQtNQVhfV0xfTkZUUwkAAgEJAKwCAgkArAICAhJZb3UgY2FuIHN0YWtlIG1heCAJAKQDAQULTUFYX1dMX05GVFMCEyBvZiBXYXZlc0xhbmRzIE5GVHMECGJvbnVzVmFsCQBoAgkBEmJvbnVzQnlEZXNjcmlwdGlvbgEJAQV2YWx1ZQEIBQVhc3NldAtkZXNjcmlwdGlvbgCQTgQNJHQwMjA1ODcyMDY2NQkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwDAAAFBGFkZHIFCGJvbnVzVmFsBAdhY3Rpb25zCAUNJHQwMjA1ODcyMDY2NQJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDIwNTg3MjA2NjUCXzIJAJQKAgkAzggCCQDNCAIJAM0IAgkAzQgCCQDNCAIFB2FjdGlvbnMFCmxpc3RBY3Rpb24JAQxJbnRlZ2VyRW50cnkCCQESa2V5VXNlcldsTmZ0TnVtYmVyAQUEYWRkcgkAZAIFC3dsTmZ0TnVtYmVyAAEJAQxJbnRlZ2VyRW50cnkCBRNrZXlXbE5mdFRvdGFsU3Rha2VkCQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRNrZXlXbE5mdFRvdGFsU3Rha2VkAAAAAQkBDEludGVnZXJFbnRyeQIJAR5rZXlTdGFrZWRUaW1lQnlBc3NldElkQW5kT3duZXICBQphc3NldElkU3RyBQRhZGRyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUNcHJvbG9nQWN0aW9ucwUQd2xnQ2xhaW1lZEFtb3VudAQLYXJraW1hbE5hbWUJAQ9pc0Fya2ltYWxJc3N1ZWQBBQVhc3NldAMJAAACBQthcmtpbWFsTmFtZQIACQACAQI0T25seSBXYXZlc0xhbmRzIGFuZCBBcmtpbWFscyBORlQgdG9rZW5zIGFyZSBhY2NlcHRlZAQMYXJrTmZ0TnVtYmVyCQELdmFsdWVPckVsc2UCCQCfCAEJARNrZXlVc2VyQXJrTmZ0TnVtYmVyAQUEYWRkcgAAAwkAZwIFDGFya05mdE51bWJlcgUMTUFYX0FSS19ORlRTCQACAQkArAICCQCsAgICEllvdSBjYW4gc3Rha2UgbWF4IAkApAMBBQxNQVhfQVJLX05GVFMCESBvZiBBcmtpbWFscyBORlRzBA0kdDAyMTQwMDIxNDgzCQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAMAAAUEYWRkcgUNQVJLX05GVF9CT05VUwQHYWN0aW9ucwgFDSR0MDIxNDAwMjE0ODMCXzEEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAyMTQwMDIxNDgzAl8yCQCUCgIJAM4IAgkAzQgCCQDNCAIJAM0IAgUHYWN0aW9ucwUKbGlzdEFjdGlvbgkBDEludGVnZXJFbnRyeQIJARNrZXlVc2VyQXJrTmZ0TnVtYmVyAQUEYWRkcgkAZAIFDGFya05mdE51bWJlcgABCQEMSW50ZWdlckVudHJ5AgkBHmtleVN0YWtlZFRpbWVCeUFzc2V0SWRBbmRPd25lcgIFCmFzc2V0SWRTdHIFBGFkZHIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQ1wcm9sb2dBY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50AWkBCnVuc3Rha2VORlQBCmFzc2V0SWRTdHIEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEB2Fzc2V0SWQJANkEAQUKYXNzZXRJZFN0cgQEYWRkcgkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQEB3RpbWVLZXkJAR5rZXlTdGFrZWRUaW1lQnlBc3NldElkQW5kT3duZXICBQphc3NldElkU3RyBQRhZGRyAwkBASEBCQEJaXNEZWZpbmVkAQkAnwgBBQd0aW1lS2V5CQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAhUgaXMgbm90IHN0YWtlZCBieSB5b3UEB25mdHNLZXkJARRrZXlTdGFrZWRORlRzQnlPd25lcgEFBGFkZHIEBG5mdHMJALwJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQduZnRzS2V5AgACAV8EA2lkeAkAzwgCBQRuZnRzBQphc3NldElkU3RyAwkBASEBCQEJaXNEZWZpbmVkAQUDaWR4CQACAQkArAICAh9Zb3VyIHN0YWtlZCBORlRzIGRvbid0IGNvbnRhaW4gBQphc3NldElkU3RyBApsaXN0QWN0aW9uAwkAZgIJAJADAQUEbmZ0cwABCQELU3RyaW5nRW50cnkCBQduZnRzS2V5CQC6CQIJANEIAgUEbmZ0cwkBBXZhbHVlAQUDaWR4AgFfCQELRGVsZXRlRW50cnkBBQduZnRzS2V5BARpc1dMCQAAAggFBWFzc2V0Bmlzc3VlcgUEdGhpcwMFBGlzV0wEC3dsTmZ0TnVtYmVyCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlVc2VyV2xOZnROdW1iZXIBBQRhZGRyAAAECGJvbnVzVmFsCQESYm9udXNCeURlc2NyaXB0aW9uAQkBBXZhbHVlAQgFBWFzc2V0C2Rlc2NyaXB0aW9uBA0kdDAyMjc5NjIyODc1CQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAMAAAUEYWRkcgkBAS0BBQhib251c1ZhbAQHYWN0aW9ucwgFDSR0MDIyNzk2MjI4NzUCXzEEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAyMjc5NjIyODc1Al8yCQCUCgIJAM4IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIFB2FjdGlvbnMFCmxpc3RBY3Rpb24JAQxJbnRlZ2VyRW50cnkCCQESa2V5VXNlcldsTmZ0TnVtYmVyAQUEYWRkcgkAZQIFC3dsTmZ0TnVtYmVyAAEJAQxJbnRlZ2VyRW50cnkCBRNrZXlXbE5mdFRvdGFsU3Rha2VkCQCWAwEJAMwIAgAACQDMCAIJAGUCCQELdmFsdWVPckVsc2UCCQCfCAEFE2tleVdsTmZ0VG90YWxTdGFrZWQAAAABBQNuaWwJAQtEZWxldGVFbnRyeQEJAR5rZXlTdGFrZWRUaW1lQnlBc3NldElkQW5kT3duZXICCQDYBAEFB2Fzc2V0SWQFBGFkZHIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdhc3NldElkBQ1wcm9sb2dBY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50BAthcmtpbWFsTmFtZQkBD2lzQXJraW1hbElzc3VlZAEFBWFzc2V0AwkAAAIFC2Fya2ltYWxOYW1lAgAJAAIBAjRPbmx5IFdhdmVzTGFuZHMgYW5kIEFya2ltYWxzIE5GVCB0b2tlbnMgYXJlIGFjY2VwdGVkBAxhcmtOZnROdW1iZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVVzZXJBcmtOZnROdW1iZXIBBQRhZGRyAAAEDSR0MDIzNTM1MjM2MTkJARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAwAABQRhZGRyCQEBLQEFDUFSS19ORlRfQk9OVVMEB2FjdGlvbnMIBQ0kdDAyMzUzNTIzNjE5Al8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMjM1MzUyMzYxOQJfMgkAlAoCCQDOCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgUHYWN0aW9ucwUKbGlzdEFjdGlvbgkBDEludGVnZXJFbnRyeQIJARNrZXlVc2VyQXJrTmZ0TnVtYmVyAQUEYWRkcgkAZQIFDGFya05mdE51bWJlcgABCQELRGVsZXRlRW50cnkBCQEea2V5U3Rha2VkVGltZUJ5QXNzZXRJZEFuZE93bmVyAgkA2AQBBQdhc3NldElkBQRhZGRyCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQUHYXNzZXRJZAUNcHJvbG9nQWN0aW9ucwUQd2xnQ2xhaW1lZEFtb3VudAFpAQxleGNoYW5nZU5GVHMABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAGYCAAMJAJADAQgFAWkIcGF5bWVudHMJAAIBAidNaW4gb25lIFVTRFQgYW5kIDIgTkZUIHBheW1lbnRzIGFsbG93ZWQDCQBmAgkAkAMBCAUBaQhwYXltZW50cwAGCQACAQInTWF4IG9uZSBVU0RUIGFuZCA1IE5GVCBwYXltZW50cyBhbGxvd2VkBARhZGRyCQClCAEIBQFpBmNhbGxlcgoBBWFkZFVwAgNhY2MDcG10BAdhc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIaV0FWRVMgcGF5bWVudHMgbm90IGFsbG93ZWQDCQAAAgUHYXNzZXRJZAULdXNkdEFzc2V0SWQJAJUKAwkAZAIIBQNhY2MCXzEIBQNwbXQGYW1vdW50CAUDYWNjAl8yCAUDYWNjAl8zBAVhc3NldAkBBXZhbHVlAQkA7AcBBQdhc3NldElkAwkBAiE9AggFBWFzc2V0Bmlzc3VlcgUEdGhpcwkAAgECG09ubHkgV0wtaXNzdWVkIE5GVHMgYWxsb3dlZAQJYm9udXNQZXJjCQESYm9udXNCeURlc2NyaXB0aW9uAQkBBXZhbHVlAQgFBWFzc2V0C2Rlc2NyaXB0aW9uCQCVCgMIBQNhY2MCXzEJAGQCCAUDYWNjAl8yBQlib251c1BlcmMJAM0IAggFA2FjYwJfMwkBBEJ1cm4CBQdhc3NldElkAAEEDSR0MDI0NzY3MjQ4NDYKAAIkbAgFAWkIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMAAAAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWFkZFVwAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGBAd1c2R0RmVlCAUNJHQwMjQ3NjcyNDg0NgJfMQQKdG90YWxCb251cwgFDSR0MDI0NzY3MjQ4NDYCXzIEC2J1cm5BY3Rpb25zCAUNJHQwMjQ3NjcyNDg0NgJfMwQIbmZ0SW5kZXgDCQAAAgUKdG90YWxCb251cwADAAIDCQAAAgUKdG90YWxCb251cwAFAAMDCQAAAgUKdG90YWxCb251cwAKAAQJAAIBAitPbmx5IGJvbnVzZXMgb2YgMyUsIDUlIG9yIDEwJSBhcmUgc3VwcG9ydGVkBAZjaGFuZ2UJAGUCCQBoAgUKdG90YWxCb251cwUFTVVMVDYFB3VzZHRGZWUDCQBmAgAABQZjaGFuZ2UJAAIBCQCsAgIJAKwCAgITWW91IG5lZWQgdG8gYXR0YWNoIAkBCmZpeGVkUG9pbnQCBQd1c2R0RmVlAAYCC1VTRFQgYXMgZmVlBA1jaGFuZ2VBY3Rpb25zAwkAZgIFBmNoYW5nZQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGY2hhbmdlBQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwEDSR0MDI1MzAyMjUzNzQJARBpc3N1ZU5GVGludGVybmFsAgUIbmZ0SW5kZXgIBQFpBmNhbGxlcgQPaXNzdWVOZnRBY3Rpb25zCAUNJHQwMjUzMDIyNTM3NAJfMQQKbmZ0QXNzZXRJZAgFDSR0MDI1MzAyMjUzNzQCXzIEBmJ1cm5lZAkAkAMBBQtidXJuQWN0aW9ucwQSYnVybkNvdW50ZXJBY3Rpb25zAwkAAAIFBmJ1cm5lZAAABQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtleU5mdFRvdGFsQnVybmVkCQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRFrZXlOZnRUb3RhbEJ1cm5lZAAABQZidXJuZWQFA25pbAkAlAoCCQDNCAIJAM4IAgkAzggCCQDOCAIJAM4IAgUPaXNzdWVOZnRBY3Rpb25zBQtidXJuQWN0aW9ucwUSYnVybkNvdW50ZXJBY3Rpb25zBQ1wcm9sb2dBY3Rpb25zBQ1jaGFuZ2VBY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQUKbmZ0QXNzZXRJZAUKbmZ0QXNzZXRJZADBLHIh", "height": 3388750, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Zk8XVMXX2T4gnc1TS89DCtaVdPYNeAdvdfDtTJBfRyu Next: 4MKEc2fnEqbc7CMUKJ8nD55xbgA4f6ibjxY96i7FPHEQ Diff:
OldNewDifferences
202202 let MAX_NFTS_STAKED_BY_USER = 4
203203
204204 let keyNftTotalIssued = "nftTotalIssued"
205+
206+let keyNftTotalBurned = "nftTotalBurned"
207+
208+let keyWlNftTotalStaked = "WlNftTotalStaked"
205209
206210 func keyNftNumberByAssetId (assetId) = ("nftNumberByAssetId_" + assetId)
207211
743747 let $t02058720665 = stakeUnstakeAcresInternal(0, addr, bonusVal)
744748 let actions = $t02058720665._1
745749 let wlgClaimedAmount = $t02058720665._2
746- $Tuple2(((((actions :+ listAction) :+ IntegerEntry(keyUserWlNftNumber(addr), (wlNftNumber + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)) ++ prologActions), wlgClaimedAmount)
750+ $Tuple2((((((actions :+ listAction) :+ IntegerEntry(keyUserWlNftNumber(addr), (wlNftNumber + 1))) :+ IntegerEntry(keyWlNftTotalStaked, (valueOrElse(getInteger(keyWlNftTotalStaked), 0) + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)) ++ prologActions), wlgClaimedAmount)
747751 }
748752 }
749753 else {
755759 if ((arkNftNumber >= MAX_ARK_NFTS))
756760 then throw((("You can stake max " + toString(MAX_ARK_NFTS)) + " of Arkimals NFTs"))
757761 else {
758- let $t02130721390 = stakeUnstakeAcresInternal(0, addr, ARK_NFT_BONUS)
759- let actions = $t02130721390._1
760- let wlgClaimedAmount = $t02130721390._2
762+ let $t02140021483 = stakeUnstakeAcresInternal(0, addr, ARK_NFT_BONUS)
763+ let actions = $t02140021483._1
764+ let wlgClaimedAmount = $t02140021483._2
761765 $Tuple2(((((actions :+ listAction) :+ IntegerEntry(keyUserArkNftNumber(addr), (arkNftNumber + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)) ++ prologActions), wlgClaimedAmount)
762766 }
763767 }
796800 then {
797801 let wlNftNumber = valueOrElse(getInteger(keyUserWlNftNumber(addr)), 0)
798802 let bonusVal = bonusByDescription(value(asset.description))
799- let $t02270322782 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
800- let actions = $t02270322782._1
801- let wlgClaimedAmount = $t02270322782._2
802- $Tuple2((((((actions :+ listAction) :+ IntegerEntry(keyUserWlNftNumber(addr), (wlNftNumber - 1))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
803+ let $t02279622875 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
804+ let actions = $t02279622875._1
805+ let wlgClaimedAmount = $t02279622875._2
806+ $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)
803807 }
804808 else {
805809 let arkimalName = isArkimalIssued(asset)
807811 then throw("Only WavesLands and Arkimals NFT tokens are accepted")
808812 else {
809813 let arkNftNumber = valueOrElse(getInteger(keyUserArkNftNumber(addr)), 0)
810- let $t02333923423 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
811- let actions = $t02333923423._1
812- let wlgClaimedAmount = $t02333923423._2
814+ let $t02353523619 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
815+ let actions = $t02353523619._1
816+ let wlgClaimedAmount = $t02353523619._2
813817 $Tuple2((((((actions :+ listAction) :+ IntegerEntry(keyUserArkNftNumber(addr), (arkNftNumber - 1))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
814818 }
815819 }
844848 }
845849 }
846850
847- let $t02457124650 = {
851+ let $t02476724846 = {
848852 let $l = i.payments
849853 let $s = size($l)
850854 let $acc0 = $Tuple3(0, 0, nil)
858862
859863 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
860864 }
861- let usdtFee = $t02457124650._1
862- let totalBonus = $t02457124650._2
863- let burnActions = $t02457124650._3
865+ let usdtFee = $t02476724846._1
866+ let totalBonus = $t02476724846._2
867+ let burnActions = $t02476724846._3
864868 let nftIndex = if ((totalBonus == 3))
865869 then 2
866870 else if ((totalBonus == 5))
875879 let changeActions = if ((change > 0))
876880 then [ScriptTransfer(i.caller, change, usdtAssetId)]
877881 else nil
878- let $t02510625173 = issueNFTinternal(nftIndex, i.caller)
879- let nftActions = $t02510625173._1
880- let nftAssetId = $t02510625173._2
881- $Tuple2(((((nftActions ++ burnActions) ++ prologActions) ++ changeActions) :+ ScriptTransfer(i.caller, 1, nftAssetId)), nftAssetId)
882+ let $t02530225374 = issueNFTinternal(nftIndex, i.caller)
883+ let issueNftActions = $t02530225374._1
884+ let nftAssetId = $t02530225374._2
885+ let burned = size(burnActions)
886+ let burnCounterActions = if ((burned == 0))
887+ then nil
888+ else [IntegerEntry(keyNftTotalBurned, (valueOrElse(getInteger(keyNftTotalBurned), 0) + burned))]
889+ $Tuple2((((((issueNftActions ++ burnActions) ++ burnCounterActions) ++ prologActions) ++ changeActions) :+ ScriptTransfer(i.caller, 1, nftAssetId)), nftAssetId)
882890 }
883891 }
884892 }
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"
205+
206+let keyNftTotalBurned = "nftTotalBurned"
207+
208+let keyWlNftTotalStaked = "WlNftTotalStaked"
205209
206210 func keyNftNumberByAssetId (assetId) = ("nftNumberByAssetId_" + assetId)
207211
208212
209213 func keyUserWlNftNumber (addr) = ("userWlNftNumber_" + addr)
210214
211215
212216 func keyUserArkNftNumber (addr) = ("userArkNftNumber_" + addr)
213217
214218
215219 func keyUserFullBonus (addr) = ("userFullBonus_" + addr)
216220
217221
218222 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
219223
220224 func getLevelByAcres (acres) = {
221225 let acr = ((acres + 99999999) / M8_)
222226 func checker (acc,item) = if ((item >= acr))
223227 then acc
224228 else (acc + 1)
225229
226230 let $l = levelAcres
227231 let $s = size($l)
228232 let $acc0 = 0
229233 func $f0_1 ($a,$i) = if (($i >= $s))
230234 then $a
231235 else checker($a, $l[$i])
232236
233237 func $f0_2 ($a,$i) = if (($i >= $s))
234238 then $a
235239 else throw("List size exceeds 10")
236240
237241 $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)
238242 }
239243
240244
241245 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
242246
243247
244248 func getFarmingPowerByAcresAndBonus (acres,bonus6) = {
245249 let notBonused = getFarmingPowerByAcres(acres)
246250 $Tuple2(fraction(notBonused, (M6_ + bonus6), M6_), notBonused)
247251 }
248252
249253
250254 func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
251255
252256
253257 let keyLastAcresSellTime = "lastAcresSellTime"
254258
255259 let keyLastLimitLeft = "lastLimitLeft"
256260
257261 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\"}"]
258262
259263 let nftNames = ["SHOVEL-P3", "PICKAXE-C1", "PICKAXE-C3", "PICKAXE-C5", "PICKAXE-C10"]
260264
261265 let contentKeys = ["contentShovelP3", "contentPickaxeC1", "contentPickaxeC3", "contentPickaxeC5", "contentPickaxeC10"]
262266
263267 let URL = "\"url\": \"https://waveslands.com\", "
264268
265269 func prolog (i) = if (if ((i.originCaller != rest2Contract))
266270 then valueOrElse(getBoolean(keyBlocked()), false)
267271 else false)
268272 then throw("Contracts are under maintenance")
269273 else {
270274 let addr = toString(i.originCaller)
271275 let week = (height / WEEK_BLOCKS)
272276 let lastWeekTxIdByUser = getString(keyLastWeekTxIdByUser(addr))
273277 let txId = toBase58String(i.transactionId)
274278 let wtx = ((toString(week) + "_") + txId)
275279 if (isDefined(lastWeekTxIdByUser))
276280 then {
277281 let lastWeekTx = split(value(lastWeekTxIdByUser), "_")
278282 if ((lastWeekTx[0] == toString(week)))
279283 then [StringEntry(keyLastWeekTxIdByUser(addr), wtx), StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
280284 else if ((lastWeekTx[0] == toString((week - 1))))
281285 then [StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
282286 else {
283287 let curWeekTxIdByUser = getStringValue(keyLastWeekTxIdByUser(addr))
284288 let curWeekTx = split(curWeekTxIdByUser, "_")
285289 if ((curWeekTx[0] == toString(week)))
286290 then [StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
287291 else [StringEntry(keyLastWeekTxIdByUser(addr), curWeekTxIdByUser), StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
288292 }
289293 }
290294 else [StringEntry(keyLastWeekTxIdByUser(addr), wtx), StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
291295 }
292296
293297
294298 func issueNFTinternal (nftIndex,addr) = if ((nftIndex >= size(contentKeys)))
295299 then throw("nftIndex out of bounds")
296300 else {
297301 let nftSerial = (valueOrElse(getInteger(keyNftTotalIssued), -1) + 1)
298302 let issue = Issue(nftNames[nftIndex], (((((("{" + URL) + "\"contentKey\": \"") + contentKeys[nftIndex]) + "\", \"number\": ") + toString(nftSerial)) + nftDescriptions[nftIndex]), 1, 0, false)
299303 let nftAssetId = calculateAssetId(issue)
300304 $Tuple2([issue, IntegerEntry(keyNftTotalIssued, nftSerial), IntegerEntry(keyNftNumberByAssetId(toBase58String(nftAssetId)), nftSerial), ScriptTransfer(addr, 1, nftAssetId)], nftAssetId)
301305 }
302306
303307
304308 func stakeUnstakeAcresInternal (amt,address,bonusDelta) = if (if ((amt == 0))
305309 then (bonusDelta == 0)
306310 else false)
307311 then throw("Nothing to do")
308312 else {
309313 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
310314 if ((wlgResult == wlgResult))
311315 then {
312316 let now = lastBlock.timestamp
313317 let timeKey = keyAcresStakedTimeByUser(address)
314318 let amountKey = keyAcresStakedAmtByUser(address)
315319 let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
316320 if (if ((0 > amt))
317321 then (0 > (oldAcresAmount + amt))
318322 else false)
319323 then throw(((("You have only " + fixedPoint(oldAcresAmount, 8)) + " ACRES staked, tried to unstake ") + fixedPoint(-(amt), 8)))
320324 else {
321325 let newAcresAmount = (oldAcresAmount + amt)
322326 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
323327 let userFpKey = keyFarmingPowerByUser(address)
324328 let oldFp = valueOrElse(getInteger(userFpKey), 0)
325329 let bonusKey = keyUserFullBonus(address)
326330 let oldBonus = valueOrElse(getInteger(acres2Contract, bonusKey), 0)
327331 if (if ((0 > bonusDelta))
328332 then (0 > (oldBonus + bonusDelta))
329333 else false)
330334 then throw((((("You have only " + fixedPoint(oldBonus, 4)) + "% bonus, and tried to unstake ") + fixedPoint(-(bonusDelta), 4)) + "%"))
331335 else {
332336 let $t059586057 = getFarmingPowerByAcresAndBonus(newAcresAmount, (oldBonus + bonusDelta))
333337 let newBonusedFp = $t059586057._1
334338 let ignored = $t059586057._2
335339 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
336340 let acresActions = if ((amt == 0))
337341 then nil
338342 else [IntegerEntry(amountKey, newAcresAmount), IntegerEntry(acresStakdTotalKey, (oldTotal + amt))]
339343 $Tuple2(((((acresActions :+ IntegerEntry(timeKey, lastBlock.timestamp)) :+ IntegerEntry(userFpKey, newBonusedFp)) :+ IntegerEntry(totalFarmingPowerKey, ((oldTotalFp + newBonusedFp) - oldFp))) :+ IntegerEntry(bonusKey, (oldBonus + bonusDelta))), wlgResult)
340344 }
341345 }
342346 }
343347 else throw("Strict value is not equal to itself.")
344348 }
345349
346350
347351 func getWlgPrice (usdtBalanceCorrection) = {
348352 let issuedAmount = valueOrErrorMessage(getInteger(wlgContract, wlgIssuedAmtKey), "WLGOLD is not issued yet")
349353 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
350354 let acres2Usd = (assetBalance(acres2Contract, usdtAssetId) - usdtBalanceCorrection)
351355 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
352356 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
353357 fraction(totalFundsUsd, MULT8, issuedAmount)
354358 }
355359
356360
357361 func getSwapLimitAcres () = {
358362 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
359363 let acres2Usd = assetBalance(this, usdtAssetId)
360364 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
361365 let defaultLimit = (((acres2Usd + wlgUsd) + investFundTotal) / ONE_PERCENT_DIVISOR)
362366 let lastLimitLeft = valueOrElse(getInteger(keyLastLimitLeft), defaultLimit)
363367 let lastTime = valueOrElse(getInteger(keyLastAcresSellTime), 0)
364368 let now = lastBlock.timestamp
365369 let currentLimit = (lastLimitLeft + fraction(defaultLimit, (now - lastTime), DAY_MILLIS))
366370 let limitLeftUsdt = min([currentLimit, defaultLimit])
367371 $Tuple2(IntegerEntry(keyLastAcresSellTime, now), limitLeftUsdt)
368372 }
369373
370374
371375 let arkOracle = addressFromStringValue("3PJgZ6AK1WVCpdCmEZpesHmaKvrQDdXG5og")
372376
373377 let incubator = valueOrElse(getString(arkOracle, "static_incubatorAddress"), "")
374378
375379 let breeder = valueOrElse(getString(arkOracle, "static_breederAddress"), "")
376380
377381 let turtleIncubator = valueOrElse(getString(arkOracle, "static_turtleIncubatorAddress"), "")
378382
379383 let turtleBreeder = valueOrElse(getString(arkOracle, "static_turtleBreederAddress"), "")
380384
381385 let canineIncubator = valueOrElse(getString(arkOracle, "static_canineIncubatorAddress"), "")
382386
383387 let canineBreeder = valueOrElse(getString(arkOracle, "static_canineBreederAddress"), "")
384388
385389 let felineIncubator = valueOrElse(getString(arkOracle, "static_felineIncubatorAddress"), "")
386390
387391 let felineBreeder = valueOrElse(getString(arkOracle, "static_felineBreederAddress"), "")
388392
389393 let mutantBreeder = valueOrElse(getString(arkOracle, "static_mutantIncubatorAddress"), "")
390394
391395 func isArkimalIssued (nfo) = {
392396 let issuer = toString(nfo.issuer)
393397 if (if (if (if (if (if (if (if ((issuer == incubator))
394398 then true
395399 else (issuer == breeder))
396400 then true
397401 else (issuer == turtleIncubator))
398402 then true
399403 else (issuer == turtleBreeder))
400404 then true
401405 else (issuer == canineIncubator))
402406 then true
403407 else (issuer == canineBreeder))
404408 then true
405409 else (issuer == felineIncubator))
406410 then true
407411 else (issuer == felineBreeder))
408412 then nfo.name
409413 else if ((issuer == mutantBreeder))
410414 then nfo.description
411415 else ""
412416 }
413417
414418
415419 func bonusByDescription (descr) = if (!(contains(descr, "\"bonusType\": \"FarmPower\"")))
416420 then throw(("NFT is not supported: " + descr))
417421 else {
418422 let bonusStr = split_4C(split_4C(descr, "\"bonus\":")[1], ",")[0]
419423 parseIntValue(drop(bonusStr, (valueOrElse(lastIndexOf(bonusStr, " "), -1) + 1)))
420424 }
421425
422426
423427 @Callable(i)
424428 func saveLastTx () = if (!(containsElement([wlgContract], i.caller)))
425429 then throw("Access denied")
426430 else $Tuple2(prolog(i), 42)
427431
428432
429433
430434 @Callable(i)
431435 func constructorV1 (rest2Addr,oldAcrContract) = if ((i.caller != this))
432436 then throw("Permission denied")
433437 else {
434438 let oldAcrContAddr = addressFromStringValue(oldAcrContract)
435439 [IntegerEntry(acresIssuedAmountKey, getIntegerValue(oldAcrContAddr, acresIssuedAmountKey)), BinaryEntry(acresAssetIdKey, getBinaryValue(oldAcrContAddr, acresAssetIdKey)), StringEntry(keyRest2Address(), rest2Addr), StringEntry(oldAcresContractKey, oldAcrContract)]
436440 }
437441
438442
439443
440444 @Callable(i)
441445 func setBlocked (isBlocked) = if ((i.caller != this))
442446 then throw("permission denied")
443447 else [BooleanEntry(keyBlocked(), isBlocked)]
444448
445449
446450
447451 @Callable(i)
448452 func unstakeAcres (amount) = {
449453 let prologActions = prolog(i)
450454 if ((0 >= amount))
451455 then throw("Amount should be positive")
452456 else {
453457 let address = toString(i.caller)
454458 if ((size(i.payments) != 0))
455459 then throw("No payments required")
456460 else {
457461 let arbReleaseTime = (valueOrElse(getInteger(wlgContract, keyLastWlgTradeTimeByUser(address)), 0) + arbitrageDelay)
458462 if ((arbReleaseTime > lastBlock.timestamp))
459463 then throw(("You traded some WLGOLD, cannot unstake until " + toString(arbReleaseTime)))
460464 else {
461465 let $t01155211632 = stakeUnstakeAcresInternal(-(amount), address, 0)
462466 let actions = $t01155211632._1
463467 let wlgClaimedAmount = $t01155211632._2
464468 $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
465469 }
466470 }
467471 }
468472 }
469473
470474
471475
472476 @Callable(i)
473477 func stakeAcres () = {
474478 let prologActions = prolog(i)
475479 let address = toString(i.caller)
476480 if ((size(i.payments) != 1))
477481 then throw("exactly 1 payment must be attached")
478482 else {
479483 let pmt = i.payments[0]
480484 let amt = pmt.amount
481485 if (if (!(isDefined(pmt.assetId)))
482486 then true
483487 else (value(pmt.assetId) != acresAssetId))
484488 then throw("ACRES payments only!")
485489 else {
486490 let $t01208312159 = stakeUnstakeAcresInternal(amt, address, 0)
487491 let actions = $t01208312159._1
488492 let wlgClaimedAmount = $t01208312159._2
489493 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
490494 }
491495 }
492496 }
493497
494498
495499
496500 @Callable(i)
497501 func buyAcres () = {
498502 let prologActions = prolog(i)
499503 if ((size(i.payments) != 1))
500504 then throw("exactly 1 payment must be attached")
501505 else {
502506 let pmt = i.payments[0]
503507 let usdtAmount = pmt.amount
504508 if (if (!(isDefined(pmt.assetId)))
505509 then true
506510 else (value(pmt.assetId) != usdtAssetId))
507511 then throw("USDT payments only!")
508512 else if ((MULT6 > usdtAmount))
509513 then throw((("Min payment should be " + fixedPoint(MULT6, 6)) + " USDT"))
510514 else {
511515 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
512516 let wlgAmount = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
513517 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
514518 let req = invoke(oldAcresAddress, "requestAcresCallback", [acresAmount], nil)
515519 if ((req == req))
516520 then {
517521 let wlgRemain = asInt(invoke(wlgContract, "burnWlgold", [wlgAmount], nil))
518522 $Tuple2(([ScriptTransfer(i.caller, acresAmount, acresAssetId)] ++ prologActions), wlgRemain)
519523 }
520524 else throw("Strict value is not equal to itself.")
521525 }
522526 }
523527 }
524528
525529
526530
527531 @Callable(i)
528532 func buyAcresREADONLY (usdtAmount) = {
529533 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
530534 let wlgToBurn = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
531535 $Tuple2(nil, [acresAmount, MULT6, acresAmount, wlgToBurn])
532536 }
533537
534538
535539
536540 @Callable(i)
537541 func sellAcres () = {
538542 let prologActions = prolog(i)
539543 if ((size(i.payments) != 1))
540544 then throw("exactly 1 payment must be attached")
541545 else {
542546 let pmt = i.payments[0]
543547 let acresAmount = pmt.amount
544548 if (if (!(isDefined(pmt.assetId)))
545549 then true
546550 else (value(pmt.assetId) != acresAssetId))
547551 then throw("ACRES payments only!")
548552 else if ((MULT7 > acresAmount))
549553 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
550554 else {
551555 let addr = toString(i.caller)
552556 let $t01401614064 = getSwapLimitAcres()
553557 let limitAction = $t01401614064._1
554558 let maxUsdt = $t01401614064._2
555559 let maxAcres = (maxUsdt * USDT2ACRES_MULTIPLIER)
556560 if ((acresAmount > maxAcres))
557561 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
558562 else {
559563 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
560564 $Tuple2(([limitAction, IntegerEntry(keyLastLimitLeft, (maxUsdt - usdtAmount)), ScriptTransfer(i.caller, usdtAmount, usdtAssetId)] ++ prologActions), usdtAmount)
561565 }
562566 }
563567 }
564568 }
565569
566570
567571
568572 @Callable(i)
569573 func sellAcresREADONLY (address,acresAmount) = {
570574 let $t01456014608 = getSwapLimitAcres()
571575 let limitAction = $t01456014608._1
572576 let maxUsdt = $t01456014608._2
573577 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
574578 $Tuple2(nil, [usdtAmount, MULT7, (maxUsdt * USDT2ACRES_MULTIPLIER), 0])
575579 }
576580
577581
578582
579583 @Callable(i)
580584 func convertOldStakes () = if ((i.caller != this))
581585 then throw("Temporarily disabled")
582586 else {
583587 let address = toString(i.caller)
584588 if ((size(i.payments) != 0))
585589 then throw("No payments required")
586590 else {
587591 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
588592 let amount = valueOrElse(getInteger(oldAcresAddress, keyAcresStakedAmtByUser(address)), 0)
589593 let gotAcres0 = if ((amount > 0))
590594 then asTuple2Ints(invoke(oldAcresAddress, "unstakeAcresCallback", [amount, address], nil))
591595 else $Tuple2(0, 0)
592596 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
593597 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
594598 let landsResult = if (isDefined(landsStr))
595599 then {
596600 let lands = split_51C(value(landsStr), "_")
597601 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
598602 then throw("landAssetId is required")
599603 else {
600604 let r = asTuple5Ints(invoke(oldStakingAddress, "unstakeLandCallback", [landAssetId, address], nil))
601605 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
602606 }
603607
604608 let rr = {
605609 let $l = lands
606610 let $s = size($l)
607611 let $acc0 = $Tuple4(0, 0, 0, 0)
608612 func $f0_1 ($a,$i) = if (($i >= $s))
609613 then $a
610614 else oneLand($a, $l[$i])
611615
612616 func $f0_2 ($a,$i) = if (($i >= $s))
613617 then $a
614618 else throw("List size exceeds 100")
615619
616620 $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)
617621 }
618622 let finalize = invoke(oldStakingAddress, "unstakeLandsFinalizeCallback", [address], nil)
619623 if ((finalize == finalize))
620624 then {
621625 let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
622626 if ((req == req))
623627 then {
624628 let $t01648016560 = issueNFTinternal(IdxDtx3PercConversion, i.caller)
625629 let nftActions = $t01648016560._1
626630 let nftAssetId = $t01648016560._2
627631 $Tuple5(rr._1, rr._2, rr._3, rr._4, nftActions)
628632 }
629633 else throw("Strict value is not equal to itself.")
630634 }
631635 else throw("Strict value is not equal to itself.")
632636 }
633637 else $Tuple5(0, 0, 0, 0, nil)
634638 let duckAssetId = valueOrElse(getString(oldStakingAddress, keyStakedDuckByOwner(address)), "")
635639 let duckResult = if ((duckAssetId != ""))
636640 then asTuple3Ints(invoke(oldStakingAddress, "unstakeDuckCallback", [duckAssetId, address], nil))
637641 else $Tuple3(0, 0, 0)
638642 let x = stakeUnstakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address, 0)
639643 $Tuple2((landsResult._5 ++ x._1), x._2)
640644 }
641645 }
642646
643647
644648
645649 @Callable(i)
646650 func unstakeLandsREADONLY (address) = {
647651 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
648652 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
649653 let landsResult = if (isDefined(landsStr))
650654 then {
651655 let lands = split_51C(value(landsStr), "_")
652656 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
653657 then throw("landAssetId is required")
654658 else {
655659 let r = asTuple4Ints(invoke(oldStakingAddress, "unstakeLandREADONLY", [landAssetId, address], nil))
656660 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
657661 }
658662
659663 let $l = lands
660664 let $s = size($l)
661665 let $acc0 = $Tuple4(0, 0, 0, 0)
662666 func $f0_1 ($a,$i) = if (($i >= $s))
663667 then $a
664668 else oneLand($a, $l[$i])
665669
666670 func $f0_2 ($a,$i) = if (($i >= $s))
667671 then $a
668672 else throw("List size exceeds 100")
669673
670674 $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)
671675 }
672676 else $Tuple4(0, 0, 0, 0)
673677 $Tuple2(nil, landsResult)
674678 }
675679
676680
677681
678682 @Callable(i)
679683 func stakeAcresCallback (addr) = if ((i.caller != addressFromStringValue(oldStakingContractStr)))
680684 then throw("Permission denied")
681685 else stakeUnstakeAcresInternal(i.payments[0].amount, addr, 0)
682686
683687
684688
685689 @Callable(i)
686690 func simulateStakeAcresREADONLY (address,addedAmount) = {
687691 let amountKey = keyAcresStakedAmtByUser(address)
688692 let newAcresAmount = (valueOrElse(getInteger(amountKey), 0) + addedAmount)
689693 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
690694 let userFpKey = keyFarmingPowerByUser(address)
691695 let oldFp = valueOrElse(getInteger(userFpKey), 0)
692696 let userBonus = valueOrElse(getInteger(acres2Contract, keyUserFullBonus(address)), 0)
693697 let $t01872518812 = getFarmingPowerByAcresAndBonus(newAcresAmount, userBonus)
694698 let newBonusedFp = $t01872518812._1
695699 let ignored = $t01872518812._2
696700 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
697701 let newTotalFp = ((oldTotalFp + newBonusedFp) - oldFp)
698702 $Tuple2(nil, [oldFp, newBonusedFp, oldTotalFp, newTotalFp])
699703 }
700704
701705
702706
703707 @Callable(i)
704708 func issueNFT (forAddress,nftIndex) = if ((i.caller != wlgContract))
705709 then throw("Permission denied")
706710 else issueNFTinternal(nftIndex, addressFromStringValue(forAddress))
707711
708712
709713
710714 @Callable(i)
711715 func stakeNFT () = {
712716 let prologActions = prolog(i)
713717 if ((size(i.payments) != 1))
714718 then throw("Exactly one payment required")
715719 else {
716720 let pmt = value(i.payments[0])
717721 if ((pmt.amount != 1))
718722 then throw("NFT token should be attached as payment")
719723 else {
720724 let assetId = value(pmt.assetId)
721725 let asset = value(assetInfo(assetId))
722726 let assetIdStr = toBase58String(assetId)
723727 let addr = toString(i.caller)
724728 let nftsKey = keyStakedNFTsByOwner(addr)
725729 let nftsStr = getString(nftsKey)
726730 let nfts = if (isDefined(nftsStr))
727731 then split_4C(value(nftsStr), "_")
728732 else nil
729733 if (containsElement(nfts, assetIdStr))
730734 then throw(("Your staked NFTs already contain " + assetIdStr))
731735 else if ((size(nfts) >= MAX_NFTS_STAKED_BY_USER))
732736 then throw((("Your already staked max (" + toString(MAX_NFTS_STAKED_BY_USER)) + ") NFTs"))
733737 else {
734738 let listAction = StringEntry(nftsKey, makeString_2C((nfts :+ assetIdStr), "_"))
735739 let isWL = (asset.issuer == this)
736740 if (isWL)
737741 then {
738742 let wlNftNumber = valueOrElse(getInteger(keyUserWlNftNumber(addr)), 0)
739743 if ((wlNftNumber >= MAX_WL_NFTS))
740744 then throw((("You can stake max " + toString(MAX_WL_NFTS)) + " of WavesLands NFTs"))
741745 else {
742746 let bonusVal = (bonusByDescription(value(asset.description)) * 10000)
743747 let $t02058720665 = stakeUnstakeAcresInternal(0, addr, bonusVal)
744748 let actions = $t02058720665._1
745749 let wlgClaimedAmount = $t02058720665._2
746- $Tuple2(((((actions :+ listAction) :+ IntegerEntry(keyUserWlNftNumber(addr), (wlNftNumber + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)) ++ prologActions), wlgClaimedAmount)
750+ $Tuple2((((((actions :+ listAction) :+ IntegerEntry(keyUserWlNftNumber(addr), (wlNftNumber + 1))) :+ IntegerEntry(keyWlNftTotalStaked, (valueOrElse(getInteger(keyWlNftTotalStaked), 0) + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)) ++ prologActions), wlgClaimedAmount)
747751 }
748752 }
749753 else {
750754 let arkimalName = isArkimalIssued(asset)
751755 if ((arkimalName == ""))
752756 then throw("Only WavesLands and Arkimals NFT tokens are accepted")
753757 else {
754758 let arkNftNumber = valueOrElse(getInteger(keyUserArkNftNumber(addr)), 0)
755759 if ((arkNftNumber >= MAX_ARK_NFTS))
756760 then throw((("You can stake max " + toString(MAX_ARK_NFTS)) + " of Arkimals NFTs"))
757761 else {
758- let $t02130721390 = stakeUnstakeAcresInternal(0, addr, ARK_NFT_BONUS)
759- let actions = $t02130721390._1
760- let wlgClaimedAmount = $t02130721390._2
762+ let $t02140021483 = stakeUnstakeAcresInternal(0, addr, ARK_NFT_BONUS)
763+ let actions = $t02140021483._1
764+ let wlgClaimedAmount = $t02140021483._2
761765 $Tuple2(((((actions :+ listAction) :+ IntegerEntry(keyUserArkNftNumber(addr), (arkNftNumber + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)) ++ prologActions), wlgClaimedAmount)
762766 }
763767 }
764768 }
765769 }
766770 }
767771 }
768772 }
769773
770774
771775
772776 @Callable(i)
773777 func unstakeNFT (assetIdStr) = {
774778 let prologActions = prolog(i)
775779 if ((size(i.payments) != 0))
776780 then throw("No payments required")
777781 else {
778782 let assetId = fromBase58String(assetIdStr)
779783 let addr = toString(i.caller)
780784 let asset = value(assetInfo(assetId))
781785 let timeKey = keyStakedTimeByAssetIdAndOwner(assetIdStr, addr)
782786 if (!(isDefined(getInteger(timeKey))))
783787 then throw((("NFT " + asset.name) + " is not staked by you"))
784788 else {
785789 let nftsKey = keyStakedNFTsByOwner(addr)
786790 let nfts = split_4C(valueOrElse(getString(nftsKey), ""), "_")
787791 let idx = indexOf(nfts, assetIdStr)
788792 if (!(isDefined(idx)))
789793 then throw(("Your staked NFTs don't contain " + assetIdStr))
790794 else {
791795 let listAction = if ((size(nfts) > 1))
792796 then StringEntry(nftsKey, makeString_2C(removeByIndex(nfts, value(idx)), "_"))
793797 else DeleteEntry(nftsKey)
794798 let isWL = (asset.issuer == this)
795799 if (isWL)
796800 then {
797801 let wlNftNumber = valueOrElse(getInteger(keyUserWlNftNumber(addr)), 0)
798802 let bonusVal = bonusByDescription(value(asset.description))
799- let $t02270322782 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
800- let actions = $t02270322782._1
801- let wlgClaimedAmount = $t02270322782._2
802- $Tuple2((((((actions :+ listAction) :+ IntegerEntry(keyUserWlNftNumber(addr), (wlNftNumber - 1))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
803+ let $t02279622875 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
804+ let actions = $t02279622875._1
805+ let wlgClaimedAmount = $t02279622875._2
806+ $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)
803807 }
804808 else {
805809 let arkimalName = isArkimalIssued(asset)
806810 if ((arkimalName == ""))
807811 then throw("Only WavesLands and Arkimals NFT tokens are accepted")
808812 else {
809813 let arkNftNumber = valueOrElse(getInteger(keyUserArkNftNumber(addr)), 0)
810- let $t02333923423 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
811- let actions = $t02333923423._1
812- let wlgClaimedAmount = $t02333923423._2
814+ let $t02353523619 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
815+ let actions = $t02353523619._1
816+ let wlgClaimedAmount = $t02353523619._2
813817 $Tuple2((((((actions :+ listAction) :+ IntegerEntry(keyUserArkNftNumber(addr), (arkNftNumber - 1))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
814818 }
815819 }
816820 }
817821 }
818822 }
819823 }
820824
821825
822826
823827 @Callable(i)
824828 func exchangeNFTs () = {
825829 let prologActions = prolog(i)
826830 if ((3 > size(i.payments)))
827831 then throw("Min one USDT and 2 NFT payments allowed")
828832 else if ((size(i.payments) > 6))
829833 then throw("Max one USDT and 5 NFT payments allowed")
830834 else {
831835 let addr = toString(i.caller)
832836 func addUp (acc,pmt) = {
833837 let assetId = valueOrErrorMessage(pmt.assetId, "WAVES payments not allowed")
834838 if ((assetId == usdtAssetId))
835839 then $Tuple3((acc._1 + pmt.amount), acc._2, acc._3)
836840 else {
837841 let asset = value(assetInfo(assetId))
838842 if ((asset.issuer != this))
839843 then throw("Only WL-issued NFTs allowed")
840844 else {
841845 let bonusPerc = bonusByDescription(value(asset.description))
842846 $Tuple3(acc._1, (acc._2 + bonusPerc), (acc._3 :+ Burn(assetId, 1)))
843847 }
844848 }
845849 }
846850
847- let $t02457124650 = {
851+ let $t02476724846 = {
848852 let $l = i.payments
849853 let $s = size($l)
850854 let $acc0 = $Tuple3(0, 0, nil)
851855 func $f0_1 ($a,$i) = if (($i >= $s))
852856 then $a
853857 else addUp($a, $l[$i])
854858
855859 func $f0_2 ($a,$i) = if (($i >= $s))
856860 then $a
857861 else throw("List size exceeds 6")
858862
859863 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
860864 }
861- let usdtFee = $t02457124650._1
862- let totalBonus = $t02457124650._2
863- let burnActions = $t02457124650._3
865+ let usdtFee = $t02476724846._1
866+ let totalBonus = $t02476724846._2
867+ let burnActions = $t02476724846._3
864868 let nftIndex = if ((totalBonus == 3))
865869 then 2
866870 else if ((totalBonus == 5))
867871 then 3
868872 else if ((totalBonus == 10))
869873 then 4
870874 else throw("Only bonuses of 3%, 5% or 10% are supported")
871875 let change = ((totalBonus * MULT6) - usdtFee)
872876 if ((0 > change))
873877 then throw((("You need to attach " + fixedPoint(usdtFee, 6)) + "USDT as fee"))
874878 else {
875879 let changeActions = if ((change > 0))
876880 then [ScriptTransfer(i.caller, change, usdtAssetId)]
877881 else nil
878- let $t02510625173 = issueNFTinternal(nftIndex, i.caller)
879- let nftActions = $t02510625173._1
880- let nftAssetId = $t02510625173._2
881- $Tuple2(((((nftActions ++ burnActions) ++ prologActions) ++ changeActions) :+ ScriptTransfer(i.caller, 1, nftAssetId)), nftAssetId)
882+ let $t02530225374 = issueNFTinternal(nftIndex, i.caller)
883+ let issueNftActions = $t02530225374._1
884+ let nftAssetId = $t02530225374._2
885+ let burned = size(burnActions)
886+ let burnCounterActions = if ((burned == 0))
887+ then nil
888+ else [IntegerEntry(keyNftTotalBurned, (valueOrElse(getInteger(keyNftTotalBurned), 0) + burned))]
889+ $Tuple2((((((issueNftActions ++ burnActions) ++ burnCounterActions) ++ prologActions) ++ changeActions) :+ ScriptTransfer(i.caller, 1, nftAssetId)), nftAssetId)
882890 }
883891 }
884892 }
885893
886894

github/deemru/w8io/169f3d6 
148.82 ms