tx · 7dzKi4qV6vM1CgBicaGEMjsP7BcwvbjmLm8MSWP9S2L

3N87pMbUtdD1KCJh22ug94QzXiN2Py95cUm:  -0.02300000 Waves

2022.08.15 11:04 [2185317] smart account 3N87pMbUtdD1KCJh22ug94QzXiN2Py95cUm > SELF 0.00000000 Waves

{ "type": 13, "id": "7dzKi4qV6vM1CgBicaGEMjsP7BcwvbjmLm8MSWP9S2L", "fee": 2300000, "feeAssetId": null, "timestamp": 1660550691483, "version": 2, "chainId": 84, "sender": "3N87pMbUtdD1KCJh22ug94QzXiN2Py95cUm", "senderPublicKey": "2qzGZhC36wAyrGHApWNkaeMbsx7112N9uMUHCcDrev5a", "proofs": [ "4KLYJwr99R6BNUpRuWfqsdkUzauvkCcBLZyTmpDAPzrbzrZBFxWyBhjvyUm729XNCZqCEtVVhukDfb3TZYvKy6zr" ], "script": "base64:BgIwCAISAwoBBBIHCgUBAQgIBBIDCgEBEgMKAQESABIDCgEBEgASABIAEgUKAwQBCBIAWgAHdmVyc2lvbgIFMS4wLjAACGtWZXJzaW9uAgd2ZXJzaW9uAAdrQWN0aXZlAgZhY3RpdmUACWtBc3NldElkQQIKQV9hc3NldF9pZAAJa0Fzc2V0SWRCAgpCX2Fzc2V0X2lkAAlrQmFsYW5jZUECD0FfYXNzZXRfYmFsYW5jZQAJa0JhbGFuY2VCAg9CX2Fzc2V0X2JhbGFuY2UADWtCYWxhbmNlSW5pdEECDEFfYXNzZXRfaW5pdAANa0JhbGFuY2VJbml0QgIMQl9hc3NldF9pbml0AA1rU2hhcmVBc3NldElkAg5zaGFyZV9hc3NldF9pZAARa1NoYXJlQXNzZXRTdXBwbHkCEnNoYXJlX2Fzc2V0X3N1cHBseQAEa0ZlZQIKY29tbWlzc2lvbgAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQANa0ZpcnN0SGFydmVzdAINZmlyc3RfaGFydmVzdAATa0ZpcnN0SGFydmVzdEhlaWdodAIUZmlyc3RfaGFydmVzdF9oZWlnaHQAC2tTaGFyZUxpbWl0AhxzaGFyZV9saW1pdF9vbl9maXJzdF9oYXJ2ZXN0AAtrQmFzZVBlcmlvZAILYmFzZV9wZXJpb2QADWtQZXJpb2RMZW5ndGgCDXBlcmlvZF9sZW5ndGgADGtTdGFydEhlaWdodAIMc3RhcnRfaGVpZ2h0AAxrVVNETkFkZHJlc3MCGHN0YWtpbmdfdXNkbm5zYnRfYWRkcmVzcwAMa0VVUk5BZGRyZXNzAhRzdGFraW5nX2V1cm5fYWRkcmVzcwAMa0xlYXNpbmdQb29sAg9sZWFzaW5nX2FkZHJlc3MADmtMZWFzaW5nQW1vdW50Ag5sZWFzaW5nX2Ftb3VudAAKa0xlYXNpbmdJZAIKbGVhc2luZ19pZAAKa0Rpc2NvdW50cwIJZGlzY291bnRzAA9rRGlzY291bnRWYWx1ZXMCD2Rpc2NvdW50X3ZhbHVlcwAOa1VzZXJTd29wSW5Hb3YCDF9TV09QX2Ftb3VudAANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViABBrTW9uZXlCb3hBZGRyZXNzAhFtb25leV9ib3hfYWRkcmVzcwALa0dvdkFkZHJlc3MCEmdvdmVybmFuY2VfYWRkcmVzcwAGb3JhY2xlCQEHQWRkcmVzcwEBGgFU6UWqHpAvOq7xug7mLpqSXxqYhOHzYrMIARNnZXRCYXNlNThGcm9tT3JhY2xlAQNrZXkEByRtYXRjaDAJAJ0IAgUGb3JhY2xlBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAJANkEAQUGc3RyaW5nBAdub3RoaW5nBQckbWF0Y2gwCQACAQkArAICBQNrZXkCCGlzIGVtcHR5AAxhZG1pblB1YktleTEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MQAMYWRtaW5QdWJLZXkyCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTIADGFkbWluUHViS2V5MwkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkzABFhZG1pbkludm9rZVB1YktleQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRJrQWRtaW5JbnZva2VQdWJLZXkAD21vbmV5Qm94QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEGtNb25leUJveEFkZHJlc3MACmdvdkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQtrR292QWRkcmVzcwANdm90aW5nQWRkcmVzcwkBB0FkZHJlc3MBARoBVBo2ft9Xop0naVz+v/cm1Of7ocNoPiDKfwAEVVNETgEgD/IcEqzkxDya7EYaqyWosOy6BytGzG2IcvC14pJJAbQABFNXT1ABIBL/gSCRSG6zQPbTfRMYQlf9b6H7MtOq7M1qP51pfTv4AARFVVJOASC5Z5NGA24nxYUbEXPdrrZLY4Sxi6STB6sJw8yEwLMudQANc3Rha2luZ0Fzc2V0cwkAzAgCAgVXQVZFUwkAzAgCCQDYBAEFBFVTRE4JAMwIAgkA2AQBBQRFVVJOBQNuaWwAEnN0YWtpbmdVU0ROQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtVU0ROQWRkcmVzcwASc3Rha2luZ0VVUk5BZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUMa0VVUk5BZGRyZXNzAApiYXNlUGVyaW9kCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwULa0Jhc2VQZXJpb2QCEUVtcHR5IGtCYXNlUGVyaW9kAAtzdGFydEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MFDGtTdGFydEhlaWdodAISRW1wdHkga1N0YXJ0SGVpZ2h0AAxwZXJpb2RMZW5ndGgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ12b3RpbmdBZGRyZXNzBQ1rUGVyaW9kTGVuZ3RoAhNFbXB0eSBrUGVyaW9kTGVuZ3RoABVmaXJzdEhhcnZlc3RFbmRQZXJpb2QJAGQCCQBkAgUKYmFzZVBlcmlvZAkAaQIJAGUCBQZoZWlnaHQFC3N0YXJ0SGVpZ2h0BQxwZXJpb2RMZW5ndGgAAwAGYWN0aXZlCQERQGV4dHJOYXRpdmUoMTA1MSkCBQR0aGlzBQdrQWN0aXZlAAtzdHJBc3NldElkQQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUJa0Fzc2V0SWRBAAtzdHJBc3NldElkQgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUJa0Fzc2V0SWRCAAhhc3NldElkQQMJAAACBQtzdHJBc3NldElkQQIFV0FWRVMFBHVuaXQJANkEAQULc3RyQXNzZXRJZEEACGFzc2V0SWRCAwkAAAIFC3N0ckFzc2V0SWRCAgVXQVZFUwUEdW5pdAkA2QQBBQtzdHJBc3NldElkQgAKYXNzZXROYW1lQQQHJG1hdGNoMAUIYXNzZXRJZEEDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAICQEFdmFsdWUBCQDsBwEFAmlkBG5hbWUDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDACBVdBVkVTCQACAQILTWF0Y2ggZXJyb3IACmFzc2V0TmFtZUIEByRtYXRjaDAFCGFzc2V0SWRCAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCAkBBXZhbHVlAQkA7AcBBQJpZARuYW1lAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECC01hdGNoIGVycm9yAAhiYWxhbmNlQQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUJa0JhbGFuY2VBAAhiYWxhbmNlQgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUJa0JhbGFuY2VCAAxzaGFyZUFzc2V0SWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUNa1NoYXJlQXNzZXRJZAAQc2hhcmVBc3NldFN1cHBseQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwURa1NoYXJlQXNzZXRTdXBwbHkAA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUEa0ZlZQANZmVlR292ZXJuYW5jZQkAawMFA2ZlZQAoAGQACWZlZVNjYWxlNgDAhD0AC3NjYWxlVmFsdWUzAOgHAAtzY2FsZVZhbHVlOACAwtcvABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgDoBwARc2NhbGVWYWx1ZThEaWdpdHMACAEOYWNjb3VudEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJAPAHAgUEdGhpcwUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQACAQILTWF0Y2ggZXJyb3IBDHN0YWtlZEFtb3VudAEHYXNzZXRJZAQWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBANhSWQFByRtYXRjaDADCQAAAgUDYUlkBQRVU0ROCQCaCAIFEnN0YWtpbmdVU0ROQWRkcmVzcwkArAICCQCsAgIJAKwCAgIMcnBkX2JhbGFuY2VfCQDYBAEFA2FJZAIBXwkApQgBBQR0aGlzAwkAAAIFA2FJZAUERVVSTgkAmggCBRJzdGFraW5nRVVSTkFkZHJlc3MJAKwCAgkArAICCQCsAgICGCVzJXMlc19fc3Rha2luZ0JhbGFuY2VfXwkA2AQBBQNhSWQCAl9fCQClCAEFBHRoaXMAAAMJAAECBQckbWF0Y2gwAgRVbml0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDmtMZWFzaW5nQW1vdW50AAAJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAMJAAECBQckbWF0Y2gwAgNJbnQEAWkFByRtYXRjaDAFAWkAAAANc3Rha2VkQW1vdW50QQkBDHN0YWtlZEFtb3VudAEFCGFzc2V0SWRBAA1zdGFrZWRBbW91bnRCCQEMc3Rha2VkQW1vdW50AQUIYXNzZXRJZEIACmFzc2V0SW5pdEEJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFDWtCYWxhbmNlSW5pdEEACmFzc2V0SW5pdEIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFDWtCYWxhbmNlSW5pdEIAEWF2YWlsYWJsZUJhbGFuY2VBCQBlAgUIYmFsYW5jZUEFDXN0YWtlZEFtb3VudEEAEWF2YWlsYWJsZUJhbGFuY2VCCQBlAgUIYmFsYW5jZUIFDXN0YWtlZEFtb3VudEIAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEJAGQCCQEOYWNjb3VudEJhbGFuY2UBBQhhc3NldElkQQUNc3Rha2VkQW1vdW50QQAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgkAZAIJAQ5hY2NvdW50QmFsYW5jZQEFCGFzc2V0SWRCBQ1zdGFrZWRBbW91bnRCABBoYXNFbm91Z2hCYWxhbmNlAwkAZwIFGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEFCGJhbGFuY2VBCQBnAgUZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgUIYmFsYW5jZUIHAQxnZXRBc3NldEluZm8BB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAECHN0cmluZ0lkCQDYBAEFAmlkBARpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCaWQJAKwCAgkArAICAgZBc3NldCAFCHN0cmluZ0lkAg4gZG9lc24ndCBleGlzdAkAlQoDBQhzdHJpbmdJZAgFBGluZm8EbmFtZQgFBGluZm8IZGVjaW1hbHMDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAJAJUKAwIFV0FWRVMCBVdBVkVTAAgJAAIBAgtNYXRjaCBlcnJvcgEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEIYXNzZXRTdHIDCQAAAgUIYXNzZXRTdHICBVdBVkVTCQCVCgMCBVdBVkVTAgVXQVZFUwAIBAhzdHJpbmdJZAUIYXNzZXRTdHIEAmlkCQDZBAEFCGFzc2V0U3RyBARpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCaWQJAKwCAgkArAICAgZBc3NldCAFCHN0cmluZ0lkAg4gZG9lc24ndCBleGlzdAkAlQoDBQhzdHJpbmdJZAgFBGluZm8EbmFtZQgFBGluZm8IZGVjaW1hbHMBB3N1c3BlbmQBBWNhdXNlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBwkAzAgCCQELU3RyaW5nRW50cnkCBQZrQ2F1c2UFBWNhdXNlBQNuaWwBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFc3Rha2UHYXNzZXRJZAMFBXN0YWtlAwkAAAIFB2Fzc2V0SWQFBFVTRE4JAJQKAgIMbG9ja05ldXRyaW5vBRJzdGFraW5nVVNETkFkZHJlc3MJAJQKAgIMc3RhcnRTdGFraW5nBRJzdGFraW5nRVVSTkFkZHJlc3MDCQAAAgUHYXNzZXRJZAUEVVNETgkAlAoCAg51bmxvY2tOZXV0cmlubwUSc3Rha2luZ1VTRE5BZGRyZXNzCQCUCgICC3N0b3BTdGFraW5nBRJzdGFraW5nRVVSTkFkZHJlc3MBEWNhbGNTdGFraW5nUGFyYW1zAwVzdGFrZQZhbW91bnQHYXNzZXRJZAMFBXN0YWtlBAskdDA2MjkwNjM1NgkBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFBXN0YWtlBQdhc3NldElkBARjYWxsCAULJHQwNjI5MDYzNTYCXzEEC3N0YWtpbmdBZGRyCAULJHQwNjI5MDYzNTYCXzIJAJYKBAUEY2FsbAULc3Rha2luZ0FkZHIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHYXNzZXRJZAUGYW1vdW50BQNuaWwECyR0MDY0NDI2NTA4CQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQskdDA2NDQyNjUwOAJfMQQLc3Rha2luZ0FkZHIIBQskdDA2NDQyNjUwOAJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgkAzAgCBQZhbW91bnQJAMwIAgkA2AQBBQdhc3NldElkBQNuaWwFA25pbAEUY2FsY3VsYXRlRmVlRGlzY291bnQBCHVzZXJBZGRyBApzd29wQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFCmdvdkFkZHJlc3MJAKwCAgkApQgBBQh1c2VyQWRkcgUOa1VzZXJTd29wSW5Hb3YAAAQOZGlzY291bnRWYWx1ZXMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUGb3JhY2xlBQ9rRGlzY291bnRWYWx1ZXMCASwECWRpc2NvdW50cwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFCmtEaXNjb3VudHMCASwDAwkAZwIFCnN3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAACQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAEFCnN3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAADAwkAZwIFCnN3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwABCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIFCnN3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAEDAwkAZwIFCnN3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwACCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAMFCnN3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAIDAwkAZwIFCnN3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwADCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAQFCnN3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAQJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMABAUJZmVlU2NhbGU2AQ1jYWxjdWxhdGVGZWVzBQlwbXRBbW91bnQSbWluQW1vdW50VG9SZWNlaXZlCXRva2VuRnJvbQd0b2tlblRvBmNhbGxlcgQQYW1vdW50V2l0aG91dEZlZQkAawMFB3Rva2VuVG8FCXBtdEFtb3VudAkAZAIFCXBtdEFtb3VudAUJdG9rZW5Gcm9tBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQUGY2FsbGVyBA1hbW91bnRXaXRoRmVlCQBrAwUQYW1vdW50V2l0aG91dEZlZQkAZQIFCWZlZVNjYWxlNgkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUJZmVlU2NhbGU2BBBnb3Zlcm5hbmNlUmV3YXJkCQBrAwUQYW1vdW50V2l0aG91dEZlZQkAbgQFDWZlZUdvdmVybmFuY2UFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFCWZlZVNjYWxlNgMJAGYCBRJtaW5BbW91bnRUb1JlY2VpdmUFDWFtb3VudFdpdGhGZWUJAAIBCQCsAgIJAKwCAgkArAICAh1DYWxjdWxhdGVkIGFtb3VudCB0byByZWNlaXZlIAkApAMBBQ1hbW91bnRXaXRoRmVlAiAgaXMgbGVzcyB0aGFuIHNwZWNpZmllZCBtaW5pbXVtIAkApAMBBRJtaW5BbW91bnRUb1JlY2VpdmUJAJUKAwUQYW1vdW50V2l0aG91dEZlZQUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAERc3VzcGVuZFN1c3BpY2lvdXMACQEHc3VzcGVuZAEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICI1N1c3BpY2lvdXMgc3RhdGUuIEFjdHVhbCBiYWxhbmNlczogCQCkAwEFGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEECASAFCmFzc2V0TmFtZUECAiwgCQCkAwEFGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEICASAFCmFzc2V0TmFtZUICCS4gU3RhdGU6IAkApAMBBQhiYWxhbmNlQQIBIAUKYXNzZXROYW1lQQICLCAJAKQDAQUIYmFsYW5jZUICASAFCmFzc2V0TmFtZUIBCGlzQWN0aXZlAAMFBmFjdGl2ZQUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQLAWkBBGluaXQBDGZpcnN0SGFydmVzdAQLJHQwODgzNTg5MTIJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQKcG10QW1vdW50QQgFCyR0MDg4MzU4OTEyAl8xBAtwbXRBc3NldElkQQgFCyR0MDg4MzU4OTEyAl8yBAskdDA4OTE3ODk5NAkAlAoCCAkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAQdhc3NldElkBApwbXRBbW91bnRCCAULJHQwODkxNzg5OTQCXzEEC3BtdEFzc2V0SWRCCAULJHQwODkxNzg5OTQCXzIECyR0MDg5OTk5MDc2CQEMZ2V0QXNzZXRJbmZvAQULcG10QXNzZXRJZEEEDnBtdFN0ckFzc2V0SWRBCAULJHQwODk5OTkwNzYCXzEEDXBtdEFzc2V0TmFtZUEIBQskdDA4OTk5OTA3NgJfMgQMcG10RGVjaW1hbHNBCAULJHQwODk5OTkwNzYCXzMECyR0MDkwODE5MTU4CQEMZ2V0QXNzZXRJbmZvAQULcG10QXNzZXRJZEIEDnBtdFN0ckFzc2V0SWRCCAULJHQwOTA4MTkxNTgCXzEEDXBtdEFzc2V0TmFtZUIIBQskdDA5MDgxOTE1OAJfMgQMcG10RGVjaW1hbHNCCAULJHQwOTA4MTkxNTgCXzMDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzCQDMCAIFEWFkbWluSW52b2tlUHViS2V5BQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAQlpc0RlZmluZWQBCQCbCAIFBHRoaXMFB2tBY3RpdmUJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAwkAAAIFC3BtdEFzc2V0SWRBBQtwbXRBc3NldElkQgkAAgECGEFzc2V0cyBtdXN0IGJlIGRpZmZlcmVudAQJc2hhcmVOYW1lCQCsAgIJAKwCAgkArAICAgFzCQCvAgIFDXBtdEFzc2V0TmFtZUEABwIBXwkArwICBQ1wbXRBc3NldE5hbWVCAAcEEHNoYXJlRGVzY3JpcHRpb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgBQ1wbXRBc3NldE5hbWVBAgUgYW5kIAUNcG10QXNzZXROYW1lQgIMIGF0IGFkZHJlc3MgCQClCAEFBHRoaXMEDXNoYXJlRGVjaW1hbHMJAGkCCQBkAgUMcG10RGVjaW1hbHNBBQxwbXREZWNpbWFsc0IAAgQEYXJnMQkAbAYFCnBtdEFtb3VudEEFDHBtdERlY2ltYWxzQQAFAAEFDHBtdERlY2ltYWxzQQUERE9XTgQEYXJnMgkAbAYFCnBtdEFtb3VudEIFDHBtdERlY2ltYWxzQgAFAAEFDHBtdERlY2ltYWxzQgUERE9XTgQEYXJnMwkAbAYACgAABQ1zaGFyZURlY2ltYWxzAAAAAAUERE9XTgQSc2hhcmVJbml0aWFsU3VwcGx5CQBrAwUEYXJnMQUEYXJnMgUEYXJnMwQKc2hhcmVJc3N1ZQkAwggFBQlzaGFyZU5hbWUFEHNoYXJlRGVzY3JpcHRpb24FEnNoYXJlSW5pdGlhbFN1cHBseQUNc2hhcmVEZWNpbWFscwYEDHNoYXJlSXNzdWVJZAkAuAgBBQpzaGFyZUlzc3VlBAZzdGFrZTEDCQEPY29udGFpbnNFbGVtZW50AgUNc3Rha2luZ0Fzc2V0cwUOcG10U3RyQXNzZXRJZEEJAPwHBAUEdGhpcwIMc3Rha2VVbnN0YWtlCQDMCAIGCQDMCAIFCnBtdEFtb3VudEEJAMwIAgUOcG10U3RyQXNzZXRJZEEFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UxBQZzdGFrZTEEBnN0YWtlMgMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQ5wbXRTdHJBc3NldElkQgkA/AcEBQR0aGlzAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUKcG10QW1vdW50QgkAzAgCBQ5wbXRTdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgQJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtWZXJzaW9uBQd2ZXJzaW9uCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELU3RyaW5nRW50cnkCBQlrQXNzZXRJZEEFDnBtdFN0ckFzc2V0SWRBCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtBc3NldElkQgUOcG10U3RyQXNzZXRJZEIJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQQUKcG10QW1vdW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCBQpwbXRBbW91bnRCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQRrRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQZvcmFjbGUCDWJhc2VfZmVlX2NwbW0JAMwIAgUKc2hhcmVJc3N1ZQkAzAgCCQELU3RyaW5nRW50cnkCBQ1rU2hhcmVBc3NldElkCQDYBAEFDHNoYXJlSXNzdWVJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkFEnNoYXJlSW5pdGlhbFN1cHBseQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFEnNoYXJlSW5pdGlhbFN1cHBseQUMc2hhcmVJc3N1ZUlkBQNuaWwDBQxmaXJzdEhhcnZlc3QJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rRmlyc3RIYXJ2ZXN0BQxmaXJzdEhhcnZlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tGaXJzdEhhcnZlc3RIZWlnaHQJAGQCBQtzdGFydEhlaWdodAkAaAIFFWZpcnN0SGFydmVzdEVuZFBlcmlvZAUMcGVyaW9kTGVuZ3RoBQNuaWwFCWJhc2VFbnRyeQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFpbml0V2l0aEluaXRSYXRpbwUJYW10QXNzZXRBCWFtdEFzc2V0QgtzdHJBc3NldElkQQtzdHJBc3NldElkQgxmaXJzdEhhcnZlc3QEDSR0MDExNjYzMTE3NTAJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQULc3RyQXNzZXRJZEEEDnBtdFN0ckFzc2V0SWRBCAUNJHQwMTE2NjMxMTc1MAJfMQQNcG10QXNzZXROYW1lQQgFDSR0MDExNjYzMTE3NTACXzIEDHBtdERlY2ltYWxzQQgFDSR0MDExNjYzMTE3NTACXzMEDSR0MDExNzU1MTE4NDIJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQULc3RyQXNzZXRJZEIEDnBtdFN0ckFzc2V0SWRCCAUNJHQwMTE3NTUxMTg0MgJfMQQNcG10QXNzZXROYW1lQggFDSR0MDExNzU1MTE4NDICXzIEDHBtdERlY2ltYWxzQggFDSR0MDExNzU1MTE4NDICXzMDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzCQDMCAIFEWFkbWluSW52b2tlUHViS2V5BQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAQlpc0RlZmluZWQBCQCbCAIFBHRoaXMFB2tBY3RpdmUJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAwkAAAIFC3N0ckFzc2V0SWRBBQtzdHJBc3NldElkQgkAAgECGEFzc2V0cyBtdXN0IGJlIGRpZmZlcmVudAQJc2hhcmVOYW1lCQCsAgIJAKwCAgkArAICAgFzCQCvAgIFDXBtdEFzc2V0TmFtZUEABwIBXwkArwICBQ1wbXRBc3NldE5hbWVCAAcEEHNoYXJlRGVzY3JpcHRpb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgBQ1wbXRBc3NldE5hbWVBAgUgYW5kIAUNcG10QXNzZXROYW1lQgIMIGF0IGFkZHJlc3MgCQClCAEFBHRoaXMEDXNoYXJlRGVjaW1hbHMJAGkCCQBkAgUMcG10RGVjaW1hbHNBBQxwbXREZWNpbWFsc0IAAgQSc2hhcmVJbml0aWFsU3VwcGx5AAAECnNoYXJlSXNzdWUJAMIIBQUJc2hhcmVOYW1lBRBzaGFyZURlc2NyaXB0aW9uBRJzaGFyZUluaXRpYWxTdXBwbHkFDXNoYXJlRGVjaW1hbHMGBAxzaGFyZUlzc3VlSWQJALgIAQUKc2hhcmVJc3N1ZQQJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtWZXJzaW9uBQd2ZXJzaW9uCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELU3RyaW5nRW50cnkCBQlrQXNzZXRJZEEFDnBtdFN0ckFzc2V0SWRBCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtBc3NldElkQgUOcG10U3RyQXNzZXRJZEIJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtCYWxhbmNlSW5pdEEFCWFtdEFzc2V0QQkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa0JhbGFuY2VJbml0QgUJYW10QXNzZXRCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFBGtGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQINYmFzZV9mZWVfY3BtbQkAzAgCBQpzaGFyZUlzc3VlCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtTaGFyZUFzc2V0SWQJANgEAQUMc2hhcmVJc3N1ZUlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQUSc2hhcmVJbml0aWFsU3VwcGx5BQNuaWwDBQxmaXJzdEhhcnZlc3QJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rRmlyc3RIYXJ2ZXN0BQxmaXJzdEhhcnZlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tGaXJzdEhhcnZlc3RIZWlnaHQJAGQCBQtzdGFydEhlaWdodAkAaAIFFWZpcnN0SGFydmVzdEVuZFBlcmlvZAUMcGVyaW9kTGVuZ3RoBQNuaWwFCWJhc2VFbnRyeQFpARhrZWVwTGltaXRGb3JGaXJzdEhhcnZlc3QBCnNoYXJlTGltaXQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzCQDMCAIFEWFkbWluSW52b2tlUHViS2V5BQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1NoYXJlTGltaXQFCnNoYXJlTGltaXQFA25pbAFpARZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zARFzbGlwcGFnZVRvbGVyYW5jZQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQLcG10QXNzZXRJZEEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQLcG10QXNzZXRJZEIICQCRAwIIBQFpCHBheW1lbnRzAAEHYXNzZXRJZAQKcG10QW1vdW50QQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECnBtdEFtb3VudEIICQCRAwIIBQFpCHBheW1lbnRzAAEGYW1vdW50BA0kdDAxNDIyMTE0Mjk4CQEMZ2V0QXNzZXRJbmZvAQULcG10QXNzZXRJZEEEDnBtdFN0ckFzc2V0SWRBCAUNJHQwMTQyMjExNDI5OAJfMQQNcG10QXNzZXROYW1lQQgFDSR0MDE0MjIxMTQyOTgCXzIEDHBtdERlY2ltYWxzQQgFDSR0MDE0MjIxMTQyOTgCXzMEDSR0MDE0MzAzMTQzODAJAQxnZXRBc3NldEluZm8BBQtwbXRBc3NldElkQgQOcG10U3RyQXNzZXRJZEIIBQ0kdDAxNDMwMzE0MzgwAl8xBA1wbXRBc3NldE5hbWVCCAUNJHQwMTQzMDMxNDM4MAJfMgQMcG10RGVjaW1hbHNCCAUNJHQwMTQzMDMxNDM4MAJfMwQGaW5pdGFsAwMJAAACBQhiYWxhbmNlQQAACQAAAgUIYmFsYW5jZUIAAAcGBwQKdG9rZW5SYXRpbwMFBmluaXRhbAkAawMJAGsDBQphc3NldEluaXRBBQtzY2FsZVZhbHVlOAUKcG10QW1vdW50QQULc2NhbGVWYWx1ZTMJAGsDBQphc3NldEluaXRCBQtzY2FsZVZhbHVlOAUKcG10QW1vdW50QgkAawMJAGsDBQhiYWxhbmNlQQULc2NhbGVWYWx1ZTgFCnBtdEFtb3VudEEFC3NjYWxlVmFsdWUzCQBrAwUIYmFsYW5jZUIFC3NjYWxlVmFsdWU4BQpwbXRBbW91bnRCBA1zaGFyZURlY2ltYWxzCQBpAgkAZAIFDHBtdERlY2ltYWxzQQUMcG10RGVjaW1hbHNCAAIEFXNoYXJlVG9rZW5Ub1BheUFtb3VudAMFBmluaXRhbAkAawMJAGwGBQpwbXRBbW91bnRBBQxwbXREZWNpbWFsc0EABQABBQxwbXREZWNpbWFsc0EFBERPV04JAGwGBQpwbXRBbW91bnRCBQxwbXREZWNpbWFsc0IABQABBQxwbXREZWNpbWFsc0IFBERPV04JAGwGAAoAAAUNc2hhcmVEZWNpbWFscwAAAAAFBERPV04JAGsDCQCXAwEJAMwIAgkAawMFCnBtdEFtb3VudEEFC3NjYWxlVmFsdWU4BQhiYWxhbmNlQQkAzAgCCQBrAwUKcG10QW1vdW50QgULc2NhbGVWYWx1ZTgFCGJhbGFuY2VCBQNuaWwFEHNoYXJlQXNzZXRTdXBwbHkFC3NjYWxlVmFsdWU4AwMJAGYCAAAFEXNsaXBwYWdlVG9sZXJhbmNlBgkAZgIFEXNsaXBwYWdlVG9sZXJhbmNlBRpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgkAAgEJAKwCAgkArAICCQCsAgICKVNsaXBwYWdlIHRvbGVyYW5jZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgCQCkAwEFGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyAhYgaW5jbHVzaXZlbHkuIEFjdHVhbDogCQCkAwEFEXNsaXBwYWdlVG9sZXJhbmNlAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwACCQACAQIcVHdvIGF0dGFjaGVkIGFzc2V0cyBleHBlY3RlZAMDCQECIT0CBQtwbXRBc3NldElkQQUIYXNzZXRJZEEGCQECIT0CBQtwbXRBc3NldElkQgUIYXNzZXRJZEIJAAIBCQCsAgIJAKwCAgkArAICAiVJbmNvcnJlY3QgYXNzZXRzIGF0dGFjaGVkLiBFeHBlY3RlZDogBQtzdHJBc3NldElkQQIFIGFuZCAFC3N0ckFzc2V0SWRCAwMJAGYCCQBpAgkAaAIFC3NjYWxlVmFsdWUzCQBlAgUac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIFEXNsaXBwYWdlVG9sZXJhbmNlBRpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgUKdG9rZW5SYXRpbwYJAGYCBQp0b2tlblJhdGlvCQBpAgkAaAIFC3NjYWxlVmFsdWUzCQBkAgUac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIFEXNsaXBwYWdlVG9sZXJhbmNlBRpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgkAAgECPUluY29ycmVjdCBhc3NldHMgYW1vdW50OiBhbW91bnRzIG11c3QgaGF2ZSB0aGUgY29udHJhY3QgcmF0aW8DCQAAAgUVc2hhcmVUb2tlblRvUGF5QW1vdW50AAAJAAIBAh1Ub28gc21hbGwgYW1vdW50IHRvIHJlcGxlbmlzaAMJAQEhAQUQaGFzRW5vdWdoQmFsYW5jZQkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKcG10QW1vdW50QQULcG10QXNzZXRJZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQpwbXRBbW91bnRCBQtwbXRBc3NldElkQgUDbmlsCQERc3VzcGVuZFN1c3BpY2lvdXMABAZzdGFrZTEDCQEPY29udGFpbnNFbGVtZW50AgUNc3Rha2luZ0Fzc2V0cwUOcG10U3RyQXNzZXRJZEEJAPwHBAUEdGhpcwIMc3Rha2VVbnN0YWtlCQDMCAIGCQDMCAIFCnBtdEFtb3VudEEJAMwIAgUOcG10U3RyQXNzZXRJZEEFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UxBQZzdGFrZTEEBnN0YWtlMgMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQ5wbXRTdHJBc3NldElkQgkA/AcEBQR0aGlzAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUKcG10QW1vdW50QgkAzAgCBQ5wbXRTdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUVc2hhcmVUb2tlblRvUGF5QW1vdW50BgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBCQBkAgUIYmFsYW5jZUEFCnBtdEFtb3VudEEJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQgkAZAIFCGJhbGFuY2VCBQpwbXRBbW91bnRCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZAIFEHNoYXJlQXNzZXRTdXBwbHkFFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUMc2hhcmVBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcACQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABA0kdDAxNzE4MDE3MjU1CQCUCgIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQECXBtdEFtb3VudAgFDSR0MDE3MTgwMTcyNTUCXzEECnBtdEFzc2V0SWQIBQ0kdDAxNzE4MDE3MjU1Al8yBAxhbW91bnRUb1BheUEJAGsDBQlwbXRBbW91bnQFCGJhbGFuY2VBBRBzaGFyZUFzc2V0U3VwcGx5BAxhbW91bnRUb1BheUIJAGsDBQlwbXRBbW91bnQFCGJhbGFuY2VCBRBzaGFyZUFzc2V0U3VwcGx5AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIdT25lIGF0dGFjaGVkIHBheW1lbnQgZXhwZWN0ZWQDCQECIT0CBQpwbXRBc3NldElkBQxzaGFyZUFzc2V0SWQJAAIBCQCsAgICJEluY29ycmVjdCBhc3NldCBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAkA2AQBBQxzaGFyZUFzc2V0SWQDCQEBIQEFEGhhc0Vub3VnaEJhbGFuY2UJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCXBtdEFtb3VudAUKcG10QXNzZXRJZAUDbmlsCQERc3VzcGVuZFN1c3BpY2lvdXMABAZzdGFrZTEDCQEPY29udGFpbnNFbGVtZW50AgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEEJAPwHBAUEdGhpcwIMc3Rha2VVbnN0YWtlCQDMCAIHCQDMCAIFDGFtb3VudFRvUGF5QQkAzAgCBQtzdHJBc3NldElkQQUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTEFBnN0YWtlMQQGc3Rha2UyAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFC3N0ckFzc2V0SWRCCQD8BwQFBHRoaXMCDHN0YWtlVW5zdGFrZQkAzAgCBwkAzAgCBQxhbW91bnRUb1BheUIJAMwIAgULc3RyQXNzZXRJZEIFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UyBQZzdGFrZTIJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQQkAZQIFCGJhbGFuY2VBBQxhbW91bnRUb1BheUEJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQgkAZQIFCGJhbGFuY2VCBQxhbW91bnRUb1BheUIJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBlAgUQc2hhcmVBc3NldFN1cHBseQUJcG10QW1vdW50CQDMCAIJAQRCdXJuAgUMc2hhcmVBc3NldElkBQlwbXRBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQxhbW91bnRUb1BheUEFCGFzc2V0SWRBCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUMYW1vdW50VG9QYXlCBQhhc3NldElkQgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGV4Y2hhbmdlARJtaW5BbW91bnRUb1JlY2VpdmUJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDSR0MDE4NTU0MTg2MjkJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQJcG10QW1vdW50CAUNJHQwMTg1NTQxODYyOQJfMQQKcG10QXNzZXRJZAgFDSR0MDE4NTU0MTg2MjkCXzIDAwkAAAIFCGJhbGFuY2VBAAAGCQAAAgUIYmFsYW5jZUIAAAkAAgECIENhbid0IGV4Y2hhbmdlIHdpdGggemVybyBiYWxhbmNlAwkAZwIAAAUSbWluQW1vdW50VG9SZWNlaXZlCQACAQkArAICAjRNaW5pbWFsIGFtb3VudCB0byByZWNlaXZlIG11c3QgYmUgcG9zaXRpdmUuIEFjdHVhbDogCQCkAwEFEm1pbkFtb3VudFRvUmVjZWl2ZQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBASEBBRBoYXNFbm91Z2hCYWxhbmNlCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQlwbXRBbW91bnQFCnBtdEFzc2V0SWQFA25pbAkBEXN1c3BlbmRTdXNwaWNpb3VzAAMJAAACBQpwbXRBc3NldElkBQhhc3NldElkQQQLYXNzZXRJZFNlbmQFCGFzc2V0SWRCBA0kdDAxOTE4MDE5MzE4CQENY2FsY3VsYXRlRmVlcwUFCXBtdEFtb3VudAUSbWluQW1vdW50VG9SZWNlaXZlBQhiYWxhbmNlQQUIYmFsYW5jZUIIBQFpDG9yaWdpbkNhbGxlcgQQYW1vdW50V2l0aG91dEZlZQgFDSR0MDE5MTgwMTkzMTgCXzEEDWFtb3VudFdpdGhGZWUIBQ0kdDAxOTE4MDE5MzE4Al8yBBBnb3Zlcm5hbmNlUmV3YXJkCAUNJHQwMTkxODAxOTMxOAJfMwQLbmV3QmFsYW5jZUEJAGQCBQhiYWxhbmNlQQUJcG10QW1vdW50BAtuZXdCYWxhbmNlQgkAZQIJAGUCBQhiYWxhbmNlQgUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAQGc3Rha2UxAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFC3N0ckFzc2V0SWRBCQD8BwQFBHRoaXMCDHN0YWtlVW5zdGFrZQkAzAgCBgkAzAgCBQlwbXRBbW91bnQJAMwIAgULc3RyQXNzZXRJZEEFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UxBQZzdGFrZTEEBnN0YWtlMgMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQtzdHJBc3NldElkQgkA/AcEBQR0aGlzAgxzdGFrZVVuc3Rha2UJAMwIAgcJAMwIAgkAZAIFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQJAMwIAgULc3RyQXNzZXRJZEIFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UyBQZzdGFrZTIJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBBQtuZXdCYWxhbmNlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCBQtuZXdCYWxhbmNlQgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDWFtb3VudFdpdGhGZWUFC2Fzc2V0SWRTZW5kCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUQZ292ZXJuYW5jZVJld2FyZAULYXNzZXRJZFNlbmQFA25pbAkAlAoCBQ1hbW91bnRXaXRoRmVlBQthc3NldElkU2VuZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQpwbXRBc3NldElkBQhhc3NldElkQgQLYXNzZXRJZFNlbmQFCGFzc2V0SWRBBA0kdDAyMDMxMDIwNDQ4CQENY2FsY3VsYXRlRmVlcwUFCXBtdEFtb3VudAUSbWluQW1vdW50VG9SZWNlaXZlBQhiYWxhbmNlQgUIYmFsYW5jZUEIBQFpDG9yaWdpbkNhbGxlcgQQYW1vdW50V2l0aG91dEZlZQgFDSR0MDIwMzEwMjA0NDgCXzEEDWFtb3VudFdpdGhGZWUIBQ0kdDAyMDMxMDIwNDQ4Al8yBBBnb3Zlcm5hbmNlUmV3YXJkCAUNJHQwMjAzMTAyMDQ0OAJfMwQLbmV3QmFsYW5jZUEJAGUCCQBlAgUIYmFsYW5jZUEFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQEC25ld0JhbGFuY2VCCQBkAgUIYmFsYW5jZUIFCXBtdEFtb3VudAQGc3Rha2UxAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFC3N0ckFzc2V0SWRBCQD8BwQFBHRoaXMCDHN0YWtlVW5zdGFrZQkAzAgCBwkAzAgCCQBkAgUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAkAzAgCBQtzdHJBc3NldElkQQUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTEFBnN0YWtlMQQGc3Rha2UyAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFC3N0ckFzc2V0SWRCCQD8BwQFBHRoaXMCDHN0YWtlVW5zdGFrZQkAzAgCBgkAzAgCBQlwbXRBbW91bnQJAMwIAgULc3RyQXNzZXRJZEIFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UyBQZzdGFrZTIJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBBQtuZXdCYWxhbmNlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCBQtuZXdCYWxhbmNlQgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDWFtb3VudFdpdGhGZWUFC2Fzc2V0SWRTZW5kCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUQZ292ZXJuYW5jZVJld2FyZAULYXNzZXRJZFNlbmQFA25pbAkAlAoCBQ1hbW91bnRXaXRoRmVlBQthc3NldElkU2VuZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgEJAKwCAgkArAICCQCsAgICJEluY29ycmVjdCBhc3NldCBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAULc3RyQXNzZXRJZEECBCBvciAFC3N0ckFzc2V0SWRCAWkBCHNodXRkb3duAAMJAQEhAQUGYWN0aXZlCQACAQkArAICAiJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtDYXVzZQIadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkBB3N1c3BlbmQBAg9QYXVzZWQgYnkgYWRtaW4BaQEIYWN0aXZhdGUAAwUGYWN0aXZlCQACAQIWREFwcCBpcyBhbHJlYWR5IGFjdGl2ZQMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUMYWRtaW5QdWJLZXkxCQDMCAIFDGFkbWluUHViS2V5MgkAzAgCBQxhZG1pblB1YktleTMFA25pbAgFAWkPY2FsbGVyUHVibGljS2V5CQACAQIhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELRGVsZXRlRW50cnkBBQZrQ2F1c2UFA25pbAFpARl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQNYW1vdW50RW5yb2xsQQkAZQIFGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEFCGJhbGFuY2VBBA1hbW91bnRFbnJvbGxCCQBlAgUZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgUIYmFsYW5jZUIDCQECIT0CCAUBaQZjYWxsZXIFD21vbmV5Qm94QWRkcmVzcwkAAgECJk9ubHkgdGhlIHdhbGxldCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAwMJAGYCAAAFDWFtb3VudEVucm9sbEEGCQBmAgAABQ1hbW91bnRFbnJvbGxCCQEHc3VzcGVuZAECFkVucm9sbCBhbW91bnQgbmVnYXRpdmUDAwkAAAIFDWFtb3VudEVucm9sbEEAAAkAAAIFDWFtb3VudEVucm9sbEIAAAcJAAIBAhBObyBtb25leSB0byB0YWtlBAZzdGFrZTEDCQEPY29udGFpbnNFbGVtZW50AgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEEJAPwHBAUEdGhpcwIMc3Rha2VVbnN0YWtlCQDMCAIGCQDMCAIFDWFtb3VudEVucm9sbEEJAMwIAgULc3RyQXNzZXRJZEEFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UxBQZzdGFrZTEEBnN0YWtlMgMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQtzdHJBc3NldElkQgkA/AcEBQR0aGlzAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUNYW1vdW50RW5yb2xsQgkAzAgCBQtzdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBCQBkAgUIYmFsYW5jZUEFDWFtb3VudEVucm9sbEEJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQgkAZAIFCGJhbGFuY2VCBQ1hbW91bnRFbnJvbGxCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICDGxhc3RfaW5jb21lXwULc3RyQXNzZXRJZEEFDWFtb3VudEVucm9sbEEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIMbGFzdF9pbmNvbWVfBQtzdHJBc3NldElkQgUNYW1vdW50RW5yb2xsQgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHN0YWtlVW5zdGFrZQMFc3Rha2UGYW1vdW50DWFzc2V0SWRTdHJpbmcDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAi1Pbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gaW52b2tlIHRoaXMgZnVuY3Rpb24DCQAAAgUNYXNzZXRJZFN0cmluZwIFV0FWRVMEBHBvb2wJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQZvcmFjbGUFDGtMZWFzaW5nUG9vbAIZTm8gbGVhc2luZyBwb29sIGluIG9yYWNsZQQJbGVhc2luZ0lkCQCcCAIFBHRoaXMFCmtMZWFzaW5nSWQEDWxlYXNpbmdBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUOa0xlYXNpbmdBbW91bnQAAAQObmV3TGVhc2VBbW91bnQDBQVzdGFrZQkAZAIFDWxlYXNpbmdBbW91bnQFBmFtb3VudAkAZQIFDWxlYXNpbmdBbW91bnQFBmFtb3VudAQIbmV3TGVhc2UJAMQIAgUEcG9vbAUObmV3TGVhc2VBbW91bnQECm5ld0xlYXNlSWQJALkIAQUIbmV3TGVhc2UECGJhc2VFdHJ5CQDMCAIFCG5ld0xlYXNlCQDMCAIJAQtCaW5hcnlFbnRyeQIFCmtMZWFzaW5nSWQFCm5ld0xlYXNlSWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtMZWFzaW5nQW1vdW50BQ5uZXdMZWFzZUFtb3VudAUDbmlsBAckbWF0Y2gwBQlsZWFzaW5nSWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQDbElkBQckbWF0Y2gwCQDOCAIJAMwIAgkBC0xlYXNlQ2FuY2VsAQUDbElkBQNuaWwFCGJhc2VFdHJ5BQhiYXNlRXRyeQQNJHQwMjQyMDIyNDMwNQkBEWNhbGNTdGFraW5nUGFyYW1zAwUFc3Rha2UFBmFtb3VudAkA2QQBBQ1hc3NldElkU3RyaW5nBARjYWxsCAUNJHQwMjQyMDIyNDMwNQJfMQQEYWRkcggFDSR0MDI0MjAyMjQzMDUCXzIEBnBhcmFtcwgFDSR0MDI0MjAyMjQzMDUCXzMECHBheW1lbnRzCAUNJHQwMjQyMDIyNDMwNQJfNAQDaW52CQD8BwQFBGFkZHIFBGNhbGwFBnBhcmFtcwUIcGF5bWVudHMDCQAAAgUDaW52BQNpbnYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhzdGFrZUFsbAAJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgQGc3Rha2UxAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFC3N0ckFzc2V0SWRBBAdhbW91bnRBCQBlAgUIYmFsYW5jZUEFDXN0YWtlZEFtb3VudEEDCQBmAgUHYW1vdW50QQAACQD8BwQFBHRoaXMCDHN0YWtlVW5zdGFrZQkAzAgCBgkAzAgCBQdhbW91bnRBCQDMCAIFC3N0ckFzc2V0SWRBBQNuaWwFA25pbAAAAAADCQAAAgUGc3Rha2UxBQZzdGFrZTEEBnN0YWtlMgMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQtzdHJBc3NldElkQgQHYW1vdW50QgkAZQIFCGJhbGFuY2VCBQ1zdGFrZWRBbW91bnRCAwkAZgIFB2Ftb3VudEIAAAkA/AcEBQR0aGlzAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUHYW1vdW50QgkAzAgCBQtzdHJBc3NldElkQgUDbmlsBQNuaWwAAAAAAwkAAAIFBnN0YWtlMgUGc3Rha2UyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDAEE2NhbGxUYWtlSW50b0FjY291bnQDCQAAAggFA2ludgRkQXBwBQR0aGlzCQAAAggFA2ludghmdW5jdGlvbgIZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwcEDXNpZ25lZEJ5QWRtaW4DAwMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MgYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MwYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFEWFkbWluSW52b2tlUHViS2V5AwMFE2NhbGxUYWtlSW50b0FjY291bnQFDXNpZ25lZEJ5QWRtaW4HBgUTbXVsdGlTaWduZWRCeUFkbWlucwUTbXVsdGlTaWduZWRCeUFkbWluc5x5yxk=", "height": 2185317, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 54YHmkeSVffCtcssMNrTxWs5LMt75N1HWxhinakBfGP9 Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let version = "1.0.0"
5+
6+let kVersion = "version"
7+
8+let kActive = "active"
9+
10+let kAssetIdA = "A_asset_id"
11+
12+let kAssetIdB = "B_asset_id"
13+
14+let kBalanceA = "A_asset_balance"
15+
16+let kBalanceB = "B_asset_balance"
17+
18+let kBalanceInitA = "A_asset_init"
19+
20+let kBalanceInitB = "B_asset_init"
21+
22+let kShareAssetId = "share_asset_id"
23+
24+let kShareAssetSupply = "share_asset_supply"
25+
26+let kFee = "commission"
27+
28+let kCause = "shutdown_cause"
29+
30+let kFirstHarvest = "first_harvest"
31+
32+let kFirstHarvestHeight = "first_harvest_height"
33+
34+let kShareLimit = "share_limit_on_first_harvest"
35+
36+let kBasePeriod = "base_period"
37+
38+let kPeriodLength = "period_length"
39+
40+let kStartHeight = "start_height"
41+
42+let kUSDNAddress = "staking_usdnnsbt_address"
43+
44+let kEURNAddress = "staking_eurn_address"
45+
46+let kLeasingPool = "leasing_address"
47+
48+let kLeasingAmount = "leasing_amount"
49+
50+let kLeasingId = "leasing_id"
51+
52+let kDiscounts = "discounts"
53+
54+let kDiscountValues = "discount_values"
55+
56+let kUserSwopInGov = "_SWOP_amount"
57+
58+let kAdminPubKey1 = "admin_pub_1"
59+
60+let kAdminPubKey2 = "admin_pub_2"
61+
62+let kAdminPubKey3 = "admin_pub_3"
63+
64+let kAdminInvokePubKey = "admin_invoke_pub"
65+
66+let kMoneyBoxAddress = "money_box_address"
67+
68+let kGovAddress = "governance_address"
69+
70+let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
71+
72+func getBase58FromOracle (key) = match getString(oracle, key) {
73+ case string: String =>
74+ fromBase58String(string)
75+ case nothing =>
76+ throw((key + "is empty"))
77+}
78+
79+
80+let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
81+
82+let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
83+
84+let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
85+
86+let adminInvokePubKey = getBase58FromOracle(kAdminInvokePubKey)
87+
88+let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
89+
90+let govAddress = Address(getBase58FromOracle(kGovAddress))
91+
92+let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
93+
94+let USDN = base58'25FEqEjRkqK6yCkiT7Lz6SAYz7gUFCtxfCChnrVFD5AT'
95+
96+let SWOP = base58'2HAJrwa8q4SxBx9cHYaBTQdBjdk5wwqdof7ccpAx2uhZ'
97+
98+let EURN = base58'DUk2YTxhRoAqMJLus4G2b3fR8hMHVh6eiyFx5r29VR6t'
99+
100+let stakingAssets = ["WAVES", toBase58String(USDN), toBase58String(EURN)]
101+
102+let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
103+
104+let stakingEURNAddress = Address(getBase58FromOracle(kEURNAddress))
105+
106+let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
107+
108+let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
109+
110+let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
111+
112+let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
113+
114+let active = getBooleanValue(this, kActive)
115+
116+let strAssetIdA = getStringValue(this, kAssetIdA)
117+
118+let strAssetIdB = getStringValue(this, kAssetIdB)
119+
120+let assetIdA = if ((strAssetIdA == "WAVES"))
121+ then unit
122+ else fromBase58String(strAssetIdA)
123+
124+let assetIdB = if ((strAssetIdB == "WAVES"))
125+ then unit
126+ else fromBase58String(strAssetIdB)
127+
128+let assetNameA = match assetIdA {
129+ case id: ByteVector =>
130+ value(assetInfo(id)).name
131+ case waves: Unit =>
132+ "WAVES"
133+ case _ =>
134+ throw("Match error")
135+}
136+
137+let assetNameB = match assetIdB {
138+ case id: ByteVector =>
139+ value(assetInfo(id)).name
140+ case waves: Unit =>
141+ "WAVES"
142+ case _ =>
143+ throw("Match error")
144+}
145+
146+let balanceA = getIntegerValue(this, kBalanceA)
147+
148+let balanceB = getIntegerValue(this, kBalanceB)
149+
150+let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
151+
152+let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
153+
154+let fee = getIntegerValue(this, kFee)
155+
156+let feeGovernance = fraction(fee, 40, 100)
157+
158+let feeScale6 = 1000000
159+
160+let scaleValue3 = 1000
161+
162+let scaleValue8 = 100000000
163+
164+let slippageToleranceDelimiter = 1000
165+
166+let scaleValue8Digits = 8
167+
168+func accountBalance (assetId) = match assetId {
169+ case id: ByteVector =>
170+ assetBalance(this, id)
171+ case waves: Unit =>
172+ wavesBalance(this).available
173+ case _ =>
174+ throw("Match error")
175+}
176+
177+
178+func stakedAmount (assetId) = {
179+ let stakedAmountCalculated = match assetId {
180+ case aId: ByteVector =>
181+ if ((aId == USDN))
182+ then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
183+ else if ((aId == EURN))
184+ then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
185+ else 0
186+ case _: Unit =>
187+ valueOrElse(getInteger(this, kLeasingAmount), 0)
188+ case _ =>
189+ throw("Match error")
190+ }
191+ match stakedAmountCalculated {
192+ case i: Int =>
193+ i
194+ case _ =>
195+ 0
196+ }
197+ }
198+
199+
200+let stakedAmountA = stakedAmount(assetIdA)
201+
202+let stakedAmountB = stakedAmount(assetIdB)
203+
204+let assetInitA = getIntegerValue(this, kBalanceInitA)
205+
206+let assetInitB = getIntegerValue(this, kBalanceInitB)
207+
208+let availableBalanceA = (balanceA - stakedAmountA)
209+
210+let availableBalanceB = (balanceB - stakedAmountB)
211+
212+let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
213+
214+let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
215+
216+let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
217+ then (accountBalanceWithStakedB >= balanceB)
218+ else false
219+
220+func getAssetInfo (assetId) = match assetId {
221+ case id: ByteVector =>
222+ let stringId = toBase58String(id)
223+ let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
224+ $Tuple3(stringId, info.name, info.decimals)
225+ case waves: Unit =>
226+ $Tuple3("WAVES", "WAVES", 8)
227+ case _ =>
228+ throw("Match error")
229+}
230+
231+
232+func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
233+ then $Tuple3("WAVES", "WAVES", 8)
234+ else {
235+ let stringId = assetStr
236+ let id = fromBase58String(assetStr)
237+ let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
238+ $Tuple3(stringId, info.name, info.decimals)
239+ }
240+
241+
242+func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
243+
244+
245+func calcStakingFuncAndAddres (stake,assetId) = if (stake)
246+ then if ((assetId == USDN))
247+ then $Tuple2("lockNeutrino", stakingUSDNAddress)
248+ else $Tuple2("startStaking", stakingEURNAddress)
249+ else if ((assetId == USDN))
250+ then $Tuple2("unlockNeutrino", stakingUSDNAddress)
251+ else $Tuple2("stopStaking", stakingEURNAddress)
252+
253+
254+func calcStakingParams (stake,amount,assetId) = if (stake)
255+ then {
256+ let $t062906356 = calcStakingFuncAndAddres(stake, assetId)
257+ let call = $t062906356._1
258+ let stakingAddr = $t062906356._2
259+ $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
260+ }
261+ else {
262+ let $t064426508 = calcStakingFuncAndAddres(stake, assetId)
263+ let call = $t064426508._1
264+ let stakingAddr = $t064426508._2
265+ $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
266+ }
267+
268+
269+func calculateFeeDiscount (userAddr) = {
270+ let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
271+ let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
272+ let discounts = split(getStringValue(oracle, kDiscounts), ",")
273+ if (if ((swopAmount >= parseIntValue(discountValues[0])))
274+ then (parseIntValue(discountValues[1]) > swopAmount)
275+ else false)
276+ then (feeScale6 - parseIntValue(discounts[0]))
277+ else if (if ((swopAmount >= parseIntValue(discountValues[1])))
278+ then (parseIntValue(discountValues[2]) > swopAmount)
279+ else false)
280+ then (feeScale6 - parseIntValue(discounts[1]))
281+ else if (if ((swopAmount >= parseIntValue(discountValues[2])))
282+ then (parseIntValue(discountValues[3]) > swopAmount)
283+ else false)
284+ then (feeScale6 - parseIntValue(discounts[2]))
285+ else if (if ((swopAmount >= parseIntValue(discountValues[3])))
286+ then (parseIntValue(discountValues[4]) > swopAmount)
287+ else false)
288+ then (feeScale6 - parseIntValue(discounts[3]))
289+ else if ((swopAmount >= parseIntValue(discountValues[4])))
290+ then (feeScale6 - parseIntValue(discounts[4]))
291+ else feeScale6
292+ }
293+
294+
295+func calculateFees (pmtAmount,minAmountToReceive,tokenFrom,tokenTo,caller) = {
296+ let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
297+ let feeDiscount = calculateFeeDiscount(caller)
298+ let amountWithFee = fraction(amountWithoutFee, (feeScale6 - fraction(fee, feeDiscount, feeScale6, CEILING)), feeScale6)
299+ let governanceReward = fraction(amountWithoutFee, fraction(feeGovernance, feeDiscount, feeScale6, CEILING), feeScale6)
300+ if ((minAmountToReceive > amountWithFee))
301+ then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
302+ else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
303+ }
304+
305+
306+func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
307+
308+
309+func isActive () = if (active)
310+ then unit
311+ else throw("DApp is inactive at this moment")
312+
313+
314+@Callable(i)
315+func init (firstHarvest) = {
316+ let $t088358912 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
317+ let pmtAmountA = $t088358912._1
318+ let pmtAssetIdA = $t088358912._2
319+ let $t089178994 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
320+ let pmtAmountB = $t089178994._1
321+ let pmtAssetIdB = $t089178994._2
322+ let $t089999076 = getAssetInfo(pmtAssetIdA)
323+ let pmtStrAssetIdA = $t089999076._1
324+ let pmtAssetNameA = $t089999076._2
325+ let pmtDecimalsA = $t089999076._3
326+ let $t090819158 = getAssetInfo(pmtAssetIdB)
327+ let pmtStrAssetIdB = $t090819158._1
328+ let pmtAssetNameB = $t090819158._2
329+ let pmtDecimalsB = $t090819158._3
330+ if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
331+ then throw("Only admin can call this function")
332+ else if (isDefined(getBoolean(this, kActive)))
333+ then throw("DApp is already active")
334+ else if ((pmtAssetIdA == pmtAssetIdB))
335+ then throw("Assets must be different")
336+ else {
337+ let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
338+ let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
339+ let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
340+ let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
341+ let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
342+ let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
343+ let shareInitialSupply = fraction(arg1, arg2, arg3)
344+ let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
345+ let shareIssueId = calculateAssetId(shareIssue)
346+ let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
347+ then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
348+ else 0
349+ if ((stake1 == stake1))
350+ then {
351+ let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
352+ then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
353+ else 0
354+ if ((stake2 == stake2))
355+ then {
356+ let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
357+ if (firstHarvest)
358+ then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
359+ else baseEntry
360+ }
361+ else throw("Strict value is not equal to itself.")
362+ }
363+ else throw("Strict value is not equal to itself.")
364+ }
365+ }
366+
367+
368+
369+@Callable(i)
370+func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
371+ let $t01166311750 = getAssetInfoFromString(strAssetIdA)
372+ let pmtStrAssetIdA = $t01166311750._1
373+ let pmtAssetNameA = $t01166311750._2
374+ let pmtDecimalsA = $t01166311750._3
375+ let $t01175511842 = getAssetInfoFromString(strAssetIdB)
376+ let pmtStrAssetIdB = $t01175511842._1
377+ let pmtAssetNameB = $t01175511842._2
378+ let pmtDecimalsB = $t01175511842._3
379+ if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
380+ then throw("Only admin can call this function")
381+ else if (isDefined(getBoolean(this, kActive)))
382+ then throw("DApp is already active")
383+ else if ((strAssetIdA == strAssetIdB))
384+ then throw("Assets must be different")
385+ else {
386+ let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
387+ let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
388+ let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
389+ let shareInitialSupply = 0
390+ let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
391+ let shareIssueId = calculateAssetId(shareIssue)
392+ let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceInitA, amtAssetA), IntegerEntry(kBalanceInitB, amtAssetB), IntegerEntry(kBalanceA, 0), IntegerEntry(kBalanceB, 0), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply)]
393+ if (firstHarvest)
394+ then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
395+ else baseEntry
396+ }
397+ }
398+
399+
400+
401+@Callable(i)
402+func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
403+ then throw("Only admin can call this function")
404+ else [IntegerEntry(kShareLimit, shareLimit)])
405+
406+
407+
408+@Callable(i)
409+func replenishWithTwoTokens (slippageTolerance) = valueOrElse(isActive(), {
410+ let pmtAssetIdA = i.payments[0].assetId
411+ let pmtAssetIdB = i.payments[1].assetId
412+ let pmtAmountA = i.payments[0].amount
413+ let pmtAmountB = i.payments[1].amount
414+ let $t01422114298 = getAssetInfo(pmtAssetIdA)
415+ let pmtStrAssetIdA = $t01422114298._1
416+ let pmtAssetNameA = $t01422114298._2
417+ let pmtDecimalsA = $t01422114298._3
418+ let $t01430314380 = getAssetInfo(pmtAssetIdB)
419+ let pmtStrAssetIdB = $t01430314380._1
420+ let pmtAssetNameB = $t01430314380._2
421+ let pmtDecimalsB = $t01430314380._3
422+ let inital = if (if ((balanceA == 0))
423+ then (balanceB == 0)
424+ else false)
425+ then true
426+ else false
427+ let tokenRatio = if (inital)
428+ then fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
429+ else fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
430+ let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
431+ let shareTokenToPayAmount = if (inital)
432+ then fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
433+ else fraction(min([fraction(pmtAmountA, scaleValue8, balanceA), fraction(pmtAmountB, scaleValue8, balanceB)]), shareAssetSupply, scaleValue8)
434+ if (if ((0 > slippageTolerance))
435+ then true
436+ else (slippageTolerance > slippageToleranceDelimiter))
437+ then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
438+ else if ((size(i.payments) != 2))
439+ then throw("Two attached assets expected")
440+ else if (if ((pmtAssetIdA != assetIdA))
441+ then true
442+ else (pmtAssetIdB != assetIdB))
443+ then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
444+ else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
445+ then true
446+ else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
447+ then throw("Incorrect assets amount: amounts must have the contract ratio")
448+ else if ((shareTokenToPayAmount == 0))
449+ then throw("Too small amount to replenish")
450+ else if (!(hasEnoughBalance))
451+ then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
452+ else {
453+ let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
454+ then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
455+ else 0
456+ if ((stake1 == stake1))
457+ then {
458+ let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
459+ then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
460+ else 0
461+ if ((stake2 == stake2))
462+ then [Reissue(shareAssetId, shareTokenToPayAmount, true), IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
463+ else throw("Strict value is not equal to itself.")
464+ }
465+ else throw("Strict value is not equal to itself.")
466+ }
467+ })
468+
469+
470+
471+@Callable(i)
472+func withdraw () = valueOrElse(isActive(), {
473+ let $t01718017255 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474+ let pmtAmount = $t01718017255._1
475+ let pmtAssetId = $t01718017255._2
476+ let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
477+ let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
478+ if ((size(i.payments) != 1))
479+ then throw("One attached payment expected")
480+ else if ((pmtAssetId != shareAssetId))
481+ then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
482+ else if (!(hasEnoughBalance))
483+ then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
484+ else {
485+ let stake1 = if (containsElement(stakingAssets, strAssetIdA))
486+ then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
487+ else 0
488+ if ((stake1 == stake1))
489+ then {
490+ let stake2 = if (containsElement(stakingAssets, strAssetIdB))
491+ then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
492+ else 0
493+ if ((stake2 == stake2))
494+ then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
495+ else throw("Strict value is not equal to itself.")
496+ }
497+ else throw("Strict value is not equal to itself.")
498+ }
499+ })
500+
501+
502+
503+@Callable(i)
504+func exchange (minAmountToReceive) = valueOrElse(isActive(), {
505+ let $t01855418629 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
506+ let pmtAmount = $t01855418629._1
507+ let pmtAssetId = $t01855418629._2
508+ if (if ((balanceA == 0))
509+ then true
510+ else (balanceB == 0))
511+ then throw("Can't exchange with zero balance")
512+ else if ((0 >= minAmountToReceive))
513+ then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
514+ else if ((size(i.payments) != 1))
515+ then throw("One attached payment expected")
516+ else if (!(hasEnoughBalance))
517+ then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
518+ else if ((pmtAssetId == assetIdA))
519+ then {
520+ let assetIdSend = assetIdB
521+ let $t01918019318 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB, i.originCaller)
522+ let amountWithoutFee = $t01918019318._1
523+ let amountWithFee = $t01918019318._2
524+ let governanceReward = $t01918019318._3
525+ let newBalanceA = (balanceA + pmtAmount)
526+ let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
527+ let stake1 = if (containsElement(stakingAssets, strAssetIdA))
528+ then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdA], nil)
529+ else 0
530+ if ((stake1 == stake1))
531+ then {
532+ let stake2 = if (containsElement(stakingAssets, strAssetIdB))
533+ then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdB], nil)
534+ else 0
535+ if ((stake2 == stake2))
536+ then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
537+ else throw("Strict value is not equal to itself.")
538+ }
539+ else throw("Strict value is not equal to itself.")
540+ }
541+ else if ((pmtAssetId == assetIdB))
542+ then {
543+ let assetIdSend = assetIdA
544+ let $t02031020448 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA, i.originCaller)
545+ let amountWithoutFee = $t02031020448._1
546+ let amountWithFee = $t02031020448._2
547+ let governanceReward = $t02031020448._3
548+ let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
549+ let newBalanceB = (balanceB + pmtAmount)
550+ let stake1 = if (containsElement(stakingAssets, strAssetIdA))
551+ then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdA], nil)
552+ else 0
553+ if ((stake1 == stake1))
554+ then {
555+ let stake2 = if (containsElement(stakingAssets, strAssetIdB))
556+ then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
557+ else 0
558+ if ((stake2 == stake2))
559+ then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
560+ else throw("Strict value is not equal to itself.")
561+ }
562+ else throw("Strict value is not equal to itself.")
563+ }
564+ else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
565+ })
566+
567+
568+
569+@Callable(i)
570+func shutdown () = if (!(active))
571+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
572+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
573+ then throw("Only admin can call this function")
574+ else suspend("Paused by admin")
575+
576+
577+
578+@Callable(i)
579+func activate () = if (active)
580+ then throw("DApp is already active")
581+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
582+ then throw("Only admin can call this function")
583+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
584+
585+
586+
587+@Callable(i)
588+func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
589+ let amountEnrollA = (accountBalanceWithStakedA - balanceA)
590+ let amountEnrollB = (accountBalanceWithStakedB - balanceB)
591+ if ((i.caller != moneyBoxAddress))
592+ then throw("Only the wallet can call this function")
593+ else if (if ((0 > amountEnrollA))
594+ then true
595+ else (0 > amountEnrollB))
596+ then suspend("Enroll amount negative")
597+ else if (if ((amountEnrollA == 0))
598+ then (amountEnrollB == 0)
599+ else false)
600+ then throw("No money to take")
601+ else {
602+ let stake1 = if (containsElement(stakingAssets, strAssetIdA))
603+ then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
604+ else 0
605+ if ((stake1 == stake1))
606+ then {
607+ let stake2 = if (containsElement(stakingAssets, strAssetIdB))
608+ then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
609+ else 0
610+ if ((stake2 == stake2))
611+ then [IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
612+ else throw("Strict value is not equal to itself.")
613+ }
614+ else throw("Strict value is not equal to itself.")
615+ }
616+ })
617+
618+
619+
620+@Callable(i)
621+func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
622+ then throw("Only contract itself can invoke this function")
623+ else if ((assetIdString == "WAVES"))
624+ then {
625+ let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, kLeasingPool), "No leasing pool in oracle"))
626+ let leasingId = getBinary(this, kLeasingId)
627+ let leasingAmount = valueOrElse(getInteger(this, kLeasingAmount), 0)
628+ let newLeaseAmount = if (stake)
629+ then (leasingAmount + amount)
630+ else (leasingAmount - amount)
631+ let newLease = Lease(pool, newLeaseAmount)
632+ let newLeaseId = calculateLeaseId(newLease)
633+ let baseEtry = [newLease, BinaryEntry(kLeasingId, newLeaseId), IntegerEntry(kLeasingAmount, newLeaseAmount)]
634+ match leasingId {
635+ case lId: ByteVector =>
636+ ([LeaseCancel(lId)] ++ baseEtry)
637+ case _ =>
638+ baseEtry
639+ }
640+ }
641+ else {
642+ let $t02420224305 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
643+ let call = $t02420224305._1
644+ let addr = $t02420224305._2
645+ let params = $t02420224305._3
646+ let payments = $t02420224305._4
647+ let inv = invoke(addr, call, params, payments)
648+ if ((inv == inv))
649+ then nil
650+ else throw("Strict value is not equal to itself.")
651+ }
652+
653+
654+
655+@Callable(i)
656+func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
657+ then throw("Only admin can call this function")
658+ else {
659+ let stake1 = if (containsElement(stakingAssets, strAssetIdA))
660+ then {
661+ let amountA = (balanceA - stakedAmountA)
662+ if ((amountA > 0))
663+ then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
664+ else 0
665+ }
666+ else 0
667+ if ((stake1 == stake1))
668+ then {
669+ let stake2 = if (containsElement(stakingAssets, strAssetIdB))
670+ then {
671+ let amountB = (balanceB - stakedAmountB)
672+ if ((amountB > 0))
673+ then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
674+ else 0
675+ }
676+ else 0
677+ if ((stake2 == stake2))
678+ then nil
679+ else throw("Strict value is not equal to itself.")
680+ }
681+ else throw("Strict value is not equal to itself.")
682+ })
683+
684+
685+@Verifier(tx)
686+func verify () = {
687+ let multiSignedByAdmins = {
688+ let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
689+ then 1
690+ else 0
691+ let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
692+ then 1
693+ else 0
694+ let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
695+ then 1
696+ else 0
697+ (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
698+ }
699+ match tx {
700+ case inv: InvokeScriptTransaction =>
701+ let callTakeIntoAccount = if ((inv.dApp == this))
702+ then (inv.function == "takeIntoAccountExtraFunds")
703+ else false
704+ let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
705+ then true
706+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
707+ then true
708+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
709+ then true
710+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminInvokePubKey)
711+ if (if (callTakeIntoAccount)
712+ then signedByAdmin
713+ else false)
714+ then true
715+ else multiSignedByAdmins
716+ case _ =>
717+ multiSignedByAdmins
718+ }
719+ }
720+

github/deemru/w8io/026f985 
39.17 ms